函数RData()实现从文件IN.dat中读取20行数据存放到字符串数组str中(每行字符串长度均小于80)。请编写函数oddSort(),其功能是:以行为单位对字符串变量的下标为奇数的字符按其ASCII值从小到大的顺序进行排序,排序后的结果仍按行重新存入字符串数组str中。最后调用函数WData(),把结果str输出到OUT.dat文件中。
例如,位置 0 1 2 3 4 5 6 7
源字符串 h g f e d c b a
则处理后字符串 h a f c d e b g
注意:部分源程序已经给出。请勿改动主函数main()、读数据函数RData()和输出数据函数WData()的内容。
#include <stdio.h>
#include <string.h>
#include <conio.h>
char str[20][80];
void oddSort()
{
}
void RData()
{ FILE *in;
int i = 0;
char *p;
in = fopen("IN.dat", "r");
while (i<20 && fgets(str[i], 80, in)!=NULL)
{ p = strchr(str[i], '\n');
if (p)
*p = 0;
i++;
}
fclose(in);
}
void WData()
{ FILE *out;
int i;
out = fopen("OUT.dat", "w");
for (i=0; i<20; i++)
{ printf("%s\n", str[i]);
fprintf(out, "%s\n", str[i]);
}
fclose(out);
}
void main()
{ RData();
oddSort();
WData();
}
试题答案及详解
【审题分析】分析题目可知,本题只要实现oddSort()函数的功能即可。oddSort()要实现的功能是:以行为单位对字符串变量的下标为奇数的字符按其ASCII值从小到大的顺序进行排序,排序后的结果仍按行重新存入字符串数组str中。因此解答本题的关键在于如何判断字符串变量的下标为奇数。
【解题思路】在最外层for循环语句中,自变量i从0递增到19,完成对20行数据的循环。对于每一行字符串数组str[i],首先利用字符串函数strlen求出其长度,然后在for循环语句中,自变量j从1开始到strl-2,每次递增2,这样就实现了对字符串数组str[i]中下标为奇数的字符的循环。在当前for循环的内嵌循环中,自变量k从j+2开始到strl,每次递增2,进行下标为奇数两个相邻字符的ASCII码值大小的比较,如果字符str[i][j]大于字符str[i][k],则两个字符进行交换,实现字符串数组str[i]中下标为奇数的字符按其ASCII值从小到大的排序。
【参考答案】
void oddSort()
{ int i, j, k, strl;
char ch;
for (i=0; i<20; i++)
{ strl = strlen(str[i]);
for (j=1; j<strl-2; j=j+2)
for (k=j+2; k<strl; k=k+2)
if (str[i][j] > str[i][k])
{ ch = str[i][j];
str[i][j] = str[i][k];
str[i][k] = ch;
}
}
}
【易错分析】 循环自变量j和k每次递增都为2。
【考点链接】for循环语句、字符按其ASCII值进行大小比较。
责任编辑:小草