1、计算机三级(数据库技术)上机考试 30 及答案解析(总分:-1.00,做题时间:90 分钟)1.函数 ReadDat()的功能是实现从文件 IN2.DAT 中读取一篇英文文章存入到字符串数组 xx 中;请编制函数 StrOL(),该函数的功能是:以行为单位对行中以空格或标点符号为分隔的所有单词进行倒排。最后把已处理的字符串(应不含标点符号)仍按行重新存入字符串数组 xx 中,最后调用函数 WriteDat()把结果xx 输出到文件 OUT2.DAT 中。 例如,原文:You He Me I am a student. 结果:Me He You student a am I 原始数据文件存放的格
2、式是:每行的宽度均小于 80 个字符,含标点符号和空格。 注意:部分源程序已给出。 请勿改动主函数 main()、读函数 ReadDat()和写函数 WriteDat()的内容。 试题程序: #include #include #include #include char xx5080; int maxline = 0;/* 文章的总行数 */ int ReadDat(void); void WriteDat(void); void StrOL(void) main() clrscr(); if (ReadDat () printf(“数据文件 IN2.DAT 不能打开!n007“); ret
3、urn; StrOL(); WriteDat(); int ReadDat(void) FILE *fp; int i = 0; char *p; if(fp = fopen(“IN2.DAT“, “r“) = NULL) return 1; while(fgets(xxi, 80, fp) != NULL) p = strchr(xx i, n); if(p) *p = 0; i+; maxline = i; fclose(fp); return 0; void WriteDat(void) FILE*fp; int i; clrscr(); fp = fopen(“OUT2.DAT“, “
4、w“); for(i = 0; i =a j=0;j-)/*从当前行的最后一个字符开始取字符,直到遇到空格*/ ppj+1=ppj; pp0=xxli; k+;i-; strcat(ch,pp); /*把该单词存放到数组 ch 中*/ strcpy(pp, “); /*清空数组 pp*/ k=1; if(i=-1)break; /*如果处理完了一行,则退出循环*/ while(xxli9j=0;j-) ppj+1=ppj; pp0=xxli; k+; i-; strcat(ch,pp); /*把空格加到数组ch 中*/ strcpy(pp,“); /*清空数组 pp*/ k=0; if(i=-
5、1)break; /*如果处理完了一行,则退出循环*/ strcpy(xxl,ch); /*把已处理的字符串仍按行重新存入字符串数组 xx 中*/ )解析:本题是有关字符串的处理问题。首先利用二重循环来按照先行后列的顺序取得 xx 数组中的各个字符元素,这里用到了 strlen()函数,用来求字符串长度。对依次取得的字符做一些处理,即把多余的标点符号去掉,使新的字符数组中只含有字母和空格。准备工作做完后,从当前行的最后一个字符开始取,不断的取每一个字符前面的字符,直到取得一个完整的单词后(即遇到空格分隔时),就把该单词存放到数组 ch 中(用到了 strcat()函数来连接两个字符串,用 strlen()函数来对字符串求取串长度),还要把分隔符也放到 ch 中去。接着去取该行中其他的字符组成的单词,重复上面的操作,对其他行同样处理。这样最终得到的字符串就是各行中单词出现的顺序的逆序了,但单词本身的字符顺序没有发生变化。