C语言程序设计(第二版)习题参考答案
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
C语言程序设计习题参考答案
习题 1
一、判断题
1.在计算机中,小数点和正负号都有专用部件来保存和表示。
2.二进制是由0和1两个数字组成的进制方式。
3.二进制数的逻辑运算是按位进行的,位与位之间没有进位和借位的关系。
4.在整数的二进制表示方法中,0的原码、反码都有两种形式。
5.有符号数有三种表示法:原码、反码和补码。
6.常用字符的ASCII码值从小到大的排列规律是:空格、阿拉伯数字、大写英文字母、小写英文字母。
解:1.F2.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.(87.625)10=( )2=( )8=( )16
2.(1001010111001.10111)2=( )8=( )16=( )10
3.输入三个数,计算并输出三个数的和与三个数的乘积。
程序如下:
#include <stdio.h>
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 <stdio.h>
#include <math.h>
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.1010111.101 127.5 57.A
2.11271.56 12B9.B8 4793.71875
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.仿照例1.1,编程序在屏幕上显示:
*****************************
Merry Christmas!
Happy New Year!
*****************************
解:#include <stdio.h>
void main()
{ printf("*****************************\n");
printf(" Merry Christmas!\n");
printf(" Happy New Year!\n");
printf("*****************************\n");
}
2.仿照例1.2编程,输入一个整数,计算这个数的平方。
解:#include<stdio.h>
void main()
{ int a,z;
printf("请输入一个整数:\n");
scanf("%d",&a);
z=a*a;
printf("%d*%d=%d\n",a,a,z);
}
*3.仿照例1.3编程,输入两个数后,输出其中较小值。
解:#include<stdio.h>
float min(float x, float y)
{ float m;
if (x<y) m=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.仿照例1.2编程,输入a、b后,输出一元一次方程ax+b=0的解。
解:#include<stdio.h>
void main()
{ float a,b,x;
printf("请输入a、b:\n");
scanf("%f %f",&a,&b);
x=-a/b;
printf("x=%f\n",x);
}
*5.仿照例1.2编程,输入圆柱体的半径和高,计算并输出圆柱体的体积。
解:#include <stdio.h>
void main()
{ float r,h,s,v;
printf("Please input r and h:\n");
scanf("%f %f",&r,&h);
v=3.14*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’ 1.52e0.5 sin(3) 0xf16 ‘\a’‘\009’
1.414E+2
2.54‘\\’‘a’+2 0x100h 0128 10L
解:合法的C常量有:
整型常量:007 –0x3d0xf16 10L
实型常量: 1e0 1.414E+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输入345.67,则正确的输入形式是()。
A.–1012345.67↙B.–10 12 345.67↙
C.–10001200345.67↙D.–10,12,345.67↙
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=153.4523;
语句“printf("%c%–8.2f\\n",ch,x);”的输出结果是。
解:$153.45 \n
2.int i=123;float x= – 1234.56789;
语句“printf("i=%5d x=%7.3f\n",i,x);”的输出结果是。
解:i= 123 x=-1234.568
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);”执行时输入12345678765.43↙
则k= ,f= 。
解:k=123 f=8765.4
6.使用pow()函数时,程序的开头必须写一条预处理命令:。
解:#include <math.h>
5.填空题。
(1)int i=123,j=45;
函数printf("%d,%d\n",i,j);的输出结果是。
解:123,45
(2)int i=123; float x=-45.678;
语句printf("i=%5d x=%7.4f\n",i,x); 的输出结果是 。
解:i= 123 x=-45.6780
(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)(565.312432π
解:-(a 2+b 2
)×y 4 的C 表达式:-(a*a+b*b)*pow(y,4) π
++-x 12
tan 102 的C 表达式:(sqrt(2)+10*10)/(pow(tan(x),-1)+3.141593) 5.3|)sin(|x 的C 表达式:sqrt(pow (fabs (sin(x)),3.5))
5
6e x - 的C 表达式:pow(x,6)-exp(5) cd
d c b a d c ab +-+++221 的C 表达式:(1.0/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<z&&y>=z||x>=z&&y<z
3.将double 类型变量y 保留四位小数的表达式。
解:(int)(y*10000+0.5)/10000.0
4.为变量s 赋值:取变量x 的符号,取变量y 的绝对值。
解:s=(x>=0?1:-1)*(y>=0?y:-y)
5.条件“-5≤x ≤3”所对应的C 逻辑表达式。
解:-5<=x&&x<=3
6.a 、b 是字符变量,已知a 的值为大写字母、b 的值为小写字母,写出判断a 、b 是否为同一字母(不区分大小写)的逻辑表达式
解:a+32==b 或 b-a==32?1: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>b?a:b)>c?(a>b?a: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<y)&&!z||1) 2.已知x=10,ch='A',y=0;,则表达式“x>=y&&ch<'B'&&!y”的值是()。
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.若有条件表达式“x?a++: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?k:c<b?c:a”的值是()。
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.2.0 D.2.5
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=2.5,y=4.7; int a=7;,表达式 x+a%3*(int)(x+y)%2/4 值为。
解:2.5
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)&&!(2-3.5) 的值为。
解: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 <stdio.h>
void main()
{
unsigned k,n;
scanf("%u",&n); //输入数据为:69
k=n%10*10+n/10;
printf("n=%d k=%d\n",n,k);
}
解:n=69 k=96
2.
#include <stdio.h>
void main()
{
int x=2,y=3;
x*=y+4;
printf("%d,%d\n",x,y);
x/=y=5;
printf("%d,%d\n",x,y);
x-=y%2;
printf("%d,%d\n",x,y);
}
解:14,3
2,5
1,5
3.
#include <stdio.h>
void main()
{
int a, b;
a=8;
b=7;
a=(a-- ==b++)? a%3 : a/3;
printf("a=%d b=%d\n",a,b);
}
解:a=2 b=8
六、程序填空题。
1.以下程序输入三个整数值给a,b,c,程序把b中的值给a,把c中的值给b,把a中的值给c,交换后输出a、b、c的值。
例如输入1 2 3,输出a=2 b=3 c=1。
#include <stdio.h>
void main()
{ int a,b,c, ① ;
printf(“Enter a,b,c:”);
scanf(“%d%d%d”,② );
③ ; a=b; b=c; ④ ;
printf(“a=%d b=%d c=%d\n”,a,b,c);
}
解:① t ② &a,&b,&c ③ t=a ④ c=t
2.以下程序不借助任何变量把a、b中的值进行交换。
#include <stdio.h>
void main()
{ int a,b;
printf(“Input a,b:”);
scanf(“%d%d”,① );
a+= ② ; b=a- ③ ; a- = ④ ;
printf(“a=%d b=%d\n”,a,b);
}
解:① &a,&b ② b ③ b ④ b
七、编程题。
1.输入3个字符后,按各字符ASCII码从小到大的顺序输出这些字符。
解:#include <stdio.h>
void main()
{ char c1,c2,c3,t,min,mid,max;
c1=getchar(); c2=getchar(); c3=getchar();
min=(t=c1<c2?c1:c2)<c3?t:c3;
max=(t=c1>c2?c1:c2)>c3?t:c3;
mid=c1+c2+c3-min-max;
putchar(min);
putchar(mid);
putchar(max);
}
2.输入两点坐标(x1,y1)、(x2,y2),计算并输出两点间的距离。
解:#include <stdio.h>
#include <math.h>
void main()
{
double x1,y1,x2,y2,d;
printf(“请输入两点坐标 (x1,y1),(x2,y2)\n”);
scanf(“(%lf,%lf),(%lf,%lf)”,&x1,&y1,&x2,&y2);
d=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
printf(“两点间距离=%f\n”,d);
}
3.编写程序,计算球体积并输出它的值。
要求输入半径值,计算结果保留三位小数。
解:#include <stdio.h>
#include <math.h>
#define PI 3.1415926
void main()
{ double r,gv;
printf(“请输入半径值:\n”);
scanf(“%lf”,&r);
gv=4.0/3*PI*pow(r,3);
printf(“半径为%f的球的体积为:%.3f\n”,r,gv);
}
4.输入三角形的底和高,求三角形面积。
解:#include <stdio.h>
#define PI 3.14159
void main()
{
double a,h,s;
printf(“请输入三角形的底,高\n”);
scanf(“%lf,%lf”,&a,&h);
s=a*h/2;
printf(“三角形面积=%f\n”,s);
}
5.编写程序,输入一个实数后输出该数的绝对值。
解:#include <stdio.h>
void main()
{
double x,y;
printf(“请输入一个实数\n”);
scanf(“%lf”,&x);
y=x>=0?x:-x;
printf(“|%g|=%g\n”,x,y);
}
6.输入梯形的上底、下底和高,求梯形面积。
解:#include <stdio.h>
void main()
{
double a,b,h,s;
printf(“请输入梯形的上底,下底,高\n”);
scanf(“%lf,%lf,%lf”,&a,&b,&h);
s=(a+b)*h/2;
printf(“梯形面积=%f\n”,s);
}
7. 输入矩形的边长,求矩形面积。
解:#include <stdio.h>
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 <stdio.h>
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 <stdio.h>
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 <stdio.h>
#include <math.h>
#define PI 3.14159
void main()
{
double r,s1,s2;
int n;
printf(“Input r n\n”);
scanf(“%lf%d”,&r,&n);
s1=PI*r*r;
s2=n/2.0*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 3.5: k=0.5*x;
case 7.8: 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 <stdio.h>
void main()
{
char x;
int n=0,k=0;
while((x=getchar())!='#'){ //运行时输入:a the ftheth e there#
switch(x){
case 't': k++; break;
case 'h': if(k==1) k++; break;
case 'e': if(k==2) k++; break;
default: k=0;
}
if(k==3) n++; }
printf("%d\n",n);
}
解:3
*2.
#include <stdio.h>
void main( )
{
int k=0;
char c='A';
do {
switch (c++) {
case 'A': k++; break;
case 'B': k--;
case 'C': k+=2; break;
case 'D': k=k%2; break;
case 'E': k=k*10; break;
default: k=k/3;
}
k++;
}while(c<'G');
printf("k=%d\n", k);
}
解:k=8
*3.
#include<stdio.h>
#include<ctype.h>
void main()
{
char a,b,x; int i;
do
x=getchar(); //运行时输入:2abcD
while (isupper(x)==0);
for(a='A'; a<=x; a++){
for(b='A'; b<'A'+x-a; b++)
putchar(' ');
for(i=1;i<=2*(a-'A')+1;i++)
putchar(a);
putchar('\n');
}
}
注:isupper(x)是判断x是否大写字母的函数,如果x是大写字母函数值为1否则为0。
解: A
BBB
CCCCC
DDDDDDD
4.
#include<stdio.h>
void main()
{
int i,n;
scanf("%d",&n); //输入2520
i=2;
while(n>1)
if(n%i==0){
printf("%d\t",i);
n/=i;
}
else i++;
printf("\n");
}
解: 2 2 2 3 3 5 7
三、填空题
1.求1~10的乘积,写作:
for( , i=1; i<=10; ++i) s*=i;
解:s=1
2.下面程序段执行后,x、y的值分别为。
y=1;
x=5;
while(x) {
x--;
y++;
}
解: x、y分别为0和6
*3.输入若干个以问号结束的字符,同时输出这串字符(不包括问号);
while( !='?') putchar(ch);
解: (ch=getchar()) //注意外面的这对括号不能少
*4.有以下程序片段:
s=1.0;
for(k=1;k<=n; k++)
s+=1.0/(k*(k+1));
printf("%f\n",s);
填空,使下程序段与上程序段功能完全相同。
s=0.0;
;
k=0;
do
{ s+=d;
;
d=1.0/(k*(k+1));
}
while( );
printf("%f\n",s);
解: d=1 k++ k<=n
5.下列程序输出6~10000之间的亲密数对,填空将程序补充完整。
若a、b是亲密数对,则a的因子和等于b,b的因子和等于a,且a不等于b。
#include<stdio.h>
void main()
{ int a,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;
if( &&a!=b)
printf("%d %d\n",a,b);
}
}
解:a%i==0 c=1; c==a
6.计算2+22+222+2222+…+22+…+2的和。
#include<stdio.h> void main()
{ int s=1,t=1,a,n;
scanf("%d"&n);
for(int i=2;i<=n;i++) {
t=t*10+1;
}
printf("SUM=%d\n",s);
}
解:a=2; s+=t; s*=a;
四、编程题
1.输入一个实数,输出它的平方根值,如果输入数小于0,则输出“The number is error!”的提示。
解:#include <stdio.h>
#include <math.h>
void main()
{
double a,x;
printf(“Input data:\n ”);
scanf(“%lf ”,&a);
if(a>=0){
x=sqrt(a);
printf(“%g 的平方根值为%g\n ”,a,x);
}
else
printf(“The number is error!\n ”);
}
2.用if 语句编程序,输入x 后按下式计算y 值,并输出结果。
x+2*x 2 +10 0≤x ≤8
y =
x-3*x 3-9 x <0 或 x >8
解:#include <stdio.h>
void main()
{
n n
double x,y;
printf(“Input x:\n”);
scanf(“%lf”,&x);
if(x>=0&&x<=8)
y=x+2*x*x+10;
else
y=x-3*x*x*x-10;
printf(“x=%f,y=%f\n”,x,y);
}
3.输入一个百分制的成绩t后,按下式输出它的等级,要求分别写成if结构和switch结构。
等级为:90~100为“A”,80~89为“B”,70~79为“C”,60~69为“D”,59~0为“E”。
if结构
解:#include <stdio.h>
void main()
{
double t;
printf(“Input score:\n”);
scanf(“%lf”,&t);
if(t>=90&&t<=100)
putchar(‘A’);
else if(t>=80&&t<90)
putchar(‘B’);
else if(t>=70&&t<80)
putchar(‘C’);
else if(t>=60&&t<70)
putchar(‘D’);
else if(t>=0&&t<60)
putchar(‘E’);
else
printf(“error!\n”);
}
switch结构
解:#include <stdio.h>
void main()
{
double t;
printf(“Input score:\n”);
scanf(“%lf”,&t);
switch((int)(t/10)){
case 10:
case 9:putchar(‘A’);break;
case 8:putchar(‘B’);break;
case 7:putchar(‘C’);break;
case 6:putchar(‘D’);break;
case 5:
case 4: case 3: case 2: case 1: case 0:putchar(‘E ’);break;
default:printf(“error!\n ”);
}
} 4.输入x 、y ,计算f(x,y)的函数值。
f(x,y)定义如下: ⎪⎪⎩⎪⎪⎨⎧>=<-<>=+<<->=>=+=0
0000000),(2222y x y x y x y
x y x y x y x y x y x f
解:#include <stdio.h>
void main()
{
double x,y,f;
printf(“Input x y:\n ”);
scanf(“%lf%lf ”,&x,&y);
if(x>=0&&y>=0)
f=x*x+y*y;
else if(x<0&&y<0)
f=x*x-y*y;
else if(x>=0&&y<0)
f=x+y;
else if(x<0&&y>=0)
f=x-y;
printf(“f(%f,%f)=%f\n ”,x,y,f);
}
5.输入三角形的三条边长a 、b 、c ,计算并输出三角形的面积。
要求判断输入的三条边a 、b 、c 三个数是否能构成三角,如果不能构成三角形,则输出提示信息告诉用户。
根据三条边的边长,计算三角形面积的公式如下:
))()((2z s y s x s s z y x s ---=++=面积
解:#include <stdio.h>
#include <math.h>
void main()
{
double a,b,c,s,area;
printf(“Input a b c:\n ”);
scanf(“%lf%lf%lf ”,&a,&b,&c);
if(a+b>c&&a+c>b&&b+c>a){
s=(a+b+c)/2;
area=sqrt(s*(s-a)*(s-b)*(s-c));
printf(“area=%.3f\n”,area);
}
else
printf(“线段%f,%f,%f不能构成三角形\n”,a,b,c);
}
6.输入1~7,输出对应的星期一~星期天。
解:#include <stdio.h>
void main()
{
int s;
printf(“Input s(1~7):\n”);
scanf(“%d”,&s);
switch(s){
case 1:printf(“星期一\n”);break;
case 2:printf(“星期二\n”);break;
case 3:printf(“星期三\n”);break;
case 4:printf(“星期四\n”);break;
case 5:printf(“星期五\n”);break;
case 6:printf(“星期六\n”);break;
case 7:printf(“星期天\n”);break;
default:printf(“The s is error!\n”);
}
}
7.输入年、月、日,输出是该年的第几天。
解:#include <stdio.h>
void main()
{
int y,m,d,days;
printf(“Input 年月日:\n”);
scanf(“%d%d%d”,&y,&m,&d);
days=d;
switch(m){
case 12:days+=30;
case 11:days+=31;
case 10:days+=30;
case 9:days+=31;
case 8:days+=31;
case 7:days+=30;
case 6:days+=31;
case 5:days+=30;
case 4:days+=31;
case 3:
if(y%4==0&&y%100!=0||y%400==0)
days+=29;
else days+=28;
case 2:days+=31;
}
printf(“%d月%d日是%d年的第%d天\n”,m,d,y,days);
}
8.输入n和相应的n个数,输出它们中所有奇数的乘积。
解:#include <stdio.h>
void main()
{
int n,i,t,x;
printf(“请输入 n:\n”);
scanf(“%d”,&n);
printf(“请输入%d个数:\n”,n);
for(i=1,t=1;i<=n;i++){
scanf(“%d”,&x);
if(x%2==1)
t*=x;
}
printf(“%d\n”,t);
}
9.输入一个正整数,求它们所有数字之和。
解:#include <stdio.h>
void main()
{
int a,sum=0;
printf(“请输入一个正整数:\n”);
scanf(“%d”,&a);
a=a>=0?a:-a;
while(a!=0){
sum+=a%10;
a/=10;
}
printf(“%d\n”,sum);
}
10.输入n和相应的n个数,统计输入的数中负数、零及正数的个数。
解:#include <stdio.h>
void main()
{
int n,i,t,s,k;
double x;
t=s=k=0;
printf(“请输入 n:\n”);
scanf(“%d”,&n);
printf(“请输入%d个数:\n”,n);
for(i=1;i<=n;i++){
scanf(“%lf”,&x);
if(x>0)
t++;
else if(x<0)
s++;
else k++;
}
printf(“负数:%d\t零:%d\t正数:%d\n”, s, k, t);
}
11.输入10个学生的成绩,输出最低分数。
解:#include <stdio.h>
void main()
{
int i;
double score,min;
printf(“请输入 10个学生成绩:\n”);
scanf(“%lf”,&score);
min=score; // 给min赋初值
for(i=1;i<10;i++){
scanf(“%lf”,&score);
if(min>score)
min=score;
}
printf(“min=%g\n”, min);
}
或
解:#include <stdio.h>
void main()
{
int i;
double score,min;
printf(“请输入 10个学生成绩:\n”);
for(i=1;i<=10;i++){
scanf(“%lf”,&score);
if(i==1)
min=score;
if(min>score)
min=score;
}
printf(“min=%g\n”, min);
}
12.青年歌手大奖赛中,10个评委给参赛选手打分。
选手得分规则为去掉一个最高分和一个最低分,然后计算平均得分。
计算并输出选手张三的得分。
(注:如果最高分或最低分有多个相同时,去掉其中一个)
解:#include <stdio.h>
void main()
{
int i;
double score,min,max,sum,aver;
printf(“请输入 10个评委给张三的评分:\n”);
scanf(“%lf”,&score);
min=max=sum=score;
for(i=1;i<10;i++){
scanf(“%lf”,&score);
if(min>score)
min=score;
if(max<score)
max=score;
sum+=score;
}
aver=(sum-max-min)/8;
printf(“张三得分:%g\n”, aver);
}
或
解:#include <stdio.h>
void main()
{
int i;
double score,min,max,sum=0,aver;
printf(“请输入 10个评委给张三的评分:\n”);
for(i=1;i<=10;i++){
scanf(“%lf”,&score);
if(i==1)
max=min=score;
if(min>score)
min=score;
if(max<score)
max=score;
sum+=score;
}
aver=(sum-max-min)/8;
printf(“张三得分:%g\n”, aver);
}
13.用循环语句输出26个大写字母及它们的ASCII码值。
解:#include <stdio.h>
void main()
{
char c;
for(c=’A’;c<=’Z’;c++)
printf(“%c\t%d\n”,c,c);
}
或
解:#include <stdio.h>
void main()
{ char ch='A';
while( ch<='Z'){
printf("(%c,%d)\n",ch,ch);
ch++;
}
}
14.输出所有的“水仙花数”,水仙花数是指一个三位数,其各位数字的立方和等于其本身,如:153=13+53+33。
解:#include <stdio.h>
void main()
{
int x,a,b,c;
printf(“水仙花数:\n”);
for(x=100;x<1000;x++){
a=x/100;
b=x%100/10;
c=x%10;
if(x==a*a*a+b*b*b+c*c*c)
printf(“%d\t”, x);
}
printf(“\n”);
}
15.求算式
11111
1n
23456
-+-+-+前40项的和。
解:#include <stdio.h>
void main()
{
int i;
double sum=0,flag=1;
for(i=1;i<=40;i++){
sum+=flag/i;
flag=-1*flag; // 或flag=-flag
}
printf(“sum=%g\n”,sum);
}
16.输出一张华氏与摄氏温度对照表,将华氏温度从30°~40°F之间的每度转换对应的摄氏温度输出。
张华氏转化为摄氏温公式:c=5/9(F-32)
解:#include <stdio.h>
void main()
{
double f,c;
for(f=30;f<=40;f++){
c=5.0/9*(f-32);
printf(“%g\t%g\n”,f,c);
}
}
*17.求数列的和。
设数列的首项为81,以后各项为前一项的平方根(如81,9,3,1.732,…),求前20项和。
解:#include <stdio.h>
#include <math.h>
void main()
{
int i;
double sum=0,a=81;
for(i=1;i<=20;i++){
sum+=a;
a=sqrt(a); // 下一项为前一项的平方根
}
printf(“sum=%g\n”,sum);
}
18.输出一个如下的乘法口诀表。
1×1=1
1×2=2 2×2=4
1×3=3 2×3=6 3×3=9
………
1×9=9 2×9=18 3×9=27 ………9×9=81
解:#include <stdio.h>
void main()
{
int i,j;
for(i=1;i<=9;i++){
for(j=1;j<=i;j++)
printf(“%d*%d=%d\t ”,j,i,i*j);
printf(“\n ”);
} } *19.猴子吃桃子。
第1天猴子吃掉桃子总数一半多一个,第2天又将剩余的桃子吃掉一半多一个,以后每天吃掉前一天剩下的一半多一个,到第十天准备吃的时候只剩下一个桃子。
请问第1天开始吃的时候桃子的总数。
//递推公式 x=2*(x+1)
解:#include<stdio.h>
void main()
{
int n,x;
x=1; //第10天的挑子数
for(n=9; n>=1; n--)
{ x=2*(x+1); //计算第n 天的桃子数 }
printf("第1天吃前挑子总数=%d\n",x);
}
*20.用循环体编程序,分别输出如下两个图形,如图4.15所示。
*
*
* * *
* * * * *
* * * * * *
* * * * * *
* * *
*
* * * * * * * * * * * * * * * * 左图
解:#include<stdio.h>
void main()
{
int i,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("%c ",'*');
putchar('\n');
}
}
右图
解:#include<stdio.h>
void main()
{
int i,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("%c ",'*');
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("%c ",'*');
putchar('\n');
}
}
21.输入正整数a、b,输出a、b之间所有素数之和。
解:#include<stdio.h>
void main()
{
int i,j,a,b,sum=0;
printf(“请输入a b (a≤b)\n”);
scanf(“%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)
sum+=i;// 满足此条件表示除1和自身外,其它数均不能整除i
}
printf(“%d至%d之间的素数和=%d\n”,a,b,sum);
}
或
解:#include<stdio.h>
void main()
{
int i,j,a,b,sum=0,flag;
printf(“请输入a b (a≤b)\n”);
scanf(“%d%d”,&a,&b);
for(i=a;i<=b;i++)
{ flag=1; // 要判别当前i是否素数,先将标志变量赋值为1
for(j=2;j<=i/2;j++)
if(i%j==0){
flag=0;break; }// 此时可判定i不是素数,退出循环
if(flag==1&&i!=1)
sum+=i;//满足此条件表示除1和自身外,其它数均不能整除i }
printf(“%d至%d之间的素数和=%d\n”,a,b,sum);
}
*22.当x为–2,–1.5,–1,…,1.5,2时,求函数f(x)=x2–3.14x–6的解所取的最大值、最小值。
解:#include<stdio.h>
void main()
{
double x,y,max,min;
max=min=(-2)*(-2)-3.14*(-2)-6;
//f(-2)作为max、min的初始值
for(x=-1.5;x<=2;x+=0.5)
{
y=x*x-3.14159*x-6;
if(y>max) max=y;
else if(y<min) min=y;
}
printf("max=%f,min=%f\n",max,min);
}
*23.当n取值在–39~40范围内时,判断表达式n2+n+41的值是否都是素数。
解:#include<stdio.h>
#include<math.h>
void main()
{
int i,j,y,count=0;
for(i=-39;i<=40;i++)
{ y=i*i+i+41;
for(j=2;j<=sqrt(y);j++)
if(y%j==0)
{ printf("当i为%d时,y=%d,结论不成立!\n",i,y);
count++;
break;
}
}
if (count!=0) printf("共有%d个i值,使结论不成立!\n",count);
else printf("结论成立,都是素数!\n");
}
*24.用区间对分法求x2+xsinx–5=0在区间[0,5]内的一个实根(设ε=10–5)。
【说明】在[a,b]区间连续的函数f(x),若满足条件f(a)·f(b)<0,则必有a<ξ<b使得f(ξ)=0;求f(x)=0在[a,b]内一个实根的区间对分法基本步骤如下:
(1)c=(a+b)/2。
(2)若|f(c)|<ε或|b-a|<ε,则输出c作为近似解,并终止程序执行。
(3)如果f(a)·f(c)<0,则b=c;否则a=c,再次执行第(1)步。
解:#include<stdio.h>
#include<math.h>
void main()
{
float a,b,c;
a=0; b=5; //初始化区间a、b值
do {
c=(a+b)/2; //计算a、b区间的中值
if((a*a+a*sin(a)-5)*(c*c+c*sin(c)-5)<0 )
b=c; //以c代替区间b值
else a=c; //以c代替区间a值
}while(fabs(c*c+c*sin(c)-5)>=1e-5&&fabs(b-a)>=1e-5);
printf("%f\n",c);
}
习题 5
一、单项选择题
1.下列叙述中,正确的叙述项是()。
A.定义函数时,必须要有形参
B.函数中可以没有return语句,也可以有多条return语句
C.函数f可以用f(f(x))形式调用,这种调用形式是递归调用
D.函数必须有返回值
2.下列叙述中,不正确的叙述项是()。
A.函数调用时,形参变量只有在被调用时才被创建(分配存储单元)
B.函数调用时,实参可以是常量、变量或表达式
C.定义变量时,省略对变量的存储类别定义,则变量是自动型变量
D.语句return(a,b);则函数可以返回两个值
3.传值调用的特点是()。
A.实参传给形参变量的数据是地址
B.在函数中形参变量值改变后,不改变实参变量的值
C.在函数中形参变量值改变后,实参变量的值随之也改变
D.实参必须是变量
4.如果在函数中定义一个变量,有关该变量作用域正确的是()。
A.只在该函数中有效B.在该文件中有效
C.在本程序中有效D.为非法变量
5.根据下面函数print的定义,选出调用函数print(5378)的值是()。
void print(long n)
{
if (n==0) return ;
else{
print(n/10);
printf("% d", n%10);
return ;
}
}
A.5 3 7 8 B.8 7 3 5
C.3 5 7 8 D.8 7 5 3
*6.根据下面函数f,选出f(f(3))的值是()。
int f(int x)
{
static int k=0;
x=x+k;
k--;
return x;
}
A.5 B.3 C.2 D.4 解:(1)B (2)D (3)B (4)A (5)A (6)C
二、写出下列程序的输出结果
*1.
#include <stdio.h>
int f1(int,int),f11(int);
void f2(int);
void main()
{
int i,j;
for(i=0;i<5;i++)
{ f2((5-i)*3);
for(j=0;j<=i;j++)
printf("%3d",f1(i,j));
putchar('\n');
}
}
int f1(int m,int n)
{
return f11(m)/f11(n)/f11(m-n);
}
int f11(int k)
{
if(k<=1)
return 1;
return k*f11(k-1);
}
void f2(int n)
{
for(int i=1;i<=n;i++)
putchar(' ');
}
解: 1
1 1
1 2 1。