版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
結(jié)構(gòu)化程序設(shè)計綜合訓(xùn)練1一、本課程的教學(xué)目的結(jié)構(gòu)化程序設(shè)計和面向?qū)ο蟪绦蛟O(shè)計是程序設(shè)計的兩種典型的思想和方法。目前高校開設(shè)的程序設(shè)計課程也基本據(jù)此劃分為兩大系列。C語言以其支持結(jié)構(gòu)化的設(shè)計和固有的語言特色——兼具高級語言和低級語言的功能、豐富靈活的控制和數(shù)據(jù)結(jié)構(gòu)、簡潔而高效的語句表達、清晰的程序結(jié)構(gòu)和良好的可移植性,保持著旺盛的生命力,廣泛應(yīng)用于系統(tǒng)軟件和應(yīng)用軟件的開發(fā)中。因此,本課程以C語言為工具,通過布置一些程序,進行結(jié)構(gòu)化程序化設(shè)計的綜合訓(xùn)練,該課程是計算機專業(yè)的一門實驗課,通過該課程的學(xué)習(xí),達到以下目的:2課程目的1.在軟件工程生命周期開發(fā)方法的指導(dǎo)下,深入理解和真正掌握自頂向下、逐步求精的結(jié)構(gòu)化程序設(shè)計方法;2.掌握良好的程序設(shè)計編碼風(fēng)格;3.學(xué)習(xí)常用的算法設(shè)計的技術(shù);4.進一步提高學(xué)生的程序調(diào)試能力;5.提高學(xué)生的程序編程興趣。3二、教材:本課程是實驗課程,主要以學(xué)生三性實驗為主。實驗指導(dǎo)書:ftp:///課件下載/結(jié)構(gòu)化程序設(shè)計訓(xùn)練實驗報告、源代碼、可執(zhí)行程序等發(fā)到j(luò)sj080506@163.com5班6班jsj080708@163.com7班8班4三、課時的安排序號內(nèi)容講授(學(xué)時)實驗1結(jié)構(gòu)化程序方法的開發(fā)流程1.52管理系統(tǒng)的開發(fā)0.53.53游戲程序的開發(fā)0.53.54篩選的算法設(shè)計技術(shù)0.53.55歸納的算法設(shè)計技術(shù)0.53.56分治的算法設(shè)計技術(shù)0.53.57最優(yōu)的算法設(shè)計技術(shù)0.53.58綜合程序開發(fā)0.549總結(jié)2合計7255四、其它說明綜合每個實驗考核成績(80%),平時的考勤情況(20%)等,作為期末的成績,成績用五級制。從三個方面考核每個實驗的成績:功能完成情況、實驗報告以及程序風(fēng)格、界面設(shè)計以及操作方便性。6結(jié)構(gòu)化的開發(fā)方法主要講述結(jié)構(gòu)化軟件開發(fā)方法和流程,重點在于自頂向下、逐步求精的結(jié)構(gòu)化程序設(shè)計方法和良好的程序設(shè)計編碼風(fēng)格,這些是一個優(yōu)秀的軟件開發(fā)人員應(yīng)該具備的基本素質(zhì)。具備這樣的基本素質(zhì),無論采用何種程序設(shè)計語言,都能夠?qū)懗鼋Y(jié)構(gòu)清晰、易讀易懂的好程序。1、結(jié)構(gòu)化開發(fā)方法2、結(jié)構(gòu)化方法的開發(fā)流程71、結(jié)構(gòu)化開發(fā)方法軟件開發(fā)歷史上的諸多慘痛教訓(xùn)使人們逐漸認識到,軟件不等于源代碼,大型軟件系統(tǒng)的開發(fā)與其他工程項目如建造橋梁、制造飛機、輪船等一樣,必須有計劃進行。軟件工程正是隨著軟件的發(fā)展而誕生的一門學(xué)科,以提高軟件質(zhì)量、降低開發(fā)成本為目的。軟件工程將軟件的開發(fā)視為一項工程,借鑒傳統(tǒng)工程的原則和方法,將正確的管理方法和當(dāng)前能夠得到的最好的開發(fā)技術(shù)結(jié)合起來。軟件工程采用的方法有兩種:結(jié)構(gòu)化開發(fā)方法和面向?qū)ο蟮拈_發(fā)方法,本課程主要介紹結(jié)構(gòu)化開發(fā)方法。8軟件有自己的“生命周期”。一個軟件從定義、開發(fā)、使用和維護,直到最終被廢棄,要經(jīng)歷一個漫長的時期,這就如同一個人要經(jīng)歷胎兒、兒童、青年、中年、老年,直到最終死亡的漫長時期一樣。通常把軟件經(jīng)歷的這個漫長的時期成為生命周期。9人類在解決復(fù)雜問題時普遍采用的一個策略就是“各個擊破”,也就是對問題進行分解然后再分別解決各個子問題。結(jié)構(gòu)化的開發(fā)方法就是從時間角度對復(fù)雜的軟件問題進行分解,把軟件漫長的生命周期依次分為若干個階段,每個階段有獨立的任務(wù),然后逐步完成每個階段的任務(wù)。前一個階段任務(wù)的完成是進行后一個階段工作的前提和基礎(chǔ),而后一個階段任務(wù)的完成通常使前一個階段提出的解法更進一步具體化,增加了更多的實現(xiàn)細節(jié)。在每一個階段結(jié)束之前都必須進行正式嚴格的技術(shù)審查和管理復(fù)審,若審查通不過,則必須進行必要的返工,返工后還要進行審查。審查的一個主要標志就是每個階段都應(yīng)該提交與所開發(fā)的軟件完全一致的高質(zhì)量的文檔資料,從而保證在軟件開發(fā)工程結(jié)束時有一個完整準確的軟件配置交付使用。文檔不僅是前后階段的通信工具,而且是軟件交付使用后進行維護的依據(jù)。采用結(jié)構(gòu)化的開發(fā)方法,使軟件開發(fā)的全過程以一種有條不紊的方式進行,保證了軟件的質(zhì)量,特別是提高了軟件的可維護性。102、結(jié)構(gòu)化方法的開發(fā)流程在結(jié)構(gòu)化開發(fā)中,編碼只是軟件開發(fā)的一個很小的階段,而且是處在實現(xiàn)階段。對于c語言的初學(xué)者,由于沒有正式接受系統(tǒng)化的開發(fā)方法的指導(dǎo),往往會形成一個錯誤地認識:程序的開發(fā)就是編碼。也就是說,拿到問題后,馬上就開始寫程序。這種做法的不良后果初學(xué)者還無法體會,因為他們所面臨的需要解決的問題都比較小,但對于復(fù)雜的現(xiàn)實問題的解決,即軟件項目的開發(fā)是絕對行不通的。實際上,在初學(xué)者直接編寫程序的過程中,大腦已經(jīng)讓初學(xué)者無意識地完成了對問題的分析和設(shè)計過程,只是沒有文檔化而已。但對于大型軟件項目的開發(fā),按步驟形成相應(yīng)的文檔是非常重要的。結(jié)構(gòu)化的開發(fā)流程可以用如圖的瀑布模型來模擬:11瀑布模型12軟件生命周期各階段的主要任務(wù)(1)問題定義:確定系統(tǒng)的目標、規(guī)模和基本任務(wù)。(2)可行性研究:從經(jīng)濟、技術(shù)、法律等方面分析確定系統(tǒng)是否值得開發(fā),及時建議停止項目開發(fā),避免人力、物力、時間的浪費。(3)需求分析:確定軟件系統(tǒng)應(yīng)具備的具體功能。通常用數(shù)據(jù)流圖、數(shù)據(jù)字典和簡明算法描述表示系統(tǒng)的邏輯模型,防止系統(tǒng)的設(shè)計與用戶的實際需求不相符的后果。(4)概要設(shè)計:確定系統(tǒng)設(shè)計方案,軟件的體系結(jié)構(gòu)。確定軟件由哪些模塊組成以及這些模塊之間的相互關(guān)系。(5)詳細設(shè)計:描述應(yīng)該如何具體地實現(xiàn)系統(tǒng)。詳細設(shè)計每個模塊,確定實現(xiàn)模塊所需要的算法和數(shù)據(jù)結(jié)構(gòu)。13(6)軟件實現(xiàn)階段:進行程序設(shè)計(編碼)和模塊測試。(7)綜合測試階段:通過各種類型的測試,查出軟件設(shè)計中的錯誤并改正,確保軟件質(zhì)量;還要在用戶的參與下進行驗收,才可交付使用。(8)軟件運行、維護:軟件運行期間,通過各種必要的維護使系統(tǒng)改正錯誤、或修改擴充功能使軟件適應(yīng)環(huán)境變化,以便延長軟件的使用壽命,提高軟件的效益。每次維護的要求及修改步驟都應(yīng)詳細準確地記錄下來,作為文檔保存。本課程雖然不是進行大型軟件項目的開發(fā),只是針對于較大型的綜合程序的開發(fā),開發(fā)過程也應(yīng)該遵循結(jié)構(gòu)化的瀑布模型的開發(fā)流程,遵循問題定義、程序分析、程序設(shè)計、編碼、測試和維護幾個階段,培養(yǎng)結(jié)構(gòu)化方法的能力。142.1問題定義問題定義階段是整個過程中占用時間最少的階段,在這個步驟中任務(wù)是明確要解決的問題是什么。在本課程中,要解決的問題可以由教師提供或由學(xué)生自行選題。在自行選題中,學(xué)生可以動動腦筋,尋找身邊有哪些事情可以用計算機解決,然后確定一個可行的題目,例如掃雷游戲、迷宮游戲等。有時可以對該題目進行一個簡要的說明。例如迷宮游戲的問題描述如下:心理學(xué)家把一只老鼠從一個無頂蓋的大盒子的入口處趕進迷宮。迷宮中設(shè)置很多墻壁,對前進方向形成了多處障礙,心理學(xué)家在迷宮的唯一出口放置了一塊奶酪,吸引老鼠在迷宮中尋找通路以到達出口。用計算機求解迷宮中的一條路徑。152.2程序分析這個階段的任務(wù)仍然不是具體地解決問題,而是理解問題和分析問題,主要是確定目標系統(tǒng)必須具備哪些功能,以及目標系統(tǒng)可能的輸入和輸出數(shù)據(jù)是什么。我們在問題定義階段得到的問題,有時僅僅是一個抽象的題目,有時除了題目外還附一段簡要的說明。無論問題以何種形式出現(xiàn),都需要做進一步的分析,以獲得系統(tǒng)必須實現(xiàn)哪些功能。16例如對于迷宮游戲,可以分析系統(tǒng)需要以下幾個功能:1.迷宮的設(shè)置,為了系統(tǒng)的適用性,迷宮不能固定,應(yīng)該可以變化。2.迷宮路徑的尋找,該功能可以擴展,尋找一條路徑、全部路徑、最短路徑。3.迷宮路徑的輸出。到這里,程序分析的工作結(jié)束,接下來進入下一個階段:程序設(shè)計。172.3程序設(shè)計經(jīng)過程序分析階段的工作,程序必須“做什么”已經(jīng)清楚了,現(xiàn)在是決定“怎么做”的時候了。程序這個階段的設(shè)計工作,應(yīng)該對要解決的問題設(shè)計出具體的解決方案,得出對目標系統(tǒng)的精確描述,從而在編碼階段可以把這個描述直接翻譯成用C語言書寫的程序。程序設(shè)計將采用結(jié)構(gòu)化程序設(shè)計方法,自頂向下逐步求精地設(shè)計出程序的實現(xiàn)“藍圖”。下面,首先介紹結(jié)構(gòu)化程序設(shè)計方法,然后列舉描述算法的常用工具,接著以迷宮游戲為例,詳細說明設(shè)計階段的工作和結(jié)構(gòu)化程序設(shè)計方法的應(yīng)用。182.3.1結(jié)構(gòu)化程序設(shè)計方法結(jié)構(gòu)程序設(shè)計的概念最早是由E.W.Dijkstra提出來的,是為了解決程序可讀性差的問題,創(chuàng)立一種新的程序設(shè)計思想、方法和風(fēng)格,以顯著提高軟件生產(chǎn)率和質(zhì)量。在軟件發(fā)展的早期,即20世紀60年代末到70年代初,雖然科技在高速發(fā)展,程序規(guī)模越來越大,但是當(dāng)時的編程技術(shù)卻停留在手工作業(yè)的方式:設(shè)計各自為政、濫用GOTO語句造成程序效率低下、可讀性差、無章可循、錯誤百出、調(diào)試困難。在這種局面下,Dijkstra提出結(jié)構(gòu)化程序設(shè)計的理論。經(jīng)過多年的實踐,結(jié)構(gòu)化程序設(shè)計的理論和實踐日益完善,成為現(xiàn)代程序設(shè)計的主流方法之一。19那么什么是結(jié)構(gòu)化程序設(shè)計呢?結(jié)構(gòu)化程序設(shè)計是一種設(shè)計程序的技術(shù),采用自頂向下逐步求精的設(shè)計方法和單入口單出口的順序、選擇和循環(huán)三種基本控制結(jié)構(gòu)。它提出的原則可歸納為32字:“自頂向下,逐步細化;清晰第一,效率第二;書寫規(guī)范,縮進格式;基本結(jié)構(gòu),組合而成。”自頂向下,逐步求精方法符合人們解決復(fù)雜問題的普遍規(guī)律,可提高軟件開發(fā)的成功率和生產(chǎn)率,這種方法采用先全局后局部、先整體后細節(jié)、先抽象后具體的逐步求精過程,開發(fā)出來的程序具有清晰的層次結(jié)構(gòu),因此程序容易閱讀和理解。20例如設(shè)計房屋就采用了這種方法,先進行整體規(guī)劃,然后確定建筑物的方案,在進行各部分的設(shè)計,最后進行門窗、樓道等的細節(jié)設(shè)計。例:要求用篩選法求100以內(nèi)的素數(shù)(篩選法為:從2到100中去掉2,3,…,9,10的倍數(shù),剩下的就是100以內(nèi)的素數(shù))。21步驟一:建立2到100的數(shù)組A[],其中A[i]=i;_____1建立2到10的素數(shù)表B[],其中存放2到10以內(nèi)的素數(shù);____2A[i]=i是B[]中的任一數(shù)的倍數(shù),則剔除A[i];
___3輸出A[]中所沒有被剔除的數(shù);______422步驟二:前述框架中每一個加工語句都可進一步細化。/*建立2到100的數(shù)組A[],其中A[i]=i*/______1for(i=2;i<=100;i++)A[i]=i;/*建立2到10的素數(shù)表B[],其中存放2到10以內(nèi)的素數(shù)*/__2B[1]=2;B[2]=3;B[3]=5;B[4]=7;/*若A[i]=i是B[]中的任一數(shù)的倍數(shù),則剔除A[i]*/___3for(j=1;j<=4;j++)檢查A[]所有的數(shù)能否被B[j]整除,并將能被整除的數(shù)從A[]中剔除;___3.1/*輸出A[]中所有沒有被剔除的數(shù)*/_____4for(i=2;i<=100;i++)若A[i]沒有被剔除,則輸出之;____4.123步驟三:將3.1,4.1進一步細化形成程序。242.3.2常用設(shè)計工具自然語言在語法和語義上具有多義性,常常要依賴上下文才能把問題交代清楚,而且即使可以描述,也需要大量的篇幅,非常繁瑣。所以必須用簡潔的方法表達整體結(jié)構(gòu),約束性強的方式表達算法。設(shè)計工具可以對設(shè)計進行無歧義的描述,能指明控制流程、處理流程以及其他方面的實現(xiàn)細節(jié)。下面介紹三種常用的圖形方式的設(shè)計工具。25層次圖用來描述軟件的層次結(jié)構(gòu),圖中的一個矩形框代表一個模塊,方框之間的連線表示調(diào)用關(guān)系。層次圖很適合在自頂向下設(shè)計軟件的過程中使用。2627程序流程圖是歷史最悠久使用最廣泛的描述軟件設(shè)計的方法。它的主要優(yōu)點是對控制流程的描述很直觀,便于初學(xué)者掌握。但這種用箭頭代表控制流的方法,容易使程序員不受任何約束,可以完全不顧結(jié)構(gòu)化程序設(shè)計的精神,隨意轉(zhuǎn)移控制。另外,程序流程圖不易表示數(shù)據(jù)結(jié)構(gòu)。因此,程序流程圖不是逐步求精的工具。下圖是國家標準GB1526-1989程序流程圖中常用的符號,與通用不同之處,在于取消了箭頭。2829盒圖是一種很好的支持結(jié)構(gòu)化程序設(shè)計思想的圖形工具。盒圖上能明確表達功能域,不可能任意轉(zhuǎn)移控制,很容易確定局部和全局數(shù)據(jù)的作用域,很容易表現(xiàn)嵌套關(guān)系,而且也可以表示模塊的層次結(jié)構(gòu)。所以堅持使用盒圖作為設(shè)計工具,可以使程序員逐步養(yǎng)成用結(jié)構(gòu)化的方式思考問題和解決問題的習(xí)慣。30順序結(jié)構(gòu)塊1塊2塊3塊4條件TF塊1塊2選擇結(jié)構(gòu)CaseI=1,2,3T塊1塊2多分支選擇結(jié)構(gòu)F塊3塊當(dāng)條件成立時當(dāng)型循環(huán)塊直到條件成立時直到型循環(huán)31偽代碼圖形工具表示設(shè)計比較直觀,但畫起來比較費勁,所以描述設(shè)計還可以使用偽代碼這個常用的語言工具。偽代碼是一種“混合”語言,它使用一種語言——通常是某種自然語言的詞匯,同時卻使用某種結(jié)構(gòu)化程序設(shè)計的語法。這樣,它具有嚴格的關(guān)鍵字外部語法,而表示實際操作和條件的內(nèi)部語法又是靈活自由的,書寫方便,也比較好懂。“用篩選法求100以內(nèi)的素數(shù)”的算法描述就是偽代碼方式。322.3.3迷宮游戲的設(shè)計現(xiàn)階段的設(shè)計任務(wù)是自頂向下逐步求精,具體要完成以下幾點:繼續(xù)分析已有功能,直到精化出所有子功能,確定模塊之間的接口。描述精化后每個模塊的處理過程。確定主要的數(shù)據(jù)以及數(shù)據(jù)結(jié)構(gòu)。確定輸入輸出數(shù)據(jù)的內(nèi)外部形式。進行界面的設(shè)計。以下將展示迷宮游戲的設(shè)計。331)數(shù)據(jù)結(jié)構(gòu)的設(shè)計(1)迷宮的表示設(shè)迷宮為m行n列,利用二維數(shù)組maze[m][n]來表示一個迷宮,其中入口點為(1,1),出口為(m,n),maze[i][j]=0或1,其中0表示通路,1表示不通。當(dāng)從某點試探時,有8個方向可以試探,而四個角點有3個方向,其他邊緣點有5個方向,為使問題簡單化,在迷宮的四周加了一層,表示墻壁,這樣每個點的試探方向為8。#definem6/*迷宮行數(shù)*/#definen8/*迷宮列數(shù)*/typedefstruct{intx,y;}item;/*坐標*/intmze[m+2][n+2];/*迷宮*/34(2)試探方向的表示在上述表示迷宮的情況下,每個點有8個方向可以試探,設(shè)當(dāng)前點的坐標為(x,y),與其相鄰的8個點的坐標可根據(jù)與該點的相鄰方位得到。為了方便求出新點的坐標,將從正東開始沿順時針進行的這8個方向的坐標增量放在一個結(jié)構(gòu)數(shù)組move[8]中,其中x表示橫坐標增量,y表示縱坐標增量。typedefstruct{intx,y;}item;/*坐標*/itemmove[8]={{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1},{-1,0},{-1,1}};35(3)保存到達的每一點的位置及試探方向的數(shù)據(jù)結(jié)構(gòu)利用回溯法,從入口處出發(fā),按某一方向不斷試探,若能走通,則到達新點,否則試探另一未試探過的方向。若所有的方向均沒有通路,則沿原路返回前一點,換一個未試探過的通路繼續(xù)試探,直到找到出口,或所有的通路都試探過,未找到一條通路回到出口點。在試探過程中,為保證在到達某一點無路時,能正確返回前一點,需要用一個數(shù)據(jù)結(jié)構(gòu)(棧)來保存到達的每一點的位置及試探方向。當(dāng)?shù)竭_了某點無路可走,需從前一點的下一個方向試探。因此,壓入棧中的不僅是順序到達的各點的坐標,而且還有從前一點到達本點的方向序號。36#defineMAXSIZE20typedefstruct{intx,y,d;}datatype;typedefstruct{datatypedata[MAXSIZE];inttop;}SeqStack;372)功能求精在前面已經(jīng)分析出系統(tǒng)的目標和主要功能,但這僅僅是程序?qū)哟谓Y(jié)構(gòu)中最上層的部分,劃分的功能比較抽象,需要進一步的精化。下面用層次圖表示各部分的功能以及功能之間的調(diào)用關(guān)系。3839對每個功能還需要進一步說明完成的主要功能、輸入輸出以及內(nèi)部的數(shù)據(jù)結(jié)構(gòu)和算法。下面只針對主控模塊和找路徑模塊進行詳細說明。40主控模塊main():用來進行各個數(shù)據(jù)的初始化,并進行功能的選擇。主控模塊的流程圖如下:41ny開始設(shè)置迷宮找路徑輸出路徑繼續(xù)?關(guān)閉游戲結(jié)束42迷宮設(shè)置模塊intsetmaze(mazestruct*maze):用來設(shè)置迷宮以及出入口,其中出入口在迷宮中的值必須為1,否則重新設(shè)置。成功返回1,失敗返回0。Maze為設(shè)置的迷宮。(算法略)43找路徑intfindpath(mazestruct*maze,SeqStack*path):用來選擇路徑,找到返回1,否則返回0。找到的路徑存儲在path中。算法的設(shè)計如下:防止重復(fù)到達某點的考慮:為避免發(fā)生死循環(huán),當(dāng)?shù)竭_某點(i,j)后,使maze[i][j]置-1,以便區(qū)分未到達過的頂點。算法結(jié)束前可恢復(fù)原迷宮。算法描述44①棧初始化;②將入口點坐標及初始試探方向(設(shè)為-1)入棧,并將入口點設(shè)置為已走過;③設(shè)置未找到found=0;④while(未找到&&棧非空){*從棧頂元素位置出發(fā)尋找下一個可以走的方位;if(找到方位){修改棧頂元素的方位值;計算新點,并設(shè)置為已走過;將新點位置及初始試探方位值進棧;if(新點是結(jié)束點)結(jié)束;}else//沒找到可走的方位,說明從該點出發(fā)已無路可走出棧;}⑤if(找到)打印路徑;else打印”該迷宮無路徑”;45路徑輸出voidprintpath(SeqStack*path):將找到的路徑輸出。(算法略)463)界面設(shè)計軟件界面設(shè)計應(yīng)該以使用軟件的人為中心,盡量從使用軟件的角度出發(fā)設(shè)計界面。迷宮游戲的界面比較簡單,一開始顯示系統(tǒng)的功能、設(shè)計者、系統(tǒng)使用說明。然后詢問“是否開始游戲?”,回答“y”則開始。在進行迷宮設(shè)置的界面中要提供幫助說明。472.4編碼編碼就是用高等語言表示設(shè)計階段產(chǎn)生的算法。在編碼階段,可以使我們再次體會到使用結(jié)構(gòu)化程序設(shè)計技術(shù)的主要優(yōu)點:用先全局后局部、先整體后細節(jié)、先抽象后具體的逐步求精過程開發(fā)出的程序有清晰的層次結(jié)構(gòu),容易閱讀和理解;不使用GOTO語句僅使用單入口單出口的控制結(jié)構(gòu),使得程序的靜態(tài)結(jié)構(gòu)和它的動態(tài)執(zhí)行情況比較一致,容易保證程序開發(fā)時的正確性和易糾錯性;控制結(jié)構(gòu)有確定的邏輯模式,編寫程序代碼只限于使用很少的幾種直截了當(dāng)?shù)姆绞?,使程序容易測試;程序清晰和模塊化使得在修改和重新設(shè)計一個軟件時可以重用的代碼量最大等。48因此,結(jié)構(gòu)化程序設(shè)計技術(shù)能夠保證我們得到結(jié)構(gòu)化程序。這種程序便于編寫、閱讀、修改和維護,減少了程序出錯的機會,提高了程序的可靠性,保證了程序的質(zhì)量。下面講述在程序編碼時應(yīng)該注意的幾個問題:492.4.1全局變量全局變量的作用增加了函數(shù)間數(shù)據(jù)聯(lián)系的渠道。但是全局變量使函數(shù)的通用性降低了,因為函數(shù)在執(zhí)行時要依賴于其所在的全局變量。如果將一個函數(shù)移到另一個文件中,還要將有關(guān)的全局變量以及其值一起移過去。但若該全局變量與其它文件的全局變量同名時,就會出現(xiàn)問題,降低了程序的可靠性和通用性。在程序設(shè)計中,在劃分模塊時要求模塊的“內(nèi)聚性”強,與其他模塊的“耦合性”弱。即模塊的功能單一,與其他模塊的相互影響要盡量少,而用全局變量是不符合這個原則的。一般要求把c程序中的函數(shù)作成一個封閉體,除了可以通過“實參-形參”與外界發(fā)生聯(lián)系外,沒有其他渠道。這樣的程序移植性好,可讀性強。另外使用全局變量過多,會降低程序的清晰性,人們往往難以清楚地判斷出每個瞬間每個全局變量的值。在各個函數(shù)執(zhí)行時都可能改變?nèi)肿兞康闹?,程序容易出錯。對于大型程序,模塊多,常常由不同的人來完成不同的模塊,如果全局變量隨意使用,更容易出現(xiàn)問題,造成程序的混亂。因此,更應(yīng)該限制使用全局變量。502.4.2風(fēng)格結(jié)構(gòu)化程序的一大特征就是清晰可讀。風(fēng)格的作用主要就是使代碼容易讀,無論是對程序員本人,還是對其他人,代碼應(yīng)該是清晰的和簡單的,具有直截了當(dāng)?shù)倪壿嫛⒆匀坏谋磉_式、通用的語言使用方式、有意義的名字和有幫助作用的注釋等。一致性是非常重要的,如果大家都堅持同樣的風(fēng)格,代碼就容易讀懂。下面將對比一些小程序設(shè)計例子來說明與風(fēng)格有關(guān)的規(guī)則,其中用灰色標記的代碼段代表了不好風(fēng)格的代碼段。51(1)名字一個名字應(yīng)該是非形式的、簡練的、易記憶的,若可能的話,最好是能夠拼讀的。一個變量等作用域越大,它的名字所攜帶的信息就應(yīng)該越多。全局變量使用具有說明性的語言,局部變量使用短名字。全局變量可出現(xiàn)在整個程序的任何地方,因此其名字應(yīng)具有足夠的說明性,以便使讀者能夠記住它們是干什么的。給每個全局變量聲明附一個簡短的注釋也是非常有幫助的。按常規(guī)方式使用的局部變量可采用極短的名字,如用i、j作為循環(huán)變量,p、q作為指針,s、t表示字符串等?,F(xiàn)實中存在許多命名約定或者本地習(xí)慣。常見的如:指針采用以ptr結(jié)尾的變量名;全局變量用大寫開頭變量名;常量用完全由大寫拼寫的變量名等。命名約定能使代碼更易理解。52(2)表達式和語句同樣,我們也應(yīng)該以盡可能一目了然的形式寫好表達式和語句。53采用縮進程序結(jié)構(gòu),是使程序呈現(xiàn)出結(jié)構(gòu)清晰的最省力的方法。比較:for(n++;n<100;field[n++]=’\0’);*i=’\0’;return(‘\n’);或for(n++;n<100;field[n++]=’\0’);*i=’\0’;return(‘\n’);for(n++;n<100;n++)field[n]=’\0’;*i=’\0’;return(‘\n’);54使用表達式的自然形式。否定運算的條件表達式比較難理解,比較:if(!(block_id<actblks)||!(block_id>=unblocks))…if((block_id>=actblks)||(block_id<unblocks))…55分解復(fù)雜的表達式。C有很豐富的表達式語法結(jié)構(gòu)和很豐富的運算符,因此應(yīng)該避免將一大堆東西塞進一個結(jié)構(gòu)中。比較:*xp+=(x=2*k<(n-m)?c[k+1]:d[k--]));if(2*k<(n-m))x=c[k+1];elsex=d[k--];*xp+=x;56當(dāng)心副作用。像++這一類運算符具有副作用,它們除了返回一個值外,還將隱含地改變變量的值。這類表達式有時用起來很方便,但有時也會成為問題,因為變量的取值操作和更新操作可能不是同時發(fā)生。57(3)宏有些c程序員喜歡把很短的而執(zhí)行又頻繁的計算寫成宏,而不是定義為函數(shù)。人們這樣做最根本的理由就是執(zhí)行效率:宏可以避免函數(shù)調(diào)用的開銷。實際上,編譯程序發(fā)展到今天,宏的缺點遠遠超過它能帶來的好處,它帶來的麻煩比解決的問題更多。宏最常見的一個嚴重問題是:若一個參數(shù)在定義中出現(xiàn)多次,它就可能被多次求值。若調(diào)用時的實際參數(shù)帶有副作用,結(jié)果就會產(chǎn)生一個難以琢磨的錯誤。如下面宏的意圖是實現(xiàn)一種字符測試:58#defineisupper(c)((c)>=’A’&&(c)<=’Z’)但如果它在下面的上下文中使用:while(isupper(ch=getchar()))…那么,每當(dāng)遇到一個大于等于A的字符,程序就會丟掉它,而下一個字符將被讀入并去與Z做比較。因此,上面的實現(xiàn)是錯誤。59除了這個問題外,由于宏是通過文本替換方式實現(xiàn)的,如果忘記給宏的體和參數(shù)加上括號,將產(chǎn)生錯誤。如:#definesquare(x)(x)*(x)…1/square(x)正確的宏應(yīng)該是:#definesquare(x)((x)*(x))所以建議:除了定義符號常量外,最好避免使用宏。60(4)注釋注釋是幫助讀者閱讀程序的一種手段,它們澄清情況,不是添亂。注釋要注意:不要瑣談明顯的東西。注釋應(yīng)該提供那些不能一下子從代碼中看到的東西,或者把那些散布在許到代碼里的信息收集到一起,否則沒有價值。要給函數(shù)和全局變量加注釋。對于函數(shù)、全局變量、常數(shù)定義、結(jié)構(gòu)的成員等,以及任何其他加上簡短說明就能夠幫助理解的內(nèi)容,都應(yīng)該為之提供注釋。注釋不要與代碼矛盾。這往往是修改代碼后沒有及時對相關(guān)注釋進行更改造成的。但是如果注釋的長度超過代碼本身,可能就說明這個代碼應(yīng)該修改了。所以,不要注釋差的代碼,而要重寫它。我們應(yīng)該盡可能地把代碼寫得容易理解,在這方面做得越好,需要寫的注釋就越少。61以上從幾個方面談?wù)摿顺绦蛟O(shè)計風(fēng)格,這里最關(guān)鍵的結(jié)論是:好風(fēng)格應(yīng)該成為一種習(xí)慣。如果在開始寫代碼時就關(guān)心風(fēng)格問題,花時間去審視和改進它,就會逐漸養(yǎng)成一種好的編程習(xí)慣。一旦這種習(xí)慣變成自動的東西,潛意識就會起作用,寫出的代碼會更好。622.5測試與調(diào)試大量的資料統(tǒng)計表明,軟件開發(fā)組織將30%~40%的工作量花在測試上。而那些高可靠性、高安全性軟件的測試所花的時間更是其它開發(fā)步驟總和的3到5倍。測試的目的是以最小的代價(耗費最少時間和最少工作量)發(fā)現(xiàn)盡可能多的不同類型的錯誤。真正實施測試之前要制定測試方案,測試方案包括預(yù)定要測試的功能,應(yīng)該輸入的測試數(shù)據(jù)和預(yù)期的結(jié)果。測試和調(diào)試常常被說成是一個回事,實際上是測試階段的不同任務(wù)。調(diào)試即排錯,是在已經(jīng)知道程序有問題時要做的事情。測試則是在認為程序能工作的情況下,為發(fā)現(xiàn)問題而進行的一整套確定的系統(tǒng)化的實驗。632.6運行與維護程序的運行與維護是整個程序開發(fā)流程的最后一步。編寫程序的目的就是為了應(yīng)用,在程序運行的早期,用戶可能會發(fā)現(xiàn)在測試階段沒有發(fā)現(xiàn)的錯誤,需要修改。而隨著時間的推移,原有程序可能已滿足不了需要,這是就需要對程序進行修改甚至升級。因此,維護是一項長期而又重要的工作。64實驗報告格式65城市中介組織概述1.1相關(guān)概念理解1.2城市中介組織的特征1.3城市中介組織的性質(zhì)1.4城市中介組織的功能1.5城市中介組織的類型1.1相關(guān)概念理解
一、城市的含義城:防御功能市:貿(mào)易、交換功能城市:經(jīng)濟、政治、文化、信息、人才交流中心1.1相關(guān)概念理解
二、城市中介組織1.中介中:中間介:介質(zhì)①字典中:A.媒介:使雙方發(fā)生關(guān)系的人或事;B.居間的人或物:中間人,調(diào)解人。②哲學(xué)上:黑格爾曾用“中介”表示不同范疇的間接聯(lián)系和對立范疇之間的一種相互聯(lián)系。③經(jīng)濟上:說和買賣雙方成交的服務(wù)媒介。司馬遷《史記·貨殖列傳》中“駔儈”。許慎《說文解字》“駔,會也。謂合兩家之買賣,如今之度市也”“節(jié)駔儈”調(diào)節(jié)貨物價格高低的人。2.中介組織中介組織:發(fā)揮中介作用的組織群體。學(xué)者們的共識:政府和企業(yè)不是社會中介組織。中介組織是市場經(jīng)濟中政府功能分離出來的產(chǎn)物。是一切具有中介性,起著橋梁作用的民間自治性的社會組織。
中介組織是在市場經(jīng)濟條件下,通過不同的社會利益群體之間的協(xié)商,對話、談判、調(diào)整,取得相互之間活動的配合和協(xié)調(diào),以此來實現(xiàn)各個不同主體的銜接和聯(lián)系,使之成為一個和諧整體的非官方或半官方的社會經(jīng)濟組織。3.社會中介組織與城市中介組織社會中介組織:在政府、企事業(yè)單位和個人之間起橋梁和紐帶作用,為經(jīng)濟、社會活動提供服務(wù)的各種組織、機構(gòu)的總稱。特征:A.區(qū)別于政府和企業(yè)的功能載體,是經(jīng)濟、社會主體之間進行活動的橋梁。B.既不生產(chǎn)商品也不經(jīng)營商品只向社會提供服務(wù),一般以專業(yè)技術(shù)為基礎(chǔ)的較高層次的服務(wù)。城市中介組織:以城市為單位和基礎(chǔ)的,在城市范圍內(nèi)產(chǎn)生并存在的社會中介組織。即在城市中按一定的法律、法規(guī)、規(guī)章或根據(jù)政府委托,遵循獨立、公平和公正原則,憑借其特有的社會服務(wù)、溝通、公證鑒定和監(jiān)督管理等功能,溝通各個系統(tǒng)之間的利益關(guān)系,為各城市利益相關(guān)人提供各種服務(wù)的社會自律性組織、機構(gòu)的總稱。
特點:①非營利性②半公半私性③合法性④服務(wù)性三、城市中介組織與政府、企業(yè)的區(qū)別(一)城市中介組織與政府的區(qū)別①可替代性②不具有抽象行政行為③有償性④后果承擔(dān)方式不同(二)城市中介組織與企業(yè)的區(qū)別城市中介組織更關(guān)注相關(guān)群體的利益,企業(yè)更關(guān)注自己的利益,具有明顯的商業(yè)性色彩。1.1.3城市中介組織從業(yè)人員應(yīng)具備的素質(zhì)1)具有寬廣的知識(科學(xué),經(jīng)濟,市場,法律)2)具有協(xié)調(diào)各方利益的能力3)具有解決問題的綜合本領(lǐng)1.2城市中介組織的特征1)機構(gòu)專業(yè)化(國家資質(zhì)認定持證上崗專家?guī)欤?)體制獨立化(脫離政府部門自主經(jīng)營自負盈虧)3)功能社會化(面向全社會開放,形成全方位、多層次、寬領(lǐng)域的服務(wù)格局)1.2城市中介組織的特征4)服務(wù)產(chǎn)業(yè)化(建立行業(yè)體系框架、行業(yè)自律機制、組織管理體制)5)組織網(wǎng)絡(luò)化(避免重復(fù)投資建設(shè)、實現(xiàn)信息資源的共享)6)市場國際化(尋找國際知名中介組織合作,提升競爭能力)1.3城市中介組織的性質(zhì)1)獨立性(不是國家附屬機構(gòu)而是帶有民間性的社會經(jīng)濟組織)2)自治性(內(nèi)部運作完全自主自負盈虧政府無權(quán)干涉)3)自律性(自我控制自我管理)1.3城市中介組織的性質(zhì)4)媒介性(政府與企業(yè)、政府與社會之間的橋梁和紐帶)5)服務(wù)性(協(xié)調(diào)各經(jīng)濟主體之間的利益沖突優(yōu)化資源結(jié)構(gòu))6)多元參與性(發(fā)掘和運用分散的社會資源,主動自覺參與社會事務(wù))1.4城市中介組織的功能1)凝聚功能(源泉:代表和維護城市群體的利益)2)參與功能(反映城市基層群眾的呼聲,參與城市的民主管理和民主監(jiān)督,進行參政議政,推進民主政治進程)3)溝通功能(“政府-中介組織-企業(yè)”三元權(quán)力機構(gòu)格局對下傳達政府的意圖,對上反映企業(yè)的呼聲)1.4城市中介組織的功能4)監(jiān)督功能(承載監(jiān)督和管理等純執(zhí)行性的職能)5)公正鑒定功能(審計報告,驗資報告)6)服務(wù)功能(信息服務(wù)、咨詢服務(wù)、培訓(xùn)服務(wù))7)社會穩(wěn)定功能(協(xié)調(diào)社會利益)1.5城市中介組織的類型一、按職能分類二、按機構(gòu)屬性分類三、按運營目的分類1.5城市中介組織的類型一、按職能分類1)驗證公證中介機構(gòu)職能:依法為市場主體進入市場和公平交易提供資信證明、公證。如:會計師事務(wù)所、律師事務(wù)所、公證處、計量、質(zhì)量檢驗和認證機構(gòu)等。1.5城市中介組織的類型2)評估、評級中介機構(gòu)職能:依法獨立,公正地評估(重估、估算)市場主體的資信狀況以及市場主體所有或占有資產(chǎn)的價值,為市場交易提供計價依據(jù)。如:資產(chǎn)評估事務(wù)所、土地評估事務(wù)所、房產(chǎn)評估事務(wù)所、無形資產(chǎn)評估事務(wù)所、資信評估事務(wù)所等。1.5城市中介組織的類型3)交易中介機構(gòu)職能:通過為交易雙方提供必要的服務(wù)、傳播價格信息、規(guī)范和監(jiān)督交易行為,保證交易順利進行。如:證券交易所、期貨交易所、產(chǎn)權(quán)交易所、拍賣行等。1.5城市中介組織的類型4)代理中介機構(gòu)職能:一方面可以減輕市場主體的繁雜事務(wù),在一定程度上使市場主體避免責(zé)任風(fēng)險;另一方面也可以減輕政府機關(guān)直接處理具體事務(wù)的壓力,緩解企業(yè)與政府部門之間的矛盾。如:稅務(wù)、專利、商標、版權(quán)代理事務(wù)所,代理記賬事務(wù)所,破產(chǎn)與清算事務(wù)所等。1.5城市中介組織的類型5)經(jīng)紀中介機構(gòu)以收取傭金為目的,為促成其他人交易而從
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024學(xué)年深圳市高三語文(上)12月二診考試卷附答案解析
- 2023-2024學(xué)年滬教版(上海)七年級數(shù)學(xué)上冊 期末復(fù)習(xí)題
- 《設(shè)施要求》課件
- 酒店員工辭職報告范文
- 2025年萍鄉(xiāng)貨運資格證考試答案
- 語文課題研究報告范文
- 內(nèi)飾設(shè)計報告范文
- 監(jiān)理資質(zhì)升級報告范文
- 應(yīng)急管理思路
- 《酒店營銷培訓(xùn)》課件
- 人行道開挖施工方案
- 小學(xué)奧數(shù)-幾何模型分類總結(jié)(鳥頭、燕尾、風(fēng)箏、一般模型等)
- 2024-2030年中國黃酒行業(yè)供需分析及發(fā)展前景研究報告
- 鐵路交通安全主題班會課件
- 做賬實操-冷庫企業(yè)的賬務(wù)處理實例
- 氣候可行性論證技術(shù)規(guī)范第4部分:城市軌道交通工程
- 體育聽課記錄文本
- 2024年專技人員公需科目考試答
- 書店合作加盟合同協(xié)議書
- 2024年秋九年級歷史上冊 第15課 探尋新航路教案2 新人教版
- 2023八年級歷史上冊 第五單元 從國共合作到國共對立 第15課 國共合作與北伐戰(zhàn)爭說課稿 新人教版
評論
0/150
提交評論