c语言机试上级答案解析2140.docx
《c语言机试上级答案解析2140.docx》由会员分享,可在线阅读,更多相关《c语言机试上级答案解析2140.docx(88页珍藏版)》请在冰豆网上搜索。
c语言机试上级答案解析2140
第二十一套:
一、请补充main函数,该函数的功能是:
打印出满足个位的数字、十位上的数字和百位上的数字都相等的所有三位数。
本题的结果为:
111222333444555666777888999。
注意:
部分源程序给出如下。
请勿改动main函数和其他函数中的任何内容,仅在main函数的横线上填入所编写的若干表达式或语句。
试题程序:
#include
#include
voidmain()
{
intg,s,b;
system("CLS");
for(g=1;g<10;g++)
for(s=1;s<10;s++)
for(b=1;b<10;b++)
{
if(【1】)
printf("%5d",【2】);
}
}
答案:
【1】g==s&&s==b或者g==b&&s==b或者g==s&&g==b【2】g+s*10+b*100
【解析】填空1:
变量g表示三位数的个位数字,变量s表示三位数的十位数字,变量b表示三位数的百位数字。
注意,表示三个数字都相等时,不能写成"g==s==b",而要写成"g==s&&s==b"或者"g==b&&s==b"或者"g==s&&g==b"。
填空2:
一个三位数可以表示为:
百位数字乘以100加上十位数字乘以10,再加上个位数字。
二、下列给定程序中,函数fun的功能是:
求S的值。
设
S=(22/(1*3))*(42/(3*5))*(62/(5*7))*…*(2k)2/((2k-1)*(2k+1))
例如,当k为10时,函数的值应为1.533852。
请改正程序中的错误,使它能得出正确的结果。
注意:
不要改动main函数,不得增行或删行,也不得更改程序的结构。
试题程序:
#include
#include
#include
#include
/*************found**************/
fun(intk)
{intn;floats,w,p,q;
n=1;
s=1.0;
while(n<=k)
{w=2.0*n;
p=w-1.0;
q=w+1.0;
s=s*w*w/p/q;
n++;
}
/*************found**************/
returns
}
voidmain()
{system("CLS");
printf("%f\n",fun(10));
}
答案:
(1)错误:
fun(intk)正确:
doublefun(intk)
(2)错误:
returns正确:
returns;
【解析】这样一道数学题要是用C程序来实现,真的挺简单,但我们还是需要注意细节问题上出的错误,该题便是如此。
一个是简单的函数调用的定义错误,另一个是语法错误。
三、请编写函数fun,该函数的功能是:
计算并输出
S=1+(1+20.5)+(1+20.5+30.5)+…+(1+20.5+30.5+…+n0.5)
例如,若主函数从键盘给n输入20后,则输出为s=534.188884。
注意:
部分源程序给出如下。
请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
试题程序:
#include
#include
doublefun(intn)
{
}
voidmain()
{
intn;
doubles;
printf("\n\nInputn:
");
scanf("%d",&n);
s=fun(n);
printf("\n\ns=%f\n\n",s);
}
答案:
doublefun(intn)
{
inti;
doubles=0.0,s1=0.0;
for(i=1;i<=n;i++)
{s1=s1+pow(i,0.5);/*求每一项*/
s=s+s1;/*按公式求出s*/
}
returns;
}
【解析】我们先用数学的思路读懂该程序,并用1个字符表示"()"内的值。
在本程序中用s1来表示题中每个小括号内的值,第1项相当于有1个10.5(它还是1),第2项相当于第1项的值加上20.5,第3项相当于第2项的值加上30.5,…,依次类推。
函数pow(x,y)的功能是求出x的y次方,该函数已在库函数中定义(即可直接使用)。
程序中用s来表示总的结果,每1次循环加1次s1,即加1项。
第二十二套:
一、请补充函数fun,该函数的功能是:
判断一个数的个位数字和百位数字之和是否等于其十位上的数字,是则返回"yes!
",否则返回"no!
"。
注意:
部分源程序给出如下。
请勿改动main函数和其他函数中的任何内容,仅在函数fun的横线上填入所编写的若干表达式或语句。
试题程序:
#include
#include
#include
char*fun(intn)
{
intg,s,b;
g=n%10;
s=n/10%10;
b=【1】;
if((g+b)==s)
return【2】;
else
return【3】;
}
voidmain()
{
intnum=0;
system("CLS");
printf("******Inputdata*******\n");
scanf("%d",&num);
printf("\n\n\n");
printf("******Theresult*******\n");
printf("\n\n\n%s",fun(num));
}
答案:
【1】n/100%10【2】″yes!
″【3】″no!
″
【解析】填空1:
由程序可以知道,变量g保存了整数的个位数,变量s保存了整数的十位数,所以变量b应该保存整数的百位数。
将整数除以100再对10取余,则得到这个整数的百位数。
填空2:
当个位数字和百位数字之和等于十位数字时,返回″yes!
″。
填空3:
当个位数字和百位数字之和不等于十位数字时,返回″no!
″。
二、下列给定程序中,函数fun的功能是:
计算并输出下列数的前N项之和SN,直到SN+1大于q为止,q的值通过形参传入。
例如,若q的值为50.0,则函数值为49.394948。
请改正程序中的错误,使程序能输出正确的结果。
注意:
不要改动main函数,不得增行或删行,也不得更改程序的结构。
试题程序:
#include
#include
doublefun(doubleq)
{
intn;
doubles,t;
n=2;
s=2.0;
while(s<=q)
{
t=s;
/********found*********/
s=s+(n+1)/n;
n++;
}
printf("n=%d\n",n);
/********found********/
returns;
}
main()
{
printf("%f\n",fun(50));
}
答案:
(1)错误:
s=s+(n+1)/n正确:
s=s+(double)(n+1)/n;
(2)错误:
returns正确:
returnt;
【解析】
(1)在c语言中,整数除以整数得出的结果也是整数,题中是计算小数的,所以要转变类型。
(2)观察while循环,假如返回值是s的话,那么返回的是大于q的值,题中所要返回的是小于q的值,所以应该返回t。
三、请编写函数fun,其功能是:
计算并输出下列多项式值。
S=(1-1/2)+(1/3-1/4)+…+(1/(2n-1)-1/2n)
例如,若主函数从键盘给n输入8后,则输出为S=0.662872。
注意:
部分源程序给出如下。
请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
试题程序:
#include
doublefun(intn)
{
}
voidmain()
{
intn;
doubles;
printf("\nInputn:
");
scanf("%d",&n);
s=fun(n);
printf("\ns=%f\n",s);
}
答案:
doublefun(intn)
{
inti;
doubles=0.0;
for(i=1;i<=n;i++)
s=s+(1.0/(2*i-1)-1.0/(2*i));/*计算S=(1-1/2)+(1/3-1/4)+…+(1/(2n-1)-1/2n)*/
returns;
}
【解析】本题中s=s+(1.0/(2*i-1)-1.0/(2*i));语句是用C程序表达题目中的每一项,这是关键的一步,其他问题不难理解。
第二十三套:
一、请补充函数fun,该函数的功能是:
把数组aa中的偶数元素按原来的先后顺序放在原数组后面。
例如,输入"33,67,42,58,25,76,85,16,41,56",输出结果"33,67,25,85,41,42,58,76,16,56"。
注意:
部分源程序给出如下。
请勿改动main函数和其他函数中的任何内容,仅在函数fun的横线上填入所编写的若干表达式或语句。
试题程序:
#include
#include
#defineN10
voidfun(intaa[])
{
intI,j=0,k=0;
intbb[N];
for(I=0;I{
if(【1】)
bb[k++]=aa[I];
else
aa[j++]=aa[I];
}
for(I=0;【2】;I++,j++)
aa[j]=bb[I];
}
voidmain()
{
inti;
intaa[N]={33,67,42,58,25,76,85,16,
41,56};
system("CLS");
printf("\n***originallist***\n");
for(i=0;iprintf("%4d",aa[i]);
fun(aa);
printf("\n***newlist***\n");
for(i=0;iprintf("%4d",aa[i]);
}
答案:
【1】aa[I]%2==0【2】I【解析】填空1:
如果一个数对2求余,结果为0,那么这个数为偶数,把这个数暂时存在数组bb中。
否则这个数为奇数,存在数组aa中。
填空2:
最后,将数组bb中的偶数都拷贝到数组aa中奇数的后面。
变量k记录了原数组aa中偶数的个数,所以for循环的条件是I二、下列给定程序中,函数fun的功能是:
求表达式s=aa…aa-…-aa-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函数。
请改正程序中的错误,使它能计算出正确的结果。
注意:
不要改动main函数,不得增行或删行,也不得更改程序的结构。
试题程序:
#include
#include
longfun(inta,intn)
{
intj;
/********found********/
longs=0,t=1;
/********found********/
for(j=0;j<=n;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%id\n",fun(a,n));
}
答案:
(1)错误:
longs=0,t=1正确:
longs=0,t=0;
(2)错误:
for(j=0;j<=n;j++)正确:
for(j=0;j(3)错误:
t=t%10正确:
t=t/10;
【解析】
(1)用带入法就可看出,结果是错误的,它的个位出现了问题。
(2)从题中给出的例题就可以看出,当n=6,a=3时,得到的最大数为33333,是一个五位数,所以这里只要从0开始循环6次,就可以了。
(3)根据题意,这里不需要求余数,而是要去掉个位数,重新组合一个数。
三、假定输入的字符串中只包含字母和*号。
请编写函数fun,它的功能是:
除了字符串前导的冰号之外,将串中其他*号全部删除。
在编写函数时,不得使用c语言提供的字符串函数。
例如,若字符串中的内容为****A*BC*DEF*G*******,删除后,字符串中的内容则应当是料****ABCDEFG。
注意:
部分源程序给出如下。
请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
试题程序:
#include
#include
#include
voidfun(char*a)
{
}
main()
{
chars[81];
printf("Enterastring:
\n");
gets(s);
fun(s);
printf("Thestringafterdeleted:
\n");
puts(s);
}
答案:
voidfun(char*a)
{
inti=0;
char*p=a;
while(*p&&*p=='*')
{
a[i]=*p;i++;p++;
}
while(*p)
{
if(*p!
='*')
{
a[i]=*p;i++;
}
p++;
}
a[i]='\0';
}
【解析】函数fun的功能是除了字符串前导的*号之外,将串中其他*号全部删除。
解答本题,1、定义一个临时指针p,初始指向原串首地址;2、利用循环把字符串前导*号拷贝到原串;3、继续移动指针,把串中和串尾的非*号字符拷贝到原串;4、为修改后的字符串赋结尾字符'\0'。
第二十四套:
一、请补充函数fun,该函数的功能是:
判断某一个年份是否为闰年。
例如,1900年不是闰年,2004是闰年。
注意:
部分源程序给出如下。
请勿改动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
【解析】填空1:
判断闰年的方法是,年份能被4整除但不能被100整除,或者年份能被400整除。
n不能被100整除,即对100取余非零。
填空2:
能被400整除的年份也是闰年,n能被400整除,即对400取余为零。
填空3:
flag标记年份n是否为闰年,当flag为1时是闰年,相反,当flag为0时不是闰年。
二、下列给定程序中,函数fun的功能是:
判断一个整数m是否是素数,若是返回1,否则返回0。
在main函数中,若fun()返回1则输出YES,若fun()返回0则输出NO!
请改正程序中的错误,使它能得出正确的结果。
注意:
不要改动main函数,不得增行或删行,也不得更改程序的结构。
试题程序:
#include
#include
#include
intfun(intm)
{intk=2;
while(k<=m&&(m%k))
/*************found**************/
k++
/*************found**************/
if(m=k)
return1;
elsereturn0;
}
voidmain()
{intn;
system("CLS");
printf("\nPleaseentern:
");
scanf("%d",&n);
if(fun(n))printf("YES\n");
elseprintf("NO!
\n");
}
答案:
(1)错误:
k++正确:
k++;
(2)错误:
if(m=k)正确:
if(m==k)
【解析】函数fun的功能是判断m是否为素数:
m从2开始作为除数,并对m取余,若不存在一个数使得余数为0,则m为素数,程序的错误在于if(m=k)语句中的逻辑表达式写成了赋值表达式。
三、请编写函数fun,该函数的功能是:
判断字符串是否为回文?
若是则函数返回1,主函数中输出YES,否则返回0,主函数中输出NO。
回文是指顺读和倒读都一样的字符串。
例如,字符串LEVEL是回文,而字符串123312就不是回文。
注意:
部分源程序给出如下。
请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
试题程序:
#include
#defineN80
intfun(char*str)
{
}
main()
{
chars[N];
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");
}
答案:
intfun(char*str)
{
inti,n=0,fg=1;
char*p=str;
while(*p)/*将指针p置位到字符串末尾,并统计字符数*/
{
n++;
p++;
}
for(i=0;iif(str[i]==str[n-1-i]);/*相同,什么都不作*/
else/*不同,直接跳出循环*/
{
fg=0;
break;
}
returnfg;
}
【解析】判断回文数就是将第一个字符与最后一个字符比较,第二个字符与倒数第二个字符进行比较,依次类推,直到中间的字符,如果比较的结果都是相同,那么这个字符串就是回文数,否则不是。
第二十五套:
一、给定程序的功能是:
判断字符ch是否与串str中的某个字符相同,若相同什么也不做,若不同则插在串的最后。
注意:
部分源程序给出如下。
请勿改动函数main和其他函数中的任何内容,仅在横线上填入所编写的若干表达式或语句。
试题程序:
#include
#include
voidfun(char*str,charch)
{
while(*str&&*str!
=ch)
str++;
if(*str【1】ch)
{
str[0]=ch;
【2】=0;
}
}
main()
{
chars[81],c;
printf("\nPleaseenterastring:
\n");
gets(s);
printf("\nPleaseenterthecharactertosearch:
");
c=getchar();
fun(【3】);
printf("\nTheresultis%s\n",s);
}
答案:
【1】!
=【2】str[1]或*(str+1)【3】s,c
【解析】填空1:
根据题意"若相同什么也不做",则应填入!
=。
填空2:
若不同则插在串的最后,那么0就在字符串的倒数第二个了。
填空3:
函数传递的参数为输入的两个字符串,则填入s,c。
二、下列给定程序中,函数fun的功能是:
从3个红球,5个白球,6个黑球中任意取出8个作为一组,进行输出。
在每组中,可以没有黑球,但必须要有红球和白球。
组合数作为函数值返回。
正确的组合数应该是15。
程序中i的值代表红球数,j的值代表白球数,k的值代表黑球数。
请改正程序中的错误,使它能得出正确的结果。
注意:
不要改动main函数,不得增行或删行,也不得更改程序的结构。
试题程序:
#include
intfun()
{inti,j,k,sum=0;
printf("\nTheresult:
\n\n");
/*************found**************/
for(i=0;i<=3;i++)
{for(j=1;j<=5;j++)
{k=8-i-j;
/*************found**************/
if(k>=1&&k<=6)
{sum=sum+1;
printf("red:
%4dwhite:
%4d
black:
%4d\n",i,j,k);
}
}
}
returnsum;
}
voidmain()
{intsum;
sum=fun();
printf("sum=%4d\n\n",sum);
}
答案:
(1)错误:
for(i=0;i<=3;i++)正确:
for(i=1;i<=3;i++)
(2)错误:
if(k>=1&&k<=6)正确:
if((k>=1&&k<=6)&&(i!
=0)&&(j!
=0)||(k==0))
【解析】该题是一道教材习题的变体,如果单纯从数学的排列组合角度来分析,实在简单不过,那怎么才能用C语言实现题目中