国家三级(数据库技术)机试模拟试卷8(共9题)_第1页
国家三级(数据库技术)机试模拟试卷8(共9题)_第2页
国家三级(数据库技术)机试模拟试卷8(共9题)_第3页
国家三级(数据库技术)机试模拟试卷8(共9题)_第4页
国家三级(数据库技术)机试模拟试卷8(共9题)_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

国家三级(数据库技术)机试模拟试卷8(共9套)(共9题)国家三级(数据库技术)机试模拟试卷第1套一、程序设计题(本题共1题,每题1.0分,共1分。)1、已知数据文件IN.dat中存有300个四位数,并已调用读函数Rdata()把这些数存入数组a中,请编写函数NumCal(),其功能是:求出千位上的数加个位上的数等于百位上的数加十位上的数的四位数的个数count,再求出所有满足此条件的四位数的平均值Ave1,以及不满足此条件的四位数的平均值Ave2。最后调用写函数Wdata(),把结果输出到OUT.dat文件中。例如:6712,6+2=7+1,则该数满足条件,计算平均值Ave1,且个数count=count+1。8129,8+9!=1+2,则该数不满足条件,计算平均值Ave2。注意:部分源程序已经给出。程序中已定义数组a[300],已定义变量count、Ave1、Ave2。请勿改动主函数main()、读函数Rdata()和写函数Wdata()的内容。#include<stdio.h>inta[300],count=0;doubleAve1=0.0,Ave2=0.0;voidNumCal(){}voidRdata(){FILE*fp;inti;fp=fopen("IN.dat","r");for(i=0;i<300;i++)fscanf(fp,"%d,",&a[i];fclose(fp);}voidWdata(){FILE*fp;fp=fopen("OUT.dat","w");fprintf(fp,"%d\n%7.2f\n%7.2f\n",count,Ave1,Ave2);fclose(fp);}main(){Rdata();NumCal();Wdata();printf("count=%d\n满足条件的平均值Ave1=%7.2f\n不满足条件的平均值Ave2=%7.2f\n",count,Ave1,Ave2);}标准答案:voidNumCal(){inti,n=0,thou,hun,ten,data;for(i=0;i<300;i++){thou=a[i]/1000;hun=a[i]%1000/100;ten=a[i]%100/10;data=a[i]%10;if(thou+data==hun+ten){count++;Ave1+=a[i];}else{n++;Ave2+=a[i];}}Ave1/=count;Ave2/=n;}[解题思路]对于每一个四位数,用这个四位数除以1000,可得到这个四位数千位上的数字输给变量thou;这个四位数对1000求余数然后再除以100,可得到这个四位数百位上的数字输给变量hun;这个四位数对100求余数然后再除以10,可得到这个四位数十位上的数字输给变量ten;这个四位数对10求余数,可得到这个四位数个位上的数字输给变量data。然后判断表达式thou+data==hun+ten是否成立,如果成立,则计数变量count加1,同时把这个数加到变量Ave1上;否则计数变量n加1,同时把这个数加到变量Ave2上。循环结束后,变量Ave1的值除以count,就得到所有满足此条件的四位数的平均值Ave1;变量Ave2的值除以n,就得到有不满足此条件的四位数的平均值Ave2。知识点解析:暂无解析国家三级(数据库技术)机试模拟试卷第2套一、程序设计题(本题共1题,每题1.0分,共1分。)1、下列程序的功能是:计算500~800之间素数的个数cnt,并按所求素数的值从小到大的顺序,再计算其间隔加、减之和,即第1个素数-第2个素数+第3个素数-第4个素数+第5个素数……的值sum。请编写函数countValue()实现程序的要求,最后调用函数writeDat()把结果cnt和sum输出到文件OUT66.DAT中。注意:部分源程序己给出。请勿改动主函数main()和写函数writeDAT()的内容。试题程序:include<stdio.h>intcnt,sum;voidcountValue(){}voidmain(){cnt=sum=0;countValue();printf("素数的个数=%d\n",cnt);printf("按要求计算机得值=%d\n",sum);writeDAT();}writeDAT(){FILE*fp;fp=fopen("OUT66.DAT","w");fprintf(fp,"%d\n%d\n",cnt,sum);fclose(fp);}标准答案:voidcountValue(){inti,j,half,yy[100];for(i=500;i<800;i++){half=i/2;for(j=2;j<=half;j++)if(i%j==0)break;/*如果该数不是素数,则退出此层循环*/if(j>=half)/*如果该数是素数,则将该数存入数组yy中*/{yy[cnt]=i;cnt++;/*统计素数的个数*/}}for(i=0,j=-1;i<cnt;i++)/*计算这些素数的间隔加、减之和*/{i=j*-1;sum+=j*yy[i];}}知识点解析:本题考查的知识点如下:(1)利用循环和“%”进行素数的判断。(2)间隔加、减的实现。在本题中,首先要找出判断素数的方法。若一个数a依次除以从2到a/2的数所得的余数都不是0,则这个数是素数。用此方法依次判断出从500到800区间内的素数。由题意可知,第1,3,5…个素数计算加法,第2,4,6…个素数计算减法。减去1个正整数就是加上负的这个正整数,所以可以将这个正整数乘以-1进行加法。使用循环实现求和,在奇数次的循环中,每个素数乘以1,偶数次的循环中,素数乘以-1,就可实现间隔加、减。国家三级(数据库技术)机试模拟试卷第3套一、程序设计题(本题共1题,每题1.0分,共1分。)1、函数ReadDat()实现从文件IN.dat中读取1000个十进制整数到数组xx中;请编写函数Compute()分别计算出数组xx中奇数的个数odd、偶数的个数even,以及所有数的平均值aver和方差totfc的值。最后调用函数WriteDat(),把结果输出到OUT.dat文件中。计算方差的公式如下:原始数据文件存放的格式是:每行存放10个数(每个数均大于0且小于等于2000),并用逗号隔开。注意:部分源程序已经给出。请勿改动主函数main()、读函数ReadDat()和输出数据函数WriteDat()的内容。#include<stdio.h>#include<stdlib.h>#include<string.h>#defineMAX1000intxx[MAX],odd=0,even=0;doubleaver=0.0,totfc=0.0;voidWriteDat(void);intReadDat(void){FILE*fp;inti,j;if((fp=fopen("IN.dat","r"))==NULL)return1;for(i=0;i<100;i++){for(j=0;j<10;j++)fscanf(fp,"%d,",&xx[i*10+j]);fscanf(fp,"\n");if(feof(fp))break;}fclose(fp);return0;}voidCompute(void){}voidmain(){inti;for(i=0;i<MAX;i++)xx[i]=0;if(ReadDat()){printf("数据文件IN.dar不能打开!\007\n");return;}Compute();printf("odd=%d\neven=%d\naver=%f\ntotfc=%f\n",odd,even,aver,totfc);WriteDat();}voidWriteDat(void){FILE*fp;fp=fopen("OUT.dat","w");fprintf(fp,"%d\n%d\n%f\n%f\n",odd,even,aver,totfc);fclose(fp);}标准答案:voidCompute(void){inti;for(i=0;i<1000;i++){if(xx[i]%2)odd++;elseeven++;aver=aver+xx[i];}aver/=MAX;for(i=0;i<1000;i++)totfc+=(xx[i]-aver)*(xx[i]-aver)/MAX;}[解题思路]对数组xx[i]中的1000个整数逐个进行扫描处理,如果xx[i]对2的余数为1,则xx[i]为奇数,变量odd加1;否则xx[i]为偶数,变量even加1。把xx[i]的值与变量aver相加存入变量aver中。退出循环时,变量aver的值除以MAX就得到平均值。最后在for循环语句中根据方差的公式求出所有数的方差。知识点解析:暂无解析国家三级(数据库技术)机试模拟试卷第4套一、程序设计题(本题共1题,每题1.0分,共1分。)1、已知在文件IN2.DAT中存有100个产品销售记录,每个产品销售记录由产品代码dm(字符型4位)、产品名称mc(字符型10位)、单价dj(整型)、数量s1(整型)、金额je(长整型)五部分组成。其中:金额=单价×数量。函数ReadDat()的功能是读取这100个销售记录并存入结构数组sell中。请编制函数SortDat(),其功能要求:按产品名称从大到小进行排列,若产品名称相同,则按金额从小到大进行排列,最终排列结果仍存入结构数组sell中,最后调用函数WriteDat()把结果输出到文件OUT2.DAT中。注意:部分源程序已给出。请勿改动主函数main()、读数据函数ReadDat()和输出数据函数WriteDat()的内容。【试题程序】#include<stdio.h>#include<memory.h>#include<string.h>#include<conio.h>#include<stdlib.h>#defineMAX100typedefstruct{chardm[5];/*产品代码*/charmc[11];/*产品名称*/intdj;/*单价*/intsl;/*数量*/longje;/*金额*/}PRO;ROsell[MAXI;voidReadDat();voidWriteDat();voidSortDat(){}voidmain(){memset(sell,0sizeof(sell))ReadDat();SortDat();WriteDat();}voidReadDat({FILE*fp;charstr[80],ch[11];inti;fp=fopen("IN2.DAT","r");for(i=0;i<100;i++){fgets(str,80,fp);memcpy(sell[i].dm,str,4);memcpy(sell[i].mc,str+4,10);memcpy(ch,str+14,4);ch[4]=0;sell[i].dj=atoi(ch);memcpy(ch,str+18,5);ch[5]=0;sell[i].sl=atoi(ch);sell[i].je=(long)sell[i].dj*sell[i].sl;}fclose(fp);}voidWriteDat(void){FILE*fp;inti;fp=fopen("OUT2.DAT","w");for(i=0;i<100;i++)fprintf(fp,"%s%s%4d%5d%101d\n",sell[i].dm,sell[i].mc,sell[i].dj,sell[i].slsell[i].je);fclose(fp);}标准答案:voidSortDat(){inti,j;PROxy;for(i=0;i<MAX-1;i++)for(j=i+l;j<MAX;j++){if(strcmp(sell[i].mc,sell[j].mc)<0)/*按产品名称从大到小进行排列*/{xy=sell[i];sell[i]=sell[j];sell[j]=xy;elseif(strcmp(sell[i].mc,sell[j].mc)==0)/*若产品名称相同*/if(sell[i].je>sell[j].je)/*则按金额从小到大进行排列*/{xy=sell[i];sell[i]=sell[j];sell[j]=xy;}}知识点解析:按产品名称从大到小进行排列,若产品名称相同,则按金额从小到大进行排列,相应语句为:if((strcmp(sell[i].mc,sell[j].mc)<0)‖(strcmp(sell[i].mc,sell[j].mc)==0)&&(sell[i].je>sell[j].je))国家三级(数据库技术)机试模拟试卷第5套一、程序设计题(本题共1题,每题1.0分,共1分。)1、已知在文件IN65.DAT中存有若干个(个数<200)4位数字的正整数,函数ReadDat()是读取这若干个正整数并存入数组xx中。请编制函数CalValue(),其功能要求是:(1)求出这个文件中共有多少个正整数totNum。(2)求出这些数中的各位数字之和是奇数的个数totCnt,以及满足此条件的这些数的算术平均值totPjz。最后调用函数WriteDat()把所有结果输出到文件OUT65.DAT中。注意:部分源程序已给出。请勿改动主函数main()、读函数ReadDat()和写函数WriteDat()的内容。试题程序:#include<stdio.h>#include<conio.h>#defineMAXNUM200intxx[MAXNUM];inttotNum=0;inttotCnt=0;doubletotPjz=0.0;intReadDat(void);voidWriteDat(void);voidCalValue(void){}voidmain(){inti;clrscr();for(i=0;i<MAXNUM;i++)xx[i]=0;if(ReadDat()){printf("数据文件IN65.DAT不能打开!\007\n");return;}CalValue();printf("文件IN65.DAT中共有正整数=%d个\n",totNum);printf("符合条件的正整数的个数=%d个\n",totCnt);printf("平均值=%.21f\n",totPjz);WriteDat();}intReadDat(void){FILE*fp;inti=0;if((fp=fopen("IN65.DAT","r"))==NULL)return1;while(!feof(fp)){fscanf(fp,"%d",&xx[i++]}fclose(fp);return0;}voidWriteDat(void){FILE*fp;fp=fopen("OUT65.DAT","w");fprintf(fp,"%d\n%d\n%.21fkn",totNum,totCnt,totPjz);fclose(fp);}标准答案:voidCalValue(void){inti,thou,hun,ten,data;for(i=0;i<MAXNUM;i++){if{!xx[i])break;if(xx[i]>0)totNum++;/*求正整数的个数*/thou=xx[i]/1000;/*求四位数的千位数字*/hun=xx[i]%1000/100;/*求四位数的百位数字*/ten=xx[i]%100/10;/*求四位数的十位数字*/data=xx[i]%10;/*求四位数的个位数字*/if((thou+hun+ten+data)%2){totCnt++;/*求各位数字之和是奇数的个数*/totPjz+=xx[i];/*求满足条件的数的总和*/}}totPjz/=totCnt;/*求满足条件的数的平均值*/}知识点解析:本题考查的知识点如下;(1)“%”与“/”的使用。(2)数组结束的判断和强行退出一层循环结构。在本题中,并没有给出确切的数据个数,是以数据的最大个数定义的数组。在主函数中,给所有的数组成员赋初值为0,而从文件中读取的数据是正整数,所以只要数组的某个元素为0,则说明数组存的数据已经结束。此时就可以结束循环结构。这里要借助运算符“%”与“/”将4位数的各位上的数拆成独立的数字,然后就可以根据题意要求判断。国家三级(数据库技术)机试模拟试卷第6套一、程序设计题(本题共1题,每题1.0分,共1分。)1、编写函数jsValue,它的功能是:求Hofstadter数列中的第m项H(m)(m<1000),结果由函数返回。其中数列H(n)的定义为:H(1)=H(2)=1H(n)=H(n-H(n-1))+H(n-H(n-2))(n>2)最后调用函数writeDat()读取50个数据m,分别得出结果且把结果输出到文件out.dat中。例如:当t=997时,函数值为605。部分源程序已给出。请勿改动主函数main()和写函数writeDat()的内容。#include<stdio.h>intjsValue(intm){main(){intm;m=300;printf("m=%d,k-%d\n",m,jsValue(m));writeDat();writeDat(){FILE*in,*out;inti,m,s;in=fopen("in.dar","r");out=fopen("out.dar","w");for(i=0;i<50;i++){fscanf(in,"%d",&m);s=jsValue(m);printf("%d\n",s);fprintf(out,"%d\n",s);}fclose(in);fclose(out);标准答案:intjsVelue(intm){if(m<0)return-1;/*参数错误,正常运行不会出现*/if(m==1||m==2)return1;/*初值H[1]:H[2]=1*/elsereturnjsValue(m-jsValue(m-1))+jsValue(m-jsValue(m-2));/*调用jsValue递归计算H[k]*/}/*解法二,递推*/intjsValue(intm){intH[1000],i;H[1]=1;H[2]=1;/*初值H[1]=H[2]=1*/for(i=3;i<=m;i++){H[i]=H[i-H[i-1)]+H[i-H[i-2]];/*H(k)(k<i)的值都己计算完成,直接使用*/}returnH[m];/*返回所求的值*/}知识点解析:类型:序列计算。关键点:分析序列定义,选择合适的方法生成和存储序列或序列中的特定值。此题有两种解法:1.按照定义编写递归函数;(计算量大,容易超时,慎用)。2.保存所有值,从小到大递推求解。国家三级(数据库技术)机试模拟试卷第7套一、程序设计题(本题共1题,每题1.0分,共1分。)1、请编制程序,要求:将文件IN92.DAT中的200个整数读入数组xx中,求出数组xx中最大数max及最大数的个数ont和数组xx中值能被3整除或能被7整除的数的算术平均值pj(保留两位小数),结果max,cnt,pj输出到out92.dar中。部分程序、读函数read_dat(intxx[200])及输出格式已给出。试题程序:#include<conio.h>#include<stdi0.h>#defineN200voidread_dar(intxx[N]){inti,j;FILE*fp;fp=fopen("IN92.DAT","r");for(i=0;i<20;i++){for(j=0;j<10;j++){fscanf(fp,"%d,",&xx[i*10+j]);printf("%d",xx[i*10+j]);}printf("\n");}fclosefp);}voidmain,{inti,k,cnt,xx[N],max;floatpj;FILE*fw;longj=0;clrscr();fw=fopen("out92.dat","w");read_dat(xx);printf("\n\nmax=%d,cnt=%d,pj=%6.2f\n",max,cnt,pjfprintf(fw,"%d\n%d\n%6.2f\n",max,cnt,pj);fclose(fw);printf("\n");}fclosefp);}voidmain,{inti,k,cnt,xx[N],max;floatpj;FILE*fw;longj=0;clrscr();fw=fopen("out92.dat","w");read_dat(xx);printf("\n\nmax=%d,cnt=%d,pj=%6.2f\n",max,cnt,pjfprintf(fw,"%d\n%d\n%6.2f\n",max,cnt,pj);fclose(fw);标准答案:voidmain(){inti,k,cnt,xx[N],max;floatpj;FILE*fw;longj=0;clrscr();fw=fopen("out92.dat","w");read_dat(xx);max=xx[0];for(i=1,k=0;i<N;i++){if(xx[i]>max)max=xx[i];/*求出数组xx中最大数max*/if(xx[i]%3==0||xx[i]%7==0){j+=xx[i];/*求出数组xx中值能被3整除或能被7整除的数的总和*/k++;}}for(i=0,cnt=0;i<N;i++)if(xx[i]==max)cnt++;/*求出数组xx中最大数max的个数*/pj=(float)(j*100/k)/100;/*求出数组xx中值能被3整除或能被7整除的数的平均值*/printf("\n\nmax=%d,cnt=%d,pj=%6.2f\n",max,cnt,pj);fprintf(fw,"%d\n%dkn%6.2fin",max,cnt,pj);fclose(fw);知识点解析:本题考查的知识点如下:(1)运算符“%”的使用。(2)判断结构中多个条件的布尔运算。首先,要找出数组中最大的元素。先定义第1个元素为最大的元素,然后依次和后面的元素比较,若后面的数中有大于第1个元素的,则将这个数定义为最大的元素。再和后面的数进行比较。一个数a除以b取余所得的数为0,则a能被b整除。根据题意可知,被3整除和被7整除两个条件满足一个即可,所以两个条件之间用“或”运算。在本题中,要求算术平均值保留两位小数。使用的方法是:将和乘以100除以个数强制类型转换后再除以100。为了保证和有效,我们定义了一个长整型变量来记录和。因为个数也为整型,运算符“/”在这里的含义是整除,而我们要保留小数,所以要使用强制类型转换将和乘以100的结果转换为浮点类型,这样就可以实现保留两位小数。国家三级(数据库技术)机试模拟试卷第8套一、程序设计题(本题共1题,每题1.0分,共1分。)1、下列程序的功能是:将一正整数序列{K1,K2,…,K91重新排成一个新的序列。新序列中,比K1小的数都在K1的左面(后续的再向左存放),比KI大的数都在K1的右面(后续的再向右存放),从K1向右扫描。要求编写函数JsValue()实现此功能,最后调用函数writeDat()把新序列输出到文件out90.dat中。说明:在程序中已给出了.10个序列,每个序列中有9个正整数,并存入数组a[10][9]中,分别求出这10个新序列。例如:序列排序前{6,8,9,1,2,5,4,7,3}序列排序后{3,4,5,2,1,6,8,9,7}注意:部分源程序已给出。请勿改动主函数main()和写函数writeDat()的内容。试题程序:#includejsValue(inta[lO][9]){}main(){inta[10][9]={{6,8,9,1,2,5,4,7,3},{3,5,8,9,1,2,6,4,7},{8,2,1,9,3,5,4,6,7},{3,5,1,2,9,8,6,7,4},{4,7,8,9,1,2,5,3,6},{4,7,3,5,1,2,6,8,9},{9,1,3,5,8,62,4,7}{2,6,1,9,8,35,7,4}{5,3,7,9,1,82,6,4}{7,1,3,2,5,89,4,6}};inti,j;jsValue(a);for(i=0;i<10;i++){for(j=0;j<9;j++){printf("%d",a[i][j]);if(j<=7)printf(",");}printf("\n");}writeDat(a);}writeDat(intail0][9]){FILE*fp;inti,j;fp=fopen("outg0.dat","w");for(i=0;i<10;i++){for(j=0;j<9;j++){fprintf(fp,"%d",a[i][j]);if(j<=7)fprintf(fp,",");}fprintf(fp,"\n");}fclose(fp);}标准答案:voidjsValue(inta[10][9]){intvalue,i,j,k,hum;for(i=0;i<10;i++){value=a[i][0]);/*将一行的第一个元素赋给value*/for{j=0;j<9;j++)if(a[i][j]<value)/*若后面的数中有比第土个数据小的数*/{num=a[i][j];/*则把这个数取出,赋给num*/for(k=j;k>0;k--)/*将这个数据左侧的数依次向右移动*/{a[i][k]=a[i][k-1];}a[i][0]=num;/*再将这个数放在最左侧*/}}}知识点解析:本题考查的知识点如下:(1)二维数组的访问和数组元素的移动。(2)循环结构和判断结构的嵌套使用。数据存放在一个二维数组中,每一行数为数据处理的基本单位。将第1个数取出依次和后面的数比较,若后面的数中有比第1个数据小的数,则将这个数取出。将这个数据左侧的数依次向右移动(包括第1个数),然后将这个数放在最左侧。扫描完一行后,比第1个数小的数就都在第1个数的左侧,而比它大的就在它的右侧。对数的扫描和移动均可以使用循环实现。再使用循环实现对每一行数据的访问。国家三级(数据库技术)机试模拟试卷第9套一、程序设计题(本题共1题,每题1.0分,共1分。)1、已知在文件IN4.DAT中存有100个产品销售记录,每个产品销售记录由产品代码dm(字符型4位)、产品名称mc(字符型10位)、单价dj(整型)、数量sl(整型)、金额je(长整型)五部分组成。其中:金额=单价×数量。函数ReadDat()的功能是读取这100个销售记录并存入结构数组sell中。请编制函数SortDat(),其功能要求:按产品名称从大到小进行排列,若产品名称相同,则按金额从大到小进行排列,最终排列结果仍存入结构数组sell中,最后调用函数WriteDat()把结果输出到文件OUT4.DAT中。注意:部分源程序已给出。请勿改动主函数main()、读数据函数ReadDat()和输出数据函数WriteDat(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论