问答题 函数ReadDat()实现从文件in.dat中读取一篇英文文章存入到无符号字符串数组xx中;请编制函数ChA(),其函数的功能是:以行为单位把字符串中的第一个字符的ASCII值加第二个字符的ASCII值,得到第一个新的值,存入数组单元xx[i][0]中(其中:i是文章中的某行)。第二个字符的ASCII值加第三个字符的ASCII值,得到第二个新的值,存入数组单元xx[i][1]中。以此类推一直处理到最后第二个字符,最后一个字符的ASCII值加原第一个字符的ASCII值,得到最后一个新的值,存放在原字符串对应的位置上,之后把己处理的字符串逆转后仍按行重新存入无符号字符串数组xx中。最后main()函数调用函数WriteDat()把结果xx输出到out.dat文件中。
原始数据文件存放的格式是:每行的宽度均小于80个字符,含标点符号和空格,并也按它的ASCII值作以上处理。
请勿改动主函数main()、读数据函数ReadDat()和输出数据函数WriteDat()的内容。
#include <stdio.h>
#include <string.h>
unsigned char xx[50] [80];
int maxline=0; /*文章的总行数*/
int ReadDat(void);
void WriteDat(void);
void ChA (void)
{

}
void main()
{
if (ReadDat ())
{
printf("数据文件in.dat不能打开! \n\007");
return;
}
chA();
WriteDat ();
}
/*从文件in.dat中读取一篇英文文章存入到无符号字符串数组xx中*/
int ReadDat (void)
{
FILE *fp;
int i=0;
char *p;
if((fp=fopen (" in.dat", "r") ) ==NULL)
return 1;
while(fgets(xx[i],80,fp) != NULL)
{
p=strchr(xx[i], "\n");
if(p) *p=0;
i++;
}
maxline=i;
fclose(fp);
return 0;
}
/*把结果xx输出到文件out.dat中*/
void WriteDat(void)
{
FILE *fp;
int i;
fp=fopen("out.dat", "w");
for(i=0; i<maxline; i++)
{
printf("%s\n", xx[i]);
fprintf(fp, "%s\n", xx[i]);
}
fclose(fp);
}
【正确答案】
【答案解析】int i,j;
char yuan;
for(i=0; i<maxlime;i++)
{
yuan=xx[i][0]; //把第i行的第一个字符xx[i][0]赋给yuan
/*从第i行的第一个字符加上其相邻的后一个字符得到一个新的字符,把新字符的值赋给原字符*/
for(j=0;j<(int)strlen(xx[i])-1;j++)
xx[i][j]+=xx[i][j+1]; //x[i][j]加上其后相邻的字符xx[i][j+1]的和赋给字符x[i][j]
xx[i][strlen(xx[i])-1]+=yuan; //第i行的最后一个字符xx[i][strlen(xx[i])-1]加上第i行的第一个字符xx[i][0]的和赋给最后一个字符xx[i][strlen(xx[i])-1]
strrev(xx[i]); //对字符串xx[i]进行逆转
} [解析] 以行为单位,新字符串中每个字符的ASCII码值等于该位置上的原字符ASCII码值加其后面一个字符的ASCII码值,逆序排序。
①定义整型循环变量i、j和字符局部变量yuan。
②在第一层for循环中,循环变量i从0开始,依次递增直到其值大于或等于maxline,在循环体中,首先把第i行的第一个字符xx[i][0]赋给变量yuan,在第二层for循环中,循环变量j从0开始,依次递增直到其值等于该行字符串的长度减1,在循环体中,将字符xx[i][j]的ASCII码值与字符xx[i][j+1]的ASCII码值相加的和保存到字符xx[i][j]中。当退出第二层for循环后,把第i行的最后一个字符与第一个字符变量yuan的值相加,最后通过strrev()函数对i行字符串逆序排序。