二级C实习题.docx
- 文档编号:7077451
- 上传时间:2023-01-17
- 格式:DOCX
- 页数:49
- 大小:64.87KB
二级C实习题.docx
《二级C实习题.docx》由会员分享,可在线阅读,更多相关《二级C实习题.docx(49页珍藏版)》请在冰豆网上搜索。
二级C实习题
第一套
(第三套)
第一题:
填空题
一﹑题目要求
下列给定程序中,函数fun的功能是:
求ss所指字符串数组中长度最短的字符串所在的行下标,作为函数值返回,并把其串长放在形参n所指的变量中。
ss所指字符串数组中共有M个字符串,且串长 #include #include #defineM5 #defineN20 intfun(char(*ss)[N],int*n) {inti,k=0,len=N; /**********found**********/ for(i=0;i<___1___;i++) {len=strlen(ss[i]); if(i==0)*n=len; /**********found**********/ if(len___2___*n) {*n=len; k=i; } } /**********found**********/ return(___3___); } main() {charss[M][N]={"shanghai","guangzhou","beijing","tianjing","chongqing"}; intn,k,i; printf("\nTheoriginalstringsare: \n"); for(i=0;i k=fun(ss,&n); printf("\nThelengthofshorteststringis: %d\n",n); printf("\nTheshorteststringis: %s\n",ss[k]); } 二﹑算法分析 本题考查: for循环语句的循环条件;if语句条件表达式;return语句完成函数值的返回。 【解题思路】 (1)题目指出ss所指字符串数组中共有M个字符串,所以第一个空是i (2)要求求长度最短的字符串,*n中存放的是已知字符串中长度最短的字符串的长度,这里将当前字符串长度与*n比较,若小于*n,则将该长度值赋给*n,因此第二个空为len<*n。 (3)将最短字符串的行下标作为函数值返回,变量k储存行下标的值,所以第三个空是k。 第二题: 改错题 一﹑题目要求 下列给定程序中函数fun的功能是: 将tt所指字符串中的小写字母全部改为对应的大写字母,其它字符不变。 例如,若输入"Ab,cD",则输出"AB,CD"。 请改正程序中的错误,使它能得出正确的结果 #include #include char*fun(chartt[]) { inti; for(i=0;tt[i];i++) /**********found***********/ if(('a'<=tt[i])||(tt[i]<='z')) /**********found***********/ tt[i]+=32; return(tt); } main() { chartt[81]; printf("\nPleaseenterastring: "); gets(tt); printf("\nTheresultstringis: \n%s",fun(tt)); } 一﹑错误分析 (1)分析本题可知,要判断字符是否为小写字母,即判断其是否在a~z之间,所以这里需要进行连续的比较,用&&。 (2)从ASCII码表中可以看出,小写字母的ASCII码值比对应大写字母的ASCII值大32。 将字符串中的小写字母改为大写字母的方法是: 从字符串第一个字符开始,根据ASCII码值判断该字母是不是小写字母,若是,则ASCII码值减32即可。 第三题: 编程题 一﹑题目要求 编写函数fun,其功能是: 将所有大于1小于整数m的非素数存入xx所指数组中,非素数的个数通过k返回。 例如,若输入17,则应输出: 4 6 8 9 10 12 14 15 16。 #include voidfun(intm,int*k,intxx[]) { } main() { intm,n,zz[100]; voidNONO(); printf("\nPleaseenteranintegernumberbetween10and100: "); scanf("%d",&n); fun(n,&m,zz); printf("\n\nThereare%dnon-primenumberslessthan%d: ",m,n); for(n=0;n printf("\n%4d",zz[n]); NONO(); } voidNONO() { /*请在此函数内打开文件,输入测试数据,调用fun函数, 输出数据,关闭文件。 */ intm,n,zz[100]; FILE*rf,*wf; rf=fopen("in.dat","r"); wf=fopen("out.dat","w"); fscanf(rf,"%d",&n); fun(n,&m,zz); fprintf(wf,"%d\n%d\n",m,n); for(n=0;n fprintf(wf,"%d\n",zz[n]); fclose(rf); fclose(wf); } 二、算法分析 1、主要数据结构 intm;数据的范围 int*k;返回非素数的个数 intxx[];存放大于1小于m的非素数 2,算法描述 (1)遍历1~m之间的每个数 (2)判断语句用来判断该数是否素数,若不是素数,则将其存入数组中 三、实现代码 voidfun(intm,int*k,intxx[]) { inti,j,n=0; for(i=4;i {for(j=2;j if(i%j==0)break; if(j } *k=n;/*返回非素数的个数*/ } 四、程序测试 程序测试结果正确,要熟记素数的判别方法,需要注意的是函数返回的表达式的类型应该与函数类型一致。 第二套 (第八套) 第一题: 填空题 一﹑题目要求 给定程序中,函数fun的功能是: 统计形参s所指的字符串中数字字符出现的次数,并存放在形参t所指的变量中,最后在主函数中输出。 例如,若形参s所指的字符串为abcdef35adgh3kjsdf7,则输出结果为4。 #include voidfun(char*s,int*t) {inti,n; n=0; /**********found**********/ for(i=0;___1___! =0;i++) /**********found**********/ if(s[i]>='0'&&s[i]<=___2___)n++; /**********found**********/ ___3___; } main() {chars[80]="abcdef35adgh3kjsdf7"; intt; printf("\nTheoriginalstringis: %s\n",s); fun(s,&t); printf("\nTheresultis: %d\n",t); } 二﹑算法分析 【考点分析】 本题考查: for循环语句;if语句条件表达式;指针变量。 【解题思路】 (1)通过for循环语句,来判断是否到字符串结尾,变量i用来存放字符串数组下标,则应填入s[i]。 (2)题目要求判断数字字符,所以此处应填入’9'。 (3)将数字字符个数存入变量t中,这里需注意变量t是指针变量,所以应填入*t=n。 第二题: 改错题 一、题目要求 下列给定程序中函数fun的功能是: 实现两个变量值的交换,规定不允许增加语句和表达式。 例如,变量a中的值原为8,b中的值原为3,程序运行后a中的值为3,b中的值为8。 #include intfun(int*x,inty) { intt; /**************found**************/ t=x;x=y; /**************found**************/ return(y); } main() { inta=3,b=8; printf("%d%d\n",a,b); b=fun(&a,b); printf("%d%d\n",a,b); } 二、错误分析 (1)定义变量t作为中间变量,然后进行数据交换,注意参数x是指针变量,交换时应使用*x,所以应为t=*x;*x=y。 (2)根据代码b=fun(8a,b)可以知道返回值将赋给变量b,而b中应存放交换前**中的值,所以函数应返回变量t。 第三题: 编程题 一、题目要求 编写函数fun,其功能是: 求出1到1000之间能被7或11整除,但不能同时被7和11整除的所有整数,并将其放在a所指的数组中,通过n返回这些数的个数。 #include voidfun(int*a,int*n) { } main() {intaa[1000],n,k; voidNONO(); fun(aa,&n); for(k=0;k if((k+1)%10==0)printf("\n"); elseprintf("%5d",aa[k]); NONO(); } voidNONO() {/*本函数用于打开文件,输入测试数据,调用fun函数,输出数据,关闭文件。 */ intaa[1000],n,k; FILE*fp; fp=fopen("out.dat","w"); fun(aa,&n); for(k=0;k if((k+1)%10==0)fprintf(fp,"\n"); elsefprintf(fp,"%5d",aa[k]); fclose(fp); } 二,算法分析 1、主要数据结构 (1)int*a;求出1到1000之间能被7或11整除,但不能同时被7和11整除的所有整数,并将其放在a所指的数组中。 (2)intn;返回1到1000之间能被7或11整除,但不能同时被7和11整除这些数的个数。 2,算法描述 (1)遍历1~1000之间的每个数 (2)判断1到1000之间能被7或11整除,但不能同时被7和11整除的所有整数,并将其放在a所指的数组中。 三、实现代码 { inti,j=0; for(i=1;i<=1000;i++)/*求1到1000之内能被7或11整除、但不能同时被7和11整除的所有整数,并放入数组a中*/ if((i%7==0||i%11==0)&&i%77! =0) a[j++]=i; *n=j; } 四、程序测试 程序测试结果正确,充分理解"逻辑与"和"逻辑或"的区别;for循环语句的循环变量用来控制取值范围。 第三套 (第十三套) 第一题: 填空题 一﹑题目要求 下列给定程序中,函数fun的功能是: 有N×N矩阵,根据给定的m(m<=N)值,将每行元素中的值均向右移动m个位置,左位置为0。 例如,N=3,m=2,有下列矩阵 1 2 3 4 5 6 7 8 9 程序执行结果为 0 0 1 0 0 4 0 0 7 请在下划线处填入正确的内容并将下划线删除,使程序得出正确的结果。 #include #defineN4 voidfun(int(*t)[N],intm) {inti,j; /**********found**********/ for(i=0;i {for(j=N-1-m;j>=0;j--) /**********found**********/ t[i][j+___2___]=t[i][j]; /**********found**********/ for(j=0;j<___3___;j++) t[i][j]=0; } } main() {intt[][N]={21,12,13,24,25,16,47,38,29,11,32,54,42,21,33,10},i,j,m; printf("\nTheoriginalarray: \n"); for(i=0;i {for(j=0;j printf("%2d",t[i][j]); printf("\n"); } printf("Inputm(m<=%d): ",N);scanf("%d",&m); fun(t,m); printf("\nTheresultis: \n"); for(i=0;i {for(j=0;j printf("%2d",t[i][j]); printf("\n"); } } 二﹑算法分析 【考点分析】 本题考查: for循环语句;数组元素的引用。 【解题思路】 (1)循环语句中,循环变量i增量为1,所以空应填i++。 (2)将每行元素中的值均右移m个位置,所以数组元素的下标是t[i][j+m]。 (3)此for循环语句实现左边元素置0操作,所以j的取值范围是0到m。 第二题: 改错题 一﹑题目要求 下列给定程序中函数fun的功能是: 计算并输出high以内最大的10个素数的和。 high的值由主函数传给fun函数。 例如,若high的值为100,则函数的值为732。 请改正程序中的错误,使程序能输出正确的结果。 #include #include intfun(inthigh) {intsum=0,n=0,j,yes; /************found************/ while((high>=2)&&(n<10) {yes=1; for(j=2;j<=high/2;j++) if(high%j==0){ /************found************/ yes=0;break } if(yes){sum+=high;n++;} high--; } returnsum; } main() { printf("%d\n",fun(100)); } 二、错误分析 (1)while循环条件丢掉一个括号,所以应该为)while((high>=2)&&(n<10)) (2)另一处是很简单的程序语法错误,没有加分号所以应该为yes=0;break;。 第三题: 编程题 一、题目要求 编写函数fun,其功能是: 利用下面的简单迭代方法求方程cos(x)-x=0的一个实根。 迭代步骤如下: (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的一个实根,作为函数值返回。 #include #include doublefun() { } main() { voidNONO(); printf("Root=%f\n",fun()); NONO(); } voidNONO() {/*本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */ FILE*wf; wf=fopen("out.dat","w"); fprintf(wf,"%f\n",fun()); fclose(wf); } 二,算法分析 1、主要数据结构 doublex0,x1; 记录方程的跟 迭代法求方程的实根;do…while循环语句 2、算法描述 本题考查: 迭代法求方程的实根;do…while循环语句,其形式为: do{ 语句 }while(表达式); do…while循环与while循环的不同在于,它先执行循环中的语句,然后再判断表达式是否为真,如果为真则继续循环;如果为假,则终止循环。 因此,do…while循环至少要执行一次循环语句。 三、实现代码 doublefun() { doublex0,x1; x1=0.0; do { x0=x1; x1=cos(x0); }while(fabs(x0-x1)>=1e-6); returnx1; } 四、程序测试 程序测试结果正确,用迭代方法求方程的一个实根,题目已经给出了算法,只要按照算法用合适的程序表达,就可以解题了,do…while循环至少要执行一次循环语句。 第四套 (第十八套) 第一题: 填空题 一、题目要求 下列给定程序中,函数fun的功能是: 把形参s所指字符串中下标为奇数的字符右移到下一个奇数位置,最右边被移出字符串的字符绕回放到第一个奇数位置,下标为偶数的字符不动(注: 字符串的长度大于等于2)。 例如,形参s所指字符串为abcdefgh,执行结果为ahcbedgf。 请在下划线处填入正确的内容并将下划线删除,使程序得出正确的结果。 #include voidfun(char*s) {inti,n,k;charc; n=0; for(i=0;s[i]! ='\0';i++)n++; /**********found**********/ if(n%2==0)k=n-___1___; elsek=n-2; /**********found**********/ c=___2___; for(i=k-2;i>=1;i=i-2)s[i+2]=s[i]; /**********found**********/ s[1]=___3___; } main() {chars[80]="abcdefgh"; printf("\nTheoriginalstringis: %s\n",s); fun(s); printf("\nTheresultis: %s\n",s); } 二、算法分析 【考点分析】 本题考查: 指针型变量;if…else语句;赋值语句。 【解题思路】 (1)函数fun中变量n统计字符的长度,假如长度为偶数,则k=n-1;假如长度为奇数,则k=n-2,使得下标为奇数的最后一个元素有效(不是′\0′),空应该为1。 (2)了解变量k的作用后,则将最右边的奇数位置的数赋值给变量c,空应该为s[k]或*(s+k)。 (3)将最后一个下标为奇数的元素移到第一个奇数位置,空应该为c。 第二题: 改错题 一、题目要求 下列给定程序中fun函数的功能是: 求表达式 s=aa…aa-…-aaa-aa-a (此处aa…aa表示n个a,a和n的值在1至9之间) 例如,a=3,n=6,则以上表达式为: s=333333-33333-3333-333-33-3 其值是296298。 a和n是fun函数的形参,表达式的值作为函数值传回main函数。 请改正程序中的错误,使它能计算出正确的结果。 #include longfun(inta,intn) {intj; /**************found**************/ longs=0,t=1; for(j=0;j t=t*10+a; s=t; for(j=1;j /**************found**************/ t=t%10; s=s-t; } return(s); } main() {inta,n; printf("\nPleaseenteraandn: "); scanf("%d%d",&a,&n); printf("Thevalueoffunctionis: %ld\n",fun(a,n)); } 二、错误分析 (1)t用来存放每次循环后的多位数,第一次循环时,t应当是个位数,所以t的初始值应为0。 (2)根据题意,这里不需要求余数,而是要去掉个位数,重新组合一个数,因此应用除法运算。 第三题: 编程题 一、题目要求 编写函数voidfun(char*tt,intpp[]),统计在tt所指的字符串中'a'到'z'26个小写字母各自出现的次数,并依次放在pp所指的数组中。 例如,当输入字符串abcdefgabcdeabc后,程序的输出结果应该是: 33322110000000000000000000 #include #include voidfun(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("
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 二级 实习