1. 程式人生 > >程式設計的基本方法

程式設計的基本方法

IPO模式

輸入、處理(演算法,是程式的靈魂)、輸出

問題的計算部分

程式編寫步驟

分析問題 確定問題 設計演算法 編寫實現 除錯測試 升級維護

我們寫的程式都是有邏輯順序的,即是有流程的,流程圖的作用則是對這種邏輯順序的一種描述,是對解決問題的方法、思路或者演算法的圖形化的展示。

流程圖採用的符號

Axure裡的流程圖形狀元件面板

 

下面這的內容介紹來自(https://www.douban.com/note/310371289/)

 1、矩形   作用:一般用作要執行的處理(process),在程式流程圖中做執行框。   在axure中如果是畫頁面框架圖,那麼也可以指代一個頁面。有時候我們會把頁面和執行命令放在同一個流程中做說明,這個時候將兩類不同的矩形做色彩區別,然後做說明就好了。   2、圓角矩形或者扁圓   作用:表示程式的開始或者結束,在程式流程圖中用作為起始框或者結束框。   3、斜角矩形    作用:斜角矩形平時幾乎不使用,可以視情況自行定義。或者在其他的流程圖中,有特殊含義,暫不知曉,也希望有識之士指點一二。   4、菱形    作用:表示決策或判斷(例如:If...Then...Else),在程式流程圖中,用作判別框。   5、檔案    作用:表達為一個檔案,可以是生成的檔案,或者是呼叫的檔案。如何定義,需要自己根據實際情況做解釋。   6、括弧    作用:註釋或者說明,也可以做條件敘述。一般流程到一個位置,做一段執行說明,或者特殊行為時,會用到它。   7、半圓形    作用:半圓在使用中常作為流程頁面跳轉、流程跳轉的標記。   8、三角形    作用:控制傳遞,一般和線條結合使用,畫資料傳遞。   9、梯形    作用:一般用作手動操作。   10、橢圓形或圓形    作用:如果畫小圓,一般是用來表示按順序資料的流程。    如果是畫橢圓形,很多人用作流程的結束。如果是在use case用例圖中,橢圓就是一個用例了。   11、六邊形    作用:表示準備之意,大多數人用作流程的起始,類似起始框。   12、平行四邊形    作用:一般表示資料,或確定的資料處理。或者表示資料輸入(Input)。   13、角色    作用:來自於use case 用例,模擬流程中執行操作的角色是誰。需要注意的時,角色並非一定是人,有時候是機器自動執行,有時候也可是是模擬一個系統管理。   14、資料    作用:就是指儲存我們網站資料的資料庫。   15、圖片    作用:表示一張圖片,或者置入一個已經畫好的圖片、流程或者一個環境。

如何繪製流程圖?(https://www.edrawsoft.com/cn/How-to-draw-flowchart.php)

當我們還是新手的時候,我們中的大多數不知道如何繪製流程圖,但是隨著時間和經驗的積累,我們獲得一些新的技能。一個好的流程圖幫助我們理解系統的流程。如果一個流程圖沒有繪製好,就會誤導系統的設計師或者導致不好的結果。因此,建立流程圖時,細心和技能都很重要。我會建議您使用流程圖方便您理解它的流程。

儘管有許多符號在流程圖中可以用來表示不同的步驟,精確的流程圖只會使用其中幾種符號,比如說過程、決定、開始、延遲、雲等符號。

流程圖的基本元素是一個簡單的行動,可以是現金付款,是由一個方塊代表的。流程圖就像是一個方塊連線著一個方塊,連線這些方塊的是箭頭。

當必須要做出決定的時候,過程就會變得越來越複雜,這個時候必須採取替代行動。在流程圖中“決定”的形狀是菱形,決定的答案只有“是””或者“不是”兩種,就像在圖形2種展示的那樣。複雜的決定都是由簡單決定結合而成的。

 

關於決定,過程經常會出錯,要麼是問了錯誤的問題要麼是給了錯的答案。

當方塊不能夠用線直接連線,分開的線和匹配名字的方塊互相協調。這通常發生線上交叉到下一個頁面的時候。

 圖形3. 跨頁的持續流程圖

通過使用多個連線,這樣繪製大型的流程圖就變得相當簡單了,但是流程圖太大了理解起來就會變得困難。理想的流程圖大小是一頁就夠了,這樣的話,流程圖就給人一種視覺上的“主幹”感覺,這樣也很方便使用。

大的過程可以分解成層級的小的流程圖,作為分過程方塊。這就像一個高級別的普通行為方塊,可以“放縮”成另一個流程圖,就像圖形4中顯示的那樣。

 圖形4. 分過程

在分析過程是等待方塊的時候,一個額外的行為方塊很重要,這樣就會突出延遲(也就是 行為)。這就是一個典型的點,一個過程的總體花費可以通過表演或許是在其他過程減少延遲來提升。

 

對於“程式設計”的工作,很多剛開始學習的人的理解就是“寫程式碼”。相同,新手們苦惱的問題是,他們僅僅會“寫程式碼”。當接到一個新的任務,不少人總是在第一時間就爬到鍵盤上去敲程式碼。敲著敲著,就把自己繞糊塗了。頭暈腦脹地堅持下來,程式能執行,阿彌託佛,趕緊撤。這樣做出的程式,並不可靠。   在程式設計中,最重要的不是敲程式碼,而是設計。就像建築、機械等行業的要畫設計圖、施工圖,程式設計的思路也有必要用圖的形式畫出來。繪圖的過程就是思考的過程,因為其直觀性,繪圖的過程本身又促進了思考。在軟體project中,已經發展出了非常多種有用的圖,為軟體產品設計的質量提供保證。這部分練習幫助程式設計者掌握和實踐的“程式流程圖”。   一、什麼是程式流程圖

  “程式流程圖”常簡稱為“流程圖”,是一種傳統的演算法表示法,程式流程圖是人們對解決這個問題的方法、思路或演算法的一種描寫敘述。它利用圖形化的符號框來代表各種不同性質的操作,並用流程線來連線這些操作。在程式的設計(在編碼之前)階段,通過畫流程圖,能夠幫助我們理清程式思路。下圖是一個簡單的流程圖,描寫敘述求兩個數的最大公約數的演算法(輾轉相除法)。

    

  畫流程圖是每一個程式猿的基本功。流程圖有其規範,這是用於技術人員之間交流的須要,並非想怎麼畫就怎麼畫。流程圖中經常使用的符號見右圖,在前述求最大公約數的流程圖中找出相應的部分。

  二、三種控制結構的流程圖表示

  這部分不再寫文字,各種程式設計的教材中都會寫一些,至少在講各種控制結構時,總時要講的。請參考自己手頭能找到的教材,認真品味。   我們直接提示若干任務,畫一畫,就會了。

  三、練習題目(各部分分別至少選兩個畫一畫,注意用一張質量好一些紙,書寫整齊,確保越畫越高興)

  1、熱身   (1)將英尺轉換為米   (2)輸入兩個點的座標,求兩點之間的距離並輸出   2、分支程式   (1)描寫敘述一下今晚的計劃:假設下雪,校園內玩雪;否則,在103上機(懷念)   (2)丟硬幣決定今晚:正面,K歌;反面:逛街;立起來,學C++

  (3)求函式值:

  

  

  (4)輸入一元二次方程ax^2+bx+c=0的各項係數,並依據各系數的值的情況,分別進行求解(考慮對係數的各種可能太複雜時,給自己減少些難度,先從不考慮系統直接求解開始)   (5)輸入個人月收入總額,計算出他本月應繳稅款和稅後收入(稅率等參考第9周任務)    3、迴圈結構   (1)求1+2+3+...+100(三種迴圈結構都畫一畫)   (2)輸出1/3-3/5+5/7-7/9…+19/21的結果    (3)一個數假設恰好等於它的因子之和,這個數就稱為“完數”。找出1000內的全部完數。   (4)輸出1000以內的全部迴文數   (5)雞翁一,值錢五,雞母一,值錢三,雞雛三,值錢一,百錢買百雞,怎樣買?    4、複雜結構的程式

  在解決這個問題中,利用函式能夠讓我們利用更“有序”的思維去想問題,“自頂向下,逐步求精”,真理。例:以下的流程圖用於輸出星號圖,體現的是這樣的思維,右邊的圖能夠嵌入到左邊中,替代“輸出第i行”的框子,也能夠指導我們專門編成一個函式。

  

演算法和流程圖

2.1.1演算法

計算機語言只是一種工具。光學習語言的規則還不夠,最重要的是學會針對各種型別的問題,擬定出有效的解決方法和步驟即演算法。有了正確而有效的演算法,可以利用任何一種計算機高階語言編寫程式,使計算機進行工作。因此,設計演算法是程式設計的核心。

並非只有“計算”的問題才有演算法。廣義地說,為解決一個問題而採取的方法和步驟,稱為“演算法”。不要把“計算方法”(computational method)和“演算法”(algorithm)這兩個詞混淆。前者指的是求數值解的近似方法,後者是指解決問題的一步一步的過程。在解一個數值計算問題時,除了要選擇合適的計算方法外,還要根據這個計算方法寫出如何讓計算機一步一步執行以求解的演算法。對於計算機外行來說,他們可以只使用別人已設計好的現成演算法,只需根據演算法的要求給以必要的輸入,就能得到輸出的結果。對他們來說,演算法如同一個“黑箱子”一樣,他們可以不瞭解“黑箱子”中的結構,只是從外部特性上了解演算法的作用,即可方便地使用演算法。但對於程式設計人員來說,必須會設計演算法,並且根據演算法編寫程式。

對同一個問題,可以有不同的解題方法和步驟。例如,求1+2+3+…+100,可以先進行1+2,再加3,再加4,一直加到100,也可採取100+(1+99)+(2+98)+…+(49+51)+50=100+50+49×100=5050。還可以有其它的方法。當然,方法有優劣之分。有的方法只需進行很少的步驟,而有些方法則需要較多的步驟。一般說,希望採用方法簡單,運算步驟少的方法。因此,為了有效地進行解題,不僅需要保證演算法正確,還要考慮演算法的質量,選擇合適的演算法。

文字框:一個計算問題的解決過程通常包含下面幾步:

  • 確立所需解決的問題以及最後應達到的要求。必須保證在任務一開始就對它有詳細而確切的瞭解,避免模稜兩可和含混不清之處。
  • 分析問題構造模型。在得到一個基本的物理模型後,用數學語言描述它,例如列出解題的數學公式或聯立方程式,即建立數學模型。
  • 選擇計算方法。如定積分求值問題,可以用矩形法、梯形法或辛普生法等不同的方法。因此用計算機解題應當先確定用哪一種方法來計算。專門有一門學科“計算方法”,就是研究用什麼方法最有效、最近似地實現各種數值計算的,換句話說,計算方法是研究數值計算的近似方法的。
  • 確定演算法和畫流程圖。在編寫程式之前,應當整理好思路,設想好一步一步怎樣運算或處理,即為“演算法”。把它用框圖畫出來,用一個框表示要完成的一個或幾個步驟,它表示工作的流程,稱為流程圖。它能使人們思路清楚,減少編寫程式中的錯誤。
  • 編寫程式。
  • 程式除錯,即試算。一個複雜的程式往往不是一次上機就能通過並得到正確的結果的,需要反覆試算修改,才得到正確的可供正式執行的程式。
  • 正式執行得到必要的運算結果。

2.1.2流程圖

為了表示一個演算法,可以用不同的方法。常用的有:自然語言;傳統流程圖;結構化流程圖;虛擬碼;PAD圖等。這裡我們主要介紹流程圖。

  1. 傳統流程圖

用圖表示的演算法就是流程圖。流程圖是用一些圖框來表示各種型別的操作,在框內寫出各個步驟,然後用帶箭頭的線把它們連線起來,以表示執行的先後順序。用圖形表示演算法,直觀形象,易於理解。

文字框:美國國家標準化協會ANSI曾規定了一些常用的流程圖符號,為世界各國程式工作者普遍採用。最常用的流程圖符號見圖。

  • 處理框(矩形框),表示一般的處理功能。
  • 判斷框(菱形框),表示對一個給定的條件進行判斷,根據給定的條件是否成立決定如何執行其後的操作。它有一個入口,二個出口。
  • 輸入輸出框(平行四邊形框)。
  • 起止框(圓弧形框),表示流程開始或結束。
  • 連線點(圓圈),用於將畫在不同地方的流程線連線起來。如圖中有兩個以1標誌的連線點(在連線點圈中寫上“l”)則表示這兩個點是連線在一起的,相當於一個點一樣。用連線點,可以避免流程線的交叉或過長,使流程圖清晰。
  • 流程線(指向線),表示流程的路徑和方向。
  • 註釋框, 是為了對流程圖中某些框的操作做必要的補充說明,以幫助閱讀流程圖的人更好地理解流程圖的作用。它不是流程圖中必要的部分,不反映流程和操作。

程式框圖表示程式內各步驟的內容以及它們的關係和執行的順序。它說明了程式的邏輯結構。框圖應該足夠詳細,以便可以按照它順利地寫出程式,而不必在編寫時臨時構思,甚至出現邏輯錯誤。流程圖不僅可以指導編寫程式,而且可以在除錯程式中用來檢查程式的正確性。如果框圖是正確的而結果不對,則按照框圖逐步檢查程式是很容易發現其錯誤的。流程圖還能作為程式說明書的一部分提供給別人,以便幫助別人理解你編寫程式的思路和結構。

例:對一個大於或等於3的正整數,判斷它是不是一個素數。

所謂素數,是指除l和該數本身之外,不能被其它任何整數整除的數。例如,13是素數,因為它不能被2,3,4,…,12整除。

判斷一個數N(N>3)是否素數的方法是很簡單的:將N作為被除數,將2到(N—1)各個整數輪流作為除數,如果都不能被整除,則N為素數。演算法可以表示如下:

① 輸入N的值。

② I=2。

③ N被I除。

④ 如果餘數為0,表示N能被I整除,則列印N“不是素數”,演算法結束。否則繼續。

⑤ I=I+1。

⑥ 如果I≤N-l,返回③。否則列印N“是素數”。然後結束。

實際上.N不必被2到(N一1)的整數除,只需被2到N/2間整數除即可,甚至只需被2到之間的整數除即可。例如,判斷13是否素數,只需將13被2,3除即可,如都除不盡,N必為素數。步驟⑥可改為:

⑥:如果I≤,返回③。否則演算法結束。

  1. 三種基本結構

傳統的流程圖用流程線指出各框的執行順序,對流程線的使用沒有嚴格限制。因此,使用者可以毫不受限制地使流程隨意地轉來轉去,使流程圖變得毫無規律,閱讀者要花很大精力去追蹤流程,使人難以理解演算法的邏輯。如果我們寫出的演算法能限制流程的無規律任意轉向,而像一本書那樣,由各章各節順序組成,那樣,閱讀起來就很方便,不會有任何困難,只需從頭到尾順序地看下去即可。

為了提高演算法的質量,使演算法的設計和閱讀方便,必須限制箭頭的濫用,即不允許無規律地使流程亂轉向,只能按順序地進行下去。但是,演算法上難免會包含一些分支和迴圈,而不可能全部由一個一個框順序組成。如上例不是由各框順序進行的,包含一些流程的向前或向後的非順序轉移。為了解決這個問題,人們設想,如果規定出幾種基本結構,然後由這些基本結構按一定規律組成一個演算法結構,就如同用一些基本預製構件來搭成房屋一樣,整個演算法的結構是由上而下地將各個基本結構順序排列起來的。1966年,Bohra和Jacoplni提出了以下三種基本結構,用這三種基本結構作為表示一個良好演算法的基本單元。

  • 順序結構:如圖所示的虛線框內,A和B兩個框是順序執行的。順序結構是最簡單的一種基本結構。
  • 選擇結構:如圖所示的虛線框中包含一個判斷框。根據給定的條件p是否成立而選擇執行A和B。p條件可以是“x>0”或“x>y”等。注意,無論p條件是否成立,只能執行A或B之一,不可能既執行A又執行B。無論走哪一條路徑,在執行完A或B之後將脫離選擇結構。A或B兩個框中可以有一個是空的,即不執行任何操作。

迴圈結構:又稱重複結構,即反覆執行某一部分的操作。有兩類迴圈結構:

  • 當型(While):當給定的條件p成立時,執行A框操作,然後再判斷p條件是否成立。如果仍然成立,再執行A框,如此反覆直到p條件不成立為止。此時不執行A框而脫離迴圈結構。
  • 直到型(Until):先執行A框,然後判斷給定的p條件是否成立。如果p條件不成立,則再執行A,然後再對p條件作判斷。如此反覆直到給定的p條件成立為止。此時脫離本迴圈結構。

注意兩種迴圈結構的異同:(1)兩種迴圈結構都能處理需要重複執行的操作。(2)當型迴圈是“先判斷(條件是否成立),後執行(A框)”。而直到型迴圈則是“先執行(A框),後判斷(條件)”。(3)當型迴圈是當給定條件成立滿足時執行A框,而直到型迴圈則是在給定條件不成立時執行A框。

同一個問題既可以用當型迴圈來處理,也可以用直到型迴圈來處理。對同一個問題,如分別用當型迴圈結構和直到型迴圈結構來處理的話,則兩者結構中的判斷框內的判斷條件恰為互逆條件。Fortran77和90/95標準都不提供do until語句,Compaq Visual Fortran也不提供此擴充套件(但有些計算機系統則提供),因此需要將直到型迴圈轉換成一個當型迴圈結構:直到型迴圈等於一個A框加上一個當型迴圈,同時將給定的判斷條件“取反”。

  1. 結構流程圖

1973年美國學者I.Nassi和B.Shneiderman提出了一種新的流程圖形式。在這種流程圖中,完全去掉了帶箭頭的流程線。全部演算法寫在一個矩形框內。在該框內還可以包含其它的從屬於它的框,即可由一些基本的框組成一個大的框。這種適於結構化程式設計的流程圖稱N-S結構化流程圖,它用以下的流程圖符號:

(1)順序結構:A和B兩個框組成一個順序結構。

(2)選擇結構:當p條件成立時執行A操作,p不成立則執行B操作結構。

(3)迴圈結構:當型迴圈結構下,圖符表示先判斷後執行,當p條件成立時反覆執行A操作,直到p條件不成立為止。

直到型迴圈結構下,圖符表示先執行後判斷,當p條件不成立時反覆執行A操作,直到p條件成立為止。

用以上三種N-S流程圖中的基本框.可以組成複雜的N-S流程圖,以表示演算法。

例:將判別素數的演算法用N-S流程圖表示。

上面的非結構化流程圖不是由三種基本結構組成的:圖中間的迴圈部分有兩個出口,不符合基本結構的特點。由於不能直接分解為三種基本結構,應當先作必要的變換再用N-S流程圖的三種基本結構的符號來表示。即將第一個菱形框的兩個出口匯合在一點。其方法是設一個標誌值K,它的初始狀態為0(表示N為素數),當K≠0時為非素數。注意當型和直到型的判斷條件。

N-S圖表示演算法的優點是:比傳統流程圖緊湊易畫,尤其是它廢除了流程線。整個演算法結構是由各個基本結構按順序組成的,其上下順序就是執行時的順序。寫演算法和看演算法只需從上到下進行就可以了,十分方便。歸納起來,一個結構化的演算法是由一些基本結構順序組成的;在基本結構之間不存在向前或向後的跳轉,流程的轉移只存在於一個基本結構範圍之內(如迴圈中流程的跳轉);一個非結構化的演算法可以用一個等價的結構化演算法代替,其功能不變。如果一個演算法不能分解為若干個基本結構,則它必然不是一個結構化的演算法。

  1. 偽程式碼表示的演算法

用傳統的流程圖和N-S圖表示演算法直觀易懂,但畫起來比較費事,在設計一個演算法時,可能要反覆修改,而修改流程圖是比較麻煩的。因此,流程圖適宜於表示一個演算法,但在設計演算法過程中使用不是很理想的(尤其是當演算法比較複雜、需要反覆修改時)。為了設計演算法時方便,常用一種稱為虛擬碼的工具。虛擬碼是用介於自然語言和計算機語言之間的文字和符號來描述演算法。它如同一篇文章一樣,自上而下地寫下來。每一行(或幾行)表示一個基本操作。它不用圖形符號,因此書寫方便、格式緊湊,易懂也便於向計算機語言演算法(即程式)過渡。

可以用英文、漢字、中英文混合表示演算法,以便於書寫和閱讀為原則。用虛擬碼寫演算法並無固定的、嚴格的語法規則,只要把意思表達清楚,並且書寫的格式要寫成清晰易讀的形式。例如,對於電子在特殊幾何構型材料中的散射問題:[sphere-1.doc][sphere-2.doc][sphere.f]