![基于案例的軟件構(gòu)造教程(第2版) 課件 04數(shù)據(jù)處理的軟件構(gòu)造_第1頁](http://file4.renrendoc.com/view12/M0A/00/1E/wKhkGWcrQVOAPgc-AAIwUaIOqcw120.jpg)
![基于案例的軟件構(gòu)造教程(第2版) 課件 04數(shù)據(jù)處理的軟件構(gòu)造_第2頁](http://file4.renrendoc.com/view12/M0A/00/1E/wKhkGWcrQVOAPgc-AAIwUaIOqcw1202.jpg)
![基于案例的軟件構(gòu)造教程(第2版) 課件 04數(shù)據(jù)處理的軟件構(gòu)造_第3頁](http://file4.renrendoc.com/view12/M0A/00/1E/wKhkGWcrQVOAPgc-AAIwUaIOqcw1203.jpg)
![基于案例的軟件構(gòu)造教程(第2版) 課件 04數(shù)據(jù)處理的軟件構(gòu)造_第4頁](http://file4.renrendoc.com/view12/M0A/00/1E/wKhkGWcrQVOAPgc-AAIwUaIOqcw1204.jpg)
![基于案例的軟件構(gòu)造教程(第2版) 課件 04數(shù)據(jù)處理的軟件構(gòu)造_第5頁](http://file4.renrendoc.com/view12/M0A/00/1E/wKhkGWcrQVOAPgc-AAIwUaIOqcw1205.jpg)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第4章
數(shù)據(jù)處理的軟件構(gòu)造第4章數(shù)據(jù)處理的軟件構(gòu)造本章討論案例中數(shù)據(jù)處理的問題:按需選擇、使用數(shù)據(jù)及數(shù)據(jù)持久性。重點是如何把算式和習(xí)題從程序變量的值轉(zhuǎn)化為可共享的、持久性的文件數(shù)據(jù),學(xué)習(xí)文件的產(chǎn)生、存儲和讀取操作,學(xué)習(xí)一個特殊的文本文件格式CSV。編程方面,學(xué)習(xí)表驅(qū)動編程模式和防御性編程。測試方面,學(xué)習(xí)白盒測試的基本技術(shù),繼續(xù)學(xué)習(xí)JUnit的其他測試方法。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院2第4章數(shù)據(jù)處理的軟件構(gòu)造故事5軟件是一個包含程序、數(shù)據(jù)和用戶的計算機系統(tǒng)。一個軟件可以提供若干功能或模塊,不同用戶可以使用其中的模塊——若干函數(shù)、類或方法。一個用戶可以利用其他用戶使用軟件產(chǎn)生的結(jié)果(如算式、習(xí)題),繼續(xù)使用軟件完成其他任務(wù)(如批改練習(xí))。不同用戶應(yīng)該可以在不同的時間產(chǎn)生和使用結(jié)果(數(shù)據(jù))。其中的一個條件是能夠持久地存儲結(jié)果,其生命期要超過程序運行的時間,即存儲一次程序運行的結(jié)果,在程序退出、再次啟動后,程序的其他模塊能獲取并使用存儲的結(jié)果。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院3第4章數(shù)據(jù)處理的軟件構(gòu)造實現(xiàn)數(shù)據(jù)持久性最基本的途徑是文件和數(shù)據(jù)庫。本章討論使用文件實現(xiàn)圖4.1。首先,討論案例有哪些量大的數(shù)據(jù)需要存儲。其次,簡單解釋文件及Java輸入/輸出流。接著,引入實現(xiàn)持久性的編程問題及技術(shù)方法。最后,給出案例的分析與實現(xiàn)。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院4第4章數(shù)據(jù)處理的軟件構(gòu)造4.1數(shù)據(jù)及其持久性4.2文件與輸入/輸出流4.3編寫健壯的程序4.4字符串處理與正則表達(dá)式4.5程序中數(shù)據(jù)集的使用4.6基于程序結(jié)構(gòu)的測試4.7運用Junit4.8案例分析與實踐4.9討論與提高4.10思考與練習(xí)題2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院54.1數(shù)據(jù)及其持久性保存在程序之外(如文件、網(wǎng)絡(luò))的數(shù)據(jù)稱為持久數(shù)據(jù)。文件處理是編程語言支持應(yīng)用程序存儲和處理大量持久數(shù)據(jù)的一個最重要能力。Java等編程語言通常都提供了文件處理和輸入/輸出流的功能。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院64.1數(shù)據(jù)及其持久性字符由比特組成。一組字符或字節(jié)組成字段。一個字段是傳遞含義的一組字符或字節(jié)。若干字段構(gòu)成記錄。記錄是一組有關(guān)系的字段。一個文件可以是一組相關(guān)的記錄。組織文件中的記錄有多種不同的方式。最常見的方式是順序文件。一組相關(guān)的文件可以組成數(shù)據(jù)庫。專門用于創(chuàng)建、處理和管理數(shù)據(jù)庫的一組程序稱為數(shù)據(jù)庫管理系統(tǒng)(DBMS)。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院74.1數(shù)據(jù)及其持久性一個應(yīng)用程序如何選擇數(shù)據(jù)的存儲、管理和處理方式,要考慮下面的因素。數(shù)據(jù)的持久性和使用頻次生產(chǎn)和訪問數(shù)據(jù)的難易程度共享與傳輸數(shù)據(jù)的量及管理數(shù)據(jù)的操作方式2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院84.2文件與輸入/輸出流4.2.1文件4.2.2輸入/輸出流4.2.3數(shù)據(jù)序列化4.2.4CSV格式的文本文件2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院94.2.1文件案例的持久性問題,本質(zhì)上是程序之間的一種交互,即一個程序或模塊產(chǎn)生數(shù)據(jù),另一個程序或模塊讀取并使用這些數(shù)據(jù)。程序之間可以通過文件實現(xiàn)輸入/輸出。在操作系統(tǒng)中,文件是組織和管理數(shù)據(jù)的基本單位,也是對物理輸入/輸出設(shè)備的抽象,使用者不必關(guān)心文件及其內(nèi)容的存取方式、存儲位置、結(jié)束標(biāo)志等。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院104.2.1文件1.字符文件與字節(jié)文件在字符文件中,字節(jié)表示字符,使得人們可以查看、編輯文件。在字節(jié)文件中,字節(jié)不一定表示字符;字節(jié)組還可以表示其他類型的數(shù)據(jù),如整數(shù)、浮點數(shù)或漢字字符。文件都是以二進(jìn)制格式存儲的。字節(jié)文本的存儲無須任何編碼,而使用文本文件時要考慮字符編碼。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院114.2.1文件2.記錄文件和流式文件文件分為物理文件和邏輯文件。邏輯文件從結(jié)構(gòu)上分兩種:無結(jié)構(gòu)的流式文件,信息不劃分單位,由一串字符流構(gòu)成文件;有結(jié)構(gòu)的記錄文件,信息按邏輯上獨立的含義劃分信息單位,稱為一個邏輯記錄(簡稱記錄)。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院124.2.2輸入/輸出流程序借助一個連接內(nèi)存中的程序和外存設(shè)備的通道來操作存儲器中的數(shù)據(jù)。流表示任意輸入的源或輸出的目的地。流即傳輸數(shù)據(jù)的管道,讓外部輸入設(shè)備或存儲器上的數(shù)據(jù)流入內(nèi)存,讓程序中的數(shù)據(jù)流出。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院134.2.2輸入/輸出流在程序中,可以把文件理解成物理概念,流是邏輯概念。程序的輸入/輸出操作是針對抽象的流來定義的,前提是把該文件與一個(對象)流聯(lián)系起來。高級語言如C、C++、C#、Java等保留了操作系統(tǒng)中的文件,同時引入了流,執(zhí)行對文件的讀/寫操作。Java等語言沒有定義文件結(jié)構(gòu),即記錄,所以,程序員必須設(shè)計文件結(jié)構(gòu)來滿足應(yīng)用的需求。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院144.2.3數(shù)據(jù)序列化1.編寫數(shù)據(jù)序列化代碼“線性化”函數(shù)將結(jié)構(gòu)化數(shù)據(jù)轉(zhuǎn)換為字符串類型的數(shù)據(jù)。當(dāng)程序需要結(jié)構(gòu)化數(shù)據(jù)時,再通過“結(jié)構(gòu)化”函數(shù),把線性化的數(shù)據(jù)按照原先的數(shù)據(jù)結(jié)構(gòu)恢復(fù)成結(jié)構(gòu)化數(shù)據(jù)。如何讀/寫對象:要把對象轉(zhuǎn)換成字符串,在Java中類似toString。首先要把具有結(jié)構(gòu)的數(shù)據(jù)元素分解,轉(zhuǎn)換成字符串,然后用特殊分隔符隔離。每個數(shù)據(jù)對象還要再以分隔符隔離。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院154.2.3數(shù)據(jù)序列化【例4.1】學(xué)生有姓名、性別、學(xué)號、身高、體重、生日、學(xué)院、手機等信息。首先,轉(zhuǎn)換成字符串。姓名可以拼音或中文(如果是外國人的姓名,姓氏和名字之間加一個空格作為分隔符),生日中的年月日作為一個數(shù)據(jù)元素,也可以分成三個數(shù)據(jù)元素年、月、日,中間也需隔離,比如用下畫線1995_02_25,或者斜線1995/02/25,其他的可以當(dāng)作一個整體,這8個數(shù)據(jù)元素之間用“?”分隔;每個學(xué)生數(shù)據(jù)占一行,或者用逗號、分號等不同于數(shù)據(jù)內(nèi)部的分隔符。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院164.2.3數(shù)據(jù)序列化從文件中讀入學(xué)生數(shù)據(jù)時,根據(jù)換行符或其他分隔符讀入一個學(xué)生的數(shù)據(jù),然后再析取每個學(xué)生的數(shù)據(jù)元素,轉(zhuǎn)換成基本的數(shù)據(jù)類型。對于C語言,可能要轉(zhuǎn)換成結(jié)構(gòu)體struct。對于面向?qū)ο笳Z言,需要用這些數(shù)據(jù)構(gòu)造成一個對象,因而需要類提供所有成員變量的構(gòu)造方法。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院174.2.3數(shù)據(jù)序列化2.對象序列化Java、C#等面向?qū)ο笳Z言都有實現(xiàn)對象序列化的類或接口(類似Serializable),把對象數(shù)據(jù)轉(zhuǎn)換成(二進(jìn)制)字節(jié)序列的形式,與外部源共享或傳輸數(shù)據(jù)。程序員不必準(zhǔn)確知道系統(tǒng)是如何表示對象的字節(jié)序列的。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院184.2.3數(shù)據(jù)序列化序列化(Serialization)是將對象的狀態(tài)信息(成員變量)轉(zhuǎn)換為可以存儲或傳輸?shù)男问降倪^程。它的逆過程則被稱為反序列化(Deserialization)。在序列化期間,對象將其當(dāng)前狀態(tài)寫入到臨時或持久存儲區(qū)。可以通過從存儲區(qū)中讀取或反序列化對象的狀態(tài),重新創(chuàng)建該對象。序列化的對象是對象的字節(jié)序列,包含對象數(shù)據(jù)及其類型信息。這樣,信息可以用來再創(chuàng)建內(nèi)存中的對象。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院194.2.4CSV格式的文本文件逗號分隔值(Comma-SeparatedValues,CSV)以純文本形式存儲數(shù)字和文本數(shù)據(jù)。CSV文件由任意數(shù)目的記錄組成,記錄之間以某種換行符分隔;每條記錄由字段組成,字段間的分隔符是其他字符或字符串,最常見的是逗號或制表符。通常,所有記錄都有完全相同的字段序列。CSV是一種通用的、相對簡單的文本文件格式,在電子表單和數(shù)據(jù)庫中有著廣泛的應(yīng)用。一些程序設(shè)計語言如R、Go和Python都內(nèi)置了讀/寫CSV格式文件的函數(shù)或類。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院204.2.4CSV格式的文本文件CSV沒有單一的、明確定義的格式。在實踐中,CSV泛指具有以下特征的任何文本文件:純文本,使用某個字符集,如ASCII、Unicode、EBCDIC或GB2312;由記錄組成(典型的是每行一條記錄);每條記錄被分隔符分隔為字段(典型分隔符有逗號、分號或制表符;有時分隔符可以包括可選的空格);每條記錄都有同樣的字段序列。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院214.3編寫健壯的程序健壯性(robutness)是指程序?qū)τ谝笾獾妮斎脒M(jìn)行判斷并處理、使程序保持運行狀態(tài),即使這有時可能導(dǎo)致不準(zhǔn)確的結(jié)果。程序的正確性指的是程序絕不產(chǎn)生不準(zhǔn)確的結(jié)果。有時更希望程序健壯,4.3.1防御性編程4.3.2使用斷言2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院224.3.1防御性編程防御編程的基本思想是:程序員要預(yù)計其他程序員的過錯、無效的輸入、甚至有害的數(shù)據(jù)及使用者的過失,即使這種事情罕見,也要采取適當(dāng)措施保護(hù)自己的程序。保護(hù)程序無效輸入破壞的基本原則:檢查每個輸入?yún)?shù)的數(shù)據(jù);特別要檢查從程序外部進(jìn)入程序的數(shù)據(jù)。一旦發(fā)現(xiàn)了無效數(shù)據(jù),就要決定處理的方式?;镜姆绞接刑幚礤e誤和使用異常。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院234.3.1防御性編程1.處理錯誤錯誤處理的方式影響軟件滿足正確性、健壯性及其他非功能性需求的能力。數(shù)據(jù)錯誤出現(xiàn)時的一些建議(1)繼續(xù)運行程序、返回中性無害的數(shù)據(jù)。(2)用最接近的有效數(shù)據(jù)替換無效數(shù)據(jù)。(3)在日志中記錄警告信息并繼續(xù)運行程序。(4)調(diào)用錯誤處理程序或?qū)ο蟆#?)屏幕顯示錯誤信息。(6)盡可能在局部處理錯誤。(7)返回一個錯誤編碼,讓特定程序處理這個錯誤。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院244.3.1防御性編程2.使用異常異常是處理錯誤的一種特殊方式,出現(xiàn)了錯誤或異常行為的程序能把錯誤傳遞給程序的調(diào)用者,讓它處理。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院254.3.1防御性編程異常處理一般有兩種模型:終止模式和恢復(fù)模式。終止模式假設(shè)錯誤非常關(guān)鍵,導(dǎo)致程序無法返回到異常發(fā)生的地方繼續(xù)執(zhí)行。一旦拋出異常,就表明錯誤已無法挽回,也不能回來繼續(xù)執(zhí)行?;謴?fù)模式認(rèn)為異常處理程序的工作是修正錯誤,重新嘗試調(diào)用出問題的方法,并認(rèn)為二次處理能成功?;謴?fù)模式希望處理異常后程序能繼續(xù)執(zhí)行。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院264.3.1防御性編程3.應(yīng)用舉例定義方法私有的,確保只有開發(fā)者知道,僅僅在參數(shù)合法的情況下才使用該操作。使用語言系統(tǒng)提供的異常類和異常處理機制,檢查參數(shù)的合法性。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院274.3.2使用斷言斷言是讓程序在運行過程中自我檢查的代碼。如果斷言為真,就意味著程序如期望的正常;否則,就表示在代碼中發(fā)現(xiàn)了意外。如,在100以內(nèi)的算式產(chǎn)生函數(shù)中可以插入一個斷言(以Python語言為例):2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院284.3.2使用斷言編寫代碼時,我們總是會做出一些假設(shè)。斷言用于在代碼中捕捉這些假設(shè),可以將斷言視為異常處理的一種高級形式??梢允褂脭嘌栽诖a中記錄一些假設(shè),例如:輸入?yún)?shù)的值在預(yù)期范圍內(nèi);程序運行時文件流已打開或者在開始的地方;指針非空;輸入?yún)?shù)的數(shù)組、表或其他容器已經(jīng)包含了數(shù)據(jù);2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院294.3.2使用斷言斷言的現(xiàn)行形式是一些布爾表達(dá)式,程序員相信在程序中的某個特定點該表達(dá)式值為真。斷言分為如下三類。前置斷言:代碼執(zhí)行之前必須具備的特性。后置斷言:代碼執(zhí)行之后必須具備的特性。不變斷言:代碼執(zhí)行前后不能變化的特性。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院304.3.2使用斷言斷言的基本用途是調(diào)試和測試程序,編譯器啟動斷言檢查后才能使用斷言。程序布署完之后就關(guān)閉斷言。下面是使用斷言的一些建議。對預(yù)計出現(xiàn)的條件使用錯誤處理,對不應(yīng)當(dāng)出現(xiàn)的條件使用斷言。錯誤處理用于檢查不合理的輸入數(shù)據(jù);斷言則用于檢查代碼中的錯誤。避免在斷言中放置可執(zhí)行的代碼。因為關(guān)閉斷言后,編譯器可能會刪除這些代碼。用斷言來記錄和驗證前置條件和后置條件。健壯性要求高的程序使用斷言和錯誤處理。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院314.4字符串處理與正則表達(dá)式在操作文本文件時,數(shù)據(jù)都是字符串?;绢愋停ㄈ?2.5)或結(jié)構(gòu)化的數(shù)據(jù)(如32+5),存儲在文本文件中都是字符串“32.5”和“32+5”。編程語言都有基本類型數(shù)據(jù)轉(zhuǎn)換為字符串的內(nèi)置機制。自定義的數(shù)據(jù)類型或?qū)ο?,則需要用戶自己編寫轉(zhuǎn)換程序。如,C#、Java等需要為自定義的類編寫對象的字符串顯示方法toString(),覆蓋從根類繼承的默認(rèn)顯示。字符串作為基本的內(nèi)置類型,編程語言也提供了大量的字符串操作,如查找一個字符、查找一個字串、置換一個字串、合并兩個字串、字符串復(fù)制等??梢允褂镁幊陶Z言提供的基本的字符串操作完成數(shù)據(jù)的構(gòu)造。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院324.4字符串處理與正則表達(dá)式以CSV格式的練習(xí)題文件為例。(1)先把一行字符串讀到數(shù)組,equationLine;(2)把equationLine中以逗號和換行分隔的算式符號串識別出來,存入String[]stringEquations;(3)識別出“51+11”三個組成,把數(shù)字轉(zhuǎn)成整型,存入left和right,運算符存入字符operator;(4)算式構(gòu)造函數(shù)EquationconstructEquation(intleft,intright,charoperator)。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院334.4字符串處理與正則表達(dá)式程序?qū)λ闶降奈谋靖袷揭髧?yán)格:字符串不能含任何多余的字符,包括空格。如“51+11,□□19+45,92□+8,80+19,73+10□”有任何多余的空格□,程序?qū)⑦\行錯誤。否則,程序員要仔細(xì)編寫煩瑣的程序,進(jìn)行預(yù)處理,使字符串滿足要求?,F(xiàn)代編程語言提供了更豐富的字符串處理庫,其中重要而又易用的是正則表達(dá)式。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院344.4字符串處理與正則表達(dá)式用正則表達(dá)式及String相關(guān)函數(shù),處理數(shù)據(jù)如“51+11,[19+□□A45,□92+8,?80+19,73+10;□”。符號串"[\\s\\D\\p{Punct}&&[^\\,+?]]+"就是正則表達(dá)式,把輸入字符串中除數(shù)字、‘+’、‘?’和‘,’之外的字符全部刪除。字符串函數(shù)split(),按正則表達(dá)式"\\,"的模式以逗號為分隔符,把輸入的符號串分成一組符號串。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院354.4字符串處理與正則表達(dá)式正則表達(dá)式正則表達(dá)式(RegularExpressions)是一串字符,它所定義的模式可用來查找、顯示或修改輸入序列中出現(xiàn)的某個模式的一部分或全部。Java在String類中提供了booleanmatches(Stringregxep)、voidreplaceAll(Stringregxep,Stringreplacement)和String[]split(Stringregxep)三種基本方法,它們的作用分別是匹配、替換全部匹配內(nèi)容、分割。參數(shù)都包含了正則表達(dá)式regxep。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院364.4字符串處理與正則表達(dá)式【例4.2】標(biāo)識符的正則表達(dá)式:[A-Za-z][A-Za-z0-9]*,方括號[]表示選取其中任何一個符號,星號表示符號出現(xiàn)0次或多次。如果標(biāo)識符允許含下畫線,但不能以下畫線結(jié)束。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院374.4字符串處理與正則表達(dá)式【例4.3】打開文本文件,統(tǒng)計包含了字符串str的單詞數(shù),不區(qū)分str的大小寫。詞法分析器Scanner可用正則表達(dá)式分隔字符串,語句sc.useDelimiter("[^\\w]+")將可用于標(biāo)識符的字符串從輸入串中分離。然后,在語句if(reg.matches("\\w*[sS][tT][rR]\\w*"))中比較輸入串是否匹配正則表達(dá)式"\\w*[sS][tT][rR]\\w*"。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院384.5程序中數(shù)據(jù)集的使用4.5.1算式基4.5.2表驅(qū)動編程2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院394.5.1算式基截至目前,案例的算式及習(xí)題都是在使用時由程序隨機產(chǎn)生,即數(shù)據(jù)是按需生成和使用的。而且,產(chǎn)生的算式、習(xí)題數(shù)據(jù)都以程序變量的值出現(xiàn)在計算機的內(nèi)存中,一旦程序結(jié)束,數(shù)據(jù)立即丟失。數(shù)據(jù)的這種處理方式有局限性。(1)效率。(2)復(fù)用。(3)共享。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院404.5.1算式基案例問題中,隨機產(chǎn)生一個算式,兩個運算數(shù)及其和或差的范圍是[0..100],算式個數(shù)有限,可以生成全部有效算式,存儲起來,使用時隨機取出一定數(shù)量(如50)的算式組成一套習(xí)題。進(jìn)而還可以把多套習(xí)題持久地存儲起來供以后使用。那么,一共有多少個滿足條件的加減法算式?兩運算數(shù)的取值范圍是[0..100],加減法的算式最多101×101=10201個??紤]和、差的約束,這兩個算式的總數(shù)更小。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院414.5.1算式基用行表示加數(shù),列表示被加數(shù),下面斜三角形即所有滿足條件、有效的加法算式:用二維數(shù)組AdditionBase[101,101]作為加法算式基,存放所有滿足約束條件的加法算式,函數(shù)generateAdditionBase()生產(chǎn)加法算式基。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院424.5.1算式基類似地,所有滿足條件的減法算式構(gòu)成如下的斜三角形:函數(shù)generateSubstractBase()產(chǎn)生一個二維數(shù)組SubstractBase[101,101]作為減法算式基,存放滿足所有約束條件的減法算式。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院434.5.1算式基二維數(shù)組的算式基存放的是有效算式的運算結(jié)果,對無效算式則為空或?1。算式基具有如下特性。(1)算式及其約束條件隱含在二維數(shù)組中:只要元素AdditionBase[i,j]或SubstractBase[i,j]不是空或?1,就表示i+j或i?j是有效算式,而且AdditionBase[i,j]存放的是算式i+j的計算結(jié)果,SubstractBase[i,j]是算式i?j的計算結(jié)果。(2)兩個算式不一樣,當(dāng)且僅當(dāng)算式基的兩個數(shù)組元素對應(yīng)的行或列的下標(biāo)不等。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院444.5.1算式基算式的產(chǎn)生簡化成隨機地生成兩個整數(shù)i和j,0≤i,j≤100,然后從加法基或減法基選擇一個數(shù)組元素[i,j]構(gòu)成算式。習(xí)題的創(chuàng)建與算式基的創(chuàng)建稱為兩個獨立的活動。算式基實現(xiàn)了按需選擇數(shù)據(jù)和數(shù)據(jù)重用,為數(shù)據(jù)共享提供了支持。如果能持久地、以通用的格式存儲算式基及產(chǎn)生的習(xí)題,就可以在不同程序、甚至不同語言的程序之間實現(xiàn)數(shù)據(jù)共享。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院454.5.2表驅(qū)動編程算式基的設(shè)計把加法、減法算式的約束條件,以及算式產(chǎn)生的信息都放在了一張表中,使程序在表中通過選擇條件而不使用邏輯語句(if或case)得到算式及其運算結(jié)果。如此編寫程序的方式稱為表驅(qū)動編程。理論上,任何使用邏輯語句的情況都可以用存儲了信息的讀取表的操作。如果條件簡單,則邏輯語句直截了當(dāng)、易用。邏輯鏈越復(fù)雜,表驅(qū)動編程就越有吸引力。使用得當(dāng),表驅(qū)動編程把復(fù)雜的邏輯編織在表中,而不是編織在代碼中,使得程序結(jié)構(gòu)簡潔、邏輯清晰、容易修改和擴(kuò)展。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院464.5.2表驅(qū)動編程【例4.4】把輸入的一個符號分成字母、標(biāo)號或數(shù)字種類。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院474.5.2表驅(qū)動編程如果先把每個字符的種類存入以字符碼作為下標(biāo)的數(shù)組,則可以用下面簡單的語句代替上面復(fù)雜的程序段:它把應(yīng)用知識放入了表而不是程序邏輯,即用表替換了if檢測。表驅(qū)動編程是解決復(fù)雜的判斷邏輯、面向?qū)ο罄^承結(jié)構(gòu)的一種簡單方式。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院484.5.2表驅(qū)動編程使用表驅(qū)動編程方法需要考慮以下兩點。(1)表項的內(nèi)容。查詢表得到的可以是直接結(jié)果或者是動作。在這種情況下,可以在表中存放描述動作的代碼,或者對某些語言可以存放引用實現(xiàn)動作的函數(shù)。在表中存放動作使表的內(nèi)容及其處理變得復(fù)雜了。(2)表項的查詢。有三種基本的查詢方式:直接訪問、階梯訪問和索引訪問。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院494.5.2表驅(qū)動編程1.直接訪問表中的項表示一個結(jié)果或動作,通過數(shù)組下標(biāo)(一維表)或矩陣下標(biāo)(二維表)直接訪問表。例如,計算某個月的天數(shù),可以用下標(biāo)是1~12的數(shù)組存放每個月份的天數(shù),用月份作為數(shù)據(jù)直接得到當(dāng)月的天數(shù)。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院504.5.2表驅(qū)動編程2.階梯訪問表中的項表示一個數(shù)據(jù)范圍而不是對應(yīng)不同的單個數(shù)據(jù),而且數(shù)據(jù)的排列按照一定的順序,這樣就避免了顯示比較,實際上是隱含了比較。【例4.5】考慮按照輸入的分?jǐn)?shù)輸出成績等級的程序。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院514.5.2表驅(qū)動編程使用表驅(qū)動編程,將成績等級按照上升方式存入數(shù)組String[]grades后,程序代碼如下:2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院524.5.2表驅(qū)動編程表的設(shè)計影響程序的設(shè)計。下面代碼對應(yīng)的是本例另外設(shè)計的一種表。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院534.5.2表驅(qū)動編程階梯訪問方式的一個優(yōu)點是容易處理不規(guī)則的數(shù)據(jù)。在分?jǐn)?shù)等級的例子中,“不及格”對應(yīng)了59個數(shù),“優(yōu)秀”對應(yīng)11個數(shù),其他的對應(yīng)10個數(shù)。容易修改程序,使它能處理不含“中等”的分?jǐn)?shù)等級,即60~79分都是“及格”。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院544.5.2表驅(qū)動編程3.索引訪問首先為查詢的數(shù)據(jù)建立一個檢索表,用索引數(shù)據(jù)在索引表中得到關(guān)鍵字。然后用該值在另一個表(主表)中檢索感興趣的主數(shù)據(jù)。散列表或哈希表(HashTable)是索引訪問的一個例子。索引訪問的優(yōu)勢如下。(1)節(jié)省空間。(2)操作檢索表項要比操作主表項簡單。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院554.6基于程序結(jié)構(gòu)的測試程序結(jié)構(gòu)主要包括控制結(jié)構(gòu)和數(shù)據(jù)結(jié)構(gòu)。本節(jié)以產(chǎn)生0~100的算式為例說明如何測試程序的控制結(jié)構(gòu)。4.6.1語句覆蓋測試4.6.2程序控制流圖4.6.3邏輯覆蓋測試4.6.4路徑覆蓋測試2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院564.6基于程序結(jié)構(gòu)的測試2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院574.6基于程序結(jié)構(gòu)的測試2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院584.6.1語句覆蓋測試根據(jù)良好編程的一個基本原則,程序中每個組成(語句和變量等)都要有用,即完成指定的功能,不多也不少。結(jié)構(gòu)性測試試圖證實這個原則得到落實或落實的程度。普通的編譯程序能檢查程序的語法錯誤,有些編譯也能檢查程序的語義錯誤,甚至邏輯上的缺陷。測試程序更關(guān)注語句、語句的組成及語句之間的關(guān)系。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院594.6.1語句覆蓋測試設(shè)計測試,檢測程序的每條語句是否都能執(zhí)行。如果一個測試用例沒有使所有的語句都得到執(zhí)行,就增加測試,試圖增加執(zhí)行的語句數(shù)量,直至所有語句都能執(zhí)行。否則,要么測試用例不夠,不能使所有語句都執(zhí)行;要么程序有缺陷,出現(xiàn)了不可能執(zhí)行的語句。把這種測試稱為語句覆蓋測試。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院604.6.1語句覆蓋測試首先要明確語句的概念。計算機程序的語句一般分為簡單語句和復(fù)合語句。語句覆蓋的基本準(zhǔn)則:設(shè)計測試用例,使得程序的每條基本語句都得到執(zhí)行。如,測試數(shù)據(jù)(57,35,'+'),在generateOperationTester()中使用后,運行了下列語句:{1,2,3,4,5,6,7,24}。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院614.6.1語句覆蓋測試分析程序,要執(zhí)行語句8,輸入運算數(shù)之和要大于100,故增加測試數(shù)據(jù)(57,55,'+'),覆蓋了下列語句:{1,2,3,4,5,6,8,9,10,24}。繼續(xù)增加測試數(shù)據(jù)(77,35,'?'),(17,35,'?'),(47,35,'#'),(?17,35,'+')。共6個測試數(shù)據(jù)就能使得函數(shù)generateOperation()的所有語句得以執(zhí)行,即這組測試數(shù)據(jù)100%地覆蓋了語句。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院624.6.1語句覆蓋測試可以設(shè)計其他測試數(shù)據(jù),實現(xiàn)100%覆蓋函數(shù)generateOperation()的語句,例如:(18,45,'+'),(77,45,'+'),(18,101,'+'),(18,92,'-'),(66,33,'-'),(17,33,'=')運用語句覆蓋的測試目標(biāo)是,使用盡可能少的測試用例,實現(xiàn)最大的語句覆蓋,用語句覆蓋率來量化:語句覆蓋率=覆蓋的語句數(shù)/語句總數(shù)2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院634.6.1語句覆蓋測試即使是100%的語句覆蓋測試也不能保證程序正確無誤。語句覆蓋是最容易實現(xiàn)、也是最弱的覆蓋準(zhǔn)則。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院644.6.2程序控制流圖程序控制流圖(ControlFlowGraph,CFG)表示程序的控制流??刂屏髦傅氖强刂茝囊粭l指令到另一條指令的流動??刂屏鲃拥姆绞蕉喾N多樣,如按照指令的先后順序、函數(shù)調(diào)用、消息傳遞或中斷。條件語句改變程序中的控制的正常的、順序的流動。本節(jié)介紹的控制流圖主要用在一個函數(shù)或方法中。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院654.6.2程序控制流圖控制流圖的畫法如下。(1)節(jié)點:圓圈表示一條可執(zhí)行的基本語句,可以增加標(biāo)記,如語句號或節(jié)點順序號;(2)控制線或?。河脦Ъ^的有向線表示連結(jié)的兩個語句的執(zhí)行順序;(3)程序執(zhí)行(控制流)的分叉或交匯處,可以用節(jié)點表示;(4)每個函數(shù)或程序都有唯一的開始和結(jié)束節(jié)點;(5)不含執(zhí)行程序不可達(dá)到的語句或不能使程序停止的語句;(6)控制線必須連接兩個節(jié)點,開始節(jié)點和結(jié)束節(jié)點除外。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院664.6.2程序控制流圖2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院674.6.3邏輯覆蓋測試1.判定覆蓋判定覆蓋準(zhǔn)則測試的含義是,設(shè)計測試用例,使得程序中的每個判斷分支都至少經(jīng)歷一次。由于一個判定往往代表著程序的一個分支,所以判定覆蓋也稱分支覆蓋。如,測試數(shù)據(jù)(12,48,'+'),(102,48,'+'),(88,45,'?'),(77,45,'?'),(38,81,'?'),(18,92,'+')2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院684.6.3邏輯覆蓋測試2.條件覆蓋布爾條件分簡單條件和復(fù)合條件。簡單條件指的是布爾變量或原子布爾表達(dá)式,即不含布爾運算的布爾表達(dá)式。復(fù)合條件則是至少用一個布爾運算連接的簡單條件。條件覆蓋的準(zhǔn)則是:設(shè)計測試用例,使得程序中的每個簡單布爾條件的所有可能的值都至少滿足一次。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院694.6.3邏輯覆蓋測試2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院704.6.4路徑覆蓋測試程序的執(zhí)行路徑可以抽象語句序列,即從進(jìn)入程序的第一條語句到程序停止、一次運行的語句序列。對于函數(shù)而言,停止語句可以是自然的最后一條語句,也可以是一條return語句。例如,語句編號序列1-2-3-22-23-24和1-2-3-4-5-6-7-24都是函數(shù)的執(zhí)行路徑。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院714.6.4路徑覆蓋測試用CFG再次簡化和抽象程序的執(zhí)行路徑。用圖的路徑表示程序的執(zhí)行路徑:一條路徑是從CFG的開始節(jié)點經(jīng)過連線到達(dá)結(jié)束節(jié)點的節(jié)點序列或控制線序列。(1)分解復(fù)合條件:把復(fù)合條件中每個簡單條件用一個節(jié)點表示,并調(diào)整控制線。(2)合并簡單的順序語句:賦值語句、打印語句等不含條件,如果是順序排列,它們的執(zhí)行不會改變程序的控制順序,即不會產(chǎn)生新的路徑,可以將它們合并在一起,用一個節(jié)點表示。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院724.6.4路徑覆蓋測試2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院734.6.4路徑覆蓋測試路徑有長有短,如果有循環(huán)語句,一條路徑可能會出現(xiàn)在每一次的循環(huán)路徑中。按照等價類的思路,我們希望測試的每條路徑都有所不同,但又盡量包含可能多的路徑,通常采用基本路徑覆蓋法。簡單地說,一條基本路徑是指,和其他基本路徑相比,至少引入一個節(jié)點或一個新的控制線的路徑。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院744.6.4路徑覆蓋測試一個程序的基本路徑的數(shù)量是其CFG圖G的圈復(fù)雜數(shù),由V(G)=e?n+2給出,其中e是G中的邊數(shù),n是G中的節(jié)點數(shù)。本例的圈復(fù)雜數(shù)=23?16+2=9,也就是說有9條基本路徑。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院754.6.4路徑覆蓋測試運用一個數(shù)據(jù)結(jié)構(gòu)棧找出基本路徑。(1)首先,CFG的開始節(jié)點入棧;(2)從棧頂按照CFG連線,選擇下一個節(jié)點:如果一個節(jié)點的出度outDegree大于0,選擇之前沒有選擇過的后繼節(jié)點,outDegree?1;(3)重復(fù)(2)直至棧頂是CFG的結(jié)束節(jié)點。從棧內(nèi)輸出節(jié)點,其逆序就是一條基本路徑;(4)尋找下一條基本路徑,從棧頂逐個退出節(jié)點:如果遇到一個節(jié)點的出度大于1且當(dāng)前outDegree大于0,則重復(fù)步驟(2)~(4);如果退出開始節(jié)點,則查找結(jié)束。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院764.6.4路徑覆蓋測試基本路徑覆蓋測試的步驟如下:(1)繪制待測程序的CFG;(2)計算CFG的圈復(fù)雜數(shù);(3)找出圈復(fù)雜數(shù)的基本路徑作為一個測試基本集;(4)設(shè)計測試用例,使其覆蓋測試基本集中的每條基本路徑。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院774.6.4路徑覆蓋測試最后,幾點說明如下。(1)圈復(fù)雜數(shù)是代碼邏輯復(fù)雜度的度量。圈復(fù)雜數(shù)越大,程序復(fù)雜度越高,出錯的概率越大。(2)每個程序的基本路徑的數(shù)量一樣,測試基本集不唯一。(3)基本路徑測試不是測試所有路徑的組合,它僅僅保證每條基本路徑被執(zhí)行一次。(4)面向?qū)ο蠹夹g(shù)倡導(dǎo)復(fù)用和單一職能,成員方法的圈復(fù)雜數(shù)通常都很小。(5)基本路徑測試主要用在單元測試。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院784.7運用JUnit4.7.1異常測試4.7.2參數(shù)化測試4.7.3測試套件4.7.4JUnit的斷言4.7.5JUnit使用指南2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院794.7.1異常測試異常處理是提高程序可靠性的一個重要機制,需要時應(yīng)該給程序編寫異常拋出及其處理。異常測試的含義:如果一個程序應(yīng)該拋出異常,但是運行時沒有拋出,這就是一個錯誤。JUnit4通過@Test注解中的expected屬性來測試異常。expected屬性的值是一個異常類。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院804.7.1異常測試2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院814.7.1異常測試如果不想執(zhí)行toString()的測試方法,就在其前面使用注解@Ignore。測試運行結(jié)果中的斜線表示不執(zhí)行的測試。代碼前要引入org.junit.Ignore注解包。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院824.7.2參數(shù)化測試為了簡化測試編碼,JUnit4提供了參數(shù)化測試,即只寫一個測試方法,把測試用例作為參數(shù)傳遞進(jìn)去,一次循環(huán)執(zhí)行,完成多個測試數(shù)據(jù)。可以把參數(shù)化測試?yán)斫獬蓽y試一個數(shù)據(jù)集合。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院834.7.2參數(shù)化測試編寫參數(shù)化測試的代碼需要6個基本步驟。(1)要為參數(shù)化測試生成一個獨立的新的類,不能與其他測試公用同一個類。(2)為參數(shù)化測試類指定特殊的運行器,語句@RunWith(Parameterized.class)為這個類指定org.JUnit.runners.Parameterized運行器,注解必須放在測試類的前面。(3)為測試類聲明若干變量,分別用于存放期望值和測試數(shù)據(jù)。(4)為測試類聲明一個帶有參數(shù)的公共構(gòu)造函數(shù),為(3)中聲明的變量賦值。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院844.7.2參數(shù)化測試編寫參數(shù)化測試的代碼需要6個基本步驟。(5)為測試類聲明一個使用注解@Parameters修飾的、返回值為java.util.Collection的公共靜態(tài)方法。方法中列出測試用例,即測試數(shù)據(jù)和期望值。該方法沒有參數(shù),名字沒有特殊要求。測試用例是一個二維數(shù)組,數(shù)組中數(shù)據(jù)的一部分是與測試類的變量相同的數(shù)據(jù),另一個部分是預(yù)期結(jié)果。測試數(shù)據(jù)及預(yù)期結(jié)果的個數(shù)和順序要與(4)的構(gòu)造函數(shù)中的參數(shù)完全一致。(6)編寫測試方法,使用定義的測試用例作為參數(shù)進(jìn)行測試。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院854.7.3測試套件JUnit提供了測試套件作為容器,將所有需要運行的測試類集中起來,一次性運行,提高了測試效率。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院864.7.3測試套件測試套件使用一個特殊的Runner,要向注解@RunWith傳遞一個參數(shù)Suite.class,然后使用注解@Suite.SuiteClasses來表明一個獨立的測試類(容器類)是一個測試套件。在其中把需要一起測試的類作為參數(shù)傳遞給該注解——列舉每個測試類。容器類的名字無關(guān)緊要,甚至內(nèi)容也可以為空。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院874.7.4JUnit的斷言斷言是JUnit測試中最基本的組成部分。它們實際上是Assert類的一些靜態(tài)方法。前面的例子使用了斷言assertEquals。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院884.7.5JUnit使用指南2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院894.8案例分析與實踐1.分析與設(shè)計第一步,隨機生成多套習(xí)題,保存起來,華經(jīng)理每天選擇并打印三套習(xí)題;第二步,程序讀入小明的練習(xí)結(jié)果,判題、打分并保存起來。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院904.8案例分析與實踐一些問題如下。1)這些功能或任務(wù)如何分配到現(xiàn)有類?如何盡可能減少對現(xiàn)有類的改動?2)是否增加類?新增類與現(xiàn)有類間有何關(guān)聯(lián)?3)如何關(guān)聯(lián)習(xí)題與練習(xí)結(jié)果?即如何明確一個以文件存儲的練習(xí)結(jié)果所對應(yīng)的以文件存儲的習(xí)題?4)如何存儲各種文件?采用文本文件、字節(jié)文件?用流式文件或?qū)ο笪募?016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院914.8案例分析與實踐考慮的設(shè)計如下。1.隨機生成多套習(xí)題,保存起來。2.增加類,完成對練習(xí)的批改。3.字符文件還是字節(jié)文件?2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院924.8案例分析與實踐2.一般性建議本章擴(kuò)展了案例程序,特別是使用了文件存儲算式基和習(xí)題。建議學(xué)習(xí)運用防御性編程的原則,對涉及文件的操作,使用異常等處理可能的錯誤。如果使用的編程語言支持?jǐn)嘌?,建議在開發(fā)期間開啟編譯的斷言參數(shù),利用斷言幫助調(diào)試程序,并作為程序文檔。建議選擇性地運用基于程序結(jié)構(gòu)的測試。如果一個函數(shù)或方法的圈復(fù)雜性大于9,說明其內(nèi)聚性較弱,應(yīng)當(dāng)考慮將它細(xì)分。對圈復(fù)雜性大于5的模塊,建議采用基本路徑覆蓋測試。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院934.8案例分析與實踐4.8.1批量生成100以內(nèi)的算式的習(xí)題4.8.2批改練習(xí)并存儲4.8.3算式基的構(gòu)造與應(yīng)用2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院944.8.1批量生成100以內(nèi)的算式的習(xí)題2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院954.8.2批改練習(xí)并存儲2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院964.8.3算式基的構(gòu)造與應(yīng)用2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院974.9討論與提高4.9.1應(yīng)用表驅(qū)動編程4.9.2使用文件還是數(shù)據(jù)庫4.9.3契約式編程2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院984.9.1應(yīng)用表驅(qū)動編程1.合并加法基與減法基4.5節(jié)中,加法基AdditionBase[101,101]和減法基SubstractBase[101,101]的二維數(shù)組實際只用了一半,形成了斜三角形。(1)加法基的對角線恒等于100。若令i、j分別表示行和列的值,加法基滿足條件:0≤i,j≤100and0≤i+j≤100。(2)減法基的對角線恒等于0。行、列的值滿足條件:0≤i,j≤100and0≤i?j≤100。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院994.9.1應(yīng)用表驅(qū)動編程以第50列為軸,將減法矩陣反轉(zhuǎn),得到:2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院1004.9.1應(yīng)用表驅(qū)動編程除左下至右上的對角線,減法與加法基構(gòu)成一個完整矩陣OperatinBase[101,101]。仍用i和j分別表示行和列的值,減法算式變成:0≤i,j≤100and0≤i?(100?j)≤100,化簡得:0≤i,j≤100and100≤i+j≤200。最終得到100以內(nèi)的所有加法算式和減法算式,算式基OperatinBase的左上半部三角形是加法算式,右下部三角形是減法算式。2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院1014.9.1應(yīng)用表驅(qū)動編程2016秋數(shù)據(jù)科學(xué)與軟件工程學(xué)院1024.9.1應(yīng)用表驅(qū)動編程只要給出滿足0≤i,j≤100的行i和列j,就能從算式基矩陣OperatinBase得出加法或減法的算式:當(dāng)i+j≤100時,在矩陣OperatinBase[i,j]中得到算式i+j;當(dāng)i+j≥100時,在矩陣OperatinBase[i,j]中得到算式i?(100?j);特殊情況:左下至右上的對角線,加法的i+j恒等于100,減法i?j恒等于0。兩者只能取其一??梢源娣偶臃ㄋ闶絠+j=100。減法是i=100?j,算式恒等于0。2016秋
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024-2025學(xué)年廣東省廣州市部分學(xué)校高二上學(xué)期期中考試歷史試卷
- 2025年企業(yè)內(nèi)部控制完善咨詢合同
- 2025年住宅小區(qū)機動車停放安全與管理協(xié)議
- 2025年高效酸霧凈化器項目規(guī)劃申請報告模式
- 2025年企業(yè)并購協(xié)議問答
- 2025年建筑施工照明設(shè)備安裝安全策劃協(xié)議書
- 2025年水利項目施工勞務(wù)合同
- 2025年酒類銷售合作合同
- 2025年醫(yī)院安保人員雇傭合同范本
- 2025年住宅建設(shè)項目合同管理與績效
- 城市區(qū)域環(huán)境噪聲監(jiān)測實驗報告
- MBTI量表完整版本
- 護(hù)理操作-吸痰
- 重癥肺炎的基本知識宣教
- 中醫(yī)適宜技術(shù)-腕踝針
- 初二上勞動技術(shù)課件電子版
- 創(chuàng)業(yè)計劃書模板-創(chuàng)業(yè)計劃書-商業(yè)計劃書模板-項目計劃書模板-商業(yè)計劃書30
- 醫(yī)院護(hù)理帶教老師競聘課件
- 四川虹科創(chuàng)新科技有限公司高強超薄耐摔玻璃智能制造產(chǎn)業(yè)化項目環(huán)境影響報告
- 多聯(lián)機空調(diào)系統(tǒng)設(shè)計課件
- 燭之武退秦師 全市一等獎
評論
0/150
提交評論