C语言程序设计(何欣铭、颜晖_第2版)课后习题答案

更新时间:2023-05-03 01:37:01 阅读量: 实用文档 文档下载

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

39

C语言程序的调试、运行步骤修改程序,观察语法错误、逻辑错误及改正方法。

?语法错误:可以删除一个分号,使编

编辑编译连接运行

译出现错误提示,改正之,再编译。

类比写文章有错别字。

开始源程序

.c / .cpp

语法

错误目标程序

.obj

连接

错误

可执行程序

.exe

运行

错误

结果?逻辑错误:将sum=sum+i 改为

sum=sum-i,编译、连接、运行,发现

运行结果不符合题目要求。找出错误

(调试),改正之,再编译、连接、运

行,看结果。类比写文章词不达意。

1.3习题参考答案

1.对C语言来说,下列标识符中哪些是合法的,哪些是不合法的?

total,_debug,Large&Tall,Counter1,begin_

解答:Large&Tall不合法,其余都合法。

2.改写本章1.4节中的流程图1.2,求1~100中能被6整除的所有整数的和。

解答:

图 1.1“求1~100中能被6整除的所有整数的和”的流程图

11

3.改写本章1.4节中的程序,求1~100中能被6整除的所有整数的和,并在编程环境中验证该程序的运行结果。

解答:

#include

intmain(void)

{

inti,sum=0;

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

if(i%6== 0) sum=sum+i;

printf("%d",sum);

return0;

}

运行结果:816

4.对于给定的整数n(n>1),请设计一个流程图判别n是否为一个素数(只能被1和自己整除的整数),并分析该流程图中哪些是顺序结构、哪些是分支结构与循环结构。

解答:在流程图中,分支结构和循环结构如图 1.2所示,自上而下的2个实线框和2个虚线组成了顺序结构。

输入n

i = 2

i<=n/2?

打印n是素数

n能被i整除?

i = i + 1

i>n/2?

打印n不是素数

循环结构

分支结构

#include

int main(void )

{

printf(" A\n");

printf("A A\n");

printf(" A\n");

return 0;

}

14

函数的概念

2.3练习与习题参考答案

2.3.1练习参考答案

2-1 编写程序,在屏幕上显示一个短句“Programming in C is fun!”。

解答:

#include

int main(void)

{

printf("Programming in C is fun!\n");

return 0;

}

2-2 下列语句的运行结果是什么?与例2-2 的运行结果有何不同?为什么?

printf("Programming is fun. And Programming in C is even more fun!\n");

解答:

运行结果:Programming is fun. And Programming in C is even more fun!

例2-2 的运行结果分 2 行显示。原因在于,例2-2 中在每条输出语句的结尾都采用了…\n?

换行。

2-3 编写程序,在屏幕上显示如下图案。

****

***

**

*

解答:

int main(void)

{

printf("* * * *\n * * *\n * *\n *\n");

return 0;

}

18

2-4 编写程序,求华氏温度150°F 对应的摄氏温度(计算公式同例2-3)。

解答:

#include

int main(void)

{

int celsius, fahr;

fahr = 150;

celsius = 5 * (fahr – 32) / 9;

printf("fahr = %d, celsius = %d\n", fahr, celsius);

return 0;

}

2-5 算术表达式5*(fahr-32)/9 能改写成5(fahr-32)/9 吗?为什么?如果将其改写为5/9*(fahr-32),会影响运算结果吗?

解答:

5(fahr-32)/9 不是合法的C 表达式,因为不能省略运算符*;5/9*(fahr-32)的值为0。

2-6 一个物体从100 米的高空自由落下,编写程序,求它在前3 秒内下落的垂直距离。设重

力加速度为10m/s2。

解答:

#include

int main(void)

{

double height;

height = 0.5 * 10 * 3 * 3;

printf("height = %.2f\n", height);

return 0;

}

2-7 输入提示和输入语句的顺序应该如何安排?例2-5 中,scanf("%d%d%lf", &money, &year,

&rate) 能改写为scanf("%d%lf%d", &money, &year, &rate) 吗?为什么?能改写为

scanf("%d%lf%d", &money, &rate, &year) 吗?如果可以,其对应的输入数据是什么?

解答:

输入提示在前,输入语句在后。

不能改写为scanf("%d%lf%d", &money, &year, &rate),因为%lf 与整型变量money 不匹

配,%d 与浮点型变量rate 不匹配。

与scanf("%d%lf%d", &money, &rate, &year)对应的输入数据为:1000 0.025 3

2-8 编写程序,输入华氏温度,输出对应的摄氏温度,计算公式同例2-3。

解答:

#include

int main(void)

{

int celsius, fahr;

19

? ?x + 2x + ? 5 1 x ≥ 0 ?

scanf("%d", &fahr);

celsius = 5 * (fahr - 32) / 9;

printf("celsius = %d\n", celsius);

return 0;

}

2-9 编写程序,输入 3 个整数,计算并输出它们的平均值。

解答:

#include

int main(void)

{

int a, b, c;

double average;

scanf("%d%d%d", &a, &b, &c);

average = (a + b + c) * 1.0 / 3;

printf("average = %.2f\n", average);

return 0;

}

2-10 编写程序,输入 x ,计算并输出下列分段函数 f(x)的值(保留 3 位小数)。

? 1 y = f ( x ) = ? x

?? 0

x ≠ 0 x = 0 解答:

#include

int main(void)

{

double x, y;

scanf("%lf", &x);

if(x != 0)

y = 1 / x;

else

y = 0;

printf("f(%.2f) = %.3f\n", x, y);

return 0;

}

2-11 编写程序,输入 x ,计算并输出下列分段函数 f(x)的值(保留 2 位小数),请调用 sqrt 函数求平方根,调用 pow 函数求幂。

x < 0 y = f (x ) = ? ? 解答:

#include

20

1 i ∑

#include

int main(void)

{

double x, y;

scanf("%lf", &x);

if(x >= 0)

y = sqrt(x);

else

y = pow(x,5) + 2 * x + 1 / x;

printf("f(%.2f) = %.2f\n", x, y);

return 0;

}

2-12 编写程序,输入 2 个整数 lower 和 upper ,输出一张华氏-摄氏温度转换表,华氏温度 的取值范围是[lower, upper],每次增加 2°F ,计算公式同例 2-7。

解答:

#include

int main(void)

{

int lower, upper;

double celsius, fahr;

scanf("%d%d", &lower, &upper);

printf("fahr celsius\n");

for(fahr = lower; fahr <= upper; fahr = fahr + 2){

celsius = 5 * (fahr - 32.0)/9 ;

printf("%3.0f %6.1f\n", fahr, celsius);

}

return 0;

}

n

2-13 编写程序,输入一个正整数 n ,求 i =1 。

解答:

#include

int main(void)

{

int i, n;

double sum;

scanf("%d", &n);

sum = 0;

for(i = 1; i <= n; i++)

sum = sum + 1.0 / i;

printf("sum = %.6f\n", sum);

21

2-14 编写程序,输入一个正整数 n ,计算1 .....+ + + 的前 n 项之和。 2-15 编写程序,输入一个正整数 n ,计算1 .....- + - + - + 的前 n 项之和。

return 0;

}

1 1 3 5

解答:

#include

int main(void)

{

int i, n;

double sum;

scanf("%d", &n);

sum = 0;

for(i = 1; i <= n; i++)

sum = sum + 1.0/(2*i-1);

printf("sum = %.6f\n", sum);

return 0;

}

1 1 1 1 1 4 7 10 13 16

解答:

#include

int main(void)

{

int flag, i, n, denominator;

double item, sum;

scanf("%d", &n);

sum = 0;

flag = 1;

denominator = 1;

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

item = flag * 1.0 / denominator;

sum = sum + item;

flag = -flag;

denominator = denominator + 3;

}

printf("sum = %.3f\n", sum);

return 0;

}

2-16 编写程序,输入两个正整数 m 和 n ,计算 m! + n!。

解答:

#include "stdio.h"

22

int main(void)

{

int i, m, n;

double fm, fn;

scanf("%d%d", &m, &n);

fm = 1;

for(i = 1; i <= m; i++)

fm = fm * i;

fn = 1;

for (i = 1; i <= n; i++)

fn = fn * i;

printf("%d! + %d! = %.0f\n", m, n, fm+fn);

return 0;

}

2-17 执行下列程序段后,sum 的值是。

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

sum = 0;

sum = sum + i;

}

解答:sum 的值是10。

2-18 输入一个正整数n,生成一张3 的乘方表,输出30到3n的值,可以调用幂函数计算3 的乘方。

解答:

#include

#include

int main(void)

{

int i, n;

double mypow;

scanf("%d", &n);

for(i = 0; i <= n; i++){

mypow = pow(3, i);

printf("pow(3,%d) = %.0f\n", i, mypow);

}

return 0;

}

2-19 输入一个正整数n,生成一张阶乘表,输出1!到n!的值。要求定义和调用函数fact(n) 计算n!,函数类型是double。

解答:

#include

int main(void)

23

{

int i, n;

double myfact;

double fact(int n);

scanf("%d", &n);

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

myfact = fact(i);

printf("%d! = %.0f\n", i, myfact);

}

return 0;

}

double fact(int n)

{

int i;

double product;

product = 1;

for(i = 1;i <= n; i++)

product = product * i;

return product;

}

2-20 根据下列公式可以算出从n 个不同元素中取出m 个元素(m≤n)的组合数。编写程序,输入 2 个正整数m 和n(m≤n),计算并输出组合数。要求定义和调用函数fact(n)计算n!,函数类型是double。

C nm =

n!

m!(n - m)!

解答:

#include "stdio.h"

double fact(int n);

int main(void)

{

int m, n;

double s;

scanf("%d%d", &m, &n);

s = fact(n)/(fact(m) * fact(n-m));

printf("result = %.0f\n", s);

return 0;

}

double fact(int n)

{

int i;

double product;

product = 1;

for(i = 1;i <= n; i++)

24

product = product * i;

return product;

}

2.3.2习题参考答案

1.编写程序,输入两个整数num1 和num2,计算并输出它们的和、差、积、商与余数。

解答:

#include

int main(void)

{

int num1, num2;

scanf("%d%d", &num1, &num2);

printf("%d + %d = %d\n", num1, num2, num1+num2);

printf("%d - %d = %d\n", num1, num2, num1-num2);

printf("%d * %d = %d\n", num1, num2, num1*num2);

printf("%d / %d = %d\n", num1, num2, num1/num2);

printf("%d %% %d = %d\n", num1, num2, num1%num2);

return 0;

}

2.为了倡导居民节约用电,某省电力公司执行“阶梯电价”,安装一户一表的居民用户电

价分两个“阶梯”:月用电量50 千瓦时以内的,电价为0.53 元/千瓦时;超过50 千瓦时的

用电量,电价上调0.05 元/千瓦时。编写程序,输入用户的月用电量(千瓦时),计算并输

出该用户应支付的电费(元)。

解答:

#include

int main(void)

{

double cost, e;

scanf("%d", &repeat);

scanf("%lf", &e);

if(e <= 50)

cost = 0.53 * e;

else

cost = 0.53 * 50 + (e - 50) * 0.58;

printf("cost = %.2f\n", cost);

return 0;

}

3.编写程序,输入实数x 和正整数n,计算xn,不允许调用pow 函数求幂。

解答:

#include

int main(void)

25

∑ (i

+ ) + - + - + .....

{

int i, n;

double mypow, x;

scanf("%lf%d", &x, &n);

mypow = 1;

for(i = 1; i <= n; i++)

mypow = mypow * x;

printf("%.2f\n", mypow);

return 0;

} n 4.编写程序,输入两个正整数 m 和 n ,求 i =m 解答:

#include

int main(void)

{

int i, m, n;

double sum;

scanf("%d%d", &m, &n);

sum = 0;

for(i = m; i <= n; i++)

sum = sum + i * i + 1.0 / i;

printf("sum = %.6f\n", sum);

return 0;

} 2

1

i 。

5.编写程序,输入一个正整数 n ,计算

1 -

2

3 4 5 6 3 5 7 9 11 的前 n 项之和。

解答:

#include

int main(void)

{

int flag, i, n;

double item, sum;

scanf("%d", &n);

sum = 0;

flag = 1;

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

item = flag * 1.0 * i / (2 * i - 1);

sum = sum + item;

flag = -flag;

} 26

∑ 2

printf("sum = %.3f\n", sum);

return 0;

}

6.某客户为购房办理商业贷款,选择了按月等额本息还款法,计算公式如下,在贷款本金 (loan )和月利率(rate )一定的情况下,住房贷款的月还款额(money )取决于还款月数 (month )。客户打算在 5~30 年的范围内选择还清贷款的年限,想得到一张“还款年限- 月还款额表”以供参考。编写程序,输入贷款本金 loan 和月利率 rate ,输出“还款年限- 月还款额表”,还款年限的范围是 5~30 年,输出时分别精确到年和元。

money = loan ?

rate (1 + rate )month

(1 + rate )month - 1

解答:

#include

#include

int main(void)

{

int year;

double loan, money, mypow, rate;

scanf ("%lf%lf", &loan, &rate);

printf(" year money\n");

for(year = 5; year <= 30; year++){

mypow = pow(1+rate, 12 * year );

money = loan * rate * mypow /( mypow - 1);

} printf("year=%d }

return 0;

money=%.0f\n", year, money);

7.编写程序,输入一个正整数 n ,求 n i =1

i

,可以调用 pow 函数求幂。

解答:

#include

#include

int main(void)

{

int i, n;

double sum;

scanf("%d", &n);

sum = 0;

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

sum = sum + pow(2, i);

}

printf("sum = %.0f\n", sum);

27

e = ∑ i ! ?

f - ? 32

return 0;

}

8.编写程序,输入一个正整数 n ,求

n i = 0 。要求定义和调用函数 fact(n)计算 n!,函数类 型是 double 。

解答:

#include

int main(void)

{

int i, n;

double sum;

double fact(int n);

scanf("%d", &n);

sum = 0;

for(i = 0; i <= n; i++){

sum = sum + fact(i);

}

printf("sum = %.0f\n", sum);

return 0;

}

double fact(int n)

{

int i;

double product;

product=1;

for(i = 1; i <= n; i++)

product = product * i;

return product;

}

2.4 实验指导教材参考答案

2.4.1 基本数据处理

一、调试示例:略

二、改错题:略

三、编程题

1.求华氏温度 150°F 对应的摄氏温度。计算公式如下,其中:c 表示摄氏温度,f 表示华 氏温度。

c = 5 5 9 9

28

y = sign ( x ) = ? 0, x = 0 ?

最好再增加两组测试用例,因为尚未对分段函数参数的边界值进行测试。可再给出 x=0 和 x=15 时的两种情况。

练习 3-2 输入一个整数 x ,计算并输出下列分段函数 sign(x) 的值。

?- 1, x < 0 ? ? 1, x > 0 解答:

#include

int main(void)

{

int x, y;

printf("Enter x: " );

scanf("%d",&x);

if(x>0) y=1;

else if (x==0) y=0;

else y=-1;

printf("sign( %d ) = %d\n",x,y);

return 0;

}

练习3-3 输入一个正整数n,再输入n 个学生的成绩,计算平均成绩,并统计所有及格学生的人数。

解答:

# include

int main(void)

{

int count, i, n;

double grade, total;

printf("Enter n: ");

scanf("%d", &n);

total = 0;

count = 0;

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

printf("Enter grade #%d: ", i);

scanf ("%lf", &grade);

total = total + grade;

if(grade >= 60) count++;

}

}

printf("Grade average = %.2f\n", total / n);

printf("Number of pass = %d\n", count);

return 0;

}

练习3-4 输入15 个字符,统计其中英文字母、空格或回车、数字字符和其他字符的个数。解答:

#include

int main(void)

{

int i;

int blank, digit, letter, other;

char c;

blank = digit = letter = other = 0;

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

c = getchar();

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

letter++;

else if(c>='0' && c <= '9')

digit++;

else if(c==' '||c=='\n')

blank++;

else

other++;

}

printf("letter=%d,blank=%d,digit=%d,other=%d\n", letter, blank, digit, other);

return 0;

}

练习3-5 输入一个年份year,判断该年是否为闰年。判断闰年的条件是:能被 4 整除但

不能被100 整除,或者能被400 整除。

解答:

# include

int main(void)

{

int year;

printf("Enter year: ");

scanf("%d", &year);

if( (year % 4 == 0 && year % 100 != 0 ) || year % 400 == 0)

printf("It is a leap year\n");

else

printf("It is not a leap year\n ");

return 0;

}

练习3-6 在例3-8 程序中,如果把switch 语句中所有的break 都去掉,运行结果会改变

吗?如果有变化,输出什么?为什么?

解答:

如果去掉所有的break 语句,运行结果会改变,输出price = 0.0 ,因为不管choice 值与其中某个常量表达式相等,当去掉break 语句时,其后的所有语句段都将运行,故每次都将

执行到price=0.0 语句为止。

练习3-7 输入五级制成绩(A-E),输出相应的百分制成绩(0-100)区间,要求使用switch 语句。例如,输入A,输出90-100。五级制成绩对应的百分制成绩区间为:A(90-100)、

B(80-89)、C(70-79)、D(60-69)和E(0-59)。

解答:

#include

int main(void)

{

char ch;

printf("Input Grade: ");

ch = getchar();

switch(ch){

case 'A': printf("%c 对应的百分制区间是90-100\n",ch); break;

case 'B': printf("%c 对应的百分制区间是80-89\n",ch); break;

case 'C': printf("%c 对应的百分制区间是70-79\n",ch); break;

case 'D': printf("%c 对应的百分制区间是60-69\n",ch); break;

case 'E': printf("%c 对应的百分制区间是0-59\n",ch); break;

default: printf("Invalid input\n");

}

return 0;

}

练习3-8 查询水果的单价。有 4 种水果,苹果(apples)、梨(pears)、桔子(oranges)和葡萄(grapes),单价分别是 3.00 元/公斤,2.50 元/公斤,4.10 元/公斤和10.20 元/公斤。在屏幕上显示以下菜单(编号和选项),用户可以连续查询水果的单价,当查询次数超过 5 次时,自动退出查询;不到 5 次时,用户可以选择退出。当用户输入编号1~4,显示相应水果的

单价(保留两位小数);输入0,退出查询;输入其他编号,显示价格为0。

[1] apples

[2] pears

[3] oranges

[4] grapes

[0] Exit

解答:

#include

int main(void)

{

int ri;

int choice;

float price;

for(ri=1; ri<=5; ri++){

printf("[1] apples\n");

printf("[2] pears\n");

printf("[3] oranges\n");

printf("[4] grapes\n");

printf("[0] Exit\n");

scanf("%d", &choice);

if(choice==0)

break;

else {

switch(choice){

case 1: price=3.00; break;

case 2: price=2.50; break;

case 3: price=4.10; break;

case 4: price=10.20; break;

default: price=0;

}

printf("price=%0.2f\n", price);

}

}

return 0;

}

练习3-9 请读者重新编写例3-4 的程序,要求使用嵌套的if - else 语句,并上机运行。

解答:

#include

int main(void)

{

double x, y;

scanf("%lf", &x);

if (x >15){

y = 2.5 * x - 10.5;

}

else {

if(x<0)

y=0;

else

y=4*x/3;

}

printf("f(%.2f)=%.2f\n", x, y);

return 0;

}

练习3-10 在例3-12 中,改写if 语句前,y= x + 1;和y= x + 2; 两条语句的执行条件是什么?改写后呢?

解答:

改写前:y=x+1 的执行条件是x<1; y=x+2 的执行条件是1<=x<2。

改写后:y=x+1 的执行条件是x<1; y=x+2 的执行条件是2<=x。

3.3.2习题参考答案

一.选择题

1.能正确表示逻辑关系:“a≥10 或a≤0”的C 语言表达式是 D 。

A.a >= 10 or a <= 0 C.a >= 10 && a <= 0 B.a >= 0 | a <= 10 D.a >= 10 || a <= 0

2.在嵌套使用if 语句时,C 语言规定else 总是 C 。

A.和之前与其具有相同缩进位置的if 配对B.和之前与其最近的if 配对

?

C .和之前与其最近的且不带else 的if 配对

D .和之前的第一个if 配对

3.下列叙述中正确的是 D 。

A .break 语句只能用于switch 语句

B .在switch 语句中必须使用default

C .break 语句必须与switch 语句中的case 配对使用

D .在switch 语句中,不一定使用break 语句

? 1 x > 0 4.有一函数 y = ? 0 x = 0 ,以下程序段中错误的是

??- 1 x < 0

C

A .if(x > 0) y = 1;

else if(x == 0) y = 0; else y = -1; C .y = 0;

if(x >= 0); if(x > 0) y = 1 ; else y = -1;

B .y=0;

if(x > 0) y = 1; else if(x < 0) y = -1; D .if(x >= 0)

if(x > 0) y = 1; else y = 0; else y = -1;

5.下列程序段的输出结果是

C

int main(void) {

int a = 2, b = -1,c = 2; if(a < b) if(b < 0) c = 0; else c++; printf("%d\n",c); return 0; }

A .0

B .1

C .2

D .3 6.下列程序段的输出结果是

int main(void) {

int x = 1,a = 0,b = 0; switch(x)

{

A

case 0: b++; case 1: a++ case 2: a++;b++; }

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

A .a=2,b=1

B .a=1,b=1

C .a=1,b=0

D .a=2,b=2

7.在执行以下程序时,为使输出结果为:t=4,则给 a 和 b 输入的值应满足的条件是 int main(void) {

C

int a,b,s,t;

scanf("%d,%d",&a,&b);

s = 1; t = 1;

if(a > 0) s = s + 1;

if(a > b) t = s + t;

else if(a == b) t = 5;

else t = 2 * s;

printf("t=%d\n",t);

return 0;

}

A.a>b B.ab

二.填空题

1.表示条件:1010&&x<100)||(x<0) 。

2.若有int x; 请以最简单的形式写出与逻辑表达式!x 等价的C 语言关系表达式x==0 。3.已知a=7.5,b=2,c=3.6,则表达式a>b&&c>a||ab 的值为0 。

4.若从键盘输入58,则以下程序段的输出结果是

585858 。

int main(void)

{

int a;

scanf("%d",&a);

if(a > 50) printf("%d",a);

if(a > 40) printf("%d",a);

if(a > 30) printf("%d",a);

return 0;

}

5.下列程序运行的输出结果是

9 。

int main(void)

{

char c = ?b?;

int k = 4;

switch(c)

{

case 'a': k = k + 1;break;

case 'b': k = k + 2;

case 'c': k = k + 3;

}

printf("%d\n",k);

return 0;

}

三.程序设计题

1.输入三角形的3 条边a, b, c,如果能构成一个三角形,输出面积area 和周长perimeter(保留 2 位小数);否则,输出"These sides do not correspond to a valid triangle"。

在一个三角形中,任意两边之和大于第三边。三角形面积计算公式:

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

Top