1、三级数据库技术-518 及答案解析(总分:100.00,做题时间:90 分钟)一、设计与应用题(总题数:1,分数:100.00)1.函数 ReadDat()实现从文件 in.dat中读取一篇英文文章存入到字符串数组 xx中;请编制函数SortCharD(),其函数的功能是:以行为单位对字符按 ASCII码从大到小的顺序进行排序,排序后的结果仍按行重新存入字符串数组 xx中。最后 main()函数调用函数 WriteDat()把结果 xx输出到文件 out.dat中。 例:原文:dAe,BfC. CCbbAA 结果:fedCBA., bbCCAA 原始数据文件存放的格式是:每行的宽度均小于 80
2、个字符,含标点符号和空格。 请勿改动主函数 main()、读数据函数 ReadDat()和输出数据函数 WriteDat()的内容。 #include stdio.h #include string.h char xx50 80; unsigned int maxline=0; /*文章的总行数*/ int ReadDat(void); void WriteDat(void); void SortCharD(void) void main( if (ReadDat () printf (“数据文件 in.dat不能打开! n007“); return; SortCharD (); WriteD
3、at (); /*从文件 in.dat中读取一篇英文文章存入到字符串数组 xx中*/ int ReadDat(void) FILE *fp; int i=0; char *p; if(fp= fopen ( “in.dat“, “r“)=NULL) return 1; /如果文件 in.dat内容为空,则返回 1 /*当从文件 in.dat中读取 79个字符存入 xxi没有错误发生时,执行循环体中的语句*/ while(fgets(xxi,80,fp) != NULL) p=strchr(xxi, “n“); /在字符串 xxi中查找回车换行符第一个匹配的位置 if(p) *p=0; /如果
4、p的值不为零,则把其值设置为 0 i+; /行变量加 1 maxline=i; /把文章的总行数赋给变量 maxline fclose(fp); return 0; /*把结果 xx输出到文件 out.dat中*/ void WriteDat(void) FILE *fp; unsigned int i; fp=fopen(“out.dat“, “w“); for(i=0; imaxline; i+) printf(“%sn“, xxi); fprintf(fp, “%sn“, xxi); fclose (fp); (分数:100.00)_三级数据库技术-518 答案解析(总分:100.00,
5、做题时间:90 分钟)一、设计与应用题(总题数:1,分数:100.00)1.函数 ReadDat()实现从文件 in.dat中读取一篇英文文章存入到字符串数组 xx中;请编制函数SortCharD(),其函数的功能是:以行为单位对字符按 ASCII码从大到小的顺序进行排序,排序后的结果仍按行重新存入字符串数组 xx中。最后 main()函数调用函数 WriteDat()把结果 xx输出到文件 out.dat中。 例:原文:dAe,BfC. CCbbAA 结果:fedCBA., bbCCAA 原始数据文件存放的格式是:每行的宽度均小于 80个字符,含标点符号和空格。 请勿改动主函数 main()
6、、读数据函数 ReadDat()和输出数据函数 WriteDat()的内容。 #include stdio.h #include string.h char xx50 80; unsigned int maxline=0; /*文章的总行数*/ int ReadDat(void); void WriteDat(void); void SortCharD(void) void main( if (ReadDat () printf (“数据文件 in.dat不能打开! n007“); return; SortCharD (); WriteDat (); /*从文件 in.dat中读取一篇英文文章
7、存入到字符串数组 xx中*/ int ReadDat(void) FILE *fp; int i=0; char *p; if(fp= fopen ( “in.dat“, “r“)=NULL) return 1; /如果文件 in.dat内容为空,则返回 1 /*当从文件 in.dat中读取 79个字符存入 xxi没有错误发生时,执行循环体中的语句*/ while(fgets(xxi,80,fp) != NULL) p=strchr(xxi, “n“); /在字符串 xxi中查找回车换行符第一个匹配的位置 if(p) *p=0; /如果 p的值不为零,则把其值设置为 0 i+; /行变量加 1
8、 maxline=i; /把文章的总行数赋给变量 maxline fclose(fp); return 0; /*把结果 xx输出到文件 out.dat中*/ void WriteDat(void) FILE *fp; unsigned int i; fp=fopen(“out.dat“, “w“); for(i=0; imaxline; i+) printf(“%sn“, xxi); fprintf(fp, “%sn“, xxi); fclose (fp); (分数:100.00)_正确答案:()解析:char ch; unsigned int i,j,k; /*以行为单位对字符按 ASCI
9、I码从大到小的顺序进行排序*/ for(i=0; imaxline; i+) for(j=0; jstrlen(xxi); j+) for(k=j; kstrlen(xxi); k+) /*如果字符 xxij的 ASCII码值小于 xxik的 ASCII码值,则两者进行互换*/ if(xxij xxik) ch=xxik; xxik=xxij; xxij=ch; 解析 以行为单位对字符按从大到小排序,结果仍按行重新存入字符串数组中。 首先定义字符变量 ch和无符号整型变量 i、j、k。 对字符二维数组 xx,在第一层 for循环中,变量 i从 0开始,依次递增直到其值等于 maxline,实现对文章每行的扫描,在第二层 for循环中,变量 j从 0开始,依次递增直到其值等于 strlen(xxi),即第i行的长度。在第三层循环语句中,变量 k从 j开始,依次递增直到其值等于 strlen(xxi),对每一行中的数组元素 xxij、xxik按照它们的 ASCII码值的大小进行比较,如果 xxij的 ASCII码小于 xxik的 ASCII码,则两者交换,实现整篇文章中的字符按 ASCII码值从大到小的顺序进行排序。