1、三级数据库技术机试-209 及答案解析(总分:100.00,做题时间:90 分钟)一、上机题(总题数:1,分数:100.00)1.文件 IN.DAT 中存放有字符数据,函数 ReadData()负责从中读取 20 行数据存放到字符串数组 inBuf中(每行字符串的长度均小于 80)。请编制函数 arrangeChar(),该函数的功能是:以行为单位,对字符串变量的下标为奇数位置上的字符,按其 ASC码值从小到大的顺序进行排序,对字符串变量的下标为偶数位置上的字符,按其 ASC码值从大到小的顺序进行排序,排序后的结果仍按行重新存入字符串数组 inBuf中,并且奇数位还保存在奇数位上,偶数位还保存
2、在偶数位上。函数 WriteData()负责把结果 inBuf 输出到文件 OUT.DAT 中。例如:位置 01234567源字符串 ahcfedgb则处理后字符串 gbedcfah注意:部分源程序已给出。请勿改动主函数 main()、读函数 ReadData()和写函数 WriteData()的内容。试题程序:#includestdlib.h#includestdio.h#includestring.h#includectype.h#define LINE 50#define COL 80char inBufLINECOL;int totleLine=0;/*文章的总行数*/int Read
3、Data(void);void WriteData(void);void arrangeChar()void main()system(“CLS“);if(ReadData()printf(“IN.DAT cant 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;itotleLine;i+)printI(“%s“,inBufi);fprintf(fp,“%s“,inBuIi);fclose(fp);(分
4、数:100.00)_三级数据库技术机试-209 答案解析(总分:100.00,做题时间:90 分钟)一、上机题(总题数:1,分数:100.00)1.文件 IN.DAT 中存放有字符数据,函数 ReadData()负责从中读取 20 行数据存放到字符串数组 inBuf中(每行字符串的长度均小于 80)。请编制函数 arrangeChar(),该函数的功能是:以行为单位,对字符串变量的下标为奇数位置上的字符,按其 ASC码值从小到大的顺序进行排序,对字符串变量的下标为偶数位置上的字符,按其 ASC码值从大到小的顺序进行排序,排序后的结果仍按行重新存入字符串数组 inBuf中,并且奇数位还保存在奇数
5、位上,偶数位还保存在偶数位上。函数 WriteData()负责把结果 inBuf 输出到文件 OUT.DAT 中。例如:位置 01234567源字符串 ahcfedgb则处理后字符串 gbedcfah注意:部分源程序已给出。请勿改动主函数 main()、读函数 ReadData()和写函数 WriteData()的内容。试题程序:#includestdlib.h#includestdio.h#includestring.h#includectype.h#define LINE 50#define COL 80char inBufLINECOL;int totleLine=0;/*文章的总行数*
6、/int ReadData(void);void WriteData(void);void arrangeChar()void main()system(“CLS“);if(ReadData()printf(“IN.DAT cant 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;itotleLine;i+)printI(“%s“,inBufi);fprintf(fp,“%s“,inBuIi);fclo
7、se(fp);(分数:100.00)_正确答案:(void arrangeChar()int i,j,k,colLINE;unsigned char temp;for(i=0;itotleLine;i+)/*统计出每行字母(不含回车符)的列数,即字符串长度*/for(j=0;jCOL; j+)if(inBufij=0)/*如果 inBuf 中的某一个值等于 0(行结束符)*/coli=j;/*则将该列号记下来,即为该列的列数*/break;/*退出循环*/for(i=0;itotleLine;i+)for(j=0;jcoli-1;j+)/*下面是对一行的奇数项字符进行由小到大、偶数项字符进行由
8、大到小的排序*/for(k=j+1;kcoli;k+)if(inBufijinBufik(j+1)%2=0)(k+1)%2=0)/*如果下标为奇数的字符的 ASC码值比其后一个奇数位下标字符的 ASC码值大*/*则进行交换*/temp=inBufij;inBufij=inBufik:inBufik=temp;if(inBufijinBufik(j+1)%2!=0)(k+1)%2!=0)/*如果下标为偶数的字符 ASC码值比其后一个偶数位下标字符的 ASC码值小*/*则进行交换*/temp=inBufij;inBufij=inBufik;inBufik=temp; )解析:解析 本题主要考查字符串的排序问题。分别对数组中下标为偶数和下标为奇数的数据进行排序,因此,在循环时应将奇数和偶数通过下标求余来区分开,以对其分别进行排序;排序的思想是(以从小到大为例),将当前数据与其后的各个数据相比较,如果当前数据比其后的数据大,则将两数据进行交换,从而使得前面的数据小于后面的数据,达到从小到大排序的目的。