max=c;
printf(“最大数为:
%d”,max);
}
第2章程序的灵魂——算法
2.1什么叫结构化的算法?
为什么要提倡结构化的算法?
解:
由一些基本结构顺序组成的算法称为结构化的算法。
由于在基本结构之间不存在非顺序的跳转,流程的转移只存在于一个基本结构范围之内,因而提高了算法的质量。
2.7什么叫结构化程序设计?
它的主要内容是什么?
解:
结构化程序就是用高级语言表示的结构化算法。
它的主要内容包括“自顶向下,逐步细化”的分析方法和“模块化设计”的解决方法,以及“结构化编码”的实现方法。
第3章数据类型、运算符与表达式
3.4将以下三各整数分别赋给不同类型的变量,请画出赋值后数据在内存中的存储形式。
注:
如果没有学过二进制和补码,此题可以不做。
解:
各数据在内存中的存储形式如下表所示:
变量的类型
25
-2
32769
int型
00…000011001
8位
111111*********0
15
100…001(溢出)
14
long型
00…000011001
24
11…1110
31
00…0100…001
1614
short型
100…000011001
8
111111*********0
15
100…001(溢出)
14
signedchar(8位)
100011001
11111110
00000001(溢出)
unsignedint型
00…000011001
8
11…110
15
100…001
14
unsignedlong型
00…000011001
24
11…110
31
00…0100…001
1614
unsignedshort型
00…000011001
8
11…110
15
100…001
8
unsignedchar型
00011001
11111110
00000001
其中int和short类型,其取值范围是-32768~32767。
32769在这两种类型中实际表示负数,它是一个负数的补码,对其再求一次补码可得其真值,即-(65536-32769)=-32767。
char和unsignedchar为8位,若将int或long类型数据赋给这种类型,则截取数据低8位。
同理,若将long赋给int,则截取低16位。
3.5字符常量和字符串常量有什么区别?
解:
字符常量是一个字符,用单引号括起来。
字符串常量是由0个或若干个字符组合而成,用双引号括起来,存储时自动在字符串最后加一个结束符号’\0’。
3.6写出以下程序运行的结果:
main()
{charcl=’a’,c2=’b’,c3=’c’,c4=’\101’,c5=’\116’;
printf(“a%cb%c\tc%c\tabc\n”,c1,c2,c3);
printf(“\t\b%c%c”,c4,c5);
}
解:
程序运行的结果为:
aabbccabc
AN
3.7要将“China”译成密码,密码规律是:
用原来的字母后面第4个字母代替原来的字母。
例如,字母“A”后面第4个字母是“E”,用“E”代替“A”。
因此,“China”应译为“Glmre”。
请编一程序,用赋初值的方法使c1,c2,c3,c4,c5这5个变量的值分别为’C’,’h’,’i’,’n’,’a’,经过运算,使c1,c2,c3,c4,c5的值分别变为’G’,’l’,’m’,’r’,’e’,并输出。
解:
main()
{charcl=’C’,c2=’h’,c3=’i’,c4=’n’,c5=’a’;
c1+=4;
c2+=4;
c3+=4;
c4+=4;
c5+=4;
printf(“密码是%c%c%c%c%c\n,c1,c2,c3,c4,c5);
}
运行结果:
密码是Glmre
3.8例2.6能否改成如下:
main()
{intc1,c2;(原为charc1,c2)
c1=97;
c2=98;
printf(“%c%c\n”,c1,c2);
printf(“%d%d\n”,c1,c2);
}
解:
可以。
因为在可输出的字符范围内,用整型和用字符型作用相同。
3.9求下面算术表达式的值。
x+a%3*(int)(x+y)%2/4
设x=2.5,a=7,y=4..7
(float)(a+b)/2+(int)x%(int)y
设a=2,b=3,x=3.5,y=2.5
解:
(1)2.5
(2)3.5
3.10写出程序运行的结果。
main()
{inti,j,m,n;
i=8;
j=10;
m=++i;
n=j++;
printf(“%d,%d,%d,%d”,i,j,m,n);
}
解:
运行结果为:
9,11,9,10
3.11写出下面赋值的结果。
格中写了数值的是要将它赋给其他类型的变量,将所有空格填上赋值后的数值。
int
99
42
char
‘d’
ⅹ
unsignedint
76
65535
float
53.65
longint
68
解:
int
99
100
76
53
68
42
-1
char
‘c’
‘d’
‘L’
‘5’
‘D’
‘*’
ⅹ
unsignedint
99
100
76
53
68
42
65535
float
99.000000
100.000000
76.000000
53.65
68.000000
42.000000
65535.000000
longint
99
100
76
53
68
42
65535
3.12出下面表达式运算后a的值,设原来a=12。
设a和n都已定义为整型变量。
(1)a+=a
(2)a-=2
(3)a*=2+3(4)a/=a+a
(5)a%=(n%=2),n的值等于5(6)a+=a-=a*=a
解:
(1)24
(2)10
(3)60(4)0
(5)0(6)0
第4章最简单的C程序设计——顺序程序设计
4.4若a=3,b=4,c=5,x=1.2,y=2.4,z=-3.6,u=51247,n=128765,c1=’a’,c2=’b’,想得到以下的输出格式和结果,请写出程序(包括定义变量类型和设计输出)。
要求输出的结果如下:
a=□3□□b=□4□□c=□5
x=1.200000,y=2.400000,z=-3.600000
x+y=□3.60□□y+z=-1.20□□z+x=-2.40
u=□51247□□n=□□□128765
c1=’a’□or□97(ASCII)
c2=’b’□or□98(ASCII)
解:
main()
{
inta,b,c;
longintu,n;
floatx,y,z;
charc1,c2;
a=3;b=4;c=5;
x=1.2;y=2.4;z=-3.6;
u=51247;n=128765;
c1=’a’;c2=’b’;
printf(“\n”);
printf(“a=%2d□□b=%2d□□c=%2d\n”,a,b,c);
printf(“x=%.6f,y=%.6f,z=%.6f\n”,x,y,z);
printf(“x+y=□%.2f□□y+z=%.2f□□z+x=%.2f\n”,x+y,y+z,z+x);
printf(“u=%6ld□□n=%9ld\n”,u,n);
printf(“c1=’%c’or%d(ASCII)\n”,c1,c1);
printf(“c2=’%c’or%d(ASCII)\n”,c2,c2);
}
4.5请写出下面程序的输出结果:
main()
{inta=5,b=7;
floatx=67.8564,y=-789.124;
charc=’A’;
longn=1234567;
unsignedu=65535;
printf(“%d%d\n”,a,b);
printf(“%3d%3d\n”,a,b);
printf(“%f,%f\n”,x,y);
printf(“%-10f,%-10f\n”,x,y);
printf(“%8.2f,%8.2f,%4f,%4f,%3f,%3f\n”,x,y,x,y,x,y);
printf(“%e,%10.2e\n”,x,y);
printf(“%c,%d,%o,%x\n”,c,c,c,c);
printf(“%ld,%lo,%x\n”,n,n,n);
printf(“%u,%o,%x,%d\n”,u,u,u,u);
printf(“%s,%5.3s\n”,”COMPUTER”,”COMPUTER”);
}
运行结果:
5□7
□□5□□7
67.856400,-789.124023
67.856400□,-789.124023
□□□67.86,□□-789.12,67.8564,-789.1240,67.856400,-789.124023
6.785640e+01,□□-7.9e+02
A,65,101,41
1234567,4553207,d687
65535,177777,ffff,-1
COMPUTER,□□COM
可以发现,输出数据中若有负号、e和小数点,这些字符也占位。
4.6用下面的scanf函数输入数据,使a=3,b=7,x=8.5,y=71.82,c1=’A’,c2=’a’。
问在键盘上如何输入?
#include
voidmain()
{
inta,b;
floatx,y;
charc1,c2;
scanf(“a=%db=%d”,&a,&b);
scanf(“%f%e”,&x,&y);
scanf(“%c%c”,&c1,&c2);
}
解:
a=3□b=7
□8.5□71.82
□A□a
4.7下面的scanf函数输入数据,使a=10,b=20,c1=’A’,c2=’a’,x=1.5,y=-3.75,z=67.8,请问在键盘上如何输入数据?
scanf(“%5d%5d%c%c%f%f%*f,%f”,&a,&b,&c1,&c2,&x,&y,&z);
解:
main()
{
inta,b;floatx,y,z;
charc1,c2;
scanf(“%5d%5d%c%c%f%f%*f,%f”,&a,&b,&c1,&c2,&x,&y,&z);
printf(“a=%d,b=%d,c1=5c,c2=%c,x=%6.2f,y=6.2f,z=6.2f\n”),a,b,c1,c2,x,y,z);
}
运行情况如下:
□□□10□□□20Aa1.5–3.75□1.5,67.8(此行为输入的数据,其中□为空格)
a=10,b=20,c1=A,c2=a,x=1.50,y=-3.75,z=67.80(此行为输出)
说明:
按%5d格式的要求输入a和b时,要先键入三个空格,然后再键入10与20。
%*f是用来禁止赋值的。
在输入时,对应于%*f的地方,随意打入了一个数1.5,该值不会赋给任何变量。
4.8圆半径r=1.5,圆柱高h=3,求圆周长,圆面积,圆球表面积,圆球体积,圆柱体积。
用scanf输入数据,输出计算结果,输出时要求有文字说明,取小数点后2位数字。
请编程序。
解:
main()
{
floatpi,h,r,l,s,sq,vq,vz;
pi=3.1415926;
printf(“请输入圆半径r,圆柱高h:
\n”);
scanf(“%f,%f”,&r,&h);
l=2*pi*r;
s=r*r*pi;
sq=4*pi*r*r;
vq=3.0/4.0*pi*r*r*r;
vz=pi*r*r*h;
printf(“圆周长为:
l=%6.2f\n”,l);
printf(“圆面积为:
s=%6.2f\n”,s);
printf(“圆球表面积为:
sq=%6.2f\n”,sq);
printf(“圆球体积为:
sv=%6.2f\n”,vq);
printf(“圆柱体积为:
sz=%6.2f\n”,vz);
}
运行结果:
请输入圆半径r,圆柱高h:
1.5,3↙
圆周长为:
l=9.42
圆面积为:
s=7.07
圆球表面积为:
sq=28.27
圆球体积为:
sv=7.95
圆柱体积为:
sz=21.21
4.9输入一个华氏温度,要求输出摄氏温度,公式为C=(5/9)(F-32)
输出要有文字说明,取2位小数。
解:
main()
{floatc,f;
printf(“请输入一个华氏温度:
\n”);
scanf(“%f”,&f);
c=(5.0/9.0)*(f-32);/*注意5和9要用实型表示,否则5/9的值为0*/
printf(“摄氏温度为:
%5.2f\n”,c);
};
运行结果:
请输入一个华氏温度:
78↙
摄氏温度为:
25.56
第5章选择结构程序设计
5.2语言中如何表示“真”和“假”?
系统如何判断一个量的“真”和“假”?
解:
设有一个逻辑表达式,若其结果为“真”,则以1表示;若其结果为“假”,则以0表示。
但是判断一个逻辑量的值时,以0代表“真”,以非0代表“假”。
例如3&&5的值为“真”,系统会给出3&&5的值为1。
5.3写出下面各逻辑表达式的值。
设a=3,b=4,c=5。
(1)a+b>c&&b==c
(2)a||b+c&&b-c
(3)!
(a>b)&&!
c||1
(4)!
(x=a)&&(y=b)&&0
(5)!
(a+b)+c-1&&b+c/2
解:
(1)0
(2)1
(3)1
(4)0
(5)1
5.4有3个整数a,b,c,由键盘输入,输出其中最大的数。
解:
方法一:
程序如下:
main()
{inta,b,c;
printf(“请输入3个整数:
”);
scanf(“%d,%d,%d”,&a,&b,&c);
if(a
if(bprintf(“max=%d\n”,c);
else
printf(“max=%d\n”,b);
elseif(aprintf(“max=%d\n”,c);
else
printf(“max=%d\n”,a);
}
运行结果:
请输入3个整数:
12,34,9↙
max=34
方法二:
使用条件表达式,可以使程序更简明,清晰。
main()
{inta,b,c,temp,max;
printf(“请输入3个整数:
”);
scanf(“%d,%d,%d”,&a,&b,&c);
temp=(a>b)?
a:
b;/*将a和b中的大者存入temp中*/
max=(temp>c)?
temp:
c;/*将a和b中的大者与c比较,取最大者*/
printf(“3个整数中最大数是%d\n”,max);
}
方法三:
a>b?
(a>c?
a:
c):
(b>c?
b:
c)
运行结果:
请输入3个整数:
12,34,9↙
3个整数的最大数是34。
5.5有一函数:
写一程序,输入x值,输出y值。
解:
程序如下
main()
{intx,y;
printf(“输入x:
”);
scanf(“%d”,&x);
if(x<1)/*x<1*/
{y=x;
printf(“x=%d3d,y=x=%d\n”,x,y);
}
elseif(x<10)/*1≤x<10*/
{y=2*x-1;
printf(“x=%3d,y=2*x-1=%d\n”,x,y);
}
else/*x≥10*/
{y=3*x-11;
printf(“x=%3d,y=3*x-11=%d\n”,x,y);
}
}
运行结果:
输入x:
4↙
x=4,y=2*x-1=7
输入x:
-1↙
x=-1,y=x=-1
输入x:
20↙
x=20,y=3*x-11=49
5.6给出一百分制成绩,要求输出成绩等级’A’、’B’、’C’、’D’、’E’。
90分以上为’A’,80~89分为’B’,70~79分为’C’,60~69分为’D’,60分以下为’E’。
解:
程序如下
#include"stdio.h"
voidmain()
{
floatscore;
chargrade;
printf("请输入学生成绩:
");
scanf("%f",&score);
while(score>100||score<0)
{
printf("\n输入有误,请重输");
scanf("%f",&score);
}
switch((int)(score/10))
{
case10:
case9:
grade='A';break;
case8:
grade='B';break;
case7:
grade='C';break;
case6:
grade='D';break;
case5:
case4:
case3:
case2:
case1:
case0:
grade='E';
}
printf("\n成绩是%5.1f,相应的等级是%c。
\n",score,grade);
}
5.7给定一个不多于5位的正整数,要求:
①求它是几位数;②分别打印出每一位数字;③按逆序打印出各位数字。
例如原数为321,应输出123。
解:
main()
{
longintnum;
intindiv,ten,hundred,thousand,ten_thousand,place;
/*分别代表个位,十位,百位,千位,万位和位数*/
printf(“请输入一个整数(0~99999):
”);
scanf(“%ld”,&num);
if(num>9999)
place=5;
elseif(num>999)
place=4;
elseif(num>99)
place=3;
elseif(num>9)
place=2;
elseplace=1;
printf(“place=%d\n”,place);
printf(“每位数字为:
”);
ten_thousand=num/10000;
thousand=(int)(num-ten_thousand*10000)/1000;
hundred=(int)(num-ten_thousand*10000-thousand*1000)/100;
ten=(int)(num-ten_thousand*10000-thousand*1000-hundred*100)/10;
indiv=(int)(num-ten_thousand*10000-thousand*1000-hundred*100-ten*10);
switch(place)
{case5:
printf(“%d,%d,%d,%d,%d”,ten_thousand,thousand,hundred,ten,indiv);
printf(“\n反序数字为:
”);
printf(“%d%d%d%d%d\n”,indiv,ten,hundred,thousand,ten_thousand);
break;
case4:
printf(“%d,%d,%d,%d”,thousand,hundred,ten,indiv);
printf(“\n反序数字为:
”);
printf(“%d%d%d%d\n”,indiv,ten,hundred,thousand);
break;
case3:
printf(“%d,%d,%d”,hundred,ten,indiv);
printf(“\n反序数字为:
”);
printf(“%d%d%d\n”,indiv,ten,hundred);
break;
case2:
printf(“%d,%d”,ten,indiv);
printf(“\n反序数字为:
”);
printf(“%d%d\n”,indiv,ten);
break;
case1:
printf(“%d”,indiv);
printf(“\n反序数字为:
”);
printf(“%d\n”,indiv);
break;
}
}
运行结果:
请输入一个整数(0~99999):
98765↙
位数=5
每位数字为:
9,8,7,6,5
反序数字为:
56789
5.8企业发放的奖金根据利润提成。
利润I低于或等于10万元时,奖金可提10%;利润高于10万元,低于20万元(1000001000000时,超过100万的部分按1%提成。
从键盘输入当月利润I,求应发放奖金总数。
要求:
(1)用if语句编程序;
(2)用switch语句编程序。
解:
计算利润时,要特别注意不同利润的不同提成比例。
例如,利润为15万元,其中由10万元按10%的比例提成,另外5万元则按7.5%提成。
用i