【不就是C程序设计习题嘛】— 第二章:算法----程序的灵魂

目录

★博文转载请注明出处。 

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

2. 什么叫结构化的算法?为什么要提倡结构化的算法?

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

 4. 用传统流程图表示求解以下问题的算法。

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

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

 3. 有3个数a,b,c, 要求按大小顺序把他们输出。

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

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

 6. 将100~200之间的素数输出

 7. 求两个数m和n的最大公约数

 8. 求方程ax^2 + bx + c = 0的根。

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

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

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

 3. 有3个数a,b,c, 要求按大小顺序把他们输出。

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

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

6.求100到200之间的素数

7. 求两个数m和n的最大公约数

8. 求方程ax^2 + bx + c = 0的根。

6. 用伪代码表示第4题中各题的算法

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

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

3. 有3个数a,b,c, 要求按大小顺序把他们输出。

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

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

6. 求两个数m和n的最大公约数

7. 求方程ax^2 + bx + c = 0的根。

7. 什么叫结构化程序设计?它的主要内容是什么?

1. 自顶向下

2. 逐步细化

3. 模块化设计

4. 结构化编程

8. 用自顶向下、逐步细化的方法进行以下算法的设计:

1. 输出1900---2000年中是软黏的年份,符合下面两个条件之一的年份是闰年:

2. 求ax^2 + bx + c = 0的根。分别考虑d = b^2 - 4ac大于0、等于0和小于0这三种情况。

3. 输入10个数,输出其中最大的一个数。

后记:

●由于作者水平有限,文章难免存在谬误之处,敬请读者斧正,俚语成篇,恳望指教!

                                                               ——By 作者:德塔


★博文转载请注明出处。 


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

算法:简而言之就是求解问题的步骤,对特定问题求解步骤的一种描述。

比如生活中的例子:

1. 考大学

首先填报志愿表、交报名费、拿到准考证、按时参加考试、收到录取通知书、按照日期到指

定学校 报到。

2. 去北京听演唱会

        首先在网上购票、然后按时坐车到北京,坐车到演唱会会场。

3. 把大象放进冰箱

        先打开冰箱门,然后将大象放进冰箱,关冰箱。

4.煮饭

先抓米,再加水,淘一淘,加水,盖上锅盖,插上电


2. 什么叫结构化的算法?为什么要提倡结构化的算法?

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

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


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

结构化程序设计方法主要由以下三种基本结构组成:

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

(比如你只有拿到了录取通知书才能去学校报到)

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

(讲人话就是,当条件成立时做……,当条件不成立时,做……)

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

(这里就要注意死循环问题)

重新设计基本结构要满足以下几点:

1. 只有一个入口

2. 只有一个出口

3. 结构内的每一部分都有机会执行到

4. 结构内不存在死循环

因此给出以下复习结构:while型和until型循环复合以及多选择结构


 4. 用传统流程图表示求解以下问题的算法。

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

解析: 用两个瓶子显然很难实现,可以借助一个空瓶子C作为中转,先将A中醋导入C中,然后将B中的酱油导入A中,最后将C中的醋导入B中即可实现交换。

 图片来自比特


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

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

 3. 有3个数a,b,c, 要求按大小顺序把他们输出。

解析:

i:先用a和b比较,如果a大于b,将a与b内容交换,否则进行ii

 ii:用c和a比较,如果c大于a,将a和c交换,否则进行iv

iii:用c和b比较,如果c大于b,将c和b进行交换,否则进行iv

iv:输出a、b、c,结束

图片来自比特 

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

解析:给定N为1,sum为0,如果N小于等于100时,进行sum += N,直到N超过100,循环操作完成后,sum即为从1加到100的结果。

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

解析:

i:输入数据n

ii:如果n能被3整数,进行iii,否则输出n不能被3和5整数

iii:如果n能被5整数,输出n能被3和5整数,否则n不能被3和5整数

 6. 将100~200之间的素数输出

素数:即数学中的质数,因子只有1和其本身的数字称为质数。

对100和200之间的每个数进行一下操作:该数能否被2~该数之间的所有数整除,是则是素数,输出,否则取下一个数字。

图片来自比特

 7. 求两个数m和n的最大公约数

解析:辗转相除法

a. 如果m大于n,交换m和n,m中存储大数,n中存储小数

b.如果b不等于0,循环进行一下操作:

用m%n结果给r,将n的值给m,将r的值给n

c.n等于0时,m即为最大公约数

比特

 8. 求方程ax^2 + bx + c = 0的根。

分别考虑:

  • 有两个不相等的实根;
  • 有两个相等的实根;

解析:

 


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

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

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

图片来自比特科技

 3. 有3个数a,b,c, 要求按大小顺序把他们输出。

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

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

6.求100到200之间的素数

7. 求两个数m和n的最大公约数

8. 求方程ax^2 + bx + c = 0的根。

分别考虑:

  • 有两个不相等的实根;
  • 有两个相等的实根;

6. 用伪代码表示第4题中各题的算法

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

begin
    醋 => A
    酱油 => B
    A => C
    B => A
    C => B
end

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

begin
    1 => i
    0 => max
    while i < 10
    {
        输入一个整数data
        if data > max
        {
            data => max
        }
    }
    print max
end

3. 有3个数a,b,c, 要求按大小顺序把他们输出。

begin
    input a
    input b
    input c
    if a > b
    {
        a => t
        b => a
        t => b
    }
    if c > a
    {
        c => t
        a => c
        t => a
    }
    if c > b
    {
        c => t
        b => c
        t => b
    }
    print a
    print b
    print c

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

begin
    1 => i
    0 => sum
    while i <= 100
    {
        sum + i => sum
        i + 1 => i
    }
    print sum
end

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

begin
    input n
    if n % 3 == 0
    {
        if n % 5 == 0
        {
            print n能被3和5整除
        }
        else
        {
            print n不能被3和5整除
    }
    else
    {
        print n不能被3和5整除
    }
end

6. 求两个数m和n的最大公约数

begin
input m
input n
if m > n
{
m => t
n => m
t => n
}
while n != 0
{
m % n => r
m => n
r => n
}

7. 求方程ax^2 + bx + c = 0的根。

分别考虑:

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

begin
    input a
    input b
    input c
    b*b - 4*a*c => p
    if p < 0
    {
        print 方程没有实根
    }
    if p == 0
    {
        print 方程有一个实根 -b/2a
    }
    if p > 0
    {
        print 方程有两个实根:
        print x1 = {-b + sqrt(b^2 - 4ac)}/2a
        print x1 = {-b - sqrt(b^2 - 4ac)}/2a
    }
end

7. 什么叫结构化程序设计?它的主要内容是什么?

结构化程序设计进行以模块功能和处理过程设计为主的详细 设计的基本原则。其概念最早由E.W.Dijikstra在1965年提出的。结构化程序设计思想确实使程序执行效率提高 ,是软件发展的一个重要的里程碑,它的主要观点是采用自顶向下、逐步求精的程序设计方法;即首先把一个复杂的大问题分解为若干个小问题,然后对每个小问题编写出一个功能上相对独立程序块(模块)。最后将各程序块进行组装成完整的程序。各个模块通过“顺序、选择、循环”的控制结构进行连接,并且只有一个入口、一个出口 。

具体来说,采用以下方法得到结构化程序:

1. 自顶向下

        程序设计的时候,应先考虑大的总体,后考虑细节,不要一开始就过多追求细节,否则会使我们很难进行下去,先从最上层总目标设计,逐步使问题具体化

2. 逐步细化

        对复杂问题,应设计一些子目标作为过渡,逐步细化

3. 模块化设计

        一个复杂问题,肯定是由若干稍简单的问题构成。模块化是把程序要解决的总目标分解成子目标,子目标再分解成具体的小目标,吧每一个小目标称为一个模块

4. 结构化编程

        编码实现


8. 用自顶向下、逐步细化的方法进行以下算法的设计:

1. 输出1900---2000年中是软黏的年份,符合下面两个条件之一的年份是闰年:

  • 能被4整除但不能被100整除
  • 能被100整除且能被400整除。

算法大体流程

1. 循环取1900到2000中的每一个年份

2. 对于每一个年份判断其是否是闰年

3. 是闰年则输出

判断一年是否是闰年:

1. 如果该年份内被4整除但是不能被100整除是闰年,否则不是闰年

2. 如果年份能被400整除则是闰年,否则不是闰年

2. 求ax^2 + bx + c = 0的根。分别考虑d = b^2 - 4ac大于0、等于0和小于0这三种情况。

1. 获取a b c的值

2. 计算b^2 - 4ac的结果并给p

3. 如果p < 0, 则方程没有实根

4. 如果p == 0,则方程有一个实根-b/2a

5. 如果p > 0, 则方程有两个实根 x1 = {-b + sqrt(b^2 - 4ac)}/2a x2 = {-b - sqrt(b^2 - 4ac)}/2a

3. 输入10个数,输出其中最大的一个数。

 1. 给一个max保存最大值

2. 分别输入10个数,并对用每个数与max进行比较 如果该数大于max,则将该数给max

3. 输出max


后记:

●由于作者水平有限,文章难免存在谬误之处,敬请读者斧正,俚语成篇,恳望指教!

                                                               ——By 作者:德塔

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

幸福西西弗斯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值