算法
算法基本特征
- 算法:指解題方案的準確而完整的描述(≠程序 ≠計算方法)
- 算法四個特點:
可行性
確定性
有窮性
足夠的情報
程序的設(shè)計不可能優(yōu)于算法的設(shè)計
有窮性:算法程序的運行時間是有限的
算法的基本要素
- 對數(shù)據(jù)對象的運算和操作:
算術(shù)運算
、邏輯運算
、關(guān)系運算
、數(shù)據(jù)傳輸
- 算法的控制結(jié)構(gòu)
- 算法中各操作之間的執(zhí)行順序
- 描述算法的工具:
傳統(tǒng)流程圖、N-S結(jié)構(gòu)化流程圖、自然描述語言、偽代碼描述、程序
- 一個算法可以用
順序、選擇(分支) 、循環(huán)(重復(fù))
三種基本結(jié)構(gòu)組合而成
- 算法的復(fù)雜度
-
時間復(fù)雜度:執(zhí)行算法所需要的
計算工作量
(基本運算次數(shù)),與所用計算工具無關(guān),與采用的算法描述語言無關(guān) -
空間復(fù)雜度:執(zhí)行算法所需要的
內(nèi)存空間
(計算機所需存儲空間)
-
時間復(fù)雜度:執(zhí)行算法所需要的
設(shè)計算法時需要考慮算法的的時間和空間復(fù)雜度,但兩者相互獨立,毫無關(guān)聯(lián)
- 算法分析方法:平均性態(tài)、最壞情況復(fù)雜性
- 算法分析目的:降低算法復(fù)雜度,提高算法的執(zhí)行效率,以求改進
- 算法設(shè)計方法:
列舉法、歸納法、遞推、遞歸、減半遞推、回溯
算法的執(zhí)行效率與數(shù)據(jù)的存儲結(jié)構(gòu)
有關(guān)
數(shù)據(jù)結(jié)構(gòu)
數(shù)據(jù)
數(shù)據(jù):需要處理的數(shù)據(jù)元素的集合
-
數(shù)據(jù)元素:數(shù)據(jù)的
基本單位
,即數(shù)據(jù)集合中的個體,也是結(jié)點有時一個數(shù)據(jù)元素可由若干
數(shù)據(jù)項(Data Item)
組成,數(shù)據(jù)項是數(shù)據(jù)的最小單位
結(jié)構(gòu):集合中各數(shù)據(jù)元素之間存在的某種前后件關(guān)系
數(shù)據(jù)結(jié)構(gòu):指帶有結(jié)構(gòu)的相互有關(guān)聯(lián)的數(shù)據(jù)元素的集合
【真題】設(shè)數(shù)據(jù)集合為D={1,2,3,4,5},則結(jié)構(gòu)B=(D,R)中為非線性結(jié)構(gòu)的是
R={(1,2),(2,3),(4,3),(3,5)} 非線性【1→2→3→5、4→3】(√)
R={(1,2),(2,3),(3,4),(4,5)} 線性【1→2→3→4→5】(×)
數(shù)據(jù)結(jié)構(gòu)的分類
數(shù)據(jù)結(jié)構(gòu)作為計算機的一門學科,主要研究三個方面:
數(shù)據(jù)間固有邏輯結(jié)構(gòu)關(guān)系
、數(shù)據(jù)的存儲結(jié)構(gòu)關(guān)系
、數(shù)據(jù)結(jié)構(gòu)的運算
邏輯結(jié)構(gòu) | 存儲結(jié)構(gòu) | 運算 |
---|---|---|
線性結(jié)構(gòu)(線性表、棧、隊列) | 順序結(jié)構(gòu) | 插入、刪除、查找、排序 |
非線性結(jié)構(gòu)(樹、圖) | 鏈式結(jié)構(gòu) | \ |
- 邏輯結(jié)構(gòu):反映數(shù)據(jù)元素之間的前后件邏輯關(guān)系的數(shù)據(jù)結(jié)構(gòu)(與所使用的計算機無關(guān))
- 存儲結(jié)構(gòu):即物理結(jié)構(gòu),數(shù)據(jù)的邏輯結(jié)構(gòu)在計算機空間中的存放方式(不同的存儲結(jié)構(gòu),數(shù)據(jù)處理的效率不同,
與效率有關(guān)
)- 順序結(jié)構(gòu):主要用于線性的數(shù)據(jù)結(jié)構(gòu)
- 鏈式結(jié)構(gòu):每一個結(jié)點至少包含一個指針域,用指針的指向來體現(xiàn)數(shù)據(jù)元素之間在邏輯上的聯(lián)系 ,優(yōu)點是
便于插入和刪除操作
- 索引結(jié)構(gòu):帶有目錄與內(nèi)容
線性表
- 線性表:由n(n≥0)個數(shù)據(jù)元素構(gòu)成的有限序列,表中由且只有一個根結(jié)點和一個終端結(jié)點,除根元素外的其它元素有且只有一個前件,除終端元素外的其它元素有且只有一個后件(如:春→夏→秋→冬)
- 線性表的順序存儲結(jié)構(gòu)叫做
順序表
(隨機存取),線性表的鏈式存儲結(jié)構(gòu)叫做線性鏈表
(順序存取)
順序表
- 線性表中所有元素所占的存儲空間是
連續(xù)
的 - 線性表中數(shù)據(jù)元素在存儲空間中是
按邏輯順序依次存放
的 - 可以
隨機訪問
數(shù)據(jù)元素 - 做插入、刪除時需移動大量元素,因此線性表不便于插入和刪除元素
- 其存儲空間連續(xù),各個元素所占字節(jié)數(shù)相同,元素的存儲順序與邏輯順序一致
線性鏈表
- 各數(shù)據(jù)結(jié)點的存儲空間可以
不連續(xù)
- 各數(shù)據(jù)元素的存儲順序與邏輯順序可以不一致,
可任意
- 所占存儲空間
大于
順序存儲結(jié)構(gòu)(每節(jié)點多出至少一個指針域) - 查找結(jié)點時要比順序存儲
慢
- 插入刪除元素比順序存儲
靈活
-
線性鏈表的操作:在線性鏈表中進行插入與刪除,
不需要
移動鏈表中的元素image
棧
棧的入口和出口是
同一個口
,只能在棧頂
進行插入和刪除
棧的修改原則是
“先進后出”
或“后進先出”
棧的
棧底指針bottom
和棧頂指針top
,從入棧
到棧滿
再到退棧
,棧低指針bottom不變
,棧中元素隨棧頂指針的變化而動態(tài)變化(指針存放的是地址而非數(shù)據(jù))棧能臨時保存數(shù)據(jù),具有
記憶功能
-
棧支持子程序調(diào)用
image
一個棧的初始狀態(tài)為空。將元素abcde依次入棧,不可能的出棧順序為(E)
A.edcba B.dcbae C.badce D.cbaed E.eabcd
用一個長度為50的數(shù)組(數(shù)組元素的下標從0到49)作為棧的存儲空間,如果bottom=49,top=30(數(shù)組下標),則棧中具有的元素個數(shù)為【20】(49-30+1=20)
設(shè)棧的存儲空間為S(1:60),初始狀態(tài)為top=61。現(xiàn)經(jīng)過一系列正常的入棧與退棧操作后,top=25,則棧中的元素個數(shù)為【36】(60-25+1=36)
棧內(nèi)元素個數(shù)計算:
丨Top-Bottom丨+1
(其中Bottom≥1),若T=B=0說明棧空
鏈式棧比較特殊,當中存放元素與地址,但其棧底指針bottom可以改變
隊列
- 隊列中
隊頭指針front
指向?qū)︻^元素的前一位置
,隊尾指針rear
指向最末元素,從入隊
到出隊
- 隊列的入口和出口
非同一個口
,只允許在隊尾插入
,而在隊頭刪除
- 隊列的修改原則是
“先進先出”
或“后進后出”
(先到先服務(wù)的作業(yè)調(diào)度) - 隊列中元素隨front和rear的變化而動態(tài)變化,并非固定
-
循環(huán)隊列:將隊列存儲空間的最后一個位置繞到第一個位置,形成邏輯上的環(huán)狀空間,供隊列循環(huán)使用
image求隊列中的
元素個數(shù)s
(由rear與front共同決定)- rear>front s=rear-front
. rear<front s=rear-front+總?cè)萘?br> . rear=front s=0或者s=容量(滿)
設(shè)循環(huán)隊列的存儲空間為Q(1:40),初始狀態(tài)為front=rear=40。經(jīng)過一系列正常的入隊與退隊操作后,front=rear=15,此后又正常地退出了一個元素,則循環(huán)隊列中的元素個數(shù)為 【39】 (當頭尾指針都是15之后還能退出元素,說明初始狀態(tài)為滿,故退出一個元素,即40-1=3)
- rear>front s=rear-front
樹
- 樹:指n(n>0)個元素的有限集合,它有且僅有一個稱為根的元素,其余元素是互不相交的子樹
- 概念術(shù)語:
- 父結(jié)點(A是BCD的父)、子結(jié)點(BCD是A的子)
- 根結(jié)點(A)、葉子結(jié)點(KLFMHNJ)
- 結(jié)點的度:一個結(jié)點所擁有的后件的個數(shù)(A的度為3、B的度為2)
- 樹的度:具有結(jié)點中最大的度(上圖為3)
- 樹的深度:整棵樹的層數(shù)(上圖為4)
- 子樹:在一棵樹中以某個結(jié)點的一個子結(jié)點為根所構(gòu)成的樹(如B→EF→KL這一左半部分)
二叉樹
二叉樹是一個有限的結(jié)點集合,該集合或為空,或由一個根結(jié)點及其兩棵互不相交的左右二叉子樹所組成
- 二又樹的特點
- 非空二又樹只有一個根結(jié)點
- 每一個結(jié)點最多有兩棵子樹,且分別稱為該結(jié)點的左子樹與右子樹
- 特殊二叉樹
滿二叉樹:除最后一層外,每一層上的結(jié)點數(shù)均達到最大值。
完全二叉樹:除最后一層外,每一層上的結(jié)點數(shù)均達到最大值,在最后一層上只缺少右邊的若干結(jié)點
滿二叉樹
是
完全二叉樹,完全二叉樹不是
滿二叉樹
-
二叉樹的性質(zhì):
- 非空二叉樹只有一個根結(jié)點,每個結(jié)點最多有兩棵子樹,分別稱為
左子樹
和右子樹
- 在二叉樹的第k層上,最多有
2^(k-1)
個結(jié)點 - 深度為m的二叉樹最多有
2^(m)-1
個結(jié)點 - 度為0的結(jié)點稱為
葉子結(jié)點
,度=0的結(jié)點總比度=2的結(jié)點多1個
- 有n個結(jié)點的二叉樹深度至少為
[log(2)n]+1
- 非空二叉樹只有一個根結(jié)點,每個結(jié)點最多有兩棵子樹,分別稱為
-
二叉樹的遍歷:按照一定的順序不重復(fù)不遺漏地訪問二叉樹中的結(jié)點
image前序遍歷:訪問根結(jié)點→前序遍歷左子樹→前序遍歷右子樹(ABDGECF)(根左右)
中序遍歷:中序遍歷左子樹→訪問根結(jié)點→中序遍歷右子樹(DGBEACF)(左根右)
后序遍歷:后序遍歷左子樹→后序遍歷右子樹→訪問根結(jié)點(GDEBFCA)(左右根)
查找技術(shù)
順序查找:從第一個或最后一個記錄開始,一直到查找出給定值,結(jié)束查找
-
二分查找:在有序表中取中間記錄作為比較對象,若給定值與中間記錄的關(guān)鍵字相等,查找成功;若小于則找左半?yún)^(qū),若大于則找右半?yún)^(qū),不斷重復(fù)直到成功
image注意:即使是有序線性表,如果采用鏈式存儲結(jié)構(gòu),也只能用順序查找
排序
- 冒泡排序:從頭到尾重復(fù)比較相鄰的兩元素,如果前比后大,就交換彼此,直到?jīng)]有相鄰元素需要交換則完成排序,越大的元素會經(jīng)交換慢慢“浮”到數(shù)列的后端
- 快速排序:選第一個數(shù)作為基準數(shù),將之后所有的數(shù)與其做比較,比基大放右區(qū),比基小放左區(qū),此時線性表被分割為兩個子表,再對兩個子表重復(fù)上述步驟,直到各字表的長度為1則完成排序
- 簡單插入排序:將無序序列中的各元素依次插入到已經(jīng)有序的線性表中,像軍訓(xùn)時按身高逐個糾正排序
- 希爾排序:將整個無序序列分割成若干小的子序列分別進行簡單插入排序
- 簡單選擇排序:掃描整個線性表,從中選出最小的元素,將它交換到表的最前面,以此類推直到所有元素均排序完畢
- 堆排序:選建堆,然后將堆頂元素與堆中最后一個元素交換,再調(diào)整為堆
最壞情況下,比較次數(shù)最少的是
堆排序
要求內(nèi)存量最大的是
歸并排序
當數(shù)據(jù)表中每個元素距其最終位置不遠,最節(jié)省時間的是
簡單插入排序
選擇排序與冒泡排序的區(qū)別:冒泡排序通過依次交換相鄰兩個順序不合法的元素位置,從而將當前最小(大)元素放到合適的位置;而選擇排序每遍歷一次都記住了當前最小(大)元素的位置,最后僅需一次交換操作即可將其放到合適的位置。
程序設(shè)計基礎(chǔ)
程序設(shè)計方法與風格
- 相關(guān)術(shù)語
- 程序:將計算機語言代碼依據(jù)一定的語法規(guī)則,描述為完成特定任務(wù)的算法的指令序列,程序執(zhí)行的效率與數(shù)據(jù)的存儲結(jié)構(gòu)密切相關(guān)
- 程序設(shè)計:程序設(shè)計為完成一項程序工作的過程
- 計算機語言:計算機語言是人與計算機交流的工具
- Wirth公式:算法+數(shù)據(jù)結(jié)構(gòu)=程序
- 良好的程序設(shè)計風格:
清晰第一,效率第二
- 良好的程序設(shè)計風格
- 源程序內(nèi)部文檔化
- 選擇標識符的名字
- 程序的視覺組織
- 程序的注釋
- 功能性注釋:位于模塊內(nèi)部,用于描述其后語句或程序主要功能
- 序言性注釋:位于模塊首部,用于說明模塊的相關(guān)信息(程序的標題 功能的說明 主要的算法 模塊接口 開發(fā)歷史 程序設(shè)計者 復(fù)審者 復(fù)審日期 修改日期)
- 數(shù)據(jù)說明
- 數(shù)據(jù)說明的次序規(guī)范化
- 說明語句中變量安排有序化
- 使用注釋來說明復(fù)雜數(shù)據(jù)的結(jié)構(gòu)
- 語句的結(jié)構(gòu)
- 在一行內(nèi)只寫一條語句
- 程序編寫應(yīng)優(yōu)先考慮清晰性
- 程序編寫要做到清晰第一,效率第二
- 在保證程序正確的基礎(chǔ)上再要求提高效率
- 避免使用臨時變量而使程序的可讀性下降
- 避免不必要的轉(zhuǎn)移
- 盡量使用庫函數(shù)
- 避免采用復(fù)雜的條件語句
- 盡量減少使用“否定”條件語句
- 數(shù)據(jù)結(jié)構(gòu)要有利于程序的簡化
- 要模塊化,使模塊功能盡可能單一化
- 利用信息隱蔽,確保每一個模塊的獨立性
- 從數(shù)據(jù)出發(fā)去構(gòu)造程序
- 不要修補不好的程序,要重新編寫
- 輸入和輸出
- 對輸入數(shù)據(jù)檢驗數(shù)據(jù)的合法性
- 檢查輸入項的各種重要組合的合法性
- 輸入格式要簡單,使得輸入的步驟和操作盡可能簡單
- 輸入數(shù)據(jù)時,應(yīng)允許使用自由格式
- 應(yīng)允許缺省值
- 輸入一批數(shù)據(jù)時,最好使用輸入結(jié)束標志
- 在以交互式輸入/輸出方式進行輸入時,要在屏幕上使用提示符明確提示輸入的請求,同時在數(shù)據(jù)輸入過程中和輸入結(jié)束時,應(yīng)在屏幕上給出狀態(tài)信息
- 當程序設(shè)計語言對輸入格式有嚴格要求時,應(yīng)保持輸入格式與輸入語句的一致性,給所有的輸出加注釋,并設(shè)計輸出報表格式
- 源程序內(nèi)部文檔化
良好程序設(shè)計風格不僅有助于提高程序的可靠性、可理解性、可測試性、可維護性和可重復(fù)性,而且也能夠促進技術(shù)的交流,改善軟件的質(zhì)量
結(jié)構(gòu)化程序設(shè)計
- 軟件設(shè)計的基本原則:抽象、信息隱蔽、模塊化、局部化、確定性、一致性、完備性、可靠性
- 結(jié)構(gòu)化程序設(shè)計風格:
程序結(jié)構(gòu)良好、可讀性好、易測試、易維護
- 結(jié)構(gòu)化程序設(shè)計原則
-
自頂向下
:先考慮總體,后考慮細節(jié);先考慮全局目標,后考慮局部目標 -
逐步求精
:對復(fù)雜問題,先設(shè)計一個目標作為過渡,然后逐步細化 -
模塊化
:把程序要解決的總目標分解為一個一個的模塊 -
限用goto語句
:程序的質(zhì)量與goto語句數(shù)量成反比
-
- 結(jié)構(gòu)化程序的基本結(jié)構(gòu):
順序
、選擇(分支)
、循環(huán)(重復(fù))
- 程序設(shè)計語言的基本成分:
數(shù)據(jù)成分
、運算成分
、控制成分
、傳輸成分
設(shè)計程序時,應(yīng)采納的原則之一是程序結(jié)構(gòu)應(yīng)有助于讀者理解(強調(diào)
程序易讀性
)
面向?qū)ο蟮某绦蛟O(shè)計
- 面向?qū)ο蠓椒ǖ闹饕獌?yōu)點
- 與人類習慣的思維方法致
- 穩(wěn)定性好
- 可重用性好
- 易于開發(fā)大型軟件產(chǎn)品
- 可維護性好
與傳統(tǒng)的的面向過程的方法不同之處:
面向?qū)ο蟮某绦蛟O(shè)計主張從客觀世界固有的物質(zhì)出發(fā)來構(gòu)造系統(tǒng),
使用現(xiàn)實世界的概念抽象地思考問題從而自然地解決問題
,它提倡用人類在現(xiàn)實生活中常用的思維方式來認識理解描述客觀事物
-
對象有關(guān)概念術(shù)語
- 對象:在現(xiàn)實世界中,每個實體都是對象(大學生、汽車、電視機、空調(diào))
- 屬性:用于描述對象的狀態(tài)
- 方法:用于描述對象的行為
- 類:一組具有相同屬性和相同操作的對象的集合
- 消息:是一個實例與另一個實例之間傳遞的信息,
對象間的通信靠消息傳遞
- 接收消息的對象的名稱
- 消息標識符,也稱消息名
- 零個或多個參數(shù)
“對象是屬性和方法的封裝體”、“任何對象不一定有繼承性”
“對象是類的具體實例,類是對象的抽象”、“操作是對象的動態(tài)屬性”
基于同一類產(chǎn)生的對象可以分別設(shè)置各自的屬性,對象中的屬性只能通過該對象所提供的操作來存取或修改
-
對象的基本特點
-
標識唯一性
:對象可由內(nèi)在本質(zhì)來區(qū)分,而不是通過描述來區(qū)分 -
分類性
:可以將具有相同屬性和操作的對象抽象
成類 -
多態(tài)性
:同一操作可以是不同對象的行為,同樣的消息被不同對象接受時可導(dǎo)致完全不同的行為 -
封裝性
:從外面看不到對象的內(nèi)部,只能看到對象外部特征,實現(xiàn)信息隱蔽
,是數(shù)據(jù)與操作的結(jié)合
,是屬性與方法的封裝
-
模塊獨立性好
:對象是面向?qū)ο蟮能浖幕灸K,高內(nèi)聚低耦合 -
繼承性
:使用已有的類建立新類的定義技術(shù),能直接獲得已有的性質(zhì),而不必重復(fù)定義他們,是類之間共享屬性和操作的機制
-
多態(tài)性
:同樣的消息被不同的對象接受時可導(dǎo)致完全不同的行動的現(xiàn)象 -
依賴性
:某個對象的功能依賴于另外的某個對象,而被依賴的對象只是作為一種工具在使用,而并不持有對它的引用
-
軟件工程基礎(chǔ)
軟件工程基本概念
-
軟件分類:
- 系統(tǒng)軟件:操作系統(tǒng)、編譯程序、匯編程序、網(wǎng)絡(luò)軟件、數(shù)據(jù)庫管理系統(tǒng)
- 應(yīng)用軟件:事務(wù)處理軟件、工程與科學計算軟件、實時處理軟件、人工智能軟件、財務(wù)管理系統(tǒng)
- 支撐軟件(工具軟件):需求分析工具軟件、編譯工具軟件、測試工具軟件、維護工具軟件、Word編輯軟件
學生成績管理系統(tǒng)、教務(wù)管理系統(tǒng)屬于應(yīng)用軟件
軟件危機:需求增長、開發(fā)難控、質(zhì)量難保、難以維護、成本提高、生產(chǎn)率低
軟件工程:應(yīng)用于計算機軟件的定義、開發(fā)和維護的一整套方法、工具、文檔、實踐標準和工序;其
目的
是<u>提高軟件生產(chǎn)率、提高軟件質(zhì)量、降低軟件成本</u>;其核心思想
是<u>把軟件當作一個工程產(chǎn)品來處理</u>-
軟件工程三要素
-
方法
是完成軟件工程項目的技術(shù)手段 -
工具
支持軟件的開發(fā)、管理和文檔生成 -
過程
支持軟件開發(fā)的各環(huán)節(jié)的控制和管理
-
-
軟件生命周期
:將軟件產(chǎn)品從提出、實現(xiàn)、使用維護到停止使用退役的過程- 軟件工程學的一個目的就是提高軟件的可維護性,降低維護代價
- 分為3個時期8個階段,維護是持續(xù)時間最長,花費代價最大的一個時期
-
軟件定義階段
(問題定義可行性研究、需求分析) -
軟件開發(fā)階段
(概要設(shè)計、詳細設(shè)計、實現(xiàn)、測試) -
軟件運行維護階段
(使用、維護)
-
-
需求分析:確定系統(tǒng)的邏輯模型。參加人員有用戶、項目負責人和系統(tǒng)分析員
- 需求分析的工作:需求獲取、需求分析、編寫需求規(guī)格說明書、需求評審
- 需求分析階段產(chǎn)生的主要文檔為
需求規(guī)格說明書
,其作用為:- 便于用戶、開發(fā)人員進行理解交流
- 反映用戶問題的結(jié)構(gòu),可以作為軟件開發(fā)工作的基礎(chǔ)和依據(jù)
- 作為確認測試和驗收的依據(jù)
-
需求規(guī)格說明書(SRS)
需求分析階段
產(chǎn)生的主要文檔是“軟件需求規(guī)格說明書”
,其特點是:- 正確性:體現(xiàn)待開發(fā)系統(tǒng)的真實要求·無歧義性:對每個需求只有一種解釋
- 完整性:包括全部有意義的需求
- 一致性:各個需求的描述不矛盾
- 可驗證性:每個需求都是可驗證的
- 可理解性:需求說明書必須簡明易懂
- 可修改性:結(jié)構(gòu)風格在改變時,是易于實現(xiàn)的
- 可追蹤性:每個需求的來源和流向是清晰的
結(jié)構(gòu)化分析方法
需求分析方法
包括結(jié)構(gòu)化需求分析方法
、面向?qū)ο蟮姆治龇椒?/code>
結(jié)構(gòu)化分析方法
是一種使用數(shù)據(jù)流圖(DFD)、數(shù)據(jù)字典(DD)、判定表和判定樹等工具,來建立系統(tǒng)的邏輯模型。-
數(shù)據(jù)流圖(DFD)是結(jié)構(gòu)化方法的需求分析工具,其圖形元素:
-
〇 加工
:輸入數(shù)據(jù)經(jīng)加工變換產(chǎn)生輸出 -
→ 數(shù)據(jù)流
:沿箭頭方向傳遞數(shù)據(jù)的通道 -
= 存儲文件(數(shù)據(jù)源)
:存放各種數(shù)據(jù)的文件 -
? 源(潭)
:系統(tǒng)和環(huán)境的接口
image -
數(shù)據(jù)字典(DD):對數(shù)據(jù)流圖中所有元素定義的集合,它是結(jié)構(gòu)化分析的核心。
結(jié)構(gòu)化設(shè)計方法
軟件設(shè)計的
基本目標
是用比較抽象、 概括的方式確定目標系統(tǒng)如何完成預(yù)定的任務(wù),即軟件設(shè)計是確定系統(tǒng)的物理模型。-
軟件設(shè)計的劃分
- 按工程管理角度劃分:概要設(shè)計、詳細設(shè)計
- 按技術(shù)觀點劃分:結(jié)構(gòu)設(shè)計、數(shù)據(jù)設(shè)計、接口設(shè)計、過程設(shè)計
-
軟件設(shè)計基本原理
-
抽象
:在軟件設(shè)計中,可以定出多個抽象級別,抽象層次從概要設(shè)計到詳細設(shè)計逐步降低。 -
模塊化
:把一個待開發(fā)的軟件分解成若干小的簡單的部分,自頂向下逐層把軟件劃分成若干模塊。 -
信息隱蔽
:一個模塊內(nèi)的信息,對于不需要這些信息的其他模塊來說不能訪問。 -
模塊獨立性
:每個模塊只完成獨立的子功能,并且與其他模塊的聯(lián)系少且接口簡單。模塊的獨立程度是評價設(shè)計好壞的重要度量標準。
-
-
軟件模塊獨立性
-
高內(nèi)聚性
:指一個模塊內(nèi)部各個元素間彼此結(jié)合的緊密程度 -
低耦合性
:指模塊間互相連接的緊密程度
耦合包括非直接耦合、數(shù)據(jù)耦合、標記耦合、控制耦合、外部耦合、公共耦合、內(nèi)容耦合(耦合度逐漸增強)
-
-
概要設(shè)計
的任務(wù):- 設(shè)計軟件系統(tǒng)結(jié)構(gòu)
- 數(shù)據(jù)結(jié)構(gòu)及數(shù)據(jù)庫設(shè)計
- 編寫概要設(shè)計文檔
- 概要設(shè)計文檔評審
-
概要設(shè)計的常用工具是
程序結(jié)構(gòu)圖(SC)
,其基本圖形:? 一般模塊
、〇→ 數(shù)據(jù)信息
、●→ 控制信息
image 詳細設(shè)計
的任務(wù):確立每個模塊的實現(xiàn)算法和局部數(shù)據(jù)結(jié)構(gòu),用適當方法表示算法和數(shù)據(jù)結(jié)構(gòu)的細節(jié)。-
詳細設(shè)計的常用工具:
- 圖形工具:程序流程圖、N-S圖、PAD、HIPO
- 表格工具:判定表
- 語言工具:PDL(偽碼)
-
程序流程圖的基本圖形:
→ 控制流
、? 加工步驟
、◇ 邏輯條件
image
軟件測試
軟件測試的
目的
:發(fā)現(xiàn)程序中的錯誤-
軟件測試的
準則
- 所有測試都應(yīng)追溯到用戶需求
- 在測試之前制定測試計劃,并嚴格執(zhí)行
- 充分注意測試中的群集現(xiàn)象
- 避免由程序的編寫者測試自己的程序
- 不可能進行窮舉測試
- 妥善保存測試分析報告,為維護提供方便
-
軟件測試的
類型
靜態(tài)測試:不實際運行軟件,通過人發(fā)揮思維優(yōu)勢發(fā)現(xiàn)程序的錯誤
動態(tài)測試:基于計算機的測試,是為了發(fā)現(xiàn)錯誤而執(zhí)行程序的過程
-
白盒測試:把測試對象看作一個打開的盒子,利用程序內(nèi)部的邏輯結(jié)構(gòu),對程序所有邏輯路徑進行測試
白盒測試針對程序的內(nèi)部邏輯結(jié)構(gòu)
其方法有
邏輯覆蓋測試
、基本路徑測試
-
黑盒測試:完全不考慮程序內(nèi)部的邏輯結(jié)構(gòu),只檢查程序是否能接收輸入數(shù)據(jù)而產(chǎn)生正確的輸出信息
黑盒針對程序的外部功能
其方法有
等價類劃分法
、邊界值分析法
、錯誤推測法
-
軟件測試的
步驟
- 單元測試:對軟件設(shè)計的最小單位——模塊進行測試,目的是發(fā)現(xiàn)各模塊內(nèi)部的錯誤。
- 集成測試:把模塊按照設(shè)計要求組裝起來的同時進行測試,目的是發(fā)現(xiàn)與接口有關(guān)的錯誤。
- 確認測試:驗證軟件的功能和性能是否滿足各種需求,以及軟件配置是否完全、正確。
- 系統(tǒng)測試:將軟件作為一個元素,與計算機系統(tǒng)其他元素組合在一起,進行集成測試。
程序調(diào)試
- 程序調(diào)試是對程序進行了成功的測試之后將進入程序調(diào)試,通常稱為Debug(排錯),主要在開發(fā)階段進行。
- 程序調(diào)試的
任務(wù)
:診斷和改正程序的錯誤 - 程序調(diào)試的
基本步驟
- 錯誤定位
- 修改設(shè)計和代碼,以排除錯誤
- 進行回歸測試,防止引進新的錯誤
- 程序調(diào)試的
方法
:強行排除法
、回溯法
、原因排除法
數(shù)據(jù)庫設(shè)計基礎(chǔ)
數(shù)據(jù)庫基本概念
數(shù)據(jù)(data):描述事物的符號記錄
-
數(shù)據(jù)庫(Database):數(shù)據(jù)的集合,具有
統(tǒng)一的結(jié)構(gòu)形式
并存放于統(tǒng)一的存儲介質(zhì)
內(nèi),是多種應(yīng)用數(shù)據(jù)的集成,并可被各個應(yīng)用程序所共享數(shù)據(jù)庫中的數(shù)據(jù)具有兩大特點:
“集成”
與“共享”
數(shù)據(jù)庫技術(shù)的根本目標:
解決數(shù)據(jù)共享問題
-
數(shù)據(jù)庫管理系統(tǒng)(DBMS):數(shù)據(jù)庫的機構(gòu),一種
系統(tǒng)軟件
,負責數(shù)據(jù)庫中的數(shù)據(jù)組織、數(shù)據(jù)操縱、數(shù)據(jù)維護、控制及保護和數(shù)據(jù)服務(wù),它是數(shù)據(jù)庫系統(tǒng)的核心
- 數(shù)據(jù)定義語言(DDL,Definition):數(shù)據(jù)模式定義、數(shù)據(jù)存取的物理構(gòu)建
- 數(shù)據(jù)操縱語言(DML,Manipulation):數(shù)據(jù)操縱(包括
查詢
與增、刪、改等操作) - 數(shù)據(jù)控制語言(DCL,Control):數(shù)據(jù)的完整性、安全性的定義與檢查、并發(fā)控制、故障恢復(fù)
- 數(shù)據(jù)查詢語言(DQL,Query):集數(shù)據(jù)定義、操縱和控制功能于一體的數(shù)據(jù)庫語言,是數(shù)據(jù)庫的核心語言, 具有操作所有關(guān)系型數(shù)據(jù)庫管理系統(tǒng)的能力
數(shù)據(jù)庫管理員(DBA):主要工作包括
數(shù)據(jù)庫規(guī)劃、設(shè)計、維護、監(jiān)視
,改善系統(tǒng)性能、提高系統(tǒng)效率
-
數(shù)據(jù)庫應(yīng)用系統(tǒng)(DBAS):利用數(shù)據(jù)庫系統(tǒng)進行應(yīng)用開發(fā)可構(gòu)成一個數(shù)據(jù)庫應(yīng)用系統(tǒng),它是專門為一類用戶設(shè)計的系統(tǒng),不具有通用性,由
數(shù)據(jù)庫系統(tǒng)
、應(yīng)用軟件
以及應(yīng)用界面
組成image -
數(shù)據(jù)庫系統(tǒng)(DBS)的組成
- 數(shù)據(jù)庫(數(shù)據(jù))
- 數(shù)據(jù)庫管理系統(tǒng)DBMS(軟件)
- 數(shù)據(jù)庫管理員DBA(人員)
- 軟件平臺
- 硬件平臺
-
數(shù)據(jù)庫系統(tǒng)的特點:高集成性、
高共享低冗余
、物理獨立性與邏輯獨立性
、統(tǒng)一管理與控制數(shù)據(jù)獨立性是數(shù)據(jù)與程序間的互不依賴性,即數(shù)據(jù)的邏輯結(jié)構(gòu)、存儲結(jié)構(gòu)與存取方式的改變不會影響應(yīng)用程序,==在數(shù)據(jù)系統(tǒng)中,數(shù)據(jù)的物理結(jié)構(gòu)并不一定與邏輯結(jié)構(gòu)一致==
邏輯獨立性——指用戶的應(yīng)用程序與數(shù)據(jù)庫的邏輯結(jié)構(gòu)是相互獨立的,即當數(shù)據(jù)的邏輯結(jié)構(gòu)改變時,用戶程序也可以不變,當數(shù)據(jù)庫中數(shù)據(jù)總體邏輯結(jié)構(gòu)發(fā)生變化,而應(yīng)用程序不受影響
-
數(shù)據(jù)庫系統(tǒng)的內(nèi)部結(jié)構(gòu)體系
- 三級模式
- 概念模式(概念數(shù)據(jù)庫):全局數(shù)據(jù)邏輯結(jié)構(gòu)的描述,即全體用戶的公共數(shù)據(jù)視圖
- 外模式(用戶數(shù)據(jù)庫):又稱子模式或用戶模式,即用戶的數(shù)據(jù)視圖,反映用戶對數(shù)據(jù)的要求
- 內(nèi)模式(物理數(shù)據(jù)庫):
給出數(shù)據(jù)庫物理存儲結(jié)構(gòu)與存取方法
,反映數(shù)據(jù)在計算機物理結(jié)構(gòu)上的實際存儲形式,如數(shù)據(jù)存儲的文件結(jié)構(gòu)、索引
、集簇及hash等存取方式與存取路徑
- 二級映射
- 外模式/概念模式的映射:實現(xiàn)了外槿式到概念模式之間的相互轉(zhuǎn)換(當邏輯模式發(fā)生變化時,通過修改相應(yīng)的外模式/邏輯模式映射,使得用戶所使用的那部分外模式不變,從而應(yīng)用程序不必修改,保證數(shù)據(jù)具有較高的邏輯獨立性)
- 概念模式/內(nèi)模式的映射:實現(xiàn)了概念模式到內(nèi)模式之間的相互轉(zhuǎn)換(當數(shù)據(jù)庫的存儲結(jié)構(gòu)發(fā)生變化時,通過修改相應(yīng)的概念模式/內(nèi)模式的映射,使得數(shù)據(jù)庫的邏輯模式不變,其外模式不變,應(yīng)用程序不用修改,從而保證數(shù)據(jù)具有很高的物理獨立性)
image三級模式反映了模式的三個不同環(huán)境及其他們的不同要求
兩級映射保證了數(shù)據(jù)庫中數(shù)據(jù)具有較高的邏輯獨立性和物理獨立性
- 三級模式
-
數(shù)據(jù)管理發(fā)展的三個階段:
人工管理 → 文件系統(tǒng) → 數(shù)據(jù)庫系統(tǒng)
在數(shù)據(jù)管理技術(shù)發(fā)展過程中,文件系統(tǒng)與數(shù)據(jù)庫系統(tǒng)的主要區(qū)別是數(shù)據(jù)庫系統(tǒng)具有
特定的數(shù)據(jù)模型
數(shù)據(jù)模型
數(shù)據(jù)模型:數(shù)據(jù)庫設(shè)計的
核心
-
數(shù)據(jù)模型的三要素
數(shù)據(jù)結(jié)構(gòu)
:描述數(shù)據(jù)的類型、內(nèi)容、性質(zhì)以及數(shù)據(jù)間的聯(lián)系數(shù)據(jù)操作
:描述在相應(yīng)數(shù)據(jù)結(jié)構(gòu)上的操作類型與操作方式數(shù)據(jù)約束
:描述數(shù)據(jù)結(jié)構(gòu)內(nèi)數(shù)據(jù)間的語法、語義聯(lián)系,它們之間的制約與依存關(guān)系用計算機表示每一個實體時,由其所有信息項組成一條
記錄
,相應(yīng)于屬性的數(shù)據(jù)稱為數(shù)據(jù)項
實體內(nèi)部的聯(lián)系反映在數(shù)據(jù)上是數(shù)據(jù)項之間的聯(lián)系,實體間的聯(lián)系反映在數(shù)據(jù)上是記錄間的聯(lián)系
實體與屬性有“型“與“值”之分,型是指結(jié)構(gòu)(對應(yīng)行),值是指結(jié)構(gòu)約束下的具體取值(對應(yīng)列) -
數(shù)據(jù)模型按不同的應(yīng)用層次
- 概念數(shù)據(jù)模型(概念模型):E-R模型、謂詞模型
- 邏輯數(shù)據(jù)模型(數(shù)據(jù)模型):層次模型、網(wǎng)狀模型、關(guān)系模型
- 物理數(shù)據(jù)模型(物理模型):面向計算機物理結(jié)構(gòu)的模型
概念數(shù)據(jù)模型——用于對客觀世界中復(fù)雜事物的結(jié)構(gòu)及它們之間的聯(lián)系進行描述,與具體的數(shù)據(jù)庫管理系統(tǒng)無關(guān),與具體的計算機平臺無關(guān)
邏輯數(shù)據(jù)模型——面向數(shù)據(jù)庫系統(tǒng)、
考慮數(shù)據(jù)庫實現(xiàn)
的模型,著重于在數(shù)據(jù)庫系統(tǒng)一級的實現(xiàn)
數(shù)據(jù)模型實例
-
E-R模型:實體聯(lián)系模型,由實體、聯(lián)系、屬性組成
imageE-R模型圖形符號:
? 實體
、〇 屬性
、◇ 聯(lián)系
、— 聯(lián)接關(guān)系
實體集間的相互關(guān)系:
一對一、一對多、多對一、多對多
-
層次模型:最早發(fā)展起來的數(shù)據(jù)庫模型,如
樹
image層次模型的特點:
- 每棵樹有且僅有一個無雙親結(jié)點,稱為根
- 樹中除根外所有結(jié)點有且僅有一個雙親
網(wǎng)狀模型:一個不加任何條件限制的
無向圖
- 關(guān)系模型:以
二維表
為基本結(jié)構(gòu)所建立的模型,由表框架及表元組構(gòu)成,表框架由n個命名的屬性組成,n稱為屬性元數(shù)
層次型、網(wǎng)狀型、關(guān)系型數(shù)據(jù)庫的劃分原則是
數(shù)據(jù)之間的聯(lián)系方式
二維表
-
二維表的概念:用來表示實體間聯(lián)系,每一個二維表稱為一個
關(guān)系
,為了建立一個關(guān)系,首先要指定關(guān)系的屬性屬性:二維表中的一
列
,每個屬性的取值范圍稱為值域(一個關(guān)系的屬性名表稱為該關(guān)系的關(guān)系模式
,其記法為<關(guān)系名>(<屬性名1>,<屬性名2>,…,<屬性名n>)
)元組:二維表中的一
行
(各元組的每一個分量
是表示最小單位
的基本數(shù)據(jù)項,分量不可再分)主鍵:也稱
關(guān)鍵字
、主碼
,其值能唯一
標識表中一個元組,主碼屬性不能取空-
外鍵:也稱
外部關(guān)鍵字
,在一個關(guān)系中含有與另一個關(guān)系的關(guān)鍵字相對應(yīng)的屬性組,表的外鍵是另一表的主鍵,外鍵可重復(fù)、可空值例:在關(guān)系A(chǔ)(S,SN,D)和B(D,CN,NM)中,A的主鍵是S,B的主鍵是D,則D是A的外鍵
-
關(guān)系中的數(shù)據(jù)約束
-
實體完整性約束
:要求關(guān)系的主鍵中屬性值不能為空值,為主鍵是唯一決定元組的,若屬性為空值則其唯一性就無意義了,即一個關(guān)系中應(yīng)有一個或多個
候選關(guān)鍵字 -
參照完整性約束
:這是關(guān)系之間相互關(guān)聯(lián)的基本約束,不允許關(guān)系引用不存在的元組
,即在關(guān)系中的外鍵要么是所關(guān)聯(lián)關(guān)系中實際存在的元組,要么為空值 -
用戶定義的完整性約束
:反映某一具體應(yīng)用所涉及的數(shù)據(jù)必須滿足的語義要求,例如某個屬性的取值范圍在0-100之間
-
-
關(guān)系的特點
- 關(guān)系必須規(guī)范化
- 在同一個關(guān)系中不能出現(xiàn)相同的屬性名
- 關(guān)系中不能有相同的元組
- 在一個關(guān)系中
元組的次序
無關(guān)緊要,任意交換兩行位置并不影響數(shù)據(jù)的實際含義 - 在一個關(guān)系中
屬性的次序
無關(guān)緊要,任意交換兩列位置也不影響數(shù)據(jù)的實際含義
關(guān)系代數(shù)
-
關(guān)系模型的基本操縱:增加、刪除、修改、查詢
-
并 R∪S
:將兩個以上表的行并到一起,去除相同的行 -
差 R-S
:在關(guān)系R中減去關(guān)系S共有的行,保留的是S中沒有的行,運算時依次將兩個表的一行一行相減 -
笛卡兒積 R×S
:行與列重新組合 -
投影 π
:從所有字段中選取一部分字段及其值進行縱向操作(選列) -
選擇 σ
:從二維表的全部記錄中把那些符合指定條件的記錄挑出來(選行) -
連接 R?S(A?B)
:將兩個關(guān)系模式拼接成一個更寬的關(guān)系模式,在新的關(guān)系上做選擇操作,生成的新關(guān)系中包含滿足聯(lián)接條件的元組 -
交 R∩S
:求兩個以上表的公共行,前提是參與運算的表的結(jié)構(gòu)相同 -
除 T=R÷S
(笛卡兒反運算):行與列重新拆分,剩下的合并相同行 -
自然連接 R?S
:一種特殊的等值鏈接,把對應(yīng)字段取值相等的元組連接成一個新的表,剩下的去掉屬性重復(fù)的列,要求R和S含有一個或多個共有的屬性
imageimage說明:
笛卡爾積——若R有m個元組,S有n個元組,則R×S有m×n個元組
投影——C和A為屬性名,說明要選擇的列
選擇——B>'4'是選擇語句的條件,對關(guān)系做水平分割,選擇符合條件的元組
imageimageimageimageimage交運算
能不改變關(guān)系表中的屬性個數(shù)但能減少元組個數(shù) -
數(shù)據(jù)庫設(shè)計與管理
-
數(shù)據(jù)庫設(shè)計:設(shè)計一個能滿足用戶要求,性能良好的數(shù)據(jù)庫,它是
數(shù)據(jù)庫應(yīng)用系統(tǒng)中的核心問題
- 基本任務(wù):根據(jù)用戶對象的信息需求、處理需求和數(shù)據(jù)庫的支持環(huán)境設(shè)計出數(shù)據(jù)模式
- 兩種方法
- 面向數(shù)據(jù)的方法:以信息需求為主,兼顧處理需求(主流)
- 面向過程的方法:以處理需求為主,兼顧信息需求
-
數(shù)據(jù)庫設(shè)計的步驟:(一般采用生命周期法)
- 需求分析階段——包括信息/處理/安全性/完整性的需求,建立數(shù)據(jù)字典
-
概念設(shè)計階段——分析數(shù)據(jù)間內(nèi)在語義的關(guān)聯(lián)建立抽象模型,
用E-R圖來描述信息結(jié)構(gòu)
但不涉及信息在計算機中的表示
-
邏輯設(shè)計階段——
把E-R圖轉(zhuǎn)換為關(guān)系模式
(實體與聯(lián)系表示成關(guān)系
,屬性轉(zhuǎn)換成關(guān)系中的屬性
) -
物理設(shè)計階段——對數(shù)據(jù)庫內(nèi)部物理結(jié)構(gòu)作調(diào)整并選擇合理的存取路徑,以提數(shù)據(jù)庫訪問速度及有效利用存儲空間,包括優(yōu)化數(shù)據(jù)庫系統(tǒng)查詢性能的
索引設(shè)計
、集簇設(shè)計
和分區(qū)設(shè)計
- 編碼階段
- 測試階段
- 運行階段
- 進一步修改階段
在數(shù)據(jù)庫設(shè)計中最多采用
前四個階段
,并且重點以數(shù)據(jù)結(jié)構(gòu)與模型的設(shè)計為主線 -
數(shù)據(jù)庫管理
- 數(shù)據(jù)庫的建立
- 數(shù)據(jù)庫的調(diào)整
- 數(shù)據(jù)庫的重組
- 數(shù)據(jù)庫安全性控制與完整性控制
- 數(shù)據(jù)庫的故障恢復(fù)
- 數(shù)據(jù)庫監(jiān)控