可乐88989 发表于 2014-4-13 11:53:46

高手帮忙看下为什么会把错误的输入打印出来呢?

#define M 10
#include<stdio.h>
void main()
{
        int n,d,z,x,g,i,j,t,e;
        int a;
        x=0;
        d=M-1;
        g=0;
        printf("please input ten a numbers:\n");
        for(i=0;i<10;i++)
        {

                while(scanf("%d",&a)!=1)
                {
                        printf("input error!!\nplease input again\n");
                        scanf("%d",&a);
                        getchar();
                }

        }
       
        printf("\n");
        for(j=0;j<10;j++)
        {
                for(i=0;i<10-j;i++)
                {
                        if(a>a)       
                        {
                                t=a;
                                a=a;
                                a=t;
                        }
                }       
        }
        for(i=0;i<10;i++)
        {
                printf("%5d",a);
        }

        printf("\n");
        printf("please input a number:\n");

        while(scanf("%d",&n)!=1)
        {
                printf("input error!!\nplease input again");
                scanf("%d",&n);
                getchar();

        }

        printf("\n");
        while(x<=d)
        {
                z=(x+d)/2;
                if(n==a)
                {
                        g=1;
                        break;
                }
                else if(n>a)
                {
                        x=z+1;
                }
                else
                {
                        d=z-1;
                }
        }
        if(g==1)
                printf("zhe ge shu %d de xia biao shi:%d\n",n,z);
        else
        {
                printf("zhe ge shu bu cun zai\n");
        }


       
       
       
}


可乐88989 发表于 2014-4-13 11:57:47

我输入10个数字,错误的为什么会跑到数组里面去?

可乐88989 发表于 2014-4-13 13:24:37

拜托来为可以帮帮我

小甲鱼 发表于 2014-4-13 13:31:55

冒泡排序算法那块导致数组溢出。
修改为:

      for(j=0;j<M-1;j++)
      {
                for(i=0;i<M-1-j;i++)
                {
                        if(a>a)      
                        {
                              t=a;
                              a=a;
                              a=t;
                        }
                }      
      }


可乐88989 发表于 2014-4-13 13:51:38

小甲鱼 发表于 2014-4-13 13:31 static/image/common/back.gif
冒泡排序算法那块导致数组溢出。
修改为:

for(i=0;i<M-1-j;i++)为什么要M-1啊?
之前没有-1也可以的啊?

小甲鱼 发表于 2014-4-13 14:01:26

可乐88989 发表于 2014-4-13 13:51 static/image/common/back.gif
for(i=0;i
跟着程序走一次你就会发现不减1会导致跟数组外的元素进行交换了。
其实冒泡排序规范的写法还是这样好:

#include <stdio.h>
#define LENGTH 8

void main() {
    int i, j, tmp, number = {95, 45, 15, 78, 84, 51, 24, 12};

    for (i = 0; i < LENGTH; i++) {
      for (j = LENGTH - 1; j > i; j--) {
            if (number < number) {
                tmp = number;
                number =number;
                number = tmp;
            }
      }
    }

    for (i = 0; i < LENGTH; i++) {
      printf("%d ", number);
    }
    printf("\n");
}

可乐88989 发表于 2014-4-13 14:35:20

小甲鱼 发表于 2014-4-13 13:31 static/image/common/back.gif
冒泡排序算法那块导致数组溢出。
修改为:

对这个溢出还不是很理解?

小甲鱼 发表于 2014-4-13 15:37:30

可乐88989 发表于 2014-4-13 14:35 static/image/common/back.gif
对这个溢出还不是很理解?
修正下,这里用“溢出”的说法并不完全正确。

你看下这个是没修改过的部分代码:for(j=0;j<10;j++)
      {
                for(i=0;i<10-j;i++)
                {
                        if(a>a)      
                        {
                              t=a;
                              a=a;
                              a=t;
                        }
                }      
      }当 j = 0,i = 9的时候,比较 if(a>a)就会出现数组的访问越界,a = a已经超出数组的边界了吧?把边界里的数据替换进来,所以就会出现奇怪的数据了。

页: [1]
查看完整版本: 高手帮忙看下为什么会把错误的输入打印出来呢?