1、习题解析与答案 第1章C语言概述 一. 简答题 1.概述C语言的主要特点。 【解答】 (1)语言简洁、紧凑,使用方便、灵活。 (2)数据类型丰富,表达能力强。 (3)运算符多样。C语言中的运算符包含的范围非常广泛。 (4)具有结构化的控制语句。如if…else语句、while语句、do while语句、switch语句、for语句。 (5)允许直接访问物理地址。C语言中含有的位和指针运算,能够直接对内存地址进行访问操作。 (6)所生成的目标代码质量高,可移植性好。 2.构成C语言程序的基本单位是什么?它由哪几部分组成? 【解答】函数是构成C语言程序的基本单位。一个完
2、整的C程序一般由文件包含、宏定义、函数说明、变量和一个或若干个函数组成。 3.C语言程序的运行一般要经过哪几个步骤? 【解答】(1)编辑;(2)编译;(3)连接,生成EXE文件;(4)执行。 二.运行程序写结果 1.输入下面程序并运行。 main() { int a1,a2,x; a1=100; a2=50; x=a1-a2; printf(″x=%d\n″,x); } 【解答】运行结果为:x=50 2.输入下面程序并运行。 main() { int a1,a2,x; a1=10; a2=20; x=a1*a2; printf(″a1=%d
3、a2=%d\n″,a1,a2);
printf(″x=%d\n″,x);
}
【解答】运行结果为:a1=10,a2=20
x=200
3.输入下面程序并运行。
#include
4、 ***** **** *** ** * 思考:可以修改程序,使之输出平行四边形,等腰三角形等图形。 三.编程题 1.参照本章例题,编写一个C程序,用于显示如下信息: ************************* I love C programs! ************************* 【分析与提示】 ①
5、要有文件包含语句#include
6、programs! \n"); printf("************************\n"); } 第2章 数据类型及其运算 一.简答题 1.C语言中的数据类型主要有哪几类? 【解答】 短整型(short int ) 整型 整 型 (int)
7、 长整型(long int ) 基本类型 字符型 (char) 单精度(float) 实型(浮点型) 双精度(double) 枚举类型(enum)
8、 数组类型 构造类型 结构体类型 (struct) 共用体类型(union) 指针类型 空类型(void) 2. 字符常量与字符串常量有什么区别? 【解答】字符常量用单括号括起,字符串常量用双括号括起;字符常量存储时占1个字节,字符串常量存储时除了n个字符外,还有系统加上的字符串终止符\0,所以字符串常量存储时占n+1个字节。 3. C语言中的常量包括哪几类?各自是如何构成的? 【解答】C语言中的常量是
9、一些其值预先定的量,并且在程序执行过程中其值不再发生变化。常量的分类遵循基本数据类型分类原则,C语言编译系统自动将其存放在于类型相应的内存单元中。其类别包含整形常量、浮点常量、字符常量、字符串常量和枚举常量。整形常量又分为十进制整形常量、八进制整形常量、十六进制整形常量。浮点常量分成十进制形式和指数形式。C语言中的,字符常量是用单括号括起来的一个字符或是字符序列,而字符串常量是用一对双括号括起来的零个或者多个字符组成的序列。 4. 简述指针、变量的指针、变量的值、指针变量与指针变量的值的含义是什么? 【解答】C语言中将地址又称为“指针”。一个变量所分配的内存空间首字节地址,称为该变量的指针
10、地址),变量的值就被放入所分配的地址单元中。地址一旦被分配,就不会再改变,所以,指针是一个常量。既然是常量就可以把它赋给一个变量。用来存放指针的变量,被称为指针变量。一个指针变量的值是变量的地址,一个指针变量可以被赋予不同的指针值。 5. 下面哪些是不合法的常量?说明不合法的理由。 123,3.1415926,0892,’M’,’\n’,0xabc,0.618E-6,”Morning”,3.8e-3.14 【解答】非法常量有: 0892——含有非八进制数字8和9 3.8e-3.14——非法指数形式浮点常量:规定e后面的指数必须为整数。 6.下面对变量定义的语句哪些不正确?为什么?
11、请改正。 (1) char c1,int 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)
12、a,b:char; 错误。C语言中变量定义格式为:类型名 变量名; 改正为: char a,b; (4) char if; 错误。变量名不能与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
13、x1,y; 7. 下述字符串常量的长度是多少?在内存中存储时各自占用的单元数又是多少? (1) “Hello!” (2) “ABC\n\\TH\064\?” (3) “\xAB*\765+123=?” 【解答】 (1)“Hello!” 字符串长度为6,占用内存字节数为7。 (2)“ABC\n\\TH\064\?” 字符串长度为9,占用内存字节数为10。因为其中\n \\ \064\?各自只占一个字符的位置。 (3) “\xAB*\765+123=?” 该字符串不是合法的,因为\765表示的值太大,超出合法的ASCII字符集的范围。 二.运行程序写结果 1.以下程序
14、的执行结果是____。 main() { int i,j; i=15; printf(“%d,%d”, i++,i--); } 【解答】14,15 2.以下程序的执行结果是 。 main() { int a=20,b=10,c,*p1,*p2; p1=&a; p2=&b; c=(-*p1)/(*p2)+6; printf("a=%d,b=%d\n",a,b); printf("*p1=%d,*p2=%d\n",*p1,*p2); printf("c=%d\n",c); } 【分析与提示】
15、 p1 a
a
20
b
10
P2 b`
【解答】a=20,b=10
*p1=20,*p2=10
c=4
3.以下程序的执行结果是 。
#include
16、 } 【分析与提示】从ASCII代码表可以看出,字符“G”、“o”、“o”、“d”的ASCII代码值为71、111、101,因此,’G’+32、’o’-6、’o’+3、’d’+8的值分别是103、105、114、108,它们所对应的字符分别是“g”、“i”、“r”、“l”。 常用结论: (1)在C语言中,字符数据可以按其ASCII代码值参加整数运算。由于英文字母在ASCII代码表中是按顺序排列的,所以在计算’o’+3代表的字母时,可从字符’o’其顺序向后取3个字母,该字母是“r”。 (2)从ASCII代码表可以看出“小写字母”-“对应大写字母”的结果是32,因此可推算出如下等式:大写
17、字母的ASCII值+32=对应小写字母的ASCII值;小写字母的ASCII值-32=对应大写字母的ASCII值。
【解答】girl
4.以下程序的执行结果是 。
#include
18、等于7,7-6等于1)
x3=0(-3*4等于-12,-12%-6等于0)
【解答】x1=11
x2=1
x3=0
5.以下程序的执行结果是 。
#include
19、的ASCII码值,八进制表示是72)
【解答】0
49,1
58,:,72
三、改错题
1. 请修改下列程序,使其能够通过编译。
#include
20、
c=a*b;
printf("%d",c);
}
2. 请修改下列程序,使其能够正确运行。
#include
21、正确的程序如下:
#include
22、成。 二、填空题 1.符号’&’ 是_______运算符,&a是指_______。 2.C语言中的空语句就是_______。 3.Scanf函数中的“格式字符”后面应该是_______,而不应该是______。 4.若想输出字符%,则应该在“格式字符”的字符串中用_____表示。 5.int x=7;执行x+=x- =x+x;后x的值是_______。 6.int a=10,b=20;a+=b;b=a-b;a- =b; 的功能是_______。 答案:1.地址、变量a的内存地址。 2.一个分号。 3.变量地址,变量名。 4. 连续2个%号。
23、
5. -14
6.交换 变量a,b的值,打印出a=20,b=10。
三.运行程序写结果
1.以下程序的执行结果是 。
#include
24、解答】6 6 6.000000 6.000000
3.以下程序的执行结果是 。
main()
{
int k=17;
printf("%d,%o,%x\n",k,k,k);
}
【解答】17,21,11
4.以下程序的执行结果是 。
#include
25、析与提示】可以用%c格式输出的,也可以用%d格式输出,所以与%md近似,m指出了要输出数据的宽度。若数据位数小于m,则左端补空格,若数据位数大于m,则按实际位数输出。
【解答】A
B
C
D
5.以下程序的执行结果是 。
#include
26、1=A,c2=A,c3=65,c4=66
6.以下程序的执行结果是 。
#include
27、 main() { char ch='a';int a=98; unsigned b=1000;long c=123456789;float x=3.14; double y=1.2345678; printf("(1)a=%d,a=%c,ch=%d,ch=%c\n",a,a,ch,ch); printf("(2)b=%u\n",b); printf("(3)c=%ld\n",c); printf("(4)x=%f,y=%f\n",x,y); printf("(5)x=%e,y=%e\n",x,y); printf("(6)y=%-10.2f\n",y); } 【解答
28、1)a=98,a=b,ch=97,ch=a
(2)b=1000
(3)c=123456789
(4)x=3.140000, y=1.234568
(5)x=3.14000e+00,y=1.23457e+00
(6)y=1.23
8.以下程序的执行结果是 。
#include
29、程序的运行结果,执行结果是 。
#include
30、e
31、0└┘└┘└┘20Aa1.5└┘-3.75└┘1.5,67.8 <回车> 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=%c,c2=%
32、c\n",a,b, x,y,c1,c2); } 【分析与提示】在使用多个scanf函数输入数据时,第一个输入行末尾输入的回车被第二个scanf函数吸收,因此在第二、三个scanf函数的双引号后放置一个空格以抵消上行输入的回车键。若没有一个空格,则按上面输入的数据会出错。 【解答】运行输入:a=3, b=4<回车> X=8, y=71.82<回车> C1=AC2=a<回车> 运行结果:a=3,b=7,x=8.500000,y=71.820000,c1=A,c2=a 四.编程题 1.由键盘输入1个字母,输出其ASCII码值。 【分析与提示】将一个字符常数赋给一个字符变量,
33、并不是把该字符本身放到内存单元中去,而是将该字符的ASCII代码放到内存单元中,因此,字符型数据也可以像整型数据那样使用,可以用来表示一些特定范围内的整数。所以int型与char型变量的值可以互换,分别用%c和%d不同格式输出就行了。 但是注意这种转换是有条件的。因为,char变量在内存占一个字节,而int整型变量占2个字节。当int型高位字节是0时,char与 int可以互换;若不是0,则不可以互换。例如,用%c格式输出时,取低位字节,高位字节被舍弃。 参考代码: #include "stdio.h" main() { char ch; ch=getchar(); print
34、f("%c,%d",ch,ch);
}
【解答】运行输入:B <回车>
运行结果:B,66
2.从键盘上输入一个大写字母,把它转换成小写字母,然后显示出来。
【分析与提示】大写字母转换小写时ASCII码值+32,相反的,小写字母转换成大写字母时ASCII码值-32。
参考代码:
#include
35、A,a 3.从键盘上输入两个实型数,求两数的和、差、积,输出结果时要求小数部分占两位。 【提示】结果要求保留2位小数,所以输出的结果格式为%.2f。 main() { float x,y,a,b,c; printf("please input x,y:"); scanf("%f,%f",&x,&y); a=x+y; b=x-y; c=x*y; printf("x=%f,y=%f\n",x,y); printf("x+y=%.2f\nx-y=%.2f\nx*y=%.2f\n",a,b,c); } 【解答】 运行输入:please input x,y
36、10,20<回车>
运行结果:x=10.000000,y=20.000000
x+y=30.00
x-y=-10.00
x*y=200.00
4.编写一个程序,求出给定半径r的圆以及内正n边形的面积,并且输出计算结果。r和n的值由用户输入。
【分析与提示】由数学知识得到: 半径为r圆的面积,半径为r圆的内接正n边形的面积,其中
处理步骤:提示信息,接收参数值;计算圆的面积; 计算正n边形的面积;输出结果。
参考代码:
#include
37、 main() { int n; float 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=%.2f\tA=%.2f\n",s,area); return(0); } 运行结果如下: Please inout the radius and the N.; 1 5 S=3.14 A=2.38 5.已知华氏温度与摄氏温度之间的转换公式是:
38、 编写一个程序,将用户输入的华氏温度转换成摄氏温度,并予以输出。
【分析与提示】首先要定义输入输出温度为浮点型,且5/9两数相除结果为整数,5/9的值为0,故不能写成5/9,而应写成(5.0/9.0)*(f-32)。结果要求保留2位小数,所以输出的结果格式为%5.2f。
参考代码:
#include
39、/9的值为0*/ printf("the C.temperature is: %.2f",c); return(0); } 【解答】运行结果如下: please input the F: 75<回车> the C.te,[erature is: 23.89 6.由键盘输入5个学生的计算机成绩,计算他们的平均分并保留2位小数。 【分析与提示】方法与上题类似,同样是保留两位有效数字%6.2f。 参考代码: main() { int a,b,c,d,e; float total,aver; printf("Plese input 5 s
40、tudents’ 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.2f\n",aver); } 【解答】运行输入:80,93,75,68,87 <回车> 运行结果:Average:80.60 7.编写将输入的英里转换为公里,每英里等于5380英尺,每英尺等于12英寸,每英寸等于2. 54厘米,每公里等于100 000厘米。 main() { double mile,k; printf(“enter mile
41、); scanf(“%lf”,&mile); k=mile*5380*12*2.54/100000; printf(“ %lf mile is %lf kilometer\n”,mile,k); } 【解答】运行:enter mile:2↙ 2.000000 mile is 3.279648 kilometer 第4章 选择结构程序设计 4.1 习题 一.填空题 1.已知a=3,b=4,c=5。则逻辑表达式a+b>c&&b= =c的值为 ,!(a>b)&&c||1的值为 ,!(a+b)+c-1&&b+c/2的值为
42、 。
【分析与提示】本题考查运算符的优先级别。
【解答】0 ; 1 ; 1
二、运行程序写结果
1.下列程序运行的运行结果为 。
#include 43、为:找出a,b,c,d,e中最小的值并输出。
【解答】Min is 2
2.若输入3,4<回车>,下列程序运行的运行结果为 ;若输入4,3<回车>,下列程序运行的运行结果为 。
#include 44、a,b,c);}
}
【分析与提示】本题程序的功能为:从键盘输入变量a,b,计算c的值(若a>=b,则c=a*b,若a
main()
{
int x=1,y=0,a=0,b=0;
switch(x)
{
case 1:
switch(y)
{case 0: a++; break;
case 1: b++; break;
} 45、
case 2: a++; b++; break;
}
printf("a=%d,b=%d\n",a,b);
}
【分析与提示】本题中case 1:后面是一个switch语句,执行完该语句后,直接执行case 2:后面的语句。
【解答】a=2,b=1
三.编程题
1.输入一个字母,若为小写,则把它变成大写输出。
【分析与提示】小写字母的ASCII码值与其对应的大写字母的ASCII码值相差32。
参考代码:
main( )
{
char c;
printf("请输入一个字母\n") ;
scanf("%c", &c);
46、
if(c>=’a’&&c<=’z’)
c=c-32;
printf("%c\n",c) ;
}
2. 企业发放的奖金根据利润提成。利润(I)低于或等于10万元时,奖金可提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,求应发放奖金总数?
【分析与提示】请利用数轴来分界,定位。注意定义时 47、需把奖金定义成长整型。
参考代码:
main()
{
long int i;
int bonus1,bonus2,bonus4,bonus6,bonus10,bonus;
scanf("%ld",&i);
bonus1=100000*0.1;bonus2=bonus1+100000*0.75;
bonus4=bonus2+200000*0.5;
bonus6=bonus4+200000*0.3;
bonus10=bonus6+400000*0.15;
if(i<=100000)
bonus=i*0.1;
else if(i<=2000 48、00)
bonus=bonus1+(i-100000)*0.075;
else if(i<=400000)
bonus=bonus2+(i-200000)*0.05;
else if(i<=600000)
bonus=bonus4+(i-400000)*0.03;
else if(i<=1000000)
bonus=bonus6+(i-600000)*0.015;
else
bonus=bonus10+(i 49、1000000)*0.01;
printf("bonus=%d",bonus);
}
3.由键盘输入三个整数a、b、c,用条件运算符求出其中最大值和最小值。
【分析与提示】首先比较输入的a,b 的大小,并把大数装入max, 小数装入min 中,然后再与c 比较,若max 小于c,则把c 赋予max;如果c 小于min,则把c 赋予min。因此max 内总是最大数,而min 内总是最小数。最后输出max 和min 的值即可。
参考代码:
main( )
{
int a,b,c,max,min;
scanf("%d,%d,%d", &a,&b,&c);
max=a> 50、b?a:b ;
max=max>c?max:c;
min=a






