《C++程序設(shè)計(jì)》課件第1章_第1頁
《C++程序設(shè)計(jì)》課件第1章_第2頁
《C++程序設(shè)計(jì)》課件第1章_第3頁
《C++程序設(shè)計(jì)》課件第1章_第4頁
《C++程序設(shè)計(jì)》課件第1章_第5頁
已閱讀5頁,還剩89頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第1章程序設(shè)計(jì)基礎(chǔ)1.1C++?中的數(shù)據(jù)類型1.2運(yùn)算符和表達(dá)式1.3程序控制結(jié)構(gòu)1.4函數(shù)本章小結(jié)習(xí)題

C++是一種使用非常廣泛的計(jì)算機(jī)編程語言,它是以C語言為基礎(chǔ)開發(fā)出來的,可以把C看做是C++的子集,但C++又與C不完全相同。作為基礎(chǔ)語言,C++的設(shè)計(jì)保證了在它的類型、運(yùn)算、語句與計(jì)算機(jī)直接處理的對(duì)象之間的緊密對(duì)應(yīng)關(guān)系。

C++是一種通用型的程序設(shè)計(jì)語言,特別是面向系統(tǒng)程序設(shè)計(jì);它是一個(gè)更好的C,支持?jǐn)?shù)據(jù)抽象,支持面向?qū)ο蟮某绦蛟O(shè)計(jì)技術(shù),支持通用型程序設(shè)計(jì)。本章主要介紹使用C++?語言進(jìn)行程序設(shè)計(jì)的基礎(chǔ)。1.1C++?中的數(shù)據(jù)類型絕大部分的程序設(shè)計(jì)語言中,數(shù)據(jù)都以變量或常量的形式來描述,每個(gè)變量或常量都有自己的數(shù)據(jù)類型。C++提供了大量的基本數(shù)據(jù)類型供我們使用。定義不同類型的數(shù)據(jù)主要是告訴編譯器要分配不同大小的內(nèi)存空間供我們存儲(chǔ)程序中所要使用的數(shù)據(jù),同時(shí)也告訴編譯器對(duì)分配的內(nèi)存空間怎么組織數(shù)據(jù)。

C++的數(shù)據(jù)類型可以分為基本數(shù)據(jù)類型和構(gòu)造數(shù)據(jù)類型。基本數(shù)據(jù)類型也叫原子數(shù)據(jù)類型。1.1.1基本數(shù)據(jù)類型和非基本數(shù)據(jù)類型

1.基本數(shù)據(jù)類型

C++中的基本數(shù)據(jù)類型有整型(int)、字符型(char)、浮點(diǎn)型(float)、雙精度型(double)和邏輯型(bool),其中整型、字符型、浮點(diǎn)型和雙精度型與C語言中的相同,邏輯型是C++在C語言的基礎(chǔ)上新增加的一種數(shù)據(jù)類型。對(duì)于這些基本數(shù)據(jù)類型又有l(wèi)ong(長(zhǎng)型)、short(短型)、signed(有符號(hào)型)和unsigned(無符號(hào)型)等修飾符。其中,long可以用來修飾int型和double型;short可以用來修飾int型;signed和unsigned可以用來修飾int型和char型。signed(unsigned)還可以和long(short)同時(shí)修飾一個(gè)基本類型。表1.1列出了所有的基本數(shù)據(jù)類型,包括它們?cè)趙in32中所占用的空間大小以及它們所能表示的數(shù)的大小。有了表1.1中的基本數(shù)據(jù)類型,我們就可以用它來定義相應(yīng)類型的變量,系統(tǒng)也就為我們分配相應(yīng)字節(jié)數(shù)的內(nèi)存空間來存放程序中要用到的數(shù)據(jù)。表1.1C++中的數(shù)據(jù)類型以下列舉一個(gè)C++程序。【程序1.1】#include<iostream>usingnamespacestd;intmain(){ inti=2; floatf=2.5; doubled=2.55; boolb=false; charc='a'; cout<<"a="<<i<<"int占用字節(jié)數(shù)"<<sizeof(int)<<endl; cout<<"f="<<f<<"float占用字節(jié)數(shù)"<<sizeof(float)<<endl; cout<<"d="<<d<<"double占用字節(jié)數(shù)"<<sizeof(double)<<endl; cout<<"b="<<b<<"bool占用字節(jié)"<<sizeof(bool)<<endl; cout<<"c="<<c<<"char占用字節(jié)"<<sizeof(char)<<endl;

return0;}

運(yùn)行結(jié)果如下:

從程序1.1中可以看出,C++面向過程程序和C程序結(jié)構(gòu)基本相同,都是從main函數(shù)開始執(zhí)行,但也和C程序存在以下幾點(diǎn)不同:

(1)使用頭文件iostream。C++中使用輸入/輸出流(詳見第5章)進(jìn)行輸入/輸出。所有關(guān)于標(biāo)準(zhǔn)輸入/輸出流的定義都在頭文件iostream中。當(dāng)然C++中也可以使用C語言的標(biāo)準(zhǔn)輸入/輸出頭文件stdio.h。

(2)使用cout輸出。cout是利用C++的輸入/輸出流類定義的對(duì)象(詳見第5章)。在C++中我們一般將要輸出的內(nèi)容放在cout<<后就可以直接輸出,其中<<叫做流插入運(yùn)算符。而且<<可以連續(xù)書寫進(jìn)行輸出。在程序中還用到了endl,endl是輸入/輸出流中的換行標(biāo)志,功能類似于C中的?'\n'。(3)?bool型變量。bool是C++中新加入的關(guān)鍵字,用來定義邏輯型變量。同時(shí)C++中也提供了兩個(gè)邏輯型常量true和false,分別代表邏輯真和邏輯假。而在C語言中我們一般都用int型表示邏輯變量,用0代表邏輯真,非0代表邏輯假。

2.構(gòu)造數(shù)據(jù)類型

C++中的構(gòu)造數(shù)據(jù)類型有指針、數(shù)組、結(jié)構(gòu)體、共用體(聯(lián)合體)、枚舉類型、類等。除了類類型以外其他的都和C語言中相應(yīng)類型的含義一致,此處就不再講解了。而類是C++對(duì)C的一個(gè)重要擴(kuò)充,C++的面向?qū)ο蟪绦蛟O(shè)計(jì)就是借助于類和一些其他的機(jī)制來實(shí)現(xiàn)的。1.1.2C_string和C++string1.C_string及其操作

C語言使用char型數(shù)組或char型指針來表示字符串。同時(shí)在C的庫文件string.h中還定義了若干字符串操作函數(shù)以供使用,這些函數(shù)有strcat(字符串連接)、strcmp(字符串比較)、strcpy(字符串復(fù)制)、strlen(求字符串長(zhǎng)度)、strstr(查找子串功能)等。程序1.2中定義了一個(gè)C_string(C類型的字符串)并對(duì)它進(jìn)行操作。

【程序1.2】#include<iostream>#include<cstring>usingnamespacestd;intmain(){charc[20]; strcpy(c,"abcdefg"); cout<<c<<endl; char*pc="abcdegh"; cout<<pc<<endl; if(strcmp(c,pc)>0) cout<<"abcdefg>abcdegh"<<endl; elseif(strcmp(c,pc)==0) cout<<"abcdefg=abcdegh"<<endl; else cout<<"abcdefg<bcdegh"<<endl;return0;}

運(yùn)行結(jié)果如下:

在程序1.2中定義了兩個(gè)C類型字符串,一個(gè)用char型數(shù)組表示,一個(gè)用char型指針表示,并分別調(diào)用字符串處理函數(shù)對(duì)它們進(jìn)行了操作。2.C++string及其操作在C++中除了可以用C_string來表示字符串外,還提供了一種更為方便的方法——用字符串類型(string)來定義字符串變量。例如:

stringstr1; //定義了一個(gè)字符串變量

stringstr2="abcdefg"; //定義字符串變量的同時(shí)進(jìn)行初始化用string定義的字符串可以方便地進(jìn)行一些類似于C_string中的strcpy、strcmp和strcat等計(jì)算,如下所示:

(1)用賦值運(yùn)算符?=?實(shí)現(xiàn)字符串復(fù)制。例如:

stringstr1="abcd";

stringstr2=str1; //str的值也為"abcd"(2)用加法運(yùn)算符?+?實(shí)現(xiàn)字符串的連接。例如:

stringstr1="abcd";

str1+="efgh"; //str1的值為"abcdefgh"(3)用邏輯運(yùn)算符?==、>、<?實(shí)現(xiàn)字符串的比較。例如:

stringstr1="abcd";stringstr2="abce";if(str1>str2)cout<<"str1>str2"<<endl;elseif(str1==str2)cout<<"str1==str2"<<endl;elsecout<<"str1<str2"<<endl;//程序輸出str1<str2

程序1.3中將程序1.2改寫成C++string形式。

【程序1.3】#include<iostream>#include<string>usingnamespacestd;intmain(){stringstr1="abcdefg";cout<<str1<<endl; stringstr2="abcdegh"; cout<<str2<<endl;if(str1>str2) cout<<"abcdefg>abcdegh"<<endl; elseif(str1==str2) cout<<"abcdefg=abcdegh"<<endl; else cout<<"abcdefg<bcdegh"<<endl; return0;}

在程序1.3中需要注意以下幾個(gè)問題:

(1)頭文件使用了#include<iostream>而不是#include<iostream.h>。這是在C++的新標(biāo)準(zhǔn)中推薦使用的頭文件包含格式。它引用的頭文件是iostream而不是iostream.h(注意這是兩個(gè)不同的頭文件,在VC6.0的系統(tǒng)目錄中它們都存在)。(2)語句“usingnamespacestd;”是引用了標(biāo)準(zhǔn)命名空間std(命名空間的概念見第9章)。在C++新標(biāo)準(zhǔn)中,不帶?.h的頭文件中定義的變量、函數(shù)等都在標(biāo)準(zhǔn)命名空間std中,所以當(dāng)使用新標(biāo)準(zhǔn)的頭文件時(shí)必須引用標(biāo)準(zhǔn)命名空間std。usingnamespacestd就是引用標(biāo)準(zhǔn)命名空間的一種方法。

(3)這里的頭文件string并不是C語言中的頭文件string.h。C語言的string.h頭文件(C++中也存在這個(gè)頭文件)定義了一些字符串操作函數(shù),而C++的頭文件string中使用了面向?qū)ο髾C(jī)制定義了字符串類型,這也就是我們使用string來定義一個(gè)字符串變量時(shí)要引入這個(gè)頭文件的原因。C++中引用C頭文件時(shí)去掉?.h,然后在頭文件名稱前面加上c前綴。1.1.3數(shù)組與向量vector1.?dāng)?shù)組

C++中數(shù)組的概念和C語言中的完全一樣。數(shù)組將同類型的多個(gè)變量歸為一組,并且提供了使用下標(biāo)偏移的方式來訪問這些變量,從而使用戶可以很方便地來操作它們。一維數(shù)組的定義方式為:類型數(shù)組名[常量表達(dá)式]常量表達(dá)式的值為數(shù)組元素的個(gè)數(shù)。以下語句就定義了一個(gè)15個(gè)元素的整型數(shù)組。

intarray[15];

數(shù)組的初始化可以在定義時(shí)將數(shù)組各元素的值羅列在大括號(hào)中,如下所示:

intarray[5]={0,1,2,3,4};

數(shù)組的存取通過下標(biāo)來訪問。上面的語句定義了一個(gè)數(shù)組array,array有15個(gè)元素,可以通過下標(biāo)來訪問這些數(shù)組元素。其實(shí)也可以認(rèn)為intarray[15]定義了15個(gè)整型的下標(biāo)變量,它們的名稱為array[0],array[1],…,array[14]。語句array[0]=0就為數(shù)組的第一個(gè)元素賦值為0。正是由于數(shù)組中的元素采用了同一名稱表示,同時(shí)提供了下標(biāo)偏移的方式存取,因此在程序中應(yīng)用起來比單獨(dú)定義與數(shù)組元素個(gè)數(shù)相同數(shù)目的不同名稱的變量要靈活得多。這也是數(shù)組的操作通常放在循環(huán)(循環(huán)結(jié)構(gòu)見3.3節(jié))中通過下標(biāo)對(duì)數(shù)組元素進(jìn)行統(tǒng)一操作的原因。如程序1.4所示的就是對(duì)數(shù)組元素進(jìn)行存取的操作。【程序1.4】#include<iostream>usingnamespacestd;intmain(){intiArray[10]; for(inti=0;i<10;i++) iArray[i]=i; for(intj=0;j<10;j++) cout<<iArray[j]<<""; return0;}

使用數(shù)組時(shí)應(yīng)注意以下幾個(gè)方面的問題:

(1)定義數(shù)組時(shí),方括號(hào)([])中的表達(dá)式必須為常量表達(dá)式而不能是變量表達(dá)式。例如,下面的定義方法是錯(cuò)誤的:

intarraySize=20;

intiarray[arraySize];

這是因?yàn)榫幾g系統(tǒng)要根據(jù)數(shù)組的定義來分配內(nèi)存空間,所以在編譯時(shí)就必須知道數(shù)組的大小。常量表達(dá)式在編譯時(shí)其值已確定,而變量編譯時(shí)其值還不確定,只有到運(yùn)行時(shí)才能確定。(2)數(shù)組名代表了分配給數(shù)組的首元素地址,它是一個(gè)地址常量,所以不能對(duì)數(shù)組名賦值。例如,以下試圖將數(shù)組arraya的值賦給數(shù)組arrayb的操作是非法的:

intarraya[5]={0,1,2,3,4};

intarrayb[5];

arrayb=arraya;//非法操作另外,數(shù)組也可以是多維的,即數(shù)組可以帶有多個(gè)下標(biāo)。例如,以下語句定義并初始化了一個(gè)二維數(shù)組:

inta[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};2.vector

從上面的討論中可見,數(shù)組是一種靜態(tài)數(shù)據(jù)結(jié)構(gòu),在定義時(shí)必須知道其大小,而在實(shí)際應(yīng)用時(shí)我們經(jīng)常需要用到動(dòng)態(tài)數(shù)組,即按用戶要求的大小定義數(shù)組的大小。C++?中的stl(標(biāo)準(zhǔn)模板庫,見第13章)中的vector就給我們提供了一種創(chuàng)建動(dòng)態(tài)數(shù)組的方法。關(guān)于vector的使用將在第13章中詳細(xì)討論,下面介紹一個(gè)簡(jiǎn)單的樣例程序。

【程序1.5】#include<iostream>#include<vector>usingnamespacestd;intmain(){intarraysize; cout<<"請(qǐng)輸入要定義的數(shù)組的大小"<<endl;cin>>arraysize; vector<int>iarray(arraysize); for(inti=0;i<arraysize;i++) { iarray[i]=i; } for(intj=0;j<arraysize;j++) { cout<<iarray[j]<<""; } return0;}

運(yùn)行結(jié)果如下:

由此可見,我們可以使用vector創(chuàng)建動(dòng)態(tài)數(shù)組,即數(shù)組的大小可以在運(yùn)行時(shí)由用戶確定。在程序1.5中應(yīng)該注意以下幾點(diǎn):

(1)?vector的定義在頭文件vector中,所以使用vector時(shí)應(yīng)包含頭文件vector。

(2)?cin是在C++中定義的用于標(biāo)準(zhǔn)輸入的對(duì)象,cin>>arraysize的作用就像C語言中的scanf("%d",&arraysize)一樣。1.1.4指針與引用

1.指針指針是C、C++中一個(gè)強(qiáng)有力的工具,正是有了指針,C、C++?才會(huì)如此高效、強(qiáng)大和靈活。下面簡(jiǎn)要討論指針的幾點(diǎn)重要用法。

1)指針變量的定義指針變量是用來存儲(chǔ)地址的一類變量。它的定義形式為:類型名*指針變量名如語句int*p定義了一個(gè)整型指針變量p,該變量可以用來存放整型變量的地址。在C++中和C語言中一樣,取一個(gè)變量的地址使用運(yùn)算符&。以下語句將整型變量i的地址賦給了整型指針p(也稱為指針變量p指向了變量i)。inti=2;

int*p=&i;2)指針變量的間接引用指針的間接引用是指通過指針變量來訪問其所指向的變量。指針變量的間接引用方式如下所示:*指針變量考慮如下程序段的作用:

inti=2;

int*p=&i; //整型指針指向了變量i

*p=3; //指針的間接引用,*p就代表了指針p所指向的變量i cout<<*p<<endl; //輸出結(jié)果為3

cout<<i<<endl; //輸出結(jié)果為3

上面的程序定義了指針變量p并將變量i的地址賦給了p(也稱為使p指向了i),以后通過p的間接引用就可以對(duì)變量i進(jìn)行存取操作,所以執(zhí)行?*p=3的操作就相當(dāng)于執(zhí)行i=3的操作。

3)指針變量作為函數(shù)參數(shù)指針變量最重要的作用是作為函數(shù)的參數(shù)傳遞。詳細(xì)討論見1.4節(jié)。2.引用

C++在C的基礎(chǔ)上擴(kuò)展了一個(gè)引用的概念。使用引用可以達(dá)到指針的效果,但在某些情況下使用引用比使用指針要容易一些,程序的語法也要簡(jiǎn)潔一些。引用是為變量或?qū)ο笕∫粋€(gè)別名,當(dāng)聲明引用時(shí)用另一個(gè)變量或?qū)ο蟮拿謱?duì)其進(jìn)行初始化。這時(shí)引用和初始化它的變量(也稱為它所引用的變量)占據(jù)同一內(nèi)存空間,所以申明引用并不占用內(nèi)存空間。在有的情況下用指針和引用能達(dá)到相同的效果,但使用引用比使用指針更節(jié)省內(nèi)存空間。

1)引用的申明引用的聲明使用下面的格式:類型名?&?引用名?=?被引用的變量名

注意:聲明引用使用運(yùn)算符&,這里的&并不是取地址的意思。而且聲明一個(gè)引用的時(shí)候就要使用別的變量或?qū)ο髮?duì)其進(jìn)行初始化。一旦聲明了引用,引用就是其所引用的變量的別名,改變了引用的值也就改變了它所引用的變量的值,改變了變量的值也就改變了引用的值,因?yàn)樗鼈冋紦?jù)的是同一內(nèi)存空間。如下面的程序片斷所示:

inta=5;

intb=7;

int&ra=a;

ra=b;

cout<<ra<<'\t'<<a<<endl;

上面程序先定義了兩個(gè)整型變量,然后定義了一個(gè)整型變量的引用并用變量a對(duì)其進(jìn)行初始化。這時(shí)ra就是a的別名,它們占據(jù)同一內(nèi)存空間。接著執(zhí)行ra=b,其作用并不是將ra重新引用到變量b上(因?yàn)橐玫某跏蓟荒茉诙x引用時(shí)進(jìn)行),而是將變量b的值賦給ra,也就是賦給a,所以最后輸出ra的值和a的值都應(yīng)該是7。

2)引用作為函數(shù)參數(shù)

C++中引用最主要的用處是作為函數(shù)參數(shù)。有關(guān)這方面的討論詳見1.4節(jié)。1.2運(yùn)算符和表達(dá)式運(yùn)算符是C語言提供的用來表示一個(gè)、兩個(gè)或多個(gè)變量或常量(也叫做操作數(shù))之間進(jìn)行算術(shù)、關(guān)系、邏輯和賦值等運(yùn)算的符號(hào)。按照作用,運(yùn)算符可以分為算術(shù)運(yùn)算符、關(guān)系運(yùn)算符、邏輯運(yùn)算符和賦值運(yùn)算符等。按照參與運(yùn)算的操作數(shù)的個(gè)數(shù),運(yùn)算符分為單目運(yùn)算符、雙目運(yùn)算符和多目運(yùn)算符,這里的單、雙和多就是指操作數(shù)的個(gè)數(shù)。對(duì)于C++初學(xué)者,一定要分清的三個(gè)概念是運(yùn)算符、表達(dá)式和程序語句。運(yùn)算符在前面已經(jīng)介紹過了。表達(dá)式就是由運(yùn)算符和操作數(shù)組成的一個(gè)序列,它們可以嵌套。表達(dá)式一般都有一個(gè)返回值,而程序語句是指包含“;”的一條完整的符號(hào)序列。程序語句有定義語句、表達(dá)式語句等。例如:+、-、*?和?/?是運(yùn)算符,a+b*c+2是一個(gè)表達(dá)式,而2+3*4+2;是一個(gè)語句;inta;?是一個(gè)定義語句;a=2+3*4+2;?是一個(gè)表達(dá)式語句。1.2.1算術(shù)運(yùn)算符和賦值運(yùn)算符

C++提供的算術(shù)運(yùn)算符有?+、-、*、/?和?%,它們都是雙目運(yùn)算符。其中除了%的操作數(shù)只能是整型數(shù)外,其他運(yùn)算符的操作數(shù)可以是int型、char型、float型和double型。+、-、*、/?代表通常意義上的加、減、乘和除運(yùn)算。%的意義是取左操作數(shù)除以右操作數(shù)的余數(shù)。例如7%3的結(jié)果就是1。

C++提供的賦值運(yùn)算符有?=、+=、-=、*=、/=、++、--?等。其中?=?是最常用的一種賦值運(yùn)算符,它的作用就是將一個(gè)變量、常量或表達(dá)式的值賦給賦值運(yùn)算符左側(cè)的變量。

例如:

inta;

a=2+3;將表達(dá)式2+3的值賦給了變量a。賦值運(yùn)算符左側(cè)的標(biāo)識(shí)符稱為“左值”,賦值運(yùn)算符右側(cè)的表達(dá)式稱為“右值”。變量可以作為左值,但常量不能作為左值,因?yàn)槌A坎荒鼙毁x值。很多表達(dá)式也不能作為左值,比如a+5就不能作為左值。另外要注意的一點(diǎn)是賦值表達(dá)式作為左值時(shí)應(yīng)加括號(hào)。例如:

inta;

(a=2)=3+a;

第二行語句的執(zhí)行過程是先將常量2的值賦給變量a,而表達(dá)式賦值a=2的值為變量a,它的執(zhí)行相當(dāng)于以下兩句語句:

a=2;

a=3+a;

賦值運(yùn)算符中的?+=、-=、*=?和?/=?是算術(shù)運(yùn)算和賦值運(yùn)算的一種簡(jiǎn)寫形式,如?+=?就是將它的左操作數(shù)與右操作數(shù)的和賦給左操作數(shù),其他幾個(gè)含義相似。例如,a+=2;?的作用就等價(jià)于語句a=a+2;。賦值運(yùn)算符中的?++?運(yùn)算符和?--?運(yùn)算符也是常用的兩個(gè)簡(jiǎn)潔運(yùn)算符。它們是單目運(yùn)算符,但?++?和?--?運(yùn)算符有前置和后置兩種形式,即a++?和?++a兩種形式。無論前置還是后置的作用都是將操作數(shù)的值加1或減1,所不同的是它們的返回值不同,后置形式的返回值為變量加1或減1之前的值,而前置形式的返回值為變量加1或減1之后的值。例如下面的程序片斷:

inta=2,b;

b=a++;

cout<<a<<endl<<b<<endl;

輸出變量a的值為3,而變量b的值為2,因?yàn)檎Z句b=a++;中的表達(dá)式a++?會(huì)將a的值加1變?yōu)?,但是表達(dá)式a++?的返回值為執(zhí)行加1之前的變量a的值(即2),所以b的值也就為2。再如程序片斷:

inta=2,b;

b=++a;

cout<<a<<endl<<b<<endl;

輸出變量a的值為3,而變量b的值為3,因?yàn)檎Z句b=a++;中的表達(dá)式a++會(huì)將a的值加1變?yōu)?,但是表達(dá)式a++的返回值為執(zhí)行加1之后的變量a的值(即2),所以b的值也就為3。1.2.2關(guān)系運(yùn)算符和邏輯運(yùn)算符

C++?提供的關(guān)系運(yùn)算符有:等于 ==

大于 >

小于 <

小于等于 <=

大于等于 >=

不等于 !=

這幾個(gè)關(guān)系運(yùn)算符都為雙目運(yùn)算符。關(guān)系運(yùn)算符構(gòu)成的關(guān)系表達(dá)式的作用是對(duì)兩個(gè)變量或表達(dá)式之間的關(guān)系進(jìn)行比較,關(guān)系表達(dá)式的值為1或0,分別代表真和假。例如:表達(dá)式2>3返回0,而3>2返回1;程序語句cout<<(2>3)<<endl;將輸出0,而cout<<(3>2)<<endl;將輸出1。

C++?提供的邏輯運(yùn)算符有:邏輯與 &&

邏輯或 ||

邏輯非 !

前兩個(gè)是雙目運(yùn)算符,最后一個(gè)是單目運(yùn)算符。參與邏輯運(yùn)算的操作數(shù)可以是關(guān)系型表達(dá)式,也可以是bool、int、char、float、double型變量或常量或另一個(gè)邏輯表達(dá)式。而由邏輯運(yùn)算符構(gòu)成的邏輯表達(dá)式的返回值和關(guān)系表達(dá)式一樣為0或1,分別代表真和假。邏輯運(yùn)算的結(jié)果如表1.2所示。在C++中新增加了一種bool型的基本類型及true和false兩個(gè)bool型常量。而參與邏輯運(yùn)算的操作數(shù)可以是關(guān)系型表達(dá)式,也可以是bool、int、char、float、double型變量或常量。如果是關(guān)系表達(dá)式,則其值為1代表真,值為0代表假;如果是int、char、float、double型變量,則0代表假,非0代表真;如果是bool型變量或常量,則true代表真,false代表假。邏輯表達(dá)式經(jīng)常用在循環(huán)或判斷的程序結(jié)構(gòu)中。表1.2邏輯運(yùn)算

另外要注意的一個(gè)問題是,邏輯表達(dá)式中存在下列兩種情況之一時(shí)被稱為邏輯短路。

(1)?a&&b&&c類型的邏輯表達(dá)式中,只有a為真時(shí)才會(huì)判斷b的值,只有a和b的值都為真時(shí)才會(huì)判斷c的值,所以,如果a為假,而b是一個(gè)執(zhí)行了某個(gè)操作的表達(dá)式,那么,這個(gè)表達(dá)式就沒有被執(zhí)行的機(jī)會(huì)。

(2)?a||b||c類型的邏輯表達(dá)式中,只有a為假時(shí)才會(huì)判斷b的值,只有a和b的值都為假時(shí)才會(huì)判斷c的值,所以,如果a為真,而b是一個(gè)執(zhí)行了某個(gè)操作的表達(dá)式,那么,這個(gè)表達(dá)式就沒有被執(zhí)行的機(jī)會(huì)。

下面介紹一個(gè)樣例程序。

【程序1.6】#include<iostream>usingnamespacestd;intmain()/*主函數(shù)*/{ inta=0; boolb=false; b&&a++&&a++; cout<<a<<endl; return0;}

該程序輸出的a的值為0,這是因?yàn)樵谟?jì)算表達(dá)式b&&a++&&a++的時(shí)候,先判斷b的值,而b的值為假,邏輯與中只要有一個(gè)值為假則整個(gè)表達(dá)式就為假,所以就沒有必要再去判斷其余的表達(dá)式了,因此兩個(gè)a++就沒有得到被執(zhí)行的機(jī)會(huì)。1.2.3運(yùn)算符的優(yōu)先級(jí)和結(jié)合性當(dāng)計(jì)算C語言的表達(dá)式的值時(shí),需要區(qū)分運(yùn)算符的優(yōu)先級(jí)和結(jié)合性。在一個(gè)表達(dá)式中,應(yīng)先處理優(yōu)先級(jí)高的運(yùn)算符再處理優(yōu)先級(jí)低的運(yùn)算符。而對(duì)于優(yōu)先級(jí)相同的運(yùn)算符,則按運(yùn)算符的結(jié)合性來處理。如果是左結(jié)合,則先處理左邊的運(yùn)算符,后處理右邊的運(yùn)算符。常見運(yùn)算符的優(yōu)先級(jí)及結(jié)合性如表1.3所示。表1.3常見運(yùn)算符的優(yōu)先級(jí)及結(jié)合性

運(yùn)算符的優(yōu)先級(jí)比較容易理解,下面舉一個(gè)結(jié)合性的例子。

【程序1.7】#include<iostream>usingnamespacestd;intmain()/*主函數(shù)*/{ inta=5; intb=3; b+=a*=3; cout<<a<<endl<<b<<endl; return0;}

運(yùn)行結(jié)果如下:

我們來分析語句b+=a*=3;。這個(gè)語句中有兩個(gè)運(yùn)算符?+=?和?*=,這兩個(gè)運(yùn)算符的優(yōu)先級(jí)相同,但它們?yōu)橛医Y(jié)合的,所以先處理運(yùn)算符?*=,即先執(zhí)行表達(dá)式a*=3,即a=a*3,執(zhí)行后a=15。這是一個(gè)賦值表達(dá)式,它的值為a的值15。然后再處理運(yùn)算符?+=,即計(jì)算表達(dá)式b+=a的值,即b=b+a。這時(shí)a的值已經(jīng)變?yōu)?5了,所以b的值為18。因此,在分析這類表達(dá)式時(shí)一定要分清運(yùn)算符的結(jié)合性。如果將上面的語句b+=a*=3;改為(b+=a)*=3;,則最后輸出的a的值就為5,b的值為24,請(qǐng)讀者自行分析。1.3程序控制結(jié)構(gòu)理論和實(shí)踐證明,無論多么復(fù)雜的算法均可通過順序、選擇、循環(huán)三種基本控制結(jié)構(gòu)構(gòu)造出來。每種結(jié)構(gòu)僅有一個(gè)入口和一個(gè)出口。結(jié)構(gòu)化程序是由這三種基本結(jié)構(gòu)組成的多層嵌套程序。圖1.1順序結(jié)構(gòu)的流程圖1.3.1順序結(jié)構(gòu)順序結(jié)構(gòu)是程序設(shè)計(jì)中最簡(jiǎn)單的結(jié)構(gòu),也是最基本的結(jié)構(gòu),它是按照程序書寫的順序逐句執(zhí)行程序中的指令。其流程圖如圖1.1所示。程序1.8就是一個(gè)順序結(jié)構(gòu)的程序。圖1.1順序結(jié)構(gòu)的流程圖【程序1.8】#include<iostream>#include<cstdlib>usingnamespacestd;intmain(){ inta=2; charc='b'; cout<<a<<endl; cout<<c<<endl; return0;}1.3.2分支結(jié)構(gòu)順序結(jié)構(gòu)的程序雖然能解決計(jì)算、輸出等問題,但不能先做判斷然后選擇執(zhí)行。對(duì)于要先做判斷再選擇的問題就要使用分支結(jié)構(gòu)。分支結(jié)構(gòu)的執(zhí)行是依據(jù)一定的條件選擇執(zhí)行路徑,而不是嚴(yán)格按照語句出現(xiàn)的物理順序。分支結(jié)構(gòu)的程序設(shè)計(jì)方法關(guān)鍵在于構(gòu)造合適的分支條件和分析程序流程,根據(jù)不同的程序流程選擇適當(dāng)?shù)姆种дZ句。分支結(jié)構(gòu)適合于帶有邏輯或者關(guān)系比較等條件判斷的計(jì)算,設(shè)計(jì)這類程序時(shí)往往都要先繪制其程序流程圖,然后根據(jù)程序流程寫出源程序,這樣做把程序設(shè)計(jì)分析與語言分開,使得問題簡(jiǎn)單化,易于理解。程序流程圖是根據(jù)解題分析所繪制的程序執(zhí)行流程圖。

學(xué)習(xí)分支結(jié)構(gòu)不要被嵌套分支所迷惑,只要正確繪制出流程圖,弄清各分支所要執(zhí)行的功能,嵌套分支結(jié)構(gòu)也就不難掌握了。嵌套分支只不過是分支中又包括分支語句而已,不是新知識(shí),只要對(duì)多分支理解清楚,嵌套分支也是不難掌握的。下面介紹幾種基本的分支結(jié)構(gòu)。

1.?if分支語句其語句格式為:

if(條件表達(dá)式){

分支體

}

這種分支結(jié)構(gòu)中的分支體可以是一條語句,此時(shí)“{}”可以省略,也可以是多條語句即復(fù)合語句。它有兩條分支路徑可選,一是當(dāng)條件為真,執(zhí)行分支體,否則跳過分支體,這時(shí)分支體就不會(huì)執(zhí)行。例如,要計(jì)算x的絕對(duì)值,根據(jù)絕對(duì)值的定義可知,當(dāng)x>=0時(shí),其絕對(duì)值不變,而x<0時(shí)其絕對(duì)值是x的相反數(shù),因此程序段為?if(x<0)x=-x;。2.?if-else分支語句其語句格式為:

if(條件表達(dá)式){

分支1

}

else

{

分支2

}

這是典型的分支結(jié)構(gòu),如果條件成立,執(zhí)行分支1,否則執(zhí)行分支2。分支1和分支2都可以由1條或若干條語句構(gòu)成。

例如,求ax^2+bx+c=0的根。分析:因?yàn)楫?dāng)b^2-4ac>=0時(shí),方程有兩個(gè)實(shí)根,否則(b^2-4ac<0)。有兩個(gè)共軛復(fù)根。其程序段如下:

d=b*b-4*a*c;if(d>=0){ x1=(-b+sqrt(d))/2a; x2=(-b-sqrt(d))/2a; printf("x1=%8.4f,x2=%8.4f\n",x1,x2);}else{ r=-b/(2*a); i=sqrt(-d)/(2*a); printf("x1=%8.4f+%8.4fi\n"r,i); printf("x2=%8.4f-%8.4fi\n"r,i)}3.嵌套分支語句其語句格式為:

if(條件表達(dá)式1){分支1};

elseif(條件表達(dá)式2){分支2}elseif(條件表達(dá)式3){分支3}

elseif(條件表達(dá)式n){分支n}

else{分支n+1}

嵌套分支語句雖可解決多個(gè)入口和出口的問題,但超過3重嵌套后,語句結(jié)構(gòu)變得非常復(fù)雜,對(duì)于程序的閱讀和理解都極為不便,建議嵌套在3重以內(nèi),超過3重可以用switch開關(guān)語句。4.switch開關(guān)語句其語句格式為:

switch(表達(dá)式)

{

case常量表達(dá)式1:語句1

case常量表達(dá)式2:語句2

case常量表達(dá)式n:語句n

default:語句n+1

}

該語句也是多分支選擇語句,到底執(zhí)行哪一塊,取決于開關(guān)設(shè)置,也就是表達(dá)式的值與常量表達(dá)式相匹配的那一路。它不同于if…else語句,它的所有分支都是并列的,程序執(zhí)行時(shí),由第一分支開始查找,如果相匹配,執(zhí)行其后的塊,接著執(zhí)行第2分支的塊,第3分支的塊……,直到遇到break語句;如果不匹配,查找下一個(gè)分支是否匹配。這個(gè)語句在應(yīng)用時(shí)要特別注意開關(guān)條件的合理設(shè)置以及break語句的合理應(yīng)用。下面的程序段可以按我們輸入的不同字符執(zhí)行不同的操作:

charc;cin>>c;switch(c){ case'a': cout<<"您輸入了a"<<endl; break; case'b': cout<<"您輸入了b"<<endl; break; default: cout<<"您輸入的既不是a也不是b"<<endl;}1.3.3循環(huán)結(jié)構(gòu)循環(huán)結(jié)構(gòu)是程序中一種很重要的結(jié)構(gòu)。其特點(diǎn)是,

在給定條件成立時(shí),反復(fù)執(zhí)行某程序段,直到條件不成立時(shí)為止。

給定的條件稱為循環(huán)條件,反復(fù)執(zhí)行的程序段稱為循環(huán)體。C、C++語言提供了多種循環(huán)語句,可以組成各種不同形式的循環(huán)結(jié)構(gòu)。

1.while語句

while語句的一般形式為:

while(條件表達(dá)式){

語句;

}其中,表達(dá)式是循環(huán)條件,語句為循環(huán)體。while語句的語義是:計(jì)算表達(dá)式的值,當(dāng)值為真(非0)時(shí),

執(zhí)行循環(huán)體語句。例如,下面的程序段根據(jù)標(biāo)準(zhǔn)輸入給一個(gè)程序段賦值:

intiArray[10];

inti=0;

while(i<10)

{

cin>>iArray[i++];

}2.do-while語句

do-while語句的一般形式為:

do{

語句;

}while(表達(dá)式);

其中,語句是循環(huán)體,表達(dá)式是循環(huán)條件。

do-while語句的語義是:先執(zhí)行循環(huán)體語句一次,再判斷表達(dá)式的值,若為真(非0)則繼續(xù)循環(huán),否則終止循環(huán)。do-while語句和while語句的區(qū)別在于,do-while是先執(zhí)行后判斷,因此do-while至少要執(zhí)行一次循環(huán)體;而while是先判斷后執(zhí)行,如果條件不滿足,則一次循環(huán)體語句也不執(zhí)行。while語句和do-while語句一般都可以相互改寫。例如,前面的while語句中的程序段可以改寫為如下的形式:

intiArray[10];

inti=0;

do{

cin>>iArray[i++];

}while(i<10);3.for語句

for語句是C語言所提供的功能更強(qiáng)、使用更廣泛的一種循環(huán)語句。其一般形式為:

for(表達(dá)式1;表達(dá)式2;表達(dá)3)

{語句;

}

表達(dá)式1通常用來給循環(huán)變量賦初值,一般是賦值表達(dá)式。也允許在for語句外給循環(huán)變量賦初值,此時(shí)可以省略該表達(dá)式。

表達(dá)式2通常是循環(huán)條件,一般為關(guān)系表達(dá)式或邏輯表達(dá)式。

表達(dá)式3通??捎脕硇薷难h(huán)變量的值,一般是賦值語句。這三個(gè)表達(dá)式都可以是逗號(hào)表達(dá)式,

即每個(gè)表達(dá)式都可由多個(gè)表達(dá)式組成。三個(gè)表達(dá)式都是任選項(xiàng),都可以省略。

for語句的語義是:首先計(jì)算表達(dá)式1的值;再計(jì)算表達(dá)式2的值,若值為真(非0)則執(zhí)行循環(huán)體一次,

否則跳出循環(huán);然后再計(jì)算表達(dá)式3的值,轉(zhuǎn)回上一步重復(fù)執(zhí)行。在整個(gè)for循環(huán)過程中,表達(dá)式1只計(jì)算一次,表達(dá)式2和表達(dá)式3則可能計(jì)算多次。循環(huán)體可能多次執(zhí)行,也可能一次都不執(zhí)行。前面的do-while語句中的程序段給整型變量從標(biāo)準(zhǔn)輸入設(shè)備輸入值后,如果用for語句輸出它的值,則程序段如下:

intiArray[10];inti=0; do { cin>>iArray[i++]; }while(i<10); cout<<"asdf"<<endl; for(intj=0;j<10;j++) { cout<<iArray[j]<<endl; }1.4函數(shù)幾乎所有的程序設(shè)計(jì)語言中都有子程序的概念,而C、C++語言中的子程序是用函數(shù)來實(shí)現(xiàn)的。每個(gè)C、C++?程序都由一個(gè)主函數(shù)和若干個(gè)子函數(shù)構(gòu)成。主函數(shù)是整個(gè)程序的入口函數(shù),即所有的C、C++?程序都是從main函數(shù)開始執(zhí)行的。main函數(shù)可以調(diào)用其他函數(shù),其他函數(shù)也可以調(diào)用別的函數(shù)。1.4.1函數(shù)的定義函數(shù)定義的一般形式如下:函數(shù)返回值類型函數(shù)名(形參1,形參2,……,形參n){

語句;

}

函數(shù)定義中的“形參1,形參2,……,形參n”稱為形參列表,函數(shù)的形參列表也可以為空,形參為空的函數(shù)叫做無參函數(shù),不為空的叫做有參函數(shù)。函數(shù)中大括號(hào)內(nèi)的部分叫做函數(shù)體。在函數(shù)體的最后往往有一個(gè)return語句,返回一個(gè)值,這個(gè)值的類型通常與函數(shù)返回值類型相同。函數(shù)的作用就像一個(gè)數(shù)據(jù)的加工廠,我們將一定的數(shù)據(jù)交給形參,函數(shù)負(fù)責(zé)將它們加工成一個(gè)成品,這個(gè)成品就是函數(shù)的返回值。

以下程序段定義了一個(gè)函數(shù)printArray:

voidprintArray(inta[],intn){for(inti=0;i<n;i++) { cout<<a[i]<<endl; }}

該函數(shù)有兩個(gè)形參,第一個(gè)形參是一個(gè)整形數(shù)組,第二個(gè)形參為數(shù)組的大小,在函數(shù)體中用一個(gè)for循環(huán)將數(shù)組的元素輸出。1.4.2函數(shù)參數(shù)的傳遞有參函數(shù)在函數(shù)調(diào)用時(shí),主調(diào)函數(shù)和被調(diào)函數(shù)之間有參數(shù)的傳遞。函數(shù)的調(diào)用形式如下:函數(shù)名(實(shí)參1,實(shí)參2,……,實(shí)參n);

函數(shù)的參數(shù)傳遞是單向的,只能由實(shí)參傳遞給形參。當(dāng)函數(shù)調(diào)用完成后形參的內(nèi)存空間就釋放了,并不將形參的值傳回實(shí)參。

C++中函數(shù)參數(shù)的傳遞有三種方式:值傳遞、指針傳遞、引用傳遞。

1.值傳遞函數(shù)調(diào)用時(shí)的值傳遞是指函數(shù)的形參為一般的變量形式,函數(shù)調(diào)用時(shí)將實(shí)參的值復(fù)制給形參。

程序1.9給出了一個(gè)函數(shù)max,該函數(shù)有兩個(gè)整形參數(shù),函數(shù)運(yùn)行后能夠返回這兩個(gè)參數(shù)中的最大值。

【程序1.9】#include<iostream>usingnamespacestd;intmax(inta,intb) //函數(shù)定義

{ if(a>=b) returna; else returnb;}intmain(){ intx,y; cin>>x>>y; cout<<"變量x和y中的最大值是:"<<max(x,y)<<endl; //函數(shù)調(diào)用

return0;}

上面的程序中,max函數(shù)有兩個(gè)形參a和b。在main函數(shù)調(diào)用時(shí)將main函數(shù)中的變量x和y作為實(shí)參傳遞給了函數(shù)max,這種傳遞只在函數(shù)調(diào)用的時(shí)候發(fā)生,函數(shù)調(diào)用完成后形參釋放而并不將形參的值再?gòu)?fù)制給實(shí)參。函數(shù)調(diào)用時(shí)的值傳遞是單向傳遞。2.指針傳遞函數(shù)調(diào)用時(shí)的指針傳遞是指函數(shù)的形參為指針類型,調(diào)用時(shí)將實(shí)參的值(變量的地址)復(fù)制給形參(指針)。程序1.10中的swap函數(shù)就是指針傳遞函數(shù)。

【程序1.10】#include<iostream>usingnamespacestd;voidswap(int*p1,int*p2){inttemp; temp=*p1; *p1=*p2; *p2=temp;}intmain(){ inta=2; intb=3;swap(&a,&b); //函數(shù)調(diào)用

cout<<"a="<<a<<endl<<"b="<<b<<endl; return0;}

上面的程序定義的函數(shù)swap中形參的形式為指針類型,而在main函數(shù)調(diào)用的時(shí)候傳遞給函數(shù)swap的實(shí)參的形式為變量a和b的地址。

這個(gè)程序的運(yùn)行結(jié)果如下:

由運(yùn)算結(jié)果可見,這個(gè)函數(shù)在被調(diào)函數(shù)中改變了主調(diào)函數(shù)的變量的值,這一點(diǎn)似乎與前面講到的函數(shù)的參數(shù)傳遞是單向的,只能由實(shí)參傳遞給形參,而不能由形參傳遞給實(shí)參矛盾。下面我們來分析上面的函數(shù)是怎么做到這一點(diǎn)的。

由于函數(shù)是按指針傳遞的,因此在調(diào)用函數(shù)時(shí)我們傳遞給函數(shù)的實(shí)參只能是變量的地址,在參數(shù)傳遞時(shí)仍然是值的復(fù)制。在此將實(shí)參a和b的地址復(fù)制給了形參p1和p2,這時(shí)由于形參等到的是實(shí)參的地址,因此在函數(shù)體內(nèi)通過指針的間接引用操作實(shí)際上就可以間接地操作實(shí)參了。而

temp=*p1;*p1=*p2;*p2=temp;

這三句將實(shí)參的值交互了。如果將上面的程序改為如程序1.11的值傳遞形式,就不能起到相同的作用?!境绦?.11】#include<iostream>usingnamespacestd;voidswap(intx,inty){ inttemp; temp=x;x=y; y=temp;}intmain(){ inta=2; intb=3; swap(a,b); cout<<"a="<<a<<endl<<"b="<<b<<endl; return0;}

運(yùn)行結(jié)果如下:

這個(gè)程序中,函數(shù)調(diào)用的時(shí)候?qū)?shí)參a和b的值復(fù)制給了形參x和y,在函數(shù)內(nèi)部,只是交換了形參的值,而實(shí)參的值并沒有交換。3.引用傳遞函數(shù)調(diào)用時(shí)的引用傳遞是指函數(shù)定義時(shí)的形參為引用類型,而函數(shù)調(diào)用時(shí)的實(shí)參為普通變量,于是函數(shù)調(diào)用時(shí)形參就成為了實(shí)參的引用。下面的程序1.12也能達(dá)到程序1.10的作用。

【程序1.12】#include<iostream>usingnamespacestd;voidswap(int&x,int&y){ inttemp; temp=x;x=y; y=temp;}intmain(){ inta=2; intb=3; swap(a,b); cout<<"a="<<a<<endl<<"b="<<b<<endl; return0;}

這個(gè)程序的輸出結(jié)果如下:

程序1.12和程序1.11的唯一差別在于函數(shù)定義時(shí)程序1.12為swap(int&x,int?&y),即引用傳遞形式,而程序1.11為swap(intx,inty),即值傳遞形式。在引用傳遞時(shí),形參被定義為引用形式,根據(jù)前面講到的引用的概念,引用并不占據(jù)內(nèi)存空間。所以在函數(shù)調(diào)用時(shí)形參就成了實(shí)參的別名,這時(shí)形參和實(shí)參占據(jù)了同一內(nèi)存空間。在函數(shù)體中改變了形參的值也就是改變了實(shí)參的值,所以在函數(shù)體內(nèi)交換了形參的值也就相當(dāng)于交換了實(shí)參的值。1.4.3函數(shù)的返回值函數(shù)的作用就像一個(gè)數(shù)據(jù)加工廠,我們將一定的數(shù)據(jù)交給形參,函數(shù)負(fù)責(zé)將它們

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論