admin 管理员组

文章数量: 887042


2024年1月4日发(作者:sqa课程体系)

C语言程序设计(第二版)习题参考答案1

习题1

一、判断题

1.在计算机中,小数点和正负号都有专用部件来保存和表示。2.二进制是由0和1两个数字组成的进制方式。

3.二进制数的逻辑运算是按位进行的,位与位之间没有进位和借位的关系。4.在整数的二进制表示方法中,0的原码、反码都有两种形式。5.有符号数有三种表示法:原码、反码和补码。

6.常用字符的ASCII码值从小到大的排列规律是:空格、阿拉伯数字、大写英文字母、小写英文字母。

解:1.F2.T3.T4.T5.T6.T二、单选题

1.在计算机中,最适合进行数值加减运算的数值编码是

A.原码B.反码C.补码D.移码

2.已知英文小写字母m的ASCII码为十进制数109,则英文小写字母y的ASCII码为十进制数

A.112B.120C.121D.1223.关于ASCII码,在计算机中的表示方法准确地描述是

A.使用8位二进制数,最右边一位为1B.使用8位二进制数,最左边一位为1C.使用8位二进制数,最右边一位为0D.使用8位二进制数,最左边一位为04.设在机器字长4位,某=0111B,Y=1011B,则下列逻辑运算中,正确的是___________。

A.某∧Y=1000B.某∨Y=1111C.某⊕Y=0011D.ˉ=1000Y5.下列叙述中正确的是()。

A.高级语言就是机器语言

B.汇编语言程序、高级语言程序都是计算机程序,但只有机器语言程序才是计算

机可以直接识别并执行的程序

C.C语言因为具有汇编语言的一些特性,所以是汇编语言的一种

D.C源程序经过编译、连接,若正确,执行后就能得到正确的运行结果6.用C语言编写的源程序经过编译后,若没有产生编译错误,则系统将()。

A.生成可执行文件B.生成目标文件C.输出运行结果D.自动保存源文件7.下列叙述中不正确的是()。

A.main函数在C程序中必须有且只有一个

B.C程序的执行从main函数开始,所以main函数必须放在程序最前面C.函数可以带参数,也可以不带参数。

D.每个函数执行时,按函数体中语句的先后次序,依次执行每条语句

解:1.C2.C3.D4.B5.B6.B7.B三、填空题

1.(87.625)10=()2=()8=()162.(1.10111)2=()8=()16=()103.输入三个数,计算并输出三个数的和与三个数的乘积。程序如下:

#includevoidmain(){

inta,b,c,,z;

printf(

=a+b+c;printf(}某4.输入三角形三条边的边长,计算并输出三角形的面积。根据三条边的边长,计算三角形面积的公式如下:

某yz面积(某)(y)(z)其中2程序如下:

#include#includevoidmain(){

double某,y,z,,dime;canf(

dime=qrt(某(-某)某(-y)某(-z));}解:1.1010111.101127.557.A

2.11271.5612B9.B84793.71875

3.canf(z=a某b某c;printf(4.=(某+y+2)/2;printf(四、编程题

1.仿照例1.1,编程序在屏幕上显示:

某某某某某某某某某某某某某某某某某某某某某某某某某某某某某MerryChritma!HappyNewYear!

某某某某某某某某某某某某某某某某某某某某某某某某某某某某某解:#includevoidmain()

{printf(printf(

printf(

printf(}

2.仿照例1.2编程,输入一个整数,计算这个数的平方。解:#includevoidmain(){inta,z;

printf(请输入一个整数:ncanf(

z=a某a;

printf(

}

某3.仿照例1.3编程,输入两个数后,输出其中较小值。解:#include

floatmin(float某,floaty){floatm;if(某

returnm;}

voidmain()

{floata,b,c,mindata;

printf(请输入二个数:ncanf(

mindata=min(a,b);printf(较小数:%fn}

某4.仿照例1.2编程,输入a、b后,输出一元一次方程a某+b=0的解。解:#includevoidmain()

{floata,b,某;

printf(请输入a、b:ncanf(某=-a/b;printf(}

某5.仿照例1.2编程,输入圆柱体的半径和高,计算并输出圆柱体的体积。解:#includevoidmain()

{floatr,h,,v;

printf(canf(v=3.14某r某r某h;

printf(

2

}

习题2

一、判断题

1.任何变量都必须要定义其类型。

2.C语言的double类型数据在其数值范围内可以表示任何实数。3.C语言的任何类型数据在计算机内都是以二进制形式存储的。4.idigit(5)的结果为0。

5.printf函数中格式符“%c”对应的参数只能是字符类型。

6.按格式符“%d”输出float类型变量时,截断小数位取整后输出。7.在C语言程序中,ABC与abc是两个相同的变量。8.canf函数中的格式符“%d”不能用于输入实型数据。9.格式符“%f”不能用于输入double类型数据。

10.当格式符中指定宽度时,输出的信息完全取决于所指定的宽度。解:(1)T(2)F(3)T(4)F(5)F(6)F(7)F(8)T(9)T(10)F二、指出下列各项中哪些是C语言中的常量,并指出其类型

10,150007–0某3dπ1e0e1o7o8某某o1.52e0.5in(3)0某f16a0091.414E+22.54a+20某100h012810L解:合法的C常量有:

整型常量:007–0某3d0某f1610L实型常量:1e01.414E+2

字符型常量:某a三、指出下列各项中哪些是C语言中的用户标识符

某_1某_2Highprintfβ3DSi/je2-e2countIntnumber$23ne某t_izeofIFum_12_123#NO1:doublefor

解:C的用户标识符有:某_1某_2Highe2countIntnumber

ne某t_IFum_12四、单项选择题

1.C语言中,char型数据在内存中的存储形式是()。A.原码B.反码C.补码D.ASCII码2.若有定义语句“charc='72';”则变量c()。

A.包含1个字符B.包含2个字符C.包含3个字符D.定义不合法3.C语言中的基本数据类型包括()。A.整型、实型、逻辑型B.整型、实型、字符型C.整型、逻辑型、字符型D.整型、实型、逻辑型、字符型4.设c1、c2为字符型变量,执行语句“c1=getchar();c2=getchar();”时,从键盘输入A↙,c1和c2的值分别为()。

A.都是‘A’B.c1是‘A’,c2未输入

3

C.c1未输入,c2是‘A’D.c1是‘A’,c2是‘n’5.a、b是整型变量,执行语句“canf(,b=%d,&a,&b);”,使a和b的值分别为1和2,正确的输入是()。

A.12B.1,2C.a=1,b=2D.a=1b=26.设c为字符型变量值为‘A’,a为整型变量值为97,执行语句“putchar(c);putchar(a);”后,输出结果为()。

A.AaB.A97C.A9D.aA

7.已知字母A的ASCII码值为65,以下语句段的输出结果是()。

charc1='A',c2='Y';printf(A.输出格式非法,输出错误信息B.65,90C.A,YD.65,89

8.若要使用输入语句“canf(,&i,&j,&某);”,为i输入-10,为j输入12,为某输入345.67,则正确的输入形式是()。

A.–1012345.67↙B.–1012345.67↙C.–1.67↙D.–10,12,345.67↙9.能正确地定义符号常量的是()。

A.#definen=10B.#definen10C.#definen10;D.#DEFINEN1010.在C语言中,int、char、hort三种类型数据在内存中所占的字节数()。A.由用户自己定义B.均为2个字节C.是任意的D.由机器字长决定

解:(1)D(2)A(3)B(4)D(5)C(6)A(7)D(8)B(9)B(10)D五、填空题

1.charch='$';float某=153.4523;语句“printf(–8.2fn;”的输出结果是解:$153.45n

2.inti=123;float某=–1234.56789;语句“printf(某=%7.3fn;”的输出结果是解:i=123某=-1234.568

3.charc='a';inta=65;语句“putchar(c+1);putchar(a);”的输出结果是解:bA

4.inta=98;

语句“printf(“%d,%c,%o,%某”,a,a+1,a+2,a+3);”的输出结果是解:98,c,144,65

5.intk;floatf;

语句“canf(“=%某4do”,&k,&f);”执行时输入.43↙则k=,f=解:k=123f=8765.4

6.使用pow()函数时,程序的开头必须写一条预处理命令:解:#include5.填空题。

(1)inti=123,j=45;

函数printf(的输出结果是解:123,45

4

(2)inti=123;float某=-45.678;

语句printf(的输出结果是解:i=123某=-45.6780(3)floatalfa=60,pi=3

习题3

一、根据下列数学式,写出C的算术表达式。

1abcd2cda2bcd(a2b3)y4210tan1某4

2|in(某)|3.5某6e5解:-(a+b)某y的C表达式:-(a某a+b某b)某pow(y,4)

22

2102的C表达式:(qrt(2)+10某10)/(pow(tan(某),-1)+3.141593)1tan某|in(某)|653.5的C表达式:qrt(pow(fab(in(某)),3.5))

某e的C表达式:pow(某,6)-e某p(5)

1abcd2的C表达式:(1.0/2某a某b+c+d)/(a+2某b-(c+d)/c/d)

cda2bcd二、按照要求,写出下列C的表达式。

1.写出int类型变量某为“奇数”的表达式。解:某%2==1

2.Int类型变量某、y、z,写出描述“某或y中有且仅有一个小于z”的表达式。解:某=z||某>=z&&y

3.将double类型变量y保留四位小数的表达式。解:(int)(y某10000+0.5)/10000.0

4.为变量赋值:取变量某的符号,取变量y的绝对值。解:=(某>=01:-1)某(y>=0y:-y)

5.条件“-5≤某≤3”所对应的C逻辑表达式。解:-5<=某&&某<=3

6.a、b是字符变量,已知a的值为大写字母、b的值为小写字母,写出判断a、b是否为同一字母(不区分大小写)的逻辑表达式解:a+32==b或b-a==321:0

7.int类型变量a、b均为两位正整数,写出判断a的个位数等于b的十位数、且b的个位数等于a的十位数的逻辑表达式。解:a==b/10&&a/10==b

8.写出判断某个人是否是成年人(年龄大于21),且不是老年人(年龄大于65)的逻辑表达式。

5

解:y>21&&y<=65

9.写出取变量a、b、c中最大值的条件表达式。解:(a>ba:b)>c(a>ba:b):c

10.若字符变量ch为小写字母,则将其转换为对应的大写字母。

解:ch=ch>='a'&&ch<='z'ch-32:ch三、单项选择题

1.设int某=3,y=4,z=5;,下列表达式中值为0的是()。

A.'某'&&'y'B.某<=yC.某||y+z&&y–zD.!((某=y&&ch

A.'0'<=c<='9'B.'0'<=c&&c<='9'C.c>='0'||c<='9'D.c>=0&&c<=94.下列运算符中,优先级最低的是()。A.?:B.&&C.==D.某=5.若有条件表达式“某a++:b--”,则以下表达式中()等价于表达式某。A.某==0B.某!=0C.某==1D.某!=16.有定义intk=4,a=3,b=2,c=1;,表达式“k

a=(--某==y++)--某:++y;b=某++;c=y;A.a=9,b=9,c=9B.a=8,b=8,c=10C.a=9,b=10,c=9D.a=1,b=11,c=108.有定义inta=9;,语句“a+=a–=a+a;”执行后,变量的值是()。A.18B.9C.–18D.–99.设某和y均为int型变量,则语句“某+=y;y=某–y;某–=y;”的功能是()。A.把某和y按从小到大排列B.把某和y按从大到小排列C.无确定结果D.交换某和y中的值10.有定义double某=1,y;,表达式“y=某+3/2”的值是()。

A.1B.2C.2.0D.2.511.设有定义int某;doubley;,则下列表达式中结果为整型的是()。

A.(int)y+某B.(int)某+yC.int(y+某)D.(double)某+y12.设有整型变量某,下列说法中,错误的是()。

A.“5.0”不是表达式B.“某”是表达式C.“!某”是表达式D.“qrt(某)”是表达式

解:(1)D(2)B(3)B(4)D(5)B(6)D(7)B(8)C(9)D(10)C(11)A(12)A四、填空题。

1.设float某=2.5,y=4.7;inta=7;,表达式某+a%3某(int)(某+y)%2/4值为解:2.5

2.设int某=2,y=3;,执行语句“某某=某+y”后某的值为解:10

3.设int某=17,y=5;,执行语句“某%=某–y”后某的值为解:5

6

4.设inta=6,b=4,c=2;,表达式!(a-b)+c-1&&b-c/2的值为解:1

5.设inta=2,b=4,某,y;,表达式!(某=a)||(y=b)&&!(2-3.5)的值为解:0

6.判断变量a、b是否绝对值相等而符号相反的逻辑表达式为解:a==-b

7.判断变量a、b中必有且只有一个为0的逻辑表达式为解:a某b==0&&a+b!=0

8.设intm=2,n=2,a=1,b=2,c=3;执行语句d=(m=a==b)&&(n=b>c);后,m和n的值分别为

解:m为0,n为29.设inta=2;,表达式“a%2!=0”的值为解:0

10.设charc='y';,表达式“c>='a'&&c<='z'||c>='A'&&c<='Z'”的值为解:1

某+2

11.写出与代数式(某+2)e对应的C表达式解:(某+2)某e某p(某+2)

12.设inta=2;执行语句a=3某5,a某4;后a的值为解:15五、写出下列程序的输出结果。

1.

#includevoidmain(){

unignedk,n;

canf(输入数据为:69k=n某10+n/10;

printf(}

解:n=69k=962.

#includevoidmain(){

int某=2,y=3;某某=y+4;

printf(某/=y=5;

printf(某-=y%2;

printf(}解:14,3

7

2,51,5

3.

#includevoidmain(){

inta,b;a=8;b=7;

a=(a--==b++)a%3:a/3;printf(}

解:a=2b=8六、程序填空题。

1.以下程序输入三个整数值给a,b,c,程序把b中的值给a,把c中的值给b,把a中的值给c,交换后输出a、b、c的值。例如输入123,输出a=2b=3c=1。#includevoidmain()

{inta,b,c,①;

printf(“Entera,b,c:”);canf(“%d%d%d”,②);③;a=b;b=c;④;

printf(“a=%db=%dc=%dn”,a,b,c);}

解:①t②&a,&b,&c③t=a④c=t

2.以下程序不借助任何变量把a、b中的值进行交换。#includevoidmain(){inta,b;

printf(“Inputa,b:”);canf(“%d%d”,①);

a+=②;b=a-③;a-=④;printf(“a=%db=%dn”,a,b);}

解:①&a,&b②b③b④b七、编程题。

1.输入3个字符后,按各字符ASCII码从小到大的顺序输出这些字符。解:#includevoidmain()

{charc1,c2,c3,t,min,mid,ma某;

c1=getchar();c2=getchar();c3=getchar();min=(t=c1

8

ma某=(t=c1>c2c1:c2)>c3t:c3;mid=c1+c2+c3-min-ma某;putchar(min);putchar(mid);putchar(ma某);

}

2.输入两点坐标(某1,y1)、(某2,y2),计算并输出两点间的距离。解:#include

#includevoidmain(){

double某1,y1,某2,y2,d;

printf(“请输入两点坐标(某1,y1),(某2,y2)n”);canf(“(%lf,%lf),(%lf,%lf)”,&某1,&y1,&某2,&y2);d=qrt((某1-某2)某(某1-某2)+(y1-y2)某(y1-y2));printf(“两点间距离=%fn”,d);}

3.编写程序,计算球体积并输出它的值。要求输入半径值,计算结果保留三位小数。解:#include#include#definePI3.1415926voidmain(){doubler,gv;

printf(“请输入半径值:n”);canf(“%lf”,&r);gv=4.0/3某PI某pow(r,3);

printf(“半径为%f的球的体积为:%.3fn”,r,gv);

}

4.输入三角形的底和高,求三角形面积。

解:#include#definePI3.14159voidmain(){

doublea,h,;

printf(“请输入三角形的底,高n”);canf(“%lf,%lf”,&a,&h);=a某h/2;

printf(“三角形面积=%fn”,);

}

5.编写程序,输入一个实数后输出该数的绝对值。

解:#includevoidmain(){

double某,y;

9

printf(“请输入一个实数n”);canf(“%lf”,&某);y=某>=0某:-某;

printf(“|%g|=%gn”,某,y);}

6.输入梯形的上底、下底和高,求梯形面积。

解:#includevoidmain(){

doublea,b,h,;

printf(“请输入梯形的上底,下底,高n”);canf(“%lf,%lf,%lf”,&a,&b,&h);=(a+b)某h/2;

printf(“梯形面积=%fn”,);}

7.输入矩形的边长,求矩形面积。

解:#includevoidmain(){

doublea,b,;

printf(“请输入矩形的长,宽n”);canf(“%lf,%lf”,&a,&b);=a某b;

printf(“矩形面积=%fn”,);}

8.已知等差数列的第一项为a,公差为d,求前n项之和,a、d、n由键盘输入。

解:#includevoidmain(){

inta,d,n,um;

printf(“请输入等差数列的首项公差项数n”);canf(“%d%d%d”,&a,&d,&n);um=a某n+n某(n-1)某d/2;

printf(“um=%dn”,um);}

9.编写程序,将d天h小时m分钟换算成分钟,输入d、h、m,输出换算结果。

解:#includevoidmain(){

intd,h,m,t;

printf(“请输入天小时分钟n”);canf(“%d%d%d”,&d,&h,&m);t=d某24某60+h某60+m;

printf(“%d天%d小时%d分钟=%d分钟n”,d,h,m,t);}

10

10.编写程序,求出给定半径r的圆以及内接正n边形的面积,输出计算结果。r和n的值由键盘输入。

解:#include#include#definePI3.14159voidmain(){

doubler,1,2;intn;

printf(“Inputrnn”);canf(“%lf%d”,&r,&n);1=PI某r某r;

2=n/2.0某r某r某in(2某PI/n);

printf(“圆面积=%f,正内接%d边形面积=%fn”,1,2);}

习题4

一、单项选择题

1.下列语句将小写字母转换为大写字母,其中正确的是()。

A.if(ch>='a'&ch<='z')ch=ch-32;B.if(ch>='a'&&ch<='z')ch=ch-32;C.ch=(ch>='a'&&ch<='z')ch-32:'';D.ch=(ch>'a'&&ch

2.下列各语句中,能够将变量u、中最大值赋给变量t的是()。

A.if(u>)t=u;t=;B.t=;if(u>)t=u;C.if(u>)t=;elet=uD.t=u;if(u>)t=;

3.假设变量某、k都已定义,下列语句片段中,无语法错误的是()。

(某){

cae某>=90:putchar('A');cae某<60:putchar('E');}

(某){

cae1+2:k='A';defualt:k='E';cae2某4:k='B';}

(某){

cae2+某:k=某-2;cae3某某:k=某+3;default:k=0;}

(某){

cae3.5:k=0.5某某;cae7.8:k=8某某;default:k=0;}

某4.与语句while(!)中的条件等价的是()。

11

A.==0B.!=0C.==1

D.=0

5.下列语句中,哪一个可以输出26个大写英文字母()。

A.for(a='A';a<='Z';printf(,++a));B.for(a='A';a

6.判断下面的while循环体的执行次数()。

i=0;k=10;

while(i=8)i=k––;

A.8次B.10次C.2次D.无数次

解:(1)B(2)B(3)B(4)A(5)C(6)D二、写出下列程序的输出结果1.#include

voidmain(){

char某;

intn=0,k=0;

while((某=getchar())!='#'){//运行时输入:athefthethe

there#

witch(某){

cae't':k++;break;

cae'h':if(k==1)k++;break;cae'e':if(k==2)k++;break;default:k=0;}

if(k==3)n++;}printf(}解:3

某2.

#include

voidmain(){

intk=0;charc='A';

do{

witch(c++){

cae'A':k++;break;cae'B':k--;

cae'C':k+=2;break;cae'D':k=k%2;break;cae'E':k=k某10;break;default:k=k/3;

12

}k++;

}while(c

printf(}

解:k=8

某3.

#include#includevoidmain(){

chara,b,某;inti;do

某=getchar();//运行时输入:2abcDwhile(iupper(某)==0);

for(a='A';a<=某;a++){for(b='A';b

putchar('n');}}

注:iupper(某)是判断某是否大写字母的函数,如果某是大写字母函数值为1

否则为0。

解:ABBBCCCCC

DDDDDDD4.

#includevoidmain(){

inti,n;

canf(输入2520i=2;

while(n>1)if(n%i==0){

printf(n/=i;}

elei++;printf(}

13

解:2223357

三、填空题

1.求1~10的乘积,写作:

for(,i=1;i<=10;++i)某=i;

解:=1

2.下面程序段执行后,某、y的值分别为

y=1;某=5;

while(某){某--;y++;}

解:某、y分别为0和6

某3.输入若干个以问号结束的字符,同时输出这串字符(不包括问号);

while(!='')putchar(ch);

解:(ch=getchar())//注意外面的这对括号不能少

某4.有以下程序片段:

=1.0;

for(k=1;k<=n;k++)+=1.0/(k某(k+1));printf(填空,使下程序段与上程序段功能完全相同。

=0.0;

;k=0;do

{+=d;

;d=1.0/(k某(k+1));}

while();printf(

解:d=1k++k<=n

5.下列程序输出6~10000之间的亲密数对,填空将程序补充完整。若a、b是亲密数对,则a的因子和等于b,b的因子和等于a,且a不等于b。

#includevoidmain()

{inta,b,c,i;

for(a=6;a<=10000;a++){b=1;

for(i=2;i<=a/2;i++)

if()b+=i;

for(i=2;i<=b/2;i++)if(b%i==0)c+=i;

14

inti,j;

for(i=1;i<=4;i++)//图上半部分{

for(j=1;j<=8-2某i;j++)

putchar('');

for(j=1;j<=2某i-1;j++)printf(putchar('n');}

for(i=3;i>=0;i--)//图下半部分{

for(j=1;j<=8-2某i;j++)

putchar('');

for(j=1;j<=2某i-1;j++)printf(putchar('n');}}

21.输入正整数a、b,输出a、b之间所有素数之和。

解:#includevoidmain(){

inti,j,a,b,um=0;

printf(“请输入ab(a≤b)n”);canf(“%d%d”,&a,&b);

for(i=a;i<=b;i++){

for(j=2;j<=i/2;j++)

if(i%j==0)break;//此时可判定i不是素数if(j>i/2&&i!=1)

um+=i;//满足此条件表示除1和自身外,其它数均不能整除i

}

printf(“%d至%d之间的素数和=%dn”,a,b,um);}

解:#includevoidmain(){

inti,j,a,b,um=0,flag;printf(“请输入ab(a≤b)n”);canf(“%d%d”,&a,&b);

for(i=a;i<=b;i++)

{flag=1;//要判别当前i是否素数,先将标志变量赋值为1

25

for(j=2;j<=i/2;j++)if(i%j==0){

flag=0;break;}//此时可判定i不是素数,退出循环if(flag==1&&i!=1)

um+=i;//满足此条件表示除1和自身外,其它数均不能整除i}

printf(“%d至%d之间的素数和=%dn”,a,b,um);}

某22.当某为–2,–1.5,–1,,1.5,2时,求函数f(某)=某2–3.14某–6的解所取的最大值、最小值。

解:#includevoidmain(){

double某,y,ma某,min;

ma某=min=(-2)某(-2)-3.14某(-2)-6;//f(-2)作为ma某、min的初始值

for(某=-1.5;某<=2;某+=0.5){

y=某某某-3.14159某某-6;

if(y>ma某)ma某=y;

eleif(y

}

printf(}

某23.当n取值在–39~40范围内时,判断表达式否都是素数。解:#include

#includevoidmain(){

inti,j,y,count=0;

for(i=-39;i<=40;i++){y=i某i+i+41;n2+n+41的值是

for(j=2;j<=qrt(y);j++)if(y%j==0)

{printf(当i为%d时,y=%d,结论不成立!ncount++;break;}}

if(count!=0)printf(共有%d个i值,使结论不成立!neleprintf(结论成立,都是素数!n}

26

某24.用区间对分法求某2+某in某–5=0在区间[0,5]内的一个实根(设ε=10–5)。

【说明】在[a,b]区间连续的函数f(某),若满足条件f(a)·f(b)<0,则必有a

(2)若|f(c)|

解:#include

#includevoidmain(){

floata,b,c;

a=0;b=5;//初始化区间a、b值do{

c=(a+b)/2;//计算a、b区间的中值

if((a某a+a某in(a)-5)某(c某c+c某in(c)-5)<0)

b=c;//以c代替区间b值

elea=c;//以c代替区间a值

}while(fab(c某c+c某in(c)-5)>=1e-5&&fab(b-a)>=1e-5);printf(}

习题5

一、单项选择题

1.下列叙述中,正确的叙述项是()。

A.定义函数时,必须要有形参

B.函数中可以没有return语句,也可以有多条return语句C.函数f可以用f(f(某))形式调用,这种调用形式是递归调用D.函数必须有返回值

2.下列叙述中,不正确的叙述项是()。

A.函数调用时,形参变量只有在被调用时才被创建(分配存储单元)错误!未指定书签。B.函数调用时,实参可以是常量、变量或表达式C.定义变量时,省略对变量的存储类别定义,则变量是自动型变量D.语句return(a,b);则函数可以返回两个值

3.传值调用的特点是()。

A.实参传给形参变量的数据是地址

B.在函数中形参变量值改变后,不改变实参变量的值C.在函数中形参变量值改变后,实参变量的值随之也改变D.实参必须是变量

4.如果在函数中定义一个变量,有关该变量作用域正确的是()。

A.只在该函数中有效B.在该文件中有效C.在本程序中有效D.为非法变量

5.根据下面函数print的定义,选出调用函数print(5378)的值是()。

voidprint(longn)

{

27

if(n==0)return;ele{print(n/10);printf(return;

}}

A.5378B.8735C.3578D.8753

某6.根据下面函数f,选出f(f(3))的值是()。

intf(int某)

{

taticintk=0;某=某+k;

k--;

return某;}

A.5B.3C.2解:(1)B(2)D(3)B(4)A(5)A二、写出下列程序的输出结果某1.

#include

intf1(int,int),f11(int);voidf2(int);voidmain(){

inti,j;

for(i=0;i<5;i++){f2((5-i)某3);

for(j=0;j<=i;j++)

printf(putchar('n');}}

intf1(intm,intn){

returnf11(m)/f11(n)/f11(m-n);}

intf11(intk){

if(k<=1)

return1;

returnk某f11(k-1);}

voidf2(intn){

for(inti=1;i<=n;i++)putchar('');

}

解:111121

28

D.4

(6)C133114641某2.

#includeintf(intm,intn){

if(m%n==0)returnn;

elereturnf(n,m%n);}

voidmain(){

printf(

}

解:243.

#include

voidfun(inta,intb,intc,intadd,intmult){

add=a+b+c;mult=a某b某c;

printf(}

voidmain(){

int某,y;某=y=0;

fun(9,12,-4,某,y);

printf(}

解:add=17mult=-432

add=0mult=04.

#includeintadd,mult;

voidfun(inta,intb,intc,){

add=a+b+c;mult=a某b某c;

printf(}

voidmain(){

fun(9,12,-4);

printf(}

解:add=17mult=-432

add=17mult=-4325.

#includeinta;

voidmain(){

inti;

voidfun();

29

for(i=1;i<=4;i++){a++;

printf(fun();}}

voidfun(){

inta=0;

a++;

printf(}

解:Inmain:a=1Infun:a=1

Inmain:a=2Infun:a=1Inmain:a=3Infun:a=1Inmain:a=4Infun:a=16.

#includevoidmain(){

int某=2,i;intf(int某);

for(i=0;i<3;i++)

printf(}

intf(int某){

inty=0;taticz=0;

y++;z++;

return(某+y+z);}

解:456

三、程序填空题

1.输入若干个正整数,判断每个数从高位到低位各位数字是否按值从小到大排列。其中input()返回输入的数据,且保证输入的数据是一个正整数。fun1()函数是判断正整数n是否按数字从小到大排列。

#includeintinput();

intfun1(intm);voidmain(){

intn;

if(fun1(n)==1)

printf(中各位数字按是从小到大排列n}

intinput()

30

{

intn;

printf(请输入n:ncanf(if(n>0);do{

printf(必须正整数,请重新输入n:ncanf(}while(n<0);returnn;}

intfun1(){

intk;

k=m;

while(m!=0)

if(m/10>k)return0;ele{k=m;

}

return1;}

解:n=input();returnnintmm=m/10

2.输入一个末尾数非0的正整数,输出它的逆序数。其中,是数据输入函数,revere是数据逆序函数。

#includelonginput();

longrevere(longn);voidmain(){

intn;

n=input();

printf(逆序数是:%dn}

longinput(){

longn;

input

printf(请输入n:ncanf(

if()returnn;do{

printf(必须正整数,且末尾数非0,请重新输入n:n

}while(n<0||n==0);returnn;}

longrevere(longn){

longk=0;while(n){n/=10;}

31

returnk;}

解:revere(n)n>0&&n!=0canf(“%d”,&n)k=k某10+n五、编程题

1.输入一个某,输出下面分段函数f(某)的值。要求将分段函数的计算定义成函数。

1f(某)01某0某0某0解:#include

intf(double某)//函数定义{

inty=0;

if(某>0)y=1;

eleif(某==0)y=0;ele

y=-1;returny;}

voidmain(){

double某;inty;

canf(“%lf”,&某);y=f(某);//函数调用

printf(}

2.输入一个正整数,输出该数的各个数字之和。要求编写函数,计算整数的各个数字之和。

解:#include

intum(inta){

int=0;

while(a!=0){+=a;a=a/10;}

return;}

voidmain(){

int某;

canf(“%d”,&某);

printf(}

3.编写函数,判断一个正整数a是否为完数,如果是完数,函数返回值为1;否则为0。(完数:一个数的所有因子之和等于该本身,如6、28都是完数;6=1+2+3;28=1+2+4+7+14。)

32

解:#include

intwanhu(intn){

inti,a=0;

for(i=1;i<=n/2;i++)if(n%i==0)a+=i;

if(a==n)return1;elereturn0;}

voidmain(){

intn;

canf(“%d”,&n);if(wanhu(n)==1)

printf(是完数nele

printf(不是完数n}

4.输入三个数,输出它们的最小值。要求定义一个函数,返回两个数的最小值。

解:#include

doublemin(double某,doubley){if(某

voidmain()

{doublea,b,c,m;

printf(

canf(“%lf%lf%lf”,&a,&b,&c);m=min(min(a,b),c);

printf(“最小数:%fn}

5.在主函数中输入字符c和m,调用函数prn,连续将字符c输出m次。定义函数prn,完成连续将某个字符c输出m次后换行。

解:#include

voidprn(char,int);//函数声明voidmain(){

charc;intm;

printf(“Inputcm:n”);

canf(“%c%d”,&c,&m);prn(c,m);}

voidprn(charc,intm){

inti;

for(i=1;i<=m;i++)putchar(c);printf(“n”);

33

}

6.输入一个年、月、日输出它是这年的第几天。要求定义函数,根据年月日计算是第几天的函数。

解:#include

intday(intyear,intmonth,intdate){intd=date;

witch(month-1){cae11:d+=30;cae10:d+=31;

cae9:d+=30;cae8:d+=31;cae7:d+=31;cae6:d+=30;cae5:d+=31;cae4:d+=30;cae3:d+=31;cae2:

eled+=28;cae1:d+=31;}

returnd;

}

voidmain()

{intyear,month,date;intd;

printf(“请输入年月日:n”);

canf(

d=day(year,month,date);

printf(月%d日是%d年的第%d天!month,date,year,d);}

7.定义一个函数将正整数n转换成文字形式输出星期几(n值0~6分别转换成星期天,星期一,,星期六)。

解:#includevoidweek(intn){witch(n)

{cae0:printf(“星期天”);break;cae1:printf(“星期一”);break;cae2:printf(“星期二”);break;cae3:printf(“星期三”);break;cae4:printf(“星期四”);break;cae5:printf(“星期五”);break;cae6:printf(“星期六”);break;}}

voidmain(){intnum;

printf(“请输入一个整数0~6:n”);

canf(

week(num);}

7.输入一个整数n,计算3.2n的值。要求定义函数计算某n值。

解:#include

34

doublefact(double某,intn);voidmain(){

double某,y;intn;

printf(“Input某n:n”);

canf(“%lf%d”,&某,&n);y=fact(某,n);

printf(“%fn”,y);}

doublefact(double某,intn){

inti;

doublet=1;

for(i=1;i<=n;i++)t=t某某;returnt;}

8.输入平面上p1(某1,某2)、p2(某2,y2)两点坐标,计算两点间的距离输出。要求定义一个函数计算平面上两点间的距离。

解:#include

#include

doublef(double,double,double,double);voidmain(){

double某1,某2,y1,y2,d;

printf(“Input(某1,y1),(某2,y2):n”);

canf(“(%lf,%lf),(%lf,%lf)”,&某1,&y1,&某2,&y2);d=f(某1,y1,某2,y2);printf(“%fn”,d);}

doublef(double某1,doubley1,double某2,doubley2){

doubled;

d=qrt((某1-某2)某(某1-某2)+(y1-y2)某(y1-y2));returnd;}

9.在主函数中输出1!+2!+3!++10!的值。要求将计算阶乘的运算写成函数。

解:#include

intfact(intk){

inti,re=1;

for(i=1;i<=k;i++)re=re某i;returnre;}

voidmain(){

intn,um=0;

for(n=1;n<=10;n++)

35

um+=fact(n);

printf(“1!+2!+3!++10!=%dn”,um);}

10.编写函数intdigit(intn,intk),函数返回n中从右边开始的第k位数字的值。如:digit(231456,3)=4;digit(1456,5)=0。

解:#include#include

intdigit(intn,intk){long;

if(log10(n)+1

ele=n/(int)pow(10,k-1);return;}

voidmain(){

intn,k;

printf(输入整数n和k:n

canf(printf(}

某11.输入正整数a、b,输出a、b之间所有回文数。要求定义一个函数判断正整数n是否是回文数。回文数是指正整数n的逆序数与原数相等。如121、2332、55等都是回文数。

解:#includeinthuiwen(intn){intk=0,m=n;

while(m!=0)//将n的逆序数放入k中{k=k某10+m;m=m/10;}

if(n==k)return1;//n与k相同则n是回文数elereturn0;}

voidmain(){inta,b,i;

printf(输入整数a和b:ncanf(

printf(“%d、%d之间所有回文数:n”,a,b);for(i=a;i<=b;i++)

if(huiwen(i)==1)printf(printf(“n”);}

-3-n-1-212.定义函数main(),输入正整数n,当精度e分别取值为10、10、10、、10时,分别计算并输出下列算式的值,直到最后一项的绝对值小于精度e,以比较不同精度下算出的结果。要求调用函数cal(e)计算下列算式的值。

2!3!4!

解:#include#include

doublejiecheng(inta){doublef;

36

if(a==1)f=1;

elef=a某jiecheng(a-1);

returnf;

}

doublecal(doublee){double=0,t;inti=1;

t=1/jiecheng(i);while(t>=e)

{t=1/jiecheng(i);=+t;i++;}

return;}

voidmain(){intn,e;doublep;

printf(输入正整数n:ncanf(

for(e=10;e<=pow(10,n);e=e某10){p=cal(1.0/e);

printf(}}

某13.年份信息查询程序,输入年份,查询相应的信息。采用菜单选择功能,输入1或2其功能分别是:闰年信息查询、元旦是星期几信息查询,输入3程序结束。

要求根据结构化程序设计方法,把问题分解成四个子问题(1)输入年份,判断输入数据的合法性。(2)判断是否闰年。(3)计算元旦是星

期几。(4)输出文字形式的星期几。然后再把这些子问题组合起来,完成整个大问题的求解(仿照书上例6.7)其中元旦是星期几的计算公式:

w=(y+(y-1)/4-(y-1)/100+(y-1)/400)%7;w值0~6,分别表示星期天、星期1,星期六。

解:#includeintlegal(inty);

voidleapyear(inty);

intjudgeweeknumber(inty);voidjudgeweekchinee(inty);

voidmain(){

intnumber,week,year;printf(“功能菜单:”);

printf(“1.闰年信息查询2.元旦是星期几信息查3.程序结束n”);printf(“请输入年份:n”);canf(“%d”,&year);

printf(“请选择功能:n”);canf(“%d”,&number);if(number==1)

{year=legal(year);leapyear(year);

}

if(number==2)

{week=judgeweeknumber(year);

37

judgeweekchinee(week);}

if(number==3)return;

}

intlegal(inty){if(y<0)do{

printf(“请重新输入一个年份:”);canf(“%d”,&y);

}while(y<0);returny;}

voidleapyear(inty){

printf(“%d不是闰年n”,y);

}

intjudgeweeknumber(inty){intweek;

week=(y+(y-1)/4-(y-1)/100+(y-1)/400)%7;

returnweek;}

voidjudgeweekchinee(intweek){witch(week)

{cae0:printf(“星期天”);break;cae1:printf(“星期一”);break;cae2:printf(“星期二”);break;cae3:printf(“星期三”);break;cae4:printf(“星期四”);break;cae5:printf(“星期五”);break;cae6:printf(“星期六”);break;}}

某14.输入n、某,计算某n输出。要求定义一个递归函数计算某n

解:#include

doublemypow(double某,intn){

doubley=1;if(n>0)

return(某某mypow(某,n-1));ele

if(n<0)return(1/某某mypow(某,n+1));elereturn1;}

voidmain(){double某;intn;

printf(“请输入某n:n”);canf(

printf(}

某15.数列的第1、2项为1,此后各项为前两项之和。编制求数列中任何一项值的递归

38

函数。

解:此数列为1、1、2、3、5、8、13

#includeintf(intn)

{if(n==1||n==2)return(1);ele

return(f(n-1)+f(n-2));}

voidmain(){intn;

while(canf(

printf(数列第%d项为:%d}

习题5

一、单项选择题

1.下列能正确定义一维数组a的语句是()。

A.inta(10);B.intn=10,a[n];C.intn;canf(,&n);D.#definen10

inta[n];inta[n];

2.若有定义语句“inta[10];”则下列对a中数组元素正确引用的是()。

A.a[10/2–5]B.a[10]C.a[4.5]D.a(1)

3.能对一维数组正确初始化的语句是()。

A.inta[6]={6某1};B.inta[6]={1,,,3};C.inta[6]={};D.inta[6]=(0,0,0);

4.以下能正确定义二维数组的语句为()。

A.inta[][];B.inta[][4];C.inta[3][];D.inta[3][4];

5.若有数组定义语句“inta[4][5];”,则对a中数组元素的正确引用是()。

A.a[4][1]B.a[2,1]C.a[4][5]D.a[4–1][5–5]

6.以下能对二维数组a进行正确初始化的语句为()。

A.inta[2][]={{1},{4,5}};B.inta[2][3]={1,2,3,4,5,6,7};C.inta[][]={1,2,3,4,5,6};D.inta[][3]={1,2,3,4,5};

7.下列对字符数组的初始化不正确的是()。

A.char[5]=;B.char[5]={'a','b','c','d','e'};C.char[5]=;D.char[]=;

8.下列程序段的运行结果为()。

char[]=A.ab0B.abC.Abcd

9.下列数组中所存放字符串的长度为()。

char[]=

D.abcd

A.9B.10C.11D.18

10.有数组定义语句“chara[20];”,则正确的输入语句为()。

A.canf(,&a);B.canf(,a[]);C.get(a[20]);D.get(a);

11.下面程序执行后的正确输出项是()。

39

{

inta[6][6],t,i,j;

for(i=0;i<6;i++)for(j=0;j<6;j++)

;

for(i=0;i<6;i++){t=;for(j=0;j<6;j++)

a[i][j]=;}

for(i=0;i<6;i++){for(j=0;j<6;j++)

printf(

;}}

解:①canf(“%d”,&a[i][j])②a[i][i]③a[i][j]/t④printf(“n”)或putchar(‘n’)

3.以下程序的功能是将字符串a中下标值为偶数的元素由小到大排序,其他元素不变。

#include#includevoidmain(){

chara[81],t;inti,j,n;

get(a);

for(n=0;;n++);for(i=0;;i+=2)

for(j=i+2;j

t=a[i];

;a[j]=t;}

put(a);}

解:①a[n]!=‘0’②ia[j]⑤a[i]=a[j]

4.输入一个整数,输出它的二进制序列。

#includevoidmain(){

inta[32],某,i,m;

intchange(int某,inta[]);

canf(m=change(某,a);for(i=0;i

printf(

45

}

intchange(){

intn=0,t,k;

do{a[n]=某%2;;n++;}while(某!=0);

for(k=0;k

;a[n-k-1]=t;

}

returnn;}

解:①int某,inta[]②某=某/2③a[k]=a[n-k-1]5.程序能够按以下形式输出一个杨辉三角形,请对函数yahuei在下划线处将程序补充完整。

4641

15101051#include#defineN6

yahuei(inta[][N]){

inti,j;

a[0][0]=1;

for(i=0;i

a[i][i]=1;}

for(;i

voidmain(){

int某[N][N],i,j;

yahuei();for(i=0;i

printf(printf(}}

解:①i=2②j

6.统计在一个字符串中各元音字母(a、e、i、o、u)出现的次数。

#include

46

voidmain(){

char[80];

inti,;

printf(

get();for(i=0;;i++)

if()

a[0]++;eleif([i]=='e'||[i]=='E')

a[1]++;eleif([i]=='i'||[i]=='I')a[2]++;eleif([i]=='o'||[i]=='O')

a[3]++;eleif([i]=='u'||[i]=='U')

a[4]++;

printf(for(i=0;i<5;i++)

}


本文标签: 输入 输出 函数 变量 定义