c语言常见习题.docx
《c语言常见习题.docx》由会员分享,可在线阅读,更多相关《c语言常见习题.docx(12页珍藏版)》请在冰点文库上搜索。
c语言常见习题
求公约数
下列给定程序中函数fun的功能是:
求两个非零正整数的最大公约数,并作为函数值返回。
例如,若num1和num2分别为49和21,则输出的最大公约数为7;若num1和num2分别为27和81,则输出的最大公约数为27。
请改正程序中的错误,使它能得出正确结果。
注意:
部分源程序在文件MODI1.C中,不得增行或删行,也不得更改程序的结构。
#include
intfun(inta,intb)
{intr,t;
if(a
/************found************/
t=a;b=a;a=t;
}
r=a%b;
while(r!
=0)
{a=b;b=r;r=a%b;}
/************found************/
return(a);
}
main()
{intnum1,num2,a;
printf("Inputnum1num2:
");scanf("%d%d",&num1,&num2);
printf("num1=%dnum2=%d\n\n",num1,num2);
a=fun(num1,num2);
printf("Themaximuncommondivisoris%d\n\n",a);
}
【参考答案】
(1)t=a;a=b;b=t;
(2)return(b);或returnb;
下列给定程序中函数fun的功能是:
求三个数的最小公倍数。
例如,若给主函数中的变量x1、x2、x3分别输入15 11 2,则输出结果应当是330。
请改正程序中的错误,使它能得出正确的结果。
注意:
部分源程序在文件MODI1.C中,不得增行或删行,也不得更改的程序的结构!
#include
/************found************/
fun(intx,y,z)
{intj,t,n,m;
j=1;
t=j%x;
m=j%y;
n=j%z;
while(t!
=0||m!
=0||n!
=0)
{j=j+1;
t=j%x;
m=j%y;
n=j%z;
}
/************found************/
returni;
}
main()
{intx1,x2,x3,j;
printf("Inputx1x2x3:
");scanf("%d%d%d",&x1,&x2,&x3);
printf("x1=%d,x2=%d,x3=%d\n",x1,x2,x3);
j=fun(x1,x2,x3);
printf("Theminimalcommonmultipleis:
%d\n",j);
}
【参考答案】
(1)fun(intx,inty,intz)或intfun(intx,inty,intz)
(2)returnj;
回文问题
请编写函数fun,该函数的功能是:
判断字符串是否为回文,若是则函数返回1,主函数中输出"YES",否则返回0,主函数中输出"NO"。
回文是指顺读和倒读都一样的字符串。
例如,字符串LEVEL是回文,而字符串123312就不是回文。
注意:
部分源程序在文件PROG1.C中。
请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
#include
#defineN80
intfun(char*str)
{
}
main()
{
chars[N];
FILE*out;
char*test[]={"1234321","123421","123321","abcdCBA"};
inti;
printf("Enterastring:
");
gets(s);
printf("\n\n");
puts(s);
if(fun(s))
printf("YES\n");
else
printf("NO\n");
/************************************/
out=fopen("out.dat","w");
for(i=0;i<4;i++)
if(fun(test[i]))
fprintf(out,"YES\n");
else
fprintf(out,"NO\n");
fclose(out);
/************************************/
}
【参考答案】
intfun(char*str)
{
inti,n=0,fg=1;
char*p=str;
while(*p) /*将指针p置位到字符串末尾,并统计字符数*/
{
n++;
p++;
}
for(i=0;i if(str[i]==str[n-1-i]); /*相同,什么都不作*/
else /*不同,直接跳出循环*/
{
fg=0;
break;
}
returnfg;
}
【考点分析】
本题考查:
判断回文算法;针对遍历字符串的操作,同时如果有判断,则应该有if语句的配合。
【解题思路】
判断回文数就是将第一个字符与最后一个字符比较,第二个字符与倒数第二个字符进行较,依次类推,直到中间的字符,如果比较的结果都相同,那么这个字符串就是回文,否则不是。
程序中循环语句用来遍历字符串,条件语句用来判断当前字符与对应位置的字符是否相同。
闰年问题
请补充函数fun,该函数的功能是:
判断某一个年份是否为闰年。
例如,1900年不是闰年,2004是闰年。
注意:
部分源程序在文件BLANK1.C中。
请勿改动main函数和其他函数中的任何内容,仅在函数fun的横线上填入所编写的若干表达式或语句。
#include
#include
#include
intfun(intn)
{
intflag=0;
if(n%4==0)
{
if(【1】)
flag=1;
}
if(【2】)
flag=1;
return【3】;
}
voidmain()
{
intyear;
system("CLS");
printf("Inputtheyear:
");
scanf("%d",&year);
if(fun(year))
printf("%disaleapyear.\n",year);
else
printf("%disnotaleapyear.\n",year);
}
【参考答案】
(1)n%100!
=0或n%100
(2)n%400==0 (3)flag
因子和问题
5、
下列给定程序的功能是:
读入一个整数k(2≤k≤10000),输出它的所有质因子(即所有为素数的因子)。
例如,若输入整数2310,则应输出:
2、3、5、7、11。
请改正程序中的错误,使程序能得出正确的结果。
注意:
部分源程序在文件MODI1.C中,不得增行或删行,也不得更改程序的结构。
#include
#include
/*************found**************/
IsPrime(intn);
{
inti,m;
m=1;
/*************found**************/
for(i=2;iif!
(n%i)
{
m=0;
break;
}
return(m);
}
main()
{
intj,k;
printf("\nPleaseenteranintergernumberbetween2and10000:
");
scanf("%d",&k);
printf("\nTheprimefactor(s)of%dis(are):
",k);
for(j=2;jif((!
(k%j))&&(IsPrime(j)))
printf("%4d,",j);
printf("\n");
}
【参考答案】
(1)IsPrime(intn)
(2)if(!
(n%i))
6、
请编写一个函数fun,它的功能是:
计算并输出给定整数n的所有因子(不包括1与自身)之和。
规定n的值不大于1000。
例如,若主函数从键盘给n输入的值为856,则输出为sum=763。
注意:
部分源程序在文件PROG1.C中。
请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
#include
intfun(intn)
{
}
voidmain()
{
intn,sum;
FILE*out;
printf("Inputn:
");
scanf("%d",&n);
sum=fun(n);
printf("sum=%d\n",sum);
/******************************/
out=fopen("out.dat","w");
fprintf(out,"%d\n",fun(123));
fprintf(out,"%d\n",fun(456));
fprintf(out,"%d\n",fun(789));
fprintf(out,"%d\n",fun(147));
fprintf(out,"%d",fun(258));
fclose(out);
/******************************/
}
【参考答案】
intfun(intn)
{
ints=0,i;
for(i=2;i<=n-1;i++) /*将n减1累加*/
if(n%i==0)
s+=i;
returns;
}
【考点分析】
本题考查:
变量数据类型及初始化;循环判断语句;函数返回值。
【解题思路】
本程序的实现步骤为:
(1)遍历从2到n-1的所有整数;
(2)用条件语句找出能被n整除的所有整数,并累加求和;(3)返回值。
斐波那契数列问题
7、
下列给定程序中函数fun的功能是:
用递归算法计算斐波拉契数列中第n项的值。
从第1项起,斐波拉契数列为:
1、1、2、3、5、8、13、21、……
例如,若给n输入7,则该项的斐波拉契数值为13。
请改正程序中的错误,使它能得出正确结果。
注意:
部分源程序在文件MODI1.C中,不得增行或删行,也不得更改程序的结构。
#include
longfun(intg)
{
/**********found**********/
switch(g);
{case0:
return0;
/**********found**********/
case1;case2:
return1;
}
return(fun(g-1)+fun(g-2));
}
main()
{longfib;intn;
printf("Inputn:
");scanf("%d",&n);printf("n=%d\n",n);
fib=fun(n);
printf("fib=%d\n\n",fib);
}
【参考答案】
(1)去掉分号
(2)case1:
case2:
return1;
【考点分析】
本题考查:
switch语句,其一般形式为:
switch(表达式){
case常量表达式1:
语句1;
case常量表达式2:
语句2;
……
case常量表达式n:
语句n;
default:
语句n+1;
}
其中switch(表达式)后不应该带有";",同时case语句常量后应该是":
"。
【解题思路】
C语言中,switch语句之后不能有分号,并且case语句常量后应用的是冒号。
【举一反三】
该类题型考查较灵活,考生可根据本书第27、52套题进行训练。