二级C实习题.docx

上传人:b****6 文档编号:7077451 上传时间:2023-01-17 格式:DOCX 页数:49 大小:64.87KB
下载 相关 举报
二级C实习题.docx_第1页
第1页 / 共49页
二级C实习题.docx_第2页
第2页 / 共49页
二级C实习题.docx_第3页
第3页 / 共49页
二级C实习题.docx_第4页
第4页 / 共49页
二级C实习题.docx_第5页
第5页 / 共49页
点击查看更多>>
下载资源
资源描述

二级C实习题.docx

《二级C实习题.docx》由会员分享,可在线阅读,更多相关《二级C实习题.docx(49页珍藏版)》请在冰豆网上搜索。

二级C实习题.docx

二级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("

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 预防医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1