计算机三级数据库上机题库

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

计算机三级数据库上机题库1.调用函数rwdata(),从IN.dat文件中读取10组数据(m和k值),并嵌套调用primenum函数分别得出array[]数组。请编写函数primenum(intm,intk,intarray[]),该函数的功能是:将紧靠m的k个素数存入数组array并在屏幕上显示。最后把结果输出到文件OUT.dat中。例如,若输入39,则应输出5711131719232931。注意:部分程序已经给出。请勿改动主函数main()和输出数据函数rwdata()的内容。#includeconio.h#includestdio.hvoidrwdata();voidprimenum(intm,intk,intarray[]){}main(){intm,n,array[1000];printf(\nPleaseentertwointegers:);scanf(%d%d,&m,&n);primenum(m,n,array);for(m=0;mn;m++)printf(%d,array[m]);printf(\n);rwdata();}voidrwdata(){intm,n,array[1000],i;FILE*readfile,*writefile;readfile=fopen(in.dat,r);writefile=fopen(out.dat,w);for(i=0;i10;i++){fscanf(readfile,%d%d,&m,&n);primenum(m,n,array);for(m=0;mn;m++)fprintf(writefile,%d,array[m]);fprintf(writefile,\n);}fclose(readfile);fclose(writefile);}【知识点播】素数的定义:如果一个数的正因子只有1和这个数本身,那么这个数就是素数。【题目分析】分析题目可知,题中需要解决的问题就是Primenum函数的功能问题(rwdata函数功能题中已经给出),而Primenum函数的功能是求在指定数m之后的k个素数,因此本题的关键在于如何判断一个数是素数,之后就可以通过一个for循环来求得在m之后的k个素数了。【解题思路】根据素数的定义,本题采用的算法是:首先定义一个变量Value,并把m之后的数逐个赋值给该变量;然后用2~value/2数除value,如果value能被2~value/2之中的任何一个整数整除,则value不是素数,结束循环;如果value不能被2~value/2之间的任一整数整除,则退出循环,然后判断循环变量i是否大于value/2,如果大于,则value是素数,并将value值赋给array[n],然后n++;再判断n是否大于等于k,如果大于等于k,就完成了程序要求的功能,退出循环,否则value加1,根据以上算法继续进行。【答案】voidprimenum(intm,intk,intarray[]){intvalue=m+1;inthalf,n=0,i;while(1){half=value/2;for(i=2;i=half;i++)if(value%i==0)break;if(ihalf){array[n]=value;n++;}if(n=k)break;value++;}}【容错分析】判断一个数m(大于1)是否素数的简单的算法:枚举2到m/2之间的整数,看能否被m整除,如果能整除,就不是素数,否则是素数。2.在文件IN.dat中有200个正整数,且每个数均在1000~9999之间。函数RData()读取这200个数存放到数组original中。请编写函数numAscend(),其功能是:要求按每个数的后3位的大小进行升序排列,然后取出满足此条件的前10个数依次存入数组result中,如果后3位的数值相等,则按原先的数值进行降序排列。最后调用函数WData(),把结果result输出到文件OUT.dat中。例如,处理前:60125099901270258088处理后:90126012702580885099注意:部分程序已给出。请勿改动主函数main()、读数据函数RData()和输出数据函数WData()的内容。#includestdio.h#includestring.h#includeconio.hintoriginal[200],result[10];voidnumascend(){}voidRData(){FILE*in;inti;in=fopen(IN.dat,r);for(i=0;i200;i++)fscanf(in,%d,,&original[i]);fclose(in);}voidWData(){FILE*out;inti;out=fopen(OUT.dat,w);for(i=0;i10;i++){printf(%d,result[i]);fprintf(out,%d\n,result[i]);}fclose(out);}voidmain(){RData();numascend();WData();}【题目分析】首先我们来看看题中要求我们解决的问题有哪些。①按original数组中各元素数字的后3位数的大小进行升序排列,如果数值相等,则按原先的数值进行降序排列;②取出排序后的original数组中的前10个数依次存入result数组中。【解题思路】根据上面的分析,编写程序有以下几个步骤:第1步:首先分解出数组中两个元素的后三位,这里采用在两次循环中求出正整数original[i]和original[j]对1000的余数的方法;第2步:然后比较两个数余数的大小,如果正整数original[i]和original[j]对1000的余数不相同,则按照升序进行排序,如果相同,则比较original[i]和original[j]的大小,按照降序进行排序;第3步:利用一个for循环语句把original数组中的前10个数输出给result数组。【答案】voidnumascend(){inti,j,data;for(i=0;i199;i++)for(j=i+1;j200;j++){if(original[i]%1000original[j]%1000){data=original[i];original[i]=original[j];original[j]=data;}elseif(original[i]%1000==original[j]%1000){if(original[i]original[j]){data=original[i];original[i]=original[j];original[j]=data;}}}for(i=0;i10;i++)result[i]=original[i];}容错分析:数组original[i]中两个数的位置交换要借助中间变量data。3.已知文件IN.dat中存有100个产品销售记录,每个产品销售记录由产品代码code(字符型4位)、产品名称name(字符型10位)、单价uprice(整型)、数量amount(整型)、金额sum(长整型)5部分组成。其中:金额=单价×数量。函数RData()读取这100个销售记录并存入结构数组sell中。请编写函数DescSort(),其功能要求:按产品代码从大到小进行排列,若产品代码相同,则按金额从大到小进行排列,最终排列结果仍存入结构数组sell中,最后调用函数WData(),把结果输出到文件OUT.dat中。注意:部分程序已给出。请勿改动主函数main()、读数据函数RData()和输出数据函数WData()的内容。#includestdio.h#includestring.h#includeconio.h#includestdlib.h#defineMAX100typedefstruct{charcode[5];/*产品代码*/charname[11];/*产品名称*/intuprice;/*单价*/intamount;/*数量*/longsum;/*金额*/}PRO;PROsell[MAX];voidRData();voidWData();voidDescSort(){}voidmain(){memset(sell,0,sizeof(sell));RData();DescSort();WData();}voidRData(){FILE*fp;charstr[80],ch[11];inti;fp=fopen(IN.dat,r);for(i=0;i100;i++){fgets(str,80,fp);memcpy(sell[i].code,str,4);memcpy(sell[i].name,str+4,10);memcpy(ch,str+14,4);ch[4]=0;sell[i].uprice=atoi(ch);memcpy(ch,str+18,5);ch[5]=0;sell[i].amount=atoi(ch);sell[i].sum=(long)sell[i].uprice*sell[i].amount;}fclose(fp);}voidWData(void){FILE*fp;inti;fp=fopen(OUT.dat,w);for(i=0;i100;i++){printf(%s%s%4d%5d%5d\n,sell[i].code,sell[i].name,sell[i].uprice,sell[i].amount,sell[i].sum);fprintf(fp,%s%s%4d%5d%5d\n,sell[i].code,sell[i].name,sell[i].uprice,sell[i].amount,sell[i].sum);}fclose(fp);}【题目分析】首先我们来看看题中要求我们解决的问题有哪些。①按产品代码从大到小进行排列,若产品代码相同,则按金额从大到小进行排列;②将排列结果存入结构数组sell中。分析题目可知,本题中使用结构数组sell来保存销售记录。产品代码存储在sell结构数组中的code成员中,金额存储在sum成员中。【解题思路】我们可以利用两个for循环结构对产品销售记录(strcmp(sell[i].code,sell[j].code))两两进行循环比较,如果这个表达式返回结果值小于0,则进行两个数据的交换,实现产品代码从大到小进行排序。如果上面的表达式的返回值等于0,说明这两个产品的代码相同,则比较sell[i].sum与sell[j].sum的值。如果sell[i].sumsell[j].sum,则进行两个数据的交换,实现金额从大到小进行排序。【答案】voidDescSort(){inti,j;PROtemp;for(i=0;i99;i++)for(j=i+1;j100;j++)if(strcmp(sell[i].code,sell[j].code)0){temp=sell[i];sell[i]=sell[j];sell[j]=temp;}elseif(strcmp(sell[i].code,sell[j].code)==0){if(sell[i].sumsell[j].sum){temp=sell[i];sell[i]=sell[j];sell[j]=temp;}}}容错分析:数组sell[i]中两个数的位置交换要借助中间变量temp。4.函数RData()实现从文件IN.dat中读取一篇英文文章,存入到字符串数组str中;请编写encryptChar()函数,其功能是:按给定的替代关系对数组str中的所有字符进行替代,仍存入数组str对应的位置上,最后调用函数WData(),把结果str输出到文件OUT.dat中。替代关系:f(p)=p*11mod256(p是数组中某一个字符的ASCII值,f(p)是计算后新字符的ASCII值),如果计算后f(p)值小于1等

1 / 194
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功