《C语言程序设计》(谭浩强第五版) 第5章 循环结构程序设计 习题解析与答案

您所在的位置:网站首页 c语言程序设计谭浩强第五版第五章答案 《C语言程序设计》(谭浩强第五版) 第5章 循环结构程序设计 习题解析与答案

《C语言程序设计》(谭浩强第五版) 第5章 循环结构程序设计 习题解析与答案

2024-07-11 09:24| 来源: 网络整理| 查看: 265

你也可以上程序咖(https://meta.chengxuka.com),打开大学幕题板块,不但有答案,讲解,还可以在线答题。

题目1:请画出例 5.6 中给出的3个程序段的流程图。

解∶下面分别是教材第5章例5.6给出的程序,据此画出流程图。

(1)程序1:

#include int main(){ int i, j, n = 0; for (i = 1; i = 1e-6)     //检查当前项 term 的绝对值是否大于或等于10的(-6)次方 {  pi = pi + term;  //把当前项 term 累加到 pi中  n = n + 2;   // n+2是下一项的分母  sign = -sign;  // sign代表符号,下一项的符号与上一项符号相反  term = sign / n; //求出下一项的值 term  count++;   // count 累加1 } pi = pi * 4;     //多项式的和pi乘以4,才是π的近似值 printf("pi=%10.8f\n", pi);  //输出π的近似值 printf("count=%d\n", count); //输出count的值 return 0;}

运行结果:

执行50万次循环。

(2) 采用fabs(t)>= 1e-8作为循环终止条件的程序,只需把上面程序的第8行如下修改即可:

while (fabs(term) >= 1e-8)

运行结果:

执行5000万次循环。

题目3:输入两个正整数 m 和 n,求其最大公约数和最小公倍数。

解:

答案代码:

#include int main(){

int p, r, n, m, temp; printf("请输入两个正整数n.m∶"); scanf("%d,%d,", &n, &m); if (n < m) {  temp = n;  n = m;  m = temp; } p = n * m; while (m != 0) {  r = n % m;  n = m;  m = r; } printf("它们的最大公约数为∶%d\n", n); printf("它们的最小公倍数为∶%d\n", p / n);

return 0;}

运行结果:

题目4:输入一行字符,分别统计出其中英文字母、空格、数字和其他字符的个数。

解:

答案代码:

#include int main(){

char c; int letters = 0, space = 0, digit = 0, other = 0; printf("请输人一行字符:\n"); while ((c = getchar()) != '\n')  if (c >= 'a' && c = 'A' && c = '0' && c 4) printf(",%d", k5); //以下类似 if (n > 5) printf(",%d", k6); if (n > 6) printf(",%d", k7); if (n > 7) printf(",%d", k8); if (n > 8) printf(",%d", k9); if (n > 9) printf(",%d", k10); printf("\n"); } } return 0;}

运行结果:

方法二。

答案代码:

#include int main(){ int m, s, i; for (m = 2; m < 1000; m++) { s = 0; for (i = 1; i < m; i++) if ((m % i) == 0) s = s + i; if (s == m) { printf("%d,its factors are", m); for (i = 1; i < m; i++) if (m % i == 0) printf("%d ", i); printf("\n"); } } return 0;}

运行结果:

题目10:有一个分数序列



$$\frac{2}{1},\frac{3}{2},\frac{5}{3},\frac{8}{5},\frac{13}{8},\frac{21}{13}...$$

求出这个数列的前20项之和。

解∶

答案代码:

#include int main(){ int i, n = 20; double a = 2, b = 1, s = 0, t; for (i = 1; i = 1e-5); printf("The square root of %5.2f is %8.5f\n", a, x1); return 0;}

运行结果∶

题目14:用牛顿迭代法求下面方程在1.5附近的根:

$$2x^3-4x^2+3x-6=0$$

解:

牛顿迭代法又称牛顿切线法,它采用以下的方法求根:先任意设定一个与真实的根接近的值 x_0 。作为第 1 次近似根,由 x_0 求出 f(x_0) ,过 (x_0, f(x_0))  点做   f(x) 的切线,交 x 轴于 x_1 ,把 x_1 作为第 2 次近似根,再由 x_1 求出 f(x_1)   ,过 (x_1, f(x_1))  点做 f(x) 的切线,交 x 轴于 x_2 ,再求出 f(x_2)  ,再作切线……如此继续下去,直到足够接近真正的根 x^* 为止,见图5.4。


从图5.4可以看出:

$$f'(x_0)=\frac{f(x_0)}{x_1-x_0}$$

因此

$$x_1=x_0-\frac{f(x_0)}{f'(x_0)}$$

这就是牛顿迭代公式。可以利用它由 x_0 求出 x_1 ,然后由 x_1 求出 x_2 ……



在本题中:

$$f(x)=2x^3-4x^2+3x-6$$

可以写成以下形式:

$$f(x)=((2x-4)x+3)x-6$$

同样, f'(x) 可写成:

$$f'(x)=6x^2-8x+3=(6x-8)x+3$$

用这种方法表示的表达式在运算时可节省时间。例如,求 f(x) 只需要进行 3 次乘法和 3 次加法,而原来的表达式要经过多次指数运算、对数运算和乘法、加法运算,花费时间较多。


但是由于计算机的运算速度越来越快,这点时间开销是微不足道的。这是以前计算机的运算速度较慢时所提出的问题。由于过去编写的程序往往采用了这种形式,所以在此也顺便介绍一下,以便在阅读别人所写的程序时知其所以然。


答案代码:

#include #include int main(){ double x1, x0, f, f1; x1 = 1.5; do { x0 = x1; f = ((2 * x0 - 4) * x0 + 3) * x0 - 6; f1 = (6 * x0 - 8) * x0 + 3; x1 = x0 - f / f1; } while (fabs(x1 - x0) >= 1e-5); printf("The root of equation is %5.2f\n", x1); return 0;}

运行结果∶

为了便于循环处理,程序中只设了变量 x0 和 x1,x0 代表前一次的近似根,x1代表后一次的近似根。在求出一个x1 后,把它的值赋给x0,然后用它求下一个x1。由于第1次执行循环体时,需要对 x0 赋值,故在开始时应先对 x1 赋一个初值(今为1.5,也可以是接近真实根的其他值)。

题目15:用二分法求下面方程在(-10,10)的根:

$$2x^3-4x^2+3x-6=0$$

解:

二分法的思路为∶先指定一个区间 [x_1,x_2]  ,如果函数 f(x) 在此区间是单调变化,可以根据 f(x_1) 和 f(x_2) 是否同符号来确定方程 f(x)=0 在   [x_1,x_2]  区间是否有一个实根。若 f(x_1) 和   f(x_2) 不同符号,则 f(x)=0 在 [x_1,x_2] 区间必有一个(且只有一个)实根; 如果 f(x_1) 和   f(x_2) 同符号,说明在 [x_1,x_2] 区间无实根,要重新改变 x_1 和 x_2 的值。当确定 [x_1,x_2] 有一个实根后,采取二分法将 [x_1,x_2] 区间一分为二,再判断在哪一个小区间中有实根。
如此不断进行下去,直到小区间足够小为止,见图5.5。

算法如下:

(1)输入 x_1 和   x_2  的值。

(2)求出 f(x_1) 和 f(x_2) 。


(3)如果 f(x_1) 和 f(x_2) 同符号,说明在
   [x_1,x_2]  区间无实根,返回(1),重新输入 x_1 和   x_2  的值; 若 f(x_1)  和 f(x_2)  不同符号,则在 [x_1,x_2]  区间必有一个实根,执行(4)。


(4)求   x_1 和   x_2   间的中点: x_0=\frac{x_1+x_2}{2} 。

(5)求出 f(x_0) 。


(6)判断 f(x_0) 和 f(x_1) 是否同符号。

①如同符号,则应在 [x_0,x_2] 中去找根,此
时 x_1 已 不起作用,用   x_0 代替   x_1 ,用 f(x_0) 代替 f(x_1) 。


②如用 f(x_0) 与 f(x_1) 不同符号,说明应在 [x_1,x_0] 中去找根,此时 x_2  已不起作用,用   x_0 代替   x_2  ,用 f(x_0) 代替 f(x_2) 。


(7)判断 f(x_0) 的绝对值是否小于某一个指定的值(例如 10^{-5} )。若不小于 10^{-5} ,就返回(4),重复执行(4)、(5)、(6);若小于 10^{-5} ,则执行(8)。


(8)输出   x_0 的值,它就是所求出的近似根。

N-S图见图5.6。


答案代码:

#include #include int main(){ float x0, x1, x2, fx0, fx1, fx2; do { printf("enter x1 & x2:"); scanf("%f,%f", &x1, &x2); fx1 = x1 * ((2 * x1 - 4) * x1 + 3) - 6; fx2 = x2 * ((2 * x2 - 4) * x2 + 3) - 6; } while (fx1 * fx2 > 0); do { x0 = (x1 + x2) / 2; fx0 = x0 * ((2 * x0 - 4) * x0 + 3) - 6; if ((fx0 * fx1) < 0) { x2 = x0; fx2 = fx0; } else { x1 = x0; fx1 = fx0; } } while (fabs(fx0) >= 1e-5); printf("x=%6.2f\n", x0); return 0;}

运行结果:

题目16:输出以下图案:

  *  *** ************ *****  ***   *

解:

答案代码:

#include int main(){ int i, j, k; for (i = 0; i



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3