《C语言程序设计》(谭浩强第五版) 第5章 循环结构程序设计 习题解析与答案 |
您所在的位置:网站首页 › c语言程序设计谭浩强第五版第五章答案 › 《C语言程序设计》(谭浩强第五版) 第5章 循环结构程序设计 习题解析与答案 |
你也可以上程序咖(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 |