C语言 入坑(掌握 算法精髓.)

算法的概念:

一个程序应包含两个方面的内容:

(1)对数据的描述:数据结构.

(2)对操作的描述:算法.

 公式:数据结构 + 算法 = 程序.

  一个完整的 程序 应该是:数据结构 + 算法 + 程序设计方法 + 语言工具.

目录

广义的地说:为解决一个问题而采取的 方法 和 步骤,称为 " 算法 "

计算机算法分为两大类:

(1)数值运算算法:求数值解,例如 求方程的根,求函数的定积分等等.

(2)非数值运算符:常用于事务管理领域,例如图书馆检索,人事管理等等.

算法的特性:

(1)有穷性:包含有限的操作步骤.

(2)确定性:算法中的每一个步骤都应当是确定的.

(3)有零个或多个输入:输入是指在执行算法时需要从外界取得必要的信息.

(4)有一个或多个输出:算法的目的是为了求解,“ 解 ” 就是输出.

(5)有效性:算法中的每一个步骤应当能有效地执行,并得到确定的结果.

算法的表示.( 常用的有 )

(1)用自然语言表示算法.       

(2)用 流程图 表示算法.         

(3)三种基本结构 和 改进的流程图.

        1.传统流程图的弊端.

        2.三种基本结构.

        3.三种基本结构的共同特点.

(4)用 N-S 流程图表示算法.

(5)用 伪代码 表示算法.

结构化程序设计方法.

采取以下方法来保证得到结构化的程序:

两种不同的方法:

自顶向下,逐步细化方法的优点:

模块设计的方法:

总结 主要知识点:

算法的表示:基于三种基本结构的流程图、N-S流程图、N-S流程图.


广义的地说:为解决一个问题而采取的 方法 和 步骤,称为 " 算法 "

        

计算机算法分为两大类:

(1)数值运算算法:求数值解,例如 求方程的根,求函数的定积分等等.

(2)非数值运算符:常用于事务管理领域,例如图书馆检索,人事管理等等.

         

例如1:求1*2*3*4*5

方法一:

步骤1:先求1×2,得到结果2.

步骤2:将步骤1得到的乘积2再乘以3,得到结果6.

步骤3:将6再乘以4,得24.

步骤4:将24再乘以5,得120.

     

方法二:

如果要求1×2×...x1000,则要写999个步骤.

则可以 可以设两个变量:一个变量代表被乘数,一个变量代表乘数。不另设变量存放乘积结果,而直接将每一步骤的乘积放在被乘数变量中。设p为被乘数,i为乘数。用循环算法来求结果,算法可改写:

S1:使p=1

S2:使i-2

S3:使p×i,乘积仍放在变量p中,可表示为:p×i->p

S4:使i的值加1,即  i+1 -> i

S5:如果i不大于5,返回重新执行步骤S3以及其后的步骤S4和S5;否则,算法结束。最后得到p的值就是5!的值.

     

例如2:有50个学生,要求将成绩在80分以上者打印出来。设n表示学号,n1代表第一个学生学号,ni代表第i个学生学号。用g代表学生成绩,gi代表第i个学生成绩,算法表示如下:

S1:1->i

S2:如果gi80,则打印ni和gi,否则不打印.

S3::i+1->i

S4:如果i<50,返回S2,继续执行。否则算法结束。

变量i作为下标,用来控制序号(第几个学生,第几个成绩).超过50时,表示已对50个学生的成绩处理完毕,算法结束.

    

例如3:判定2000~2500年中的每一年是否闰年,将结果输出。分析:闰年的条件是:(1)能被4整除,但不能被100整除的年份都是闰年,如1996,2004年是闰年;(2)能被100整除,又能被400整除的年份是闰年。如1600,2000年是闰年,不符合这两个条件的年份不是闰年.

设y为被检测的年份,算法可表示如下:

S1:2000 -> y

S2:若y不能被4整除,则输出y “ 不是闰年 ”,然后转到S6.

S3:若y能被4整除,不能被100整除,则输出y “ 是闰年 ”,然后转到S6.

S4:若y能被100整除,又能被400整除,输出y “ 是闰年 ”,否则输出 “ 不是闰年 ”,然后转到S6.

S5:输出y “ 不是闰年 ”.

S6:y+1 -> y.

S7:当 y ≤ 2500时,转S2继续执行,如y > 2500,算法停止.


算法的特性:

(1)有穷性:包含有限的操作步骤.

(2)确定性:算法中的每一个步骤都应当是确定的.

(3)有零个或多个输入:输入是指在执行算法时需要从外界取得必要的信息.

(4)有一个或多个输出:算法的目的是为了求解,“ 解 ” 就是输出.

(5)有效性:算法中的每一个步骤应当能有效地执行,并得到确定的结果.


算法的表示.( 常用的有

(1)用自然语言表示算法.       

        自然语言是人们日常使用的语言,可以是汉语或英语或其它语言。用自然语言表示通俗易懂,但文字冗长,容易出现 “ 歧义性 ”。自然语言表示的含义往往不大严格,要根据上下文才能判断其正确含义,描述包含分支和循环的算法时也不很方便。因此,除了那些很简单的问题外,一般不用自然语言描述算法。


(2)用 流程图 表示算法.         

美国国家标准化协会ANSI规定了一些常用的流程图符号:

      

例如1:用流程图表示算法,打印50名学生中成绩在80分以上的学号和成绩.

     

例如2:将判断素数的算法用流程图表示.

流程图 表示算法总结:

一个流程图包含以下几部分:

(1)表示相应操作的框.

(2)带箭头的流程线

(3)框内外必须的文字说明.

优点:用流程图表示算法要比用文字描述算法逻辑清晰,易于理解.


(3)三种基本结构 和 改进的流程图.

1.传统流程图的弊端.

        传统流程图用流程线指出各框的执行顺序,对流程线的使用没有严格限制。因此,使用者可以毫不受限制的使用流程图随意改变转向,使流程图变得毫无规则,阅读者要花很大精力去追踪流程,使人难以理解算法的逻辑.

缺点:难以阅读、修改,使算法的可靠性和可维护性难以保证.

解决办法:必须限制箭头的滥用,即不允许无规律地使流程随意转向,只能顺序地进行下去.


2.三种基本结构.

        顺序结构,选择结构,循环结构.

用这三种基本结构作为表示一个算法的基本单元.


3.三种基本结构的共同特点.

(1)只有一个入口.

(2)只有一个出口.

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

(4)结构内不存在  “ 死循环 ”  (无终止的循环.


三种基本结构 和 改进的流程图 总结.

         由三种基本结构顺序组成的算法结构,可以解决任何复杂的问题。由基本结构所构成的算法属于 “ 结构化 ” 的算法,它不存在无规律的转向,只在本基本结构内才允许存在分支和向前或向后的跳转.

        只要具有上述四个特点的都可以作为基本结构。可以自己定义基本结构,并由这些基本结构组成结构化程序。下图符合基本结构的特点.


(4)用 N-S 流程图表示算法.

        1973年,美国学者提出一种新的流程图形式,完全去掉了带箭头的流程线。全部算法写在一个矩形框内,在该框内还可以包含其它的从属于它的框。这种流程图又称 N-S 结构化流程图.

        用三种 N-S 流程图中的基本框,可以组成复杂的N-S流程图。图中的 A框 或 B框,可以是一个简单的操作,也可以是三个基本结构之一。如下图:A框可以是一个选择结构,B框可以是一个循环结构.

    

例如1:用N-S图表示算,打印50名学生中成绩高于80分的学号和成绩.

    

例如2:将判别素数的算法用 N-S 流程图表示.

用 N-S 流程图表示算法 总结.

        一个结构化的算法是由一些基本结构顺序组成的。在基本结构之间不存在向前或向后的跳转,流程的转移只存在于一个基本结构范围之内.

优点:废除了流程线,整个算法结构是由各个基本结构按顺序组成的,N-S 流程图中的上下顺序就是执行时的顺序。用 N-S 图表示的算法都是结构化的算法,它不可能出现流程无规律的跳转,而只能自上而下地顺序执行.


(5)用 伪代码 表示算法.

概念:伪代码是用介于自然语言计算机语言之间的文字和符号来描述算法.

特点:自上而下地写下来,每一行(或几行)表示一个基本操作。不用图形符号,书写方便、格式紧凑,比较好懂,便于向计算机语言算法(即程序)过渡. 

用处:适用于设计过程中需要反复修改时的流程描述.

     

例如1:“ 打印x的绝对值 ” 的算法可以用伪代码表示为:

IF x is positive THEN
     print x
   ELSE
     print -x
可以用汉字伪代码表示:
   若x为正
     打印x
   否则
     打印-X
也可以中英文混用.

例如2:求5! 用伪代码表示算法开始.

开始
    置t的初值为1
    置i的初值为2
    当i<=5,执行下面操作:
        使t=t×i
        使i=i+1
         {循环体到此结束}
      输出t的值
结束

例如3:输出50个学生中成绩高于80分者的学号和成绩。用伪代码表示算法.

BEGIN {算法开始}
1 -> i
while i≤50
    {input and
    i+1 ->i}
1 -> i
while i≤50
{if≥80 print and i+1->i}
END {算法结束}

(6)用计算机语言表示算法.

概念:计算机无法识别流程图和伪代码,只有用计算机语言编写的程序才能被计算机执行。因此在用流程图或伪代码描述出一个算法后,还要将它转换成计算机语言程序.

特点:用计算机语言表示算法必须严格遵循所用的语言的语法规则.

用处:要完成一件工作,包括设计算法实现算法两个部分。设计算法的目的是为了实现算法.

例如1:将求5! 用C语言表示.

#include <stdio.h>
void main()
{int i,t;
    t=1;
    i=2;
while(i<=5)
{
    t=t*i;
    i-i+1;
}
printf(“%din",t);
}

结构化程序设计方法.

一个结构化程序:用三种基本结构组成的程序必然是结构化的程序,便于编写、便于阅读、便于修改和维护。结构化程序设计强调程序设计风格和程序结构的规范化,提倡清晰的结构.

结构化程序设计方法的基本思路是:把一个复杂问题的求解过程分阶段进行,每个阶段处理的问题都控制在人们容易理解和处理的范围内.


采取以下方法来保证得到结构化的程序:

(1)自顶向下.

(2)逐步细化.

(3)模块化设计.

(4)结构化编码.


两种不同的方法:

(1)自顶向下,逐步细化.

(2)自下而上,逐步积累.


自顶向下,逐步细化方法的优点:

        考虑周全,结构清晰,层次分明,作者容易写,读者容易看。如果发现某一部分中有一段内容不妥,需要修改,只需找出该部分修改有关段落即可,与其它部分无关.


模块设计的方法:

(1)模块化设计的思想是把一个大任务分为若干个子任务,每一个子任务相对简单.

(2)在拿到一个程序模块以后,根据程序模块的功能将它划分为若干个子模块.

(3)子模块一般不超过50行.

(4)划分子模块时,应该使一个模块完成一项功能,耦合性愈少愈好.


总结 主要知识点:

算法的表示:基于三种基本结构的流程图、N-S流程图、N-S流程图.


猜你喜欢

转载自blog.csdn.net/weixin_54977781/article/details/124720182
今日推荐