鱼C论坛

 找回密码
 立即注册
查看: 3478|回复: 18

错误在哪里?请高手指点

[复制链接]
发表于 2011-8-10 13:02:46 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
这是一个把数组中10个数从大到小排列的程序。
#include <stdio.h>
void sort(int x[], int n);
void main()
{
int i, *p;
int a[10] = {3, 7, 9, 11, 0, 6, 7, 5, 4, 2};
printf("the original array:\n");
for(i = 0;i < 10;i++)
{
  printf("%d ", a[i]);
}
printf("\n");

p = a;   
sort(p, 10);
printf("the sorted array :\n");
for(i = 0;i < 10;i++)
{
  printf("%d ", *(p+i));
}
}

void sort(int x[], int n)
{
       int i, j, temp;
       for(i = 0;i < n;i++)
      {
             for(j = 0; j <= n-i;j++)
             {
                  if(x[j] < x[j+1])
                      {
                            temp = x[j];
                            x[j] = x[j+1];
                            x[j+1] = temp;
                      }
             }
      }
}
请问这个程序的错误在哪里?如果把main中的sort(p, 10)该为sort(p, 8)及以下就不会出错,只要是sort(p, 9) 或sort(p, 10)就出错。请高手指点
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-8-10 13:24:14 | 显示全部楼层
改好了
#include <stdio.h>
int sort(int x[], int n);
void main()
{
    int i, *p;
    int a[10] = {3, 7, 9, 11, 0, 6, 7, 5, 4, 2};
    printf("the original array:\n");
    for(i = 0;i < 10;i++)
    {
        printf("%d ", a[i]);
    }
   
    printf("\n");
   
   
    p=sort(a, 10);
    printf("the sorted array :\n");
    for(i = 0;i < 10;i++)
    {
        printf("%d ", *(p+i));
    }
}


int sort(int x[], int n)
{
    int i, j, temp;
    for(i = 0;i < n;i++)
    {
        for(j = 0; j <= n-i;j++)
        {
            if(x[j] < x[j+1])
            {
                temp = x[j];
                x[j] = x[j+1];
                x[j+1] = temp;
            }
        }
    }
    return (x);
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-8-10 13:27:54 | 显示全部楼层
#include <stdio.h>
void sort(int x[], int n);
void main()
{
    int i, *p;
    int a[10] = {3, 7, 9, 11, 0, 6, 7, 5, 4, 2};
    printf("the original array:\n");
    for(i = 0;i < 10;i++)
    {
          printf("%d ", a[i]);
    }
    printf("\n");
    
    p = a;   
    sort(p, 10);
    
    printf("the sorted array :\n");
    
    for(i = 0;i < 10;i++)
    {
          printf("%d ", *(p+i));
    }
    getch();
}

void sort(int x[], int n)
{
       int i, j, temp;
       for(i = 0;i < n-1;i++)
      {
             for(j = 0; j <= n-1-i;j++)
             {
                  if(x[j] < x[j+1])
                      {
                            temp = x[j];
                            x[j] = x[j+1];
                            x[j+1] = temp;
                      }
             }
      }
}

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-8-10 13:28:59 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-8-10 13:38:59 | 显示全部楼层
LZ的问题是
      for(i = 0;i < n;i++)
      {
             for(j = 0; j <= n-i;j++)
             {
                  if(x[j] < x[j+1])
                      {
                            temp = x[j];
                            x[j] = x[j+1];
                            x[j+1] = temp;
                      }
             }
      }
当n=8的时候j最大取到8
所以j+1就是9
x【9】刚好是最后一位

如果输入10 或者9 数组就没这么大了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-8-10 13:43:14 | 显示全部楼层
3L你的代码还是有错的吧...
31行因该是             for(j = 0; j <= n-2-i;j++)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-8-10 13:50:54 | 显示全部楼层
另外楼主的代码改成 8也不是对的 如果数组是          {10, 7, 9, 2, 0, 6, 7, 5, 4,11}结果会变成
10 11 9 7 7 6 5 4 2 0
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-8-10 13:51:53 | 显示全部楼层
zfzhuman123 发表于 2011-8-10 13:28
你确定改好了?

for(j = 0; j <n-1-i;j++)你确定改好了?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-8-10 13:54:27 | 显示全部楼层

是 j <= n-2-i
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-8-10 13:55:13 | 显示全部楼层
晕,我写的是我改过的代码,和你的效果一样
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-8-10 13:56:16 | 显示全部楼层

<j-1-n和<=j-2-n有区别?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-8-10 13:57:55 | 显示全部楼层

哦,写反了不好意思
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-8-10 13:58:14 | 显示全部楼层

抱歉没看清楚,我的机器F5 没问题啊~

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-8-10 14:02:16 | 显示全部楼层
Amas 发表于 2011-8-10 13:58
抱歉没看清楚,我的机器F5 没问题啊~

那我就在说一遍,同志我8楼写的 j <n-1-i,和你写的 j <= n-2-i,效果等同
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-8-10 14:17:02 | 显示全部楼层
那我也再说一遍,8L当时我没看清楚,抱歉
可是j <n-1-1 或者 j <= n-2-i的代码我的机器是可以运行的!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-8-10 15:15:33 | 显示全部楼层
那我改的对吗,伙计们!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-8-10 15:26:01 | 显示全部楼层
不好意思,n<=8 不出错,是指运行时不会有错误提示,有结果输出,当然结果是不正确的。而当大于8就有错误提示了,没有结果输出。请各位给出错误的原因
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-8-10 15:55:30 | 显示全部楼层
因为n=9(或者大于9)的话

for(i = 0;i < n;i++)
      {
             for(j = 0; j <= n-i;j++)
             {
                  if(x[j] < x[j+1])
                      {
                            temp = x[j];
                            x[j] = x[j+1];
                            x[j+1] = temp;
                      }
             }
      }

第一次循环 j=9 ,j+1==10  于是出现了x[10]超出了数组的范围。


另外 16L 自己试试不就知道了。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-8-10 16:46:41 | 显示全部楼层
程序改好了,谢谢大家的帮忙。其中:  for(i = 0;i < n;i++)
    {
        for(j = 0; j <= n-i;j++)
        {
改为:
for(i = 0; i < n-1; i++)
{
        for(j = 0; j < n-1-i; j++)
         {
      
         }
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-2-8 18:00

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表