习题解析与答案
第1章C语言概述
一.简答题
1.概述C语言的主要特点。
【解答】
(1)语言简洁、紧凑,使用方便、灵活。
(2)数据类型丰富,表达能力强。
(3)运算符多样。C语言中的运算符包含的范围非常广泛。
(4)具有结构化的控制语句。如if…else语句、while语句、do while语句、switch语句、for语句。
(5)允许直接访问物理地址。C语言中含有的位和指针运算,能够直接对内存地址进行访问操作。
(6)所生成的目标代码质量高,可移植性好。
2.构成C语言程序的基本单位是什么?它由哪几部分组成?
【解答】函数是构成C语言程序的基本单位。一个完整的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,a2=%d\n″,a1,a2);
printf(″x=%d\n″,x);
}
【解答】运行结果为:a1=10,a2=20
x=200
3.输入下面程序并运行。
#include
main()
{
printf("******\n");
printf(" *****\n");
printf(" ****\n");
printf(" ***\n");
printf(" **\n");
printf(" *\n");
}
【解答】运行结果为:******
*****
****
***
**
*
思考:可以修改程序,使之输出平行四边形,等腰三角形等图形。
三.编程题
1.参照本章例题,编写一个C程序,用于显示如下信息:
*************************
I love C programs!
*************************
【分析与提示】
①要有文件包含语句#include
②main是主函数的名称。用{}括起来的内容是函数体,函数体由若干条语句组成,这是计算机要执行的部分,每条语句以分号“;”结束。
③注意显示的信息有三行,所以要用到换行符“\n”。
参考代码:
#include
main()
{
printf("************************\n");
printf(" I love C programs! \n");
printf("************************\n");
}
第2章数据类型及其运算
一.简答题
1.C语言中的数据类型主要有哪几类?
【解答】短整型(short int )
整型整型(int)
长整型(long int )
基本类型字符型 (char)单精度(float)
实型(浮点型)
双精度(double)
枚举类型(enum)
数组类型
构造类型结构体类型 (struct)
共用体类型(union)
指针类型
空类型(void)
2.字符常量与字符串常量有什么区别?
【解答】字符常量用单括号括起,字符串常量用双括号括起;字符常量存储时占1个字节,字符串常量存储时除了n个字符外,还有系统加上的字符串终止符\0,所以字符串常量存储时占n+1个字节。
3.C语言中的常量包括哪几类?各自是如何构成的?
【解答】C语言中的常量是一些其值预先定的量,并且在程序执行过程中其值不再发生变化。常量的分类遵循基本数据类型分类原则,C语言编译系统自动将其存放在于类型相应的内存单元中。其类别包含整形常量、浮点常量、字符常量、字符串常量和枚举常量。整形常量又分为十进制整形常量、八进制整形常量、十六进制整形常量。浮点常量分成十进制形式和指数形式。C语言中的,字符常量是用单括号括起来的一个字符或是字符序列,而字符串常量是用一对双括号括起来的零个或者多个字符组成的序列。
4.简述指针、变量的指针、变量的值、指针变量与指针变量的值的含义是什么?
【解答】C语言中将地址又称为“指针”。一个变量所分配的内存空间首字节地址,称为该变量的指针(地址),变量的值就被放入所分配的地址单元中。地址一旦被分配,就不会再改变,所以,指针是一个常量。既然是常量就可以把它赋给一个变量。用来存放指针的变量,被称为指针变量。一个指针变量的值是变量的地址,一个指针变量可以被赋予不同的指针值。
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.下面对变量定义的语句哪些不正确?为什么?请改正。
(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) 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 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.以下程序的执行结果是____。
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);
}
【分析与提示】
p1 a
【解答】
c=4
3.以下程序的执行结果是。
#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%c\n",a,b,c,d);
}
【分析与提示】从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,因此可推算出如下等式:大写字母的ASCII值+32=对应小写字母的ASCII值;小写字母的ASCII值-32=对应大写字母的ASCII 值。
【解答】girl
4.以下程序的执行结果是。
#include
main()
{
int x;
x=-3+4*5-6;
printf("x1=%d\n",x);
x=3+4%5-6;
printf("x2=%d\n",x);
x=-3*4%-6;
printf("x3=%d\n",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=0
5.以下程序的执行结果是。
#include
main()
{
printf("%d\n",NULL);
printf("%d,%c\n",49,49);
printf("%d,%c,%o\n",48+10,48+10,48+10);
}
【分析与提示】
0(NULL的ASCII码值是0)
49,1(数字1的ASCII码值是49)
58,:,72(48+10等于58,正好是“:”的ASCII码值,八进制表示是72)
【解答】0
49,1
58,:,72
三、改错题
1.请修改下列程序,使其能够通过编译。
#include
V oid 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("%d",c);
}
2.请修改下列程序,使其能够正确运行。
#include
void main();
{
float f=7.12;
char c=”c”;
printf(“%d\n”,int(f%3));
printf(“%c”,c);
}
【答案】错误的地方有3处:(1)第2行main();不应该有分号;(2)定义char c=”c”;
时,字符常量应该用单引号;(3)打印语句printf(“%d\n”,int(f%3));的格式有错,应该在f前的int 用括号括起来,因为实型数据不能执行取余运算。
正确的程序如下:
#include
void main()
{
float f=7.12;
char c='c';
printf("%d\n",((int)f %3));
printf("%c",c);
}
第3章顺序结构程序设计
一.简答题
1.程序有哪三种基本结构?
【解答】程序的三种基本结构为:顺序结构、选择结构和循环结构。
2.C语言的语句有哪几类?表达式语句与表达式有什么不同?
【解答】C语句可分为以下五类:表达式语句、函数调用语句、控制语句、复合语句和空语句。其中表达式语句与表达式的区别在于表达式语句是表达式加上“;”组成。
二、填空题
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个%号。
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("%d\n",d*y);
}
【解答】0
2.以下程序的执行结果是。
{
double d;float f;long l;int i;
i=f=l=d=20/3;
printf("%d %ld %f %f\n",i,l,f,d);
}
【解答】6 6 6.000000 6.000000
3.以下程序的执行结果是。
main()
{
int k=17;
printf("%d,%o,%x\n",k,k,k);
}
【解答】17,21,11
4.以下程序的执行结果是。
#include
main()
{
char a,b,c,d;
a='A',b='B',c='C',d='D';
printf("%1c\n",a);
printf("%2c\n",b);
printf("%3c\n",c);
printf("%4c\n",d);
}
【分析与提示】可以用%c格式输出的,也可以用%d格式输出,所以与%md近似,m指出了要输出数据的宽度。若数据位数小于m,则左端补空格,若数据位数大于m,则按实际位数输出。
【解答】A
B
C
D
5.以下程序的执行结果是。
#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=66
6.以下程序的执行结果是。
#include
main()
{
char c1,c2;
scanf("%c,%c",&c1,&c2);
++c1;
printf("c1=%c,c2=%c\n",c1,c2);
}
【分析与提示】例如当输入B,C<回车>,B,C的ASCII码值为66,67,执行++c1; --c2;后,c1为66+1变成67即C,c2为67-1变成66即B。
【解答】运行输入:B,C<回车>,运行结果为:c1=C,c2=B
7.以下程序的执行结果是。
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);
}
【解答】(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
main()
{
int a,b;
float x;
scanf("%d,%d",&a,&b);
x=a/b;
printf("\nx=%f\n",x);
}
【解答】运行输入:2,2<回车>,运行结果为:1.000000
9.当输入12345,a时,给出程序的运行结果,执行结果是。
#include
main()
{
int a;char c;
scanf("%3d,%c",&a,&c);
printf("\n%d,%d\n",a,c);
}
【分析与提示】%md,m指出了要输出数据的宽度。若数据位数小于m,则左端补空格,若数据位数大于m,则按实际位数输出。a的ASCII码值是97。
【解答】12345,97
10.分析下面程序,在键盘上输入数据才能使得变量a=10,b=20,c1=’A’,c2=’a’,x=1.5,y=-3.75,z=67.8。
程序如下:
#include
main()
{
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的值时,要先键入三个空格,然后再键入10与20。%*f是用来禁止赋值的。在输入时,对应%*f位置可以随意输入一个数(我们输入 1.5,该数不会赋值给任何变量的)。
【解答】运行输入:└┘└┘└┘10└┘└┘└┘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=%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码值。
【分析与提示】将一个字符常数赋给一个字符变量,并不是把该字符本身放到内存单元中去,而是将该字符的ASCII代码放到内存单元中,因此,字符型数据也可以像整型数据那样使用,可以用来表示一些特定范围内的整数。所以int型与char型变量的值可以互换,分别用%c和%d不同格式输出就行了。
但是注意这种转换是有条件的。因为,char变量在内存占一个字节,而int整型变量占2个字节。当int型高位字节是0时,char与 int可以互换;若不是0,则不可以互换。例如,用%c格式输出时,取低位字节,高位字节被舍弃。
参考代码:
#include "stdio.h"
main()
{
char ch;
ch=getchar();
printf("%c,%d",ch,ch);
}
【解答】运行输入:B <回车>
运行结果:B ,66
2.从键盘上输入一个大写字母,把它转换成小写字母,然后显示出来。
【分析与提示】大写字母转换小写时ASCII 码值+32,相反的,小写字母转换成大写字母时ASCII 码值-32。
参考代码:
#include
main() { char x1,x2; printf("x1=?\n"); scanf("%c",&x1); x2=x1+32;
printf("%c,%c\n",x1,x2);
}
【解答】运行输入:A <回车>
运行结果: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: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 圆的面积2
r s π=,半径为r 圆的内接正n 边形的面积
2/sin 2αnr A =,其中n /2πα=
处理步骤:提示信息,接收参数值;计算圆的面积; 计算正n 边形的面积;输出结果。
参考代码:
#include
#include
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.已知华氏温度与摄氏温度之间的转换公式是:)32(9/5-?=F c , 编写一个程序,将用户输入的华氏温度转换成摄氏温度,并予以输出。
【分析与提示】首先要定义输入输出温度为浮点型,且5/9两数相除结果为整数,5/9的值为0,故不能写成5/9,而应写成(5.0/9.0)*(f-32)。结果要求保留2位小数,所以输出的结果格式为%5.2f 。
参考代码: #include
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 : 23.89
6.由键盘输入5个学生的计算机成绩,计算他们的平均分并保留2位小数。