标题:冒泡法,不知道哪里错了,请帮忙指出,谢谢了
只看楼主
神奇的地球
Rank: 1
等 级:新手上路
帖 子:21
专家分:0
注 册:2010-6-6
结帖率:100%
已结贴  问题点数:10 回复次数:17 
冒泡法,不知道哪里错了,请帮忙指出,谢谢了
程序代码:
#include "stdio.h"
int main()
{
    int i,j,a[10],temp;
    printf("input 10 numbers:\n");
    for (i=0;i<10 ;i++ )
    {
        scanf("%d",&a[i]);
    }
    for (j=0; j<10;j++)
    {
        for (i=0;i<10-j ;i++ )
        {
            if (a[i]>a[i+1])
            {
                temp=a[i];
                a[i]=a[i+1];
                a[i+1]=temp;
            }
        }
    }
    printf("paixu hou :\n");
    for (i=0;i<10 ;i++ )
    {
        printf("%-5d",a[i]);
    }
    return 0;
}


程序如上,

问题是,排序后,a[i]总是为-1,并且最大数没有了?

学到数组,对这个程序也不太明白,看了几遍,然后不看书写的,结果却错了;对照书,也没找到个所以然来

所以请大家帮忙看看,谢谢了



[ 本帖最后由 神奇的地球 于 2010-7-22 12:33 编辑 ]
搜索更多相关主题的帖子: 冒泡 
2010-07-22 12:32
do8do8do8
Rank: 10Rank: 10Rank: 10
来 自:沙滩
等 级:贵宾
威 望:17
帖 子:366
专家分:1845
注 册:2010-7-2
得分:0 
经测试 没发现错误 别跟我说大白天的演午夜凶灵

学C语言从底层开始,学编程从问题开始,一日学会C!!!
2010-07-22 12:42
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
得分:4 
给你个例子,你参考一下
{int i,j,t,kz;//i,j用来做循环,t用来数值交换
for(i=1;i<=5-1;i++)//应为冒泡排序,所以可以少比较一次
{kz=1;
for(j=1;j<=5-i;j++)//同上
if(chengji[j]>chengji[j+1])//如果前一个数比后一个数大,那么就进行数值交换
{kz=0;
t=chengji[j];chengji[j]=chengji[j+1];chengji[j+1]=t;//数值交换
}
dataout(number,chengji);//调用数据输出函数
return;
}
}

欢迎来到我的博客:http://blog..cn/noisunyuhong
2010-07-22 12:46
vs_inzaghi
Rank: 5Rank: 5
来 自:湖北
等 级:职业侠客
威 望:1
帖 子:303
专家分:364
注 册:2009-8-17
得分:6 
你是用的a[i+1]和a[i]两个变量,所以你应该写成
……
for (j=0; j<9;j++)
    {
        for (i=0;i<9-j ;i++ )
……
如果你还是i<10-j的话,那么当开始j=0的时候,i的值会一直涨到9,那么你实际是在比较a[9]和a[10]的大小……而,根本就不可能有a[10]……
好像是因为c语言对数组不做越界检查,所以你能通过编译并运行,但是得不到你想要的结果……

我感觉我的理解应该有道理,但是……我按你的程序也得出了正确的结果……
可能a[10](指代a[9]后面的那个地址,因为没有a[10]的说法)中的值是随机的……

[ 本帖最后由 vs_inzaghi 于 2010-7-22 13:00 编辑 ]

我很懒,但我讨厌别人说我懒……
2010-07-22 12:56
handong0823
Rank: 1
等 级:新手上路
帖 子:16
专家分:7
注 册:2010-7-22
得分:0 
以下是引用vs_inzaghi在2010-7-22 12:56:54的发言:

你是用的a和a两个变量,所以你应该写成
……
for (j=0; j<9;j++)
    {
        for (i=0;i<9-j ;i++ )
……
如果你还是i<10-j的话,那么当开始j=0的时候,i的值会一直涨到9,那么你实际是在比较a[9]和a[10]的大小……而,根本就不可能有a[10]……
好像是因为c语言对数组不做越界检查,所以你能通过编译并运行,但是得不到你想要的结果……

我感觉我的理解应该有道理,但是……我按你的程序也得出了正确的结果……
可能a[10](指代a[9]后面的那个地址,因为没有a[10]的说法)中的值是随机的……
同意
2010-07-22 13:02
handong0823
Rank: 1
等 级:新手上路
帖 子:16
专家分:7
注 册:2010-7-22
得分:0 
你的定义也有问题 。没有  
int a[10] 的说法
2010-07-22 13:04
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
得分:0 
回复 6楼 handong0823
不要误人子弟,肯定有int a[数组长度],楼主没有写错呀

欢迎来到我的博客:http://blog..cn/noisunyuhong
2010-07-22 13:45
ggyy4k
Rank: 5Rank: 5
等 级:职业侠客
帖 子:111
专家分:334
注 册:2010-6-28
得分:0 
回复 楼主 神奇的地球
#include "stdio.h"
int main()
{
    int i,j,a[10]={9,8,7,6,5,4,3,2,1,10},temp;
    a[10]=-1;
    for (j=0; j<10;j++)
    {
        for (i=0;i<20-j ;i++ )
        {
            if (a[i]>a[i+1])
            {
                temp=a[i];
                a[i]=a[i+1];
                a[i+1]=temp;
            }
        }
    }
    printf("paixu hou :\n");
    for (i=0;i<20 ;i++ )
        printf("%-5d",a[i]);
}
做了一下试验,数组越界可读但不可写,各位大侠看看
2010-07-22 13:57
神奇的地球
Rank: 1
等 级:新手上路
帖 子:21
专家分:0
注 册:2010-6-6
得分:0 
以下是引用do8do8do8在2010-7-22 12:42:10的发言:

经测试 没发现错误 别跟我说大白天的演午夜凶灵



我用的是版主制作置顶帖里EDITPLUS+GCC编译器

每次排序后a[1]=-1,

程序不对,就是3楼说的那样
2010-07-22 14:35
神奇的地球
Rank: 1
等 级:新手上路
帖 子:21
专家分:0
注 册:2010-6-6
得分:0 
以下是引用sunyh1999在2010-7-22 12:46:21的发言:

给你个例子,你参考一下
{int i,j,t,kz;//i,j用来做循环,t用来数值交换
for(i=1;i<=5-1;i++)//应为冒泡排序,所以可以少比较一次
{kz=1;
for(j=1;j<=5-i;j++)//同上
if(chengji[j]>chengji[j+1])//如果前一个数比后一个数大,那么就进行数值交换
{kz=0;
t=chengji[j];chengji[j]=chengji[j+1];chengji[j+1]=t;//数值交换
}
dataout(number,chengji);//调用数据输出函数
return;
}
}

这个例子我看不懂
kz=1;
kz=0;
是做什么的啊
2010-07-22 14:38



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-313712-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 1.022542 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved