问答题
函数readDat()的功能是从文件IN.DAT中读取20行数据存放到字符串数组xx中(每行字符串的长度均小于80)。请编写甬数jsSort(),该函数的功能是:以行为单位对字符串变量下标为奇数的位置上的字符按其ASCII码值从小到大的顺序进行排序,排序后的结果仍按行重新存入字符串数组xx中,最后调用函数WriteDat(),把结果xx输出到文件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()、读函数readDat()和写函数writeDat()的内容。
【试题程序】
#include < stdio.h >
#include <string.h >
#include <stdlib.h >
char xx[20][80];
void readDat();
void writeDat();
void jsSort()
{
void main ()
{
readDat();
jsSort();
writeDat();
}
void readDat()
{
FILE * in;
int i =0;
char * p;
in = fopen ( "IN. DAT", "r" ) ;
while (i <20 && fgets (xx[i],80,in) ! =
NULL)
{ p = strchr (xx[i] ,"\n") ;
if(p)
* p=0;
i++;
}
fclose (in) ;
}
void writeDat ()
{
FILE * out;
int i ;
out = fopen ( "OUT. DAT", "w" ) ;
system ("CLS") ;
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; /*定义循环控制变量*/
int str; /*定义存储字符串长度的变量*/
char temp; /*定义数据交换时的暂存变量*/
for(i=0;i<20;i++) /*逐行对数据进行处理*/
{
str=strlen(xx[i]); /*求各行字符串的长度*/
for(j=1;j<str-2;j=j+2) /*将下标为奇数的字符按其ASCII值从小到大的顺序进行排序*/
for(k=j+2;k<str;k=k+2)
if(xx[i][j]>xx[i][k])
{
temp=xx[i][j];
xx[i][j]=xx[i][k];
xx[i][k]=temp;
}
}
}
[考点] 本题考查对字符的排序。考查的知识点主要包括:字符串元素的遍历访问,逻辑表达式,数组排序算法。
[解析] 此题属于字符排序题型。分析题干要求,可以归纳2个问题:问题1如何找出字符串中以奇数为下标的字符;问题2如何按照要求对这些字符进行排序(本题为按ASCII值从小到大的顺序)。
接着分析具体的解决方法,首先用字符串处理函数strlen获得字符串的长度,使用循环对字符串进行间隔访问(只访问其中下标为奇数的元素),同时通过起泡法对其进行从小到大的排列。
数组的下标法访问;排序算法中的逻辑表达式。