二级C实习题.docx
《二级C实习题.docx》由会员分享,可在线阅读,更多相关《二级C实习题.docx(49页珍藏版)》请在冰豆网上搜索。
![二级C实习题.docx](https://file1.bdocx.com/fileroot1/2023-1/10/ba994e20-243c-42c2-ac3c-e875c22f74d3/ba994e20-243c-42c2-ac3c-e875c22f74d31.gif)
二级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;ik=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;nprintf("\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;nfprintf(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;kif((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;kif((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;jprintf("%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;jprintf("%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;jt=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("