1、三级数据库技术-531 及答案解析(总分:100.00,做题时间:90 分钟)一、设计与应用题(总题数:1,分数:100.00)1.对 10个候选人进行选举,现有一个 100条记录的选票数据文件 in.dat,其数据存放的格式是每条记录的长度均为 10位,第一位表示第一个候选人的选中情况,第二位表示第二个候选人的选中情况,依次类推;每一位内容均为字符“0“或“1“,“1“表示此人被选中,“0“表示此人未被选中,若一张选票选中人数大于 5个人时被认为无效的选票则不作统计。给定函数 ReadDat()的功能是把选票数据读入到字符串数组 xx中。请编制函数 CountRs()来统计每个候选人的选票数
2、并把得票数依次存入 yy0到 yy9中,即第一个候选人的得票数存入 yy0中,以此类推。最后调用函数 WriteDat()把结果 yy输出到文件 out.dat中。 请勿改动主函数 main()、读函数 ReadDat()和输出函数 WriteDat()的内容。 #include stdio.h #include string.h char xx100 11; int yy10; int ReadDat (void); void WriteDat(void); void CountRs(void) void main() int i; for(i=0; i10; i+) yyi=0; if (
3、ReadDat () printf (“选票数据文件 in.dat不能打开! 007n“); return; CountRs (); WriteDat (); /*把选票数据读入到字符串数组 xx中*/ int ReadDat (void) FILE *fp; int i; char tt13; if(fp=fopen (“in.dat“, “r“)=NULL) return 1; for(i=0; i100; i+) if(fgets(tt, 13, fp) = NULL) return 1; memcpy(xxi, tt, 10); xxi i0=0; fclose (fp); retur
4、n 0; /*把结果 yy输出到文件 out.dat中*/ void WriteDat(void) FILE *fp; int i; fp=fopen(“out.dat“, “w“); for(i=0; ii0; i+) fprintf(fp, “%dn“, yyi); printf(“第%d 个人的选票数=%dn“, i+1, yyi); fclose(fp); (分数:100.00)_三级数据库技术-531 答案解析(总分:100.00,做题时间:90 分钟)一、设计与应用题(总题数:1,分数:100.00)1.对 10个候选人进行选举,现有一个 100条记录的选票数据文件 in.dat,
5、其数据存放的格式是每条记录的长度均为 10位,第一位表示第一个候选人的选中情况,第二位表示第二个候选人的选中情况,依次类推;每一位内容均为字符“0“或“1“,“1“表示此人被选中,“0“表示此人未被选中,若一张选票选中人数大于 5个人时被认为无效的选票则不作统计。给定函数 ReadDat()的功能是把选票数据读入到字符串数组 xx中。请编制函数 CountRs()来统计每个候选人的选票数并把得票数依次存入 yy0到 yy9中,即第一个候选人的得票数存入 yy0中,以此类推。最后调用函数 WriteDat()把结果 yy输出到文件 out.dat中。 请勿改动主函数 main()、读函数 Rea
6、dDat()和输出函数 WriteDat()的内容。 #include stdio.h #include string.h char xx100 11; 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不能打开! 007n“); return; CountRs (); WriteDat (); /*把选票数据读入到字符串数组 xx中*/ int
7、 ReadDat (void) FILE *fp; int i; char tt13; if(fp=fopen (“in.dat“, “r“)=NULL) return 1; for(i=0; i100; i+) if(fgets(tt, 13, fp) = NULL) return 1; memcpy(xxi, tt, 10); xxi i0=0; fclose (fp); return 0; /*把结果 yy输出到文件 out.dat中*/ void WriteDat(void) FILE *fp; int i; fp=fopen(“out.dat“, “w“); for(i=0; ii0
8、; i+) fprintf(fp, “%dn“, yyi); printf(“第%d 个人的选票数=%dn“, i+1, yyi); fclose(fp); (分数:100.00)_正确答案:()解析:int i,j,cnt; for(i=0; i100; i+) cnt=0; /赋初值 0,每次执行循环时,都将重新赋值 for(j=0; j10; j+) if(xxij=“1“) /判断 xxij是否数字 1 cnt+; /计数变量加 1 if(cnt=5) /如果一张选票中的选中数小于等于 5时,统计每个人的得票数 for(j=0; j10; j+) if(xxi(j=“1“) /如果第
9、j人被选中,则其得票数加 1 yyj+; /得票数加 1 解析 10 列 100行选票,每行大于 5的无效,统计存入数组。 根据题意,本程序中要统计每条记录中的有效票数,因此需要先判断该记录是否有效,然后再对有效的记录做进一步处理,即统计每个人的得票情况。 首先定义两个循环变量 i、j 和一个计数变量 cnt。 指定第一个 for循环的循环条件,循环变量 i从 0开始,等于 100时结束,每循环一次,变量 i的值加1。 在 for循环中,从第一条记录开始,每执行一次循环则处理一条记录是否满足要求。for 循环语句执行流程大致如下:先将计数变量 cnt赋值 0(每执行一次循环时,都将重新赋初值 0):然后通过一个 for循环判断当前记录的 10个数字是否为 1,每次判断 1个数字,如果数字等于 1,则计数变量 cnt的值加 1,当第二个 for循环执行完毕后,如果计数变量 cnt的值小于等于 5,则再通过一个 for循环重新判断哪些位置上的数等于 1,并将相应位置上的数值累加 1。