C语言中从键盘上输入五个字符串,按从小到大的顺序对它们进行排序!!(TC2.0)

#include "stdio.h"
void main()
{char b[20],a[5][20];
int k,i,j;
printf("input:\n");
for(i=0;i<5;i++)
gets(a[i]);
for(i=0;i<5;i++)
{
for(j=i+1;j<5;j++)
{
for(k=0;k<20;k++)
if(a[i][k]>a[j][k])
{ strcpy(b,a[j]);
strcpy(a[j],a[i]);
strcpy(a[i],b);
break;}
else if(a[i][k]<a[j][k])
break;
}}
for(i=0;i<5;i++)
puts(a[i]);
}
程序如上,但如果去掉:else if(a[i][k]<a[j][k])
break;
变成:
#include "stdio.h"
void main()
{char b[20],a[5][20];
int k,i,j;
printf("input:\n");
for(i=0;i<5;i++)
gets(a[i]);
for(i=0;i<5;i++)
{
for(j=i+1;j<5;j++)
{
for(k=0;k<20;k++)
if(a[i][k]>a[j][k])
{ strcpy(b,a[j]);
strcpy(a[j],a[i]);
strcpy(a[i],b);
break;}

}}
for(i=0;i<5;i++)
puts(a[i]);
}
那么它输出的结果会是按什么情况排列的呢???
也就是说不是按从小到大的顺序,那是什么规律呢??还是没什么规律???
它输出结果按的是什么原理???谢谢!我是初学者,表达不对之处,还请提出,谢谢!!!
两个程序运行的结果不一样诶!!

抱歉,是我疏忽了!呵呵!
下面还是举例来说明:去掉else后的问题在到底在哪里,为什么结果不对了。依旧a[0]="12345",a[1]="12452";
前两个相等故不做if。第三四个a[1]值大,此处就本应该结束循环不再比较了,但是由于去掉了else语句,故依旧执行循环。但因为条件不成立,而只是进行j++;当到第五个数字时,由于a[0]中为5,而a[1]中为2,故if的条件成了,所以a[0]和a[1]进行交换,但是这显然是错误的。因为a[1]的前4项中有比a[0]大的数,早就该结束循环不比较第五个数字了。

原来大意了,呵呵,差点误导了你!实在是抱歉,现在解释的还可以吧?我仔细分析过了,应该没有任何的问题。

附:
改进建议:既然你知道strcpy()函数,为什么还要用第三个for循环一个一个字符的比较呢?可以用strcmp()来进行直接比较,这样就去掉了第三个for语句。
改进代码如下,供参考:
#include "stdio.h"
#include "string.h"
void main(){
char b[20],a[5][20];
int i,j;
printf("input:\n");
for(i=0;i<5;i++)
gets(a[i]);
for(i=0;i<5;i++){
for(j=i+1;j<5;j++){
if(strcmp(a[i],a[j])>0){
strcpy(b,a[j]);
strcpy(a[j],a[i]);
strcpy(a[i],b);
}
}
}
printf("\n\n排序后的结果为:\n\n");
for(i=0;i<5;i++)
puts(a[i]);
}
这样是不是清楚点呢?几乎和一般的整数数组的排序一样了,不是吗?呵呵!

strcmp的具体说明:
int strcmp(const char *string1,const dhar *string2);
按字典序比较字符串string1和string2,若string1排在string2前,返回值小于0;若string1和string2相等,返回值为0;若string1排在string2后,返回值大于0;
温馨提示:答案为网友推荐,仅供参考
相似回答
大家正在搜