谭浩强C语言程序设计第二章题解-笔记

题目 1:什么是算法?试从日常生活中找 3 个例子,描述它们的算法。

算法是求解问题的步骤,是对特定问题求解步骤的一种描述。

例如:

  1. 自驾去新疆旅游:准备好车,规划旅游路线,开车出发,一路游山玩水。

  2. 网上买一部手机:选择网购平台,挑选想要的品牌和型号,下单,等待到货。

  3. 做西红柿炒蛋:准备食材(西红柿、鸡蛋、葱等),将鸡蛋打散,西红柿切块,葱切末;锅中倒油,炒熟鸡蛋盛出;再次倒油,放入葱末爆香,加入西红柿翻炒,再放入炒好的鸡蛋,加盐等调味料,翻炒均匀出锅。

题目 2:什么叫结构化的算法?为什么要提倡结构化的算法?

结构化算法是由一些顺序、选择、循环等基本结构按照顺序组成,流程的转移只存在于一个基本的范围之内。

提倡结构化算法的原因是它便于编写,可读性高,修改和维护起来简单,可以减少程序出错的机会,提高了程序的可靠性,保证了程序的质量。

题目 3:试述 3 种基本结构的特点,请另外设计两种基本结构(要符合基本结构的特点)。

结构化程序设计的三种基本结构及特点如下:

  1. 顺序结构:是一种线性、有序的结构,依次执行各语句模块。

  2. 选择结构:根据条件成立与否选择程序执行的通路。

  3. 循环结构:重复执行一个或几个模块,直到满足某一条件为止。

另外设计的两种基本结构(要符合只有一个入口、只有一个出口、结构内的每一部分都有机会执行到、结构内不存在死循环的特点):

  1. while 型和 until 型循环复合结构。

  2. 多分支选择结构。

题目 4(部分):用传统流程图表示求解以下问题的算法。

(1)有两个瓶子 A 和 B,分别盛放醋和酱油,要求将它们互换(即 A 瓶原来盛醋,现改盛酱油,B 瓶则相反)。

可以借助一个空瓶 C 作为过渡,其步骤为:先将 A 瓶中的醋倒入 C 瓶,再将 B 瓶中的酱油倒入 A 瓶,最后将 C 瓶中的醋倒入 B 瓶。

流程图如下:

开始→A 倒入 C→B 倒入 A→C 倒入 B→结束

(2)依次将 10 个数输入,要求输出其中最大的数。

先输入 10 个整数,将第一个整数赋值给变量 max,然后依次取剩余的整数与 max 进行比较,如果某个整数大于 max,则将该整数赋值给 max,直到所有剩余整数全部比较完,max 中保存的即为最大整数,最后将 max 值输出。

流程图如下:

开始→输入一个数给 max→循环(i=1 到 9)→输入一个数→如果该数大于 max,则 max 等于该数→循环结束→输出 max→结束

(3)有 3 个数 a、b、c,要求按大小顺序把它们输出。

先用 a 和 b 比较,如果 a 大于 b,将 a 与 b 内容交换(此时 a 是 a、b 较小者);再用 c 和 a 比较,如果 a 大于 c,将 a 和 c 交换(此时 a 是 a、c 中较小者,即 a、b、c 中最小);接着用 c 和 b 比较,如果 b 大于 c,将 c 和 b 交换(此时 b 是 b、c 中的小者,也是三者中次小者);最后输出 a、b、c。

流程图如下:

开始→输入 a、b、c→如果 a 大于 b,交换 a、b→如果 c 大于 a,交换 a、c→如果 b 大于 c,交换 b、c→输出 a、b、c→结束

(4)求 1+2+3+...+100。

设置变量 n 初始化为 1,变量 sum 初始化为 0,在 n 小于等于 100 时,执行 sum += n 的操作,然后 n 增加 1,直到 n 超过 100,循环操作完成后 sum 即为从 1 加到 100 的结果。

流程图如下:

开始→n=1,sum=0→如果 n 小于等于 100,执行 sum += n,n = n + 1→循环结束→输出 sum→结束

(5)判断一个数 n 能否同时被 3 和 5 整除。

输入数据 n,如果 n 能被 3 整除,再判断 n 是否能被 5 整除,如果能被 5 整除,则输出 n 能被 3 和 5 整除,否则 n 不能被 3 和 5 整除;如果 n 不能被 3 整除,则直接输出 n 不能被 3 和 5 整除。

流程图如下:

开始→输入 n→如果 n 能被 3 整除→如果 n 能被 5 整除,输出 n 能被 3 和 5 整除,否则输出 n 不能被 3 和 5 整除→否则,输出 n 不能被 3 和 5 整除→结束

(6)将 100~200 之间的素数输出。

素数是指除了 1 和它本身以外不再有其他因数的自然数。对 100 到 200 之间的每个数进行判断,判断该数能否被 2 到该数的平方根之间的所有数整除,如果不能被整除,则该数是素数并输出。

流程图如下:

开始→n = 100→循环(n 小于等于 200)→i = 2→循环(i 小于等于根号 n)→如果 n 能被 i 整除,结束本次循环→i = i + 1→循环结束→如果 i 大于根号 n,输出 n→n = n + 1→循环结束→结束

(7)求两个数 m 和 n 的最大公约数。

可以使用辗转相除法,即:如果 m 大于 n,交换 m 和 n;然后循环进行,用 m 除以 n 得到余数 r,将 n 的值赋给 m,将 r 的值赋给 n,直到 n 等于 0,此时 m 的值就是最大公约数。

流程图如下:

开始→输入 m、n→如果 m 大于 n,交换 m、n→循环(n 不等于 0)→r = m % n→m = n→n = r→循环结束→输出 m→结束

(8)求方程的根。分别考虑以下情况:

a. 有两个不相等的实根;

b. 有两个相等的实根。

首先计算判别式,如果,再判断:如果,则方程有一个实根;如果,则方程有两个实根,。

流程图如下:

开始→输入 a、b、c→计算 disc = b^2 - 4ac→如果 disc 小于 0,输出方程没有实根→结束;如果 disc 大于等于 0→如果 disc = 0,输出方程有一个实根 -b / (2a)→结束;否则,输出方程有两个实根 (-b + 根号 disc) / (2a) 和 (-b - 根号 disc) / (2a)→结束

题目 5:用 N-S 图表示第 4 题中各题的算法。

(1)有两个瓶子 A 和 B,分别盛放醋和酱油,要求将它们互换(即 A 瓶原来盛醋,现改盛酱油,B 瓶则相反)的 N-S 流程图如下:

|--开始--|

| |--C = A--|

| |--A = B--|

| |--B = C--|

|--结束--|

(2)依次将 10 个数输入,要求输出其中最大的数的 N-S 流程图如下:

|--开始--|

| |--n = 1--|

| |--输入 max--|

| |--while(n < 10)--|

| | |--输入 a--|

| | |--if(a > max) max = a--|

| | |--n = n + 1--|

| |--end while--|

| |--输出 max--|

|--结束--|

(3)有 3 个数 a、b、c,要求按大小顺序把它们输出的 N-S 流程图如下:

|--开始--|

| |--输入 a、b、c--|

| |--if(a > b) { temp = a; a = b; b = temp; }--|

| |--if(a > c) { temp = a; a = c; c = temp; }--|

| |--if(b > c) { temp = b; b = c; c = temp; }--|

| |--输出 a、b、c--|

|--结束--|

(4)求 1+2+3+...+100 的 N-S 流程图如下:

|--开始--|

| |--n = 1--|

| |--sum = 0--|

| |--while(n <= 100)--|

| | |--sum = sum + n--|

| | |--n = n + 1--|

| |--end while--|

| |--输出 sum--|

|--结束--|

(5)判断一个数 n 能否同时被 3 和 5 整除的 N-S 流程图如下:

|--开始--|

| |--输入 n--|

| |--if(n % 3 == 0)--|

| | |--if(n % 5 == 0)--|

| | | |--输出"能同时被 3 和 5 整除"--|

| | | |--end if--|

| | |--else--|

| | | |--输出"不能同时被 3 和 5 整除"--|

| | | |--end else--|

| |--else--|

| | |--输出"不能同时被 3 和 5 整除"--|

| | |--end else--|

|--结束--|

(6)将 100~200 之间的素数输出的 N-S 流程图如下:

|--开始--|

| |--n = 100--|

| |--while(n <= 200)--|

| | |--i = 2--|

| | |--while(i <= sqrt(n))--|

| | | |--if(n % i == 0) break--|

| | | |--i = i + 1--|

| | |--end while--|

| | |--if(i > sqrt(n)) 输出 n--|

| | |--n = n + 1--|

| |--end while--|

|--结束--|

(7)求两个数 m 和 n 的最大公约数的 N-S 流程图如下:

|--开始--|

| |--输入 m、n--|

| |--if(m < n) { temp = m; m = n; n = temp; }--|

| |--while(n!= 0)--|

| | |--r = m % n--|

| | |--m = n--|

| | |--n = r--|

| |--end while--|

| |--输出 m--|

|--结束--|

(8)求方程的根。分别考虑以下情况:

a. 有两个不相等的实根;

b. 有两个相等的实根。

N-S 流程图如下:

|--开始--|

| |--输入 a、b、c--|

| |--disc = b^2 - 4ac--|

| |--if(disc < 0)--|

| | |--输出"方程没有实根"--|

| | |--end if--|

| |--if(disc >= 0)--|

| | |--if(disc == 0)--|

| | | |--输出"方程有一个实根 -b / (2a)"--|

| | | |--end if--|

| | |--if(disc > 0)--|

| | | |--输出"方程有两个实根 (-b + 根号 disc) / (2a) 和 (-b - 根号 disc) / (2a)"--|

| | | |--end if--|

| | |--end if--|

|--结束--|

相关推荐
陌小呆^O^10 分钟前
Cmakelist.txt之win-c-udp-server
c语言·开发语言·udp
时光の尘31 分钟前
C语言菜鸟入门·关键字·float以及double的用法
运维·服务器·c语言·开发语言·stm32·单片机·c
-一杯为品-40 分钟前
【51单片机】程序实验5&6.独立按键-矩阵按键
c语言·笔记·学习·51单片机·硬件工程
爱摸鱼的孔乙己1 小时前
【数据结构】链表(leetcode)
c语言·数据结构·c++·链表·csdn
Dola_Pan2 小时前
C语言:数组转换指针的时机
c语言·开发语言·算法
IU宝2 小时前
C/C++内存管理
java·c语言·c++
qq_459730032 小时前
C 语言面向对象
c语言·开发语言
陌小呆^O^3 小时前
Cmakelist.txt之win-c-udp-client
c语言·开发语言·udp
qystca6 小时前
洛谷 B3637 最长上升子序列 C语言 记忆化搜索->‘正序‘dp
c语言·开发语言·算法
网易独家音乐人Mike Zhou11 小时前
【卡尔曼滤波】数据预测Prediction观测器的理论推导及应用 C语言、Python实现(Kalman Filter)
c语言·python·单片机·物联网·算法·嵌入式·iot