红皮书_C语言程序设计实用教程参考答案

更新时间:2023-06-02 08:27:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

习题解答

习题1

1.Dennis Ritchie

2.源代码文件:所谓源代码文件就是按着C语言的语法规则,使用文本编辑器编写的扩展名为.c 动代码。可执行文件

可以脱离开发环境独立运行。 3.不是。

4.目标文件中。

5.在工程Sun中添加earth.c源文件,见左图1,earth.c代码如下:

#include <stdio.h> int multiply(int,int); int main(){ int result=0;

result=multiply(20,10); printf("\n%d",result); getchar(); }

}

左图1 工程Sun

6. 在工程City中添加student.c、school.c等源文件,见左图2,代码如下: 源文件: sudent.c

int add(int x,int y){ return x+y; }

源文件: teacher.c

int sub(int x,int y){ return x-y; } 左图2 工程City

源文件: school.c

#include "stdio.h" int add(int,int); int sub(int,int); int main(){

int result1=0,result2=0; result1=add(5,3); result2=sub(5,3);

printf("%d,%d\n",result1,result2); return 0; }

习题2

1.以下(A)~(B)中哪个叙述是正确的。

(D) 一个C 程序可以由多个函数构成,这些函数可以分别写在多个源文件中。

2.需要。

3.

(1)函数封装代码便于程序的模块化管理

让C程序由若干个函数所构成,每个函数负责完成一定的任务,而且一个C程序可以将它使用的各个函数存放在一个源文件中,也可以将它使用的各个函数分别存放在不同的源文件中,当程序需要修改某个函数时,只需要重新编译该函数所在的源文件即可,不必重新编译其他函数所在的源文件,因此,用函数封装解决某一问题的过程便于程序的模块化管理、有利于系统的维护。

(2)函数封装代码便于在程序设计过程中代码复用,提高效率

由于一个源文件中的函数可以被多个C程序链接使用,这非常有利于代码的复用,比如,如果某个程序员想计算圆和梯形的面积,那么这个程序员无需知道计算圆面积的算法和计算梯形面积的算法,只要在他编写的main函数中调用(链接)circle.c 和lader.c中的函数即可,也就是说circle.c 和lader.c中的函数就是可复用的代码。 4.

可以编译、链接、运行成功 Allmans风格:

#include <stdio.h> int main() { }

Kernighan风格:

#include <stdio.h> int main(){ int a,b,c;a=12;b=100,c=-23; printf("%d\n",a); printf("%d\n",b);printf("%d\n",c);c=129;

printf("%d\n",a+b+c);return 0; }

习题3

1.B D

2.不能通过编译

3.下列程序的输出结果不是10,而是一个随机数。y没有初值。 4.B C 5.B

6.(A) &x

7.(D) 56Tiger198 8.(C) Ta

e 9.

#include <stdio.h>

#define PI 3.1415926 //定义符号常量 int main() {

double radius; //圆半径 double circleArea; //圆面积 double circleLength; //圆周长

radius = 100.12;

circleArea = PI*radius*radius; //使用const常量

circleLength = 2*PI*radius; //使用const常量

:%0.8f\n",radius,circleArea); %0.8f }

10.

#include<stdio.h> #include<stdlib.h>

int main(){ int highTemperature; //最高气温

int lowTemperature; //最低气温

int highSubLow; //最高气温与最低气温的差

printf("现在输出的最高气温是不可预测的垃圾值:%d\n",highTemperature); scanf("%d%d",&highTemperature,&lowTemperature); printf("最高气温:%d\n",highTemperature); printf("最低气温:%d\n",lowTemperature); highSubLow = highTemperature - lowTemperature;

printf("请输入最高气温和最低气温(用空格或回车分隔两个整数): ");

printf("最高气温与最低气温的差:%d\n",highSubLow); system("PAUSE"); return 0;

} 11.

#include <stdio.h>

int main() { double elephantWeight; //存储大象重量

double antOne,antTwo; //存储两只蚂蚁的重量 double weightSum; //存放重量和 printf("请输入大象和两只蚂蚁的重量:");

scanf("%lf%lf%lf",&elephantWeight,&antOne,&antTwo); printf("两只蚂蚁的重量分别是:\n");

printf("%0.20f和%0.20f\n",antOne,antTwo);

weightSum = antOne+antTwo; printf("两只蚂蚁的重量和:");

printf("%0.20f\n",weightSum); printf("%e\n",weightSum); printf("大象的重量是:\n"); printf("%0.20f\n",elephantWeight);

weightSum =elephantWeight+antOne+antTwo; printf("大象与两只蚂蚁的重量和:");

printf("%0.20f\n",weightSum); printf("%e\n",weightSum); return 0;

}

12.

#include <stdio.h>

int main() { char letter1,letter2,letter3,letter4,letter5,end; printf("请连续输入5个大写字母(然后按Enter):");

letter1 = getchar(); letter2 = getchar();

letter3 = getchar(); letter4 = getchar();

letter5 = getchar();

end = getchar(); //得到用户输入5个字母之后按的回车字符

putchar(letter1+32); putchar(letter2+32);

}

putchar(letter3+32); putchar(letter4+32); putchar(letter5+32); putchar('\n'); return 0;

习题4

1.(A) 76 (B) 7 (C) 22 (D) 3.5

2.(A) 9 (B) 8 (C) 7 (D) 6 3.B

4. (A) 12 (B) 13 (C) 12.08 (D) 20.0 5. (B) 3 6. (A) 72

7. (D) 2*x, x += 2 8. (C) c<'Z' && c >= 65 9.

3,1 3,1 0,3,1 1,3,1 10.c,c,c 99,99,99 11.x=7,y=3 z=18 12.T

0 1 1

13.一共4条语句 14.

#include <stdio.h>

int main(){

int a,b,c;

double result;

printf("请从键盘输入a,b,c的值,数之间用空格或回车分隔:\n"); scanf("%d%d%d",&a,&b,&c); result =2.0/3*a+5.0/6*b+6.0/7*c; printf("a=%d,b=%d,c=%d\n", a,b,c); printf("%.3f\n", result); return 0;

} 15.

#include <stdio.h>

int main(){

int number; short position1,position2,position3,position4 ; printf("请从键盘输入number的值:");

scanf("%d",&number); position4 =number/1000; position2 =number%100/10;

position3 =number%1000/100;

position1 =number%10; printf("number中个位上的数字是%d\n", position1); }

printf("number中十位上的数字是%d\n", position2); printf("number中百位上的数字是%d\n", position3); printf("number中千位上的数字是%d\n", position4); return 0;

习题5

1.y = 100;;处多了一个分号。

2.(A)_10,129___(B)2,-129__(C)__55,129___(D)_2,0_ 3. Tiger

#include <stdio.h> int main() {

int x = 10; if(x >= 0){ } else{ printf("wolf"); }

} else{ printf("Dog"); }

return 0; } 4. 30。

5.BAAA 6.

#include <stdio.h> int main(){ int a,b,c,d; int temp; int count = 0; printf("输入a,b,c,d的值,用空格或回车分隔:"); scanf("%d%d%d%d",&a,&b,&c,&d); if(a>b) { temp = a; a = b; b = temp; count++; printf("第%d次排序结果:a=%d,b=%d,c=%d,d=%d\n",count,a,b,c,d); }

if(a>c) { temp = a; a = c; c = temp; count++;

printf("第%d次排序结果:a=%d,b=%d,c=%d,d=%d\n",count,a,b,c,d); }

if(a>d) { temp = a; a = d; d = temp; count++; printf("第%d次排序结果:a=%d,b=%d,c=%d,d=%d\n",count,a,b,c,d); } if(b>c) { temp = b; b = c; c = temp; count++; printf("第%d次排序结果:a=%d,b=%d,c=%d,d=%d\n",count,a,b,c,d); } if(b>d) { temp = b; b = d; d = temp; count++; printf("第%d次排序结果:a=%d,b=%d,c=%d,d=%d\n",count,a,b,c,d); } if(c>d) { temp = c; c = d; d = temp; count++; printf("第%d次排序结果:a=%d,b=%d,c=%d,d=%d\n",count,a,b,c,d); } if(count == 0) { printf("a=%d,b=%d,c=%d,d=%d\n",a,b,c,d); } return 0; } 7.

#include <stdio.h> int main(){ int score; printf("输入学生成绩的值(1~100之间),用空格或回车分隔:"); scanf("%d",&score); if(score>=90) {

printf("优\n"); } else if(score>=80) { printf("良\n"); } else if(score>=70) { printf("中\n"); }

else if(score>=60) { printf("及格\n"); } else { printf("不及格\n"); } return 0; } 8.

#include <stdio.h> int main(){ int a,b,c;

printf("输入三角形的三个边,用空格或回车分隔:"); scanf("%d%d%d",&a,&b,&c); if(a<b+c&&b<a+c&&c<a+b){ printf("能构成三角形.\n"); if((a*a+b*b==c*c)||(a*a+c*c==b*b)||(a*a==b*b+c*c)){ printf("并且能构成直角三角形"); } else{ printf("但不能构成直角三角形"); } }

else{ printf("不能构成三角形"); }

return 0; } 9.

#include <stdio.h> int main() {

int number;

printf("输入一个正整数:"); scanf("%d",&number);

if(number%3==0){ printf("Tiger\n"); }

else if(number%3==1){ printf("Dog\n"); }

else if(number%3==2){ printf("Cat\n"); }

return 0; }

10.(也可以参考5.3节用if-else if -else 条件分支语句解决此问题) #include <stdio.h> int main() {

int number; double cost;

printf("输入用水量(正整数):"); scanf("%d",&number); switch(number){ case 1: case 2: case 3: case 4: case 5: cost=number*2.3; break; case 6: case 7: case 8: case 9: case 10: case 11: case 12: cost=number*5; break; default:

cost=number*6; }

printf("水费为%.2f元\n",cost); return 0; }

习题6

1.下列程序的输出结果是_sum=25,i=11_。 2.下列程序的输出结果是_1,2,0_____。 1. 下列程序的输出结果是__15____。 2. 下列程序的输出结果是__2____。

3. 下列程序的输出结果是。 4. 下列程序的输出结果是__25__。

5. 下列程序的输出结果是__ sum=321____。 6. 下列程序的输出结果是___ sum=88888___。 7. 下列程序的输出结果是__123____。

8. 下列程序运行时,从键盘输入shoping<回车>,程序输出的结果是__shop___。 9. 下列程序运行时,从键盘输入girl<回车>,程序输出的结果是__ giir$___。 10. while循环中的【表达式】应当是_(A). number!=0 ______。 11.

int n=0;

c=getchar();

while(c!='\n'){

if((c<='z'&& c>='a')||(c<='Z'&&c>='A'))

n++;

c=getchar(); }

printf("一共有=%d个字母",n); return 0; } 14.

方法之一 #include "stdio.h"

int main(){ int i=0,item1=-4,item2=1;

double item3=1;

double item4=0; int sum1=0;

int sum2=0; double sum3=0;

double sum4=0;

//求第一个数列的前100项之和

for(i=1;i<=100;i++){

sum1=sum1+item1; item1=item1+2;

}

printf("-4,-2,0,2,4,6前100项之和为 %d\n",sum1);

//求第二个数列的前100项之和 for(i=1;i<=100;i++){ sum2=sum2+item2;

item2=item2+4;

}

printf("1,5,9,13,17,21 前100项之和为 %d\n",sum2); //求第三个数列的前100项之和 for(i=1;i<=100;i++){

sum3=sum3+item3; item3=item3*3;

}

printf("1,3,9,27,81,243 前100项之和为 %E\n",sum3); //求第四个数列的前100项之和

for(i=1;i<=100;i++){

item4=item4+i; sum4=sum4+item4;

}

printf("1,1+2,1+2+3,1+2+3+4 前100项之和为 %E\n",sum4); return 0;

}

方法之二(只在求第四个数列的前100项之和处与方法一有差异) #include "stdio.h" int main(){

int i=0,j=0,item1=-4,item2=1; double item3=1;

double item4=0;

int sum1=0; int sum2=0;

double sum3=0; double sum4=0;

//求第一个数列的前100项之和 for(i=1;i<=100;i++){

sum1=sum1+item1;

item1=item1+2; }

printf("-4,-2,0,2,4,6前100项之和为 %d\n",sum1);

//求第二个数列的前100项之和 for(i=1;i<=100;i++){ sum2=sum2+item2;

item2=item2+4;

}

printf("1,5,9,13,17,21 前100项之和为 %d\n",sum2);

//求第三个数列的前100项之和 for(i=1;i<=100;i++){ sum3=sum3+item3;

item3=item3*3;

}

printf("1,3,9,27,81,243 前100项之和为 %E\n",sum3);

//求第四个数列的前100项之和

for(i=1;i<=100;i++){

for(j=1,item4=0;j<=i;j++){ item4=item4+j; }

sum4=sum4+item4; }

printf("1,1+2,1+2+3,1+2+3+4 前100项之和为 %E\n",sum4); return 0;

}

15.编程输出等差数列的前n项和,其中等差数列的首项、公差和求和项数n的值从键盘输入。

#include "stdio.h" int main(){ int i=0; int a1=0; //首项 int t=0; //公差

int n=0; //求和项数

double sum=0;//数列的前n项之和

int item=0;

printf("请输入首项、公差和求和项数n,用空格或回车分隔:"); scanf("%d%d%d",&a1,&t,&n); item=a1; for(i=1;i<=n;i++){

sum=sum+item; item=item+t; }

printf("首项为%d,公差为%d的等差数列前%d项之和为%E\n",a1,t,n,sum); return 0; }

16.编程输出1!+2!+3!...的前10项和。 方法之一

#include "stdio.h" int main(){

int i=0,n=1;

double fact=1;//求和的每一项(阶乘)

double sum=0;//前10项之和 while(n<=10){ sum=sum+ fact;

n++;

fact=fact*n;

}

printf("1!+2!+3!...的前10项和为%E\n",sum); return 0; }

方法之二(利用循环嵌套)

#include "stdio.h" int main(){

int i=0,n=1;

double fact=1;//求和的每一项(阶乘)

double sum=0;//前10项之和

while(n<=10){ fact=1;

i=1;

while(i<=n){ // n的阶乘

fact=fact*i; } i++;

sum=sum+ fact; n++;

}

printf("1!+2!+3!...的前10项和为%E\n",sum); return 0;

}

17.编写程序输出1~100之间不能被2除尽或不能被3除尽的数,并计算输出它们的和。

#include "stdio.h" int main(){

int i=0;

double sum=0,t=0; //满足条件的各项之和 for(i=0;i<=100;i++){ if( (i%2!=0) ||(i%3!=0)){

}

printf("%d ",i); sum=sum+i;

}

printf("满足条件的各项之和为%E\n",sum);

return 0;

}

18.编写程序输出如下排列格式的字符。

A BB CCC DDDD EEEEE

#include "stdio.h" int main(){

int i=0,j=0;

char ch='A';

for(i=1;i<=5;i++){ for(j=1;j<=i;j++){ printf("%c",ch); }

printf("\n"); ch=ch+1; }

return 0; }

19.改进例子6的猜数字游戏,使得具有如下功能:

当猜测次数操作10次时,禁止用户继续猜测(用break结束循环),并输出“你要好好想一想呀,要动脑呀!” 当猜测次数少于5次时,程序输出“你好聪明呀!”

#include <stdio.h> #include <time.h> #include <stdlib.h> int main(){

int randomNumber; //随机数 int guess; //用户的猜测

int count = 0; //记录用户的猜测次数 int ok = 0;

srand(time(NULL)); //用当前时间做随机种子

printf("给你一个1至100之间的数,请猜测:\n"); randomNumber = rand()%100+1; ok = scanf("%d",&guess); if(ok==0){ printf("发生输入错误,程序退出"); exit(0); }

count++;

while(guess != randomNumber) { count++; if(guess > randomNumber){ printf("猜大了,请再猜:\n"); } else if(guess < randomNumber){ printf("猜小了,请再猜:\n"); }

if(count>10){ //判断是否超过10次 break; } ok =scanf("%d",&guess); if(ok==0){ printf("发生输入错误,程序退出"); exit(0); } }

//判断次数,决定如何输出 if(count<5){

printf("您猜对了,共猜了%d次,这个数就是:%d\n",count,randomNumber); printf("你好聪明呀!"); }

else if(count<=10)

printf("您猜对了,共猜了%d次,这个数就是:%d\n",count,randomNumber); else printf("你要好好想一想呀,要动脑呀!"); return 0; }

20.数学上有一个计算 的公式:

1111 1

4

3

5

7

9

编写程序,计算并输出 的近似值,小数点保留12位。 #include <stdio.h> #include <math.h>

int main(){ double sum=0,fenzi=1,fenmu=1,dx=1;

while(fabs(dx)>1E-6){ //更换为1E-10可提高精度,但作者的机器稍有延迟出结果 sum=sum+dx; fenzi=-fenzi; fenmu=fenmu+2; dx= fenzi/fenmu; }

printf("\n%.12f",4*sum);

return 0;

}

21.编写程序,输出100内具有10个以上(含10个)因子的整数,并输出它的全部因子(例如,60一共有1,2,3,4,5,6,10,12,15,20,30,60十二个因子)。

#include <stdio.h> #include <math.h> int main(){ int i=0,j=0;

int count=0;//因子个数 for(j=10;j<=100;j++){ count=0; for(i=1;i<=j;i++){ if(j%i==0){ count++; } } if(count>=10){

printf("%d 有",j); for(i=1;i<=j;i++){ if (j%i==0) printf("%d ",i); } printf("共%d个因子 \n",count); } }

return 0; }

习题7

1. (B) void f(int,int,int); 2. (C) void add(int x,int y){

}

3. 37 4. 10 5.A 6. 9,6 7. 7 8. 6,12 9. 6,6

10. 290 11.

#include <math.h>

float tringle(float,float,float); int main(){ float a,b,c,tringle_area; printf("请输入三角形的三边的值: "); scanf("%f%f%f",&a,&b,&c); tringle_area=tringle(a,b,c); printf("三角形的面积是: %.2f\n",tringle_area); return 0; }

float tringle(float a,float b,float c){ float s,p; p=(a+b+c)/2.0f; s=(float)sqrt(p*(p-a)*(p-b)*(p-c)); return s; } 12.

#include <stdio.h> void f(int n); int main(){ int n=200; printf("以下输出1至200之间的全部素数\n"); f(n); return 0;

本文来源:https://www.bwwdw.com/article/a2z1.html

Top