專升本第十一講 (算法與程序)


前戲

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++)輕松地連接在一起。

 

 

 

 

 

    

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM