计算机三级数据库上机题库(资料)_第1页
计算机三级数据库上机题库(资料)_第2页
计算机三级数据库上机题库(资料)_第3页
计算机三级数据库上机题库(资料)_第4页
计算机三级数据库上机题库(资料)_第5页
已阅读5页,还剩330页未读 继续免费阅读

下载本文档

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

文档简介

1.调rwdata(),IN.dat10(mk值),primenum函arrayuprimenum(intm,intk,intarray[]),该函数的功能是:mk个素数存array并在屏幕上显示。OUT.dat中。39,则5711131719232931注意:部分程序己经给出。请勿改动主函数maino和输出数据函数rwdata()的#include<conio.h>#include<stdio.h>voidrwdata();voidprimenum(intm,intk,int m,n,printff'\nPleaseentertwointegers:”);scanf("%d%d",&m,&n);primenum(m,n,array);for(m=0;m<n;printf("%dprin氓void m,n,array[1000], *readfile,*writefile;readfile=fbpen("in.dat",T);writefile=fbpen("out.dat",”w”);for(i=0;i<10;i++) fscanf(readfile,n%d%d",&m,primenum(m,n,for(m=0;m<n;m-H-fprintf(writefile,【知识点播】素数的定义如果一个数的正因1和这个数【题目分析】分析题目可知,题中需要解决的问题就是Primenum函能问题(rwdata函数功能题中己经给出),而Primenum的功能是求在指定数m之后的k个素因此本题的关键在于如何判断一个数是之后就可以通过一个for循环来求得在m之后的k个素数了。【解题思路】根据素数的定义,本题采用的算法是:首先定义一个变量Value,并把m之后的2~value/2value,value2value/2之中的任何一个整数整除,value不是素数,结束循环;value2value/2之间的数整除,则退出循环,然后判断循ivalue/2,如果大于,则value是并将value值赋给array[n],然 再判断n是否大于等于k,如果大于等于k,就完了程序要求的功能,退出循环,value加1,根据以上算法继续voidprimenum(intm,intk,int{intvalue=m+1;inthalf,n=0,i;{half=if(value%i= if(n>=看能否被m整除,如果能整除,就不是素数,否则是在文件IN.dat中有200个正整数,且每个数均在1000-9999之间函数RData()读取这200个数存放到数组original中。请编写函数 其功能是:要求按每个数的后3位的大小进行升序排列,然后取出满足此条件的前10个数依次存入数组result中,如果后3位的数值相等,则按原先的数值进行降序排列。最后调用函数WData(),把结果result输出到文件OUT.dat中。处理后:9012601270258088 读数据函数RData()和输出数据函数#include<stdio.h>#include<string.h>#include original[200],void for(i=0;i<200; out=fopen(”OUT.dat”,for(i=0;i<10; printf(n%dn,void 【题目分析】首先我们来看看题中要求我们解决的问题有哪些。riginal数组中各元素数3大小进如果数值相等,则按原先的数值进行降序排列排original10result【解题思路】根据上面的第1步首先分解出数组中两个元素的后这里采用在两次循环中求出正整数original[j]^1000的2后比较两个数余数的大小,如果正整数original]和original[j]对1000的余数不相同,则按照升序进行排序,如果相同,则比较original^]和original!j]的大小,按照降序进3步:利for循环语句把original10个数result i,j,for(i=0;i<l99; if(original[i]%1000> data=original[i];original[i]=originalfj];original]]=data;elseif(original[i]%1000== if(original[i]< original[i]=original[j];original[j]=data;for(i=0;i<10;容错分析:数组originalb中两个数的位置交换要借助中IN.dat100个产品销售每个产品销售记录由产code((长整型)5部分组成。其中:金额=单价X数量。函数读取这100个销售记录并存入结构数组sell中。请编写函数 若产品代码相同,则按金额从大到小进行排列,最终排列结果仍存入结构数组sell中,最后调用函数WDataQ,把结果输出到文件OUT.dat中。部分程序己给出。请勿改动主函数读数据函数#include<stdio.h>#include<string.h>#include#include<stdlib.h>#defineMAX100typedefstruct /*产品代码 name[l /*产品名称 /* /*数量 /*金额}PROvoidRData();voidWData();voidvoid memset(sell,0,sizeoRsell));void str[80],ch[l ip=fbpen(”IN.dat”,for(i=0;i<100; fgets(str,80,memcpy(sell[i].code,str,memcpy(sell[i].name,str+4,memcpy(ch,str+14,ch[4]=memcpy(ch,str+18,ch[5]=sell[i].amount=sell[i].sum=(long)sell[i].uprice*void fp=fbpen(,,OUT.dat,\for(i=0;i<100; %s%4d%5dsell[i].code,sell[i].name,sell[i].uprice,sell[i].amount,iprintf(ip,M%s%s%4dsell[i].code,sell[i].name,sell[i].uprice,sell[i].amount,}要求我们解决的问题有哪些。①按产品代码排列,若产品代码相同,则按金额从大到小进行排列 列结果存入结构数组sell中分析题目可知,sell来保存销售记录。产品代码sell结构code成员中,金额存储在sum成员中。【解题我们可以利用两个for循环结构对产品销售记录(strcmp(sell[i],code,sell[j].code))两两进行循环比较,如果这个表达式返回结果值小于0,0,说明这两个产品的代码相同,sell[i].sumsell[j].sumsell[i].sumvsellUl.sum,则进行两个数据的交换,实现金额从大到小进行排序。void for(i=0;i<99;if(strcmp(sell[i].code,sell[j].code)<temp=sell[i];sell[i]=sell[j];sell[j]=temp;elseif(strcmp(sell[i].code,sell[j].code)==if(sell[i].sum<temp=sell[i];sell[i]=sell[j];sell[j]=temp;函数RData()实现从文件IN.dat中读取一篇英文文章,存入到字符串数组和中;请编写encryptChar()函数,其功能是:按给定的替代关系对数组str中的所有字符进行替代,仍存入数组str对应的位置上,WData(),str输出OUT.dat中。替代关系:f(p)=p*Hmod256(p是数组中某一个ASCII值,flp)是计算后新ASCII值),如果f(p)132130,则该字符不变,f(p)应的字符进行原始数据文件存放的格式是:每行的宽度均小于80注意部分程序己给出。请勿改动主函 读数据函数RData()和输出数据函数#include<stdio.h>#include<string.h>#include#include<ctype.h>unsignedchar maxline0;/*文章的总行数intRData(void);voidWData(void);voidvoid printf(”数据文件IN.datint i= if((fp=fopen('TN.dat",T))==returnwhile(fgets(str[i],80,fp)!= p=strchr(str[i],*\n*);returnvoid fbr(i=0;i<maxline; printf(n%s\n'\fprintf(fp,,,%s\n\【题目分析】分析题目可知,题中需要解决的问题就是实现encryptChar函数而encryptChar函数的功能是:实现"按照指定的替代关系将数组str中的所有字符进行替代,替代后仍存入数组str的对应位置上”。因此本题的关键在于用什么样的C程序语言实现指【解题思路】首先通过fbr循环对数组st巾]中的每一个英文字符按照题目*pf*ll%256计算出其对应的ASCHASCII13032进行13032,ASCII for(i=0;i<maxline; while(*pf!= if(*pfHl%256V=130&&*pPM容错分析:题目中的条件是:f(p)值小32130,则该字符不变。程序中这个条件写成:*pf*ll%256<=130&&RData()IN.dat中读取一篇英文文str中,请编写函数DescSort(),其功能是:以行为单位对字符按从大到小的顺序进行排序,排序后的结果仍按行重新存入字符strWData(),strOUT.dat中。原始数据文件存放的格式是:每行的宽度80号和空格)。例如,注意部分程序已给出。请勿改动主函 读数据函数RData()和输出数据函数的#include<stdio.h>#include<string.h>#include<conio.h> maxline0;/*文章的总行数intRData(void);voidWData(void);voidvoid printf(”数据文件IN.dat不能int i= if((fp=fopen(”IN.dat"JT))==returnwhile(fgets(str[i],80,fp)!= *p=maxline=i;return0;void fp=fopen(,,OUT.datn,for(i=0;i<maxline; printf(M%s\nM,【题目分析】分析题目题中需要问题就是实现DescSort函数的功能问题,而DescSort函数的功能是:以行为单位对字符按从大到小的顺序进行排序后的结果仍按行重新存串数组str因此本题的关键在于如何判断将字符串单独的之后个三重循环来将所有字符逐个比较字母的并存入数组str首先利用三重循第一层循环将字符读入数组strl然后层的二重循环对文章中每一行的字符进行两两比较,较小的字符往行后放,较大的字符往行前放,这样就实现了以行为单位对字符从大在程序中的语句是if(str[i]Lj]<str[i][k])成str[i][j]和str[i][k]就交换数据。void i,j,k, fbr(i=0;i<maxline; strl=for(j=O;j<strl-fbr(k=j+l;k<strl; str[i][j]=str[i][k]=j0到strl-l,kj+16函数RData()实现从文件lN.dat中读取一篇英文文章存入字符串数组original中,请编写StrCharMove()函数,其功能是:以行为单位把字符串中所有字符的ASCII值右移4位,然后把右移后的字符ASCII值再加上原字符的ASCII值,得到新的字符仍存入原字符串对应的位置上。最后把已处理的字符串仍按行重新存入字符串数组original中。最后调用函数WData(),originalOUT.dat中。原始数据文件存放的格80(含注意部分程序己给出。请勿改动主函数main()读数据函数RData()和输出数据函数#include<stdio.h>#include<string.h>#include intmaxline0;/*文章的总行数intvoidvoid int i= if((fp=fopen(”IN.dat",T))==returnwhile(fgets(original[i],80,fp)!= p=strchr(original[i],return0;void ip=fbr(i=0;i<maxline; fprintf(fp,,,%s\n\【知识点播】ASCH码值的右移运算可以通过(»)来实现,左移运【题目分析】分析题目可知,题中需要解决的问题是实现StrCharMove函数而StrCharMove函数的功以行为单位把字符串中所有字符的ASCII值右移4位,然后把的字符ASCII值再加上原字符的ASCII值,的字符仍存入原字符串对应的位最后把已处理的字符串仍按行重新存入字符串数组original因的关键在于如何进行ASCII值运算。【解题思路】首先用字符strlen求出每行的长度,fbr循环语句中将每个字符将得到的ASCII码值转换成字符并存original中。void i,j,for(i=0;i<maxline;strl=for(j=0;j<strl;original[i][j]+=ASCII码值右移4位,再和原值相加,用语句original[i][j]编findStr(),其功能是:统计一个2的子字符串在另一个字符串中出现的次数。例如,假定输入的字符串为”asdasasdfgasdaszx67asdmklo",子字符串为”as”,函数返回6。函数ReadWriteo实现从文件IN.dat中读取两个字符串,并调用函数findStr。,输出到文件OUT.dat部分程序己经给出。请勿改动主函数maino和其他函数中的任何内容,仅在函数的花括号中填入编写的若干#include<stdio.h>#include<string.h>#includeintfindStr(char*str,charvoid str[81],substr[10], n,len,i= *rf,rf=ft)pen("IN.dat”,wf=fopen(,,OUT.datM,while(i< fgets(str,fgets(substr,10,len=strlen(substr)-if(ch='\n‘||substr[len]=n=findStr(str,fprintfifwf,H%d\nu, charstr[81],substr[lintn=findStr(str,printf("n=%d\n",目可知,题中需要解决的问题就是实现findStrfindStr函数的功能是:统计满足"一个长度为2的子字符串在另一个字符串"条件的字符串出现的次数。因此本题的关键在于如何判断一个字符串在另外一个字符串中。【解题思路】pr分别指向while循环中比较*r*p的值,如果两者的值相等,rp1;如果两者不相等,则对*r的值进行如果*r的值等于则说明在字符串*str中找到了一个与*substr相匹配的字符串,n1。然后str1,进入下一个寻找与子字符相匹配循环,直while(*str)循环,返回n值就是与子字符串相匹配字符串的个数。intfindStr(char*str,char *p,n=while P=r=whileif(*r= return容错分析:字符串的最后一个字符是null,所以当字符串指针str和r达到字符while有自然数之和的平方根s,progRcadWrite从Ndat文件中读取10组数据,分别得出OUT.datn1000时,注意部分程序己经给出。请勿改动main()progReadWriteo#include<conio.h>#include<math.h>#include<stdio.h>doubleCountValue(intn)void *fp, i, if(fp==NULL) wf=fbpen("out.dat",fbr(i=0;i<10; s=(float)countValue(n);fprintf(wf,H%f\nn,s); printf("1000以内符合条件的自然数之和的平方根=%1\11",(:01111/仙 n以内所有能被和7整除的整数 这些整数相加求它们的和;对这个和求平方根【解题思路】这里我们forn37整除的整数这些数求和;然后把和转化为双精度型数据,利用开平方函数sqrt()求出这个和数的平doublecountValue(int xy= fbr(i=l;i<n;if(i%3==0&&xy+=return37整除的整数的条件为:i%3==0&&i%7==0;在求和的平方根首先要把和9IN.datN(N<200)实数,RData()N个实数并存originalCalValue,要求实现的功能有:N个实数的平均值 N个实数的整数部(sumint)以及小数部最后调用函数WData()把所求的结果输出到文件OUT.dat注意:部分源程序己给出。请勿改动主函数main。、读数据函数RData()和输出数据函数#include<stdio.h>#include<conio.h> MAXNUM200 aver=0.0; sumint=0; sumdec=0.0;intRData(void);void for(i=0;ivMAXNUM;if printf(”数IN.datprintff平均值=%.21f\n",printff小数部分之和=%.2If\n”,sumdec);int i=if((fp=fopen(,,IN.datH,HrM))==returnwhilereturnvoid fp=fopen(,,OUT.datn,【题目分析】分析题目可知,CalValue函数2个功能N个实数的平(aver);N个实数的整数部分之和(sumint)以及小数部分之和(sumdec)。这里我们可以利用for循环语句对数组origina口中的每一个实数逐个进行处理。对于每一个实数originalu],在其数据前面加上(int)就得到这个实数的整数部分用original[i]减去(int)original[i]就得到这个实数的小数部分。然后分别求出MAXNUM个实数的和(sum)分的和(sumint)、小数部分的和(sumdec)最后用sum除以MAXNUM就得到平均值(aver)。void for(i=0;ivMAXNUM; sumint=sumint+(int)original[i];x=original[i]-(int)original[i];sumdec=sumdec+x;sum=容错分析实数分成整数部分和小数部分,在实数前面加上(int)就实数减去整数部分就得到小数IN.dat300个四位数,并已调用RdataOaprimeNum(),其功能是:求出所count,再把所有满足此条件的四位数依次存b中,然后b的四位数按从小到大的顺序进行排序。最后调用写函数Wdata(),把结果输出到OUT.dat文件中。例如,5591素数,则该数满足条件存b中,count=count+l。9812则该数不满足条件,b中,count值1注意部分源程序已经给出。程序中己定a[300]、b[300],已定义变量count。#include intisP(int for(i=2;i<m;i-H-if(m%i=returnreturnvoidprimeNum for(i=0;i<300;void fp=fbr(i=0;i<count;i-H-main for(i=0;i<count;i++)printf("b[%d]=%d\n",i,b[i]);【题目分析】分析题目可知,本题只要实现primeNum()函数的功能即可。primeNum()要实现的功能是:求出所有这些四位数是素数的个数count,再把所有满足此条件的四位数依次存入数组b对数组b因此解答本题的关键在【解题思路】用for循环对300个整数调用子函数isP(a[i])进行判断其是否是素数,如果是素数,则把a[i]赋b,同时计count1。最后利用双b中的元素void{intj,i,for(i=0;i<300;i++) for(i=0;i<count-l;for(j=i+l;j<count;j-H- fori+1开始直到count序的功能是:把S字符串中的所有字符左移一个位置,字符串中的第一个字符移到最后。请编写函数change(char*s实现程序要求,最后调用函数readwriteDAT从IN.dat文中读取50组分且把结果输出到OUT.dat文件中。例如,s字符串中原有内容为:Mn.l23xyZ,调用该函注意:部分源程序己经给出。请勿改动主函数main和输出数据函数readwriteDAT()#include<string.h>#include<stdio.h> N81voidvoid printff'Enterastringprintff'Theoriginalstringis:printff'Thestringaftermodified:");void *rf,rf=fbpen(,,IN.datn,wf=for(i=0;i<50; 用rintRwf,”%s\n”,【题目分析】分析题目可知,本题只要实现change(char*s要实能是把s字符的所有字符左移一个中的第符移到因此解的关键在于如何将字符串拆分成单个字符并赋值给数组,并组的下标将字符逐一位。【解题思路】首先用字符串函数strlen求出字符串s的长度,赋strl;首字符赋给字符变量chfor循环语句中,i0递增到strLl,字符串s中的所有字符左移一个位置;最后把字符变量ch的值赋给*(s+strl-l),即完成了题目要求的void i, ch=for(i=0;i<strl-l;*(s+i)=容错分析:在字符串左移时要首先把首100以内)count以i之和sumprimeNum(实现程序要求的功能,writeDat(),countsum输出到文件OUT.dat中。#include count,intisPrime(int i,tag=for(i=2;tag&&i<=number/2;i-H-if(number%i=tag=returnvoidvoid fp=fbpen(,,OUT.dat,\void count=sum=printf("满足条件的整数的个数=%d\n",【题目分析】分析题目可知,本题只要实现primeNum(函数即可。primeNum()要实现的功能是找出所有100以内(含100)满足ii+4i+10都的整数i(i+10也在100以内)的个数count以及这些i之和sum因此解答本题的关键在于”i、i+4、i+10都是素数"条件转换成C语言表达式。【解题思路】fbr循环语句中i290,isPrime(),用来判断i、i+4、i+103数是否成立,如果成立,count1i加到sum上,求得这些i的和。voidprimeNum intif(isPrime(i)&&isPrime(i+4)&& i+10100以内,所以i290一个字母,如果a,则改写成字母z。大写字母仍为大写字母,小写字母仍为小写字母,其他字符不变,最后把已处理的字符串仍按行重新存入字符串数组string中。最后调用Wdata(),string输出到文件OUT.dat中。Wdata()的#include<stdio.h>#include<string.h>#include<conio.h> /*文章的总行数intvoidvoidvoid int i= if((fp=fopen(”IN.dat"JT))==returnwhile(fgets(string[i],80,fp)!= p=strchr(string[i],returnvoid fbr(i=0;i<maxline; printf(n%s\n'\fprintf(fp,"%s\n",【题目目本题只要实现ConvertCharDConvertCharD要实现的功能是以行为单位把中的所有小写字母改写成该字母的上一个如果是字母a,则改写成字母z。大写字母仍为大写字母,小写字母仍为小写字母,其他字符不变。最后把己处理的字符串仍按行重新存入字符串数组string如何实现字【解题思路】for循环语中当自0maxline时,就完成了对一篇文章中每一a,就用字符zb,而z的ASCII码值,就对其ASCII码值减1。【知识拓展】字符间的转换可ASCH值来ASCH值比上ASCII【答void for(i=0;i<maxline; pf=while *pf=elseif(*pf>='b'&&*pf-=容错分析:判断字符的范围是否b而小于等于字符Z;对a,行7或11整除的所有整数,将它们放在数组an返回这些数的个数。主函调Wdata()OUT.dat注意:部分源程序已经main()Wdata()的#include#includevoidcountValue(int*a,int intFILE巾fbpenC^ut.daf,countValue(aa,for(k=0;k<n;k-H-if((k+l)%10==fprintf(fp, aa[1000],n,k;countValue(aa,&n);for(k=0;k<n;k-H-)if((k+l)%10=printf(^^%5d\n^^,【题目分析】分析题目可知,本题只要实现countValue()函数的功能即可。count 将它们放在数组a中并通过n返回这些数的个数。因此解答本题的关键在于如何将一个指定的关系转换为C语言表达式。i%7=0&&i%lli%7&&i%ll==0的逻辑判断,如果其中一个表达式成立,则把数字i输an1,数组指针a向后移动一位。voidcountValue(int*a,int int*n=if(i%7=0&& *a= *a=*n=711711整除的整数的条或i%7&&i%ll==0,其一定成立已知数据文件IN.dat中存有300个四位数,并已调用读函数Rdata()把这些数存入数组a中,请编写函数primeCal(),其功能是:求出这些四位数中素数的个数count,再求出所有满足此条件的四位数的平均值Avel以及不满足此条件的四位数的平均值最后调用写函数Wdata(),把结果 Ave2输出到OUT.dat文件中。例如,5591是素数,则该数满足条件计算Avel,count=count+l。9812素数,则该数不满足条件计算注意:部分源程序己经给出。程序中己定义数组a[300],己定请勿改动主函 读函数Rdata()和写函数Wdata()的内容 Avel=0.0,Ave2=intisP(int if(m%i==returnreturnvoid fp=for(i=0;i<300; void 巾 fprintf(fp,H%d\n%7.2f\n%7.2f\nn,count,Avel, printf(ncount=%d\nAvel=%7.2f\nAve2=%7.2f\n",count,Avel,【题目分析】分析题目可知,本题只要实现PrimeCal函数的功能即可。PrimeCalo要实现这些四位数中是素数的个数count,再求出所有满足此值Avel以及不满足此条件的四位数的平均值因此解答本题的关键在于如何判断一素数。for循环语句中当1299时,对数组a中的每一a[i]调否则把a[i]Ave2上。当退出循环时,Avel除以count就得到所有满足此条件数的平均值,用Ave2除以300-count就得到所有不满足此条件的四位void for(i=0;i<300; Avel=容错分析:退出for循环时,变量Avel的值是所有满足条件的四位数的和;变量Ave2的值下列程序的功能是:寻找并输出11999之间的数m,它满足 m2和m3均为回文数。所谓回文数是指各位数字左右对称的整数,例如121、676、94249等。满足上述条件的数如m=l1,m2=121,m3=1331皆为回文数。请编写函数intpalindromevalue(longn)实现功能:如果是回文数,则函数返回1,反之则返回0。最后,把结果输出到文件OUT.dat中。注意:部分源程序已给出。请main()的#include<stdio.h>#include<stdlib.h>#includeintpalindromevalue(long out for(m=ll;m<1000;if(palindromevalue(m)&&palindromevalue(m*m)&& printR"m=%41d,m*m=%61d,m*m*m=%8ki\n",m,m*m,m*m*m);fprintf(out,nm=%41d,m*m=%61d,m*m*m=%81d\nu,m,m*m,m*m*m);【题目分析】分析题目可知,本题只要实现palindromevalue函数的功能即可。palindromevakie要实现的功能是:寻找并输出11至999之间的数m,它满 m2和均为回文数。因此解答本题的关键在于如何判断m是【解题判断数字是否为回要对比该数字的对立的数是否相等这里我把要判断是否是回文数的数字通过Itoa将其拆分成单个并存入到一个字符数组中,然后从字符数组的开始位置时向其中间位置逐个字符的进行比较如果首尾位置的两个字符不则退出说明这个数不是回如果比较中间位置时都则说明这个数字是回文数。intpalindromevalue(long{inti,strl,half;chartemp[20];ltoa(n,temp,for(i=0;i<half;if(i>=return容错分析:字符串尾部指针的自减为-str,17请补充程序,使得程序能实IN.dat200numbercntl和偶数的个数以及数组number下标为偶数的元素值的算术平均值ave2位小数)。ave输出到OUT.dat注意:部分程序、读数据函数read_dat(intnumber[200])#include<conio.h>#include<stdio.h>#defineN200voidread_dat(int fp=fbpen(nIN.datn,fbr(i=0;i<20; cntl,cnt2, j= fw=fopen(,'OUT.datM,【题目分析】分析题目可知,本题程序要实现的功能是从文件IN.dat200个整数至number中,求出奇数cntl和偶数cnt2以number下标为偶数的元素值的算术平均值ave(保留2位小数),而读取数据的程序题中己经给出。因此只要编写求出数组中奇数的个数和偶数的个数,以及下标为偶数的所有元素的平均值即可。【解题思路】在fbr循环语句中,对数组number中的每一个元素21,numberw是奇数,奇数的个数变量cntl1,否则偶数的个数变量cnt21。number下i2numbcr[i]j相加。退j的值除以(N/2)得number下标为偶数的元素值的算术平均值,成单精度实数赋for(i=0,j=0,ent1=0,cnt2=0;i<N; ifif(i%2=j+=容错分析:在进行求算术平均值的时候,要把函数Rdata()实现从文件IN.dat中读取一篇英文存入到字符串数组string请编写函数CharRight(),其功以行为单位把字符串中的最后一个字符的ASCII值右移4位后加倒数第二个字符的ASCII值,得到最后一个新的字符;倒数第二个字符的ASCII值右移4位后加倒数第三个字符的ASCII值,得到倒个新的字符;依此一直处理到第二个第一个字符的ASCH值加原最后一个字符的ASCH得到第一个新的得别存放在原字符串对应的位最后己处理的字符串仍按行重新存串数组string中。最后调用函数Wdata(),把结果string输出到文件OUT.dat中。原始数据文件存放的格式是:每行的宽度均小于80个字符(含标点符号和空注意:部分源程序己经给出。请勿改动主函 读函数Rdata()和写函数Wdata()的#include<string.h>#include<conio.h> /*文章的总行数intvoidvoid int if((fp=fopen(”IN.dat”,T))==return returnvoid fpfor(i=0;i<maxline; 实现的功能是:按"将字符的ASCII值右移4位并加上该字符前面的一个字符的ASCII值等到新的字符,然后存在原位"的替代关系,将字符串数组string中的字符全部替换。因此解答本题的关键在于读取字符串数组中的字符,然后转换成ASCII码值,最后进行替换运算【解题这里我们通过for循环语句来实现读取字符串的所有当自变量i从0递增到maxline就完成了对一篇文章每一行的对一行的字符串首先利串函数strlen求出字符串数组string[i的长度输给变量strl,把字的最后一个字符赋给然后在for循环语自变量j从strl-l递减到0对每一个字符的ASCII值右移4位,右移4位的字符与其前一个字符相加,两者的和仍然存入字string[i][j]中;最后替换第一个字符ASCIIch相加,得到第一个新的void i,j, for(i=0;i<maxline; strl=strlen(string[i]);ch=string[i][strl-l];for(j=strl-l;j>O;j-) string[i皿string[i][j]+=string[i][j-string[i][0]+=ASCII4位,用表达式string[i皿》=4已知数据文件IN.dat中存有200个四位数,并已调用读函数rdata()把这些数存入数组a 其功能是:如果四位数每位上的数字均是0、2、4、6或8,则统计出满足此条件的四位数的个数count,并把这些四位数按从大到小的顺序存入数组b中。最后maino函数调用写函数wdata(),把结果count以及数组b中符合条件的四位数输至lJOUT.dat 己定义变量请勿改数IN.dat中的任何数据及主函数rdata()和wdata() MAX a[MAX],b[MAX],count=voidvoid fp for(i=0;ivMAX; "%dj, fpfor(i=0;i<count;Srintfg"%d\n”,void printf(”满足条件的数=%d\n”,fbr(i=0;i<count;i-H-【题目分析题目题中需要问题就是实现evenvalue函数的功能而evenvalue函数的功能是:统计满足"四位数每位上的数字均是0246或8的数字个数count,并四位数按从大到小的顺序存入数组b因此本题的关键在于如何判的每位数都满足条件,之后就可以通过一个for循环来对这200个数逐个判断。【解题思路】解答本题可分为以下4个1步:分解出这个四位数的每位数字。a[i]1000a[i]的千位上的数字,bb[O](这里要定义一个数组a[i]1000求余数100a[i]百位上的数字存入用a[i]10010得到a[i]十位上的数字存入用a[i]10求余得到a[i]的个位上的数字,然bb[3],这bb[4]就a[i]的每位上2步:判断每位数字是否为"02468"。这bb[4]中2求余,如果每个元素的0,02468,flag1这里要定义一Hag),flag0。3步:将符合条件的数存入数组b[count]中。这里只要对flag进行判断即可,即如果flag的值为1,则说明a[i]各位上的数字均是0或2或4或68。把a[i]的值赋给数组b[count],变量count1。在for语句执行完成后,就200个四位数中所有符4步:执行for语句b的各元素进行从大到小void i,j,k,for(i=0;i<200; bb[0]=a[i]/1000;bb[l]=a[i]%1000/100;bb[2]=a[i]%100/10;bb[3]=a[i]%10; j<4; if(bb[j]%2= Aag= flag=if(flag= b[count]=for(i=0;i<count-l;for(j=i+l;jvcount;j-H- k=b[i];b[i]=本题主要考点:求余运算、fbr循环语句、函数RData()实现从文件IN.dat中读取一篇英文文章存StrResult请编写Strmove()函数,其功以行为单位,依次把字符串中所有小写字母"o"左边的字符串内容移到该的右边存放,然后把小写字母删除,余下的内容移到已处理字符之后把已字符串仍按行重新存串数组StrResult最后main()函数调用函数WData(),把结果StrResult输出到文件OUT.dat原始数据文件存放的格式的宽度均小于80个含标点符号和空格。例如,原文:nanyfield.Yucancreateanyouhavethe结果:nanyfield.Yucancreateanrd.yuhavethe注意:部分源程序己经给出。请勿改动主函数RData()和#include<stdio.h>#include<string.h>#include maxline0;/*文章的总行数intvoid int if((fp=fopen(,,IN.datH,HrM))==returnwhile(fgets(StrResult[i],80,fp)!= *p=return0;void for(i=0;i<maxline; 【题目解答本题的关键点在于读懂弄清题目分析题目题中需要解决的问题就是实现Strmove函数而Strmove函数的功能是:输出以行为单位依次把字符串写字母o字符串内容移到该串的右边然后把小写字余下的字符串内容移到已处理的左边之处理的仍按行重新存串数组StrResult中的所有因此本题的关键在于如何判断字符串中的某个字符是否为"0",可以通过一个for循环来对整个文章进行判断。本题从每一行字符串的头对每一行的字符串首先从的结尾处循环判断当前字符是否"0",如果是,就把当前除并把串拷贝串数组buf最后串数组buf拷贝串数组StrResult[i这样就实现了题目的要求。void for(i=0;i<maxline; j=strlen(StrResult[i])-StrResult[i][j]=strcpy(buf,while strcat(buf,StrResult[i][j]=strcat(buf,strcpy(StrResult[i],容错分析注意每行的字符80,所buf的80。strcat的连接,函数strcpy是字函数RData(实现从文件IN.dat中读取一篇英文文章并存入到字符串数组StrResult中,请编写函数StrRes(),以行为单位以空格或标点符号为分隔的所有单词进行倒排。最后把己字符串(应不符号)重新存串数组StrResult最后调用函数WData(),把结果StrResult输出到文件OUT.dat原始数据文的格式是:每行的宽度均小于80个含标点符号和空格。例如,原文:YouHeIama结果:MeHestudentaam注意部分程序已给出。请勿改动主函 读数据函数RData()和输出数据函数的#include<stdio.h>#include<string.h>#include<conio.h>#include /*intRData(void);voidWData(void);charStrRes(void)void int i= if((fp=fopen(,,IN.datH,HrH))==returnwhile(fgets(StrResult[i],80,fp)!= p=maxline—return fp=fbpen(HOUT.datM,for(i=0;i<maxline;3单词为单位将每行中(即逆排);中的标点符号不显示出来;重新存到数组StrResult中,并输出到Out.dat文件中。【解题思路】根据上面第1步:确定如何判断一个单词结束和如何判断一行结束。如果函数的值为零时,说明一个单词结束;如果变量i的值小于零,第2步题中要求最后输出的结果不能包含标点有非英文字母和非空字符改成空第3步:用临时字符串数组ch和pp作为中转数组将每行的字符从行尾到行头进行置换。置换的方法是:首先把数组pp中的每一个元素都向后移动一个位置,然后把StrResult[l]国存入数组元素PP 接着变量k加1,变量i减1,依次循环直到变量i减到零,即对一行的字符处理完毕。4最后把字符串数组ch的内容拷贝到字符串数组StrResult[l]中来实现倒【答char i,j,k,strl,for(i=0;i<maxline;for(j=0;j<(int)strlen(StrResult[i]);if(!isalpha(StrResult[i][j])&&StrResult[i][j]!=' ch[80]= pp[80]=strl=i=strl-k= while(isalpha(StrResult[l][i])&&i>= ppU+l]=pp[j];strcat(ch,while(!isalpha(StrResult[l][i])&&i>= fbr(j=k;j>=O;j-pp[j+l]pp[0]=strcat(ch,k=strcpy(StrResult[l],容错分柝字符串的倒排要考虑字符为英文字符和非英文字符两种情况,出错者往往虑到非英文字符的str字符串中的所有字母改写成该字母的下一个z成字 要求大写字母仍为大写字母,小写字母仍为小写字母,其他字符不做改变请编CharChange(char*str)实现程序要求,最后调RWData()从IN.dat文50组数据,分别得出结果,并把结果输出到文件OUT.dat例如,str字符串中原有的内容为:Mn.l23Zxy,则调用该函注意:部分程序已经给出。请勿改动主函数main()和输出数据函数RWData()#include<conio.h>#include<string.h>#include<stdio.h>#include<ctype.h> N81voidRWData();voidCharChange(char printff'Theoriginalstrtringistr:printff'Thestrtringaftermodified *rf,for(i=0;i<50; fscanf(rf,**%strM,a);【题目分析】分析题目可知,题中需要解决问题就是实现CharChange函的功能问题,而CharChange函数的功能是:实"把str字符串的所有字母改写成该字母的下一个字母,字母z改写成字母 要求大写字母仍为大写字母,小字母仍为小写字母其他字符不做改变”。因此本题的关键在于如何判断将字符串拆分成单独字母之后就可以通过一个循环来将所有字符逐个替换并存入数组str中。【解题思路】首先要考zZ的处理,因zZ的ASCII值a和A的ASCII25,所以要z和Z改写成字符a和A,只需要用字符z和Z的ASCII25,就得aAASCII值;对其他的字符,只需要对1,就得到其ASCII值。voidCharChange(char{while if(*str=-z*||*str=-elseif*str+=容错分析:zZ的ASCII25就得到字符aAASCII己知在文件IN.dat中存有100个产品销售记录,每个产品销售记录由品代码code(字符型4位)、产品名称nam(字符型10位)、单价upric(整型)、数量amoun(整型)、金额sum(长整型5部分组成其中金单价X数量函数 读取这100个销售记录并存入结构数组sell中。请编写AscendSort函数,其功能是按品名称从小到大进行排列若产品名称相等则按金额从小到大进行排列终排列结果仍存入结构数组sell中最后调用函数 把结果输出到文件OUT.dat中。注意部分程序己给出。请勿改动主函 读数据函 和输出数据函#include<stdio.h>#include#include<conio.h>#include<stdlib.h>#defineMAX100typedefstruct /*产品代码 /*产品名称 /*单价 /*数量 /*金额} voidvoidvoidvoid memset(sell,0, fp= memcpy(sell[i].code,str,memcpy(sell[i].name,str+4,memcpy(ch,str+14,ch[4]=memcpy(ch,str+18,sell[i].sum=(long)sell[i].uprice*void fp=fbpen(',OUT.datn,for(i=0;i<100; printf("%s%s%4d%5d%5d\n'',sell[i].code,sell[i].name,sell[i].uprice, %5d\n",sell[i].code,sell[i].narne,sell[i],amount,【题目分析】分析题目可知,题中需要解决的问题就是实现AscendSort而AscendSort函数的功”按产品名称从小到大进行排列,若产品名称金额从小到大进行最终排列结果仍存入结构数组sell因此本题的关键在于对数组进行排序。【解题思路】要实现产品从小到大就需要两个整型变量j分别来记录当前和后一个要用一个双重循环来对100个产品的记录进行重循环中用字较函数strcmp()对两个产品名称进行并将小的往大的往实品名称从小到大进行如果产品名称则比较这两的金额实现按产品金额从小到大进行排序的功能。void for(i=0;i<99;i-H-forif(strcmp(sell[i].name,sell[j].name)> temp=sell[i];sell[j]=temp; if(sell[i].sum>{temp=sell[i];sellfj]=temp;容错分析:字符类型的两个数据进行比较要用到字符串比中,请编写函数 其功能是若一个四位数的千位上的数字值小于等于百位上的数字值百位上的数字值小于等于十位上的数字值以及十位的数字值小于等于个位上的数字值,并且该位数是偶数,则统计出满足此条件的个数count,并把这四位数按从小到大的顺序存入数组b中最后调写函数WData(),把结果count以及数组b中符合条件四位数输出到OUT.dat文件中。程序中己定义数 b[200],己定义变注意;部分程序已经给出。请勿改动数据文件IN.dat中的任何数据及主函 #include MAX a[MAX],b[MAX],count=voidvoid fp=fbpen(,,IN.datn,for(i=0;ivMAX;void fp=fopen(nOUT.dat'\fbr(i=0;i<count;void 【题目分析】分析题目可知,题中需要问题就是实现evenVal函数而evenVal函数的功能是统,若一个四位数的千位上的数字值小于等于百位上的数字值,百位上的数字值小于等于十位上的数以及十位上的数字值小于等于个位上的数字值,并且该四位数是偶数"条件的个数count,并四位数按从小到大的顺序存入数组b中。因此本题的关键在于如何将一个四位数拆分成单个数字。【解题思路】首先用一个四位数除以1000,就得到这个四位数的千位上的数字,赋用这个四位数对1000求余数,余数再除以100,就得到这个四位数的百位上的数字,赋给变量用这个四位数对100求余数,余数再除以10,就得到这个四位数的十位上的数字,赋给变量用这个四位数对10求余数,余数就是这个四位数的个位上的数字,赋给变量然后如果 a[i]%2==0同时成立,则a[i]就是要求的数把a[i]赋给b[count],同时变量count加1。最后对数组b中的数据从小到大进行排序 al,a2,a3,a4,for(i=0;ivMAX; ala2=a3=if((al<=a2)&&(a2<=a3)&&(a3<=a4)&&(a[i]%2= for(i=0;i<count-l;for(j=i+l;j<count; b[i]=b[j]=k;容错四位数对1000求余数,余数再除以100,就得到这个四位数的百a[i]%204个条件同时a[i]就是要求下列程在三位整数(100999)中寻找符合条件的整数并依次从小到大存入数该整数全平方数,又有两个数字例如144、676请编写函数SearchVal(实现此满足该条件的整数的个数通过的函数最后调用函数把结果输出到文件OUT.dat中。注意:部分源程序已给出。请勿改动主函数maino和写函数WData()的#includeSearchVal(intvoidWData(intnum,int out printff%d\n",num); for(i=0;i<num;i++) b[20],num;num=SearchVal(b);WData(num,b);【题目分析】分析题目可知,本题只要实现SearchValoSearchVal()要实现两个功 100999中既是完全平方数,又有两个数字相同的数些数按从小到大的顺序存入一个数【解题首先我们来确定如何判断一个数是平方数:如果一个三位整数是完全平方数,则其平一个两位数,所以循环自变量从10当然题目要求是100999因此当i*i大于等于10000就停止循环。然后我们来判断求出的平方数是否有两个一样的数字:第1步,先求出该数的每位数字,用i*i除以100得到三位数的百位数字,用i*i除以10再对10求余数得到三位数的十位数字,用i*i对10求余数得到三位数的个位数字,分别赋给整型变量 第2步判断c这3个数字是否两两相等,如果两两相等那么这个三位数就是所求的数字然后把 i,a,b,c,ent=0;for(i=10;i*i<1000;i++) a=b=if(a==b||b==c||bb[cnt-H-]=return容错分析:判 c这3个数字是否两两相等应该用表达式a==b||b=c||c==a来表示个表达式之间的关系是或26IN.dat300并已调用RData()把这些数存入数组a中,请编jsVahie(),其功能是:求出千位数上的数减百位数上的数减十位数上的数减个位数上的0count,再把所有满足此条件的四位数依次存b至lJOUT.dat文例如,9123,9.1.23>0,则该数满足条件存入数组6中,且个数(:011m=(:011N+1。9812,9.8.1-程序中己定义数组 己定义变注意:部分程序已经给出。请勿改动主函 读函数RData()和写函数WData()的 a[300],b[300],count=voidvoid for(i=0;i<300; void fbr(i=0;i<count; prints,,count=%d\nn,for(i=0;i<count;i-H-【题目分析】分析题目要实现jsValue函数的功能函数jsValue要实现的功能是求出千位数上的数减百位数上的数减十的数减个位数上的数count,再把所有满足此四位数依次存入数组b然后对数组b的四位数按从小到大的顺序进行排序。因此解答本题的关键在于如何的各位上的数字拆分成单个数字。【解题思路】对于每一个四位数,用这个四位数除以1000,可得到这个四位数的千数字输给变量这个四1000余然后100,可得到这个四位数百位上的数字输给变量这个四100求余然后10,可得到这个四位数十位上的数字输给变量这个四位数对10求余,可得到这个四位数个位上的数字输给变量然后判断表达式thou-hun-ten-data0,如0,则这个四位数是满足题目条件的数字,这个b,同时计count1。最后利用两重循环b的元27函数Rdata()实现从文件IN.dat中读取一篇英文文章存入到字符串数组string中,请编写 其功能是:以行为单位把字符串中所有字符的ASCII值左移4位,如果左移后,其字符的ASCII值小于等于32或大于100,则原字符保持不变,否则就把左移后的字符ASCII值再加上原字符ASCII值,得到新的字符仍存入原字符串对应的位置上。最后把已处理的字符串仍按行重新存入字符串数组string中,最后调用函数Wdata(),把结果string输出到文件OUT.dat中。注意:部分源程序己经给出。请勿改动主函数读数Rdata()和输出数#include#include#include /*文章的总行数intvoidvoidvoid if int if((fp=fopen(nIN.datH,V))==returnwhile(fgets(string[i],80,fp)!= p=strchr(string[i],*p=returnvoid fp=fbpen(,^OUT.dat,^,for(i=0;i<maxline; 【题目分析题目要实现CharLeRCharLeR要实现的功能是行为单位把字的所有字符的ASCII值左移4如果左移后其字符的ASCII于等于32或大于100,则原字符保持否则就把左移后的字符ASCII值再字符ASCII值,得到新的字符仍存入原字符串对应的位因此解答本题的关键在于如何实现字以及ASCH值的左移运算。【解题思路】fori0maxline时,就对一行的字符串数组,首先利用字符串函数strlen求出字符串数组stringb的for循环语j0str时,对ASCII4432100,如果条件成立,则原码值与左移4位后得到的字符的ASCII码值相加,相加之和仍然void for(i=0;i<maxline; ch=if(ch>32&&string[i][j]+=容错分析:ASCII4位,string[i][j]vv4已知IN.dat中存有若干个«200)RData()读取这若干个正整数并存入数组original中。请编写函数CalValueo,其功能要求是求出这个文件中共有多少个正整数totNum;求这些数右移1位后,产生的新数是偶数的数的个数toteven,以及满足此条件的totavg。最后调用函数WData()把所求的结果输出到OUT.dat文件中。注意:部分程序己经main。、RData()WData()#include<stdio.h>#include<conio.h> MAXNUM200 totNum=0; toteven= totavg=intRData(void);voidWData(void);voidCalValue(void)void fbr(i=0;ivMAXNUM; printR”文件IN.dat中共有正整数=%d个\n”,totNum);printf("符合条件的正整数的个数=%d个m",toteven);printff平均值=%.2f\n",totavg);int i=if((fp=fopen(',IN.daf,,V))==returnwhilefscanfiffp,M%d,n,returnvoid fp=fopen(nOUT.datn,fprintf(fp,H%d\n%d\n%6.2f\nu,totNum,toteven,totavg);2个功能:求出这个文件中共有多少个正整数totNum;求这些1位后,产生的新数是偶数的数的个数toteven,以及满足此条件的这些数(右移前的值)的算术平均值totavg。因此解答本题的关键在于如何一个数是否为正整数,如何将数右移和判断一个数【解题思路】在循环语句中对数组original中的每个数进行判断,如果这0,则退出循环进入下轮循环,如果0,totNum加1;然后对当前这个数1得到新数字,用这个新2余数,如果0,则说明这个新数的变量toteven加1,并且把当前这个数字和变量totavg对数组original中所有数扫描完变量totavg的值就是符合条件的数字然后用这个和除以符合条件的数的个数变量toteven,就得到了符合条件的数字的算术平均值。void i,for(i=0;ivMAXNUM; ifif(original[i]>totNum-H-if(data%2= toteven-H-totavg+=totavg/=中,请编写函数spellValo,其功能是:把千位数字和十位数字重新组成一个新的二位数ab(新二位数的十位数字是原四位数的千位数字,新二位数的个位数字是原四位数的十位数字),以及把个位数字和百位数字组成另一个新的二位数cd(新二位数的十位数字是原四位数的个位数字,新二位数的个位数字是原四位数的百位数字),如果新组成的两个二位数ab-cdn0ab-cd<10且两个数均是奇数,同时两个新数的十位数字0,则将满足此条件的四位数按从大到小的顺序存入数组b中,并要计算满足上述条件的四位数的个数输出到OUT.dat文件中。部分程序己经给出。a[200]、b[200],已定义变量ent。请勿改动数据文件IN.dat中的任何数据及maino、RData和WData()的内容。#include<stdio.h> MAX a[MAX],b[MAX],ent=0voidvoid fp=for(i=0;i<MAX;i++)void for(i=0;i<cnt;voidmain printfC满足条件的数=%d\n",for(i=0;i<cnt;【题目分析】分析题目可知,要实现spellVal函数spellValo要实现的功能是:把千位数字和十位数字重新组成一个新的十位数a(新的十位数字是四位数的千位数字,新十位数的个位数字是原四十位数字),以及把个位数字和百位数字组成另一个新的十位数cd(新十位数的十位数四位数的个位新十位数的个位数字是原四位数的百位数字),如果新组成的两个十位数ab-cdbO且ab-cdWIO,且两个数均是时两个新数的十位数字均不则将满足的四位数按从大到小的顺序存入数组b并要计算满足上述四位数的个数count。因此解的关键在于如何将一个四位数的各位上的数字拆分成单个数字,并将两个单个数字组合成一个两位数。【解题思路】对于每一个四位数,用这个四位数除以1000,可得到这个四位数的千数字输给变量thou:这个四1000求100,可得到这个四位数百位上的hun100求余然后10,可得到这个四位数十位上的数字输ten;这个四位数对10求余,可得到这个四位数个位上的data。因为thoudata作为重新组成新的两个二位数的十位上数字,所以其值0,组建两个二位数之前,首先要判断thou和data这两个数字不能为0;然后用逻辑ab-cd^Oab-cd≤10且两个数均为奇数的如果上述逻辑表达式成立,则这个四位数是符合题目条件的一个数字,把其存入数组b同时计count1b中元voidspellVal i,thou,hun,ten,data, ab,for(i=0;i<200; ten=if(thou==0||data==0)cd=if((ab-cd)>=0&&(ab-cd)<=10&&ab%2==l&& b[cnt]=for(i=0;i<cnt-l;for(j=i+l;j<cnt; 容错分析:已知数IN.dat200个四位数,并己调用读函数RData()把这aseVal(),其功能是:依次a中取出一个四位数,如果该四位数连续小于该5个数且该数是偶数(该四4个数,则不统计),则统计出满足此条件的个数count并把这些四位数按从小b中。最后调用WData(),count以b中符合条件的四位数输出到OUT.dat文件中。部分程序已经给出。a[200]、b[200],已定义变量count。请勿改动IN.datmain()、RData()WData()#include MAX a[MAX],b[MAX],count=void fp=for(i=0;i<MAX;fccanfi(fp,n%d,n, intfprintf(fp,H%d\nn,fbr(i=0;i<count;i++)void printf(”满足条件的数=%d\n”,fbr(i=0;i<count;printf(”%d”,IN.dat200个四位数,并已调用RDatao把这a中,seVal(),其功能是:依次a中取出一个四位数,如果该

温馨提示

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

评论

0/150

提交评论