c语言训练题.docx
《c语言训练题.docx》由会员分享,可在线阅读,更多相关《c语言训练题.docx(62页珍藏版)》请在冰点文库上搜索。
c语言训练题
请补充main函数,该函数的功能是:
输出一个矩阵,要求非周边元素赋值0,周边元素赋值1。
注意:
部分源程序给出如下。
请勿改动main函数和其他函数中的任何内容,仅在main函数的横线上填入所编写的若干表达式或语句。
试题程序:
#include
#include
#defineN10
voidmain()
{
intbb[N][N];
intI,j,n;
system("CLS");
printf("\nInputn:
\n");
scanf("%d",&n);
for(I=0;I for(j=0;j {
if(【1】)
bb[I][j]=1;
else
【2】;
}
printf("\n***theresult***\n");
for(I=0;I{
printf("\n\n");
for(j=0;j printf("%4d",bb[I][j]);
}
}
【参考答案】
(1)i==0||i==n-1||j==0||j==n-1
(2)bb[i][j]=0【考点分析】
本题考查:
if条件语句,一般需根据题意确定条件表达式。
数组元素下标及其赋值语句,通过二维数组的下标如何表示其周边元素和非周边元素。
【解题思路】
填空1:
用二维数组表示矩阵时,周边元素是行下标为0或n-1,列下标为0或n-1的元素,判断时四个条件中只要有一个条件满足,那么该元素就是周边元素,所以用"||"运算符。
填空2:
题目要求将非周边元素赋值为0,所以b[i][j]=0。
【解题宝典】
二维数组周边元素的表示方法,通过设定数组下标来完成,如何表示呢?
我们举个简单的例子来看看,有二维数组a[3][3],我们列出它的所有数组元素:
a[0][0],a[0][1],a[0][2]
a[1][0],a[1][1],a[1][2]
a[2][0],a[2][1],a[2][2]
那么,周边元素有a[0][0],a[0][1],a[0][2],a[1][0],a[1][2],a[2][0],a[2][1],a[2][2]。
如果把a[3][3]改为a[i][j],现在我们就不难表示出该数组的周边元素3。
下列给定程序中,函数fun的功能是:
用递归算法计算斐波拉契级数列中第n项的值。
从第一项起,斐波拉契级数序列为1,1,2,3,5,8,13,21,…例如,若给n输入7,该项的斐波拉契级数值为13。
请改正程序中的错误,使它能得出正确的结果。
注意:
不要改动main函数,不得增行或删行,也不得更改程序的结构。
试题程序:
#include
longfun(intg)
{
/*************found**************/
switch(g);
{case0:
return0;
/*************found**************/
case1;case2:
return1;
}
return(fun(g-1)+fun(g-2));
}
voidmain()
{
longfib;intn;
printf("Inputn:
");scanf("%d",&n);
printf("n=%d\n",n);
fib=fun(n);
printf("fib=%d\n\n",fib);
}
【参考答案】
(1)错误:
switch(g);正确:
去掉分号
(2)错误:
case1;case2:
return1;
正确:
case1:
case2:
return1;
【考点分析】
switch语句,其一般形式为:
switch(表达式)
{
case常量表达式1:
语句1;
case常量表达式2:
语句2;
…
case常量表达式n:
语句n;
default:
语句n+1;
}"
其中,switch(表达式)后不带有";",同时case语句常量后应该是":
"。
【解题思路】
C语言中,switch语句之后不能有分号,并且case语句常量后该用是冒号。
请编写函数fun,函数的功能是:
求出二维数组周边元素之和,作为函数值返回。
二维数组中的值在主函数中赋予。
例如,若二维数组中的值为
13579
29994
69998
13570
则函数值为61。
注意:
部分源程序给出如下。
请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
试题程序:
#include
#include
#include
#defineM4
#defineN5
intfun(inta[M][N])
{
}
voidmain()
{
FILE*wf;
intaa[M][N]={{1,3,5,7,9},{2,9,9,9,4},{6,9,9,9,8},{1,3,5,7,0}};
inti,j,y;
system("CLS");
printf("Theoriginaldatais:
\n");
for(i=0;i {for(j=0;j printf("%6d",aa[i][j]);
printf("\n");
}
y=fun(aa);
printf("\nThesun:
%d\n",y);
printf("\n");
/******************************/
wf=fopen("out.dat","w");
fprintf(wf,"%d",y);
fclose(wf);
/*****************************/
}
【参考答案】
intfun(inta[M][N])
{
inti,j,sum=0;
for(i=0;i for(j=0;j if(i==0||i==M-1||j==0||j==N-1)/*只要下标中有一个为0或M-1或N-1,则它一定是周边元素*/
sum=sum+a[i][j];/*将周边元素相加*/
returnsum;
}
【考点分析】
本题考查:
二维数组,其元素也称为双下标变量;for循环语句根据数组元素的下标进行循环操作;if语句确定周边元素是否符合题目要求。
【解题思路】
本题采用逐一判断的方式,周边元素的下标一定有一个是0或M-1或N-1,且只要下标中有一个为0或M-1或N-1,则它一定是周边元素。
【解题宝典】
分析题干,二维数组周边元素求和,充分考查了二维数组元素下标相关知识。
需掌握如何表示二维数组周边元素,对于m*n二维数组,我们可以通过以下代码实现周边元素的表示:
for(i=0;ifor(j=0;j if(i==0||i==m-1||j==0||j==n-1)
其中,i、j两个循环变量控制二维数组的下标变化。
请补充main函数,该函数的功能是:
从键盘输入一个字符串及一个指定字符,然后把这个字符及其后面的所有字符全部删除。
结果仍然保存在原串中。
例如,输入"abcdef",指定字符为"e",则输出"abcd"。
注意:
部分源程序给出如下。
请勿改动main函数和其他函数中的任何内容,仅在main函数的横线上填入所编写的若干表达式或语句。
试题程序:
#include
#include
#defineN80
voidmain()
{
intI=0;
charstr[N];
charch;
system("CLS");
printf("\nInputastring:
\n");
gets(str);
printf("\nInputacharator;\n");
scanf("%c",&ch);
while(str[I]!
='\0')
{
if(str[I]==ch)
【1】
【2】;
}
str[I]=【3】;
printf("\n***displaystring***\n");
puts(str);
}
【参考答案】
(1)break;
(2)i++或++i或i+=1或i=i+1
(3)'\0'
【考点分析】
本题考查:
break语句,通常用在循环语句和开关语句中。
当break用于开关语句switch中时,可使程序跳出switch而执行以后的语句。
当break语句用于for、while、do-while循环语句时,可使程序终止循环而执行循环后面的语句,通常break语句总是与if语句一起使用,即满足条件时便跳出循环;字符串结束标识'\0',上机考试时经常考查。
【举一反三】
填空1:
while循环的作用是找到字符串str中与指定字符ch相同的字符。
当找到的时候,就使用break语句跳出循环。
填空2:
通过i++依次访问字符串str中的各个字符。
填空3:
在字符串str中与指定字符ch相同的字符位置上赋值'\0',这样输出字符串str时,就不会输出指定字符及其后面的所有字符了。
下列给定程序中,函数fun的功能是:
求出数组中最大数和次最大数,并把最大数和a[0]中的数对调、次最大数和a[1]中的数对调。
请改正程序中的错误,使它能得出正确的结果。
注意:
不要改动main函数,不得增行或删行,也不得更改程序的结构。
试题程序:
#include
#include
#define N 20
/*************found**************/
voidfun(int*a,intn);
{
intI,m,t,k;
for(I=0;I {
/*************found**************/
m=0;
for(k=I+1;k if(a[k]>a[m])
m=k;
t=a[I];
a[I]=a[m];
a[m]=t;
}
}
main()
{
intb[N]={11,5,12,0,3,6,9,7,10,8},n=10,i;
system("CLS");
for(i=0;i printf("%d",b[i]);
printf("\n");
fun(b,n);
for(i=0;i printf("%d",b[i]);
printf("\n");
}
【参考答案】
(1)错误:
voidfun(int*a,intn);
正确:
voidfun(int*a,intn)
(2)错误:
m=0; 正确:
m=i;
【考点分析】
本题考查:
函数定义的一般形式,定义函数时不应该带有";"。
【解题思路】
(1)简单的语法错误。
(2)这是一段简单的比较程序,m作为一个比较数的下标。
从下面的程序可以看出,m=i。
编写函数fun,它的功能是:
利用以下所示的简单迭代方法求方程cos(x)-x=0的一个实根。
xn+1=cos(xn)
迭代步骤如下:
(1)取x1初值为0.0;
(2)x0=x1,把x1的值赋给x0;
(3)x1=cos(x0),求出一个新的xl;
(4)若x0-x1,的绝对值小于0.000001,则执行步骤(5),否则执行步骤
(2);
(5)所求x1就是方程cos(x)-x=0的一个实根,作为函数值返回。
程序将输出结果Root=0.739085。
注意:
部分源程序给出如下。
请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
试题程序:
#include
#include
#include
floatfun()
{
}
main()
{
FILE*out;
floatf=fun();
printf("Root=%f\n",f);
/******************************/
out=fopen("out.dat","w");
fprintf(out,"%f",f);
fclose(out);
/******************************/
}
【参考答案】
floatfun()
{
floatx1=0.0,x0;
do
{
x0=x1;
x1=cos(x0);
}while(fabs(x0-x1)>=1e-6);
returnx1;
}
【考点分析】
do……while循环语句,其形式为:
do{
语句
}while(表达式);
这个循环与while循环的不同在于:
它先执行循环中的语句,然后再判断表达式是否为真。
如果为真则继续循环,如果为假,则终止循环。
因此,do-while循环至少要执行一次循环语句。
【解题思路】
函数fun的功能是用迭代方法求方程的一个实根,结果由函数值返回。
题目已经给出了算法,只要按照算法用合适的程序表达,就可以解题了。
请补充main函数,该函数的功能是:
从键盘输入3个整数,然后找出最大的数并输出。
例如,输入12,45,43,最大值为45。
注意:
部分源程序给出如下。
请勿改动main函数和其他函数中的任何内容,仅在main函数的横线上填入所编写的若干表达式或语句。
试题程序:
#include
#include
#include
voidmain()
{
inta,b,c,max;
system("CLS");
printf("\nInputthreenumbers:
\n");
scanf("%d,%d,%d",&a,&b,&c);
printf("Thethreenumbersare:
%d,%d,%d\n",a,b,c);
if(a>b)
【1】;
else
【2】;
if(max 【3】;
printf("max=%d\n",max);
}
【参考答案】
(1)max=a
(2)max=b (3)max=c
【考点分析】
本题考查:
求最大数算法,通过if语句,进行条件比较,判断两数中的较大数,再用比较大数与第三数比较,得到三数中的最大数。
【解题思路】
填空1:
如果a>b,则a为a和b中的最大值,将a赋给max。
填空2:
如果a
填空3:
最后将a和b中的最大值与c进行比较,如果c更大,则c为3个数中的最大数,将c赋给max,否则最大数max不变。
下列给定程序中,函数fun的功能是:
将十进制正整数m转换成k进制数,并按位输出。
例如,若输入8和2,则应输出1000(即十进制数8转换成二进制表示是1000)。
请改正函数fun中的错误,使它能得出正确的结果。
注意:
不要改动main函数,不得增行或删行,也不得更改程序的结构。
试题程序:
#include
#include
/*************found**************/
voidfun(intm,intk);
{intaa[20],i;
for(i=0;m;i++)
{
/*************found**************/
aa[i]=m/k;
m/=k;
}
for(;i;i--)
/*************found**************/
printf("%d",aa[i]);
}
main()
{
intb,n;
printf("\nPleaseenteranumberandabase:
\n");
scanf("%d%d",&n,&b);
fun(n,b);
printf("\n");
}
【参考答案】
(1)错误:
voidfun(intm,intk);
正确:
voidfun(intm,intk)
(2)错误:
aa[i]=m/k;
正确:
aa[i]=m%k;
(3)错误:
printf("%d",aa[i]);
正确:
printf("%d",aa[i-1]);
【考点分析】
本题考查:
函数定义的一般形式,定义函数时不应该带有";";求余运算,注意求余运算与整除运算的区别。
【解题思路】
(1)简单的语法错误。
(2)将十进制正整数转换成任意进制的数和十进制正整数转换成二进制的数的方法是一样的。
从整数n译出它的各位k进制数值,需采用除k取余的方法,即求n除k的余数,得到它的k进制的个位数,接着将n除以k。
在n不等于0的状况下循环,按顺序求出n的k进制的各个位上的数。
(3)在进行for(i=0;m;i++)循环结束时,i已经多加了一个1,所以这里要减去1。
【解题宝典】
进制转换,对于k进制转成十进制的方法,可以通过按权求和的方法来完成,对于十进制转成k进制的方法,我们可以通过除k取余的方法来完成。
假定输入的字符串中只包含字母和*号。
请编写函数fun,它的功能是:
将字符串中的前导*号全部删除,中间和后面的*号不删除。
例如,若字符串中的内容为****A*BC*DEF*G*******,删除后,字符串中的内容则应当是A*BC*DEF*G*******。
注意:
部分源程序给出如下。
请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
试题程序:
#include
#include
voidfun(char*a)
{
}
voidmain()
{
FILE*wf;
chars[81],t[81]="****A*BC*DEF*G*******";
printf("Enterastring:
\n");
gets(s);
fun(s);
printf("Thestringafterdeleted:
\n");puts(s);
/******************************/
wf=fopen("out.dat","w");
fun(t);
fprintf(wf,"%s",t);
fclose(wf);
/*****************************/
}
【参考答案】
voidfun(char*a)
{
char*p=a;
while(*p=='*')
p++;
/*指针p指向字符串第一个字母*/
for(;*p!
='\0';p++,a++)
*a=*p;
/*从第一个字母开始,其后的字符都放入指针a所指的字符串中*/
*a='\0';
/*在字符串最后加上结束标记符*/
}
【考点分析】
本题考查:
将字符串的前导*号删除,即可以通过while循环语句、for循环语句进行循环操作,将前导*号后面字符重新储存。
字符串结束标识'\0'。
【解题思路】
根据题意需删除给定字符串中的前导*号,那么需要使用指针型变量来完成该操作,当指针指向第一个非*号,即可把后面的所有字符都存到一个新串中。
我们在此提供另一种解答方法。
#include
voidfun(char*a)
{
char*p=a;
while(*p=='*')
p++;
strcpy(a,p);
}
函数fun的功能是:
从三个形参a、b、c中找出中间的数,作为函数值返回。
例如,当a=3,b=5,c=4时,中间的数为4。
注意:
部分源程序给出如下。
请勿改动main函数和其他函数中的任何内容,仅在函数fun的横线上填入所编写的若干表达式或语句。
试题程序:
#include
intfun(inta,intb,intc)
{intt;
t=(a>b)?
(b>c?
b:
(a>c?
c:
【1】))
:
((a>c)?
【2】
:
((b>c)?
c:
【3】));
returnt;
}
main()
{
inta1=3,a2=5,a3=4,r;
r=fun(a1,a2,a3);
printf("\nThemiddlenumberis:
%d\n",r);
}
【参考答案】
(1)a
(2)a (3)b
【考点分析】
本题考查:
条件表达式,其一般形式为"表达式1?
表达式2:
表达式3"。
其求值规则为:
如果表达式1的值为真,则以表达式2的值作为条件表达式的值,否则以表达式3的值作为整个条件表达式的值。
【解题思路】
该题目给定语句没有使用if语句,而是直接使用条件表达式,如"max=(a>b)?
a:
b;",执行该语句的语义是:
如a>b为真,则把a赋予max,否则把b赋予max。
下列给定程序中,函数fun的功能是:
计算函数F(x,y,z)=(x+y)/(x-y)+(z+y)/(z-y)的值。
其中x和y不相等,z和y不等。
例如,当x的值为9,y的值为11,z的值为15时,函数值为-3.50。
请改正程序中的错误,使它能得出正确的结果。
注意:
不要改动main函数,不得增行或删行,也不得更改程序的结构。
试题程序:
#include
#include
#include
/*************found**************/
#defineFU(m,n)(m/n)
floatfun(floata,floatb,float