C语言程序设计入门之抽象编程
C語言程序設計入門之抽象編程
- 前言
- 1. 程序入門抽象:變量和過程抽象
- 2.程序結構抽象:順序、選擇、循環
- 3.程序進階抽象:問題(算法)抽象
- 4.軟件工程抽象:函數(模塊或問題分解)抽象
- 5.面向對象抽象:類與接口抽象(自定義數據抽象)
- 結束語
- 說明
前言
多年的計算機程序設計語言教學實踐發現,很多學生剛剛接觸時常常會感到計算機語言中的許多概念和方法非常抽象,常常搞不清楚,不能很好地理解和掌握。其實計算機程序中彌漫著大大小小的抽象。編程的實質就是抽象與表達。將現實世界的問題抽象成容易處理的可計算對象,然后使用計算語言來實現它。那究竟什么是抽象編程,以及如何進行抽象編程。今天我們就來談談它。
通常說來,抽象是指為了某種目的,對一個概念或一種現象包含的信息進行過濾,移除不相關的信息,只保留與某種最終目的相關的信息。例如,在下圖中,我們可以看到一個“黑白相間的皮質足球”,然后進一步過濾它的色彩、材料、用途等信息,得到一般性的概念,也就是“球”。從另外一個角度看,抽象就是簡化事物,抓住事物本質的過程。
從現實場景中首先抽象出其中的“足球”,再進一步抽象出“球體”
抽象是針對問題的特征對現實事物的緊密相關的屬性的提煉過程及結果。抽象是人類認識世界的基本法則之一,在現實世界中一些事物、狀態或過程之間總是存在著某些相似的方面,把這些方面集中和概括起來,暫時忽略它們之間的差異,或者說抽出事物的本質特性而暫時不考慮其細節,這就是抽象。
掌握抽象程序設計方法可以減少對C語言等計算機語言操作的神秘感,使得初學者更加容易學習和掌握程序設計、更好地理解和學會編寫簡單的程序,盡快地完成程序設計入門學習和實踐,提升程序設計水平和使用計算機解決實際問題的能力。
1. 程序入門抽象:變量和過程抽象
變量來源于數學,在初等數學中,變量是表示數字的字母字符,具有任意性和未知性。把變量當作是顯式數字一樣,對其進行代數計算,可以在單個計算中解決很多問題。在計算機語言中,變量是能存儲計算結果或表示值的抽象概念,變量具有通用性和代表性。比如在計算圓形面積等程序中的半徑變量可以代表所有的圓半徑。同理如果“家長”是一個變量的話,那它就可以代表“所有學生的家長”,每一時刻代表一個具體學生的“家長“。
計算機高級語言處理數據要全部通過變量和常量實現,絕大部分通過變量實現。初學者往往難以確定程序設計所需要的變量,難以動手編程。
這是程序設計入門的最基礎抽象,很多初學者在學習初期,就是不知道如何下手編程。實際上程序設計過程就是實際解決問題(模擬手工計算)的過程,所以程序設計的三步曲(過程)就是輸入、計算和輸出。
變量根據在程序中的作用可分為:輸入變量或已知變量,輸出變量或結果變量,輔助變量或臨時變量。明確這個問題,對于簡單的或已有已知簡單公式的問題,初學者可以根據題意比較容易設定以上變量并進行編程處理。
初學者同時要完成C語言表達式的構建及從初等數學表達式到C語言表達式的轉變,用以完成所需的數據處理。
如很多教材上的溫度轉換問題:根據輸入的華氏溫度值,將其轉換為對應的攝氏溫度值。
解決該問題可設置輸入變量1個,即要輸入的溫度值h,結果變量1個,為根據溫度轉換公式計算的溫度值c。解決過程就是首先輸入華氏溫度值,然后根據溫度轉換公式進行計算,最后將計算結果輸出。
又如已知矩形的兩邊長,求其周長和面積。解決該問題則可設置輸入變量2個,為矩形的兩邊長a、b,結果變量也是2個,分別為其周長c和面積area。
再如已知三角形的三邊長,求其面積。解決該問題則可設置輸入變量為3個,即三邊長a、b、c,結果變量1個,即其面積area,為了處理方便可設置中間變量s=(a+b+c)/2。
由此可以看出,輸入變量、輸出變量和臨時中間變量的設置都是根據問題實際來進行。一般情況下,至少有一個輸出變量,因為這是程序的執行結果,而輸入變量可以沒有,此時程序執行一個相對固定的結果。如使用無窮級數法計算圓周率的值和“韓信點兵”問題求解。
2.程序結構抽象:順序、選擇、循環
通過上面知識的學習,我們知道如同人們解決日常生活中的各種問題一樣,計算機程序也是按照一定順序和步驟解決所給定的問題。幾乎所有編程語言,都會有三種基本的程序結構:順序結構、選擇結構和循環結構。
順序結構就是一條一條地從上到下執行語句,所有的語句都會被執行到,執行過的語句不會再次執行。例如,求1+2+3+4+5的和,就可以一個數一個數地依次累加。
選擇結構就是根據條件來判斷執行哪些語句,如果給定的條件成立,就執行相應的語句,如果不成立,就執行另外一些語句。如,根據用戶輸入的年齡來輸出不同的內容。
如果年齡小于18用戶還未成年,應該好好學習;大于等于18,小于等于30,則應該珍惜青春,多做有益的事情;大于30,小于60,為社會中堅力量,就要工作的同時注意身體;大于等于60,就請安享晚年,我們會記得您對社會的貢獻。
循環結構就是在達到指定條件前,重復執行某些語句。如使用雙重循環結構來輸出九九乘法表。
需要注意的是,上述三種程序結構不是獨立存在的,而是相互融合在一起的,它們之間可以相互交織相互嵌套來完成一個功能的實現,如一個順序結構可劃分為多個不同的階段,也可看作多個順序結構的結合,同時每個階段又可以根據不同的條件進行選擇和循環等等。
3.程序進階抽象:問題(算法)抽象
做任何事情都有一定的步驟。為解決一個問題而采取的方法和步驟,就稱為算法。算法是一個基本的概念,但也是一門深奧的學問,小到如何輸出九九乘法表,如何對一組數據進行排序,大到如何控制飛行器的姿態,如何讓無人機避障等待。對于程序設計的初學者,涉及到的算法都很簡單,一般不會成為學習的障礙,
問題抽象通常又稱算法抽象。對于比較簡單的問題,使用變量抽象就可以解決。但對于稍微復雜的問題,只有簡單的變量抽象就遠遠不夠了,需要進行問題(算法)抽象才能解決。這就涉及到基本的程序設計方法,如窮舉法、遞推法和迭代法(含遞歸程序設計),此處不一一介紹。
如高空墜球問題:皮球從某給定高度自由落下,觸地后反彈到原高度的一半,再落下,再反彈,……,如此反復。問皮球在第n次落地時,在空中一共經過多少距離?第n次反彈的高度是多少?
使用變量抽象方法可以得到輸入變量為給定高度和反彈次數,輸出變量為皮球n次落地后經過的距離及之后的反彈高度。由于沒有直接的公式可以使用,必須經過推導得到相應的公式才能計算。
可以使用遞推法解決該問題,問題分析如下:
設置初始高度h,反彈次數n,皮球經過的距離d和最后的反彈高度h2(也可由初始高度遞推得到)。
分析問題可得到第1次落地時,經過的距離為h1,之后每1次落地時反彈高度為之前的1/2,經過的距離為反彈高度的2倍(彈起高度和下落高度)。
問題抽象和算法描述如下:
4.軟件工程抽象:函數(模塊或問題分解)抽象
對于比較復雜的問題,往往需要進行問題分解,即將1個大的問題,分解成多個規模和難度較小的問題,如果需要,可進行多層次分解,最后再整合分解出的小問題而得到原問題的解決方案。這也是個教學難點,很多學生即使在課程學習結束之后仍然不能掌握。
函數抽象著重功能抽象,往往將1個復雜問題分解成多個功能模塊,迭代分解直至一個個可以實現的具體功能模塊。
初學者面對的問題比較簡單,很多問題可以不使用函數都可以解決,但函數設計和使用是程序設計必須解決的問題。
函數抽象首先要明確函數的功能,根據功能先確定函數名和函數結果,函數結果也是函數的類型和返回值,并將已知條件確定為函數參數。對于有多個結果要返回的函數,可通過將參數設置為指針或引用即可。
設計函數分成兩步進行,即設計函數首部和函數體。設計函數首部時,可根據抽象的結果明確給出函數首部各內容,如通常包括函數類型,函數名稱,函數參數等。函數名稱通常采用英文單詞或簡寫命名,函數結果的類型就是函數類型,函數參數就是已知條件。設計出函數首部后就可以采用上面問題抽象的辦法來完成函數體設計,實現函數功能。
如設計一個求整數n的階乘的函數。階乘的英文單詞為factorial,通常將函數名設計為fact,顯而易見可將函數參數設置為整數n,函數結果即函數類型也為整數。則用C語言描述為:int fact(int n);
又如前面的高空落球問題,我們也可以通過設計函數進行程序設計。函數名可設計為FallBall,函數結果有兩個,我們可以設置距離d為函數結果,另一個反彈高度可通過參數的引用或地址傳遞得到。則c語言描述為double FallBall(double *h, int n);
程序設計方法可分為自底向上和自頂向下程序設計法。
一般而言,程序不是直接從第一行開始寫到最后一行結束,而是遵循兩種常見的順序之一:自頂向下和自底向上。自頂向下就是先寫框架,再寫細節,實際上就是先寫“偽代碼”,然后轉化成實際的代碼。我們可以充分利用“函數”這個工具,更好地貫徹這個方法,即先寫主程序,包括對函數的調用,再實現函數本身。自底向上則相反,即先寫函數,再寫主程序。
5.面向對象抽象:類與接口抽象(自定義數據抽象)
面向對象技術以更接近人們看待事物的思維,將數據和操作看成一個整體,具有程序結構清晰、實現簡單、可有效減少程序的維護工作量、代碼重用率高、開發效率高等優點。面向對象技術(OO,主要有OOA、OOD、OOP等)是當前計算機軟件開發的主流。
程序設計方法的發展經歷了4代,結構化和面向對象是軟件工程的程序設計方法中最本質的思想方法,結構化體現了抽象思維和復雜問題求解的基本原則,面向對象則深刻反映了客觀世界由對象組成這一本質特點。各種程序設計方法的一個重要區別在于問題分解的出發點不同(因子),思維模式不同。計算機中數據結構和過程是密切相關的,結構化方法將數據結構和過程分開考慮,面向對象的方法組合數據和過程于對象之中。如Java一切皆對象/Python一切皆對象。
面向對象程序設計從所處理的數據入手,以數據為中心而不是以服務(功能)為中心來描述系統。把編程問題視為一個數據集合,數據相對于功能而言,具有更強的穩定性。
面向對象程序設計由于和結構化程序設計存在著很大差異,初學者往往不能很好地轉換過來,也是一個教學難點。
結束語
經過上述五重抽象,可以大大有助于學生對程序設計的理解和掌握。但要真正掌握編程還是要通過大量編程實踐。
計算機世界里的抽象無處不在。每一類技術都建立了一套抽象,針對所面臨的問題提出一種一致的機制,然后遵從該機制來實現這一類問題的求解;在后期的學習和工作中,還有很多的抽象需要關注和學習,如開發框架是對不可變的過程抽象,將可變部分留給應用開發者根據具體問題域來定義和實現;又如設計模式是對軟件設計中普遍存在(反復出現)的各種問題,經過抽象后所提出的解決方案。
軟件開發和教學實踐證明,抽象是一種強有力的程序設計工具。抽象實現了“關注點分離”的原則,將一件復雜而完整的應用系統分解成多個子系統,各司其責,更容易構建和維護;善于系統地使用抽象,在合適的抽象層次上思考問題,或許就真正掌握了編程之道。
說明
文章內容如有問題和錯誤,請聯系我:lg997@126.com。引用請注明出處
總結
以上是生活随笔為你收集整理的C语言程序设计入门之抽象编程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 神的“存在”的意义
- 下一篇: 计算机专业如何写毕业论文-八大技巧