第一篇:人工智能教案04章 4.7 面向?qū)ο蟮谋硎痉?/a>
4.7 面向?qū)ο蟮谋硎痉?/p>
人工智能的語言有Lisp(函數(shù)型)、Prolog(邏輯型)和SmallTalk(面向?qū)ο笮停mallTalk是基于對知識的面向?qū)ο蟊硎镜摹?/p>
1960年,人工智能研究的先驅(qū)者之一,美國的McCarthy推出了他設(shè)計的語言LISP。LISP是LISt Processor(表處理器)的意思。它之前的計算機(jī)高級語言如Fortran主要用于數(shù)值計算,而LISP則主要用于符號計算,它的主要數(shù)據(jù)結(jié)構(gòu)是表。LISP至今仍在廣泛使用,很大部分的人工智能程序是用LISP寫的,她為人工智能的發(fā)展作出了不可磨滅的貢獻(xiàn)。
Prolog(PROgramming in LOGic)采用的是用邏輯方法作程序設(shè)計的思想,它把一階謂詞演算中的說明性命題賦予過程性的解釋,從而使說明性的命題變成可執(zhí)行的過程。
SMALLTALK是面向?qū)ο蟮某绦蛟O(shè)計語言中的主要代表。它由Alan Kay設(shè)計出來。整個系統(tǒng)包含四個組成部分:語言核心,編程風(fēng)范,編程系統(tǒng)和界面模型。SmallTalk程序以面向?qū)ο鬄榛A(chǔ),對象組織成類,凡是能被計算機(jī)處理的數(shù)據(jù)都可以定義為對象。類構(gòu)成繼承的層次體系,每個類可以包含一些方法,這些方法可以被子類繼承也可以不被繼承,類之間的操作通過傳遞消息實現(xiàn)。
對象是由一組數(shù)據(jù)和與該組數(shù)據(jù)相關(guān)的操作構(gòu)成的實體。在面向?qū)ο蟊硎局蓄惡皖惱^承是一組重要概念。類由一組變量和一組操作組成,它描述了一組具有相同屬性和操作的對象。每一個對象都屬于某一類,每個對象都可由相關(guān)的類生成,換言之,對象是類的實例。一個類可以通過繼承擁有另一類的全部變量和操作,繼承是面向?qū)ο蟊硎痉ǖ闹饕评硇问健M瑫r,由于一個事物的描述都集中在一個類中,又體現(xiàn)了類的封裝性。繼承和封裝是面向?qū)ο蟮膬纱筇攸c。
第二篇:人工智能教案04章 4.2 表示觀
4.2 表示觀
任何科學(xué)研究都是有其指導(dǎo)思想、觀點的,在一定的思想指導(dǎo)下提出一系列的方法體系。知識表示也是同樣。人工智能是處理知識的科學(xué),所以對人工智能研究首先從知識表示開始,而指導(dǎo)知識表示的思想觀點稱為表示觀。
不同的表示觀規(guī)定了智能模擬研究的不同側(cè)面。各種表示觀是從不同角度及不同描述層次解釋表示的內(nèi)涵時產(chǎn)生的不同的結(jié)論。
表示觀:對于“什么是表示”這一基本問題的不同理解和采用的方法論。4.2.1 認(rèn)識論表示觀
認(rèn)識論表示觀認(rèn)為表示是對自然世界的表述,表示自身不顯示任何智能行為。其唯一的作用就是攜帶知識。這意味著表示可以獨立于啟發(fā)式來研究。
認(rèn)識論表示觀的思想最早出現(xiàn)于J.McCarthy與P.Hayes的一篇文章中。此主張的核心是將AI問題分成兩部分:認(rèn)識論部分與啟發(fā)式部分。認(rèn)為AI的核心任務(wù)就是“常識”形式化。其討論的主要問題:
◇“知識的不完全性”是認(rèn)識論學(xué)派討論最多的情況。推理者的知識是不完全,但卻是一致的,其要點是在保持知識一致性的前提下得出新的結(jié)論。
例如對知識“鳥會飛”,但是“鴕鳥”并不會飛。
◇“知識不一致性”是常識的另一類性質(zhì)。
例如教友派教徒是和平主義者,共和黨是好戰(zhàn)分子。已知某教授是教友派教徒,且是共和黨人。問他是和平主義者嗎?
◇“知識不確定性”是更復(fù)雜的常識問題。盡管Fuzzy、可信度理論、人工神經(jīng)網(wǎng)絡(luò)等豐富了對常識的不確定性研究方法。但還不能顯現(xiàn)地表示“可廢棄性”這個重要特征。大大限制了對智能型為“靈活性”的描述。因此,在復(fù)雜問題求解釋,集成幾種方法是有吸引力的想法。
◇“常識的相對性”目前在AI中研究甚少。理論集合是有限的,常識的集合是無限的。
關(guān)于常識的研究非常困難。這種困難性首先在于常識知識難以形式化,因為常識知識實在是太多了。Doug Lenat在考慮建立一個人類級智能系統(tǒng)所需要的知識的數(shù)量時,他認(rèn)為大約需要100萬到1000萬個事實。其次,沒有很好的定義使我們能控制獨立于其他部分的邊界。在概念化一個常識時,可能牽涉到太多的實體、功能和關(guān)系,使得我們無法確定什么時候它已經(jīng)“概念化”好了。
認(rèn)識論的特點:
◇ 表示是在特定環(huán)境下對世界觀察的結(jié)果;
◇ 強調(diào)自然世界現(xiàn)象與表示之間的因果關(guān)系;
◇ 認(rèn)為啟發(fā)式方法不屬于表示研究的內(nèi)容,認(rèn)為對常識知識的形式化是非常重要的任務(wù)。4.2.2 本體論表示觀
本體論表示觀認(rèn)為表示是對自然世界的一種近似,它規(guī)定了看待自然世界的方式。即一個約定的集合。表示只是描述了關(guān)心的一部分,逼真是不可能的。
該觀點是由D.Lenta提出的。該觀點認(rèn)為表示主要解決的問題是:
◇ 表示需對世界的某個部分給與特別的注意(聚集),而對世界的另外部分衰減,以求達(dá)到有效求解。
◇ 對世界可以采用不同的方式來記述。注重的不是“其語言形式,而是其內(nèi)容”。此內(nèi)容不是某些特定領(lǐng)域的特殊的專家知識,而是自然世界中那些具有普通意義的一般知識。
◇ 推理是表示觀中不可缺少的一部分。表示研究應(yīng)與啟發(fā)式搜索聯(lián)系起來。認(rèn)為不考慮推理的純粹表示是不存在的。
◇ 計算效率無疑是表示的核心問題之一。即有效地知識組織及與領(lǐng)域有關(guān)的啟發(fā)式知識是其提高計算效率的手段。
計算效率:不同于以前的多用計算復(fù)雜性來衡量一種智能系統(tǒng)的方法,而采用計算困難度來衡量。
一般情況下,計算復(fù)雜性是實例的算法在極端情況下的衡量的特性。實例是人造的,分布往往不平衡,而且,實例問題是能解決的。但是,實際問題往往不能解決。計算困難度主要討論:計算復(fù)雜性的分布與研究困難有多大的問題。如對大多數(shù)有價值的實例遇到難以克服的計算復(fù)雜性問題,就研究如何克服。
◇ 哪種語言作為表示形式不是最重要的。特別強調(diào)表示不是數(shù)據(jù)。
本體論的特點:
◇ 本體論的約定具有相對性。本體論研究者認(rèn)為在智能系統(tǒng)中,往往需要分成不同的層次。每個層次具有其本體論的約定。這對專家系統(tǒng)一類的問題已被證明是有效的。
如電子線路分析。對電子線路的分析,如果從“電路是相互連接的實體,信號順著聯(lián)線瞬時地流動”這個觀點,則存在著一種本體論。而如果從電動力學(xué)來看,則存在另一種本體論。
◇ 如要建立一個具有普通意義的帶有一般知識的知識庫,將會遇到“相對性”的困難。因為,如果站在不同的科學(xué)深度將導(dǎo)致不同的本體論約定。那么,什么是其最終的本體論約定哪?這是本體論表示觀至今未能解決的問題。
Minsky的說明是有代表性的。“在解釋非常復(fù)雜的問題時,我們將不得不同時使用幾個完全不同的表示。這是因為,每一種特別的表示均有其自身的優(yōu)點與缺陷。對涉及我們稱為常識的那些東西時,沒有一種表示可以說是足夠的。”采用集成的方法來克服理論不足所帶來的困難,不僅對“本體論”表示觀是必然的。而且對其它兩種表示觀也是必然的。4.2.3 知識工程表示觀
最常用的表示法都反映了知識工程表示觀。其特點是:
◇ 將表示理解為一類數(shù)據(jù)結(jié)構(gòu)(邏輯)及在其上的操作。
◇ 對知識的內(nèi)容更強調(diào)與領(lǐng)域的相關(guān)性,適合于這個領(lǐng)域的,來自領(lǐng)域?qū)<医?jīng)驗知識是討論的重點。
這種觀點最大的特色就是強調(diào)工程實現(xiàn)性,表示方法必須在實際的應(yīng)用中得到實現(xiàn)。同時,這種觀點所強調(diào)的知識領(lǐng)域有關(guān)性和對知識表示形式的選擇性與本體論有著顯著的差別。
一般地說,認(rèn)識論表示觀強調(diào)知識的某種存在性研究,本體論表示觀更多地考慮知識的構(gòu)造性研究,而知識工程表示觀則以知識系統(tǒng)的可實現(xiàn)性作為重點。顯然,對任意一門科學(xué)存在性、構(gòu)造性及可實現(xiàn)性均是重要的,簡單地論斷某種表示觀是否合適是錯誤的。
注意:無論持何種表示觀的AI研究者都認(rèn)為,表示是刻畫智能行為的理論。這表示無論采用什么樣的方式(包括數(shù)學(xué)的或程序的)所建立的表示方法和立足于什么樣的表示觀,均需要滿足與智能現(xiàn)象一致的條件。鑒于智能現(xiàn)象的復(fù)雜性,采用什么表示觀,應(yīng)當(dāng)取決于所面臨的問題。籠統(tǒng)地強調(diào)好的是沒有什么意義的。近幾年一些研究者主張各種表示觀應(yīng)該互相滲透。
第三篇:java面向?qū)ο蟪绦蛟O(shè)計教案
武漢大學(xué)珞珈學(xué)院 系/教研室 Java 面 向 對 象 程 序 設(shè) 計 課 教 案
主講教師:熊春秀 編寫時間:2011-4-30
第一章:概述
第 1、2 節(jié):面向?qū)ο蟮幕靖拍睢⒚嫦驅(qū)ο蟪绦蛟O(shè)計概述 授課時間:2011-2-
22、23
計劃學(xué)時數(shù):1 教學(xué)任務(wù)與目的:讓學(xué)生理解面向?qū)ο蟮幕靖拍?教學(xué)重點:掌握面向?qū)ο蟮幕靖拍?教學(xué)難點:理解面向?qū)ο蟪绦蛟O(shè)計的方法 教學(xué)方法:多媒體+板書 參考書目:《面向?qū)ο蟪绦蛟O(shè)計導(dǎo)論》,[美]C.Thomas wu著,電子工業(yè)出版社 專業(yè)詞匯:Java虛擬機(jī)、Applet程序 備注
第二章:Java特點及運行環(huán)境
第 1、2、3 節(jié):Java語言特點、Java應(yīng)用程序及運行環(huán)境、Java Applet程序及運行環(huán)境 授課時間:2011-2-
22、23
計劃學(xué)時數(shù):3 教學(xué)任務(wù)與目的:讓學(xué)生學(xué)會JDK的下載、安裝與環(huán)境配置。教學(xué)重點:掌握編譯和執(zhí)行Java程序的基本步驟
教學(xué)難點:理解Java程序的入口并能夠通過命令行傳遞參數(shù) 教學(xué)方法:多媒體+板書 參考書目:《面向?qū)ο蟪绦蛟O(shè)計導(dǎo)論》,[美]C.Thomas wu著,電子工業(yè)出版社 專業(yè)詞匯:JDK、lib、bin 備注 第三章:Java語言基礎(chǔ)
第 1、2 節(jié):Java程序的構(gòu)成、數(shù)據(jù)類型、表達(dá)式以及流程控制語句 授課時間:2011-3-
1、2
計劃學(xué)時數(shù):3 教學(xué)任務(wù)與目的:讓學(xué)生學(xué)會Java基本的數(shù)據(jù)類型和表示方法、數(shù)值類型的運算、邏輯運算和比較、條件執(zhí)行語句(包括三種條件語句和switch語句)、循環(huán)控制語句(包括for、while、do while循環(huán)及相應(yīng)的輔助語句)、字符串類String和BufferString以及數(shù)組的聲明及使用。
教學(xué)重點:掌握J(rèn)ava基本的數(shù)據(jù)類型和表示方法
教學(xué)難點:理解Java程序的循環(huán)控制語句(包括for、while、do while循環(huán)及相應(yīng)的輔助語句)
教學(xué)方法:多媒體+板書 參考書目:《Java語言與面向?qū)ο蟪绦蛟O(shè)計》,印旻編著,清華大學(xué)出版社 專業(yè)詞匯:變量、數(shù)據(jù)類型、循環(huán)控制語句 備注 第三章:Java語言基礎(chǔ) 第 3 節(jié):Java與C比較
授課時間:2011-3-
8、9
計劃學(xué)時數(shù):3 教學(xué)任務(wù)與目的:讓學(xué)生在C語言的基本上進(jìn)一步學(xué)習(xí)Java語言。教學(xué)重點:掌握J(rèn)ava語言與C語言的區(qū)別與聯(lián)系。教學(xué)難點:理解Java語言在C語言上的改進(jìn)。教學(xué)方法:多媒體+板書 參考書目:《Java2參考大全(第四版)》,[美]Herbert Schildt著,張玉清、吳浦峰、尚勇等譯,清華大學(xué)出版社。專業(yè)詞匯:Java、C 備注 第四章:抽象、封裝與類
第 1 節(jié):抽象、封裝與Java類的概念
授課時間:2011-3-
15、16
計劃學(xué)時數(shù):3 教學(xué)任務(wù)與目的:讓學(xué)生學(xué)會面向?qū)ο蟮幕咎卣鳌⒄莆杖绾味x一個類以及如何生成對象、深入掌握方法的定義及技巧、深入掌握類的訪問權(quán)限與封裝機(jī)制、深入掌握包的定義與包的使用方法。
教學(xué)重點:掌握類的定義與對象的生成。教學(xué)難點:理解類的抽象與封裝機(jī)制。教學(xué)方法:多媒體+板書 參考書目:《Java2 實用教程》,耿祥義、張躍平編著,清華大學(xué)出版社。專業(yè)詞匯:抽象、封裝、類 備注 第四章:抽象、封裝與類 第 2 節(jié):系統(tǒng)定義的類
授課時間:2011-3-
22、23
計劃學(xué)時數(shù):3 教學(xué)任務(wù)與目的:讓學(xué)生學(xué)會使用系統(tǒng)定義的類,并掌握與用戶自定義類的區(qū)別。教學(xué)重點:掌握如何定義所需要的類。
教學(xué)難點:熟悉Java平臺定義了哪些經(jīng)常要用到、而且滿足我們需要的類。教學(xué)方法:多媒體+板書 參考書目:《Java2 實用教程》,耿祥義、張躍平編著,清華大學(xué)出版社。專業(yè)詞匯:系統(tǒng)定義的類、用戶自定義類 備注 第四章:抽象、封裝與類
第 3 節(jié):類、域和方法的修飾符
授課時間:2011-3-
29、30
計劃學(xué)時數(shù):3 教學(xué)任務(wù)與目的:讓學(xué)生學(xué)會類的聲明。
教學(xué)重點:掌握如何定義類的修飾和方法的修飾符。教學(xué)難點:熟悉類的變量的定義與使用方法。教學(xué)方法:多媒體+板書 參考書目:《Java2 實用教程》,耿祥義、張躍平編著,清華大學(xué)出版社。專業(yè)詞匯:成員變量、類變量、成員方法、類方法 備注 第五章:繼承與多態(tài)
第 1、2 節(jié):Java的繼承與派生、域的繼承與隱藏 授課時間:2011-4-
5、6
計劃學(xué)時數(shù):3 教學(xué)任務(wù)與目的:讓學(xué)生全面掌握面向?qū)ο蟮幕咎卣鳌⒄莆杖绾问褂美^承性來到達(dá)軟件的重用、深入掌握繼承過程中域的隱藏和方法的覆蓋技巧。教學(xué)重點:掌握如何使用繼承性來到達(dá)軟件的重用。教學(xué)難點:熟悉繼承過程中域的隱藏和方法的覆蓋技巧。教學(xué)方法:多媒體+板書 參考書目:《Java2 實用教程》,耿祥義、張躍平編著,清華大學(xué)出版社。專業(yè)詞匯:繼承派生、域、隱藏 備注 第五章:繼承與多態(tài)
第 3、4 節(jié):方法的繼承、重載與覆蓋、this與super、構(gòu)造函數(shù)的繼承與重載 授課時間:2011-4-
12、13
計劃學(xué)時數(shù):3 教學(xué)任務(wù)與目的:讓學(xué)生通過繼承可以更有效地組織程序結(jié)構(gòu),明確類之間的關(guān)系,并充分利用已有的類來創(chuàng)建新類,通過繼承可以實現(xiàn)代碼的重用,以完成更復(fù)雜的設(shè)計、開發(fā)。教學(xué)重點:掌握類的重載與覆蓋的區(qū)別與聯(lián)系。教學(xué)難點:熟悉類的重載與覆蓋使用方法。教學(xué)方法:多媒體+板書 參考書目:《Java語言與面向?qū)ο蟪绦蛟O(shè)計》,印旻編著,清華大學(xué)出版社。專業(yè)詞匯:繼承、重載、覆蓋、this、super 備注 第五章:繼承與多態(tài)
第 5、6 節(jié):多態(tài)性的實現(xiàn)、接口聲明與實現(xiàn) 授課時間:2011-4-
19、20
計劃學(xué)時數(shù):3 教學(xué)任務(wù)與目的:讓學(xué)生深入掌握抽象類和抽象方法的定義,掌握多態(tài)通過統(tǒng)一多個相關(guān)類的對外接口,在運行時根據(jù)不同的情況執(zhí)行不同的操作,提高類的抽象度和靈活性,深入掌握接口的定義和使用技巧。
教學(xué)重點:熟悉多態(tài)性實現(xiàn)的兩種方式以及接口的實現(xiàn)。教學(xué)難點:熟悉多態(tài)性與接口的實現(xiàn)方法。教學(xué)方法:多媒體+板書 參考書目:《Java語言與面向?qū)ο蟪绦蛟O(shè)計》,印旻編著,清華大學(xué)出版社。專業(yè)詞匯:多態(tài)性、接口 備注 第六章:工具類與算法
第 1、2 節(jié):語言基礎(chǔ)類庫、Applet類與小程序的基本原理 授課時間:2011-4-
26、27
計劃學(xué)時數(shù):3 教學(xué)任務(wù)與目的:深入了解Applet生命周期的主要方法和特點、熟練掌握Applet程序的編寫方法、深入了解Applet的安全機(jī)制及其合理運用。教學(xué)重點:熟練掌握Applet程序的編寫方法。
教學(xué)難點:深入了解Applet的安全機(jī)制及其合理運用。教學(xué)方法:多媒體+板書 參考書目:《Java語言與面向?qū)ο蟪绦蛟O(shè)計》,印旻編著,清華大學(xué)出版社。專業(yè)詞匯:Applet、生命周期 備注 第六章:工具類與算法
第 3、4 節(jié):數(shù)組、字符串、常用算法
授課時間:2011-5-
3、4
計劃學(xué)時數(shù):3 教學(xué)任務(wù)與目的:讓學(xué)生學(xué)會字符串類String和BufferString、數(shù)組的聲明及使用。教學(xué)重點:熟練掌握字符串與數(shù)組的使用方法。教學(xué)難點:深入了解數(shù)組的使用方法。教學(xué)方法:多媒體+板書 參考書目:《Java語言與面向?qū)ο蟪绦蛟O(shè)計》,印旻編著,清華大學(xué)出版社。專業(yè)詞匯:數(shù)組、字符串 備注 第七章:用戶圖形界面的設(shè)計
第 1、2 節(jié):用戶自定義成分、事件驅(qū)動設(shè)計 授課時間:2011-5-
10、11
計劃學(xué)時數(shù):3 教學(xué)任務(wù)與目的:讓學(xué)生學(xué)會使用面向?qū)ο蟮某绦蛟O(shè)計方法構(gòu)建圖形用戶界面、深入了解抽象窗口工具包(AWT)、掌握事件處理基本原理和方法。教學(xué)重點:熟練掌握圖形用戶界面的開發(fā)方法。教學(xué)難點:深入了解圖形界面的各種事件。教學(xué)方法:多媒體+板書 參考書目:《Java語言與面向?qū)ο蟪绦蛟O(shè)計》,印旻編著,清華大學(xué)出版社。專業(yè)詞匯:AWT、GUI 備注 第七章:用戶圖形界面的設(shè)計
第 3、4 節(jié):GUI對象,包括:按鈕、文本框、鼠標(biāo)、鍵盤等事件的處理、布局設(shè)計 授課時間:2011-5-
17、18
計劃學(xué)時數(shù):3 教學(xué)任務(wù)與目的:讓學(xué)生深入了解GUI構(gòu)件及掌握布局控制方法、熟練掌握菜單和對話框、掌握簡單繪圖方法。
教學(xué)重點:熟練使用Java語言提供的布局管理器來管理組件在容器中的布局。教學(xué)難點:深入了解組件在程序中安排中位置和大小使用方法。教學(xué)方法:多媒體+板書 參考書目:《Java語言與面向?qū)ο蟪绦蛟O(shè)計》,印旻編著,清華大學(xué)出版社。專業(yè)詞匯:布局管理器、容器 備注 第八章:Java高級編程
第 1、2、3節(jié):異常處理、多線程機(jī)制、Java程序?qū)W(wǎng)上資源的訪問 授課時間:2011-5-
24、25
計劃學(xué)時數(shù):3 教學(xué)任務(wù)與目的:讓學(xué)生深入理解多線程的基本概念、熟練掌握創(chuàng)建線程的兩種基本方法、熟練處理線程的同步問題和死鎖問題、深入理解異常的基本概念、熟悉和掌握J(rèn)ava平臺定義異常類、熟練掌握創(chuàng)建自定義異常類的方法。教學(xué)重點:熟練掌握創(chuàng)建線程的兩種基本方法。教學(xué)難點:深入了解線程的同步問題和死鎖問題。教學(xué)方法:多媒體+板書 參考書目:《Java語言與面向?qū)ο蟪绦蛟O(shè)計》,印旻編著,清華大學(xué)出版社。專業(yè)詞匯:同步、死鎖、多線程、異常
第四篇:《C++面向?qū)ο蟪绦蛟O(shè)計》教案
《面向?qū)ο蟪绦蛟O(shè)計》課程教案
課程編號:08051230
課程名稱:面向?qū)ο蟪绦蛟O(shè)計(Object-oriented Programming)學(xué)時:72學(xué)時,其中理論學(xué)時54,上機(jī)學(xué)時18 學(xué)分:3.5開課部門:數(shù)學(xué)與計算機(jī)科學(xué)學(xué)院 開課教研室:計算機(jī)科學(xué) 開課教師:雷小園 開課學(xué)期:第7學(xué)期
授課班級:04信計
先修課程:C語言程序設(shè)計
考核要求:考試,平時10%,實驗20%,考試70% 使用教材:
《C++面向?qū)ο蟪绦蛟O(shè)計教程(第2版)》,陳維興,清華大學(xué)出版社,2004年 《C++面向?qū)ο蟪绦蛟O(shè)計習(xí)題解答與實驗指導(dǎo)》,陳維興,清華大學(xué)出版社,2004年
教學(xué)目的與要求:
《面向?qū)ο蟪绦蛟O(shè)計》是一門計算機(jī)及相關(guān)專業(yè)的重要的專業(yè)基礎(chǔ)課。本課程講述C++語言面向?qū)ο蟮幕咎匦裕悺ο蟆⑴缮悺⒗^承、運算符重載、多態(tài)性、虛函數(shù)、函數(shù)模板、類模板、輸入輸出、流類庫、文件等,使學(xué)生掌握面向?qū)ο蟪绦蛟O(shè)計的基本概念和基本方法,能運用C++語言進(jìn)行基本的面向?qū)ο蟪绦蛟O(shè)計。
教學(xué)方法:
采用板書講解C++程序設(shè)計,再加以上機(jī)練習(xí)C++編程。
3章 類和對象
3.1 類與對象的基本概念
3.2 構(gòu)造函數(shù)與析構(gòu)函數(shù)
例:點類 Point class Point { private: int x,y;public: Point(){};Point(int xx, int yy){ x=xx;y=yy;} Point(Point &p){ x=p.x;y=p.y;} int GetX()const { return x;} int GetY()const { return y;} void SetXY(int xx, int yy){ x=xx;y=yy;} void Show();};void Point::Show(){ cout<<“X: ”< 例:人類 Person class Person { protected: char *name;int age;char sex;public: Person(char *n, int a, char s);Person(){ name = 0;age = 0;sex = ' ';} Person(Person &p);~Person(){ delete[] name;} void SetName(char *n);void SetAge(int a){ age = a;} void SetSex(int s){ sex = s;} char *GetName()const { return name;} int GetAge()const { return age;} char GetSex()const { return sex;} void Show();}; #include “person.h” #include Person::Person(char *n, int a, char s){ name = new char[strlen(n)+1];strcpy(name,n);age = a;sex = s;} Person::Person(Person &p){ name = new char[strlen(p.name)+1];strcpy(name,p.name);age = p.age;sex = p.sex;} void Person::SetName(char *n){ delete[] name;name = new char[strlen(n)+1];strcpy(name,n);} void Person::Show(){ cout<<“Name: ”< 1、對象數(shù)組 所謂對象數(shù)組是指每一數(shù)組元素都是對象的數(shù)組。 2、對象指針 聲明對象指針的一般語法形式為:類名* 對象指針名。當(dāng)用指向?qū)ο蟮闹羔榿碓L問對象成員時,要用“->”操作符。 3、this指針 C++為成員函數(shù)提供了一個名字為this的指針,這個指針稱為自引用指針。每當(dāng)通過一個對象調(diào)用一個成員函數(shù)時,系統(tǒng)就自動把這個this指針指向該對象。因此使用的數(shù)據(jù)成員就是該對象的數(shù)據(jù)成員。 3.4 向函數(shù)傳遞對象 1、使用對象作為函數(shù)參數(shù) 2、使用對象指針作為函數(shù)參數(shù) 3、使用對象引用作為函數(shù)參數(shù) 3.5 靜態(tài)成員 1、靜態(tài)數(shù)據(jù)成員 在一個類中,若將一個數(shù)據(jù)成員說明為static,這種成員稱為靜態(tài)數(shù)據(jù)成員。與一般的數(shù)據(jù)成員不同,無論建立多少個類的對象,都只有一個靜態(tài)數(shù)據(jù)的拷貝。從而實現(xiàn)了同一個類的不同對象之間的數(shù)據(jù)共享。 定義靜態(tài)數(shù)據(jù)成員的格式如下: static 數(shù)據(jù)類型 數(shù)據(jù)成員名;靜態(tài)數(shù)據(jù)成員在該類定義之外被初始化。訪問靜態(tài)數(shù)據(jù)成員可以通過對象或指針來訪問,也可以通過類名::來訪問。 2、靜態(tài)成員函數(shù) 定義靜態(tài)成員函數(shù)的格式如下: static 返回類型 靜態(tài)成員函數(shù)名(參數(shù)表);與靜態(tài)數(shù)據(jù)成員類似,調(diào)用公有靜態(tài)成員函數(shù)的一般格式有如下幾種: 類名::靜態(tài)成員函數(shù)名(實參表)對象.靜態(tài)成員函數(shù)名(實參表)對象指針->靜態(tài)成員函數(shù)名(實參表) 例:點類 Point(演示靜態(tài)成員)class Point { private: int x,y;static int count;public: Point(int xx=0, int yy=0){ x=xx;y=yy;count++;} Point(Point &p){ x=p.x;y=p.y;count++;} int GetX()const { return x;} int GetY()const { return y;} void SetXY(int xx, int yy){ x=xx;y=yy;} static int GetCount(){ return count;} }; int Point::count=0; int main(){ Point a(100,200), b;cout< 1、友元函數(shù) 友元函數(shù)不是當(dāng)前類的成員函數(shù),而是獨立于當(dāng)前類的外部函數(shù),但它可以訪問該類的所有對象的成員,包括私有成員、保護(hù)成員和公有成員。 2、友元成員 一個類的成員函數(shù)也可以作為另一個類的友元,這種成員函數(shù)不僅可以訪問自己所在類對象中的所有成員,還可以訪問friend聲明語句所在類對象中的所有成員。 3、友元類 一個類也可以作為另一個類的友元。 友元關(guān)系是單向的,不具有交換性。若類X是類Y的友元,類Y不一定是類X的友元。友元關(guān)系也不具有傳遞性。若類X是類Y的友元,Y是類Z的友元,類X不一定是類Z的友元。 例:點類 Point(演示友元)class Point { private: int x,y;static int count;public: Point(int xx=0, int yy=0){ x=xx;y=yy;} int GetX()const { return x;} int GetY()const { return y;} void SetXY(int xx, int yy){ x=xx;y=yy;} friend double Dist(Point p1, Point p2);}; friend double Dist(Point p1, Point p2);{ double x,y;x=p1.x-p2.x;y=p1.y-p2.y;return sqrt(x*x+y*y);} int main(){ Point a(100,200), b(300,400);cout<<“兩點間的距離為:”< 例:圓類 Circle(包含Point類的寫法)class Circle { private: double radius;//半徑 Point center;//圓心 public: Circle(){} Circle(int x, int y, double r): center(x,y){ SetRadius(r);} Circle(Point p, double r): center(p){ SetRadius(r);} double GetRadius()const { return radius;} void SetRadius(double r){ radius =(r>=0 ? r : 0);} void SetValue(int x, int y, double r){ center.SetXY(x,y);SetRadius(r);} double Area();void Show();}; const double PI=3.14159;inline double Circle::Area(){ return PI * radius * radius;} void Circle::Show(){ cout<<“圓心為: ” center.Show();cout<<“半徑為: ”< 1、const引用 const引用的說明形式如下: const 類型說明符& 引用名 2、const對象 const對象的說明形式如下: const 類名 對象名[(參數(shù)表)];如:const Data Mybirthday(1980,1,1);const對象的數(shù)據(jù)成員值不能被改變,const對象必須進(jìn)行初始化。通過const對象只能調(diào)用它的const成員函數(shù),而不能調(diào)用普通成員函數(shù)。 3、const數(shù)據(jù)成員 const數(shù)據(jù)成員只能通過構(gòu)造函數(shù)的初始化列表來獲得初始值。 4、const成員函數(shù) const成員函數(shù)的說明格式如下: 類型說明符 函數(shù)名(參數(shù)表)const;如:int GetYear()const { return year;} const成員函數(shù)不能更新對象的數(shù)據(jù)成員,也不能調(diào)用對象的普通成員函數(shù)。const是函數(shù)類型的一個組成部分,因此在函數(shù)的實現(xiàn)部分也要帶關(guān)鍵字const。 5、引用類型的數(shù)據(jù)成員 引用類型的數(shù)據(jù)成員也只能通過構(gòu)造函數(shù)的初始化列表來進(jìn)行初始化。 例 class Test { private: int a;const int b;//不能寫成const int b=10,因類的定義還沒分配空間 int &c;//不能寫成const int &c=a,因變量a還沒分配空間 public: Test(int i,int j,int &k):b(j),c(k){ a=i;} Test():b(10),c(a){ a=20;} } 第4章 派生類與繼承 4.1 派生類的概念 4.2 派生類的構(gòu)造函數(shù)與析構(gòu)函數(shù) 例:圓類 Circle(繼承Point類的寫法)class Circle: public Point { private: double radius;//半徑 public: Circle(){} Circle(int x, int y, double r): Point(x,y){ SetRadius(r);} Circle(Point p, double r): Point(p){ SetRadius(r);} double GetRadius()const { return radius;} void SetRadius(double r){ radius =(r>=0 ? r : 0);} void SetValue(int x, int y, double r){ SetXY(x,y);SetRadius(r);} double Area();void Show();}; const double PI=3.14159;inline double Circle::Area(){ return PI * radius * radius;} void Circle::Show(){ cout<<“圓心為: ” Point::Show();cout<<“半徑為: ”< 1、派生類繼承了它的所有基類中除構(gòu)造函數(shù)和析構(gòu)函數(shù)之外的所有成員。 2、在派生類中成員按訪問屬性劃分為四種:不可訪問的成員、私有成員、保護(hù)成員、公有成員。 3、對從基類繼承下來的成員初始化工作是通過調(diào)用基類的構(gòu)造函數(shù)來完成的,調(diào)用方法是在派生類的構(gòu)造函數(shù)中用初始化列表。 4、如果在派生類的構(gòu)造函數(shù)省略了基類的初始化列表,則將調(diào)用基類的缺省構(gòu)造函數(shù)。 5、如果基類定義了帶有參數(shù)的構(gòu)造函數(shù)時,派生類就應(yīng)當(dāng)定義構(gòu)造函數(shù),以便顯式地調(diào)用基類的構(gòu)造函數(shù)。 6、如果派生類定義了與基類同名的新數(shù)據(jù)成員或成員函數(shù),則此派生類的成員就覆蓋了基類的同名成員,直接使用成員名只能訪問到派生類的成員。 7、在同名覆蓋的情況下,可以使用基類名+作用域分辨符來訪問基類的同名成員。 8、如果派生類和基類的某個成員函數(shù)重名,但參數(shù)表不同,仍然屬于覆蓋,不屬于重載。 9、對派生類的對象,構(gòu)造函數(shù)的執(zhí)行過程是:先調(diào)用基類的構(gòu)造函數(shù)(按它們被繼承時聲明的順序),再調(diào)用內(nèi)嵌對象成員的構(gòu)造函數(shù)(按內(nèi)嵌對象聲明的順序),最后執(zhí)行自己的構(gòu)造函數(shù)體中的內(nèi)容。 10、析構(gòu)函數(shù)的調(diào)用次序正好和構(gòu)造函數(shù)的調(diào)用次序相反。 例:學(xué)生類 Student //student.h #include “person.h” class Student: public Person { protected: char *Department;int Number;public: Student(){ Department = 0;Number = 0;} Student(char *, int, char, char *, int);Student(Student &stu);~Student(){ delete[] Department;} void SetDep(char*);void SetNum(int num){ Number = num;} char *GetDep()const { return Department;} int GetNum()const { return Number;} void Show();}; //student.cpp #include “student.h” #include Student::Student(char *name,int age,char sex,char *dep,int num): Person(name, age, sex){ Department = new char[strlen(dep)+1];strcpy(Department, dep);Number = num;} Student::Student(Student &stu): Person(stu){ Department = new char[strlen(stu.Department)+1];strcpy(Department, stu.Department);Number = stu.Number;} void Student::SetDep(char *dep){ delete[] Department;Department = new char[strlen(dep)+1];strcpy(Department, dep);} void Student::Show(){ Person::Show();cout<<“Department: ” < 4.4 多重繼承 例1:X和Y是基類,Z從X和Y派生 class X { public: int b;X(int k){ b=k;} };class Y { public: int c;Y(int k){ c=k;} };class Z: public X, public Y { public: int d;Z(int i,int j,int k):X(i),Y(j){ d=k;} } 例2:X和Y都從W派生而來 class W { public: int a;W(int k){ d=k;} };class X: public W { public: int b;X(int i, int k): W(i){ b=k;} };class Y: public W { public: int c;Y(int i, int k): W(i){ c=k;} };class Z: public X, public Y { public: int d;Z(int i, int j, int k, int l): X(i,j),Y(i,k){ d=l;} } int main(){ Z t(10,20,30,40);cout< 例3:將W做為X和Y的虛基類 class W { public: int a;W(int k){ a=k;} };class X: virtual public W { public: int b;X(int i, int k): W(i){ b=k;} };class Y: virtual public W { public: int c;Y(int i, int k): W(i){ c=k;} };class Z: public X, public Y { public: int d;Z(int i, int j, int k, int l): W(i),X(i,j),Y(i,k){ d=l;} } int main(){ Z t(10,20,30,40);cout< (2)建立一個對象時,如果這個對象中含有從虛基類繼承來的成員,則虛基類的成員是由最遠(yuǎn)派生類的構(gòu)造函數(shù)通過調(diào)用虛基類的構(gòu)造函數(shù)進(jìn)行初始化的。該派生類的其他基類對虛基類構(gòu)造函數(shù)的調(diào)用都自動被忽略。 (3)若同一層次中同時包含虛基類和非虛基類,應(yīng)先調(diào)用虛基類的構(gòu)造函數(shù),再調(diào)用非虛基類的構(gòu)造函數(shù),最后調(diào)用派生類構(gòu)造函數(shù);(4)對于多個虛基類,構(gòu)造函數(shù)的執(zhí)行順序仍然是先左后右,自上而下;(5)對于非虛基類,構(gòu)造函數(shù)的執(zhí)行順序仍是先左后右,自上而下;(6)若虛基類由非虛基類派生而來,則仍然先調(diào)用基類構(gòu)造函數(shù),再調(diào)用派生類的構(gòu)造函數(shù)。 4.5 賦值兼容規(guī)則 所謂賦值兼容規(guī)則是指在需要基類對象的任何地方都可以使用公有派生類的對象來替代。 附:線性表——順序表 class SeqList { private: int *data;int size;int MaxSize;public: SeqList(int sz=100);~SeqList(){ delete []data;} int Length()const { return size;} bool IsEmpty()const { return size==0;} void Insert(const int &x, int k);void Delete(int k);int GetData(int k)const;int Find(const int &x)const;void Show()const;};SeqList::SeqList(int sz){ MaxSize=sz;data=new int[MaxSize];size=0;} void SeqList::Insert(const int &x, int k){ if(k<1 || k>size+1){ cerr<<“越界出錯”;exit(1);} if(size==MaxSize){ cerr<<“順序表已滿”;exit(1);} for(int i=size-1;i>=k-1;i--)data[i+1]=data[i];data[k-1]=x;size++;} void SeqList::Delete(int k){ if(size==0){ cerr<<“順序表空”;exit(1);} if(k<1 || k>size){ cerr<<“越界出錯”;exit(1);} for(int i=k;i int SeqList::GetData(int k)const { if(k<1 || k>size){ cerr<<“越界出錯”;exit(1);} return data[k-1];} int SeqList::Find(const int &x)const { for(int i=0;i void SeqList::Show()const { for(int i=0;i 第5章 多態(tài)性 5.1 編譯時的多態(tài)性與運行時的多態(tài)性 5.2 函數(shù)重載 5.3 運算符重載 例:復(fù)數(shù)類Complex //mycomplex.h #include #include“mycomplex.h” #include Complex &Complex::operator+=(Complex &c){ re += c.re;im += c.im;return *this;} Complex &Complex::operator-=(Complex &c){ re-= c.re;im-= c.im;return *this;} Complex &Complex::operator*=(Complex &c){ double t = re * c.rere * c.im)/ m;re = t;return *this;} Complex operator+(Complex &a, Complex &b){ return Complex(a.re + b.re, a.im + b.im);} Complex operator-(Complex &a, Complex &b){ return Complex(a.reb.im);} Complex operator*(Complex &a, Complex &b){ return Complex(a.re * b.rea.re * b.im)/ m);} bool operator==(Complex &a, Complex &b){ return a.re == b.re && a.im == b.im;} bool operator!=(Complex &a, Complex &b){ return a.re!= b.re || a.im!= b.im;} ostream &operator<<(ostream &os, Complex &c){ os << c.re << '+' << c.im << 'i';return os;} istream &operator>>(istream &is, Complex &c){ is >> c.re >> c.im;return is;} 例:分?jǐn)?shù)類 Fraction #include class Fraction { private: int num, den;void reduce();public: Fraction(int n=0, int d=1);Fraction operator+(){ return *this;} Fraction operator-(){ return Fraction(-num, den);} Fraction &operator+=(Fraction &);Fraction &operator-=(Fraction &);Fraction &operator*=(Fraction &);Fraction &operator/=(Fraction &);Fraction &operator++();Fraction operator++(int);operator double();friend Fraction operator+(Fraction &, Fraction &);friend Fraction operator-(Fraction &, Fraction &);friend Fraction operator*(Fraction &, Fraction &);friend Fraction operator/(Fraction &, Fraction &);friend bool operator==(Fraction &, Fraction &);friend bool operator!=(Fraction &, Fraction &);friend bool operator<(Fraction &, Fraction &);friend bool operator<=(Fraction &, Fraction &);friend bool operator>(Fraction &, Fraction &);friend bool operator>=(Fraction &, Fraction &);friend ostream &operator<<(ostream &, Fraction &);friend istream &operator>>(istream &, Fraction &);};#include “fraction.h” #include 5.4 類型轉(zhuǎn)換 1、通過構(gòu)造函數(shù)將別的類型轉(zhuǎn)換為這個類的類型 如復(fù)數(shù)Complex類的構(gòu)造函數(shù) Complex(double r){ re=r;} 2、通過轉(zhuǎn)換函數(shù)講這個類的類型轉(zhuǎn)換為別的類型 如在復(fù)數(shù)Complex類中的轉(zhuǎn)換函數(shù) operator double(){ return re;} 在分?jǐn)?shù)Fraction類中的轉(zhuǎn)換函數(shù) operator double(){ return static_cast 用explicit關(guān)鍵字,可以禁止單個參數(shù)的構(gòu)造函數(shù)用于自動類型轉(zhuǎn)換,如 class Stack { explicit Stack(int size);? ? } Explicit也同樣禁止用賦值來進(jìn)行帶有類型轉(zhuǎn)換的初始化行為 如,不可以 Stack s=10;5.5 虛函數(shù) 1、引入派生類后的對象指針 例: class A { public: void show(){ cout<<“A”;} };class B:public A { public: void show(){ cout<<“B”;} };int main(){ A a,*pc;B b;pc=&a;pc->show();pc=&b;pc->show();} 輸出為AA 2、虛函數(shù)的定義及使用 例:引入虛函數(shù)后,上面的例子改為如下 class A { public: virtual void show(){ cout<<“A”;} };class B:public A { public: void show(){ cout<<“B”;} };int main(){ A a,*pc;B b;pc=&a;pc->show();pc=&b;pc->show();} 輸出為AB 3、純虛函數(shù)和抽象類 例: class A { public: virtual void show()=0;};class B:public A { public: void show(){ cout<<“B”;} };int main(){ A *pc;B b;pc=&b;pc->show();} 關(guān)于虛函數(shù),有以下幾點 1、如果成員函數(shù)是通過引用或指針,而不是通過對象來調(diào)用,那么,如果沒有使用virtual,程序?qū)⒏鶕?jù)引用類型或指針類型來選擇方法;如果使用了virtual,程序?qū)⒏鶕?jù)引用或指針指向的對象的類型來選擇方法。 2、如果要在派生類中重新定義基類的方法,則將它設(shè)置為虛擬方法,否則是指為非虛擬方法 3、如果使用指向?qū)ο蟮囊没蛑羔榿碚{(diào)用虛擬方法,程序?qū)⑹褂脼閷ο箢愋投x的方法,而不使用為引用類型或指針類型定義的方法,這稱為動態(tài)聯(lián)編或晚期聯(lián)編。 4、在基類方法的聲明中使用virtual可使該方法在基類以及所有的派生類中都是虛擬的。 5、一個未在派生類中定義的純虛函數(shù)仍舊還是一個純虛函數(shù),該派生類仍為一個抽象類。 6、通常應(yīng)給基類提供一個虛擬析構(gòu)函數(shù),這樣,當(dāng)派生類對象結(jié)束時,將先調(diào)用派生的析構(gòu)函數(shù),再調(diào)用基類的析構(gòu)函數(shù)。 7、如果派生類沒有重新定義虛擬函數(shù),則將使用該函數(shù)的基類版本。 8、如果重新定義繼承的方法,應(yīng)確保與原來的原型完全相同。但有一個例外,就是如果返回類型是基類指針或引用,則可改為指向派生類的指針或引用。實驗 基本C++程序設(shè)計 2 類和對象程序設(shè)計 3 派生與繼承程序設(shè)計 4 運算符重載程序設(shè)計 5 模板程序設(shè)計 6 I/ O 流程序設(shè)計 【課題】 1.2集合的表示法(教案) 【教學(xué)目標(biāo)】 使學(xué)生掌握常使用的集合的表示方法,能選擇自然語言、圖形語言、集合語言(列舉法和描述法)描述不同的具體問題;【教學(xué)重點】 集合的表示方法; 【教學(xué)難點】 集合的特征性質(zhì)的概念,以及運用特征性質(zhì)描述法表示集合。【課時安排】 【教學(xué)過程 】 一、復(fù)習(xí)引入 問題一: 集合、空集、有限集和無限集分別是怎樣定義的?集合元素與集合的關(guān)系是什么?集合的元素具有哪些特征?常用數(shù)集的記法是什么? 問題二: 集合的表示方法有哪些?分別適用于什么情況? 學(xué)生閱讀課本,先獨立思考,再互相討論,教師巡視。 二、講授新課 集合常用的表示方法 1.列舉法定義:如果一個集合是有限集,元素又不太多,常常把集合的所有元素都列舉出來,寫在花括號“{ }”內(nèi)表示這個集合,這種表示集合的方法叫做列舉法 如:(1)24的所有正因數(shù)構(gòu)成的集合。可表示為{1,2,3,4,6,8,12,24}(2)不大于100的自然數(shù)的全體構(gòu)成的集合。可表示為{0,1,2,?100} 說明:使用列舉法時應(yīng)注意: 使用情況: 集合是有限集元素又不太多 集合是有限集,元素較多,有一定的規(guī)律,可列出幾個元素作為代表,其他元素用省略號表示。 有規(guī)律的有限集 (2)用列舉法表示集合時,不必考慮元素的前后順序,要注意不重不漏。 2、描述法定義: 描述法的定義﹕常用于表示無限集合,把集合中元素的公共屬性用文字﹐符號或式子等描述出來﹐寫在大括號內(nèi)﹐這種表示集合的方法叫做描述法:如果在集合I中,屬于集合{x?I|p(x)}A的任意一個元素x都具有性質(zhì)p(x),而不屬于集合A的元素都不具有性質(zhì)p(x),則性質(zhì)p(x)叫做集合A的一個特征性質(zhì)。于是,集合A可以用它的特征性質(zhì)p(x)描述為 舉例:由不等式x-3>2的所有解組成的集合(即不等式x-3>2的解集),可表示為:{x?Rx-3?2} 例:用特征性質(zhì)描述法表示法表示下列集合:(1){-1,1}; (2)大于3的全體正偶數(shù)構(gòu)成的集合; 思考與討論: 哪些性質(zhì)可作為集合{x?N0?x?5}的特征性質(zhì)? (2)平行四邊形的哪些性質(zhì),可用來描述所有平行四邊形構(gòu)成的集合? 使用特征性質(zhì)描述法是注意: 1.特征性質(zhì)必須明確,可多種表示; 2.當(dāng)x在R中取值時,常常省略不寫 ; 3.有的集合也可以直接寫出元素名稱,并并用花括號括起來表示這列元素的全體。 三、舉例說明 例:2用列舉法表示下列集合 ?1? A={x?N0 2? B={xx2-5x+6=0}.? 四、課堂練習(xí)教科書第7練習(xí)第1題,第2題 五、歸納小結(jié) 1、列舉法、描述法的定義及適用范圍 2、注意事項 3、列舉法與描述法的相互轉(zhuǎn)化 六、布置作業(yè):教材第7頁習(xí)題二第1題,第二題第五篇:集合的表示法(教案)