1、三级数据库技术-528 及答案解析(总分:100.00,做题时间:90 分钟)一、设计与应用题(总题数:1,分数:100.00)1.函数 ReadDat()实现从文件 in.dat 中读取一篇英文文章存入到字符串数组 xx 中;请编制函数CharConvA(),其函数的功能是:以该文章中的行为单位把字符串中的最后一个字符的 ASCII 值右移 4 位二进制位,高位补 0 后加倒数第二个字符的 ASCII 值,得到最后一个新的值,倒数第二个字符的 ASCII 值右移 4 位二进制位,高位补 0 后加倒数第三个字符的 ASCII 值,得到倒数第二个新的值,以此类推一直处理到第二个字符。注意:第一个
2、新的值与上述处理不同,第一个字符的 ASCII 值加原最后一个字符的ASCII 值,得到第一个新的值。得到的新值分别存放在原字符串对应的位置上,之后把已处理的结果仍按行重新存入数组 xx 中。最后 main()函数调用函数 WriteDat()把结果 xx 输出到文件 out.dat 中。 原始数据文件存放的格式是:每行的宽度均小于 80 个字符,含标点符号和空格,并也按字符处理。 请勿改动主函数 main()、读数据函数 ReadDat()和输出数据函数 WriteDat()的内容。 #include stdio.h #include string.h char xx50 80; int m
3、axline=0; int ReadDat(void); void WriteDat(void); void CharConvA (void) void main() if (ReadDat () printf(“数据文件 in.dat 不能打开! n007“); return; CharConvA(); WriteDat(); /*从文件 in.dat 中读取一篇英文文章存入到字符串数组 xx 中*/ int ReadDat (void) FILE *fp; int i=0; char *p; if(fp=fopen(“in.dat“,“r“)=NULL) return 1; while(f
4、gets(xxi,80,fp) != NULL) p=strchr(xxi, “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; imaxline; i+) printf(“%sn“, xxi); fprintf(fp, “%sn“, xxi); fclose(fp); (分数:100.00)_三级数据库技术-528 答案解析(总分:100.
5、00,做题时间:90 分钟)一、设计与应用题(总题数:1,分数:100.00)1.函数 ReadDat()实现从文件 in.dat 中读取一篇英文文章存入到字符串数组 xx 中;请编制函数CharConvA(),其函数的功能是:以该文章中的行为单位把字符串中的最后一个字符的 ASCII 值右移 4 位二进制位,高位补 0 后加倒数第二个字符的 ASCII 值,得到最后一个新的值,倒数第二个字符的 ASCII 值右移 4 位二进制位,高位补 0 后加倒数第三个字符的 ASCII 值,得到倒数第二个新的值,以此类推一直处理到第二个字符。注意:第一个新的值与上述处理不同,第一个字符的 ASCII 值
6、加原最后一个字符的ASCII 值,得到第一个新的值。得到的新值分别存放在原字符串对应的位置上,之后把已处理的结果仍按行重新存入数组 xx 中。最后 main()函数调用函数 WriteDat()把结果 xx 输出到文件 out.dat 中。 原始数据文件存放的格式是:每行的宽度均小于 80 个字符,含标点符号和空格,并也按字符处理。 请勿改动主函数 main()、读数据函数 ReadDat()和输出数据函数 WriteDat()的内容。 #include stdio.h #include string.h char xx50 80; int maxline=0; int ReadDat(voi
7、d); void WriteDat(void); void CharConvA (void) void main() if (ReadDat () printf(“数据文件 in.dat 不能打开! n007“); return; CharConvA(); 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(xxi,80,fp) != NULL)
8、p=strchr(xxi, “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; imaxline; i+) printf(“%sn“, xxi); fprintf(fp, “%sn“, xxi); fclose(fp); (分数:100.00)_正确答案:()解析:int i,j; char tmp; /+对文章的每一行字符串按照题目的要求进
9、行处理*/ for(i=0;imaxline; i+) tmp=xxi(int) strlen(xxi)-1; /把第 i 行字符串的最后一个字符赋给字符 tmp /*通过 for 循环对每行数组进行移位和求和 ASCII 码值计算*/ for(j=(int) strlen(xxi)-1;j=1;j-) xxij=(xxij4)+xxij-1; /*第 i 行字符串的最后一个字符的 ASCII 码值与第 i 行字符串的第一个字符的 ASCII 码值之和赋给第一个字符*/ xxi0+=tmp; 解析 字符的 ASCII 值右移 4 位二进制位,高位补 0 后加其前一个字符的 ASCII 值,依次
10、向前直到第二个字符,第一个字符则是原第一个字符的 ASCII 值加最后一个字符的 ASCII 值。 定义循环变量 i、j 和字符变量 tmp。 在 for 循环语句中,循环变量 i 从 0 开始,依次递增直到其值等于文章最大行数 maxline。在循环体中,首先把第 i 行字符串的最后一个字符赋给字符 tmp,通过表达式“strlen(xxi)-1”可以得到第 i 行最后一个字符的数组下标值;然后再继续通过一个 for 循环从文章第 i 行字符串的最后一个字符开始,每循环一次循环变量减 1,字符 xxij的 ASCII 码的二制位右移 4 位与其前一个字符 xxij-1的 ASCII码之和赋给字符 xxij,直到第 i 行字符串的第二个字符为结束;最后,将第 i 行字符串的最后一个字符的 ASCII 码值与第 i 行字符串的第一个字符的 ASCII 码值之和赋给第一个字符。