c语言数组疑问,求解!!?

来源:百度知道 编辑:UC知道 时间:2024/05/30 19:04:04
请对输入的一行字母,按由大到小的字母顺序进行排序。
答:
输入一行字母,字母的个数不超过100.以回车为结束标记,同时将字母个数记在n中,用直接排序法编程:

#include <stdio.h>
#define maxsize 100
main()
{
char a[101],x,c;
int i,j,k,n;
printf("\nInput char:");
n=0;
while((c=getchar())!='\n')
{
if((c>='a'&&c<='z')||(c>='A'&&c<='Z'))
a[++n]=c;
}
printf("\n");
for(i=1;i<n;i++)
{
k=i;
for(j=i+1;j<n;j++)
if(a[j]>a[k])k=j;
if(i!=k)
{
x=a[i];a[i]=a[k];a[k]=x
}
}
printf("\nThe sorted chars:\n");
for(i=1;i<=n;i++)
printf("%3c",a[i]);
printf("\n");
}
答案中说将字母个数记在n中,那么a[++n]=c能否解释下嘛?我有些模糊。
再者for(i=1;i<n;i++)
{
k=i;
for(j=i+1;j<n;j++)
if(a[j]>a[k])k=j;
if(i!=k)
{
x=a[i];a[i]=a[k];a[k]=x
}
这个排序中,为什么要有k=i与i!=k,这两个

之所以用a[++n]=c,是因为它定义的字符数组是a[101]和n=0.他的目的就是把a[0]空出来,不存储字符,a[1]存储的就是对应的第1个字符,a[2]存储的就是对应的第2个字符.....既然是这样,那么第一次执行a[++n]=c(n先加1)就是a[1]=c......
第2个问题,其实你自己带几个数进去试试,就很明白了.k=i就是假设了第i位是数组最大的字符。if(a[j]>a[k])k=j;如果第j位字符大于第k位,也就是第i位,则就把当前最大的字符的数组下标赋给k。if(i!=k),判断当初假设的最大字符的下标i是否不等于当前的最大字符的下标k,若果不等于,则交换x=a[i];a[i]=a[k];a[k]=x;,如果等于,则说明当初假设的最大字符的下标就是当前最大字符的下标,不用交换。

明白了么?

先说第一个问题:首先你要明白++n和n++二者的意思。这里使用++n的目的是在执行赋值操作之前将n的值加1,而如果写成n++,那么是在执行赋值操作之后将n的值加1。++n这样对于数组a[]而言,是将其指针回向后移动一位,如果过去是a[0]这个元素,那么现在就是a[1],这样将c的值赋给指针移动后的数组a的当前元素(如a[1]) 。
第二个问题,这个算法是冒泡排序法,这个k的作用是个临时变量。k=i的意思是让k临时充当指针的作用。然后进入下面的那个循环,在下面的循环中,如果a[j]中的字符的asc码值大于a[i]中的,那么将k的值赋为j,这样就是一个指针的后移,那么i!=k的意思也就是说这个指针是被移动过的,这样才好进行相应的排序操作。
希望对你有所帮助。