请教C语言高手,问题出自三级南开100题第五题

来源:百度知道 编辑:UC知道 时间:2024/06/06 09:23:36
void jsSort()
{
int i, j,data ;
int num[200];
for(i=0;i<200;i++)
num[i]=aa[i]%1000;
for(i=0;i<199;i++)
for(j=i+1;j<200;j++)
{
if(num[i]>num[j])
{data=aa[i];
aa[i]=aa[j];
aa[j]=data;}
else if(num[i]==num[j])
{if(aa[i]<aa[j])
{data=aa[i];
aa[i]=aa[j];
aa[j]=data;}
}
}for(i=0;i<10;i++)
bb[i]=aa[i];
}和程序
void jsSort()
{
int i, j,data ;

for(i=0;i<199;i++)
for(j=i+1;j<200;j++)
{
if(aa[i]%1000>aa[j]%1000)
{data=aa[i];
aa[i]=aa[j];
aa[j]=data;}
else if(aa[i]%1000==aa[j]%1000)
{if(aa[i]<aa[j])
{data=aa[i];
aa[i]=aa[j];
aa[j]=data;}
}
}for(i=0;i<10;i++)
bb[i]=aa[i];
}究竟前者错在何处???
南开第五题:
要求函数的功能如下:
按数组中每个数的后三位的大小进行升序排列,然后取出满足此条件的前十个数后放入数组bb中,如果后三位的数值相等,则按原先的数值进行

上面的那个程序编译是准确的,而且可以运行,但是这只能说明它的语法是对的,它并不能实现本题的要求。因为 例如for(i=0;i<12;i++)
num[i]=aa[i]%1000;它实现将aa[i]的后三位数放在num[i]中。然后你接下来的程序都是用num[i]来进行比较,错就错在此处。因为:
例如aa[i]中前几个数是 1234,4523,1782,3478,9210.......这样对应的num[i]为234,523,782,478,210.....。然后就开始比较
可知当i=0,j取1,2,3均不满足if(num[i]>num[j]) 和else if(num[i]==num[j])条件。继续运行当j取4时满足num[i]>num[j]这个条件,即234大于210.由程序知 aa[0]和aa[4]交换也就是说在程序运行过程中,aa[i]在不断的交换即原来的aa[i]数组在不断的改变,但是这个数组中的数据的后三位,却一直没变因为第一个程序是在两重循环之前 把原来的aa[i]数组的后三位放在了num[]中。
所以不要简单的以为num[i]即是aa[i]%1000这是严重错误的。所以第二个程序用
aa[i]%1000因为aa[i]在变化,所以同时aa[i]%1000也在变化。所以这才是对的。
给你我编的程序,对照一下,理解即可。
这个是对的!
#include <stdio.h>
void jsSort();
int aa[12]={1234,4523,1782,3478,9210,2340,1111,2222,4657,3987,1235,1256},bb[10]={0};
void main()
{

int i;

jsSort() ;
for(i=0;i<10;i++)
printf("%d\n",bb[i]);

}
void jsSort()
{
int i, j,data ;
for(i=0;i<11