C语言1-7章课后作业答案
第一章C语言概述
【习题1-1】简述C语言的特点。
答:C语言的特点:C语言简洁、紧凑、使用灵活、方便;运算符丰富;数据结构丰富;C是结构式语言;C语法限制不太严格,程序设计自由度大;C语言允许直接访问物理地址;C语言程序生成代码质量高;C语言适用范围大,可移植性好。
【习题1-2】请从以下的4个选项中选择一个正确答案。
(1)A (2)C (3)B (4)D(5)A (6)C
【习题1-3】填空。
(1)英文字母、下划线、数字
(2)函数
(3) 函数头、函数体
(4)独立
(5);、#、/*…*/、{、}、 main、main
【习题1-4】请指出以下哪些是合法的标识符?哪些又是合法的用户标识符。
101 int 3ip x_1 x+1 count 1234
Xy x%y if while a.bc x&y _ _
1_112 Abc name x break for x=y
合法的标识符有:x_1、int、count、Xy、if、while、Abc、name、x、break、for
合法的用户标识符有:x_1、count、Xy、Abc、name、x
【习题1-5】简述上机调试运行C程序的操作步骤。
答:上机运行C语言程序的操作步骤为:启动Visual C++ 6.0→建立工程→创建源程序文件→输入(编辑)源程序内容→保存源程序文件→编译源程序文件→连接目标程序→执行程序→开始另一个程序。
【习题1-6】上机运行本章的3个例题。
略
【习题1-7】参照本章例题,编写一个C语言源程序,输出以下信息:
**************
Nice to meet you!
**************
编写程序如下:
#include
void main()
{
printf("**************\n");
printf("Nice to meet you!\n");
printf("**************\n");
}
第二章基本数据类型和运算符
【习题2.1】上机编辑并调试本章所有例题。
答:略。
【习题2.2】下面哪些是合法的常量?
⑴20 0.5 012 13e5.1 E-5 8e4 5. 0x6a
⑵'mn' "OK" "a" '\012' "a/b" '\\'
答:⑴合法的常量有:20 0.5 012 8e4 5. 0x6a
⑵合法的常量有: "OK" "a" '\012' "a/b" '\\'
【习题2.3】下面的变量名中哪些是合法的?
A&b abc123 abc% AbC int long 123abc
char a\b?c double 'a'bc a_bc a*bc float
答:合法的变量名有:abc123 AbC a_bc
【习题2.4】指出下面的变量定义哪些是正确的,哪些是不正确的,为什么?
⑴Int i,j;
⑵float a,A;
⑶int a,b;float a,b;
⑷float a,int b;
⑸char 'a';
答:⑴错误,因为关键字Int 应该全为小写字母
⑵正确
⑶错,因为同一变量在程序的同一处不应该声明为不同的数据类型
⑷错,因为不同类型的变量要分别声明,其间应使用分号,而不是逗号
⑸错,'a'表示字符常量,不能用作变量名
【习题2.5】填空题。 ⑴整型、实型、字符型
⑵ASCII 码
⑶1、2
⑷f
⑸j
【习题2.6】把下列数学式子写成C 语言表达式。
(1)3.26e x +1
3(a+b)4
(2)3sin()a b x +
(3)212
r m m g
(4)2πr+πr 2+cos(45°)
(5)(1)(1)1month
month rate rate loan rate ++-
对应的C 语言表达式分别为:
(1)3.26*exp(x)+1.0/3*pow(a+b,4)
(2)2*sqrt(x)+(a+b)/(3*sin(x))
(3)g*m1*m2/(r*r)
(4)2*3.14*r+3.14*r*r+cos(3.14/180*45)
(5)loan*rate*pow(1+ rate, month)/(pow(1+rate, month)-1)
【习题2.7】C语言中为什么要引入转义字符?
答:在字符集中,有一类字符具有这样的特性:当从键盘上输入这个字符时,显示器上就可以显示这个字符,即输入什么就显示什么。这类字符称为可显示字符,如a、b、$等。但另一类字符却没有这种特性。它们或者在键盘上找不到对应的一个键,或者当按键以后不能显示键面上的字符,为了解决这一问题,在C语言中引入了转义字符。
【习题2.8】“&&”和“‖”严格地执行运算符优先级的规则吗?它的规则是什么?
答:逻辑运算符不按照规定的优先级计算。在逻辑表达式的求值过程中,如果从“&&”或“‖”左边的运算对象部分已经能够确定整个逻辑表达式的值,则不再求右边运算对象的值,这样做提高了运算速度。具体地说:若“&&”的左运算对象值为0,则不再对右运算对象求值,因整个式子的结果必定为0。若“‖”的左运算对象值为非0,则不再对右运算对象求值,因整个式子的结果必定为1。以上所说的这种运算的规则是C对逻辑运算的特殊处理规则。它严格地执行从左到右运算的规则,不受运算符优先级所影响。
【习题2.9】字符常量和字符串常量有什么区别?
答:字符常量和字符串常量的区别主要有两点:
①从形式上看,字符常量使用单引号,而字符串常量使用双引号。
②从内部存储来看,编译程序在每个字符串的尾部自动加上了一个空字符NULL(即‘\0’)作为字符串的结束标志,而字符常量则不存在这种情况。
【习题2.10】将下面语句组进行简写。
⑴int i;
int j;
⑵x=2;
y=2;
⑶x=x+y;
⑷int x,y;
x=y-(y/10)*10;
⑸int x;
x=x+1;
⑹y=x;
--x;
对应的简写语句分别为:
(1)int i,j;
(2)x=y=2;
(3)x+=y;
(4)int x,y;
x=y%10;
(5)int x;
x++; 或x+=1; 或++x;
(6)y=x--;
【习题2.11】写出下面程序运行后的结果。
⑴程序运行结果:
1
⑵程序运行结果:
8,10
⑶程序运行结果:
y=5.000000
⑷程序运行结果:
b,3.140000,4
⑸程序运行结果:
0,48
⑹程序运行结果:
a=8
⑺程序运行结果:
1,6
0,15,15
⑻程序运行结果:
2,2,1
1,2,1
0,2,2
-1,2,2
⑼程序运行结果:
3
2
4
⑽程序运行结果:
3
2
3,3
4
3,4,4
1
第三章顺序和选择结构程序设计
【习题3.1】单选题。
1、C
2、D
3、C
4、C
5、B 【习题3.2】略
【习题3.3】下面哪些语句是合法的?
(1) if(a==b)printf(″Hello″);
(2) if(a==b){printf(″Hello″)}
(3) if(a==b)
printf(″Hello″)
else
printf(″Goodbye″);
(4) if a==b
printf(″Hello″);
答:(1)合法的,其余的不合法
【习题3.4】读程序写结果。
(1)运行结果:A=58B=58C=58
(2)运行结果:20,0
(3)运行结果:1
(4)运行结果:5 3 4
(5)运行结果:1 3 2
(6)运行结果:-4
(7)运行结果:2 1
(9)运行结果:passwarn
【习题3.5】有如下if条件语句:
if(a
else if(c 试按缩进对齐的格式将以上语句改写为结构更清晰的等效if语句,并在每个条件表达式之后用逻辑表达式注释所满足的条件。 改写结果如下: if(a { if(c x=1; else if(a if(b x=2; else x=3; } else if(c x=4; else x=5; 【习题3.6】有如下两个程序段: (1) if(a { { if(c==d)x=1; if(c==d) x=1; } else x=2; else x=2; } 它们所表示的逻辑关系是下列所示关系中的哪一个? ① 1 a x= x= 2 a≥b且c≠d 2 a ③ 1 a x= x= 2 a≥b 2 c≠d 答:(1)表示的逻辑关系是③. (2)表示的逻辑关系是②. 【习题3.7】编写程序,从键盘输入年份year(4位十进制数),判断其是否为闰年。闰年的条件是能被4整除但不能被100整除,或者能被400整除。 #include void main() { int year; scanf(“%d”,&year); if(year%400==0||year%4==0&&year%100!=0) printf(“%d年是闰年。\n”,year); else printf(“%d年不是闰年。\n”,year); } 【习题3.8】设计一个程序,从键盘输入3个整数,按由小到大的顺序输出。 void main() { int x,y,z,t; scanf("%d,%d,%d",&x,&y,&z); if(x>y) {t=x; x=y; y=t;} /*交换x,y的值*/ if(x>z) {t=z; z=x; x=t;} /*交换x,z的值*/ if(y>z) {t=y; y=z; z=t;} /*交换z,y的值*/ printf("small to big: %d %d %d\n",x,y,z); } 【习题3.9】编写程序,计算下面的函数。 e x(0 1 y= |x|+2 (3≤x<4) sin(x2) (当x取其他值时) 程序如下: #include #include void main() { int x , y; printf("please enter a number x\n"); scanf("%d",&x); if(x>0&&x<1) y=exp(sqrt(x)-1); else if(x>=3&&x<=4) y=fabs(x)+2; else y=sin(x*x); printf("x=%.1f,y= %.2f\n",x,y); } 【习题3.10】编程序计算下面的分段函数 程序如下: #include void main() { int x,y; scanf("%d",&x); if(x<1) y=-1; else if(x>=1&&x<=10) y=2*x+1; else y=3*x+2; printf("%d",y); } 【习题3.11】输入一个整数m,判断它能否被3、13、17整除,如果能被这3个数之一整除,则输入它能被整除的信息,否则输出m不能被3、13、17整除的信息。试编写该程序。 #include { int m; scanf("%d",&m); if(m%3==0||m%13==0||m%17==0) printf("%d能被整除!",m); else printf("%d不能被整除!",m); } 【习题 3.12】若一个学生是某校的学生,且是男生,则输出“male”;若是女生,则输出“female”;若不是某校的学生,则输出“No”。试编写该程序并画出流程图。 程序如下: #include void main() { int hust = 1; int s; char sex ; printf("please enter the student's school and sex\n"); scanf("%d,%c",&s,&sex); if( s == hust ) { if(sex == 'M') printf("Male\n"); else printf("Female\n"); } else printf("No\n"); } 【习题3.13】某产品的国内销售价,80箱以下,每箱350元,超过80箱,超过部分每箱优惠20元;国外销售价,1000箱以下,每箱900元,超过1000箱,超过部分每箱优惠15元。试编写计算销售额的程序。 程序如下: #include void main( ) { float money; int national, count; printf("Input national or external:"); scanf("%d",&national); printf("Input count of product:"); scanf("%d",&count); if (national) if(count<=80) money=count*350.0; else money=count*350.0- (count-80)*20.0; else if (count<=1000) money=count*900.0; else money=count*900.0-(count-1000)*15.0; } 【习题3.14】电文加密算法:将字母A变成字母G,a变成g,B变成H,b变成h,以此类推,并且U变成A,V变成B等。从键盘输入一个电文字符,输出其相应的密码。 程序如下: #include void main() { char c; c=getchar(); if(c>='a'&&c<'u'|| c>='A'&&c<'U') c+=6; else if(c>='u'&&c<='z'|| c>='U'&&c<='Z') c-=20; else p rintf(“Input error!”); putchar(c); } 【习题3.15】参见《实践教程》P28 第四章循环结构程序设计 【习题4.1】分析下面程序的结果。 (1)程序运行结果: 10 (2)程序运行结果: k=12 (3)程序运行结果: * #i=6 (4)程序运行结果: (5)程序运行结果:略 (6)程序运行结果: 11,12 (7)程序运行结果: 4 【习题4.2】分别用三种循环控制语句编写程序,求下面和式的值。 程序如下: 方法一:利用for循环实现 #include void main() { int s=0,i; for(i=1;i<=100;i++) printf("s=%d\n",s); } 方法二:利用while循环实现 #include void main() { int s=0,i=1; while(i<=100) { s+=i; i++; } printf("s=%d\n",s); } 方法三:利用do-while循环实现 #include void main() { int s=0,i=1; do { s+=i; i++; }while(i<=100); printf("s=%d\n",s); } 【习题4.3】编程把100~200之间的能被20整除的数输出。 程序如下: #include void main( ) { int n; for(n=100;n<=200;n++) { if(n%20!=0) continue; printf("%5d",n); } } 【习题4.4】假设全班有30个学生,编写一个程序,连续输入30个学生的计算机考试成绩,并计算出全班学生的计算机平均成绩。 程序如下: #include void main( ) { float sum=0.0,ave=0.0,score; int i; for(i=0;i<30;i++) { scanf("%f\n",&score); sum+=score; } ave=sum/i; printf("Average is %f\n",sum);ave; } 【习题4.5】编程求1!+3!+5!+7!+…+19!的值。 程序如下: #include void main( ) { float sum=0.0; int i,j=1; for(i=1;i<20;i++) { j*=i; if(i%2==0) continue; sum+=j; } printf("sum=%e\n",sum); } 【习题4.6】将从键盘输入的一对数,由小到大排序输出。当输入一对相等数时结束循环。 程序如下: #include void main() { int a,b,t; scanf("%d,%d",&a,&b); while(a!=b) { if(a>b) { t=a;a=b;b=t; } p rintf("%d,%d\n",a,b); scanf("%d,%d",&a,&b); } } 程序如下: #include void main( ) { i nt n,i,max,min,a; f loat s; s canf("%d,%d",&n,&a); s=max=min=a; f or(i=1;i { scanf("%d",&a); s+=a; if(max if(min>a) min=a; } p rintf("Max=%d,Min=%d,avg=%f",max,min,s/n); } 【习题4.8】已知鸡兔共有30只,脚共有90只,编程计算鸡兔各有多少只。 程序如下: #include void main() { int x,y; f or(x=0;x<=30;x++) { y=30-x; if((2*x+y*4)==90) printf("%d,%d\n",x,y); } } 【习题4.9】求算式xyz+yzz=678中的x、y、z的值(其中xyz和yzz分别表示一个三位数)。 程序如下: #include void main( ) { int x,y,z,i,result=678; for( x=1;x<10;x++ ) { for(y=1;y<10;y++) { for(z=0;z<10;z++) { i=100*x+10*y+z+100*y+10*z+z; if (i==result) printf("x=%d,y=%d,z=%d\n",x,y,z); } } } 【习题4.10】使用嵌套循环输出下列图形: ****** * * * * ****** 程序如下: #include void main() { int i,j; for(i=0;i<=3;i++) { for(j=0;j<=5;j++) if(i==0||j==0||i==3||j==5) printf("*"); else printf(" "); printf("\n"); } } 【习题4.11】编程统计用数字0~9可以组成多少个没有重复数字的3位偶数。 程序如下: #include void main( ) { int i,j,k,n=0,l=0; for(i=1;i<=9;i++) /*百位数字*/ for(k=0;k<=9;k++) /*十位数字*/ if(k!=i) for(j=0;j<=8;j+=2)//个位数字 { if(j!=k&&j!=i) { n++; printf("%4d",i*100+k*10+j); l++; if(l%10==0) /*10个数一行输出*/ printf("\n"); } } printf("\nn=%d\n",n); } 【习题4.12】从键盘输入的一组字符中统计出大写字母的个数m和小写字母的个数n,并输出m、n中的较大者。 程序如下: void main() { int m=0,n=0; char c; while((c=getchar())!='\n') { if(c>'A'&&c<='Z')m++; if(c>='a'&&c<='z')n++; } printf("m=%d,n=%d,max=%d\n",m,n,m } 【习题4.13】输出显示自然数1~100之间的全部素数。 程序如下: #include #include void main() { int n,i,j,l=0; for(n=2;n<=100;n++) { i=sqrt(n); for(j=2;j<=i;j++) if(!(n%j))break; if(j>=i+1) if(l<5) { printf("%d\t",n); l++; } else { printf("%d\n",n); l=0; } } } 【习题4.14】一个数如果恰好等于它的因子之和,就把它称为“完数”。例如,28的因子为1、2、4、7、14,而28=1+2+4+7+14,因此28是“完数”。编程序找出10000以内的所有“完数”并输出其因子。 程序如下: #include void main() { int m,s,i; for(m=2;m<10000;m++) s=0; for(i=1;i if((m%i)==0) s=s+i; if(s==m) { printf("%d,its factors are",m); f or(i=1;i if(m%i==0) printf("%d ",i); printf("\n"); } } } 【习题4.15】使用循环嵌套输出下列图形: ***** ***** ***** ***** 程序如下: #include void main( ) { int i,j,k; for(i=0;i<=3;i++) /*i是外循环变量用于控制行数*/ { for(k=1;k<=i;k++) /*k是内循环变量用于控制每行的空格数*/ printf(" "); for(j=0;j<=4;j++) /*j是内循环变量用于控制每行中星号的个数*/ printf("*"); printf("\n"); } } 【习题4.16】假设x,y是整数,编程求x y的最后3位数,要求x、y从键盘输入。 程序如下: #include void main() { int i,x,y; long last=1; printf("Input x and y:"); scanf("%d,%d",&x,&y); for(i=1;i<=y;i++) last=last*x%1000; printf("The last 3 digits:%ld\n",last); } 【习题4.17】编程实现将从键盘输入的偶数写成两个素数之和。 程序如下: #include #include void main() { int a,b,c,d; scanf("%d",&a); for(b=3;b<=a/2;b+=2) { for(c=2;c<=sqrt(b);c++) if(b%c==0) break; if(c>sqrt(b)) d=a-b; else continue; for(c=2;c<=sqrt(d);c++) if(d%c==0) break; if(c>sqrt(d)) printf("%d=%d+%d\n",a,b,d); } } 【习题4.18】100匹马驮100担货,大马一匹驮3担,中马一匹驮2担,小马两匹驮1担。试编写程序计算大、中、小马的数目。 程序如下: #include void main() { int x,y,z,j=0; for(x=0; x<=33; x++) for(y=0; y<=(100-3*x)/2;y++) { z=100-x-y; if( z%2==0 && 3*x+2*y+z/2==100) printf("(%d):x=%d,y=%d,z=%d\n",++j,x,y,z); } } 第五章数组 【习题5.1】现有一实型一维数组A[12],其各元素值在内存中排列的顺序为: 1.0,15.5,9.5,-23.0,8.4,66.5,7.1,2 2.0,54.5,-34.0,11.3,32.5 (1) 数组中元素值最小的数组元素。 (2) 数组中元素值最大的数组元素。 (3) 数组中某数组元素值等于另外两个数组元素值之和的等式。 (4) 数组中某数组元素值等于另外两个数组元素值之差的等式。 #include void main() { double A[12]={1.0,15.5,9.5,-23.0,8.4,66.5,7.1,22.0,54.5,-34.0,11.3,32.5}; int i,j,k; double max,min; min=A[0]; for (i=0;i<12;i++) if (min>A[i]) min=A[i]; printf("min=%lf\n",min); max=A[0]; for (i=0;i<12;i++) if (max printf("max=%lf\n",max); for (i=0;i<12;i++) for (j=0;j<12;j++) for (k=0;k<12;k++) { if (i==j || j==k || k==i) continue; if (A[i]+A[j]==A[k]) printf("%lf+%lf=%lf \n",A[i],A[j],A[k]); } for (i=0;i<12;i++) for (j=0;j<12;j++) for (k=0;k<12;k++) { if (i==j || j==k || k==i) continue; if (A[i]-A[j]==A[k]) printf("%lf-%lf=%lf \n",A[i],A[j],A[k]); } } 【习题5.2】现有一实型二维数组A[4][3],其各元素值在内存中排列的顺序为:4.0,28.0,15.5,-9.5,-23.0,8.0,56.0,2.0,28.0,7.0,6.2,5.0 请按下列要求写出各题的答案。 (1)数组中元素值最小的数组元素。 (2)数组中元素值最大的数组元素。 (3)数组中某数组元素值等于另外两个数组元素值之积的等式。 (4)数组中某数组元素值等于另外两个数组元素值之商的等式。 程序如下: #include void main() { double A[4][3]={4.0,28.0,15.5,-9.5,-23.0, 8.0, 56.0, 2.0, 28.0,7.0,6.2,5.0}; int i,j,k,g,n,m; double max,min; min=A[0][0]; for(i=0;i<4;i++) for(j=0;j<3;j++) if(min>A[i][j]) min=A[i][j]; printf("min=%lf\n",min); max=A[0][0]; for(i=0;i<4;i++) for(j=0;j<3;j++)