c语言机试上级答案解析2140.docx

上传人:b****2 文档编号:18185596 上传时间:2023-04-24 格式:DOCX 页数:88 大小:49.02KB
下载 相关 举报
c语言机试上级答案解析2140.docx_第1页
第1页 / 共88页
c语言机试上级答案解析2140.docx_第2页
第2页 / 共88页
c语言机试上级答案解析2140.docx_第3页
第3页 / 共88页
c语言机试上级答案解析2140.docx_第4页
第4页 / 共88页
c语言机试上级答案解析2140.docx_第5页
第5页 / 共88页
点击查看更多>>
下载资源
资源描述

c语言机试上级答案解析2140.docx

《c语言机试上级答案解析2140.docx》由会员分享,可在线阅读,更多相关《c语言机试上级答案解析2140.docx(88页珍藏版)》请在冰豆网上搜索。

c语言机试上级答案解析2140.docx

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;i

printf("%4d",aa[i]);

fun(aa);

printf("\n***newlist***\n");

for(i=0;i

printf("%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;i

if(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语言实现题目中

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

当前位置:首页 > 工程科技 > 城乡园林规划

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

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