




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
面向?qū)ο蟪淌皆O(shè)計(jì)第1章面向?qū)ο笈cC++語(yǔ)言概述基本要求 掌握:面向?qū)ο蟪淌皆O(shè)計(jì)的基本思想及基本概念;c++中支持面向?qū)ο蟮奶攸c(diǎn);面向?qū)ο蟮能涹w開發(fā)環(huán)境;visualc++開發(fā)工作臺(tái)的主要功能。第1章C++語(yǔ)言概述1.1
C++語(yǔ)言及特點(diǎn)1.2面向?qū)ο蟮姆椒?.3
C語(yǔ)言與C++語(yǔ)言的關(guān)係1.4
C++的詞法和詞法規(guī)則1.5
C++程式的結(jié)構(gòu)1.6
C++程式的編輯、編譯和運(yùn)行編程語(yǔ)言的發(fā)展
C++的起源和特點(diǎn)1.1
C++語(yǔ)言及特點(diǎn)1.1.1編程語(yǔ)言的發(fā)展機(jī)器語(yǔ)言(二進(jìn)位碼)組合語(yǔ)言20世紀(jì)50年代中期,F(xiàn)ORTRAN語(yǔ)言20世紀(jì)50年代中期,Algol語(yǔ)言
在電腦語(yǔ)言發(fā)展史上具有劃時(shí)代的意義,引入了許多程式設(shè)計(jì)概念。如變數(shù)、數(shù)組、迴圈、分支等。
提出塊(Begin…End)思想,對(duì)數(shù)據(jù)進(jìn)行保護(hù),是一種初級(jí)封裝。1.1.1
編程語(yǔ)言的發(fā)展(續(xù))20世紀(jì)60年代中期,Simula67語(yǔ)言
面向?qū)ο笳Z(yǔ)言的鼻祖,提出了對(duì)象、類的概念,並支持類的繼承。20世紀(jì)70年代中期,Ada語(yǔ)言
支持?jǐn)?shù)據(jù)抽象類型的最重要的語(yǔ)言之一,但不完全支持繼承。20世紀(jì)70年代中期,Smalltalk語(yǔ)言
最有影響的面向?qū)ο笳Z(yǔ)言之一,豐富了面向?qū)ο蟮母拍睢?0世紀(jì)80年代中期後出現(xiàn)C++等多種面向?qū)ο笳Z(yǔ)言1.1.2
C++的起源和特點(diǎn)一、C++的起源在C語(yǔ)言基礎(chǔ)上為支持面向?qū)ο蟮某淌皆O(shè)計(jì)研製的一個(gè)通用目的的程式設(shè)計(jì)語(yǔ)言;由AT&T貝爾實(shí)驗(yàn)室BjarneStroustrup博士開發(fā);二、C++的特點(diǎn)與C相容,既保持了C的簡(jiǎn)潔、高效和接近彙編的特點(diǎn),又比C更安全,結(jié)構(gòu)化程度更高;既支持面向過(guò)程的程式設(shè)計(jì),又支持面向?qū)ο蟮某淌皆O(shè)計(jì);注意其兩面性1.2面向?qū)ο蟮姆椒嫦蜻^(guò)程與面向?qū)ο蟪淌皆O(shè)計(jì)抽象在面向?qū)ο笾械淖饔妹嫦驅(qū)ο蟮母拍?.2.1面向過(guò)程與面向?qū)ο蟪淌皆O(shè)計(jì)例1.1:輸入任意短語(yǔ)或句子,計(jì)算該短語(yǔ)包含多少個(gè)字(word)和字元(character)。注意:輸入短語(yǔ)時(shí),必須在字和字之間只空一格。#include<stdio.h>#include<conio.h>voidmain(){charch;intwdcount,chcount;wdcount=1;chcount=0;printf("***:Pleaseinputanyphrase…\n");1.2.1面向過(guò)程與面向?qū)ο蟪淌皆O(shè)計(jì)(續(xù))面向過(guò)程的方法1.2.1面向過(guò)程與面向?qū)ο蟪淌皆O(shè)計(jì)(續(xù))while((ch=getche())!='\r'){chcount++; if(ch=='')wdcount++;}printf("\n***:Thenumberofwordis%d\n", wdcount);printf("\n***:Thenumberofcharis%d\n", chcount);}1.2.1面向過(guò)程與面向?qū)ο蟪淌皆O(shè)計(jì)(續(xù))#include<iostream.h>#include<conio.h>classcount{public:count();voidprocess();voiddisplay();private:intwdcount,chcount;};私有成員構(gòu)造函數(shù)成員函數(shù)數(shù)據(jù)成員成員函數(shù)定義類公有成員面向?qū)ο蟮姆椒?.2.1面向過(guò)程與面向?qū)ο蟪淌皆O(shè)計(jì)(續(xù))count::count(){wdcount=1;chcount=0;}voidcount::display(){printf("\n***:Thenumberofwordis%d\n", wdcount);
printf("\n***:Thenumberofcharis%d\n", chcount);}1.2.1面向過(guò)程與面向?qū)ο蟪淌皆O(shè)計(jì)(續(xù))voidcount::process(){charch;cout<<"***:Pleaseinputanyphrase…"<<endl;while((ch=getche())!='\r'){chcount++;if(ch=='')wdcount++;}cout<<endl;}1.2.1面向過(guò)程與面向?qū)ο蟪淌皆O(shè)計(jì)(續(xù))voidmain(){countA;A.process();A.display();}運(yùn)行結(jié)果***Pleaseinputanyphrase...Iamateacher***:Thenumberofwordis4***:Thenumberofcharis15定義對(duì)象調(diào)用公有成員函數(shù)調(diào)用公有成員函數(shù)1.2.1面向過(guò)程與面向?qū)ο蟪淌皆O(shè)計(jì)(續(xù))是一種數(shù)學(xué)思維或電腦思維方法,與人們認(rèn)識(shí)世界的方法不同以不穩(wěn)定的、多變的“過(guò)程”和“操作”為中心來(lái)構(gòu)造系統(tǒng)可重用性較差是建立在認(rèn)識(shí)方法學(xué)基礎(chǔ)上的一項(xiàng)技術(shù)科學(xué),比較自然地模擬了人類認(rèn)識(shí)客觀世界的方式;以相對(duì)穩(wěn)定的“對(duì)象”和“數(shù)據(jù)結(jié)構(gòu)”為中心來(lái)構(gòu)造系統(tǒng)可重用性較好面向過(guò)程程式設(shè)計(jì)面向?qū)ο蟪淌皆O(shè)計(jì)1.2.1面向過(guò)程與面向?qū)ο蟪淌皆O(shè)計(jì)(續(xù))面向過(guò)程程式設(shè)計(jì)面向?qū)ο蟪淌皆O(shè)計(jì)P1P2P3P4P5O1O2O3O4O5Changing?P61.2.1面向過(guò)程與面向?qū)ο蟪淌皆O(shè)計(jì)(續(xù))面向過(guò)程程式設(shè)計(jì)面向?qū)ο蟪淌皆O(shè)計(jì)P1P2P3P5O1O2O3O4O5Changing?P6O41.2.2抽象在面向?qū)ο笾械淖饔靡弧⒊橄蟮母拍畛橄蟠碇粋€(gè)對(duì)象的本質(zhì)特徵,這個(gè)特徵將這個(gè)對(duì)象與所有其他種類的對(duì)象區(qū)別開來(lái);抽象是通過(guò)從特定的實(shí)例中抽取共同的性質(zhì)以形成一般化的概念的過(guò)程;抽象具有層次;汽車輪船飛機(jī)交通工具1.2.2抽象在面向?qū)ο笾械淖饔?續(xù))二、面向?qū)ο蟪橄蟮脑頂?shù)據(jù)抽象、行為共用、進(jìn)化、確定性1、數(shù)據(jù)抽象為程式員提供了一種對(duì)數(shù)據(jù)和為操作這些數(shù)據(jù)所需要的演算法的抽象;是面向?qū)ο蠓椒ǖ暮诵?,包括:模組化:構(gòu)成了面向?qū)ο笥?jì)算的本質(zhì);封裝(資訊隱藏):將一個(gè)模組的細(xì)節(jié)部分對(duì)用戶隱藏起來(lái),用戶只能通過(guò)受保護(hù)的介面來(lái)訪問(wèn)某個(gè)模組,而不能直接訪問(wèn)一個(gè)模組內(nèi)部的細(xì)節(jié);類公有成員1.2.2抽象在面向?qū)ο笾械淖饔?續(xù))2、行為共用行為是由實(shí)體的外部介面定義的行為共用指許多實(shí)體具有相同的介面,可增加系統(tǒng)的靈活性;支持行為共用的方式分類與層次分類多態(tài)與繼承對(duì)象公有成員函數(shù)名1.2.2抽象在面向?qū)ο笾械淖饔?續(xù))3、進(jìn)化需求進(jìn)化(虛函數(shù))進(jìn)化式的問(wèn)題求解(繼承的構(gòu)造函數(shù))4、確定性確保每個(gè)行為項(xiàng)都有一個(gè)正確的解釋,系統(tǒng)不會(huì)因不能回應(yīng)某一行為而失??;確定性與類型的正確性有關(guān);1.2.3
面向?qū)ο蟮母拍?/p>
面向?qū)ο笫沁\(yùn)用對(duì)象、類、繼承、封裝、包含、消息傳遞、多態(tài)性等概念來(lái)構(gòu)造系統(tǒng)的軟體開發(fā)方法;一、對(duì)象1、概念上對(duì)象是代表著正在創(chuàng)建的系統(tǒng)中的一個(gè)實(shí)體;2、實(shí)現(xiàn)形式上對(duì)象是一個(gè)狀態(tài)和操作(或行為)的封裝體;3、對(duì)象的定義狀態(tài):對(duì)象的狀態(tài)由這個(gè)對(duì)象的屬性和這些屬性的當(dāng)前值決定。屬性是靜態(tài)的,當(dāng)前值是動(dòng)態(tài)的一個(gè)對(duì)象具有狀態(tài)、行為和標(biāo)識(shí)。1.2.3面向?qū)ο蟮母拍?續(xù))行為:一個(gè)對(duì)象如何以狀態(tài)變化和消息傳遞的形式進(jìn)行作用和對(duì)外界進(jìn)行反應(yīng)。
一個(gè)對(duì)象的行為代表了這個(gè)對(duì)象的外部可見(jiàn)的和可測(cè)試的活動(dòng);
一個(gè)對(duì)象的狀態(tài)代表著它的行為的累積結(jié)果;標(biāo)識(shí):標(biāo)識(shí)是一個(gè)對(duì)象固有的一種特性,該特性將這個(gè)對(duì)象與其他對(duì)象區(qū)別開來(lái);屬性1屬性2...屬性n值11值21...值n1值12值22...值n2對(duì)象1行為值11值21...值n1值12值22...值n2對(duì)象2行為1.2.3面向?qū)ο蟮母拍?續(xù))4、對(duì)象的分類實(shí)體對(duì)象介面對(duì)象控制對(duì)象按作用分類存儲(chǔ)資訊的對(duì)象支持系統(tǒng)的主要功能二、類1、什麼是類類是具有相同屬性和行為特徵的若干對(duì)象的集合;1.2.3面向?qū)ο蟮母拍?續(xù))
類是創(chuàng)建對(duì)象的樣板,它包含著所創(chuàng)建對(duì)象的狀態(tài)描述和方法的定義。類的完整描述包含了外部介面和內(nèi)部演算法以及數(shù)據(jù)結(jié)構(gòu)的形式;2、類是對(duì)象的抽象描述
類中包含生成對(duì)象的具體方法,由一個(gè)類所創(chuàng)建的對(duì)象稱為該類的實(shí)例;3、類是抽象數(shù)據(jù)類型的實(shí)現(xiàn)
類是所有對(duì)象的共同的行為和不同的狀態(tài)的集合體;屬性1屬性2……屬性n行為1行為2……行為m值11值21……值n1值12值22……值n2行為1值11值21……值n1行為m值12值22……值n2對(duì)象1對(duì)象2對(duì)象k對(duì)象p類類與對(duì)象的關(guān)係1.2.3面向?qū)ο蟮母拍?續(xù))1.2.3面向?qū)ο蟮母拍?續(xù))四、多態(tài)性多態(tài)性指向不同對(duì)象發(fā)送同一條消息,根據(jù)對(duì)象的類的不同完成不同的行為。
由函數(shù)和運(yùn)算符的重載及虛函數(shù)實(shí)現(xiàn)類的多態(tài)性。
綜上,面向?qū)ο缶哂腥筇匦裕悍庋b性、繼承性、多態(tài)性。三、繼承繼承提供了創(chuàng)建新類的一種方法,它的本質(zhì)特徵是行為共用;C++對(duì)C語(yǔ)言的改進(jìn)C++對(duì)面向?qū)ο蠓椒ǖ闹С?.3
C語(yǔ)言與C++語(yǔ)言的關(guān)係1.3.1
C++對(duì)C語(yǔ)言的改進(jìn)增加了新的運(yùn)算符:::,new,delete等;改進(jìn)了類型系統(tǒng),增加了安全性;引進(jìn)了引用概念;允許函數(shù)重載,允許設(shè)置缺省參數(shù),提高了編程的靈活性;引進(jìn)了內(nèi)聯(lián)函數(shù),提高了程式的效率;可以根據(jù)需要隨時(shí)對(duì)變數(shù)進(jìn)行說(shuō)明;1.3.2
C++對(duì)面向?qū)ο蠓椒ǖ闹С諧++支持?jǐn)?shù)據(jù)封裝(數(shù)據(jù)抽象)
C++中,類是支持?jǐn)?shù)據(jù)封裝的工具,對(duì)象則是數(shù)據(jù)封裝的實(shí)現(xiàn);C++中包含有私有、公有和保護(hù)成員
每個(gè)可能的消息對(duì)應(yīng)一個(gè)相應(yīng)的方法,方法通過(guò)函數(shù)來(lái)定義;C++中通過(guò)發(fā)送消息來(lái)處理對(duì)象C++中允許友元破壞封裝性C++中允許函數(shù)名和運(yùn)算符重載C++支持繼承性C++支持動(dòng)態(tài)聯(lián)編C++語(yǔ)言的字元集單詞及詞法規(guī)則空白1.4
C++語(yǔ)言的詞法和詞法規(guī)則1.4.1
C++的字元集大小寫的英文字母:a~z,A~Z數(shù)字字元:0~9特殊字元1.4.2單詞及詞法規(guī)則1、識(shí)別字組成規(guī)則:以字母或下劃線開始,其後跟零個(gè)或多個(gè)字母、數(shù)字或下劃線;不能以數(shù)字開始正確識(shí)別字:Result,DoubleList,
_first,first_錯(cuò)誤識(shí)別字:1first識(shí)別字的長(zhǎng)度任意(受編譯器限制);區(qū)分字母的大小寫;不能使用系統(tǒng)的保留字;例如:ADD,Add,add1.4.2單詞及詞法規(guī)則(續(xù))2、關(guān)鍵字(保留字)表1-1
C++的關(guān)鍵字1.4.2單詞及詞法規(guī)則(續(xù))3、運(yùn)算符單目雙目三目運(yùn)算符5、分隔符號(hào)(){},分隔符號(hào):4、各種文字?jǐn)?shù)字字元文字串文字文字布爾文字;1.4.3空白一、空白包括:空格、跳位字元、換行符功能:指示詞法記號(hào)的開始和結(jié)束位置;二、注釋/*……*///1.5
C++程式的結(jié)構(gòu)一、C++示範(fàn)程式#include<iostream.h>voidmain(){cout<<"Helloworld!"<<endl;}二、C++程式的組成由若干檔組成,每個(gè)檔有:類函數(shù)(其中main為主函數(shù))I/O流庫(kù),提供所有的輸入輸出操作cout:流類對(duì)象<<:插入符提供螢?zāi)惠敵?;cin:流類對(duì)象>>:提取符提供鍵盤輸入;例如:cin>>"Pleaseinputtwointegers:";cin>>a>>b;endl:換行;1.6
C++程式的編輯、編譯和運(yùn)行一、編輯:原始檔案的擴(kuò)展名為.cpp二、編譯1、預(yù)處理過(guò)程詞法分析:?jiǎn)卧~語(yǔ)法分析:構(gòu)造程式的格式符號(hào)表:程式中的各種符號(hào)及其屬性錯(cuò)誤處理程式:生成目標(biāo)代碼:目標(biāo)檔擴(kuò)展名.obj2、編譯過(guò)程3、連接過(guò)程:可執(zhí)行檔擴(kuò)展名.exe三、運(yùn)行1.6
C++程式的編輯、編譯和運(yùn)行(續(xù))根源程式.cpp目標(biāo)檔.obj可執(zhí)行檔.exe編譯器連接器磁片中的#include檔C++庫(kù)檔.LIB第2章數(shù)據(jù)類型和運(yùn)算式2.1基本數(shù)據(jù)類型2.2常量和變數(shù)2.3枚舉類型2.4數(shù)組類型2.5鍵盤輸入和螢?zāi)惠敵?.6指針和引用2.7運(yùn)算符2.8運(yùn)算式2.9類型定義2.1基本數(shù)據(jù)類型一、基本數(shù)據(jù)類型整型int浮點(diǎn)型(實(shí)型)字元型char基本數(shù)據(jù)類型邏輯型bool空值型void單精確度浮點(diǎn)數(shù)float雙精度浮點(diǎn)數(shù)double用於函數(shù)和指針2.1基本數(shù)據(jù)類型(續(xù))二、數(shù)據(jù)類型修飾符signed:有符號(hào)unsigned:無(wú)符號(hào)short:短型long:長(zhǎng)型說(shuō)明:3)
long修飾符還適用於雙精度浮點(diǎn)數(shù);2)
上述修飾符均可用於整型和字元型;1)
類型修飾符可以修飾除void、bool類型以外的其他類型;2.1基本數(shù)據(jù)類型(續(xù))三、基本數(shù)據(jù)類型列表(P21)表2-1
C++的基本數(shù)據(jù)類型2.1基本數(shù)據(jù)類型(續(xù))說(shuō)明:1)表中的[int]可以省略,即在int之前有修飾符出現(xiàn)時(shí),可以省略關(guān)鍵字int;2)單精確度類型float、雙精度類型double、長(zhǎng)精度類型longdouble統(tǒng)稱浮點(diǎn)類型;3)char類型和各種int類型統(tǒng)稱整型類型;char類型變數(shù)在內(nèi)存中以其ASCII碼值的形式存儲(chǔ);4)字寬(位元組)取決於操作系統(tǒng)和編譯器的實(shí)現(xiàn),可用sizeof驗(yàn)證;變數(shù)常量2.2常量和變數(shù)2.2.1變數(shù)一、變數(shù)的三個(gè)基本要素名字類型值三要素?cái)?shù)據(jù)值地址值intc;c=5;記憶體5......c地址值1000H二、變數(shù)的定義可以在程式中隨時(shí)定義變數(shù),只要在該變數(shù)被使用前定義即可;定義格式:<類型>
<變數(shù)名表>;例如:inta,b,c;
doublex,y,z;變數(shù)類型變數(shù)名數(shù)據(jù)值地址值2.2.1變數(shù)(續(xù))同一程式塊內(nèi)不可以定義同名變數(shù);初始值變數(shù)定義時(shí)可賦初始值;聲明格式:數(shù)據(jù)類型識(shí)別字1=初始值1,…,識(shí)別字n=初始值n;數(shù)據(jù)類型識(shí)別字1(初始值1),…,識(shí)別字n(初始值n);例如:doubleprice=15.5;
intsize(100);未被初始化的變數(shù)的值或者是默認(rèn)值,或者是無(wú)效值,由變數(shù)類型決定;變數(shù)可被賦值,由變數(shù)名標(biāo)識(shí);2.2.2常量一、整型常量(無(wú)小數(shù)部分)1、表示方法十進(jìn)位八進(jìn)制十六進(jìn)制2、十進(jìn)位表示由0~9的數(shù)字組成不能以0開始無(wú)首碼例:132,-3453、八進(jìn)製錶示由0~
7的數(shù)字組成以0為首碼例:010,-05364、十六進(jìn)製錶示由0~9的數(shù)字及A~
F的字母(大小寫均可)組成以0x或0X為首碼例:0x7A,-0X3de2.2.2常量(續(xù))5、說(shuō)明:1)長(zhǎng)整型用L(或l)做後綴表示。例如:32765L,793l;2)無(wú)符號(hào)型用U(或u)做後綴表示。例如:4352U,3100u;3)unsignedlong型用尾碼U(或u)和L(或l)一起表示,L與U的先後順序無(wú)關(guān)。例如:49321ul,37825LU,41152Lu;2.2.2常量(續(xù))二、浮點(diǎn)型常量由整數(shù)部分和小數(shù)部分構(gòu)成;只有十進(jìn)位表示;一般表示形式(小數(shù)表示形式):整數(shù)部分與小數(shù)部分可以省去一部分,但不能全部省去;例如:5.,.25,4.072.2.2常量(續(xù))科學(xué)表示形式:在小數(shù)表示法後面加E(或e)表示指數(shù);例如:23.5E6,.032E-5,.3e10指數(shù)部分可正可負(fù),但必須為整數(shù);浮點(diǎn)常量的缺省數(shù)據(jù)類型為double型;尾碼F(或f)表示float類型;尾碼l(或l)表示longdouble類型;2.2.2常量(續(xù))三、字元常量由一對(duì)單引號(hào)括起的一個(gè)字元表示;其值為所括起字元在ASCII表中的編碼;所括起字元的表示方法:1、圖形表示法
該方法適用於有圖形符號(hào)的可列印字元;例如:'A','a','*'2、轉(zhuǎn)義序列表示法
該方法適用於所有字元,尤其是無(wú)圖形符號(hào)的不可列印字元;2.2.2常量(續(xù))(1)轉(zhuǎn)義序列表示方法:以反斜線(\)開頭,後跟字符的ASCII碼值;(2)八進(jìn)製錶示:\ddd;例如:\101(3)十六進(jìn)製錶示:\xhh;例如:\x41表2-2
C++中常用轉(zhuǎn)義序列符2.2.2常量(續(xù))四、布爾常量有兩個(gè)值:true和false;五、字串常量(串常量,字串)一對(duì)雙引號(hào)括起的字元序列,字元序列可以包含空格、轉(zhuǎn)義序列或任何其他字元,這些字元不一定是C++字元集中的字元,只要C++編譯器支持即可;例如:"Thisisastring;"字串常量與字元常量的區(qū)別:2.2.2常量(續(xù))由一個(gè)字元型變數(shù)存放由一維數(shù)組存放字元常量字串常量用單引號(hào)括起用雙引號(hào)括起字串有一個(gè)結(jié)束符,結(jié)束符用'\0'表示字元常量'a'在內(nèi)存中佔(zhàn)用一個(gè)位元組字串常量"a"在內(nèi)存中佔(zhàn)用兩個(gè)位元組可進(jìn)行加、減法運(yùn)算可進(jìn)行連接、拷貝運(yùn)算2.2.2常量(續(xù))六、符號(hào)常量用來(lái)表示C++中的常量,即用一個(gè)與常量相關(guān)的標(biāo)識(shí)符來(lái)替代常量;優(yōu)點(diǎn):增加可讀性,增強(qiáng)可維護(hù)性;例如:PI表示3.1415926定義方法:使用類型說(shuō)明符const;例如:constintsize=80;定義的符號(hào)常量必須初始化;一個(gè)符號(hào)常量可看作是一個(gè)只讀變數(shù),由const定義的常量的值不可以改變;Line1: #include<iostream.h>Line2: constdoublepi=3.1415;Line3: constdoubler;Line4: voidmain()Line5: {Line6: doubleperimeter,area;Line7: perimeter=2*pi*r;Line8: pi=3.14;Line9: area=pi*r*r;Line10: cout<<perimeter<<","<<area<<endl;Line11: }
constdoubler=3.2;錯(cuò)誤錯(cuò)誤,不能修改pi的值2.2.2常量(續(xù))2.3枚舉類型枚舉類型是若干個(gè)有名字的整型常量的集合;2.3.1枚舉聲明和枚舉變數(shù)一、枚舉聲明enum<枚舉名>{<枚舉表>};<枚舉表>由若干個(gè)枚舉符組成,多個(gè)枚舉符之間用逗號(hào)分隔;枚舉符是用識(shí)別字表示的整型常量,又稱枚舉常量;枚舉常量的值默認(rèn)為最前邊的一個(gè)為0,其後的值依次加1;枚舉常量的值也可顯式定義,未顯式定義的則在前一個(gè)值的基礎(chǔ)上加1;2.3.1枚舉聲明和枚舉變數(shù)(續(xù))二、枚舉變數(shù)例如:enumday{Sun,Mon,Tue,Wed,Thu,Fri,Sat};enumday{Sun=7,Mon=1,Tue,Wed,Thu,Fri,Sat};enum<枚舉名><枚舉變數(shù)名表>;多個(gè)枚舉變數(shù)之間用逗號(hào)分隔;例如:enumdayd1,d2,d3;enumday{Sun,Mon,Tue,Wed,Thu,Fri,Sat}d1,d2,d3;枚舉常量的值不一定互不相同;2.3.2枚舉變數(shù)的值其值是該枚舉變數(shù)所屬的枚舉聲明的枚舉表的某一個(gè)枚舉符;利用枚舉符所表示的整型值給枚舉變數(shù)賦值時(shí),需要進(jìn)行類型強(qiáng)制;例如:
d1=Sun;
d2=Sat;
d3=(enumday)4;2.4數(shù)組類型數(shù)目固定、類型相同的若干個(gè)變數(shù)的有序集合;2.4.1數(shù)組的定義1、格式<類型><數(shù)組名>[<大小1>][<大小2>]…;說(shuō)明:方括號(hào)([])表示數(shù)組的維;某維的大小必須是大於0的常量運(yùn)算式;2、示例inta[3];charb[3][5];constintsize=80;intm[size];2.4.2數(shù)組的賦值1、數(shù)組元素的表示下標(biāo)表示:<數(shù)組名>[<下標(biāo)運(yùn)算式1>][<下標(biāo)運(yùn)算式2>]…;說(shuō)明:下標(biāo)從0開始;各個(gè)元素在內(nèi)存中按其下標(biāo)的昇冪順序連續(xù)存放;指針表示:2.4.2數(shù)組的賦值(續(xù))2、數(shù)組元素賦初值利用初始值表(由一對(duì)花括弧括起來(lái)的若干資料項(xiàng)目組成)實(shí)現(xiàn);初始值表中資料項(xiàng)目的個(gè)數(shù)要小於等於數(shù)組元素的個(gè)數(shù);例如:inta[5]={1,2,3,4,5};
inta[4]={5,4};
intb[2][3]={{1,2,3},{4,5,6}};
intb[2][3]={1,2,3,4,5,6};
intc[2][3][2]={{{5,4},{3}},{{2},{1,0}}};3、數(shù)組元素的賦值例如:intm[3];
m[0]=5;
m[1]=3;
m[2]=1;2.4.3字元數(shù)組說(shuō)明:字元數(shù)組是指數(shù)組元素是char類型的數(shù)組;注意字元常量、字元數(shù)組與字串常量的區(qū)別;例如:chars1[4]={'a','b','c','d'};字元數(shù)組chars2[5]={'a','b','c','d','\0'};字元數(shù)組(字串常量)等價(jià)於chars2[5]="abcd";chars3[5]="abcde";╳chars3[]="abcde";inta,bcin>>a>>b;運(yùn)行時(shí)從鍵盤輸入:
12342.5鍵盤輸入和螢?zāi)惠敵鲆?、鍵盤輸入使用標(biāo)準(zhǔn)輸入流對(duì)象cin和提取運(yùn)算符>>鍵盤輸入和螢?zāi)惠敵龆际褂胕nclude<iostream.h>二、螢?zāi)惠敵?.5鍵盤輸入和螢?zāi)惠敵?續(xù))使用標(biāo)準(zhǔn)輸出流對(duì)象和插入運(yùn)算符<<inta=12;doubleb=12.34cout<<“ab的值為:”<<a<<‘,‘<<b<<endl;2.5鍵盤輸入和螢?zāi)惠敵?續(xù))#include<iostream.h>voidmain(){ inta,b; doublem,n; charc,s[20]; cout<<"請(qǐng)輸入整數(shù):"; cin>>a>>b; cout<<"請(qǐng)輸入浮點(diǎn)數(shù):"; cin>>m>>n; cout<<"請(qǐng)輸入字元:"; cin>>c>>s; cout<<a<<","<<b<<endl; cout<<m<<","<<n<<endl; cout<<c<<","<<s<<endl;}例:對(duì)不同類型數(shù)據(jù)的輸入和輸出指針指針和數(shù)組引用2.6指針和引用2.6.1指針1、什麼是指針指針是用來(lái)存放某個(gè)變數(shù)的地址值的一種變數(shù);指針的類型是它所指向變數(shù)的類型;指針本身數(shù)據(jù)值的類型是unsignedlongint型;例如:
inta(5);
int*p=&a;記憶體1000H5...a地址值1000H3000Hp2.6.1指針(續(xù))2、如何定義指針例如:
int*pi;
char(*pa)[3];//數(shù)組指針
float*pl;
int(*pf)();//函數(shù)指針
char*pc;
int*pp;<類型>*<指針名1>,*<指針名2>,…;3、指針的賦值(記憶體地址值)指針必須被賦值後才可使用;一般變數(shù)、數(shù)組元素、結(jié)構(gòu)成員的地址值為變數(shù)名前加運(yùn)算符&;數(shù)組的地址值用該數(shù)組名表示;2.6.1指針(續(xù))函數(shù)的地址值用該函數(shù)的名字表示;例如:
inta,b[10];
doublesin(doublex);
int*p=&a,*q=&b[3];
double(*pf)(doublex);
intc[10],*p=c;
pf=sin;4、指針的運(yùn)算賦值運(yùn)算。例如:inta,*p=&a,*q;
q=p;一個(gè)指針可以加上或減去一個(gè)整數(shù)值;在一定條件下(指向同一數(shù)組的不同元素),兩個(gè)指針可以相減;在一定條件下(指向同一數(shù)組的不同元素),兩個(gè)指針可以比較;2.6.2指針和數(shù)組1、C++中指針與數(shù)組的關(guān)係C++通過(guò)指針訪問(wèn)數(shù)組中的每個(gè)元素;在運(yùn)算運(yùn)算式中,一個(gè)標(biāo)識(shí)數(shù)組對(duì)象的運(yùn)算元在運(yùn)算運(yùn)算式中被自動(dòng)轉(zhuǎn)換為一個(gè)指向數(shù)組對(duì)象的第一個(gè)元素對(duì)象的指針值。2、一維數(shù)組的指針表示法C++中規(guī)定:任何一個(gè)數(shù)組的名字是一個(gè)常量指針,其值是該數(shù)組的首元素的地址值;例如:inta[5];數(shù)組表示法:a[i],i=0,1,2,3,4
指針表示法:*(a+i)a與&a[0]相同2.6.2指針和數(shù)組(續(xù))3、二維數(shù)組的指針表示法intb[2][5];數(shù)組表示法:b[i][j]
i=0,1;j=0,1,2,3,4指針表示法:
*(*(b+i)+j)
*(b[i]+j)
(*(b+i))[j]
(&b[0][0]+5*i+j)4、三維數(shù)組的指針表示法(同二維)5、示例2.6.2指針和數(shù)組(續(xù))例2.1:分析下列程式的輸出結(jié)果。#include<iostream.h>voidmain(){staticinta[5]={5,4,3,2,1};inti,j;i=a[0]+a[4];j=*(a+2)+*(a+4);cout<<i<<endl<<j<<endl;}輸出
6
44a[1]5a[0]3a[2]2a[3]1a[4]aa+2a+42.6.2指針和數(shù)組(續(xù))例2.2:分析下列程式的輸出結(jié)果。#include<iostream.h>voidmain(){staticchars1[]="abcde", s2[5]={'m','n','p','q','\0'};char*ps=s1;cout<<s1<<"or"<<s2<<endl;cout<<s2[1]<<s2[2]<<s1[3]<<s1[4]<<endl;cout<<*ps<<*(ps+2)<<*(ps+4)<<*ps+2<<endl;}輸出
abcdeormnpq
npde
ace99a的ASCII碼值為0x61,即972.6.2指針和數(shù)組(續(xù))例2.3:分析下列程式的輸出結(jié)果。#include<iostream.h>voidmain(){staticchart[][3][5]={"abcd","efgh","ijkl", "mnop","qrst","uvwx"};cout<<t[1][2][3]<<*(t[1][2]+3)<<*(*(*(t+1)+2)+3)<<*(*(t[1]+2)+3)<<endl;cout<<**t<<"\t"<<*(*(t+1)+1)<<"\t"<<t[0][2]<<"\t"<<**t+1<<endl;}輸出
xxxx
abcd
qrst
ijkl
bcd2.6.3引用對(duì)對(duì)象存儲(chǔ)地址的抽象,但引用不是變數(shù)或?qū)ο?,它不占存?chǔ)空間;引用有類型;引用是變數(shù)的別名;1、定義格式<類型>&<引用名>(<變數(shù)名>);或<類型>&<引用名>=<變數(shù)名>;2、初始化與賦值定義引用時(shí)必須初始化;可以將一個(gè)引用賦給某個(gè)變數(shù);引用可被賦值;2.6.3引用(續(xù))示例:
inta=3;
int&m=a;
intn=m;
int*p=&m;
m=m+5;3a8pm3n定義引用並初始化將引用賦值給變數(shù)a=8,對(duì)引用的操作就是對(duì)被引用者的操作3、引用的功能功能:用做函數(shù)的參數(shù)或函數(shù)的返回值;注意:函數(shù)不能返回對(duì)局部對(duì)象的引用;2.6.3引用(續(xù))示例:
int&f(intindex,inta[])
{
intr=a[index];
returnr;
}錯(cuò),r是局部對(duì)象4、指針與引用的區(qū)別(教材P159有錯(cuò))指針通過(guò)地址間接訪問(wèn)某個(gè)變數(shù),引用通過(guò)別名直接訪問(wèn)某個(gè)變數(shù);引用必須初始化,一旦被初始化後不得再作為其他變數(shù)的別名;正確:int&r=a[index];為什麼?2.6.3引用(續(xù))例2.4:分析下列程式的輸出結(jié)果。#include<iostream.h>voidmain(){intval(5);int&refv=val;refv=refv+5;;cout<<val<<endl;int*p=&refv,val1(refv);cout<<*p<<"\t"<<val1<<endl;}輸出
10
10
102.6.3引用(續(xù))例2.5:分析下列程式的輸出結(jié)果。#include<iostream.h>int&f(intindex,inta[]){int&r=a[index];returnr;}voidmain(){inta[]={1,3,5,7,9};f(2,a)=55;for(i=0;i<5;i++)cout<<a[i]<<"\t";}傳址調(diào)用(C++中數(shù)組自動(dòng)轉(zhuǎn)換為指針);引用可作左值;輸出:
1
3
55
79a[0]91357…a[2]r55算術(shù)運(yùn)算符關(guān)係運(yùn)算符邏輯運(yùn)算符位操作運(yùn)算符賦值運(yùn)算符其他運(yùn)算符運(yùn)算符的優(yōu)先順序和結(jié)合性2.7運(yùn)算符2.7.1算術(shù)運(yùn)算符1、普通算術(shù)運(yùn)算符單目算術(shù)運(yùn)算符:-(取負(fù))、+(取正);雙目算術(shù)運(yùn)算符:+、-、*、/、%(只用於int型);單目運(yùn)算符優(yōu)先順序高於雙目運(yùn)算符;2、增1和減1運(yùn)算符單目運(yùn)算符:++、--;++運(yùn)算符的功能:由該運(yùn)算符組成的運(yùn)算式具有一定的值;由該運(yùn)算符組成的運(yùn)算式計(jì)算後,其變數(shù)值要發(fā)生改變;2.7.1算術(shù)運(yùn)算符(續(xù))++運(yùn)算符的兩種方式:首碼方式與尾碼方式;首碼方式與尾碼方式的區(qū)別:首碼運(yùn)算運(yùn)算式的值為原來(lái)變數(shù)值加1;尾碼運(yùn)算運(yùn)算式的值為原來(lái)變數(shù)值;兩種方式的變數(shù)的值都加1;示例:
inta(1);
++a;
intb(1);
b++;運(yùn)算式++a的值為2,變數(shù)a的值為2;運(yùn)算式b++的值為1,變數(shù)b的值為2;2.7.2關(guān)係運(yùn)算符雙目運(yùn)算符:>、<、>=、<=、==、!=前四種優(yōu)先順序高於後兩種;2.7.3邏輯運(yùn)算符雙目運(yùn)算符:&&、||優(yōu)先順序:!、&&、||單目運(yùn)算符:!2.7.4位操作運(yùn)算符1、邏輯位運(yùn)算符單目邏輯位運(yùn)算符:~雙目邏輯位運(yùn)算符:&、|、^邏輯位運(yùn)算符的優(yōu)先順序:~、
&、^、|;2、移位運(yùn)算符雙目運(yùn)算符:<<、>>;<<時(shí)移掉的位被丟棄,右邊移出的空位補(bǔ)0;>>時(shí)移掉的位被丟棄,左邊移出的空位補(bǔ)0或符號(hào)位;2.7.5賦值運(yùn)算符簡(jiǎn)單賦值運(yùn)算符:=複合賦值運(yùn)算符:+=、-=、*=、/=、%=、&=、|=、^=、<<=、>>=2.7.6其他運(yùn)算符1、三目運(yùn)算符格式:d1?d2:d3功能:先計(jì)算d1,若其非零,運(yùn)算式的值為d2的值,否則為d3的值;運(yùn)算式類型:d2和d3中類型較高者的類型;2、逗號(hào)運(yùn)算符格式:d1,d2,…,dn運(yùn)算式的值和類型:由最後一個(gè)運(yùn)算式確定;優(yōu)先順序在所有運(yùn)算符中最低;3、sizeof運(yùn)算符2.7.6其他運(yùn)算符(續(xù))格式:sizeof(<類型說(shuō)明符>);功能:返回其後的類型說(shuō)明符或運(yùn)算式所表示的數(shù)在內(nèi)存中所占的位元組;4、單目運(yùn)算符&和*&:取地址;*:用在指針名前,表示取指針的內(nèi)容;5、強(qiáng)制類型運(yùn)算符或sizeof(<運(yùn)算式>);
格式:<類型說(shuō)明符>(<運(yùn)算式>);或
(<類型說(shuō)明符>)<運(yùn)算式>;2.7.6其他運(yùn)算符(續(xù))強(qiáng)制類型轉(zhuǎn)換可將高類型轉(zhuǎn)換為低類型,是一種不安全的轉(zhuǎn)換;示例:
doublef(3.85);
inth;
h=int(f);該轉(zhuǎn)換是暫時(shí)的,一次性的;
將低類型轉(zhuǎn)換為高類型,不影響數(shù)據(jù)精度示例:
inta(3),m;
doubleb;
b=3.56+double(a);
m=a+5;2.7.7運(yùn)算符的優(yōu)先順序和結(jié)合性P48,表3.1運(yùn)算式的種類運(yùn)算式的值和類型運(yùn)算式中的類型轉(zhuǎn)換2.8運(yùn)算式2.8.1運(yùn)算式的種類由運(yùn)算符和運(yùn)算元組成的式子;常見(jiàn)的運(yùn)算式算術(shù)運(yùn)算式;邏輯運(yùn)算式;關(guān)係運(yùn)算式;賦值運(yùn)算式;條件運(yùn)算式;逗號(hào)運(yùn)算式;2.8.1運(yùn)算式的種類(續(xù))注意事項(xiàng):連續(xù)的兩個(gè)運(yùn)算符之間用空格分隔;可用括弧來(lái)改變運(yùn)算符優(yōu)先順序;過(guò)長(zhǎng)的運(yùn)算式可分成幾個(gè)運(yùn)算式;2.8.2運(yùn)算式的值和類型一、確定運(yùn)算式的值二、運(yùn)算式求值方法與確定類型的方法先確定運(yùn)算符的功能;確定計(jì)算順序:先考慮優(yōu)先順序,再考慮結(jié)合性;2.8.2運(yùn)算式的值和類型(續(xù))例2.6:分析下列程式的輸出結(jié)果(算術(shù)運(yùn)算式)。#include<iostream.h>voidmain(){inta;a=123+3.2e2-3.6/6-6/8;cout<<a<<endl;doubleb;b=123+3.2e2-3.6/6-6/8;cout<<b<<endl;intc(7),d(4)a=c---++d;cout<<c<<‘,’<<d<<‘,’<<a<<endl;}輸出:
442442.4
6,5,22.8.2運(yùn)算式的值和類型(續(xù))例2.7:分析下列程式的輸出結(jié)果(關(guān)係運(yùn)算式)。#include<iostream.h>voidmain(){charx('m'),y('n');intn;n=x<y;cout<<n<<endl;n=x==y-1;cout<<n<<endl;n=('y'!='Y')+(5>3)+(y-x==1);cout<<n<<endl;}輸出:
1
1
32.8.2運(yùn)算式的值和類型(續(xù))例2.8:分析下列程式的輸出結(jié)果(邏輯運(yùn)算式)。#include<iostream.h>voidmain(){intx,y,z;x=y=z=1;--x&&++y&&++z;cout<<x<<"\t"<<y<<"\t"<<z<<endl;++x&&++y&&++z;cout<<x<<"\t"<<y<<"\t"<<z<<endl;++x&&y--||++z;cout<<x<<"\t"<<y<<"\t"<<z<<endl;}輸出:
0
1
1
1
2
2
2
1
2注意邏輯運(yùn)算式的求值方法2.8.2運(yùn)算式的值和類型(續(xù))例2.9:分析下列程式的輸出結(jié)果(條件運(yùn)算式)。#include<iostream.h>voidmain(){inta(3),b(4),c;c=a>b?++a:++b;cout<<a<<","<<b<<","<<c<<endl;c=a-b?a+b:a-3?b:a;cout<<a<<","<<b<<","<<c<<endl;}
3,5,5
3,5,8輸出注意三目運(yùn)算符的判斷條件2.8.2運(yùn)算式的值和類型(續(xù))例2.10:分析下列程式的輸出結(jié)果(賦值運(yùn)算式)。#include<iostream.h>voidmain(){intx(1),y(3),z(5);x+=y*=z-=2;cout<<x<<","<<y<<","<<z<<endl;x*=y/=z-=x;cout<<x<<","<<y<<","<<z<<endl;x=y=z=2;z=(x+=2)+(y+=4)+2;cout<<x<<","<<y<<“,"<<z<<endl;}輸出:
10,9,3
-10,-1,-7
4,6,122.8.2運(yùn)算式的值和類型(續(xù))例2.11:分析下列程式的輸出結(jié)果(逗號(hào)運(yùn)算式)。#include<iostream.h>voidmain(){inta,b,c;a=1,b=2,c=a+b+3;cout<<a<<","<<b<<","<<c<<endl;c=(a++,a+=b,a+b);cout<<a<<","<<b<<","<<c<<endl;}
1,2,6
4,2,6輸出2.8.3運(yùn)算式中的類型轉(zhuǎn)換一、隱式轉(zhuǎn)換雙目運(yùn)算中運(yùn)算元的類型轉(zhuǎn)換;是一種保值轉(zhuǎn)換,轉(zhuǎn)換類型由低到高;轉(zhuǎn)換規(guī)則:int
unsigned
long
unsignedlong
doubleshort,char
float二、強(qiáng)制轉(zhuǎn)換顯式強(qiáng)制轉(zhuǎn)換(通過(guò)強(qiáng)制轉(zhuǎn)換運(yùn)算符實(shí)現(xiàn));2.8.3運(yùn)算式中的類型轉(zhuǎn)換(續(xù))隱式強(qiáng)制轉(zhuǎn)換:在賦值運(yùn)算式中,當(dāng)左值(賦值運(yùn)算符左邊的值)和右值(賦值運(yùn)算符右邊的值)的類型不同時(shí),一律將右值類型強(qiáng)制轉(zhuǎn)換為左值的類型;在函數(shù)有返回值的調(diào)用中,將return後面的運(yùn)算式的類型強(qiáng)制轉(zhuǎn)換為該函數(shù)的類型;顯式隱式賦值運(yùn)算式函數(shù)返回值隱式轉(zhuǎn)換強(qiáng)制轉(zhuǎn)換類型轉(zhuǎn)換2.9類型定義1、格式typedef<已有類型名><新類型名表>;例如:
typedefdoublewages,bouns;
wagesweekly;
bounsmonthly;2、自定義類型的作用改善程式的可讀性,增加所定義變數(shù)的資訊書寫簡(jiǎn)練提高程式的可移植性
第3章預(yù)處理和語(yǔ)句3.1預(yù)處理功能3.2語(yǔ)句3.3選擇語(yǔ)句3.4迴圈語(yǔ)句3.5轉(zhuǎn)向語(yǔ)句3.1預(yù)處理功能一、預(yù)處理命令及預(yù)處理功能1、預(yù)處理命令C++根源程式中包含的各種編譯命令在程式被正常編譯之前執(zhí)行;2、預(yù)處理功能由預(yù)處理命令實(shí)現(xiàn)的功能;二、常用的預(yù)處理命令檔包含命令宏定義命令3.1預(yù)處理功能(續(xù))(1)以“
#”為引導(dǎo),作為該命令的標(biāo)誌;(4)每條預(yù)處理命令單獨(dú)佔(zhàn)用一行,同一行不能有其他預(yù)處理命令和語(yǔ)句;三、預(yù)處理命令使用說(shuō)明條件編譯命令停止編譯命令(5)預(yù)處理命令可以續(xù)行,續(xù)行符為"\";(2)預(yù)處理命令不是語(yǔ)句,不能以分號(hào)(;)結(jié)束;(3)預(yù)處理命令的位置可放在開頭、中間和結(jié)尾3.1.1檔包含命令一、功能指示C++編譯器將一個(gè)檔(頭檔)的內(nèi)容嵌入到該指令所在的文件的位置處;頭檔:指存放與標(biāo)準(zhǔn)函數(shù)有關(guān)的資訊,或者存放符號(hào)常量、類型定義、類和其他複雜類型的定義以及與程式環(huán)境相關(guān)資訊的.h檔;二、格式1、#include
<檔案名>由系統(tǒng)提供並放在指定子目錄中的頭檔;2、#include
"檔案名"
由用戶定義,放在當(dāng)前目錄或其他目錄下的頭檔或其他原始檔案;3.1.1檔包含命令(續(xù))三、說(shuō)明(1)檔包含命令一般放在程式頭;(2)一條文件包含命令只能包含一個(gè)檔;檔案名:myfile1.h#include"myfile2.h“檔案名:myfile2.h#include"myfile3.h“(3)檔包含命令可以嵌套;(4)包含檔的內(nèi)容不宜過(guò)多;3.1.2宏定義命令一、功能用來(lái)將一個(gè)識(shí)別字定義為一個(gè)字串,該識(shí)別字稱為宏名,被定義的字串稱為替換文本;二、宏定義命令格式1、兩種定義格式簡(jiǎn)單宏定義帶參數(shù)的宏定義2、簡(jiǎn)單宏定義定義符號(hào)常量,例如:#definePI3.1415#define<宏名><字串>3.1.2宏定義命令(續(xù))#define與const定義符號(hào)常量的區(qū)別const產(chǎn)生一個(gè)具有類型的符號(hào)#define僅產(chǎn)生文本替換,而不管內(nèi)容是否正確constdoublePI=3.1415;#definePI3.1415使用const可以定義一個(gè)局部常量,可局部在一個(gè)函數(shù)體內(nèi)用#define定義的常量的作用域是從定義時(shí)開始,直到使用#undef取消定義時(shí)為止,如果不取消定義,直到整個(gè)檔結(jié)束使用const定義常量是一個(gè)說(shuō)明語(yǔ)句,用分號(hào)(;)結(jié)束使用#define定義常量是一個(gè)預(yù)處理命令,不能用分號(hào)(;)結(jié)束3.1.2宏定義命令(續(xù))#define命令說(shuō)明(1)書寫#define命令時(shí),<宏名>與<字串>之間用空格分隔,不能使用等號(hào)連接;(2)使用#define定義的識(shí)別字不是變數(shù),它只用作宏替換,不佔(zhàn)用記憶體;(3)#define是一條預(yù)處理命令,不用分號(hào)結(jié)束,它所定義的識(shí)別字等價(jià)於其後的字串;(4)識(shí)別字被宏定義後,在取消這次宏定義之前,不允許重新對(duì)它進(jìn)行宏定義;(5)宏定義可以嵌套,已定義的識(shí)別字可以用來(lái)定義新的字串;3.1.2宏定義命令(續(xù))說(shuō)明1)<宏體>應(yīng)寫在一行上,如果需要寫在多行時(shí),需使用續(xù)行符(\)結(jié)束,並在其後按下回車鍵;2)<宏名>與左括弧之間不能出現(xiàn)空格,否則空格右邊都將作為宏體;3)定義帶參數(shù)的宏體時(shí),宏體中與參數(shù)名相同的字元序列適當(dāng)?shù)丶由侠ɑ?,可以避免宏替換後出現(xiàn)的優(yōu)先順序問(wèn)題;4)C++中,帶參數(shù)的宏定義常由內(nèi)聯(lián)函數(shù)取代;3、帶參數(shù)的宏定義#define<宏名>(<參數(shù)表>)<宏體>3.1.2宏定義命令(續(xù))例3.1:分析下列程式的輸出結(jié)果。#include<iostream.h>voidmain(){intb(5);#defineb2#definef(x)b*(x)inty(3);cout<<f(y+1)<<endl;#undefbcout<<f(y+1)<<endl;#defineb(3)cout<<f(y+1)<<endl;}輸出:
8
20
12簡(jiǎn)單宏定義帶參數(shù)的宏定義b=2b=5b=33.1.2宏定義命令(續(xù))4、替換正文中的操作符##與###:將它兩邊的運(yùn)算元連接成一個(gè)符號(hào);#:將它右邊的運(yùn)算元變成一個(gè)字串文字;例如:#defineCON(a,b)a##b
doublei=CON(5,E-10);
doublei=5E-10;
#defineSTR(a)#a
cout<<STR(Programmingisfun!)<<endl;
cout<<"Programmingisfun!"<<endl;5、取消宏定義命令#undef<識(shí)別字>3.1.3條件編譯命令一、功能用來(lái)定義某些編譯內(nèi)容要在滿足一定條件下才參與編譯,否則不參與編譯;可使同一根源程式在不同的編譯條件下產(chǎn)生不同的目標(biāo)代碼。二、格式格式一:#ifdef<識(shí)別字>
<程式段1>
#else
<程式段2>
#endif或#ifdef<識(shí)別字>
<程式段1>
#endif3.1.3條件編譯命令(續(xù))格式二
#ifndef<識(shí)別字>
<程式段1>
#else
<程式段2>
#endif或
#ifndef<識(shí)別字>
<程式段1>
#endif格式三
#if<常量運(yùn)算式1>
<程式段1>
#elif<常量運(yùn)算式2>
<程式段2>
#elif<常量運(yùn)算式3>
<程式段3>
...
#else
<程式段n+1>
#endif3.1.3條件編譯命令(續(xù))例3.2:分析下列程式的輸出結(jié)果。#include<iostream.h>#defineA10voidmain(){#ifA>0cout<<"a>0"<<endl;#elifA<0cout<<"a<0"<<endl;#elsecout<<"a==0"<<endl;#endif}輸出:
a>03.1.3條件編譯命令(續(xù))例3.3:避免重複引用某個(gè)頭文件。//main.cpp#include"myfile1.h"#include"myfile2.h"http://myfile1.h#include"myhead.h"http://myfile2.h#include"myhead.h"
改進(jìn):
//myhead.h
#ifndefMYHEAD_H
#defineMYHEAD_H
myhead檔的內(nèi)容
…………..
#endif3.1.3條件編譯命令(續(xù))例3.4:用於調(diào)試。調(diào)試時(shí):
#defineDEBUG1
...
#ifDEBUG=1
cout<<"OK"<<endl;
#endif
...調(diào)試後:
#defineDEBUG0
...3.1.4停止編譯命令一、格式#error<字元序列>二、功能當(dāng)編譯器遇到該指令時(shí),顯示“字元序列”,即錯(cuò)誤信息,然后停止對(duì)該程式的編譯,從而可以在編譯階段發(fā)現(xiàn)程式中的錯(cuò)誤;三、示例假設(shè)country值為:US、ENGLAND、CHINA
程式中有如下語(yǔ)句:3.1.4停止編譯命令(續(xù))//…#else#errorYoudefinecountryincorrectly#endif當(dāng)country的值不是上述三者之一時(shí),編譯器將顯示:然後停止編譯。Youdefinecountryincorrectly3.2語(yǔ)句1、運(yùn)算式語(yǔ)句和空語(yǔ)句運(yùn)算式語(yǔ)句:任何一個(gè)運(yùn)算式加上分號(hào)(;);空語(yǔ)句:只有一個(gè)分號(hào)(;)的語(yǔ)句;2、複合語(yǔ)句和分程式複合語(yǔ)句:由兩條或兩條以上的程式構(gòu)成,並由一對(duì)花括弧括起;分程式:又稱程式塊,含有一條或多條說(shuō)明語(yǔ)句的複合語(yǔ)句;條件語(yǔ)句開關(guān)語(yǔ)句3.3選擇語(yǔ)句3.3.1條件語(yǔ)句
if(<條件1>)<語(yǔ)句1>
elseif(<條件2>)<語(yǔ)句2>
elseif(<條件3>)<語(yǔ)句3>
...
elseif(<條件n>)<語(yǔ)句n>
else<語(yǔ)句n+1>說(shuō)明:
if語(yǔ)句可以嵌套,在此情況下,else與最近的一個(gè)沒(méi)有與else配對(duì)的if配對(duì)。3.3.2開關(guān)語(yǔ)句
switch(<整型運(yùn)算式>)
{
case<整常型運(yùn)算式1>:<語(yǔ)句序列1>
case<整常型運(yùn)算式2>:<語(yǔ)句序列2>
...
case<整常型運(yùn)算式n>:<語(yǔ)句序列n>
default:<語(yǔ)句序列n+1>
}注意:
在執(zhí)行語(yǔ)句序列中如果遇到break語(yǔ)句,則退出switch語(yǔ)句,執(zhí)行後面的語(yǔ)句;如果其後的語(yǔ)句序列中沒(méi)有break語(yǔ)句,則一直執(zhí)行至switch語(yǔ)句結(jié)束。3.3.2開關(guān)語(yǔ)句(續(xù))例3.5:分析下列程式的輸出結(jié)果。#include<iostream.h>voidmain(){inti(1),j(0),m(1),n(2);switch(i++){case1:m++;n++;case2:switch(++j){case1:m++;case2:n++;}case3:m++;n++;break;case4:m++;n++;}cout<<m<<','<<n<<endl;}輸出:
4,53.4迴圈語(yǔ)句1、while迴圈語(yǔ)句while(<條件>)<語(yǔ)句>;2、do-while迴圈語(yǔ)句
do<語(yǔ)句>
while(<條件>);
do-while迴圈與while迴圈的區(qū)別:
do-while迴圈至少執(zhí)行一次循環(huán)體,while迴圈可能一次也不執(zhí)行循環(huán)體;3、for迴圈語(yǔ)句for
(d1;d2;d3)<語(yǔ)句>;4、多重迴圈3.5轉(zhuǎn)向語(yǔ)句1、goto語(yǔ)句格式:goto<語(yǔ)句編號(hào)>;goto語(yǔ)句只能在一個(gè)函數(shù)內(nèi)進(jìn)行轉(zhuǎn)向;2、break語(yǔ)句格式:break;適用情況:1)用於開關(guān)語(yǔ)句的語(yǔ)句序列中,其功能是退出開關(guān)語(yǔ)句,執(zhí)行其後的語(yǔ)句;2)用於循環(huán)體中,其功能是用來(lái)退出該重迴圈;3、continue語(yǔ)句格式:continue;功能:在循環(huán)體中用來(lái)結(jié)束本次迴圈;第4章函數(shù)4.1函數(shù)的定義和說(shuō)明4.2函數(shù)的參數(shù)和返回值4.3函數(shù)的調(diào)用方式4.4內(nèi)聯(lián)函數(shù)4.5函數(shù)重載4.1函數(shù)的定義和說(shuō)明函數(shù)的定義格式函數(shù)的說(shuō)明方法(函數(shù)聲明)4.1.1函數(shù)的定義格式
<類型><函數(shù)名>(<參數(shù)表>)
{
<若干條語(yǔ)句>
}
說(shuō)明:<類型>為函數(shù)返回值類型,若為void,則為過(guò)程調(diào)用;<參數(shù)表>中的參數(shù)為形參,在函數(shù)被調(diào)用時(shí)進(jìn)行初始化,從而從被調(diào)用處獲得數(shù)據(jù);函數(shù)體4.1.2函數(shù)的說(shuō)明方法(函數(shù)的聲明)一、函數(shù)的說(shuō)明原則如果一個(gè)函數(shù)定義在先,調(diào)用在後,調(diào)用前可以不必說(shuō)明;如果一個(gè)函數(shù)定義在後,調(diào)用在先,調(diào)用前必須說(shuō)明;二、函數(shù)的說(shuō)明方法(原型說(shuō)明)<類型><函數(shù)名>(<參數(shù)表>);三、示例參數(shù)表中的參數(shù)名稱可以省略4.1.2函數(shù)的說(shuō)明方法(續(xù))#include<iostream.h>voidfun1(),fun2(),fun3();voidmain(){cout<<"Itisinmain."<<endl;fun2();cout<<"Itisbackinmain."<<endl;}voidfun1(){cout<<"Itisinfun1."<<endl;fun3();cout<<"Itisbackinfun1."<<endl;}例4.1:分析下列程式的輸出結(jié)果。函數(shù)原型聲明4.1.2函數(shù)的說(shuō)明方法(續(xù))voidfun2(){cout<<"Itisinfun2."<<endl;fun1();cout<<"Itisbackinfun2."<<endl;}voidfun3(){cout<<"Itisinfun3."<<endl;}
Itisinmain.
Itisbackinfun1.
Itisinfun2.
Itisbackinfun2.
Itisinfun1.
Itisbackinmain.
Itisinfun3.
輸出含以下3個(gè)內(nèi)容:函數(shù)參數(shù)的求值順序設(shè)置函數(shù)參數(shù)的默認(rèn)值函數(shù)的返回值4.2函數(shù)的參數(shù)和返回值4.2.1函數(shù)參數(shù)的求值順序當(dāng)一個(gè)函數(shù)帶有多個(gè)參數(shù)時(shí),C++語(yǔ)言沒(méi)有規(guī)定函數(shù)調(diào)用時(shí)實(shí)參的求值順序;編譯器根據(jù)對(duì)代碼進(jìn)行優(yōu)化的需要自行規(guī)定對(duì)實(shí)參的求值順序;在實(shí)參中注意不要使用帶有副作用的運(yùn)算符,此時(shí)可能產(chǎn)生二義性;例4.2:由於使用對(duì)參數(shù)求值順序不同的編譯器造成的二義性。4.2.1函數(shù)參數(shù)的求值順序(續(xù))#include<iostream.h>intadd(intx,inty){returnx+y;}voidmain(){intx(4),y(6);intz=add(++x,x+y);cout<<z<<endl;}產(chǎn)生二義性可能的結(jié)果(按照編譯器對(duì)實(shí)參求值順序不同):自左至右,兩個(gè)實(shí)參的值分別為5和11;自右至左,兩個(gè)實(shí)參的值分別為5和10;4.2.2設(shè)置函數(shù)參數(shù)的默認(rèn)值C++中,在函數(shù)聲明或定義時(shí)可以為一個(gè)或多個(gè)參數(shù)指定缺省參數(shù)值;intadd(intx,int
y=10);進(jìn)行函數(shù)調(diào)用時(shí),若未指定足夠的實(shí)參,則編譯器將按從左向右的順序用函數(shù)聲明或定義中的缺省值來(lái)補(bǔ)足所缺少的實(shí)參;add(15);
add(15,10);注意:函數(shù)參數(shù)求值順序與參數(shù)默認(rèn)值補(bǔ)足順序不同參數(shù)求值順序:由編譯器決定求值方向;參數(shù)默認(rèn)值補(bǔ)足順序:自左向右4.2.2設(shè)置函數(shù)參數(shù)的默認(rèn)值(續(xù))在一個(gè)指定了缺省值的參數(shù)的右邊,不能出現(xiàn)沒(méi)有指定缺省值的參數(shù);voidf(intx,inty=1,intz);在給某個(gè)參數(shù)指定缺省值時(shí),不僅可以是一個(gè)數(shù)值,而且可以是任意複雜的運(yùn)算式;
intf();
……
voiddelay(intk,inttime=f());錯(cuò)誤例如:f(2,4);理想:f(2,1,4),實(shí)際:z參數(shù)未被賦值4.2.2設(shè)置函數(shù)參數(shù)的默認(rèn)值(續(xù))#include<iostream.h>voidfun(inta=1,intb=3,intc=5){cout<<"a="<<a<<","<<"b="<<b<<","<<"c="<<c<<endl;}voidmain(){fun();fun(7);fun(7,9);fun(7,9,11);cout<<"OK!"<<endl;}輸出:
a=1,b=3,c=5
a=7,b=3,c=5
a=7,b=9,c=5
a=7,b=9,c=11
OK!例4.3:分析下列程式的輸出結(jié)果。4.2.2設(shè)置函數(shù)參數(shù)的默認(rèn)值(續(xù))(1)對(duì)函數(shù)的實(shí)參數(shù)實(shí)行初始化。
如果沒(méi)有缺省參數(shù),在函數(shù)調(diào)用時(shí)必須逐一給出實(shí)參數(shù),使函數(shù)的調(diào)用顯得不夠靈活、實(shí)用。而定義了參數(shù)缺省函數(shù)後,對(duì)參數(shù)初始化就顯得相當(dāng)便捷。(2)使函數(shù)的定義和調(diào)用更具一般性
在定義了缺省參數(shù)函數(shù)後,函數(shù)的形式參數(shù)和實(shí)參數(shù)的對(duì)應(yīng)形式就可以多種多樣了。
(3)降低編程的複雜性
降低編程的複雜性,降低程式出錯(cuò)的可能性。
為什麼要定義參數(shù)缺省函數(shù)?4.2.3函數(shù)的返回值關(guān)於return語(yǔ)句的說(shuō)明:有返回值的return語(yǔ)句可以返回一個(gè)運(yùn)算式的值,從而實(shí)現(xiàn)函數(shù)之間的資訊傳遞;無(wú)返回值的函數(shù)必須用void說(shuō)明其返回類型;返回語(yǔ)句格式格式一:return<運(yùn)算式>;格式二:return;4.3函數(shù)的調(diào)用方式說(shuō)明:實(shí)參表的個(gè)數(shù)由形參決定,用來(lái)初始化實(shí)參,多個(gè)實(shí)參用逗號(hào)分隔;實(shí)參的個(gè)數(shù)與類型必須與形參的個(gè)數(shù)與類型完全一致;函數(shù)調(diào)用格式<函數(shù)名>(<實(shí)參表>);實(shí)參對(duì)形參的初始化按其位置進(jìn)行;調(diào)用方式的分類4.3函數(shù)的調(diào)用方式(續(xù))傳值調(diào)用:傳遞變數(shù)本身的值(數(shù)據(jù)值);傳址調(diào)用:傳遞變數(shù)的地址值;引用調(diào)用:傳遞變數(shù)本身;4.3.1函數(shù)的傳值調(diào)用傳值調(diào)用的實(shí)現(xiàn)機(jī)制和特點(diǎn)用法:調(diào)用函數(shù)的實(shí)參用常量、變數(shù)(數(shù)據(jù))值或運(yùn)算式值,被調(diào)用函數(shù)的形參用變數(shù);實(shí)現(xiàn)機(jī)制:系統(tǒng)將實(shí)參拷貝一個(gè)副本給形參(數(shù)據(jù)值);特點(diǎn):形參值的改變不影響實(shí)參值;4.3.1函數(shù)的傳值調(diào)用(續(xù))#include<iostream.h>voidswap1(intx,inty){inttemp;temp=x;x=y;y=temp;cout<<"x="<<x<<","<<"y="<<y<<endl;}voidmain(){inta(5),b(9);swap1(a,b);cout<<"a="<<a<<","<<"b="<<b<<endl;}例4.4:分析下列程式的輸出結(jié)果(傳值調(diào)用)。輸出:
x=9,y=5
a=5,b=94.3.2函數(shù)的傳址調(diào)用傳址調(diào)用的實(shí)現(xiàn)機(jī)制和特點(diǎn)用法:調(diào)用函數(shù)的實(shí)參用地址值,被調(diào)用函數(shù)的形參用指針;實(shí)現(xiàn)機(jī)制:讓形參的指針直接指向?qū)崊ⅲ惶攸c(diǎn):可以通過(guò)改變形參所指向的變數(shù)值來(lái)影響實(shí)參值;4.3.2函數(shù)的傳址調(diào)用(續(xù))#include<iostream.h>voidswap2(int*x,int*y){inttemp;temp=*x;
*x=*y;
*y=temp;cout<<"x="<<*x<<","<<"y="<<*y<<endl;}voidmain()
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 一年級(jí)下冊(cè)數(shù)學(xué)教案-2.2 100以內(nèi)數(shù)的大小比較| 青島版(五四學(xué)制)
- 2024-2025學(xué)年三年級(jí)下學(xué)期數(shù)學(xué)第一單元復(fù)習(xí)與提高 平方分米(教案)
- 一年級(jí)下冊(cè)數(shù)學(xué)教案-第6單元 圖書館(2)|北師大版
- 2024年林業(yè)機(jī)械項(xiàng)目資金籌措計(jì)劃書
- 2025年廣州城市職業(yè)學(xué)院?jiǎn)握新殬I(yè)技能測(cè)試題庫(kù)完美版
- 2024年耐酸低熔玻璃項(xiàng)目資金申請(qǐng)報(bào)告
- 16《朱德扁擔(dān)》第二課時(shí) 教學(xué)設(shè)計(jì)-2024-2025學(xué)年語(yǔ)文二年級(jí)上冊(cè)統(tǒng)編版
- 2025年度個(gè)人與個(gè)人家政服務(wù)合作協(xié)議
- 2025年度個(gè)人代收款金融服務(wù)合作協(xié)議
- 2025年度房改房買賣合同簽訂與備案操作手冊(cè)
- 精神分裂癥合并糖尿病患者護(hù)理查房課件
- 山東省2024屆科目一模擬考試100題(答案)
- 共享wifi貼合同范本
- 借款人借款合同
- 統(tǒng)戰(zhàn)工作先進(jìn)個(gè)人事跡材料
- 國(guó)能遼寧北票 200MW 風(fēng)力發(fā)電項(xiàng)目地質(zhì)災(zāi)害危險(xiǎn)性評(píng)估報(bào)告
- 中藥相關(guān)性腎損害
- 2024年關(guān)于加強(qiáng)社區(qū)工作者隊(duì)伍建設(shè)的意見(jiàn)課件
- 2024年松溪縣城投實(shí)業(yè)集團(tuán)有限公司招聘筆試沖刺題(帶答案解析)
- DZ∕T 0214-2020 礦產(chǎn)地質(zhì)勘查規(guī)范 銅、鉛、鋅、銀、鎳、鉬(正式版)
- 1企業(yè)網(wǎng)絡(luò)與信息安全管理組織架構(gòu)
評(píng)論
0/150
提交評(píng)論