1、计算机三级数据库技术-18 及答案解析(总分:100.00,做题时间:90 分钟)一、B上机题/B(总题数:5,分数:100.00)1.已知数据文件 in.dat中存有 300个四位数,并已调用读函数 ReadDat()把这些数存入数组 a中。请编写函数 jsValue(),其功能是:求出千位数上的数加百位数等于十位数上的数加个位数上的数的个数cnt,再求出所有满足此条件的四位数平均值 pjz1,以及不满足此条件的四位数平均值 pjz2,最后调用写函数 writeDat(),把结果输出到 out.dat文件中。 例如:7153,7+1=5+3,则该数满足条件计算平均值pjz1,且个数 cnt=
2、cnt+1。 8129,8+12+9,则该数不满足条件计算平均值 pjz2。 注意:部分源程序已经给出。 程序中已定义数组:a300;已定义变量:cnt,pjz1,pjz2。 请勿改动主函数 main()、读函数 ReadDat()和写函数 writeDat()的内容。 #include stdio.h int a300,cnt=0; double pjz1=0.0,pjz2=0.0; void jsValue() void ReadDat() FIIE *fp; int i; fp=fopen(“in.dat“,“r“); for (i=0;i300;i+) fscanf(fp,“%d,“,
3、 fclose(fp); void writeDat() FILE *fp; fp=fopen(“out.dat“,“w“); fprintf(fp,%d/n%7.2f/n%7.2f/n“,cnt,pjz1,pjz2); fclose(fp); main() ReadDat(); jsValue(); writeDat(); printf(“cnt=%d/n满足条件的平均值 pzj1=%7.2f/n不满足条件的平均值 pzj2=%7.2f/n“ ,cnt,pjz1,pjz2); (分数:20.00)_2.已知数据文件 in.dat中存有 300个四位数,并已调用读函数 ReadDat()把这些
4、数存入数组 a中。请编写函数 jsValue(),其功能是:求出所有这些四位数是素数的个数 cnt,再求出所有满足此条件的四位数平均值 pjz1以及不满足此条件的四位数平均值 pjz2,最后调用写函数 writeDat(),把结果cnt、pjz1、pjz2 输出到 out.dat文件中。 例如:5591 是素数,则该数满足条件计算平均值 pjz1,且个数 cnt=cnt+1。 9812 是非素数,则该数不满足条件计算平均值 pjz2。 注意:部分源程序已经给出。 程序中已定义数组:a300;已定义变量:cnt、pjz1、pjz2。 请勿改动主函数 main()、读函数 ReadDat()和写函
5、数 writeDat()的内容。 #include stdio.h int a300,cnt=0; double pjz1=0.0,pjz2=0.0; int isP(int m) int i; for (i=2;im;i+) if(m%i=0) return 0; return 1; void jsValue() void ReadDat() FILE *fp; int i; fp=fopen(“in.dat“,“r“); for (i=0;i300;i+) fscanf(fp,“%d,“, fclose(fp); void writeDat() FILE *fp; fp=fopen(“ou
6、t.dat“,“w“); fprintf(fp,“%d/n%7.2f/n%7.2f/n“,cnt,pjz1,pjz2); fclose(fp); main() ReadDat(); jsValue(); writeDat(); printf(“cnt=%d/n满足条件的平均值 pzj1=%7.2f/n不满足条件的平均值 pzj2=%7.2f/n“,cnt,pjz1,pjz2); (分数:20.00)_3.函数 ReadDat()实现从 IN.DAT文件中读取 1000个十进制整数到数组 xx中。请编写函数 Compute()分别计算出 xx中奇数的个数 odd,奇数的平均值 ave1,偶数的个
7、数 even,偶数的平均值 ave2以及所有奇数的方差 totfc的值,最后调用函数 WriteDat(),把结果输出到 OUT.DAT文件中。 计算方差的公式如下: (分数:20.00)_4.现有一个 10个人 100行的选票数据文件 IN.DAT,其数据存放的格式是:每条记录的长度均为 10位,第一位表示第一个人的选中情况,第二位表示第二个人的选中情况,以此类推;内容均为字符 0和 1,1表示此人被选中,0 表示此人未被选中,若一张选票人数大于 5个人时被认为无效的选票。给定函数ReadDat()的功能是把选票数据读入到字符串数组 xx中。请编写函数 CountRs()来统计每个人的选票数
8、并把得票数依次存入 yy0到 yy9中。把结果 yy输出到 OUT.DAT文件中。 注意:部分源程序已经给出。 请勿改动主函数 main()、读数据函数 ReadDat()和输出数据函数 WriteDat()的内容。 #include stdio.h char xx10011; int yy10; int ReadDat(void); void WriteDat(void); void CountRs(void) void main() int i; for (i=0;i10;i+) yyi=0; if (ReadDat() printf(“选票数据文件 IN.DAT不能打开! /n/007“
9、); return; CountRs(); WriteDat(); int ReadDat(void) FILE *fp; int i; if (fp=fopen(“IN.DAT“,“r“)=NULL) return 1; for(i=0;i100;i+) if(fgets(xxi,12,fp)=NULL) return 1; fclose(fp); return 0; void WriteDat(void) FILE *fp; int i; fp=fopen(“OUT.DAT“,“w“); for(i=0;i10;i+) fprintf(fp,“%d/n“,yyi); printf(“第%d
10、 个人的选票数=%d/n“,i+1,yyi); fclose(fp); (分数:20.00)_5.已知数据文件 IN.DAT中存有 200个四位数,并已调用读函数 readDat()把这些数存入数组 a中。请编写函数 jsVal(),其功能是:把一个四位数的个位数字上的值减去千位数字上的值再减去百位数字上的值最后减去十位数字上的值,如果得出的值大于等于零且原四位数是偶数,则统计出满足此条件的个数 cnt并把这些四位数按从小到大的顺序存入数组 b中,最后调用写函数 writeDat(),把结果 cnt以及数组 b中符合条件的四位数输出到 OUT.DAT文件中。 注意:部分源程序已经给出。 程序中
11、已定义数组:a200,b200,已定义变量:cnt。 请勿改动数据文件 IN.DAT中的任何数据、主函数 main()、读函数 readDat()和写函数 writeDat()的内容。 #include stdio.h #define MAX 200 int 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,“, fclose(fp); void writeDat() FILE *fp; int i, fp=fo
12、pen(“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.00)_计算机三级数据库技术-18 答案解析(总分:100.00,做题时间:90 分钟)一、B上机题/B(总题数:5,分数:100.00)1.
13、已知数据文件 in.dat中存有 300个四位数,并已调用读函数 ReadDat()把这些数存入数组 a中。请编写函数 jsValue(),其功能是:求出千位数上的数加百位数等于十位数上的数加个位数上的数的个数cnt,再求出所有满足此条件的四位数平均值 pjz1,以及不满足此条件的四位数平均值 pjz2,最后调用写函数 writeDat(),把结果输出到 out.dat文件中。 例如:7153,7+1=5+3,则该数满足条件计算平均值pjz1,且个数 cnt=cnt+1。 8129,8+12+9,则该数不满足条件计算平均值 pjz2。 注意:部分源程序已经给出。 程序中已定义数组:a300;已
14、定义变量:cnt,pjz1,pjz2。 请勿改动主函数 main()、读函数 ReadDat()和写函数 writeDat()的内容。 #include stdio.h int a300,cnt=0; double pjz1=0.0,pjz2=0.0; void jsValue() void ReadDat() FIIE *fp; int i; fp=fopen(“in.dat“,“r“); for (i=0;i300;i+) fscanf(fp,“%d,“, fclose(fp); void writeDat() FILE *fp; fp=fopen(“out.dat“,“w“); fpri
15、ntf(fp,%d/n%7.2f/n%7.2f/n“,cnt,pjz1,pjz2); fclose(fp); main() ReadDat(); jsValue(); writeDat(); printf(“cnt=%d/n满足条件的平均值 pzj1=%7.2f/n不满足条件的平均值 pzj2=%7.2f/n“ ,cnt,pjz1,pjz2); (分数:20.00)_正确答案:(void jsValue() int i,thou,hun,ten,data,n=0; for (i=0;i300;i+) /*循环以遍历数组 a中的所有 300个四位数*/ thou=ai/1000; /*取当前数的
16、千位数字*/ hun=ai%1000/100; /*取当前数的百位数字*/ ten=ai%100/10; /*取当前数的十位数字*/ data=ai%10; /*取当前数的个位数字*/ if (thou+hun=ten+data) /*如果千位加百位等于十位加个位的话*/ cnt+; /*让计数值 cnt增1*/ pjz1+=ai; /*将此数累加到 pjz1中*/ else /*否则的话,让计数值 n增 1,将此数累加到pjz2中*/ n+; pjz2 +=ai; pjz1/=cnt; /*计算满足条件的数的平均值*/ pjz2 /=n; /*计算不满足条件的数的平均值*/ )解析:2.已知
17、数据文件 in.dat中存有 300个四位数,并已调用读函数 ReadDat()把这些数存入数组 a中。请编写函数 jsValue(),其功能是:求出所有这些四位数是素数的个数 cnt,再求出所有满足此条件的四位数平均值 pjz1以及不满足此条件的四位数平均值 pjz2,最后调用写函数 writeDat(),把结果cnt、pjz1、pjz2 输出到 out.dat文件中。 例如:5591 是素数,则该数满足条件计算平均值 pjz1,且个数 cnt=cnt+1。 9812 是非素数,则该数不满足条件计算平均值 pjz2。 注意:部分源程序已经给出。 程序中已定义数组:a300;已定义变量:cnt
18、、pjz1、pjz2。 请勿改动主函数 main()、读函数 ReadDat()和写函数 writeDat()的内容。 #include stdio.h int a300,cnt=0; double pjz1=0.0,pjz2=0.0; int isP(int m) int i; for (i=2;im;i+) if(m%i=0) return 0; return 1; void jsValue() void ReadDat() FILE *fp; int i; fp=fopen(“in.dat“,“r“); for (i=0;i300;i+) fscanf(fp,“%d,“, fclose(
19、fp); void writeDat() FILE *fp; fp=fopen(“out.dat“,“w“); fprintf(fp,“%d/n%7.2f/n%7.2f/n“,cnt,pjz1,pjz2); fclose(fp); main() ReadDat(); jsValue(); writeDat(); printf(“cnt=%d/n满足条件的平均值 pzj1=%7.2f/n不满足条件的平均值 pzj2=%7.2f/n“,cnt,pjz1,pjz2); (分数:20.00)_正确答案:(void jsValue() int i; for (i=0;i300;i+) /*循环以遍历数组
20、 a中的所有 300个数*/ if (isP(ai) /*如果是素数,则将此数累加到 pjz1中,并让计数值 cnt增 1*/ pjz1+=ai; cnt+; else pjz2+=ai; /*否则将其累加到 pjz2中*/ pjz1=pjz1/cnt; /*计算所有素数的平均值*/ pjz2=pjz2/(300-cnt); /*计算所有非素数的平均值*/ )解析:3.函数 ReadDat()实现从 IN.DAT文件中读取 1000个十进制整数到数组 xx中。请编写函数 Compute()分别计算出 xx中奇数的个数 odd,奇数的平均值 ave1,偶数的个数 even,偶数的平均值 ave2
21、以及所有奇数的方差 totfc的值,最后调用函数 WriteDat(),把结果输出到 OUT.DAT文件中。 计算方差的公式如下: (分数:20.00)_正确答案:(void Compute(void) int i,yyMAX; for (i=0;i1000;i+) /*循环以遍历数组 xx的所有1000个数*/ if (xxi%2) /*如果当前数为奇数*/ odd+; /*让计数值 odd增 1*/ ave1 +=xxi; /*将此数累加至 ave1中*/ yyodd-1=xxi; /*将此数保存到数组 yy中*/ else /*否则让计数值even增 1并将此数累加至 ave2中*/ e
22、ven+; ave2 +=xxi; ave1 /=odd; /*计算奇数的平均值*/ ave2 /=even; /*计算欧数的平均值*/ for (i=0;iodd;i+) /*循环以求所有奇数的方差*/ totfc +=(yyi-avel)*(yyi-ave1)/odd; )解析:4.现有一个 10个人 100行的选票数据文件 IN.DAT,其数据存放的格式是:每条记录的长度均为 10位,第一位表示第一个人的选中情况,第二位表示第二个人的选中情况,以此类推;内容均为字符 0和 1,1表示此人被选中,0 表示此人未被选中,若一张选票人数大于 5个人时被认为无效的选票。给定函数ReadDat()
23、的功能是把选票数据读入到字符串数组 xx中。请编写函数 CountRs()来统计每个人的选票数并把得票数依次存入 yy0到 yy9中。把结果 yy输出到 OUT.DAT文件中。 注意:部分源程序已经给出。 请勿改动主函数 main()、读数据函数 ReadDat()和输出数据函数 WriteDat()的内容。 #include stdio.h char xx10011; int yy10; int ReadDat(void); void WriteDat(void); void CountRs(void) void main() int i; for (i=0;i10;i+) yyi=0; i
24、f (ReadDat() printf(“选票数据文件 IN.DAT不能打开! /n/007“); return; CountRs(); WriteDat(); int ReadDat(void) FILE *fp; int i; if (fp=fopen(“IN.DAT“,“r“)=NULL) return 1; for(i=0;i100;i+) if(fgets(xxi,12,fp)=NULL) return 1; fclose(fp); return 0; void WriteDat(void) FILE *fp; int i; fp=fopen(“OUT.DAT“,“w“); for(
25、i=0;i10;i+) fprintf(fp,“%d/n“,yyi); printf(“第%d 个人的选票数=%d/n“,i+1,yyi); fclose(fp); (分数:20.00)_正确答案:(void CountRs(void) int i,count,j; char *pf; for (i=0;i10;i+) /*循环以遍历数组 yy*/ yyi=0; /*清零 yy中的元素(10 人的得票数)*/ for (i=0;i100;i+) /*循环以遍历 100行选票数据*/ pf=xxi; /*用字符指针 pf指向当前选票行*/ count=0; /*清零计数值 count用以统计当前
26、行选票数*/ while(*pf) /*以指针 pf遍历整个选票行*/ if(*pf=1) count+; /*若遍历到字符1,则让计数值 count增 1*/ pf+; /*继续遍历下一个字符*/ if (count=5) for (j=0;j10;j+) /*循环遍历选票行*/ yyj+=xxij-0; /*将选票位换算成数值累加进数组 yy*/ )解析:5.已知数据文件 IN.DAT中存有 200个四位数,并已调用读函数 readDat()把这些数存入数组 a中。请编写函数 jsVal(),其功能是:把一个四位数的个位数字上的值减去千位数字上的值再减去百位数字上的值最后减去十位数字上的值
27、,如果得出的值大于等于零且原四位数是偶数,则统计出满足此条件的个数 cnt并把这些四位数按从小到大的顺序存入数组 b中,最后调用写函数 writeDat(),把结果 cnt以及数组 b中符合条件的四位数输出到 OUT.DAT文件中。 注意:部分源程序已经给出。 程序中已定义数组:a200,b200,已定义变量:cnt。 请勿改动数据文件 IN.DAT中的任何数据、主函数 main()、读函数 readDat()和写函数 writeDat()的内容。 #include stdio.h #define MAX 200 int aMAX,bMAX,cnt=0; void jsVal() void r
28、eadDat() int i; FILE *fp; fp=fopen(“IN.DAT“,“r“); for(i=0;iMAX;i+) fscanf(fp,“%d,“, 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(
29、i=0;icnt;i+) printf(“%d“,bi); printf(“/n“); writeDat(); (分数:20.00)_正确答案:(void jsVal() int i,thou,hun,ten,data,j; for (i=0;iMAX;i+) /*循环以遍历数组 a中的所有四位数*/ thou=ai/1000; /*取当前数的千位数字*/ hun=ai%1000/100; /*取当前数的百位数字*/ ten=ai%100/10; /*取当前数的十位数字*/ data=ai%10; /*取当前数的个位数字*/ if (data-thou-hun-ten=0 /*将此数存入数组 b*/ cnt+; /*让计数值 cnt增 1*/ cnt+; /*对数组 b的前cnt个数进行选择排序*/ for (i=0;icnt-1;i+) for (j=i+1;jcnt;j+) if (bibj) /*前面的数大于后面的数则交换,即升序排列*/ data=bi; bi=bj; bj=data; )解析: