C语言程序设计习题参考答案
习题1
一、判断题
1.在计算机中,小数点和正负号都有专用部件来保存和表示。
2.二进制是由0和1两个数字组成的进制方式。
3.二进制数的逻辑运算是按位进行的,位与位之间没有进位和借位的关系。
4.在整数的二进制表示方法中,0的原码、反码都有两种形式。
5.有符号数有三种表示法:原码、反码和补码。
6.常用字符的ASCII码值从小到大的排列规律是:空格、阿拉伯数字、大写英文字母、小写英文字母。
解:1.F 2.T 3.T 4.T 5.T 6.T
二、单选题
1.在计算机中,最适合进行数值加减运算的数值编码是。
A. 原码
B. 反码
C. 补码
D. 移码
2.已知英文小写字母m的ASCII码为十进制数109,则英文小写字母y的ASCII码为十进制数。
A. 112
B. 120
C. 121
D. 122
3.关于ASCII码,在计算机中的表示方法准确地描述是。
A. 使用8位二进制数,最右边一位为1
B. 使用8位二进制数,最左边一位为1
C. 使用8位二进制数,最右边一位为0
D. 使用8位二进制数,最左边一位为0
4.设在机器字长4位,X=0111B,Y=1011B,则下列逻辑运算中,正确的是___________。
A. X∧Y=1000
B. X∨Y=1111
C. X⊕Y=0011
D. ˉY=1000
5.下列叙述中正确的是()。
A.高级语言就是机器语言
B.汇编语言程序、高级语言程序都是计算机程序,但只有机器语言程序才是计算机可以直接识别并执行的程序
C.C语言因为具有汇编语言的一些特性,所以是汇编语言的一种
D.C源程序经过编译、连接,若正确,执行后就能得到正确的运行结果6.用C语言编写的源程序经过编译后,若没有产生编译错误,则系统将()。
A.生成可执行文件B.生成目标文件
C.输出运行结果D.自动保存源文件
7.下列叙述中不正确的是()。
A.main函数在C程序中必须有且只有一个
B. C程序的执行从main函数开始,所以main函数必须放在程序最前面
C. 函数可以带参数,也可以不带参数。
D. 每个函数执行时,按函数体中语句的先后次序,依次执行每条语句
解:1.C 2.C 3.D 4.B 5.B 6.B 7.B
三、填空题
1.()10=( )2=( )8=( )16 2.(.10111)2=( )8=( )16=( )10 3.输入三个数,计算并输出三个数的和与三个数的乘积。 程序如下:
#include <> void main()
{
int a,b,c,s,z;
printf("Please input a b c:\n");
s=a+b+c; printf("%d\n",s); }
*4. 输入三角形三条边的边长,计算并输出三角形的面积。 根据三条边的边长,计算三角形面积的公式如下:
2x y z s ++?
?== ???
面积其中 程序如下:
#include <> #include <>
void main() {
double x,y,z,s,dime; scanf("%lf%lf%lf",&x,&y,&z); dime=sqrt(s*(s-x)*(s-y)*(s-z)); }
解:1.
2.
3.scanf("%f%f%f",&a,&b,&c); z=a*b*c; printf("%f",z); 4.s=(x+y+2)/2; printf("%f",dim); 四、编程题
1.仿照例,编程序在屏幕上显示:
***************************** Merry Christmas!
Happy New Year! *****************************
解:#include <> void main()
{ printf("*****************************\n");
printf(" Merry Christmas!\n");
printf(" Happy New Year!\n");
printf("*****************************\n");
}
2.仿照例编程,输入一个整数,计算这个数的平方。
解:#include<>
void main()
{ int a,z;
printf("请输入一个整数:\n");
scanf("%d",&a);
z=a*a;
printf("%d*%d=%d\n",a,a,z);
}
*3.仿照例编程,输入两个数后,输出其中较小值。
解:#include<>
float min(float x, float y)
{ float m;
if (x else m=y; return m; } void main() { float a,b,c,mindata; printf("请输入二个数:\n"); scanf("%f %f",&a,&b); mindata=min(a,b); printf("较小数:%f\n",mindata); } *4.仿照例编程,输入a、b后,输出一元一次方程ax+b=0的解。解:#include<> void main() { float a,b,x; printf("请输入a、b:\n"); scanf("%f %f",&a,&b); x=-a/b; printf("x=%f\n",x); } *5.仿照例编程,输入圆柱体的半径和高,计算并输出圆柱体的体积。解:#include <> void main() { float r,h,s,v; printf("Please input r and h:\n"); scanf("%f %f",&r,&h); v=*r*r*h; printf("V=%f\n",v); } 习题2 一、判断题 1.任何变量都必须要定义其类型。 2.C语言的double类型数据在其数值范围内可以表示任何实数。 3.C语言的任何类型数据在计算机内都是以二进制形式存储的。 4.isdigit(‘5’)的结果为0。 5.printf函数中格式符“%c”对应的参数只能是字符类型。 6.按格式符“%d”输出float类型变量时,截断小数位取整后输出。 7.在C语言程序中,ABC与abc是两个相同的变量。 8.scanf函数中的格式符“%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,150 007 –0x3d π1e0 e1 o7o8 ‘x’‘x o’sin(3) 0xf16 ‘\a’‘\009’ +2 ‘\\’‘a’+2 0x100h 0128 10L 解:合法的C常量有: 整型常量:007 –0x3d 0xf16 10L 实型常量:1e0 +2 字符型常量:‘x’‘\a’‘\\’ 三、指出下列各项中哪些是C语言中的用户标识符 x_1 X_2 High printf β3DS i/j e2 -e2 count Int number $23 next_ sizeof IF sum_12 _123# NO1: double for 解:C的用户标识符有:x_1 X_2 High e2 count Int number next_ IF sum_12 四、单项选择题 1.C语言中,char型数据在内存中的存储形式是()。 A.原码B.反码C.补码D.ASCII码2.若有定义语句“char c='\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未输入 C.c1未输入,c2是‘A’D.c1是‘A’,c2是‘\n’ 5.a、b是整型变量,执行语句“scanf("a=%d,b=%d",&a,&b);”,使a和b的值分别为1和2,正确的输入是()。 A.1 2 B.1,2 C.a=1,b=2 D.a=1 b=2 6.设c为字符型变量值为‘A’,a为整型变量值为97,执行语句“putchar(c);putchar(a);”后,输出结果为()。 A.Aa B.A97 C.A9 D.aA 7.已知字母A的ASCII码值为65,以下语句段的输出结果是()。 char c1='A',c2='Y'; printf("%d,%d\n",c1,c2); A.输出格式非法,输出错误信息B.65,90 C.A,Y D.65,89 8.若要使用输入语句“scanf("%4d%4d%10f",&i,&j,&x);”,为i输入-10,为j输入12,为x输入,则正确的输入形式是()。 A.–↙B.–10 12 ↙ C.–.67↙D.–10,12,↙ 9.能正确地定义符号常量的是()。 A.#define n=10 B.#define n 10 C.#define n 10;D.#DEFINE N 10 10.在C语言中,int、char、short三种类型数据在内存中所占的字节数()。 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.char ch='$';float x=; 语句“printf("%c%–\\n",ch,x);”的输出结果是。 解:$ \n 2.int i=123;float x= –; 语句“printf("i=%5d x=%\n",i,x);”的输出结果是。 解:i= 123 x= 3.char c='a';int a=65; 语句“putchar(c+1);putchar(a);”的输出结果是。 解:bA 4.int a=98; 语句“printf(“%d,%c,%o,%x”,a,a+1,a+2,a+3);”的输出结果是。 解:98,c,144,65 5.int k; float f; 语句“scanf(“%3d%*4d%6f”,&k,&f);”执行时输入.43↙ 则k= ,f= 。 解:k=123 f= 6.使用pow()函数时,程序的开头必须写一条预处理命令:。 解:#include <> 5.填空题。 (1)int i=123,j=45; 函数printf("%d,%d\n",i,j);的输出结果是。 解:123,45 (2)int i=123; float x=; 语句printf("i=%5d x=%7.4f\n",i,x); 的输出结果是 。 解:i= 123 x= (3)float alfa=60,pi=3 习 题 3 一、根据下列数学式,写出C 的算术表达式。 cd d c b a d c ab e x x x y b a +- +++-++?+--22 1 |)sin(|tan 102)(5 65.312 4 32π 解:-(a 2+b 2)×y 4 的C 表达式:-(a*a+b*b)*pow(y,4) π ++-x 1 2 tan 102 的C 表达式:(sqrt(2)+10*10)/(pow(tan(x),-1)+ 5.3|)sin(|x 的C 表达式:sqrt(pow (fabs (sin(x)),) 5 6 e x - 的C 表达式:pow(x,6)-exp(5) cd d c b a d c ab +- +++221 的C 表达式:2*a*b+c+d)/(a+2*b-(c+d)/c/d) 二、按照要求,写出下列C 的表达式。 1.写出int 类型变量x 为“奇数”的表达式。 解:x%2==1 2.Int 类型变量x 、y 、z ,写出描述“x 或y 中有且仅有一个小于z ”的表达式。 解:x 3.将double 类型变量y 保留四位小数的表达式。 解:(int)(y*10000+/ 4.为变量s 赋值:取变量x 的符号,取变量y 的绝对值。 解:s=(x>=01:-1)*(y>=0y:-y) 5.条件“-5≤x ≤3”所对应的C 逻辑表达式。 解:-5<=x&&x<=3 6.a 、b 是字符变量,已知a 的值为大写字母、b 的值为小写字母,写出判断a 、b 是否为同一字母(不区分大小写)的逻辑表达式 解:a+32==b 或 b-a==321:0 7.int 类型变量a 、b 均为两位正整数,写出判断a 的个位数等于b 的十位数、且b 的个位数等于a 的十位数的逻辑表达式。 解:a%10==b/10&&a/10==b%10 8.写出判断某个人是否是成年人(年龄大于21),且不是老年人(年龄大于65)的逻辑表达 式。 解: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 x=3,y=4,z=5;,下列表达式中值为0的是()。 A.'x'&&'y' B. x<=y C.x||y+z&&y–z D. !((x A.0 B. 1 C.“假”D.“真” 3.判断char型变量c为数字字符的正确表达式为()。 A.'0'<=c<='9' B.'0'<=c&&c<='9' C.c>='0'||c<='9' D.c>=0&&c<=9 4.下列运算符中,优先级最低的是()。 A.:B.&& C.= = D.*= 5.若有条件表达式“xa++:b--”,则以下表达式中()等价于表达式x。 A.x==0 B.x!=0 C.x==1 D.x!=1 6.有定义int k=4,a=3,b=2,c=1;,表达式“k A.4 B.3 C.2 D.1 7.执行下列程序段后,变量a,b,c的值分别是()。 int x=10,y=9,a,b,c; a=(--x= =y++)--x:++y;b=x++;c=y; A.a=9,b=9,c=9 B.a=8,b=8,c=10 C.a=9,b=10,c=9 D.a=1,b=11,c=10 8.有定义int a=9;,语句“a+=a– =a+a;”执行后,变量的值是()。 A.18 B.9 C.–18 D.–9 9.设x和y均为int型变量,则语句“x+=y;y=x–y;x– =y;”的功能是()。 A.把x和y按从小到大排列B.把x和y按从大到小排列 C.无确定结果D.交换x和y中的值 10.有定义double x=1,y;,表达式“y=x+3/2”的值是()。 A.1 B.2 C.D. 11.设有定义int x;double y;,则下列表达式中结果为整型的是()。 A.(int)y+x B.(int)x+y C.int(y+x) D.(double)x+y 12.设有整型变量x,下列说法中,错误的是()。 A.“5.0”不是表达式B.“x”是表达式 C.“!x”是表达式D.“sqrt(x)”是表达式 解:(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 x=,y=; int a=7;,表达式x+a%3*(int)(x+y)%2/4 值为。 解: 2.设int x=2,y=3;,执行语句“x*=x+y”后x的值为。 解:10 3.设int x=17,y=5;,执行语句“x%=x–y”后x的值为。 解:5 4.设int a=6,b=4,c=2;,表达式!(a-b)+c-1&&b-c/2 的值为。 解:1 5.设int a=2,b=4,x,y;,表达式!(x=a)||(y=b)&&! 的值为。 解:0 6.判断变量a、b是否绝对值相等而符号相反的逻辑表达式为。 解:a==-b 7.判断变量a、b中必有且只有一个为0的逻辑表达式为。 解:a*b==0&&a+b!=0 8.设int m=2,n=2,a=1,b=2,c=3;执行语句d=(m=a==b)&&(n=b>c);后,m和n的值分别为。 解:m为0,n为2 9.设int a=2;,表达式“a%2!=0”的值为。 解:0 10.设char c='y';,表达式“c>='a'&&c<='z'|| c>='A'&&c<='Z'”的值为。 解:1 11.写出与代数式(x+2)e x+2对应的C表达式。 解:(x+2)*exp(x+2) 12.设int a=2;执行语句a=3*5,a*4;后a的值为。 解:15 五、写出下列程序的输出结果。 1. #include <> void main() { unsigned k,n; scanf("%u",&n); 3 c.3f输入矩形的边长,求矩形面积。 解:#include <> void main() { double a,b,s; printf(“请输入矩形的长,宽\n”); scanf(“%lf,%lf”,&a,&b); s=a*b; printf(“矩形面积=%f\n”,s); } 8. 已知等差数列的第一项为a,公差为d,求前n项之和,a、d、n由键盘输入。 解:#include <> void main() { int a,d,n,sum; printf(“请输入等差数列的首项公差项数\n”); scanf(“%d%d%d”,&a,&d,&n); sum=a*n+n*(n-1)*d/2; printf(“ sum=%d\n”,sum); } 9. 编写程序,将d天h小时m分钟换算成分钟,输入d、h、m,输出换算结果。 解:#include <> void main() { int d,h,m,t; printf(“请输入天小时分钟\n”); scanf(“%d%d%d”,&d,&h,&m); t=d*24*60+h*60+m; printf(“%d天%d小时%d分钟=%d分钟\n”,d,h,m,t); } 10. 编写程序,求出给定半径r的圆以及内接正n边形的面积,输出计算结果。r和n的值由键盘输入。 解:#include <> #include <> #define PI void main() { double r,s1,s2; int n; printf(“Input r n\n”); scanf(“%lf%d”,&r,&n); s1=PI*r*r; s2=n/*r*r*sin(2*PI/n); printf(“圆面积=%f,正内接%d边形面积=%f\n”,s1,s2); } 习题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<'z')ch-32:ch; 2.下列各语句中,能够将变量u、s中最大值赋给变量t的是()。 A.if(u>s)t=u;t=s;B.t=s;if(u>s)t=u; C.if(u>s)t=s;else t=u D.t=u;if(u>s)t=s; 3.假设变量x、k都已定义,下列语句片段中,无语法错误的是()。 A. switch(x){ case x>=90: putchar('A'); case x<60: putchar('E'); } B. switch(x) { case 1+2: k='A'; defualt: k='E'; case 2*4: k='B'; } C. switch(x){ case 2+x: k=x-2; case 3*x: k=x+3; default: k=0; } D. switch(x){ case : k=*x; case : k=8*x; default: k=0; } *4.与语句while(!s )中的条件等价的是( )。 A .s==0 B .s!=0 C .s==1 D .s=0 5.下列语句中,哪一个可以输出26个大写英文字母( )。 A .for(a='A';a<='Z';printf("%c",++a)); B .for(a='A';a<'Z';a++)printf("%c",a); C .for(a='A';a<='Z';printf("%c",a++)); D .for(a='A';a<'Z';printf("%c",++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 <> void main() { char x; int n=0,k=0; while((x=getchar())!='#'){ 0 c ???????>=<-<>=+<<->=>=+=00000000),(2222y x y x y x y x y x y x y x y x y x f ))()((2z s y s x s s z y x s ---=++=面积 .3f 111111n 23456-+-+-+前40°F * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 3 1In2In3In4In ?????<-=>=010001)(x x x x f -110-210-310-n 101111.....2!3!4!s =++++年信息查询 2.元旦是星期几信息查 3. 程序结束\n ”); printf(“请输入年份:\n ”); scanf(“%d ”,&year); printf(“请选择功能:\n ”); scanf(“%d ”,&number); if(number==1) { year=legal(year); leapyear(year); } n n if(number==2) { week=judgeweeknumber(year); judgeweekchinese(week); } if(number==3) return; } int legal(int y) { if(y<0) do { printf(“请重新输入一个年份:”); scanf(“%d”,&y); } while(y<0); return y; } void leapyear(int y) { if(y%4==0&&y%100!=0||y%400==0) printf(“%d是闰年\n”,y); else printf(“%d不是闰年\n”,y); } int judgeweeknumber(int y) { int week; week=(y+(y-1)/4-(y-1)/100+(y-1)/400)%7; return week; } void judgeweekchinese(int week) { switch(week) { case 0: printf(“星期天”); break; case 1: printf(“星期一”); break; case 2: printf(“星期二”); break; case 3: printf(“星期三”); break; case 4: printf(“星期四”); break; case 5: printf(“星期五”); break; case 6: printf(“星期六”); break; } } *14.输入n、x,计算x n输出。要求定义一个递归函数计算x n。 解:#include<> double mypow(double x,int n) { double y=1; if (n>0) return(x*mypow(x,n-1)); else if (n<0) return(1/x*mypow(x,n+1)); else return 1; } void main() { double x; int n; printf(“请输入x n:\n”); scanf("%lf%d",&x,&n); printf("%f\n",mypow(x,n)); } *15.数列的第1、2项为1,此后各项为前两项之和。编制求数列中任何一项值的递归函数。 解:此数列为1、1、2、3、5、8、13……。 #include<> int f(int n) { if (n==1||n==2) return (1); else return (f(n-1)+f(n-2)); } void main() { int n; while(scanf("%d",&n),n<0); printf("数列第%d项为:%d",n,f(n)); } 习题5 一、单项选择题 1.下列能正确定义一维数组a的语句是()。 A.int a(10); B.int n=10,a[n]; C.int n;scanf("%d",&n); D.#define n 10 int a[n];int a[n]; 2.若有定义语句“int a[10];”则下列对a中数组元素正确引用的是()。 A.a[10/2–5] B.a[10] C.a[] D.a(1) 3.能对一维数组正确初始化的语句是()。 A.int a[6]={6*1}; B.int a[6]={1,,,3}; C.int a[6]={}; D.int a[6]=(0,0,0); 4.以下能正确定义二维数组的语句为()。 A.int a[][];B.int a[][4];C.int a[3][];D.int a[3][4]; 5.若有数组定义语句“int a[4][5];”,则对a中数组元素的正确引用是()。 A.a[4][1] B.a[2,1] C.a[4][5] D.a[4–1][5–5] 6.以下能对二维数组a进行正确初始化的语句为()。 A.int a[2][]={{1},{4,5}};B.int a[2][3]={1,2,3,4,5,6,7}; C.int a[][]={1,2,3,4,5,6};D.int a[][3]={1,2,3,4,5}; 7.下列对字符数组s的初始化不正确的是()。 A.char s[5]="abc";B.char s[5]={'a','b','c','d','e'}; C.char s[5]="abcde";D.char s[]="abcde"; 8.下列程序段的运行结果为()。 char s[]="ab\0cd"; printf("%s",s); A.ab0 B.ab C.Abcd D.ab cd 9.下列数组s中所存放字符串的长度为()。 char s[]="a\128b\\\tcd\xdg\n"; A.9 B.10 C.11 D.18 10.有数组定义语句“char a[20];”,则正确的输入语句为()。 A.scanf("%s",&a);B.scanf("%s",a[]); C.gets(a[20]);D.gets(a); 11.下面程序执行后的正确输出项是()。 #include<> void swap1(int a[ ]) { int t; t=a[0]; a[0]=a[1]; a[1]=t; } void swap2(int a,int b) { int t; t=a; a=b; b=t; } void main() { int x[2]={1,5}; int y[2]={1,5}; swap1(x); swap2(y[0],y[1]); printf("x: %d %d\n", x[0],x[1]); printf("y: %d %d\n", y[0],y[1]); } A. x:5 1 B. x:1 5 C. x:1 5 D. x:5 1 y:1 5 y:5 1 y:1 5 y:5 1 12.执行下列程序后的输出结果是()。 #include <> char f(char s[],int n) { return (s[n]); } main() { char a[]="ABCD"; printf("%c",f(a,2)+1); } A.D B.C C.B D.A 13.执行下列程序后的输出结果是()。 #include <> int f(int a[],int n) { if(n==0) return a[0]; else return f(a,n-1)+a[n]; } main() { int x[]={1,3,5,7,9}; printf("%d\n",f(x,3)); } A.1 B.4 C.9 D.16 解: 二、填空题 1.构成数组的各个元素必须具有相同的。 解:数据类型 2.若有定义“int a[10]={1,2};”,则数组元素a[2]的值为。 解:0 3.若有定义“int a[3][4];”,则数组a行下标的上限为,列下标的下限为。 解:2 0 4.C语言程序在执行过程中,不检查数组下标是否。 解:越界 5.C语言中,二维数组元素在内存中的存放顺序是。 解:按行存放 6.若有定义“int a[3][4];”,则在数组元素a[2][2]前有个元素。 解:10 7.若用数组名作为函数调用的实参,传递给形参的是。 解:数组第一个元素的地址 8.若有定义语句“char s1[ ]="abc",s2[ ]={'a','b','c'};”,则数组s1有个元素,数组s2有个元素。 解:4 3 三、写出下列程序的输出结果 1.#include <> void main() { int a[6]={2,3,7,1,9,6},i,j,k,m; for(i=5;i>=0;i--){ k=a[5]; for(j=4;j>=0;j--) a[j+1]=a[j]; a[0]=k; for(m=0;m<6;m++) printf("%2d",a[m]); putchar('\n'); } } 解:6 2 3 7 1 9 9 6 2 3 7 1 1 9 6 2 3 7 7 1 9 6 2 3 3 7 1 9 6 2 2 3 7 1 9 6 2.#include <> void main() { int n[3],i,j,k; for(i=0;i<3;i++) n[i]=0; k=3;