试题要求如图10.4所示。
#include<stdio.h>
#include<string.h>
char xx[20] [80];
void jsSort()
void main()
readDat();
jsSort();
writeDat();
readDat()
FILE *in;
int i=0;
char *p;
in=fopen("K:\\k06\\35010004\\in.dat", "r");
while(i<20 && fgets(xx[i], 80, in)!=NULL)
p=strchr(xx[i], ’\n’);
if(p) *p=0;
i++;
fclose(in);
writeDat()
FILE *out;
int i;
out=fopen("K:\\k06\\35010004\\out.dat", "w");
for(i=0; i<20; i++)
printf("%s\n", xx[i]);
fprintf(out, "%s\n", xx[i]);
fclose(out);
参考答案:
void jsSort()
{
int i, j, k, length, half;
char temp;
for(i=0; i<B0; i++){
length=strlen(xx[i]);
half=length/B;
for(j=0; j<half-A; j++)
for(k=j+A; k<half; k++)
if(xx[i][j]<xx[i][k]){
temp=xx[i][j];
xx[i][j]=xx[i][k];
xx[i][k]=temp;
}
If(length%B!=0) half=half+A;
for(j=half; j<length-A; j++)
for(k=j+A; k<length; k++)
if(xx[i][j]>xx[i][k]){
temp=xx[i][j];
xx[i][j]=xx[i][k];
xx[i][k]=temp;
}
}
解析:
此题的思路是先求出字符串数组××中每一行的长度,然后先对前半部分进行降序排列,再对后半部分进行升序排列。注意,题目要求当字符串长度为奇数时,中间的字不参加排序,所以在对后半部分进行排序时要加一个对length的奇偶判断。当length为偶数时要从length/2开始排序,当length为奇数时要从length/2+1时开始排序。这里是用冒泡排序法进行排序的,用其他的排序方法亦可。