专升本第十一讲 (算法与程序)

前戏

1、什么是程序

  简单的说,程序主要用于描述完成某项功能所涉及的对象和动作规则。

2、计算机程序的组成和特性

  (一)对数据的描述

  要指定预处理的数据类型和数据的组织形式,也就是数据结构。简单理解就是数据是如何放在电脑的,怎么去取用,如何组织都由程序来组织。。。。

  (二)对操作的描述

  即操作步骤,如“fileopen”为打开文件、“input”为读入数据、“if”为判断是否满足条件都是对操作的描述,这些动作的先后顺序以及它们所作用的数据要遵守一定的规则,即求解问题的算法。

  计算机科学家沃思提出公式:程序=数据结构+算法

 

算法

1、什么是算法

  程序的核心是算法,通俗的讲:算法就是解决问题的方法和步骤,解决问题的过程就是算法实现的过程

  算法并不是仅在计算机中的专业术语

2、算法的两个要素

  

  例如:求1+......+100

  实现算法步骤:

    a:累加器sum=0,第一项t=1

    b:重复执行下面的语句直到某项的值大于100,转到步骤c

       i:求累加和sum=sum+t

       ii:为下一项做准备:t=t+1

    c:输出:显示sum

    d:结束

 

  思考通过该式子求pi的值:

 

  第一要素:操作

  (一)算数运算:  +  -   *  /

  (二)关系运算:>   <  >=  <=  ==  !=

  (三)逻辑运算:与and、  or或、  not非

  (四)数据传送:输入、输出、赋值

  

  第二要素:控制结构

  

 

  (一)顺序结构

  (二)选择结构

  (三)循环结构(直到型、当型)

 

 

3、算法的特性

  (一)有穷性

  (二)确定性

  (三)可行性

  (四)输入:可以没有

  (五)输出:必须要有

 

4、算法的分类

  (一)数值型计算算法  例如:计算pi的值,高次方程的根

  (二)非数值计算算法  例如:数据的排序、查找

 

 算法的表示

1、自然语言

  优点:  

  (一)通俗易懂

  缺点:

  (一)易产生歧义,不太严格

  (二)语句繁琐、冗长、并且很难清楚表达逻辑流程

 

2、流程图法

  流程图是描述算法的常用工具,采用一些图框、线条、以及文字形象、直观的描述算法。

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

  

 

3、N-S图

  用框图来描述算法,具有以下几个特点:

  (一)去掉带箭头的流程线

  (二)全部算法以一个大的矩形框表示

  (三)框内包含一些从属关系的小矩形框

  (四)适合结构化程序

 

4、伪代码

  伪代码:是一种介于自然语言和计算机语言之间的文字和符号来描述算法,有如下简单约定:

  (一)每个算法用Begin开始、End结束;若仅表示程序中部分代码可以省略

  (二)每一条指令占一行,指令后面不跟任何符号

  (三)算法的输入输出以Input、Print后加入参数表形式表示

  (四)“//”标志表示注释的开始一直到行尾

  (五)用“<--”表示赋值

  (六)用缩进表示代码结构,多条语句用{}括起来

  (七)数组形式:数组名[下界............上界];数组元素:数组名[序号]

  (八)一些函数的调用或者处理简单的任务可以用一句自然语言代替

 

 1 Begin
 2 
 3     i<-1
 4     sum<-0
 5 
 6     for i to 100
 7         sum=sum+i
 8     
 9     Print  sum
10 
11 End

 

 

5、计算机语言

  上面我们对算法的描述计算机是不能识别的,为了能让计算机能运行,我们就要用计算机能识别的语言来描述算法,计算机语言常见的有c/c++,JAVA,BASIC,Python

 

算法设计基本方法

(一)枚举法

  枚举法被称为穷举法或者试凑法。基本思想是把所有的情况都拿来,然后根据题目的意思逐一测试

  例如:输出1-100之间即是3的倍数也是6的倍数

Begin
    i<-1
    For i to 100
        If(i%3=0 And i%6=0)
            Print i
End

   思考问题1:有100元钱,购买100只鸡,小鸡0.5元,公鸡2元,母鸡3元,问有多少购买方案

   思考问题2:有一种三位数,满足各位的三次方之和等于它的本生,这样的数称为水仙花数,求出满足条件的水鲜花数

(二)迭代法

  例题1:有一个猴子在一天内摘了若干个桃子,当天吃掉一半多一个,第二天又吃剩下的一半多一个,直到第7天上午,发现只有一个桃子了,问一共有多少个桃

(三)排序技术

  (a)选择排序

  (b)冒泡排序

(四)查找技术

  (a)二分查找

 

 

程序设计语言

1、设计语言概述

  自然语言是人们的交流工具,不同的语言形式不同;而程序设计语言是人与计算机交流的工具,是用来书写计算机程序的工具,也可以有不同语言来描述。程序设计语言有几百种,常用的只有十几种,程序设计语言可以大概分为三类:

  (一)机器语言

  机器语言是由0和1组成的二进制代码按照一定规则组成的、能被机器直接理解和执行的指令集合。

  机器语言中每一条语言实际是一条二进制形式的指令代码,格式如下:

    操作码+操作数

  操作码:指出该进行什么样的操作

  操作数:指出参与操作的数的本身或在它内存的地址

  例如:计算A=15+10的机器语言程序如下:

  10110000 00001111    :把15放入累加期A中
  00101100 00001010    :10与累加期A中的值相加,结果放入A中
  11110100          :结束

 

  由此可见,机器语言就像“天书”,

  缺点:编程工作量大,难学,难记,难理解,难修改,专业性太强,通用性差。

    优点,编写的程序不需要编译,因此所占空间小,执行速度快

       现在没有人用机器语言编程了

  

  (二)汇编语言

  克服机器语言的缺点,引入助记符,代替机器语言中的指令和数据。例如ADD表示加,SUB表示减,JMP表示程序跳转,这种指令助记符的语言就是汇编语言,又称符号语言。例如上文计算A=15+10可以写成如下指令:

MOV   A,15     :把15放入累加期A中
ADD   A,10      :10与累加期A中的值相加,结果放入A中
HLT         :结束

   缺点:面向机器,通用性差、不可移植、维护和修改困难

  优点:编程质量高、占储存空间小、执行速度快

 

  (三)高级语言

  20世纪50年代程序终于研究出来了高级语言,高级语言是一种接近自然语言和数学公式的程序设计语言。所谓“高级”是指它使程序员不需要和计算机硬件打交道。通常机器语言和汇编语言统一称为低级语言。从计算机技术发展的角度来看,程序语言的目标是让计算机直接理解人的自然语言,不需要机器语言,但这是一个漫长的过程。

  优点接近自然语言和数学公式的程序设计语言、使程序员不需要和计算机硬件打交道不必了解指令系统编程效率高

  缺点需要编译后计算机才能执行

 

  聊点历史:

  1954IBM推出世界第一门高级语言Fortran。高级语言开发成功是软件技术发展的重要里程碑

  C语言是高级语言的一种,是一种既有离计算机硬件近,能像汇编语言一样对硬件编程操作,如对位、字节和地址等进行操作,又具有高级语言的基本结构和语句。因此C语言是一门集高级语言和低级语言的功能于一体,因此有时称为C语言为中级语言。它既能适合高级语言应用的领域,如数据库、网络、图形、图像等方面;又适合低级语言应用的领域,如工业控制、自动检测,故得到广泛的应用。

  

 

2、语言处理程序

  在所有程序设计语言中,除了机器语言能被计算机直接理解执行之外,其他程序设计语言编写的程序都必须要经过一个翻译过程才能转换为计算机所能识别的机器语言程序

  实现这个翻译过程的工具是语言处理程序,即翻译程序(编译器)

  用非计算机语言写的程序称为源程序

  通过翻译程序翻译之后的程序称为目标程序

  针对不同的程序设计语言写出的程序,它们有各自的翻译程序,互相不通用

 

 (一)汇编程序

  汇编程序是将汇编语言编制的程序(源代码)翻译成机器语言程序(目标程序)的工具

 

 

(二)高级语言编译程序

  高级语言编译程序是将高级语言编写的源程序编译成目标程序的工具。翻译程序工作方式有两种:解释方式、编译方式。对应的工具为:解释程序、编译程序

 

  a、解释方式

  形象理解:“同声传译”

  步骤:解释程序对源成序逐句分析 ,若没有错误,将该语句翻译成一个或者多个机器语言指令,然后立即执行这些指令;若当它解释时发现错误,会立即停止,报错并提醒用户更正代码。

  解释方式不生成目标程序

  优点:适合人机对话、便于查找错误的语句行和修改

  缺点:执行速度慢,原因有以下三个

    其一:每次运行,都要重新解释

    其二:若程序较大,且错误发生在程序的后面,则前面的运行是无效的

    其三:解释程序只看到一条语句,无法对整个程序优化

  BASIC、LISP等语言采用解释方式

  

  b、编译方式

  形象理解:“笔译”

  步骤:编译程序对整个源程序进过编译处理,产生一个与源程序等价的目标程序,但目标程序还不能直接执行,因为程序中还可能要调用一些其他语言编写的程序或库函数,所有这些程序通过连接程序将目标程序和有关的库组合成一个完整的可执行程序。

  产生的可执行程序可以脱离编译程序和源程序独立存在并反复使用。

  优点:执行速度快

  缺点:每次修改源程序,都必须要重新编译

  大多数语言都是采用的编译方式,由于各种高级程序设计语言的语法和结构不同,所以它们的编译程序也不同。每种语言都有自己的编译程序,相互不能代替

  下图是c语言的编译方式:

 

 

3、程序设计的一般过程

4、程序设计方法

  在设计程序时候,除了精心研究算法,程序设计方法也很重要,它在很大程度上影响到程序的成败以及程序的质量。目前最常用的是结构化设计方法和面向对象的程序设计方法。无论哪种方法,程序的可靠性、易读性、高校性、可维护性等都是衡量程序质量的重要特性

 

(一)结构化程序设计

  在程序刚出现的早期,它的价格昂贵、内存很小、速度不高。程序员为了在小得可怜的内存下解决大量的科学计算问题,并为了节省昂贵的CPU机时费,他们不得不使用巧妙的手段和技术,手工编写各种高效的程序。其中显著特点是在程序中大量使用GOTO 语句,使得程序结构混乱、可读性差、可维护性差、通用性更差。

  结构化程序设计最早是由荷兰科学家E.W.Dijkstra提出,1966年他就指出:可以从高级语言中取消GOTO语句,程序的质量与程序中包含的GOTO语句的数量成反比;任何程序都基于顺序、选择、循环3种基本控制结构;程序具有模块化特征,每个程序模块具有唯一的入口和出口。这为结构化程序设计的技术奠定了理论基础。

  结构化编程主要包括如下两个方面:

    a、在软件设计和实现过程中,提倡采用自顶向下、逐步细化的模块化程序设计原则

    b、在底层模块代码编写时,强调采用单入口、单出口的3种基本控制结构(顺序、选择、循环),避免使用GOTO语句,构成如同一串珠子一样顺序清楚、层次分明的结构

 

 

  结构化程序的结构优点:

    简单清晰、可读性好、模块化强,描述方式符合人们解决复杂问题的普遍规律,在软件重用性、软件维护等方面有所进步,可以显著提高软件开发效率。

  结构化程序的结构缺点:

    a、难以适应大型软件的设计

    结构化程序设计注重功能的模块化设计,而被操作的数据处于实现功能的从属地位,其特点是程序和数据是分开存储的,即数据和处理数据分离。因此在大型程序软件系统开发中,容易出错,难以维护

    b、程序可重用性差

     结构化程序设计方法不具备“软件部件”工具,即使是面对老问题,数据类型的变化或处理方法的改变都必将导致重新设计

 

(二)面向对象程序设计

  由于结构化程序设计的缺陷,所以结构化程序设计不能满足现代软件开发的要求,一种全新的软件开发技术应运而生,这就是面向对象的程序设计(object oriented programming,OOP

  面向对象是20世纪80年代提出的,起源于smalltalk语言。用面向对象的方法解决问题,不再将问题分解为过程,而是将问题分解为对象。

  对象可以是现实世界中可以独立存在、可以区分的实体,也可以是一些概念上的实体,世界是由众多对象组成的。

  对象有自己的数据(属性),也有作用于数据的操作(方法),将对象的属性和方法封装成一个整体称为,供程序设计者使用。

  对象与对象之间的相互作用通过消息传递来实现

  目前,这种“对象+消息”的面向对象的程序设计模式有取代“数据结构+算法”的面向过程程序设计模式的趋向

  

  当然面向对象程序设计并不是要抛弃结构化程序设计方法,而是站在比结构化程序设计更高、更抽象的层次去解决问题。当所要解决的问题被分解为低级代码模块时,仍需要结构化程序编程的方法和技巧,但是,它分解大问题为小问题时采取的思路却与结构化方法是不同的。

    a、结构化的分解突出过程:如何做(how to do)?它强调代码的功能如何得以完成

    b、面向对象的分解突出真实世界和抽象的对象:做什么(What to do)?它将大量的工作交由相应的对象来完成

  面向对象的程序设计给软件发展带来了以下益处:

    a、符合人们习惯思维模式

    b、易于软件的维护和功能的增减

    c、可重用性好,能用继承的方式缩减程序开发的时间

    d、与可视化技术相结合,改善了工作界面

  在目前windows环境下常用的面向对象、可视化的程序设计语言有c++,visual basic、c#、python、java等。它们虽然风格各异,但都具有共同的思维和编程模式

 

 

 5、常见程序设计语言

  (一)早期出现的比较有影响的语言

  FORTRAN  1954    约翰·巴克斯  1977年获得图灵奖  第一门高级语言

  ALGOL    1958    艾伦·佩利      1966年获得图灵奖    标志程序设计语言称为一门独立的科学学科,并为软件自动化、软件可靠性奠定理论基础

  LISP      1959    为人工智能开发的语言

  COBOL   1959    强大的文件处理功能,计算能力弱,通用有冗长的语言被戏称为“八股文”

    BASIC    1964   是最简易学的交互式程序设计语言,适合初学者

  Pascal     1968   niklaus wirth   1968年获得图灵奖   提出结构化程序设计“程序=数据结构+算法” 

 

 

  (二)目前主流的教学和应用开发中流行的语言,下图是2018年5月互联网的TIOBE Softwawe对程序设计语言的流行程序统计

 

  a:C/C++

    C 1972        贝尔实验室  丹尼斯·里奇  肯·汤姆逊   1983共同获得图灵奖  为unix操作系统开发,功能强、使用灵活、执行速度快

         C++   1980  贝尔实验室  本贾尼·斯特劳斯特卢普 对C进行扩充,加入了面向对象概念

  b:java

    JAVA      1995  SUN Microsystems 公司开发  “写一次,跑到处”跨平台优点

  c:.NET平台

  为了使用网络的需要,2000年微软公司提出“任何人从任何地方、在任何时间、使用任何设备存取互联网上的服务”的战略,并推出Micrsoft.NET开发平台,它将对象技术和组件技术有机结合。此平台支持多种语言,可以在一个应用程序中开发使用多种语言之间无缝地交互集成。该平台最常用的是visual basic  和 C#.

  C#读作CSharp是微软用来替代Java的产品。该语言集C/C++功能强大、Java网络开发和安全、VB友好界面于一体,虽然起步晚但是已近称为.NET平台上最后欢迎的开发语言

  d:python

   python是近年来流行的一种面向对象程序设计语言,采用解释方式,由Guido Van Rossum于1989年发明

  特点:面向对象、语法简洁清晰、具有丰富强大的类库、适合快速的应用程序开发

  python也常被称为胶水语言,它能轻松的把其他语言制作的各种模型(尤其是c/c++)轻松地连接在一起。

 

 

 

 

 

    

 

转载于:https://www.cnblogs.com/chengtou/p/9125696.html

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值