模拟试题改.docx
- 文档编号:30473487
- 上传时间:2023-08-15
- 格式:DOCX
- 页数:18
- 大小:19.71KB
模拟试题改.docx
《模拟试题改.docx》由会员分享,可在线阅读,更多相关《模拟试题改.docx(18页珍藏版)》请在冰豆网上搜索。
模拟试题改
模拟试题
1.编程题
请编写函数fun(),该函数的功能是:
移动一维数组中的内容,若数组中有n个整数,要求把下标从p到n-1(p≤n-1)的数组元素平移到数组的前面。
例如,一维数组中的原始内容为1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,p的值为6。
移动后,一维数组中的内容应为7,8,9,10,10,11,12,13,14,15,1,2,3,4,5,6。
注意:
部分源程序给出如下。
请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
试题程序:
#include
#defineN80
voidfun(int*w,intp,intn)
{
}
main()
{
inta[N]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
inti,p,n=15;
printf("Theoriginaldata:
\n");
for(i=0;i printf("%3d",a[i]); printf("\n\nEnterp: "); scanf("%d",&p); fun(a,p,n); printf("\nThedataaftermoving: \n"); for(i=0;i printf("%3d",a[i]); printf("\n\n"); } 答案及评析: voidfun(int*w,intp,intn) { inti,j,t; for(i=p;i<=n-1;i++)/*循环右移n-p次*/ {t=w[n-1]; for(j=n-2;j>=0;j--)/*实现循环右移*/ w[j+1]=w[j]; w[0]=t; } } 【解析】本题采用"循环右移"的算法。 和我们在前面分析的稍有不同的是,一个是整型数组,一个是字符型数组。 2.编程题 学生的记录由学号和成绩组成,N名学生的数据已在主函数中放入结构体数组s中,请编写函数fun(),它的功能是: 把分数最低的学生数据放在h所指的数组中。 注意: 分数低的学生可能不只一个,函数返回分数最低学生的人数。 注意: 部分源程序给出如下。 请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。 试题程序: #include #defineN16 typedefstruct {charnum[10]; ints; }STREC; intfun(STREC*a,STREC*b) { } main() { STRECs[N]={{"GA005",82},{"GA003",75},{"GA002",85},{"GA004",78}, {"GA001",95},{"GA007",62},{"GA008",60},{"GA006",85}, {"GA015",83},{"GA013",94},{"GA012",78},{"GA014",97}, {"GA011",60},{"GA017",65},{"GA018",60},{"GA016",74}}; STRECh[N]; inti,n; FILE*out; n=fun(s,h); printf("The%dlowestscore: \n",n); for(i=0;i printf("%s%4d\n",h[i].num,h[i].s);/*输出最低分学生的学号和成绩*/ printf("\n"); out=fopen("out19.dat","w"); fprintf(out,"%d\n",n); for(i=0;i fprintf(out,"%4d\n",h[i].s); fclose(out); } 答案及评析: intfun(STREC*a,STREC*b) { inti,j=0,min=a[0].s; for(i=0;i if(min>a[i].s) min=a[i].s;/*找出最小值*/ for(i=0;i if(min==a[i].s) b[j++]=a[i];/*找出成绩与min相等的学生的记录,存入结构体b中*/ returnj;/*返回最低成绩的学生人数*/ } 【解析】该程序使用循环嵌套,第1个for语句的作用是找出最小值。 第2个循环的作用是找出与min相等的成绩,也即最低成绩的学生记录,并存入b中。 3.编程题 请编写一个函数fun(),它的功能是: 求出一个4×M整型二维数组中最小元素的值,并将此值返回调用函数。 注意: 部分源程序给出如下。 请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。 试题程序: #defineM4 #include fun(inta[][M]) { } main() { intarr[4][M]={11,3,9,35,42,-4,24,32,6,48,-32,7,23,34,12,-7}; printf("min=%d\n",fun(arr)); } 答案及评析: fun(inta[][M]) { inti,j,min=a[0][0]; for(i=0;i<4;i++) for(j=0;j if(min>a[i][j]) min=a[i][j];/*求出二维数组的最小值*/ returnmin; } 【解析】此类求最大值或最小值的C语言问题,我们可以采用逐个比较的方式。 要求数组中的所有元素走动一遍,并从中找出最大、最小值,要注意一开始应使min存放数组中的第一个元素的值。 可按逐行查找也可按逐列查找的方式,本题采用的是逐行查找的方式。 即行下标在外层循环,列下标在内层循环,因为在循环的嵌套中越在内层循环,循环变化就越快。 4.编程题 请编写一个函数fun(),它的功能是: 将ss所指字符串中所有下标为偶数位置的字母转换为小写(若该位置上不是字母,则不转换)。 例如,若输入ABC4efG,则应输出aBc4efg。 注意: 部分源程序给出如下。 请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。 试题程序: #include #include #include voidfun(char*ss) { } main() { chartt[81]; clrscr(); printf("\nPleaseenteranstringwithin80characters: \n"); gets(tt); printf("\n\nAfterchanging,thestring\n\%s",tt); fun(tt); printf("\nbecomes\n\%s\n",tt); } 答案及评析: voidfun(char*ss) { inti; for(i=0;ss[i]! ='\0';i++)/*将ss所指字符串中所有下标为偶数位置的字母转换为小写*/ if(i%2==0&&ss[i]>='A'&&ss[i]<='Z') ss[i]=ss[i]+32; } 【解析】从C语言的学习中我们知道,只要将小写字母减去32则转成大写字母,将大写字母加上32则转成小写字母。 该程序是用if语句实现该功能转化的。 5.编程题 请编写函数fun(),它的功能是: 求出1到1000之内能被5或13整除、但不能同时被5和13整除的所有整数并将它们放在a所指的数组中,通过n返回这些数的个数。 注意: 部分源程序给出如下。 请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。 试题程序: #include #include voidfun(int*a,int*n) { } main() { intaa[1000],n,k; clrscr(); fun(aa,&n); for(k=0;k if((k+1)%10==0) { printf("%5d",aa[k]); printf("\n");/*一行写10个数*/ } else printf("%5d",aa[k]); } 答案及评析: voidfun(int*a,int*n) { inti,j=0; for(i=1;i<=1000;i++)/*求1到1000之内能被5或13整除、但不能同时被5和13整除的所有整数,并放入数组a中*/ if((i%5==0||i%13==0)&&i%65! =0) a[j++]=i; *n=j;/*传回满足条件的数的个数*/ } 【解析】注意本题题目是找出能被5或13整除但不能同时被5和13整除的所有整数。 能同时被5和13整除的整数一定能被65整除,且不能被65整除的数不一定就是能被5或13整除的数。 所以可得出程序中的if()。 按运算优先级可知(i%5==0||i%13==0),注意,两边必须要有小括号。 6.编程题 请编写一个函数fun(),它的功能是: 比较两个字符串的长度,(不得调用C语言提供的求字符串长度的函数),函数返回较短的字符串。 若两个字符串长度相等,则返回第1个字符串。 例如,输入nanjing 注意: 部分源程序给出如下。 请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。 试题程序: #include char*fun(char*s,char*t) { } main() { chara[20],b[10],*p,*q; inti; printf("Input1thstring: "); gets(a); printf("Input2thstring: "); gets(b); printf("%s",fun(a,b)); } 答案及评析: char*fun(char*s,char*t) { inti,j; for(i=0;s[i]! ='\0';i++);/*求字符串的长度*/ for(j=0;t[j]! ='\0';j++); if(i<=j)/*比较两个字符串的长度*/ returns;/*函数返回较短的字符串,若两个字符串长度相等,则返回第1个字符串*/ else returnt; } 【解析】本题中,第1个for循环的作用是求出s的字符个数i,第2个for循环的作用是求出t的字符个数j,因为任何循环都要控制一条语句,所以在每一个for循环条件后面必须要有一个分号。 本题也可用如下技巧: #include char*fun(char*s,char*t) { if(strlen(s)>=strlen(t) returns; elsereturnt; } 7.编程题 N名学生的成绩已在主函数中放入一个带头节点的链表结构中,h指向链表的头节点。 请编写函数fun(),它的功能是: 找出学生的最低分,由函数值返回。 注意: 部分源程序给出如下。 请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。 试题程序: #include #include #defineN8 structslist {doubles; structslist*next; }; typedefstructslistSTREC; doublefun(STREC*h) { } STREC*creat(double*s) { STREC*h,*p,*q; inti=0; h=p=(STREC*)malloc(sizeof(STREC)); p->s=0; while(i {q=(STREC*)malloc(sizeof(STREC)); p->s=s[i];i++;p->next=q;p=q; } p->next=NULL; returnh;/*返回链表的首地址*/ } outlist(STREC*h) { STREC*p; p=h; printf("head"); do {printf("->%2.0f",p->s);p=p->next;}/*输出各分数*/ while(p! =NULL); printf("\n\n"); } main() { doubles[N]={56,89,76,95,91,68,75,85},min; STREC*h; h=creat(s); outlist(h); min=fun(h); printf("min=%6.1f\n",min); } 答案及评析: doublefun(STREC*h) { doublemin=h->s; while(h! =NULL)/*通过循环找到最低分数*/ {if(min>h->s) min=h->s; h=h->next; } returnmin; } 【解析】在本题中,h为一个指向结构体的指针变量,若要引用它所指向的结构体中的某一成员时,要用指向运算符"->"。 由于是链表,所以要使h逐一往后移动,使用的是h=h->next。 8.编程题 下列程序定义了N×N的二维数组,并在主函数中赋值。 请编写函数fun(),函数的功能是: 求出数组周边元素的平方和并作为函数值返回给主函数中的s。 例如: 若a数组中的值为 a=01279 1112155 2216111 979102 54141 则返回主程序后s的值应为310。 注意: 部分源程序给出如下。 请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。 试题程序: #include #include #include #defineN5 intfun(intw[][N]) { } main() { inta[N][N]={0,1,2,7,9,1,11,21,5,5,2,21,6,11,1,9,7,9,10,2,5,4,1,4,1}; inti,j; ints; clrscr(); printf("*****Thearray*****\n"); for(i=0;i {for(j=0;j {printf("%4d",a[i][j]);} printf("\n"); } s=fun(a); printf("*****THERESULT*****\n"); printf("Thesumis: %d\n",s); } 答案及评析: intfun(intw[][N]) { inti,j,k=0; ints=0; for(i=0;i for(j=0;j if(i==0||i==N-1||j==0||j==N-1)/*只要下标中有一个为0或N-1,则它一定是周边元素*/ {s=s+w[i][j]*w[i][j];/*将周边元素求平方和*/ } returns;/*返回周边元素的平方和*/ } 【解析】该题采用逐一判断的方式,周边元素的下标一定有一个是0或N-1,且只要下标中有一个为0或N-1,则它一定是周边元素。 9.编程题 下列程序定义了N×N的二维数组,并在主函数中自动赋值。 请编写函数fun(inta[][N]),该函数的功能是: 使数组右上半三角元素中的值全部置成0。 例如a数组中的值为 a=456 179 326, 则返回主程序后a数组中的值应为 000 100 320 注意: 部分源程序给出如下。 请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。 试题程序: #include #include #include #defineN5 intfun(inta[][N]) { } main() { inta[N][N],i,j; clrscr(); printf("*****Thearray*****\n"); for(i=0;i {for(j=0;j {a[i][j]=rand()%10; printf("%4d",a[i][j]); } printf("\n"); } fun(a); printf("THERESULT\n"); for(i=0;i {for(j=0;j printf("%4d",a[i][j]); printf("\n");}} 答案及评析: intfun(inta[][N]) { inti,j; for(i=0;i for(j=i;j a[i][j]=0;/*将数组右上半三角元素中的值全部置成0*/ } 【解析】本题旨在考查控制数组中右上半三角元素的算法,也就是两个千篇一律的循环语句,希望学习者能够掌握消化。 10.编程题 请编写一个函数intfun(int*s,intt,int*k),用来求出数组的最小元素在数组中的下标并存放在k所指的存储单元中。 例如,输入如下整数: 234345753134436458100321135760 则输出结果为6,100。 注意: 部分源程序给出如下。 请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。 试题程序: #include #include intfun(int*s,intt,int*k) { } main() { inta[10]={234,345,753,134,436,458,100,321,135,760},k; clrscr(); fun(a,10,&k); printf("%d,%d\n",k,a[k]); } 答案及评析: intfun(int*s,intt,int*k) { inti; *k=0;/*k所指的数是数组的下标值*/ for(i=0;i if(s[*k]>s[i]) *k=i;/*找到数组的最小元素,把该元素的下标赋给k所指的数*/ returns[*k];/*返回数组的最小元素*/ } 【解析】本题中直接使用指针变量k,但在使用时要注意对k的指针运算,此外,一开始应让*k的值为数组中的某一下标值,即*k=0。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 模拟 试题