《c语言程序设计第五版习题答案(62页).doc》由会员分享,可在线阅读,更多相关《c语言程序设计第五版习题答案(62页).doc(62页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、-c语言程序设计第五版习题答案-第 61 页习题解析与答案第1章C语言概述一 简答题1概述C语言的主要特点。【解答】(1)语言简洁、紧凑,使用方便、灵活。(2)数据类型丰富,表达能力强。(3)运算符多样。C语言中的运算符包含的范围非常广泛。(4)具有结构化的控制语句。如ifelse语句、while语句、do while语句、switch语句、for语句。(5)允许直接访问物理地址。C语言中含有的位和指针运算,能够直接对内存地址进行访问操作。(6)所生成的目标代码质量高,可移植性好。2构成C语言程序的基本单位是什么?它由哪几部分组成?【解答】函数是构成C语言程序的基本单位。一个完整的C程序一般由
2、文件包含、宏定义、函数说明、变量和一个或若干个函数组成。3语言程序的运行一般要经过哪几个步骤?【解答】(1)编辑;(2)编译;(3)连接,生成EXE文件;(4)执行。二运行程序写结果1输入下面程序并运行。main()int a1,a2,x; a1=100;a2=50;x=a1-a2; printf(x=%dn,x);【解答】运行结果为:x=502输入下面程序并运行。main()int a1,a2,x; a1=10;a2=20;x=a1*a2; printf(a1=%d,a2=%dn,a1,a2);printf(x=%dn,x);【解答】运行结果为:a1=10,a2=20 x=200三编程题1参
3、照本章例题,编写一个程序,用于显示如下信息:I love C programs!【分析与提示】要有文件包含语句#include 。C语言中没有数据的输入、输出等功能,数据的输入、输出都是通过调用系统提供的库函数scanf和printf等来实现的。这些函数的说明都包括在stdio.h文件中。main是主函数的名称。用括起来的内容是函数体,函数体由若干条语句组成,这是计算机要执行的部分,每条语句以分号“;”结束。 注意显示的信息有三行,所以要用到换行符“n”。参考代码:#include main()printf(*n);printf( I love C programs! n);printf(*n
4、);第2章 数据类型及其运算一简答题1C语言中的数据类型主要有哪几类?【解答】 短整型(short int ) 整型 整 型 (int) 长整型(long int ) 基本类型 字符型 (char) 单精度(float) 实型(浮点型) 双精度(double) 枚举类型(enum) 数组类型 构造类型 结构体类型 (struct) 共用体类型(union) 指针类型空类型(void)2 字符常量与字符串常量有什么区别?【解答】字符常量用单括号括起,字符串常量用双括号括起;字符常量存储时占1个字节,字符串常量存储时除了n个字符外,还有系统加上的字符串终止符0,所以字符串常量存储时占n+1个字节。
5、3 C语言中的常量包括哪几类?各自是如何构成的?【解答】C语言中的常量是一些其值预先定的量,并且在程序执行过程中其值不再发生变化。常量的分类遵循基本数据类型分类原则,C语言编译系统自动将其存放在于类型相应的内存单元中。其类别包含整形常量、浮点常量、字符常量、字符串常量和枚举常量。整形常量又分为十进制整形常量、八进制整形常量、十六进制整形常量。浮点常量分成十进制形式和指数形式。C语言中的,字符常量是用单括号括起来的一个字符或是字符序列,而字符串常量是用一对双括号括起来的零个或者多个字符组成的序列。4 简述指针、变量的指针、变量的值、指针变量与指针变量的值的含义是什么?【解答】C语言中将地址又称为
6、“指针”。一个变量所分配的内存空间首字节地址,称为该变量的指针(地址),变量的值就被放入所分配的地址单元中。地址一旦被分配,就不会再改变,所以,指针是一个常量。既然是常量就可以把它赋给一个变量。用来存放指针的变量,被称为指针变量。一个指针变量的值是变量的地址,一个指针变量可以被赋予不同的指针值。5 下面哪些是不合法的常量?说明不合法的理由。123,3.,0892,M,n,0xabc,”Morning”,【解答】非法常量有:0892含有非八进制数字8和93.8e-3.14非法指数形式浮点常量:规定e后面的指数必须为整数。6下面对变量定义的语句哪些不正确?为什么?请改正。(1) char c1,i
7、nt a2; (2) INT a,b; FLOAT x,y;(3) a,b:char;(4) char if; (5) int a,b (6) Int a:b:c; (7) int a,x; float x,y;【解答】(1) char c1,int a2;错误。定义不同类型的变量时,应用分号彼此分开。改正为:char c1; int a2;(2) INT a,b; FLOAT x,y;错误。C语言中表示类型名的关键字必须小写。改正为:int a,b; float x,y;(3) a,b:char;错误。C语言中变量定义格式为:类型名 变量名;改正为: char a,b;(4) char if
8、;错误。变量名不能与C语言的关键字重名。改正为:char f1;(5) int a,b 错误。变量定义以语句形式出现,应以分号结尾。改正为:int a,b;(6) Int a:b:c; 错误。类型名不能有大写字母,相同类型名之间用逗号分隔。改正为:int a,b,c;(7) int a,x; float x,y;错误。在同一程序位置上,同一变量名不能重复定义充当两个不同的变量。改正为:int a,x; float x1,y;7 下述字符串常量的长度是多少?在内存中存储时各自占用的单元数又是多少?(1) “Hello!” (2) “ABCnTH064?” (3) “xAB*765+123=?”【
9、解答】(1)“Hello!” 字符串长度为6,占用内存字节数为7。(2)“ABCnTH064?” 字符串长度为9,占用内存字节数为10。因为其中n 064?各自只占一个字符的位置。(3) “xAB*765+123=?” 该字符串不是合法的,因为765表示的值太大,超出合法的ASCII字符集的范围。二运行程序写结果1以下程序的执行结果是。 main()int i,j;i=15;printf(“%d,%d”, i+,i-);【解答】14,152以下程序的执行结果是 。main() int a=20,b=10,c,*p1,*p2; p1=&a;p2=&b; c=(-*p1)/(*p2)+6; pri
10、ntf(a=%d,b=%dn,a,b);printf(*p1=%d,*p2=%dn,*p1,*p2); printf(c=%dn,c);【分析与提示】 p1 a a20b10 P2 b【解答】a=20,b=10 *p1=20,*p2=10 c=43以下程序的执行结果是 。#include main()char a=G,b=o,c=o,d=d;a=a+32; b=b-6;c=c+3;d=d+8;printf(%c%c%c%cn,a,b,c,d);【分析与提示】从ASCII代码表可以看出,字符“G”、“o”、“o”、“d”的ASCII代码值为71、111、101,因此,G+32、o-6、o+3、d
11、+8的值分别是103、105、114、108,它们所对应的字符分别是“g”、“i”、“r”、“l”。常用结论:(1)在C语言中,字符数据可以按其ASCII代码值参加整数运算。由于英文字母在ASCII代码表中是按顺序排列的,所以在计算o+3代表的字母时,可从字符o其顺序向后取3个字母,该字母是“r”。(2)从ASCII代码表可以看出“小写字母”-“对应大写字母”的结果是32,因此可推算出如下等式:大写字母的ASCII值+32=对应小写字母的ASCII值;小写字母的ASCII值-32=对应大写字母的ASCII值。【解答】girl4以下程序的执行结果是 。#include main()int x;x
12、=-3+4*5-6;printf(x1=%dn,x);x=3+4%5-6;printf(x2=%dn,x);x=-3*4%-6;printf(x3=%dn,x);【分析与提示】x1=11(4*5是20,-3+20是17,17-6等于11) x2=1(4%5等于4,3+4等于7,7-6等于1) x3=0(-3*4等于-12,-12%-6等于0)【解答】x1=11 x2=1 x3=05以下程序的执行结果是 。#include main()printf(%dn,NULL);printf(%d,%cn,49,49);printf(%d,%c,%on,48+10,48+10,48+10);【分析与提示】
13、0(NULL的ASCII码值是0)49,1(数字1的ASCII码值是49)58,:,72(48+10等于58,正好是“:”的ASCII码值,八进制表示是72)【解答】0 49,1 58,:,72三、改错题1 请修改下列程序,使其能够通过编译。#include Void Main()int a=6;b=8;int c;c=a*b;printf(%d,c);【答案】错误的地方有3处:(1)第2行关键字应该小写;(2)定义b时前面应该用逗号;(3)打印语句的格式应该用双引号括起来。正确的程序如下:#include void main()int a=6,b=8;int c;c=a*b;printf(%
14、d,c);2 请修改下列程序,使其能够正确运行。#include void main();float f=7.12;char c=”c”;printf(“%dn”,int(f%3);printf(“%c”,c);【答案】错误的地方有3处:(1)第2行main();不应该有分号;(2)定义char c=”c”;时,字符常量应该用单引号;(3)打印语句printf(“%dn”,int(f%3);的格式有错,应该在f前的int用括号括起来,因为实型数据不能执行取余运算。正确的程序如下:#include void main()float f=7.12;char c=c;printf(%dn,(int)
15、f %3);printf(%c,c);第3章 顺序结构程序设计一 简答题1程序有哪三种基本结构?【解答】程序的三种基本结构为:顺序结构、选择结构和循环结构。2C语言的语句有哪几类?表达式语句与表达式有什么不同?【解答】C语句可分为以下五类:表达式语句、函数调用语句、控制语句、复合语句和空语句。其中表达式语句与表达式的区别在于表达式语句是表达式加上“;”组成。二、填空题 1符号& 是运算符,&a是指。2C语言中的空语句就是。3Scanf函数中的“格式字符”后面应该是,而不应该是。4若想输出字符%,则应该在“格式字符”的字符串中用表示。5int x=7;执行x+=x- =x+x;后x的值是。6in
16、t a=10,b=20;a+=b;b=a-b;a- =b; 的功能是。答案:1地址、变量a的内存地址。 2一个分号。3变量地址,变量名。4 连续2个%号。 5 -14 6交换 变量a,b的值,打印出a=20,b=10。三运行程序写结果1.以下程序的执行结果是 。#include main()double d=3.2;int x,y;x=1.2;y=(x+3.8)/5.0;printf(%dn,d*y);【解答】02以下程序的执行结果是 。main()double d;float f;long l;int i;i=f=l=d=20/3;printf(%d %ld %f %fn,i,l,f,d);
17、【解答】6 6 6. 6.3以下程序的执行结果是 。main()int k=17;printf(%d,%o,%xn,k,k,k);【解答】17,21,114以下程序的执行结果是 。#include main()char a,b,c,d;a=A,b=B,c=C,d=D;printf(%1cn,a); printf(%2cn,b); printf(%3cn,c); printf(%4cn,d);【分析与提示】可以用%c格式输出的,也可以用%d格式输出,所以与md近似,m指出了要输出数据的宽度。若数据位数小于m,则左端补空格,若数据位数大于m,则按实际位数输出。【解答】A B C D5以下程序的执行
18、结果是 。#include main()char c1,c2;scanf(%c%c,&c1,&c2);printf(c1=%c,c2=%c,c3=%d,c4=%d,c1+,-c2,c1,c2);【解答】运行输入:AB运行结果为:c1=A,c2=A,c3=65,c4=666以下程序的执行结果是 。#include main()char c1,c2;scanf(%c,%c,&c1,&c2); +c1;-c2;printf(c1=%c,c2=%cn,c1,c2);【分析与提示】例如当输入B,C,B,C的ASCII码值为66,67,执行+c1; -c2;后,c1为66+1变成67即C,c2为67-1变
19、成66即B。【解答】运行输入:B,C,运行结果为:c1=C,c2=B7以下程序的执行结果是 。main()char ch=a;int a=98;unsigned b=1000;long c=;float x=3.14;double y=1.;printf(1)a=%d,a=%c,ch=%d,ch=%cn,a,a,ch,ch);printf(2)b=%un,b);printf(3)c=%ldn,c);printf(4)x=%f,y=%fn,x,y);printf(5)x=%e,y=%en,x,y);printf(6)y=%-10.2fn,y);【解答】(1)a=98,a=b,ch=97,ch=a
20、(2)b=1000(3)c=(4)x=3., y=1.(5)x=3.14000e+00,y=1.23457e+008以下程序的执行结果是 。#includemain()int a,b;float x;scanf(%d,%d,&a,&b);x=a/b;printf(nx=%fn,x);【解答】运行输入:2,2,运行结果为:1.9当输入12345,a时,给出程序的运行结果,执行结果是 。#includemain()int a;char c;scanf(%3d,%c,&a,&c);printf(n%d,%dn,a,c);【分析与提示】md,m指出了要输出数据的宽度。若数据位数小于m,则左端补空格,若
21、数据位数大于m,则按实际位数输出。a的ASCII码值是97。【解答】12345,9710分析下面程序,在键盘上输入数据 才能使得变量a=10,b=20,c1=A,c2=a,x=1.5,y=-3.75,z=67.8。程序如下:#includemain()int a,b;float x,y,z;char c1,c2;scanf(%5d%5d%c%c%f%f%*f,%f,&a,&b,&c1,&c2,&x,&y,&z);printf(a=%d,b=%d,c1=%c,c2=%c,x=%f,y=%f,z=%f,a,b,c1,c2,x,y,z);【分析与提示】按%5 d格式输入a与b的值时,要先键入三个空格
22、,然后再键入10与20。%*f是用来禁止赋值的。在输入时,对应%*f位置可以随意输入一个数(我们输入,该数不会赋值给任何变量的)。【解答】运行输入:10 11一个程序中,使用了多个scanf函数输入数据,用a=3,b=7,x=8.5,y=71.82,c1=A,c2=a 输入到每个变量,应该如何输入数据? main() int a,b; float x,y; char c1,c2; scanf(a=%d,b=%d,&a,&b); scanf( x= %f,y=%e,&x,&y); scanf( c1= %cc2=%c,&c1,&c2); printf(a=%d,b=%d,x=%f,y=%f,c1
23、=%c,c2=%cn,a,b, x,y,c1,c2);【分析与提示】在使用多个scanf函数输入数据时,第一个输入行末尾输入的回车被第二个scanf函数吸收,因此在第二、三个scanf函数的双引号后放置一个空格以抵消上行输入的回车键。若没有一个空格,则按上面输入的数据会出错。【解答】运行输入:a=3, b=4 C1=AC2=a运行结果:a=3,b=7,x=8.,y=71.,c1=A,c2=a四编程题1由键盘输入1个字母,输出其ASCII码值。【分析与提示】将一个字符常数赋给一个字符变量,并不是把该字符本身放到内存单元中去,而是将该字符的ASCII代码放到内存单元中,因此,字符型数据也可以像整型
24、数据那样使用,可以用来表示一些特定范围内的整数。所以int型与char型变量的值可以互换,分别用%c和%d不同格式输出就行了。但是注意这种转换是有条件的。因为,char变量在内存占一个字节,而int整型变量占2个字节。当int型高位字节是0时,char与 int可以互换;若不是0,则不可以互换。例如,用%c格式输出时,取低位字节,高位字节被舍弃。参考代码:#include stdio.hmain()char ch;ch=getchar();printf(%c,%d,ch,ch);【解答】运行输入:B 运行结果:B,662从键盘上输入一个大写字母,把它转换成小写字母,然后显示出来。【分析与提示】
25、大写字母转换小写时ASCII码值+32,相反的,小写字母转换成大写字母时ASCII码值-32。参考代码: #include main()char x1,x2;printf(x1=?n); scanf(%c,&x1);x2=x1+32;printf(%c,%cn,x1,x2);【解答】运行输入:A 运行结果:A,a3从键盘上输入两个实型数,求两数的和、差、积,输出结果时要求小数部分占两位。【提示】结果要求保留2位小数,所以输出的结果格式为%.2f。main()float x,y,a,b,c; printf(please input x,y:); scanf(%f,%f,&x,&y); a=x+y
26、; b=x-y; c=x*y; printf(x=%f,y=%fn,x,y); printf(x+y=%.2fnx-y=%.2fnx*y=%.2fn,a,b,c);【解答】运行输入:please input x,y:10,20运行结果:x=10.,y=20.4编写一个程序,求出给定半径r的圆以及内正n边形的面积,并且输出计算结果。r和n的值由用户输入。【分析与提示】由数学知识得到: 半径为r圆的面积,半径为r圆的内接正n边形的面积,其中 处理步骤:提示信息,接收参数值;计算圆的面积; 计算正n边形的面积;输出结果。参考代码:#include #include main()int n;float
27、 r,s,area;printf(Please input the radius and the N.:n);scanf(%f%d,&r,&n);s=PI*r*r;area=(n*r*r*sin(2*PI/n)/2.0;printf(S=%.2ftA=%.2fn,s,area);return(0);运行结果如下:Please inout the radius and the N.;1 5 5已知华氏温度与摄氏温度之间的转换公式是:, 编写一个程序,将用户输入的华氏温度转换成摄氏温度,并予以输出。【分析与提示】首先要定义输入输出温度为浮点型,且5/9两数相除结果为整数,5/9的值为0,故不能写成
28、5/9,而应写成(5.0/9.0)*(f-32)。结果要求保留2位小数,所以输出的结果格式为。参考代码: #include main() int f; float c; printf(nplease input the F:); scanf(%d,&f); c=5.0/9*(f-32); /*不能写成5/9,两数相除结果为整数,5/9的值为0*/ printf(the C.temperature is: %.2f,c); return(0);【解答】运行结果如下: please input the F: 75 the C.te,erature is: 6由键盘输入5个学生的计算机成绩,计算他们
29、的平均分并保留2位小数。【分析与提示】方法与上题类似,同样是保留两位有效数字%6.2f。参考代码:main()int a,b,c,d,e;float total,aver;printf(Plese input 5 students scores:n);scanf(%d,%d,%d,%d,%d,&a,&b,&c,&d,&e);total=a+b+c+d+e;aver=total/5.0;printf(Average:%6.2fn,aver);【解答】运行输入:80,93,75,68,87 运行结果:7编写将输入的英里转换为公里,每英里等于5380英尺,每英尺等于12英寸,每英寸等于2. 54厘米
30、,每公里等于100 000厘米。main()double mile,k;printf(“enter mile:”);scanf(“%lf”,&mile);k=mile*5380*12*2.54/;printf(“ %lf mile is %lf kilometern”,mile,k);【解答】运行:enter mile:22. mile is 3. kilometer第4章 选择结构程序设计4.1 习题一填空题1.已知a=3,b=4,c=5。则逻辑表达式a+bc&b= =c的值为 ,!(ab)&c|1的值为 ,!(a+b)+c-1&b+c/2的值为 。【分析与提示】本题考查运算符的优先级别。【
31、解答】0 ; 1 ; 1二、运行程序写结果 #includemain() int a=3,b=8,c=9,d=2,e=4; int min; min=(ab)? a:b;min=(minc)? min:c; min=(mind)? min:d;min=(mine)? min:e; printf(Min is%dn,min);【分析与提示】本题程序的功能为:找出a,b,c,d,e中最小的值并输出。【解答】Min is 2 2若输入3,4,下列程序运行的运行结果为 ;若输入4,3,下列程序运行的运行结果为 。#includemain() int a,b,c; printf(Input a,b: )
32、; scanf(%d,%d,&a,&b); if(a=b) c=a*b; printf(%d*%d=%dn,a,b,c); else c=a/b; printf(%d/%d=%dn,a,b,c);【分析与提示】本题程序的功能为:从键盘输入变量a,b,计算c的值(若a=b,则c=a*b,若ab则c=a/b),并输出a,b,c的值。【解答】3/4=0 ; 4*3=123下列程序运行的运行结果为 。#include main()int x=1,y=0,a=0,b=0; switch(x)case 1: switch(y) case 0: a+; break; case 1: b+; break; c
33、ase 2:a+; b+; break; printf(a=%d,b=%dn,a,b);【分析与提示】本题中case 1:后面是一个switch语句,执行完该语句后,直接执行case 2:后面的语句。【解答】a=2,b=1三编程题 1输入一个字母,若为小写,则把它变成大写输出。 【分析与提示】小写字母的ASCII码值与其对应的大写字母的ASCII码值相差32。参考代码:main( )char c;printf(请输入一个字母n) ;scanf(%c, &c);if(c=a&c=z)c=c-32;printf(%cn,c) ;2 企业发放的奖金根据利润提成。利润(I)低于或等于10万元时,奖金可
34、提10%;利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提成7.5%;20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时高于40万元的部分,可提成3%;60万到100万之间时,高于60万元的部分,可提成1.5%,高于100万元时,超过100万元的部分按1%提成,从键盘输入当月利润I,求应发放奖金总数?【分析与提示】请利用数轴来分界,定位。注意定义时需把奖金定义成长整型。 参考代码:main()long int i; int bonus1,bonus2,bonus4,bonus6,bonus10,bonus; scanf(%ld
35、,&i); bonus1=*0.1;bonus2=bonus1+*0.75; bonus4=bonus2+*0.5; bonus6=bonus4+*0.3; bonus10=bonus6+*0.15;if(i=)bonus=i*0.1;else if(i=)bonus=bonus1+(i-)*0.075;else if(i=)bonus=bonus2+(i-)*0.05;else if(i=)bonus=bonus4+(i-)*0.03;else if(ib?a:b ;max=maxc?max:c;min=ab?a:b;min=minc?min:c;printf(最大值为:%d,最小值为:%d
36、n,max,min) ;4有一函数: x (x1) y= 2x-1 (1x10) 3x-11 (x10)编一程序,输入一个x值,输出y值。 【分析与提示】本题考查if语句的嵌套,应当注意if与else的配对关系。从最内层开始,else总是与它上面最近的(未曾配对的)if 配对。参考代码: main( )float x,y;printf(请输入x的值 n) ;scanf(%f, &x);if(x=10) y=3*x-11;else y=2*x-1;printf(x=%6.2f,y=%6.2f,x,y) ;5从键盘上输入星期号,并显示该日期的英文名字。【分析与提示】本实例知识点:switch语句。
37、switch语句的控制流程是:首先计算表达式的值,然后依次与每一个case中的常量值进行比较,一旦发现了某个能够匹配的值,就执行该case后面的语句组,直到遇到break语句为止。如果表达式的值与所有case中的常量都不匹配,则执行default后面的语句组。参考代码:main( )int xqh;char ywm; printf(请输入星期号(17):n);scanf(%d,&xqh);switch(xqh) case 1: printf(Monday); break; case 2: printf(Tuesday); break; case 3: printf(Wednesday); br
38、eak; case 4: printf(Thursday); break; case 5: printf(Friday); break; case 6: printf(Saturday); break;case 7: printf(Sunday); break; default:printf(error);6某市不同车牌的出租车3公里的起步价和计费分别为:夏利7元/公里,3公里以外2.1元/公里;富康8元/公里,3公里以外2.4元/公里;桑塔纳9元,3公里以外2.7元/公里。编程:从键盘输入乘车的车型及行车公里数,输出应付车资。【分析与提示】可设三个变量,分别表示乘车的车型、行车公里数和应付车资,根据乘车的车型和行车公里数,计算出应付的车资。参考代码:main( )int cx; /*定义乘车的车型变量cx */ float gl, cf; /*定义行车公里数