题目 1:什么是算法?试从日常生活中找 3 个例子,描述它们的算法。
算法是求解问题的步骤,是对特定问题求解步骤的一种描述。
例如:
-
自驾去新疆旅游:准备好车,规划旅游路线,开车出发,一路游山玩水。
-
网上买一部手机:选择网购平台,挑选想要的品牌和型号,下单,等待到货。
-
做西红柿炒蛋:准备食材(西红柿、鸡蛋、葱等),将鸡蛋打散,西红柿切块,葱切末;锅中倒油,炒熟鸡蛋盛出;再次倒油,放入葱末爆香,加入西红柿翻炒,再放入炒好的鸡蛋,加盐等调味料,翻炒均匀出锅。
题目 2:什么叫结构化的算法?为什么要提倡结构化的算法?
结构化算法是由一些顺序、选择、循环等基本结构按照顺序组成,流程的转移只存在于一个基本的范围之内。
提倡结构化算法的原因是它便于编写,可读性高,修改和维护起来简单,可以减少程序出错的机会,提高了程序的可靠性,保证了程序的质量。
题目 3:试述 3 种基本结构的特点,请另外设计两种基本结构(要符合基本结构的特点)。
结构化程序设计的三种基本结构及特点如下:
-
顺序结构:是一种线性、有序的结构,依次执行各语句模块。
-
选择结构:根据条件成立与否选择程序执行的通路。
-
循环结构:重复执行一个或几个模块,直到满足某一条件为止。
另外设计的两种基本结构(要符合只有一个入口、只有一个出口、结构内的每一部分都有机会执行到、结构内不存在死循环的特点):
-
while 型和 until 型循环复合结构。
-
多分支选择结构。
题目 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--|
|--结束--|