国家二级C语言机试(程序设计题)模拟试卷1(共45题)_第1页
国家二级C语言机试(程序设计题)模拟试卷1(共45题)_第2页
国家二级C语言机试(程序设计题)模拟试卷1(共45题)_第3页
国家二级C语言机试(程序设计题)模拟试卷1(共45题)_第4页
国家二级C语言机试(程序设计题)模拟试卷1(共45题)_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

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

文档简介

国家二级C语言机试(程序设计题)模拟试卷1(共9套)(共45题)国家二级C语言机试(程序设计题)模拟试卷第1套一、程序设计题(本题共5题,每题1.0分,共5分。)1、下列程序定义了N×N的二维数组,并在主函数中赋值。请编写函数fun,函数的功能是:求出数组周边元素的平均值并作为函数值返回给主函数中的s。例如,若a数组中的值为:0127919745238314568259141则返回主程序后s的值应为3.375。注意:部分源程序在文件PROGl.C中。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。试题程序:#include<stdio.h>#include<conio.h>#include<stdlib.h>#defineN5doublefun(intw[][N]){}voidmain(){FILE*wf;inta[N][N]={0,1,2,7,9,1,9,7,4,5,2,3,8,3,1,4,5,6,8,2,5,9,1,4,1};inti,j;doubles;system("CLS");printf("***Thearray***\n");{printf("%4d",a[i][j]);}printf("\n");}s=fun(a);printf("***THERESULT***\n");printf("Thesumis:%lf\n",s);/******************/wf=fopen("out.dat","w");fprintf(wf,"%lf",s);fclose(wf);/******************/}标准答案:doublefun(intw[][N]){inti,j,k=0;doublesum=0.0;for(i=0;i<N;i++)for(j=0;j<N;j++)if(i==0||i==N-1||j==0||j==N-1)1*只要下标中有一个为0或N-1,则它一定是周边元素*/{sum=sum+W[i][j];/*将周边元素求和*/k++;}returnsum/k;/*求周边元素的平均值*/}知识点解析:本题要求计算二维数组周边元素的平均值,for循环语句控制循环过程,if条件语句根据数组元素的下标判断该元素是否为二维数组的周边元素。本题采用逐一判断的方式,周边元素的规律为下标中有一个是0或N-1,所以只要下标中有一个为0或N-1,那么它一定是周边元素。计算周边元素个数的方式是当给sum累加一个值时,k也加1。2、使用VC++2010打开考生文件夹下prog1中的解决方案。此解决方案的项目中包含一个源程序文件prog1.c。在此程序中,请编写函数fun,该函数的功能是:统计各年龄段的人数。N个年龄通过调用随机函数获得,并放入主函数的age数组中。要求函数把0~9岁年龄段的人数放在d[0]中,把10~19岁年龄段的人数放在d[1]中,把20~29岁年龄段的人数放在d[2]中,依此类推,把100岁(含100岁)以上年龄的人数都放在d[10]中。结果在主函数中输出。注意:部分源程序在文件PROG1.C中。请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。试题程序:#include<stdio.h>#defineN50#defineM11voidfun(int*a,int*b){}doublernd(){statict=29,c=217,m=1024,r=0;r=(r*t+c)%m;return((double)r/m);}voidmain(){FILE*wf;intage[N],i,d[M];intb[N]={32,45,15,12,86,49,97,3,44,52,17,95,63};for(i=0;i<N;i++)age[i]=(int)(115*rnd());/*产生一个随机的年龄数组*/printf("Theoriginaldata:\n");for(i=0;i<N;i++)printf((i+1)%10==0?"%4d\n":"%4d",age[i]);/*每行出10个数*/printf("\n\n");fun(age,d);for(i=0:;i<10;i++)printf("%4d﹣﹣﹣%4d:%4d\n",i*10,i*10+9,d[i]);printf("Over100:%4d\n",d[10]);/*********found*********/wf=fopen("out.dat","w");fun(b,d);for(i=0;i<10;i++)fprintf(wf,"%4d—%4d:%4d\n",i*10,i*10+9,d[i]);fprintf(wf,"Over100:%4d",d[10]);fclose(wf);/*********found*********/}标准答案:voidfun(int*a,int*b){inti,j;for(j=0;j<M;j++)b[j]=0;/*数组b初始化为0*/for(i=0;i<N;i++)if(a[i]>=100)b[10]++;/*如果年龄大于等于100,b[10]自增1*/elseb[a[i]/10]++;/*如果年龄小于100,则将其分别统计到b[a[i]/10]中*/}知识点解析:本题是一个分段函数的问题,用两个循环来完成。第1个循环的作用是使b中的所有元素值都为0。这个循环不能省略,因为若未对b中的元素赋初值,则它们的值是不可预测的。第2个循环的作用是分别统计a中各年龄段的人数。当a[i]≥100时,按题意要将其统计到b[10]中。else的作用是如果年龄小于100,则将其分别统计到b[a[i]/10]中。由运算优先级可知先进行a[i]/10的运算,所得结果作为b的下标。若a[i]为0~9时,a[i]/10的值为0,且0~9岁的人数正好要存入b[0]中。若a[i]为10~19时,a[i]/10的值为1,且10~19岁的人数正好要存入b[1]中,依此类推。3、请编写一个函数voidfun(char*tt,intpp[]),统计在tt所指字符串中’a’到’z’26个小写字母各自出现的次数,并依次放在pp所指数组中。例如,当输入字符串:abcdefgabcdeabc后,程序的输出结果应该是:33322110000000000000000000注意:部分源程序在文件PROG1.C中。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。#include#includevoidfun(char*tt,intPP[]){}main(){charaa[1000];intbb[26],k;voidNONO();printf("\nPleaseenteracharstring:");scanf("%s",aa);fun(aa,bb);for(k=0;k<26;k++)printf("%d",bb[k]);printf("\n");NONO();}voidNONO(){/*本函数用于打开文件,输入测试数据,调用fun函数,输出数据,关闭文件。*/charaa[1000];intbb[26],k,i;FILE*rf,*wf;rf=fopen("in.dat","r");wf=fopen("out.dat","w");for(i=0;i<10;i++){fscanf(rf,"%s",aa);fun(aa,bb);for(k=0;k<26;k++)fprintf(wf,"%d",bb[k]);fprintf(wf,"\n");}fclose(rf);fclose(wf);}标准答案:char*p=tt;inti;for(i=0;i<26;i++)PP[i]=0;while(*p){if(*p>=’a’&&*p<=’z’)PP[*p-’a’]+=1;p++;}知识点解析:该程序功能是统计字符串中26个字母各自出现的次数。解题思路,从已给部分源程序的main主函数开始入手,函数形参指针tt接受主函数中字符数组aa的起始地址,形参pp接受主函数中的bb数组的起始地址,bb数组的每一个元素都是计数器,bb[0]中统计字母“a”的个数,bb[1]中统计字母“b”的个数,依此类推,bb[25]中统计字母“z”的个数。4、请编写函数fun,该函数的功能是:统计各年龄段的人数。N个年龄通过调用随机函数获得,并放入主函数的age数组中。要求函数把0~9岁年龄段的人数放在d[0]中,把10~19岁年龄段的人数放在d[1]中,把20~29岁年龄段的人数放在d[2]中,依此类推,把100岁(含100岁)以上年龄的人数都放在d[10]中。结果在主函数中输出。注意:部分源程序在文件PROGl.C中。请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。试题程序:#include<stdio.h>#defineN50#defineN11voidfun(int*a,int*b){}doublernd(){statict=29,c=217,m=1024,r=0;r=(r*t+c)%m;return((double)r/m);}voidmain(){FTLE*wf;intage[N],i,d[M];intb[N]={32,45,15,12,86,49,97,3,44,52,17,95,63};for(i=0;i<N;i++)age[i]=(int)(115*rnd());/*产生一个随机的年龄数组*/printf("Theoriginaldata:\n");for(i=0;i<N;i++)printf((i+1)%10==07"%4d\n":"%4d",age[i]);/*每行输出10个数*/printf("\n\n");fun(age,d);for(i=0;i<10;i++)printf("%4d一一一%4d:%4d\n",i*10,i*10+9,d[i]);printf("Over100:%4d\n",d[10]);/******************/wf=fopen("out.dat","W");fun(b,d);for(i=0;i<10;i++)fprintf(wf,"%4d一%4d:%4d\n",i*10,i*10+9,d[i]);fprintf(wf,"Over100:%4d",d[10]);fclose(wf);/******************/}标准答案:voidfun(Int*a,int*b){inti,j;for(j=0;j<M;j++)b[j]=0;/*数组b初始化为0*/for(i=0;i<N;i++)if(a[i]>=100)b[10]++;/*如果年龄大于等于100,b[10]自增1*/elseb[a[i]/10]++;/*如果年龄小于100,则将其分别统计到b[a[i]/10]中*/}知识点解析:本题是一个分段函数的问题,用两个循环来完成。第1个循环的作用是使b中的所有元素值都为0。这个循环不能省略,因为若未对b中的元素赋初值,则它们的值是不可预测的。第2个循环的作用是分别统计a中各年龄段的人数。当a[i]≥100时,按题意要将其统计到b[10]中。else的作用是如果年龄小于100,则将其分别统计到b[a[i]/10]中。由运算优先级可知先进行a[i]/10的运算,所得结果作为b的下标。若a[i]为0~9时,a[i]/10的值为0,且0~9岁的人数正好要存入b[0]中。若a[i]为10~19时,a[i]/10的值为1,且10~19岁的人数正好要存入b[1]中,依此类推。5、请编写函数fun,函数的功能是:判断字符串是否为回文?若是,函数返回1,主函数中输出:YES;否则返回0,主函数中输出NO。回文是指顺读和倒读都一样的字符串。例如,字符串LEVEL是回文,而字符串123312就不是回文。注意:部分源程序在文件PROG1.C中。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。#include#include#defineN80intfun(char*str){}main(){chars[N];voidNONO();printf("Enterastring:"),gets(s);printf("\n\n");puts(s);if(fun(s))printf("YES\n");elseprintf("NO\n");NONO();)voidNONO(){/*请在此函数内打开文件,输入测试数据,调用fun函数,输出数据,关闭文件。*/FILE*rf,*wf;inti;chars[N];rf=fopen("in.dat","r");wf=fopen("out.dat","w");for(i=0;i<10;i++){fscanf(rf,"%s",s),if(fun(s))fprintf(wf,"%sYES\n",s);elsefprintf(wf,"%sNO\n",s);}fclose(rf);fclose(wf);}标准答案:1inti,n=0,flag=1;//初始设置标识位2char*p=str;//设置工作指针3while(*p)//取字符串大小4{n++;5p++;6}7for(i=0;i知识点解析:该程序功能是判断字符串是否为回文。其中,回文是指顺读和倒读都一样的字符串。解题过程首先利用while循环取得字符串的长度n,然后循环判断正序第i个字符和其对应的逆序字符n—1—i个是否相等,也就是判断是否是回文。进入fun函数,根据前面的分析主要思路是:(1)首先用整型变量i表示所判断的字符串中前面对应元素的下标。i初值为0,n是字符串的长度,通过循环来求得n。(2)然后,把下标为i的字符与下标为“n—1—i”的字符比较,如果相同,i加1,继续进行一对一的字符比较。不断重复此过程,直到i≥n/2为止。在此过程中,如果下标为i的字符与下标为“n—1一i”的字符不相同,则可以断定字符串不是回文,立即退出函数。(3)如果正常结束循环,就说明字符串符合回文条件。国家二级C语言机试(程序设计题)模拟试卷第2套一、程序设计题(本题共5题,每题1.0分,共5分。)1、请编写函数fun,其功能是:统计s所指字符串中的数字字符个数,并作为函数值返回。例如,s所指字符串中的内容是:2det35adh253kjsdf7/kj8655x,函数fun返回值为:11注意:部分源程序在文件PROG1.C文件中。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。试题程序:#include<stdio.h>voidNONO();intfun(char*s){}main(){char*s="2clef35adh253kjsdf7/kj8655x";printf("%s\n",s);printf("%d\n",fun(s));NONO();}voidNONO(){/*本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。*/FILE*fp,*wf;inti;chars[256];fp=fopen("in.clat","r");wf=fopen("out.dat","w");for(i=0;i<10;i++){fgets(s,255,fp);fprintf(wf,"%d\n",fun(s));}fclose(fp);fclose(wf);}标准答案:intfun(char*s){intn=0;char*p;n++;returnn;}知识点解析:要统计字符串中数字字符的个数,首先应定义变量n,并初始化为0,然后遍历字符串,逐个判断字符是否为数字字符,判断条件为该元素的ASCII码在字符0和9的ASCII码之间,若判断条件成立,则使n的值加1,否则,继续判断下一个字符,直到字符串结束。2、请编写函数fun,其功能是:将M行N列的二维数组中的字符数据,按列的顺序依次放到一个字符串中。例如,若二维数组中的数据为WWWWSSSSHHHH则字符串中的内容应是:wSHwSHWSHWSH。注意:部分源程序给出如下。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。试题程序:#include<stdio.h>#defineM3#defineN4voidfun(char(*s)[N],char*b){}voidmain(){chara[100],w[M][N]={{’W’,’W’,’W’,’W’},{’S’,’S’,’S’,’S’},{’H’,’H’,’H’,’H’));inti,j;printf("Thematrix:\n");for(i=0;i<M;i++){for(j=0;j<N;j++)printf("%3c",w[i][j]);printf("\n");}fun(w,a);printf("TheAstring:\n");puts(a);printf("\n\n");}标准答案:voidfun(char(*s)[N],char*b){inti,j,k=0;for(i=0;i<N;i++)/*按列的顺序依次放到一个字符串中*/for(j=0;j<M;j++)b[k++]=s[j][i];b[k]=’\0’;}知识点解析:看到程序后,很容易便能想到用循环嵌套的方法,本题中按列的顺序依次放到一个字符串中,所以列标变化慢,行标变化快。注意:第1个循环条件为i<N(即列);第2个循环条件为j<M(即行),因为在循环的嵌套中越在内层,循环变化就越快。3、请编写函数fun,该函数的功能是:将M行N列的二维数组中的字符数据,按列的顺序依次放到一个字符串中。例如,若二维数组中的数据为WWWWSSSSHHHH则字符串中的内容应是:WSHWSHWSHWSH。注意:请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。试题程序:#include<stdio.h>#defineM3#defineN4voidfun(char(*S)[N],char*b){}voidmain(){FILE*wf;chara[100],w[M][N]={{′W′,′W′,′W′,′W′},{′S′,′S′,′S′,′S′},{′H′,′H′,′H′,′H′}};inti,j;printf(″Thematrix:\n″);for(i=0;i<M;i++){for(j=0;j<N;j++)printf(″%3c″,w[i][j]);printf(″\n″);}fun(w,a);printt(″TheAstring:\n″);puts(a);printf(″\n″);/****************/wf=fopen(″out.dat″,″w″);fprintf(wf,″%s″,a);fclose(wf);/****************/}标准答案:voidfun(char(*s)[N],char*b){inti,j,k=0;for(i=0;i<N;i++)/*按列的顺序依次放到一个字符串中*/for(j=0;j<M;j++)b[k++]=s[j][i];b[k]=′\0′;}知识点解析:看到程序后,很容易便能想到用循环嵌套的方法,本题中按列的顺序依次放到一个字符串中,所以列标变化慢,行标变化快。注意:第1个循环条件为i<N(即列),第2个循环条件为j<M(即行),因为在循环的嵌套中,越在内层,循环变化就越快。4、已知学生的记录由学号和学习成绩构成,N名学生的数据已存入a结构体数组中。请编写函数fun,该函数的功能是:找出成绩最高的学生记录,通过形参返回主函数(规定只有一个最高分)。已给出函数的首部,请完成该函数。注意:请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。试题程序:#include<stdio.h>#include<string.h>#include<conio.h>#include<stdlib.h>#defineN10typedefstructss/*定义结构体*/{charnum[10];ints;}STU;fun(STUa[],STU*S){}voidmain(){FILE*wf;STUa[N]={{″A01″,81},{″A02″,89},{″A03″,66},{″A04″,87},{″A05″,77},{″A06″,90},{″A07″,79},{″A08″,61},{″A09″,80},{″A10″,71}},m;inti:system(″CLS″);printf(″*****Theoriginaldata*****″);for(i=0;i<N;i++)printf(″No=%sMark=%d\n″,a[i].num,a[i].s);fun(a,&m);printf(″*****THERESULT*****\n″);printf(″Thetop:%s,%d\n″,m.num,m.s);/****************/wf=fopen(″out.dat″,″w″);fprintf(wf,″%s,%d″,m.num,m.s);fclose(wf);/****************/}标准答案:fun(STUa[],STU*s){inti:*s=a[0];for(i=0;i<N;i++)/*找出成绩最高的学生记录*/if(s—>s<a[i].s)*s=a[i];}知识点解析:本题考查:成绩最高的学生记录查找;for循环语句;if条件语句。本题的流程是先使s指向第1名学生,利用循环语句遍历所有学生的成绩,利用条件语句判断当前学生成绩是否最高,所以if语句的条件是s—>s<a[i].s.此外,做题时应该熟练掌握“指向运算符”和“成员运算符”的相关知识,题中“s—>s”等价于“(*s).s”。5、编写函数fun,其功能是:求Fibonacci数列中大于t的最小的数,结果由函数返回。Fibonacci数列F(n)的定义为:F(0)=0,F(1)=1F(n)=F(n一1)+F(n一2)例如,当t=1000时,函数值为1597。注意:部分源程序给出如下。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。试题程序:#include<conio.h>#include<math.h>#include<stdio.h>intfun(intt){}main(){intn;n=1000;printf("n=%d,f=%d\n",n,fun(n));}标准答案:intfun(intt){intf0=0,f1=1,f;do{/*根据Fibonacci数列的定义求数值*/f=f0+f1;f0=f1;f1=f;)while(f<t);/*如果求的数值小于t则继续*/returnf;}知识点解析:根据所给数列定义不难发现,该数列最终的结果是由两个数列之和组成,所以可以在循环内部始终把f看成是前两项之和,而f0始终代表第n一2项,n代表第n一1项。退出循环时得到的数f,就是大于指定数的最小的数。国家二级C语言机试(程序设计题)模拟试卷第3套一、程序设计题(本题共5题,每题1.0分,共5分。)1、下列程序定义了N×N的二维数组,并在主函数中自动赋值。请编写函数fun(inta[][N]),该函数的功能是:将数组左下半三角元素中的值全部置0。例如a数组中的值为:197238456则返回主程序后a数组中的值应为:097008000注意:请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。试题程序:#include<(20hio.h>#include<stdio.h>#include<stdlib.h>#defineN5voidfun(inta[][N]){}voidmain(){FILE*wf;inta[N][N],i,j;intb[N][N]={1,9,7,2,4,2,3,8,1,2,4,5,6,7,5,4,0,6,8,0,2,7,1,6,4};system("CLS");printf("*****Thearray*****\n");for(i=0;i<N;i++)/*产生一个随机的5*5矩阵*/{for(j=0;j<N;j++){a[i][j]=rand()%10;printf("%4d",a[i][j]);}printf("\n");}fun(a);printf("THERESULT\n");for(i=0;i<N;i++){for(j=0;j<N;j++)printf("%4d",a[i][j]);printf("\n");}/****************/wf=fopen("out.dat","w");fun(b);for(i=0;i<N;i++){for(j=0;j<N;j++)fprintf(wf,"%4d",b[i][j]);fprintf(wf,"\n");}fclose(wf);/****************/}标准答案:voidfun(inta[][N]){inti,j;for(i=0;i<N;i++)for(j=0;j<=i;j++)a[i][j]=0;/*将数组左下半三角元素中的值全部置0*/}知识点解析:本题考查:for循环语句,使用嵌套循环语句遍历二维数组的各个元素;二维数组元素的引用。对于N×N二维数组,如何表示其左下半三角元素,可以通过以下语句实现:for(i=0;i<n;i++)for(j=0;j<=i;j++)外层循环用来控制矩阵的行下标,内层循环控制矩阵的列下标。注意列下标的取值范围,因为要表示下三角元素,所以j的范围是0~i。2、使用VC++2010打开考生文件夹下prog1中的解决方案。此解决方案的项目中包含一个源程序文件prog1.c。程序中,m个人的成绩存放在score数组中,请编写函数fun,它的功能是:将低于平均分的人数作为函数值返回,将低于平均分的分数放在below所指的数组中。例如,当score数组中的数据为10、20、30、40、50、60、70、80、90时,函数返回的人数应该是4,below中的数据应为10、20、30、40。注意:部分源程序在文件PROG1.C中。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。试题程序:#include<conio.h>#include<stclio.h>#include<string.h>#include<stdlib.h>intfun(intscore[],intm,intbelow[]){}voidmain(){FILE*wf;inti,n,below[9];intscore[9]=(10,20,30,40,50,60,70,80,90};system("CLS");n=fun(score,9,below);printf("\nBelowtheaveragescoreare:");for(i=0;i<n;i++)printf("%d",below[i]);/*********found*********/wf=fopen("out.dat","w");for(i=0;i<n;i++)fprintf(wf,"%d",below[i]);fclose(wf);/*********found*********/}标准答案:intfun(intscore[],intm,intbelow[]){inti,j=0;floatav=0.0;for(i=0;i<m;i++)av=av+score[i]/m;/*求平均值*/for(i=0;i<m;i++)if(score[i]<av)/*如果分数低于平均分,则将此分数放入below数组中*/below[j++]=score[i],returnj;/*返回低于平均分的人数*/}知识点解析:要计算低于平均分的人数,首先应该求出平均分,然后通过for循环语句和if条件语句找出低于平均分的分数。该题第1个循环的作用是求出平均分av,第2个循环的作用是找出低于平均分的成绩记录并存入below数组中。3、编写函数fun,它的功能是计算下列级数和,和值由函数值返回。例如,当n=10,x=0.3时,函数值为1.349859。注意:部分源程序在文件PROG1.C文件中。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。#includelincludedoublefun(doublex,intn){}main(){voidNONO();printf("%f\n",fun(0.3,10));NONO();}voidNONO(){/*本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。*/FILE*fp,*wf;inti,n;doubles,x;fp=fopen("in.dat","r");wf=fopen("out.dat","w");for(i=0;i<10;i++){fscanf(fp,"%lf,%d",&x,&n);s=fun(x,n);fprintf(wf,"%f\n",s);}fclose(fp);fclose(wf);}标准答案:doubles=1.0,y=x;inti;longk=1;for(i=1;i<=n;i++){k=k*i;s+=y/k;y*=x;}returns;知识点解析:(1)根据题干中给出的数列,推出每一项分子是在前一项的基础上乘以x,分母是每一项的阶乘,它可以在前一项的基础上乘以当前项的项数,即第n项是n。(2)在循环中求得每一项,然后对其进行累加求和。4、函数fun的功能是:将a、b中的两个两位正整数合并形成一个新的整数放在c中。合并的方式是:将a中的十位和个位数依次放在变量c的干位和十位上,b中的十位和个位数依次放在变量c的个位和百位上。例如,当a=45,b=12。调用该函数后,c=4251。注意:部分源程序存在文件PROG1.C中。数据文件IN.DAT中的数据不得修改。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。#includevoidfun(inta,intb,long*c){}voidNONO(){/*本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。*/FILE*rf,*wf;inti,a,b;longc;rf=fopen("in.dat","r");wf=fopen("out.dat","w");for(i=0;i<10;i++){fscanf(rf,"%d,%d",&a,&b);fun(a,b,&c);fprintf(wf,"a=%d,b=%d,c=%ld\n",a,b,c);}fclose(rf);fclose(wf);}main(){inta,b;longc;voidNONO();printf("Inputa,b:");scanf("%d%d",&a,&b);fun(a,b,&c);printf("Theresultis:%ld\n",c);NONO();}标准答案:*c=(a/10)*1000+(b%10)*100+(a%10)*10+(b/10);知识点解析:(1>分解两位数的正整数n的个位和十位数,可用n%10和n/10实现。(2)设x0、x1、x2、x3为一位数,则x0、x1×10、x2×100、x3×1000,可以分别使x0、x1、x2、x3构成个、十、百、千带权数,而x0+x1×10+x2×100+x3×1000构成四位数。本题最多只考虑四位数。5、编写函数fun,它的功能是:利用以下所示的简单迭代方法求方程:cos(x)-x=0的一个实根。xn+1=cos(xn)迭代步骤如下:(1)取x1初值为0.0;(2)x0=x1,把x1的值赋给x0:(3)x1=cos(x0),求出一个新的x1;(4)若x0-x1的绝对值小于0.000001,执行步骤(5),否则执行步骤(2);(5)所求x1就是方程cos(x)-x=0的一个实根,作为函数值返回。程序将输出结果Root=0.739086。注意:部分源程序在文件PROG1.C中。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。#include#includedoublefun(){}main(){voidNONO();printf("Root=%f\n",fun());NONO();}voidNONO(){/*本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。*/FILE*wf;wf=fopen("out.dat","w");fprintf(wf,"%f\n",fun());fclose(wf);}标准答案:floatx0,x1=0.0;do{x0=x1;x1=cos(x0);}while(fabs(x0一x1)>0.000001);returnx1;知识点解析:该程序功能是利用简单迭代方法求方程的一个实根。牛顿迭代法的求解思想是从一个初始值开始,逐步逼近所求方程的根。其具体过程是:将初始值代入迭代公式,得到一个迭代输出值。再次迭代时,将上一次的迭代输出值当作本次的迭代输入。不断重复以上过程,直到满足题目要求为止。牛顿迭代公式为:Xn+1=Xn-f(x)/’f(x)。其求解过程在题干中已经给出。国家二级C语言机试(程序设计题)模拟试卷第4套一、程序设计题(本题共5题,每题1.0分,共5分。)1、使用VC++2010打开考生文件夹下prog1中的解决方案。此解决方案的项目中包含一个源程序文件prog1.c。在此程序中,函数fun的功能是:将s所指字符串中下标为偶数同时ASCII值为奇数的字符删除,s所指串中剩余的字符形成的新串放在t所指的数组中。例如,若8所指字符串中的内容为“ABCDEFG12345”,其中字符C的ASCII码值为奇数,在数组中的下标为偶数,因此必须删除;而字符1的ASCII码值为奇数,在数组中的下标为奇数,因此不应当删除,其他依此类推。最后t所指的数组中的内容应是“BDF12345”。注意:部分源程序在文件PROG1.C中。请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。试题程序:#include<stdio.h>#include<string.h>voidfun(char*s,chart[]){}main(){chars[100],t[100];voidNONO();printf("\nPleaseenterstringS:");Scanf("%s",s);fun(s,t);printf("\nTheresultis:%s\n",t);NONO();}voidNONO(){/*本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。*/chars[100],t[100];FTLE*rf,*wf;inti;rf=fopen("in.dat","r");wf=fopen("out.dat","w");for(i=0;i<10;i++){fscanf(rf,"%s",s);fun(s,t);fprintf(wf,"%s\n",t);}fclose(rf);fclose(wf);}标准答案:voidfun(char*s,chart[]){inti,j=0;for(i=0;i<strlen(s);i++)if(!((i%2)==0&&(s[i]%2)))t[j++]=s[i];t[j]=0;}知识点解析:本题是从一个字符串按要求生成另一个新的字符串。我们使用for循环语句来解决这个问题。在赋值新的字符串之前,先对数组元素的下标和ASCII码的值进行判断,将满足要求的元素赋给新的字符串。2、使用VC++2010打开考生文件夹下prog1中的解决方案。此解决方案的项目中包含一个源程序文件prog1.c。在此程序中,请编写函数fun,该函数的功能是:统计各年龄段的人数。N个年龄通过调用随机函数获得,并放入主函数的age数组中。要求函数把0~9岁年龄段的人数放在d[0]中,把10~19岁年龄段的人数放在d[1]中,把20~29岁年龄段的人数放在d[2]中,依此类推,把100岁(含100岁)以上年龄的人数都放在d[10]中。结果在主函数中输出。注意:部分源程序在文件PROG1.C中。请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。试题程序:#include<stdio.h>#defineN50#defineM11voidfun(int*a,int*b){}doublernd(){statict=29,c=217,m=1024,r=0;r=(r*t+c)%m;return((double)r/m);}voidmain(){FILE*wf;intage[N],i,d[M];intb[N]={32,45,15,12,86,49,97,3,44,52,17,95,63};for(i=0;i<N;i++)age[i]=(int)(115*rnd());/*产生一个随机的年龄数组*/printf("Theoriginaldata:\n");for(i=0;i<N;i++)printf((i+1)%10==0?"%4d\n":"%4d",age[i]);/*每行出10个数*/printf("\n\n");fun(age,d);for(i=0:;i<10;i++)printf("%4d﹣﹣﹣%4d:%4d\n",i*10,i*10+9,d[i]);printf("Over100:%4d\n",d[10]);/*********found*********/wf=fopen("out.dat","w");fun(b,d);for(i=0;i<10;i++)fprintf(wf,"%4d—%4d:%4d\n",i*10,i*10+9,d[i]);fprintf(wf,"Over100:%4d",d[10]);fclose(wf);/*********found*********/}标准答案:voidfun(int*a,int*b){inti,j;for(j=0;j<M;j++)b[j]=0;/*数组b初始化为0*/for(i=0;i<N;i++)if(a[i]>=100)b[10]++;/*如果年龄大于等于100,b[10]自增1*/elseb[a[i]/10]++;/*如果年龄小于100,则将其分别统计到b[a[i]/10]中*/}知识点解析:本题是一个分段函数的问题,用两个循环来完成。第1个循环的作用是使b中的所有元素值都为0。这个循环不能省略,因为若未对b中的元素赋初值,则它们的值是不可预测的。第2个循环的作用是分别统计a中各年龄段的人数。当a[i]≥100时,按题意要将其统计到b[10]中。else的作用是如果年龄小于100,则将其分别统计到b[a[i]/10]中。由运算优先级可知先进行a[i]/10的运算,所得结果作为b的下标。若a[i]为0~9时,a[i]/10的值为0,且0~9岁的人数正好要存入b[0]中。若a[i]为10~19时,a[i]/10的值为1,且10~19岁的人数正好要存入b[1]中,依此类推。3、编写函数fun,其功能是:根据以下公式计算S,并将计算结果作为函数值返回,n通过形参传入。例如,若n的值为11时,函数的值为1.833333。注意:部分源程序给出如下。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。试题程序:#include<stdlib.h>#include<conio.h>#include<stdio.h>#include<string.h>floatfun(intn){}voidmain(){intn;floats;system("CLS");printf("\nPleaseenterN:");scanf("%d",&n);s=fun(n);printff"Theresultis:%f\n",s);}标准答案:floatfun(intn){inti,s1=0;floats=0.0;for。(i=1;i<=n;i++){s1=s1+i;/*求每一项的分母*}s=s+1.0/s1;/*求多项式的值*/}returns;}知识点解析:此类计算表达式值的程序,首先需要根据题意分析表达式的规律,得出通项,然后再完成程序语句。本题中表达式的规律是1+2+…+n的倒数之和,那么可以通过for循环语句来实现第1项到第n项的变化。其实就是累加算法,方法是先根据题目要求定义变量,注意该变量的数据类型,然后对其进行初始化操作,因为该变量的作用是累加器,所以初始值应为0(或0.0,根据变量数据类型来确定),再通过for循环语句来完成累加过程。本题中s1用来表示每一项的分母,每一项的分母都是由前一项分母加项数。注意,由于s1定义成一个整型,所以在s=s+1.0/s1语句中不能把1.0写成1。4、请编写函数fun,函数的功能是:删去一维数组中所有相同的数,使之只剩一个。数组中的数己按由小到大的顺序排列,函数返回删除后数组中数据的个数。例如,一维数组中的数据是:2223445666677899101010。删除后,数组中的内容应该是:2345678910。注意:部分源程序在文件PROG1.C中。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。1#include<stdio.h>2#define.N803intfun(inta[],intn)4{56}7main()8{inta[N]={2,2,2,3,4,4,5,6,6,6,6,7,7,8,9,9,10,10,10,10},i,n=20;voidNONO();9printf(’’Theoriginaldata:\n’’);10for(i=0;i<n;i++)printf(’’%3d’’,a[i]);11n=fun(a,n);12printf(’’\n\nThedataafterdeleted:\n’’);13for(i=0;i<n;i++)printf(’’%3d’’,a[i]);printf(’’\n\n’’);14NONO();15}16voidNONO()17{/*请在此函数内打开文件,输入测试数据,调用fun函数,输出数据,关闭文件。*/18FILE*rf,*wf;inta[N],n,i,j;19rf=fopen(’’in.dat’’,’’r’’);20wf=fopen(’’out.dat’’,’’w’’);21for(i=0;i<5;i++){22fscanf(rf,’’%d’’,&n);23for(j=0;j<n;j++)fscanf(rf,’’%d’’,&a[j]);24n=fun(a,n);25for(j=0;j<n;j++)fprintf(wf,’’%4d’’,a[j]);26fprintf(wf,’’\n’’);27}28fclose(rf);fclose(wf);29}标准答案:1inti,t,j=0,‘p=a;2t=p[0];//设置临时变量t初值指向第一数组值3for(i=0;i<=n;i++)4if(t==p[i])//当临时变量与数组中的某个值相同则跳出,比较下一个元素5;6else//如果临时变量与数组中值不同,则对临时变量重新赋值7{a[j]=t;8t=p[i];9j++;}10if(i>=n)a[j]=t;11returnj;知识点解析:该程序功能是删去一维数组中所有相同的数,使之只剩一个。解题思路是,首先在函数中定义临时变量指向每一个元素,然后在循环过程中将临时值和其他元素进行比较,如果相同,那么跳过相同字符。(1)首先,设置一个临时变量,初值设置为一维数组的第一个元素。(2)然后,依次将数组的元素与临时变量比较,如果相同,则继续取数组下一个元素与临时变量比较:如果不同,则将临时变量的值赋值到数组的第一个元素,同时将此与临时变量不同的数组元素赋值给临时变量。(3)循环执行,直到所有的数据处理完毕。5、请编写函数fun,函数的功能是:将M行N列的二维数组中的数据,按行的顺序依次放到一维数组中,一维数组中数据的个数存放在形参n所指的存储单元中。例如,二维数组中的数据为:333333334444444455555555则一维数组中的内容应是:333333334444444455555555。注意:部分源程序在文件PROG1.C中。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。1#include<stdio.h>2voidfun(int(*s)[10],int*b,int*n,intmm,intnn)3{45}6main()7{intw[10][10]={{33,33,33,33},{44,44,44,44},{55,55,55,55}},i,j;8inta[100]={0),n=0;voidNONO();9printf(’’Thematrix:\n’’);10for(i=0;i<3;i++)11{for(j=0;j<4;j++)printf(’’%3d’’,w[i][j]);12printf(’’\n’’);13}14fun(w,a,&n,3,4);15printf(’’TheAarray:\n’’);16for(i=0;i<n;i++)printf(’’%3d’’,a[i]);printf(’’\n\n’’);17NONO();18}19voidNONO()20{/*请在此函数内打开文件,输入测试数据,调用fun函数,输出数据,关闭文件。*/21FILE*rf,*wf;inti,j,k;22intw[10][10],a[100],n=0,mm,nn;23rf=fopen(’’in.dat’’,’’r’’);24wf=fopen(’’out.dat’’,’’w’’);25for(k=0;k<5;K++){26fscanf(rf,’’%d%d’’,&mm,&nn);27for(i=0;i<mm;i++)28for(j=0;j<m;j++)fscanf(rf,’’%d’’,&w[i][j]);29fun(w,a,&n,mm,nn);30for(i=0;i<n;i++)fprintf(wf,’’%3d’’,a[i]);fprintf(wf,’’\n’’);31}}标准答案:1inti,j;2for(i=0;i<mm;i++)3for(j=0;j<nn;j++)4{b[*n]=*(*(s+i)+j);5*n=*n+1;}知识点解析:该程序功能是将M行、N列的二维数组中的数据,按行的顺序依次放到一维数组中。本题中首先要清楚数组元素在通常情况下是按行存放的,而如果要实现按行存放,其对应关系应为:s[0][0],s[0][1],s[0][2],…,s[0][M-1],s[1][0],s[1][1],…,s[N-1][M-1]。国家二级C语言机试(程序设计题)模拟试卷第5套一、程序设计题(本题共5题,每题1.0分,共5分。)1、使用VC++2010打开考生文件夹下prog1中的解决方案。此解决方案的项目中包含一个源程序文件prog1.c。在此程序中,已知学生的记录由学号和学习成绩构成,N名学生的数据已存入a结构体数组中。请编写函数fun,该函数的功能是:找出成绩最低的学生记录,通过形参返回主函数(规定只有一个最低分)。已给出函数的首部,请完成该函数。注意:部分源程序在文件PROG1.C中。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。试题程序:#include<stdio.h>#include<string.h>#include<conio.h>#include<stdlib.h>#defineN10typedefstructss{charnum[10];ints;}STU;fun(STUa[],STU*s){}voidmain(){FILE*wf;STUa[N]={{"A01",81},{"A02",89},{"A03",66},{"A04",87},{"A05",77},{"A06",90},{"A07",79},{"A08",61},{"A09",80),{"A10",71}},m;inti;system("CLS");printf("*****Theoriginaldata*****\n"),for(i=0;i<N;i++)pr2ntf("No=%sMarR=%d\n",a[i].num,a[i].s);fun(a,&m);printf("****THERESULT****\n");printf("Thelowest:%s,%d\n",m.num,m.s);/*********found*********/wf=fopen("out.dat","w");fprintf(wf,"%s,%d",m.num,m.s);fclose(wf);/*********found*********/}标准答案:fun(STUa[],STU*s){inti;*s=a[0];/*先认为第1个值最小*/for(i=0;i<N;i++)/*如果在循环的过程中再发现比第1个值更小的则赋给*s*/if(s﹣>s>a[i].s)*s=a[i];}知识点解析:找出结构体数组元素中的最小值。先认为第1个值最小,即*s=a[0];,如果在循环的过程中发现比第1个值更小的,就将指针s指向该元素,直到找到最小元素。2、已知学生的记录由学号和学习成绩构成,N名学生的数据已存入a结构体数组中。请编写函数fun,该函数的功能是:找出成绩最低的学生记录,通过形参返回主函数(规定只有一个最低分)。已给出函数的首部,请完成该函数。注意:部分源程序在文件PROG1.C中。请勿改动主函数maln和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。试题程序:#include<stdio.h>#include<string.h>#include<conio.h>#include<stdlib.h>#defineN10typedefstructss{charnum[10];ints;}STU;fun(STUa[],STU*s){}voidmain(){FILE*wf;inti;system("CLS");printf("*****Theoriginaldata,*****\n");printf("No=%sMark=%d\n",aprintf("****THERESULT****\n");printf("Thelowest:%s,%d\n",m.num,m.s);/*********found*********/wf=fopen("out.dat","w");fprintf(wf,"%s,%d",m.num,m.s);fclose(wf);}标准答案:fun(STUa[],STU*s){inti;*s=a[0];/*先认为第1个值最小*/for(i=0;i<N;i++)/*如果在循环的过程中再发现比第1个值更小的则赋给*s*/if(s一>s>a[i].s)*s=a[i];}知识点解析:找出结构体数组元素中的最小值。先认为第1个值最小,即*s=a[0];,如果在循环的过程中发现比第1个值更小的,就将指针s指向该元素,直到找到最小元素。另外,本题还涉及结构体中的指向运算符,请考生注意。3、编写一个函数,其功能是:从传入的num个字符中找出最长的一个字符串,并通过形参指针max传回该串地址(用****作为结束输入的标识)。注意:部分源程序在文件PROG1.C中。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。试题程序:#include<conio.h>#include<stdio.h>#include<string.h>#include<stdlib.h>char*fun(char(*a)[81],intnum,char*max){}voidmain(){FILE*wf;charss[10][81],*ps=NULL;chars[3][81]={"abcd","deg","diegns"),*p=NULL;inti=0,n;system("CLS");printf("输入若干个字符串:");gets(ss[i]);puts(ss[i]);while(!strcmp(ss[i],"****")==0)/*用4个星号作为结束输入的标志*/{i++;gets(ss[i]);puts(ss[i]);}n=itps=fun(ss,n,ps);printf"\nmax=%s\n",ps);/******************/wf=fopen("out.dat","w");p=fun(s,3,p);fprintf(wf,"%s",p);fclose(wf);/******************/}标准答案:char*fun(char(*a)[81],intnum,char*max){inti=0;max=a[0];for(i=0;i<num;i++)/*找出最长的一个字符串*/if(str1en(max)<str1en(a[i]))max=a[i];returnmax;/*传回最长字符串的地址*/}知识点解析:解答本题之前,首先应该明白ss是一个指向一维数组的指针变量,max是指向指针的变量,所以引用变量时要注意加上*。本程序使用循环语句遍历字符串数组,使用条件语句判断该字符串是否最长。4、假定输入的字符串中只包含字母和*号。请编写函数fun,它的功能是:除了尾部的*号之外,将字符串中其他*号全部删除。形参p已指向字符串中最后的一个字母。在编写函数时,不得使用C语言提供的字符串函数。例如,字符串中的内容为:****A*BC*DEF*G*******,删除后,字符串中的内容应当是:ABCDEFG*******。注意:部分源程序在文件PROG1.C中。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。#includevoidfun(char*a,char*p){}main(){chars[81],*t;voidNONO();printf("Enterastring:\n");gets(s);t=s;while(*t)t++;t-;while(*t==’*’)t--;fun(s,t);printf("Thestringafterdeleted:\n");puts(s);NONO();}voidNONO(){/*本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。*/FILE*in,*out;inti;chars[81],*t;in=fopen("in.dat","r");out=fopen("out.dat","w");for(i=0;i<10;i++){fscanf(in,"%s",s);t=s;while(*t)t++;t--;while(*t==’*’)t--;fun(s,t);fprintf(out,"%s\n",s);}fclose(in);fclose(out);}标准答案:char*q=a;intj=0;while(*q&&q知识点解析:(1)首先,主函数中使指针移到字符串的最后一个字符,对字符串由串尾开始进行操作。(2)然后,指针由尾开始向头移动,查找第一个非“*”号字符,指针t指向后一个非“*”,即从最后一个非“*”,字符开始的字符都不需要删除,将前面的其他“*”号全部删除后,将尾部的“*”字符往前移动即可。(3)确定了字符数组的最后一个字符非“*”后,调用fun函数,在fun函数中,将原串中由起始位置的字符开始到最后一个非“*”逐个查询该字符是否是“*”字符,如果是则删除,并将后面的字符往前移动;然后将t之后的字符移动到前面,最后在字符串的后面添加“’\0’”即可。5、学生的记录由学号和成绩组成,N名学生的数据已在主函数中放入结构体数组S中,请编写函数fun,它的功能是:按分数的高低排列学生的记录,高分在前。注意:部分源程序在文件PROG1.C文件中。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。1#include<stdio.h>2#defineN163typedefstruct4{charnum[10];5ints;6}STREC;7voidfun(STRECa[])8{9}10main()11{STRECs[N]={{]]GA005’’,85},{’’GA003’’,76},{’’GA002’’,69},{’’GA004’’,85},{’’GA001’’,91},{’’GA007’’,72},{’’GA008’’,64},{’’GA006’’,87},{--GA015’’,85},{’’GA013’’,91},{’’GA012’’,64},{’’GA014’’,91},{’’GA011’’,66},{”GA017”,64},{’’GA018”,64},{’’GA016’’,72}};12inti;FILE*out;13fun(s);14printf(’’Thedataaftersorted:\n’’);15for(i=0;i<N;i++)16{if((i)%4==0)printf(’’\n’’);17printf(’’%s%4d’’,s[i].num,s[i].s);18}19printf(’’\n’’);20out=fopen(’’out.dat’’,’’w’’);21for(i=0;i<N;i++)22{if((i)%4==0&&i)fprintf(out,’’\n’’);23fprintf(out,’’%4d’’,s[i].s);}24fprintf(out,’’\n’’);25fclose(out);}标准答案:1STRECtmp;2inti,j;3for(i=0;i<N;i++)4for(j=i+1;j<N;j++)5if(a[i].s<a[j].s){6tmp-a[i];7a[i]=a[j];8a[j]=tmp;}知识点解析:(1)在fun函数中,通过循环对成绩记录进行排序。(2)首次查找到最大的记录,第二次循环查找第二大的记录,依次实现对成绩记录的排序。国家二级C语言机试(程序设计题)模拟试卷第6套一、程序设计题(本题共5题,每题1.0分,共5分。)1、已知学生的记录由学号和学习成绩构成,N名学生的数据已存入a结构体数组中。请编写函数fun,该函数的功能是:找出成绩最低的学生记录,通过形参返回主函数(规定只有一个最低分)。已给出函数的首部,请完成该函数。注意:部分源程序在文件PROGl.C中。请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。试题程序:#include<stdio.h>#include<string.h>#include<conio.h>#include<stdlib.h>#defineN10typedefstructss{charnum[10];ints;}STU;fun(STUa[],STU*s){}voidmain(){FILE*wf;STUa[N]={{"A01",81},{"A02",A05",77},{"A06",9

温馨提示

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

评论

0/150

提交评论