1、三级数据库技术机试-249 及答案解析(总分:100.00,做题时间:90 分钟)一、上机题(总题数:5,分数:100.00)1.请编写函数 num(int m,int k,int xx),该函数的功能是:将大于整数 m 且紧靠 m 的 k 个素数存入数组 xx 传回。最后调用函数 readwriteDat(),从 in.dat 文件中读取 10 组数据,分别得出结果,且把结果输出到out.dat 文件中。部分程序已经给出。例如,若输入 17 5,则应输出:19 23 29 31 37。注意:部分程序已经给出。请勿改动主函数 main()和输出数据函数 readwriteDat()的内容。#i
2、ncludeconio.h#includestdio.hvoid readwriteDat();void num(int m,int k,int xx)msin()int m,n,xx1000;printf(“/nPlease enter two integers:“);scanf(“%d%d“,m,n);num(m,n,xx);for(m=0; mn; m+)printf(“%d“,xxm);printf(“/n“);readwriteDat();void readwriteDat()int m,n,xx1000,i;FILE *rf,*wf;rf=fopen(“in.dat“,“r“);w
3、f=fopen(“out.dat“,“w“);for(i=0; i10;i+)fscanf(rf,“%d%d“,m,n);num(m,n,xx);for(m=0; mn;m+)fprintf(wf,“%d“,xxm);fprintf(wf,“/n“);fclose(rf);fclose(wf);(分数:20.00)_2.已知数据文件 IN.DAT 中存有 200 个四位数,并已调用读函数 readDat()把这些数存入数组 a 中。请编写函数 jsVal(),其功能是:如果四位数各位上的数字均是 0 或 2 或 4 或 6 或 8,则统计出满足此条件的个数 cnt,并把这些四位数按从大到小的顺
4、序存入数组 b 中。最后 main()函数调用写函数 writeDat(),把结果 cnt 以及数组 b 中符合条件的四位数输出到 OUT.DAT 文件中。注意:部分程序已经给出。程序中已定义数组:a200,b200;已定义变量:cnt。请勿改动数据文件 IN.DAT 中的任何数据及主函数 main()、读函数 readDat()和写函数 writeDat()的内容。#includestdio.h#define MAX 200int aMAX,bMAX,cnt=0;void jsVal()void readDat()int i;FILE *fp;fp=fopen(“IN.DAT“,“r“);f
5、or(i=0; iMAX; i+)fscanf(fp,“%d,“,ai);fclose(fp);VOid writeDat()FILE *fp;int i;fp=fopen(“OUT.DAT“,“W“);fprintf(fp,“%d/n“,cnt);for(i=0;icnt;i+)fprintf(fp,“%d/n“,bi);fclose(fp);void main()int i;readDat();jsVal();printf(“满足条件的数=%d/n“,cnt);for(i=0; icnt; i+)printf(“%d“,bi);printf(“/n“);writeDat();(分数:20.
6、00)_3.函数 ReadDat()实现从 IN.DAT 文件中读取一篇英文文章并存入字符串数组 xx 中。请编写函数 StrOR(),其函数的功能是:以行为单位,依次把字符串中所有小写字母 o 左边的字符串内容移到该串的右边,然后把小写字母 o 删除,余下的字符串内容移到已处理字符串的左边,之后,把已处理的字符串仍按行重新存入字符串数组 xx 中。最后 main()函数调用函数 WriteDat(),把结果 xx 输出到 OUT.DAT 文件中。例如, 原文: n any field. Yu can create an indexyou have the correct record结果:
7、n any field. Yu can create anindexrd. yuhavethe crrect rec原始数据文件存放的格式是:每行的宽度均小于 80 个字符,含标点符号和空格。注意:部分源程序已经给出。请勿改动主函数 main()、读数据函数 ReadDat()和输出数据函数 writeDat()的内容。#includestdio.h#includestring.h#includeconio.hchar xx5080;int maxline=0; /*文章的总行数*/int ReadDat(void);void WriteDat(void);void StrOR(void)vo
8、id main()if(ReadDat()printf(“数据文件 IN.DAT 不能打开!/n/007“);return;StrOR();WriteDat();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)p=strchr(xxi,/n);if(p)*p=0;i+;maxline=i;fclose(fp);return 0;void WriteDat(void)FILE *fp;int i;fp=fopen(“OUT.DA
9、T“,“W“);for(i=0;imaxline;i+)printf(“%s/n“,xxi);fprintf(fp,“%s/n“,xxi);fclose(fp);(分数:20.00)_4.函数 ReadDat()实现从 IN.DAT 文件中读取一篇英文文章并存入道字符串数组 xx 中。请编写函数 StrOL(),其函数的功能是:以行为单位对行中以空格或标点符号为分隔的所有单词进行倒排。最后把已处理的字符串(应不含标点符号)仍按行重新存入字符串数组 xx 中,最后调用函数 WriteDat(),把结果 xx 输出到OUT.DAT 文件中。例如: 原文: You He MeI am a stude
10、nt结果: Me He Youstudent a am I原始数据文件存放的格式是:每行的宽度均小于 80 个字符,含标点符号和空格。注意:部分程序已经给出。请勿改动主函数 main()、读数据函数 ReadDat()和输出数据函数 WriteDat()的内容。#includestdio.h#includestring.h#includeconio.h#includectype.hchar xx5080;int maxline=0;/*文章的总行数*/int ReadDat(void);void WriteDat(void);void StrOL(void)void main()if(Read
11、Dat()printf(“数据文件 IN.DAT 不能打开!/n/007“);return;StrOL();WriteDat();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)p=strchr(xxi,/n);if(p)*p=0;i+;maxline=i;fclose(fp);return 0;void WriteDat(void)FILE *fp;int i;fp=fopen(“OUT.DAT“,“W“);for(i=0;
12、imaxline; i+)printf(“%s/n“,xxi);fprintf(fp,“%s/n“,xxi);fclose(fp);(分数:20.00)_5.在 in.da 文件中有 200 个正整数,且每个数均在 10009999 之间。函数 ReadDat()读取这 200 个数并存放到数组 aa 中。请编写函数 jsSort(),其函数的功能是:要求按每个数的后三位的大小进行升序排列,然后取出满足此条件的前 10 个数依次存入数组 bb 中,如果后三位的数值相等,则按原先的数值进行降序排列。最后调用函数 WriteDat(),把结果 bb 输出到 out.dat 文件中。例如:处理前 6
13、012 5099 9012 7025 8088处理后 9012 6012 7025 8088 5099注意:部分程序已经给出。请勿改动主函数 main()、读数据函数 ReadDat()和输出数据函数 WriteDat()的内容。#includeStdio.h#includestring.h#includeconio.hint aa200,bb10;void jsSort()void ReadDat()FILE *in;int i;in=fopen(“in.dat“,“r“);for(i=0;i200;i+)fscanf(in,“%d,“,aai);fclose(in);void WriteD
14、at()FILE *out;int i;out=fopen(“out.dat“,“W“);for(i=0;i10;i+)printf(“%d“,bbi);fprintf(out,“%d/n“,bbi);fclose(out);void main()ReadDat();jsSort();WriteDat();(分数:20.00)_三级数据库技术机试-249 答案解析(总分:100.00,做题时间:90 分钟)一、上机题(总题数:5,分数:100.00)1.请编写函数 num(int m,int k,int xx),该函数的功能是:将大于整数 m 且紧靠 m 的 k 个素数存入数组 xx 传回。最
15、后调用函数 readwriteDat(),从 in.dat 文件中读取 10 组数据,分别得出结果,且把结果输出到out.dat 文件中。部分程序已经给出。例如,若输入 17 5,则应输出:19 23 29 31 37。注意:部分程序已经给出。请勿改动主函数 main()和输出数据函数 readwriteDat()的内容。#includeconio.h#includestdio.hvoid readwriteDat();void num(int m,int k,int xx)msin()int m,n,xx1000;printf(“/nPlease enter two integers:“);
16、scanf(“%d%d“,m,n);num(m,n,xx);for(m=0; mn; m+)printf(“%d“,xxm);printf(“/n“);readwriteDat();void readwriteDat()int m,n,xx1000,i;FILE *rf,*wf;rf=fopen(“in.dat“,“r“);wf=fopen(“out.dat“,“w“);for(i=0; i10;i+)fscanf(rf,“%d%d“,m,n);num(m,n,xx);for(m=0; mn;m+)fprintf(wf,“%d“,xxm);fprintf(wf,“/n“);fclose(rf)
17、;fclose(wf);(分数:20.00)_正确答案:(void num(int m,int k,int xx)/术定义整型变量 data,并初始化为 m+1(即大于整数 m 且紧靠 m 的第 1 个整数)*/int data=m+1;int half,n=0,i;while(1)/*判断 data 是否为素数*/half=data/2;for(i=2;i=half;i+)if(data%i=0)break;if(ihalf) /*如果此时 ihalf 说明 data 是一个素数*/xxr1=data; /*将 data 存入数组 xx*/n+; /*让计数变量 n 增 1;/*如果已经找足
18、 k 个素数了,就通过 break 语句跳出循环*/if(n=k)break;data+; /*继续找下一个素数*/)解析:2.已知数据文件 IN.DAT 中存有 200 个四位数,并已调用读函数 readDat()把这些数存入数组 a 中。请编写函数 jsVal(),其功能是:如果四位数各位上的数字均是 0 或 2 或 4 或 6 或 8,则统计出满足此条件的个数 cnt,并把这些四位数按从大到小的顺序存入数组 b 中。最后 main()函数调用写函数 writeDat(),把结果 cnt 以及数组 b 中符合条件的四位数输出到 OUT.DAT 文件中。注意:部分程序已经给出。程序中已定义数
19、组:a200,b200;已定义变量:cnt。请勿改动数据文件 IN.DAT 中的任何数据及主函数 main()、读函数 readDat()和写函数 writeDat()的内容。#includestdio.h#define MAX 200int aMAX,bMAX,cnt=0;void jsVal()void readDat()int i;FILE *fp;fp=fopen(“IN.DAT“,“r“);for(i=0; iMAX; i+)fscanf(fp,“%d,“,ai);fclose(fp);VOid writeDat()FILE *fp;int i;fp=fopen(“OUT.DAT“,
20、“W“);fprintf(fp,“%d/n“,cnt);for(i=0;icnt;i+)fprintf(fp,“%d/n“,bi);fclose(fp);void main()int i;readDat();jsVal();printf(“满足条件的数=%d/n“,cnt);for(i=0; icnt; i+)printf(“%d“,bi);printf(“/n“);writeDat();(分数:20.00)_正确答案:(void jsVal()int bb4;int i,j,k,flag;for(i=0;i200;i+) /*循环以遍历数组 a 中的每一个四位数*/bb0=ai/1000;
21、/*将 ai的千位数字存入 bb0*/bb1=ai%1000/100;/*将 ai的百位数字存入 bb1*/bb2=ai%100/10; /*将 ai的十位数字存入 bb2*/bb3=ai%10; /*将 ai的个位数字存入 bb3*/for(j=0;j4;j+) /*循环以遍历数组 bb,即 ai的每一位*/*根据当前位是否能被 2 整除,来设置旗标变量 flag 为 1 还是 0*/if(bbj%2=0)flag=1;elseflag=0;/*如果有 1 位不能被 2 整除,后面的位就不必判断了,跳出该循环*/break;if(flag=1) /*如果此时 flag 的值为 1 说明所有位
22、均能被 2 整除*/bcnt=ai;/*将此数存入数组 b*/cnt+; /*计数值 cnt 增 1*/*对数组 b 的前 cnt 个数进行选择排序*/for(i=0;i(cnt-1;i+)for(j=i+1;j(cnt;j+)/*如果 bi因小于它后面的数 bj而交换两者,说明此排序为降序*/if(bibj)k=bi;bi=bj;bj=k;)解析:3.函数 ReadDat()实现从 IN.DAT 文件中读取一篇英文文章并存入字符串数组 xx 中。请编写函数 StrOR(),其函数的功能是:以行为单位,依次把字符串中所有小写字母 o 左边的字符串内容移到该串的右边,然后把小写字母 o 删除,余
23、下的字符串内容移到已处理字符串的左边,之后,把已处理的字符串仍按行重新存入字符串数组 xx 中。最后 main()函数调用函数 WriteDat(),把结果 xx 输出到 OUT.DAT 文件中。例如, 原文: n any field. Yu can create an indexyou have the correct record结果: n any field. Yu can create anindexrd. yuhavethe crrect rec原始数据文件存放的格式是:每行的宽度均小于 80 个字符,含标点符号和空格。注意:部分源程序已经给出。请勿改动主函数 main()、读数据函
24、数 ReadDat()和输出数据函数 writeDat()的内容。#includestdio.h#includestring.h#includeconio.hchar xx5080;int maxline=0; /*文章的总行数*/int ReadDat(void);void WriteDat(void);void StrOR(void)void main()if(ReadDat()printf(“数据文件 IN.DAT 不能打开!/n/007“);return;StrOR();WriteDat();int ReadDat(void)FILE*fp;int i=0;char*p;if(fp=f
25、open(“IN.DAT“,“r“)=NULL)return 1;while(fgets(xxi,80,fp)!=NULL)p=strchr(xxi,/n);if(p)*p=0;i+;maxline=i;fclose(fp);return 0;void WriteDat(void)FILE *fp;int i;fp=fopen(“OUT.DAT“,“W“);for(i=0;imaxline;i+)printf(“%s/n“,xxi);fprintf(fp,“%s/n“,xxi);fclose(fp);(分数:20.00)_正确答案:(void StrOR(void)int i,j,k;char
26、 bur80;for(i=0;i(maxline;i+) /*循环以遍历英文文章的每一行*/j=strlen(xxi)-1; /*求出当前行最后一个字符的位置*/*从最后一个字符往前循环遍历当前行,直到碰到小写字母0或到行首*/while(xxij!=0j=0)j-;if(j0) /*如果 j0 说明找到行首也没发现一个0*/continue; /*则当前行不用操作,去下一行*/*找到字母0,用字符串结束标志 0(或写成/0)替换之,使该行一分为二*/xxij=0;strcpy(buf,xxij+1); /*将后半截字符串复制到缓存行 buf 中*/*从第 1 个字符开始循环遍历前半截字符串*
27、/k=j=0;while(xxij)/*循环往后遍历,找出第 1 个小写字母0的位置或到达字符串末尾*/while(xxij!=0xxij)j+;if(!xxij) /*如果!xxij为真,说明已到达字符串末尾*/*将找过的这段字符串连接到 buf 中已存字符串的末尾并跳出循环*/strcat(buf,xxik);break;/*如果找到了字母0,用 0 替换之以分割出找过的这段字符串*/xxij=0;/*将找过的这段字符串连接到 buf 中已存字符串的末尾*/strcat(buf,xxik);/*从下一个位置开始继续循环遍历剩下的字符串*/j+;k=j;/*执行到这里,当前行已遍历完毕,用操
28、作结果覆盖掉原来内容*/strcpy(xxi,bur);)解析:4.函数 ReadDat()实现从 IN.DAT 文件中读取一篇英文文章并存入道字符串数组 xx 中。请编写函数 StrOL(),其函数的功能是:以行为单位对行中以空格或标点符号为分隔的所有单词进行倒排。最后把已处理的字符串(应不含标点符号)仍按行重新存入字符串数组 xx 中,最后调用函数 WriteDat(),把结果 xx 输出到OUT.DAT 文件中。例如: 原文: You He MeI am a student结果: Me He Youstudent a am I原始数据文件存放的格式是:每行的宽度均小于 80 个字符,含标
29、点符号和空格。注意:部分程序已经给出。请勿改动主函数 main()、读数据函数 ReadDat()和输出数据函数 WriteDat()的内容。#includestdio.h#includestring.h#includeconio.h#includectype.hchar xx5080;int maxline=0;/*文章的总行数*/int ReadDat(void);void WriteDat(void);void StrOL(void)void main()if(ReadDat()printf(“数据文件 IN.DAT 不能打开!/n/007“);return;StrOL();WriteD
30、at();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)p=strchr(xxi,/n);if(p)*p=0;i+;maxline=i;fclose(fp);return 0;void WriteDat(void)FILE *fp;int i;fp=fopen(“OUT.DAT“,“W“);for(i=0;imaxline; i+)printf(“%s/n“,xxi);fprintf(fp,“%s/n“,xxi);fclos
31、e(fp);(分数:20.00)_正确答案:(void StrOL(void)int i,j,k,strl,1;/*循环遍历英文文章的全部字符,将既不是字母也不是空格的字符替换成空格*/for(i=0;i(maxline;i+)for(j=0;j(int)strlen(xxi)vj+)if(!isalpha(xxiJ)xxij!=)xxij=;for(1=0;1(maxline;1+) /*循环以遍历文章的每一行*/char ch80=0;char pp80=0;strl=strlen(xx1);i=strl-1; /*求出当前行最后一个字符的位置*/k=0;while(1)/*从最后一个字符
32、往前循环遍历当前行,直到碰到非字母字符或到行首*/*(即以从后往前的顺序查找单词)*/while(i salpha(xx1i)i=0)/*将字符数组 pp 中的前 k+1 个字符往后移动一位*/for(j=k;j=0;j-)ppj+1=ppj;pp0=xx1i; /*将当前字符存入到 pp 的第 1 个位置*/k+; /*pp 中的有效字符数增 1*/i-; /*继续遍历前一个字符*/strcat(ch,pp); /*将 pp 中的单词连接到字符数组 ch 的末尾*/strcpy(pp,-); /*清空 pp 数组*/k=0;if(i0)break; /*若已遍历到行首则跳出该循环*/*从后往
33、前循环遍历当前行,直到碰到字母字符或到行首*/*(即以从后往前的顺序查找两个单词之间的字符)*/while(!i salpha(xx1i)i=0)/*将字符数组 pp 中的前 k+1 个字符往后移动一位*/for(j=k;j=0;j-)ppj+1=ppj;pp0=xx1i; /*将当前字符存入到 pp 的第 1 个位置*/k+; /*pp 中的有效字符数增 1*/i-; /*继续遍历前一个字符*/strcat(ch,pp); /*将 pp 中的字符串连接到 ch 的末尾*/strcpy(pp,-); /*清空 pp 数组*/k=0;if(i0)break; /*若己遍历到行首则跳出该循环*/*
34、执行到这里,当前行已遍历完毕,用操作结果覆盖掉原来内容*/strcpy(xx1,ch);)解析:5.在 in.da 文件中有 200 个正整数,且每个数均在 10009999 之间。函数 ReadDat()读取这 200 个数并存放到数组 aa 中。请编写函数 jsSort(),其函数的功能是:要求按每个数的后三位的大小进行升序排列,然后取出满足此条件的前 10 个数依次存入数组 bb 中,如果后三位的数值相等,则按原先的数值进行降序排列。最后调用函数 WriteDat(),把结果 bb 输出到 out.dat 文件中。例如:处理前 6012 5099 9012 7025 8088处理后 90
35、12 6012 7025 8088 5099注意:部分程序已经给出。请勿改动主函数 main()、读数据函数 ReadDat()和输出数据函数 WriteDat()的内容。#includeStdio.h#includestring.h#includeconio.hint aa200,bb10;void jsSort()void ReadDat()FILE *in;int i;in=fopen(“in.dat“,“r“);for(i=0;i200;i+)fscanf(in,“%d,“,aai);fclose(in);void WriteDat()FILE *out;int i;out=fopen
36、(“out.dat“,“W“);for(i=0;i10;i+)printf(“%d“,bbi);fprintf(out,“%d/n“,bbi);fclose(out);void main()ReadDat();jsSort();WriteDat();(分数:20.00)_正确答案:(void jsSort ()int i,j,data;/*对数组 aa 的所有 200 个数进行选择排序*/for(i=0;i199;i+)for(j=i+1;j200;j+)/*按每个数后三位的大小进行升序排列*/if(aai%1000aaj%1000)data=aai;aai=aaj;aaj=data;else if(aai%1000=aaj%1000) /*若后三位相等则按实际大小进行降序排列*/if(aaiaaj)data=aai;aai=aaj;aaj=data;for(i=0;i10;i+) /*取出排序后数组 aa 中的前 10 个数存入数组 bb*/bbi=aai;)解析: