文件IN.DAT中存放有字符数据,函数ReadData()负责从中读取20行数据存放到字符串数组inBuf[]中(每行字符串的长度均小于80)。请编制函数arrangeChar(),该函数的功能是:以行为单位,对字符串变量的下标为奇数位置上的字符,按其ASCⅡ码值从小到大的顺序进行排序,对字符串变量的下标为偶数位置上的字符,按其ASCⅡ码值从大到小的顺序进行排序,排序后的结果仍按行重新存入字符串数组inBuf[]中,并且奇数位还保存在奇数位上,偶数位还保存在偶数位上。函数WriteData()负责把结果inBuf输出到文件OUT.DAT中。
例如:位置01234567
源字符串ahcfedgb
则处理后字符串gbedcfah
注意:部分源程序已给出。
请勿改动主函数main()、读函数ReadData()和写函数WriteData()的内容。
试题程序:
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<ctype.h>
#define LINE 50
#define COL 80
char inBuf[LINE][COL];
int totleLine=0;/*文章的总行数*/
int ReadData(void);
void WriteData(void);
void arrangeChar()
void main()
system("CLS");
if(ReadData())
printf("IN.DAT can’t be open!’);
if(p)*P=0;
i++;
totleLine=i;
fclose(fp);
return 0;
void WriteData(void)
FILE*fp;
int i:
fp=fopen("OUT.DAT","W");
for(i=0;i<totleLine;i++)
printI("%s",inBuf[i]);
fprintf(fp,"%s",inBuI[i]);
fclose(fp);
参考答案:void arrangeChar()
{
int i,j,k,col[LINE];
unsigned char temp;
for(i=0;i<totleLine;i++)/*统计出每行字母(不含回车符)的列数,即字符串长度*/
for(j=0;j<COL; j++)
if(inBuf[i][j]==0)/*如果inBuf中的某一个值等于0(行结束符)*/
{
col[i]=j;/*则将该列号记下来,即为该列的列数*/
break;/*退出循环*/
}
for(i=0;i<totleLine;i++)
{
for(j=0;j<col[i]-1;j++)
/*下面是对一行的奇数项字符进行由小到大、偶数项字符进行由大到小的排序*/
for(k=j+1;k<col[i];k++)
{
if(inBuf[i][j]>inBuf[i][k]&&((j+1)%2==0)&&((k+1)%2==0))
/*如果下标为奇数的字符的ASCⅡ码值比其后一个奇数位下标字符的ASCⅡ码值大*/
{/*则进行交换*/
temp=inBuf[i][j];
inBuf[i][j]=inBuf[i][k]:
inBuf[i][k]=temp;
}
if(inBuf[i][j]<inBuf[i][k]&&((j+1)%2!=0)&&((k+1)%2!=0))
/*如果下标为偶数的字符ASCⅡ码值比其后一个偶数位下标字符的ASCⅡ码值小*/
{/*则进行交换*/
temp=inBuf[i][j];
inBuf[i][j]=inBuf[i][k];
inBuf[i][k]=temp;
}
}
}
}
解析: 本题主要考查字符串的排序问题。①分别对数组中下标为偶数和下标为奇数的数据进行排序,因此,在循环时应将奇数和偶数通过下标求余来区分开,以对其分别进行排序;②排序的思想是(以从小到大为例),将当前数据与其后的各个数据相比较,如果当前数据比其后的数据大,则将两数据进行交换,从而使得前面的数据小于后面的数据,达到从小到大排序的目的。