C++簡(jiǎn)單程序設(shè)計(jì)課件_第1頁(yè)
C++簡(jiǎn)單程序設(shè)計(jì)課件_第2頁(yè)
C++簡(jiǎn)單程序設(shè)計(jì)課件_第3頁(yè)
C++簡(jiǎn)單程序設(shè)計(jì)課件_第4頁(yè)
C++簡(jiǎn)單程序設(shè)計(jì)課件_第5頁(yè)
已閱讀5頁(yè),還剩1148頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

C++簡(jiǎn)單程式設(shè)計(jì)1.1C++語言概述

1.1.1從C到C++C++語言是從C語言發(fā)展演變而來的,因此在介紹C++語言之前,我們首先介紹一下C語言。C語言最初是美國(guó)貝爾實(shí)驗(yàn)室的戴尼斯·M·利奇(Dennis.M.Ritchie)在B語言基礎(chǔ)上開發(fā)出來的,並於1972年在一臺(tái)PDP-11電腦上實(shí)現(xiàn)了最初的C語言。目前,比較流行的C語言版本基本上都是以ANSIC為基礎(chǔ)的。C語言具有以下優(yōu)點(diǎn):

①語言簡(jiǎn)潔靈活。

②運(yùn)算符和數(shù)據(jù)結(jié)構(gòu)豐富,具有結(jié)構(gòu)化控制語句,程式執(zhí)行效率高。

③與高級(jí)語言相比,具有可以直接訪問物理地址,能進(jìn)行位運(yùn)算的優(yōu)點(diǎn)。

④與組合語言相比,又具有良好的可讀性和可移植性。

儘管如此,C語言畢竟是一個(gè)面向過程的編程語言,因此與其它面向過程的編程語言一樣,已經(jīng)不能滿足運(yùn)用面向?qū)ο蠓椒ㄩ_發(fā)軟體的需要。C++語言便是在C語言基礎(chǔ)上為支持面向?qū)ο蟮某淌皆O(shè)計(jì)而研製的一個(gè)通用的程式設(shè)計(jì)語言,它是在1980年由貝爾實(shí)驗(yàn)室的BjarneStroustrup博士創(chuàng)建的。C++包含了整個(gè)C,C是建立C++的基礎(chǔ)。C++包括C的全部特徵、屬性和優(yōu)點(diǎn),同時(shí),C++添加了對(duì)面向?qū)ο缶幊痰耐耆С帧?.1.2一個(gè)簡(jiǎn)單的C++程式現(xiàn)在,我們來看一個(gè)簡(jiǎn)單的程式實(shí)例。例1-1是一個(gè)面向過程的程式,我們只是通過這個(gè)程式看一看,電腦程式是個(gè)什麼樣子,人們?nèi)绾瓮ㄟ^程式來控制電腦的操作?!纠?-1】一個(gè)簡(jiǎn)單的C++程式例題。

#include<iostream.h>voidmain(void){ cout<<"hello!\n"; cout<<"Iamastudent.\n";}

這裏main是主函數(shù)名,函數(shù)體用一對(duì)大括弧括住。C++程式由函數(shù)構(gòu)成。在C++程式中,必須有且只能有一個(gè)名為main()的函數(shù),因?yàn)槌淌娇偸菑膍ain()開始執(zhí)行的。main()函數(shù)之前的void表示main()函數(shù)沒有返回值(關(guān)於函數(shù)的返回值將在第2章介紹)。程式由語句組成,每條語句由分號(hào)“;”作為結(jié)束符。cout是一個(gè)輸出流對(duì)象,它是C++系統(tǒng)預(yù)定義的對(duì)象,其中包含了許多有用的輸出功能。輸出操作由操作符“<<”來表達(dá),其功能是將緊隨其後的雙引號(hào)中的字串輸出到標(biāo)準(zhǔn)輸出設(shè)備(顯示器)上。在第9章中將對(duì)輸出流做詳細(xì)介紹,在這裏,讀者只要知道這段程式可以實(shí)現(xiàn)在顯示器上輸出hello!Iamastudent.

就可以了。程式中的#include<iostream.h>的作用是在編譯之前,將檔iostream.h中的代碼嵌入到程式中該指令所在的地方。作為程式的一部分,iostream.h檔中聲明了程式所需要的輸入和輸出操作的有關(guān)資訊。cout和“<<”操作的有關(guān)資訊就是在該檔中聲明的。由於這類檔常被嵌入在程式的開始處,所以稱之為頭檔。在C++程式中如果使用了系統(tǒng)中提供的一些功能,就必須嵌入相關(guān)的頭檔。

當(dāng)我們編寫完程式文本後,要將它存儲(chǔ)為尾碼為.cpp的檔,此檔稱為C++原始檔案,再經(jīng)過編譯系統(tǒng)的編譯、連接後,最後產(chǎn)生出尾碼為.exe的可執(zhí)行檔。通過以上程式可以看出,C++的程式結(jié)構(gòu)由編譯預(yù)處理、程式主體和注釋組成,其特點(diǎn)如下:

①每個(gè)以符號(hào)“?!遍_頭的行,稱為編譯預(yù)處理語句。編譯預(yù)處理是C++組織程式的工具。有關(guān)#include語句的作用及其使用方法,將在第5章進(jìn)行詳細(xì)介紹。②一個(gè)C++程式可以由一個(gè)或多個(gè)函數(shù)組成。任何一個(gè)完整的C++程式,都必須包含一個(gè)且只能包含一個(gè)名為main()的函數(shù),程式總是從main()函數(shù)開始執(zhí)行,而不管main()函數(shù)處?kù)冻淌降氖颤N位置。

③函數(shù)體應(yīng)由“{}”括起來。函數(shù)體一般包括變數(shù)的定義部分和執(zhí)行部分。所有的變數(shù)要先定義後使用。

④注釋是程式員為讀者寫的說明,是提高程式可讀性的一種手段。一般可將注釋分為兩種:序言注釋和注解注釋。前者用於程式開頭,說明程式或檔的名稱、用途、編寫時(shí)間、編寫人以及輸入、輸出等,後者用於程式難懂的地方。C++的注釋為“//”之後的內(nèi)容,直到換行。注釋僅供閱讀程式使用,是程式的可選部分。在生成可執(zhí)行程式之前,C++忽略注釋,並把每個(gè)注釋都視為一個(gè)空格。另外,C++還相容了C語言的注釋。

⑤每個(gè)語句和數(shù)據(jù)定義的後面都要有一個(gè)分號(hào)。這一點(diǎn)初學(xué)者尤其要注意。

⑥main函數(shù)名和關(guān)鍵字(如void、int、float等)都是小寫字母構(gòu)成。C++程式中的識(shí)別字是大小寫“敏感”的,所以,在書寫識(shí)別字的時(shí)候要注意其大小寫。1.1.3字元集

C++語言的字元集由下述字元構(gòu)成:①英文字母:A~Z,a~z②數(shù)字字元:0~9③特殊字元:空格 ! # % ^ & * _(下劃線)+ = : - ~ < > / \? 〝 ; .(){}[] 1.1.4詞法記號(hào)詞法(語句)記號(hào)是構(gòu)成語句的最小單元,這裏我們介紹C++的識(shí)別字、關(guān)鍵字、文字、運(yùn)算符、分隔符號(hào)和空白符。

1.識(shí)別字識(shí)別字是程式員聲明的字元序列,它命名程式正文中的一些實(shí)體,如函數(shù)名、變數(shù)名、類名、對(duì)象名等。C++識(shí)別字的構(gòu)成規(guī)則如下:①以大寫字母、小寫字母或下劃線(_)開始。

②可以由大寫字母、小寫字母、下劃線(_)或數(shù)字0~9組成。

③大寫字母和小寫字母代表不同的識(shí)別字。

④不能是C++關(guān)鍵字。例如,Richad、red_line、_Nol都是合法的識(shí)別字,而No.1、1st則是不合法的識(shí)別字。在識(shí)別字的命名中要特別注意:C++是大小寫敏感的,即大寫和小寫字母被認(rèn)為是不同的字母。例如,識(shí)別字something、Something、SOMETHING、SomeThing都被視為不同的名字。2.關(guān)鍵字關(guān)鍵字是C++預(yù)定義好的識(shí)別字,這些識(shí)別字對(duì)C++編譯系統(tǒng)有著特殊的含義。如例1-1中的void,後面將逐步介紹到的數(shù)據(jù)定義語句int、float、long及double等等,它們都是C++的關(guān)鍵字。

3.文字文字是在程式中直接使用符號(hào)表示的數(shù)據(jù),包括數(shù)字、字元、字串和布爾文字。在本章1.2節(jié)中將詳細(xì)介紹各種文字。

4.操作符(運(yùn)算符)

操作符是用於實(shí)現(xiàn)各種運(yùn)算的符號(hào),例如+、-、*、/等。在本章1.2節(jié)及後續(xù)章節(jié)中將詳細(xì)介紹各種操作符。5.分隔符號(hào)分隔符號(hào)用於分隔各個(gè)詞法記號(hào)或程式正文。C++的分隔符號(hào)如下:

(){} , : ;

這些分隔符號(hào)不表示任何實(shí)際的操作,僅用於構(gòu)造程式。例如,“{}”用於分隔函數(shù)體,“;”作為語句的分隔符號(hào),其他分隔符號(hào)的具體用法會(huì)在以後相應(yīng)的章節(jié)仲介紹。

6.空白符在程式編譯時(shí)的詞法分析階段將程式正文分解為詞法記號(hào)和空白??瞻资强崭瘛⑻蛔衷?TAB鍵產(chǎn)生的字元)、換行符(Enter鍵所產(chǎn)生的字元)和注釋的總稱。

空白符用於指示詞法記號(hào)的開始和結(jié)束位置,但除了這一功能之外,其餘的空白將被忽略。因此,C++程式可以不必嚴(yán)格地按行書寫,凡是可以出現(xiàn)空格的地方,都可以出現(xiàn)換行。例如:

intj;與

intj;或與

intj

;

是等價(jià)的。但是儘管如此,我們?cè)跁鴮懗淌綍r(shí),仍要力求清晰、易讀。因?yàn)橐粋€(gè)程式不僅要讓機(jī)器執(zhí)行,還要讓人閱讀的同時(shí)便於修改、維護(hù)。1.2基本數(shù)據(jù)類型和運(yùn)算式

程式處理的對(duì)象是數(shù)據(jù)。數(shù)據(jù)有許多種類,例如數(shù)值數(shù)據(jù)、文字?jǐn)?shù)據(jù)、圖像數(shù)據(jù)以及聲音數(shù)據(jù)等,但其中最基本也是最常用的是數(shù)值數(shù)據(jù)和文字?jǐn)?shù)據(jù)。無論什麼數(shù)據(jù),在對(duì)其進(jìn)行處理時(shí)都要先存放在記憶體中。顯然,不同類型的數(shù)據(jù)在內(nèi)存中的存放格式也不相同,甚至同一類數(shù)據(jù),為了處理方便,也可以使用不同的存儲(chǔ)格式。例如,數(shù)值數(shù)據(jù)其存儲(chǔ)格式又可以分為整型、長(zhǎng)整型、浮點(diǎn)型和雙精度型等幾種類型;文字?jǐn)?shù)據(jù)也可以分為單個(gè)字元和字串。

我們編寫電腦程式的目的,就是為了解決客觀世界中的現(xiàn)實(shí)問題。所以,高級(jí)語言中提供了豐富的數(shù)據(jù)類型和運(yùn)算符。C++中的數(shù)據(jù)類型分為基本類型和非基本類型,見圖1-1?;绢愋褪荂++編譯系統(tǒng)內(nèi)置的,非基本類型也稱為用戶定義數(shù)據(jù)類型,即用戶自己定義的數(shù)據(jù)類型,本節(jié)我們首先介紹基本數(shù)據(jù)類型。圖1-1C++的數(shù)據(jù)類型1.2.1基本數(shù)據(jù)類型一個(gè)程式要運(yùn)行,就要先描述演算法。描述一個(gè)演算法應(yīng)先說明演算法要用的數(shù)據(jù),數(shù)據(jù)以變數(shù)或常量的形式來描述。每個(gè)變數(shù)或常量都有數(shù)據(jù)類型。變數(shù)是存儲(chǔ)資訊的單元,它對(duì)應(yīng)於某個(gè)記憶體空間。為了便於描述,電腦高級(jí)語言中都用變數(shù)名來表示其記憶體空間,所以,程式能在變數(shù)中存儲(chǔ)值和取出值。

在定義變數(shù)時(shí),說明變數(shù)名和數(shù)據(jù)類型(如int、float)就是告訴編譯器要為變數(shù)分配多少空間,以及變數(shù)中要存儲(chǔ)什麼類型的值。數(shù)據(jù)類型的定義確定了其記憶體所占空間大小,也確定了其表示範(fàn)圍。表1-1列出了基本數(shù)據(jù)類型的取值範(fàn)圍。在不同的系統(tǒng)中,每個(gè)變數(shù)類型所占的位元組數(shù)目可能有所不同,表1-1裏列出的是在VC++6.0編譯環(huán)境中的情況(也是目前大多數(shù)編譯環(huán)境中的情況)。表1-1常用基本數(shù)據(jù)類型描述類型說明長(zhǎng)度表示範(fàn)圍備注bool邏輯型1false,true

char字元型1-128~127-27~(27-1)unsignedchar無符號(hào)字元型10~2550~(28-1)short短整形2-32768~32767-215~(215-1)unsignedshort無符號(hào)短整型20~655350~(216-1)int整型4-2147483648~2147483647-231~(231-1)unsignedint無符號(hào)整型40~42949672950~(232-1)long長(zhǎng)整型4-2147483648~2147483647-231~(231-1)unsignedlong無符號(hào)長(zhǎng)整型40~42949672950~(232-1)float浮點(diǎn)型4-3.4×1038~3.4×10387位有效位double雙精度8-1.7×10308~1.7×1030815位有效位longdouble長(zhǎng)雙精度8-1.7×10308~1.7×1030815位有效位1.2.2常量所謂常量,是指在程式運(yùn)行的整個(gè)過程中其值始終不可改變的量。例如,68、3.5、'A'、"hello!"都是常量。常量有以下幾種。

1.整型常量整型常量即以數(shù)碼形式出現(xiàn)的整數(shù),包括正整數(shù)、負(fù)整數(shù)和零。整型常量的表示形式有十進(jìn)位、八進(jìn)制和十六進(jìn)制。十進(jìn)位整型常量的一般形式與數(shù)學(xué)中我們所熟悉的表示形式是一樣的:[±]若干個(gè)0~9的數(shù)字即符號(hào)加若干個(gè)0~9的數(shù)字,但數(shù)字部分不能以0開頭,正數(shù)前邊的正號(hào)可以省略。

八進(jìn)制整型常量的數(shù)字部分要以數(shù)字0開頭,一般形式為

[±]0若干個(gè)0~7的數(shù)字十六進(jìn)制整型常量的數(shù)字部分要以ox開頭,一般形式為

[±]ox若干個(gè)0~9的數(shù)字及A~F的字母(大小寫均可)

整型常量可以用尾碼字母L(或l)表示長(zhǎng)整型,用尾碼字母U(或u)表示無符號(hào)型,也可同時(shí)使用尾碼L和U(大小寫無關(guān))。例如,123、0123、-ox5af都是合法的常量形式2.實(shí)型常量實(shí)型常量又稱浮點(diǎn)小數(shù)。在C++語言中,實(shí)型常量只使用十進(jìn)位表示,有兩種表示形式:一般形式和指數(shù)形式。一般形式:例如,16.5、-13.5等。指數(shù)形式:例如,0.565E+2表示0.565×102,-34.4E-3表示-34.4×10-3,其中,字母E可以大寫或小寫。當(dāng)以指數(shù)形式表示一個(gè)實(shí)數(shù)時(shí),整數(shù)部分和小數(shù)部分可以省略其一,但不能都省略。例如,.234E-1和12.E2都是正確的,但不能寫成E-3這種形式。實(shí)型常量默認(rèn)為double型,如果尾碼為F(或f)則為float型。3.字元常量字元常量是單引號(hào)括起來的一個(gè)字元,如'a'、'G'、'?'、'$'等。另外,還有一些字元是不可顯示字元,也無法通過鍵盤輸入,例如響鈴、換行、跳位字元、回車等等。這樣的字元常量該如何寫到程式中呢?C++提供了一種稱為轉(zhuǎn)義序列的表示方法來表示這些字元,表1-2列出了C++預(yù)定義的轉(zhuǎn)義序列。表1-2C++預(yù)定義的轉(zhuǎn)義序列字元形式ASCII碼(十六進(jìn)制)功

能\n0A換行\(zhòng)t09橫向跳格(即跳到下一個(gè)輸出區(qū))\v0B豎向跳格\b08退格\r0D回車\a07響鈴\\5C反斜杠字元“\”\'27單引號(hào)\"22雙引號(hào)\dddddd(八進(jìn)制)1到3位八進(jìn)制數(shù)所代表的字元\xhhHh1到2位十六進(jìn)制數(shù)所代表的字元4.字串常量字串常量簡(jiǎn)稱字串,是用一對(duì)雙引號(hào)括起來的字元序列。例如,''China''、''1234''都是字串常量。字串與字元是不同的,字串在內(nèi)存中的存放形式是:按串中字元的排列次序順序存放對(duì)應(yīng)字元的ASCII碼,每個(gè)字元占一個(gè)位元組,並在字串末尾添加'\0'作為結(jié)束標(biāo)記。圖1-2是字元數(shù)據(jù)及其存儲(chǔ)形式(十六進(jìn)制)的舉例。從圖1-2中可以看出,字串''a''與字元'a'是不同的。

5.布爾型常量布爾型常量只有兩個(gè):false(假)和true(真)。圖1-2字元數(shù)據(jù)的存儲(chǔ)形式1.2.3變數(shù)在程式的執(zhí)行過程中其值可以變化的量稱為變數(shù),變數(shù)需要用識(shí)別字來命名。就像常量具有各種類型一樣,變數(shù)也具有相應(yīng)的類型。變數(shù)在使用之前需要首先聲明其類型和名稱。在同一語句中可以聲明同一類型的多個(gè)變數(shù)。變數(shù)聲明的形式如下:

<類型識(shí)別字>變數(shù)名1,變數(shù)名2,…,變數(shù)名n;

在程式運(yùn)行時(shí)系統(tǒng)會(huì)給每一個(gè)聲明過的變數(shù)分配記憶體空間,用於存放對(duì)應(yīng)類型的數(shù)據(jù),因而變數(shù)名也就是對(duì)相應(yīng)記憶體單元的命名。在聲明一個(gè)變數(shù)的同時(shí),也可以給它賦以初值,而這實(shí)質(zhì)上就是給對(duì)應(yīng)的記憶體單元賦值。例如:

inta=3;

floatf=3.45; charc='b';

有一點(diǎn)值得注意,雖然C++中有字串常量,卻沒有字串變數(shù)。那麼,用什麼類型的變數(shù)來存放字串呢?在後面的章節(jié),我們會(huì)介紹用字符數(shù)組來存儲(chǔ)字串常量。1.2.4引用程式設(shè)計(jì)語言的進(jìn)化使用戶從被迫解決細(xì)節(jié)問題中解脫出來,而轉(zhuǎn)向允許用戶花更多的時(shí)間來考慮“大的藍(lán)圖”。根據(jù)這種精神,C++包含了一個(gè)稱為引用的特性。本小節(jié)僅僅介紹了引用的基本概念,有關(guān)更詳細(xì)的內(nèi)容在後面章節(jié)會(huì)陸續(xù)介紹,到時(shí)讀者就會(huì)掌握引用的使用方法。

引用是個(gè)別名,當(dāng)建立引用時(shí),程式用另一個(gè)變數(shù)或?qū)ο螅繕?biāo))的名字來對(duì)其進(jìn)行初始化。自此,引用作為目標(biāo)的別名而使用,對(duì)引用的改動(dòng)實(shí)際是對(duì)目標(biāo)的改動(dòng)。引用的聲明形式為

<類型識(shí)別字>&引用名=目標(biāo)名或

<類型識(shí)別字>&引用名=目標(biāo)名

其中:

①引用名是為引用型變數(shù)所起的名字,它必須遵循變數(shù)的命名規(guī)則。

②前面的數(shù)據(jù)類型就是它所引用目標(biāo)的數(shù)據(jù)類型。在此要特別說明的是,引用在聲明時(shí)必須進(jìn)行初始化,即指出該引用是哪一個(gè)對(duì)象的別名。這裏的目標(biāo)名可以是變數(shù)名,也可以是以後將要介紹的對(duì)象名。而且引用一旦聲明,就以對(duì)應(yīng)目標(biāo)的記憶體單元地址作為自己的地址,並且不再改變,從一而終。

例如,引用一個(gè)整型變數(shù):

intsomeInt;

int&rInt=someInt;

聲明rInt是對(duì)整數(shù)的引用,初始化為引用someInt。在這裏,要求someInt已經(jīng)聲明或定義。引用不是值,不占存儲(chǔ)空間。聲明引用時(shí),目標(biāo)的存儲(chǔ)狀態(tài)不會(huì)改變?!纠?-2】建立和使用引用例題。#include<iostream.h>voidmain(){ intsomeInt; int&rInt=someInt;

someInt=6; cout<<"someInt:"<<someInt<<endl; cout<<"rInt:"<<rInt<<endl;rInt=7; cout<<"someInt:"<<someInt<<endl; cout<<"rInt:"<<rInt<<endl;}程式運(yùn)行結(jié)果為someInt:6rInt:6someInt:7rInt:7

在上述程式中,引用rInt用someInt來初始化。以後,無論改變someInt或rInt,實(shí)際上都是指someInt,兩個(gè)的值都一樣。對(duì)引用的理解可以見圖1-3。圖1-3引用與變數(shù)的關(guān)係6omeIntrInt1.2.5運(yùn)算符與運(yùn)算式在任何高級(jí)程式設(shè)計(jì)語言中,運(yùn)算式都是最基本的組成部分,也就是說,程式中的大部分語句是由運(yùn)算式構(gòu)成的。通常,當(dāng)我們要進(jìn)行某種計(jì)算時(shí),都要首先列出算式,然後求解其值。利用C++語言編寫程式求解問題時(shí)也是這樣??梢院?jiǎn)單地將運(yùn)算式理解為用於計(jì)算的公式,它由運(yùn)算符(例如+、-、*、/)、運(yùn)算對(duì)象(也稱運(yùn)算元,可以是常量、變數(shù)等等)和括弧組成。執(zhí)行運(yùn)算式所規(guī)定的運(yùn)算,所得到的結(jié)果值便是運(yùn)算式的值。例如,a+b、x/y都是運(yùn)算式。

運(yùn)算式在使用時(shí)要注意以下幾點(diǎn):

①一個(gè)常量或標(biāo)識(shí)對(duì)象的識(shí)別字是一個(gè)最簡(jiǎn)單的運(yùn)算式,其值是常量或?qū)ο蟮闹怠?/p>

②一個(gè)運(yùn)算式的值可以用來參與其他操作,即用作其他運(yùn)算符的運(yùn)算元,這就形成了更複雜的運(yùn)算式。

③包含在括弧中的運(yùn)算式仍是一個(gè)運(yùn)算式,其類型和值與未加括弧時(shí)的運(yùn)算式相同。

C++語言中定義了豐富的運(yùn)算符,如算術(shù)運(yùn)算符、關(guān)係運(yùn)算符、邏輯運(yùn)算符等等,有些運(yùn)算符需要兩個(gè)運(yùn)算元,使用形式為

<運(yùn)算元1>運(yùn)算符<運(yùn)算元2>

運(yùn)算符具有優(yōu)先順序與結(jié)合性。當(dāng)一個(gè)運(yùn)算式包含多個(gè)運(yùn)算符時(shí),先進(jìn)行優(yōu)先順序高的運(yùn)算,再進(jìn)行優(yōu)先順序低的運(yùn)算。如果運(yùn)算式中出現(xiàn)了多個(gè)相同優(yōu)先順序的運(yùn)算,運(yùn)算順序就要看運(yùn)算符的結(jié)合性了。所謂結(jié)合性,是指當(dāng)一個(gè)運(yùn)算元左右兩邊的運(yùn)算符優(yōu)先順序相同時(shí),按什麼樣的順序進(jìn)行運(yùn)算,是自左向右,還是自右向左。例如,我們熟悉的算術(shù)運(yùn)算式6+5-2中,“+”、“-”是同級(jí)運(yùn)算符,那麼是先算5-2,還是先算6+5?這就取決於算術(shù)運(yùn)算符的結(jié)合性。由於算術(shù)運(yùn)算符的結(jié)合性為自左向右,所以應(yīng)先算6+5,然後再算11-2。1.算術(shù)運(yùn)算符與算術(shù)運(yùn)算式

C++中的算術(shù)運(yùn)算符包括基本的算術(shù)運(yùn)算符和自增、自減運(yùn)算符。由算術(shù)運(yùn)算符、運(yùn)算元和括弧構(gòu)成的運(yùn)算式稱為算術(shù)運(yùn)算式。基本算術(shù)運(yùn)算符有:+(加)、-(減或負(fù)號(hào))、*(乘)、/(除)、%(取餘)。其中“-”作為負(fù)號(hào)時(shí)為一元運(yùn)算符,其餘都為二元運(yùn)算符。這些基本算術(shù)運(yùn)算符的意義與數(shù)學(xué)中相應(yīng)符號(hào)的意義是一致的。它們之間的相對(duì)優(yōu)先順序關(guān)係與數(shù)學(xué)中的也是一致的,即先乘除、後加減,同級(jí)運(yùn)算自左向右進(jìn)行。使用算術(shù)運(yùn)算符要注意以下幾點(diǎn):①“%”是取餘運(yùn)算,只能用於整型運(yùn)算元。運(yùn)算式a%b的結(jié)果為a/b的餘數(shù)?!?”的優(yōu)先順序與“/”相同。

②當(dāng)“/”用於兩整型運(yùn)算元相除時(shí),其結(jié)果取商的整數(shù)部分,小數(shù)部分被自動(dòng)捨棄。因此,運(yùn)算式1/2的結(jié)果為0,這一點(diǎn)需要特別注意。

③C++中的“++”(自增)、“--”(自減)運(yùn)算符是使用方便且效率很高的兩個(gè)運(yùn)算符,它們都是一元運(yùn)算符。這兩個(gè)運(yùn)算符都有前置和後置兩種使用形式(例如++i與i--)。

無論寫成前置或後置的形式,它們的作用都是將運(yùn)算元的值增1(減1)後,重新寫回該運(yùn)算元在內(nèi)存中的原有位置。所以,如果變數(shù)i原來的值是1,計(jì)算運(yùn)算式i++後,運(yùn)算式的結(jié)果為2,並且i的值也被改變?yōu)?。但是,當(dāng)自增、自減運(yùn)算的結(jié)果要被用於繼續(xù)參與其他操作時(shí),前置與後置時(shí)的情況就完全不同了。例如,如果i的值為1,則下列兩條語句的執(zhí)行結(jié)果是不一樣的:

cout<<i++; cout<<++i;2.賦值運(yùn)算符與賦值運(yùn)算式

C++提供了幾個(gè)賦值運(yùn)算符,最簡(jiǎn)單的賦值運(yùn)算符就是“=”。帶有賦值運(yùn)算符的運(yùn)算式被稱為賦值運(yùn)算式。例如,m=m+6就是一個(gè)賦值運(yùn)算式。賦值運(yùn)算式的作用就是將等號(hào)右邊運(yùn)算式的值賦給等號(hào)左邊的對(duì)象。賦值運(yùn)算式的類型為等號(hào)左邊對(duì)象的類型,運(yùn)算式的結(jié)果為等號(hào)左邊對(duì)象被賦值後的值,運(yùn)算的結(jié)合性為自右向左。請(qǐng)看下列賦值運(yùn)算式的例子。

n=1

運(yùn)算式值為1。

a=b=c=2

這個(gè)運(yùn)算式從右向左運(yùn)算,在c被更新為2後,運(yùn)算式c=2的值為2,接著b的值被更新為2,最後a被賦值為2。

a=3+(c=4)運(yùn)算式值為7,a的值為7,c為4。

a=(b=5)+(c=6)運(yùn)算式值為11,a為11,b為5,c為6。

除了“=”以外,C++還提供了10種複合的賦值運(yùn)算符:+=,-=,*=,/=,%=,<<=,>>=,&=,^=,|=。其中,前五個(gè)運(yùn)算符是賦值運(yùn)算符與算術(shù)運(yùn)算符複合而成的,後五個(gè)是賦值運(yùn)算符與位運(yùn)算符複合而成的。關(guān)於位運(yùn)算,稍後再做介紹。這裏10種運(yùn)算符的優(yōu)先順序與“=”相同,結(jié)合性也是自右向左?,F(xiàn)在舉例說明複合賦值運(yùn)算符的功能。

b+=2 //等價(jià)於b=b+2 x*=y+3 //等價(jià)於x=x*(y+3)

x+=x-=x*x //等價(jià)於x=x+(x=x-x*x)

如果在賦值運(yùn)算式後面加上分號(hào),便成為了賦值語句。例如:

b=b+2;便是一個(gè)賦值語句,它實(shí)現(xiàn)的功能與賦值運(yùn)算式相同。賦值運(yùn)算式與賦值語句的不同點(diǎn)在於:賦值運(yùn)算式可以作為一個(gè)更複雜運(yùn)算式的一部分,繼續(xù)參與運(yùn)算;而賦值語句不能。3.逗號(hào)運(yùn)算符與逗號(hào)運(yùn)算式在C++中,逗號(hào)也是一個(gè)運(yùn)算符,它的使用形式為

<運(yùn)算式1>,<運(yùn)算式2>,…,<運(yùn)算式n>

求解順序?yàn)?,先求解運(yùn)算式1,再求解運(yùn)算式2,最後求解運(yùn)算式n的值。逗號(hào)運(yùn)算式的最終結(jié)果為運(yùn)算式n的值。例如:

x=2*5,x*4

運(yùn)算式的結(jié)果為40。

4.關(guān)係運(yùn)算符和關(guān)係運(yùn)算式關(guān)係運(yùn)算符即比較符。關(guān)係運(yùn)算符及其優(yōu)先次序?yàn)?lt;(小於)、<=(小於等於)、>(大於)、>=(大於等於)、==(等於)、!=(不等於)

優(yōu)先順序相同(較高)

優(yōu)先順序相同(較低)

用關(guān)係運(yùn)算符將兩個(gè)運(yùn)算式連接起來就是關(guān)係運(yùn)算式。關(guān)係運(yùn)算式是一種最簡(jiǎn)單的邏輯運(yùn)算式。例如:x>5x+y<=20c==a+b

都是關(guān)係運(yùn)算式。注意,“==”(等於)是連續(xù)的兩個(gè)等號(hào),不要誤寫為賦值運(yùn)算符“=”。5.邏輯運(yùn)算與邏輯運(yùn)算式只有簡(jiǎn)單的關(guān)係比較是遠(yuǎn)不能滿足編程需要的,我們還需要用邏輯運(yùn)算符將簡(jiǎn)單的關(guān)係運(yùn)算式連接起來構(gòu)成較複雜的邏輯運(yùn)算式。邏輯運(yùn)算式的結(jié)果類型也為bool,值只能為true或false。C++中的邏輯運(yùn)算符及其優(yōu)先次序?yàn)?/p>

“!”是一元運(yùn)算符,使用形式是:!運(yùn)算元。非運(yùn)算的作用是對(duì)運(yùn)算元取反。如果運(yùn)算元a的值為true,則運(yùn)算式!a的值為false;如果運(yùn)算元a的值為false,則運(yùn)算式!a的值為true。“&&”是二元運(yùn)算符?!?&”運(yùn)算的作用是求兩個(gè)運(yùn)算元的邏輯與。只有當(dāng)兩個(gè)運(yùn)算元的值都為true時(shí),與運(yùn)算的結(jié)果才為true,其他情況下與運(yùn)算的結(jié)果均為false。

“||”也是二元運(yùn)算符?!皘|”運(yùn)算的作用是求兩個(gè)運(yùn)算元的邏輯或。只有當(dāng)兩個(gè)運(yùn)算元的值都為false時(shí),或運(yùn)算的結(jié)果才為false,其他情況下或運(yùn)算的結(jié)果均為true。邏輯運(yùn)算符的運(yùn)算規(guī)則可以用真值表來說明。表1-3給出了運(yùn)算元a和b值的各種組合以及邏輯運(yùn)算的結(jié)果。

例如,假設(shè)a=7,b=5,x=20,y=30,則邏輯運(yùn)算式(a>b)&&(x>y)的值為false。表1-3邏輯運(yùn)算符的真值表ab!aa&&ba||btruetruefalsetruetruetruefalsefalsefalsetruefalsetruetruefalsetruefalsefalsetruefalsefalse6.條件運(yùn)算符與條件運(yùn)算式條件運(yùn)算符“?”是C++中唯一的三元運(yùn)算符,它能夠?qū)崿F(xiàn)簡(jiǎn)單的選擇功能。條件運(yùn)算式的形式為

<運(yùn)算式1>?<運(yùn)算式2>:<運(yùn)算式3>

其中,運(yùn)算式1的值必須是bool類型,運(yùn)算式2和運(yùn)算式3的值可以是任何類型。條件運(yùn)算式的執(zhí)行順序是:先求解運(yùn)算式1。若運(yùn)算式1的值為true,則求解運(yùn)算式2,運(yùn)算式2的值為條件運(yùn)算式的結(jié)果;若運(yùn)算式1的值為false,則求解運(yùn)算式3,運(yùn)算式3的值為條件運(yùn)算式的結(jié)果。

注意:條件運(yùn)算符的優(yōu)先順序高於賦值運(yùn)算符,低於邏輯運(yùn)算符;結(jié)合方向?yàn)樽杂蚁蜃?。例如,設(shè)x、a和b是整型變數(shù),則語句

x=(a<b)?a:b;的功能是先求出整數(shù)a和b中較小數(shù)的值後,賦給變數(shù)x。7.sizeof操作符

sizeof運(yùn)算符是用來計(jì)算某種數(shù)據(jù)類型在內(nèi)存中所占的位元組數(shù)。該操作符使用的語法形式為

sizeof(類型名)

sizeof(運(yùn)算式)

注意:sizeof(運(yùn)算式)僅僅計(jì)算“運(yùn)算式”的結(jié)果類型所占的位元組數(shù),並不對(duì)括弧中的運(yùn)算式本身求值。8.位運(yùn)算一般的高級(jí)語言處理數(shù)據(jù)的最小單位只能是位元組,C++語言卻能對(duì)數(shù)據(jù)按二進(jìn)位位進(jìn)行操作。在C++中提供了六個(gè)位運(yùn)算符,可以對(duì)整數(shù)進(jìn)行位操作。

1)按位與(&)

按位與操作的作用是將兩個(gè)運(yùn)算元對(duì)應(yīng)的每一位分別進(jìn)行邏輯與操作。例如,計(jì)算3&5:

3:00000011 5:(&)00000101 3&5:000000018.位運(yùn)算一般的高級(jí)語言處理數(shù)據(jù)的最小單位只能是位元組,C++語言卻能對(duì)數(shù)據(jù)按二進(jìn)位位進(jìn)行操作。在C++中提供了六個(gè)位運(yùn)算符,可以對(duì)整數(shù)進(jìn)行位操作。

1)按位與(&)

按位與操作的作用是將兩個(gè)運(yùn)算元對(duì)應(yīng)的每一位分別進(jìn)行邏輯與操作。例如,計(jì)算3&5:

3:00000011 5:(&)00000101 3&5:000000013)按位異或(^)

按位異或操作的作用是將兩個(gè)運(yùn)算元對(duì)應(yīng)的每一位進(jìn)行異或。具體運(yùn)算規(guī)則是:若對(duì)應(yīng)位相同,則該位的運(yùn)算結(jié)果為0;若對(duì)應(yīng)位不同,則該位的運(yùn)算結(jié)果為1。例如,計(jì)算071^052:

071: 00111001052:(^) 00101010071^052: 00010011

可以看出:與“1”相異或,具有取反的作用;與“0”相異或,維持不變。使用按位異或操作可以將運(yùn)算元中的若干指定位取反。如果使某位與0異或,結(jié)果是該位的原值;如果使某位與1異或,則結(jié)果與該位原來的值相反。例如,要使01111010低四位翻轉(zhuǎn),可以與00001111進(jìn)行異或:

01111010

(^)00001111011101014)按位取反(~)

按位取反是一個(gè)單目運(yùn)算符,其作用是對(duì)一個(gè)二進(jìn)位數(shù)的每一位取反。例如:

025:00010101~025:111010105)移位

C++中有兩個(gè)移位運(yùn)算符——左移運(yùn)算(<<)和右移運(yùn)算(>>),都是二元運(yùn)算符。移位運(yùn)算符左邊的運(yùn)算元是需要移位的數(shù)值,右邊的運(yùn)算元是左移或右移的位數(shù)。左移是按照指定的位數(shù)將一個(gè)數(shù)的二進(jìn)位值向左移位。

左移後,低位補(bǔ)0,移出的高位捨棄。右移是按照指定的位數(shù)將一個(gè)數(shù)的二進(jìn)位值向右移位。右移後移出的低位捨棄。如果是無符號(hào)數(shù)則高位補(bǔ)0;如果是有符號(hào)數(shù),則高位補(bǔ)符號(hào)位。下麵我們看兩個(gè)例子。

①如果有char型變數(shù)a的值為-8,則a在內(nèi)存中的二進(jìn)位補(bǔ)數(shù)值為11111000,於是運(yùn)算式a>>2的值為-2。圖1-4說明了移位操作的過程。

②運(yùn)算式2<<l的值為4。圖1-5說明了移位操作的過程。

圖1-4a>>2的移位操作過程11111000

1111100011111110

值得注意的是:移位運(yùn)算的結(jié)果是位運(yùn)算運(yùn)算式(a>>2和2<<1)的值,移位運(yùn)算符左邊運(yùn)算式的變數(shù)值本身並不會(huì)被改變。圖1-52<<1的移位操作過程

0000001000000010

0000001009.運(yùn)算符優(yōu)先順序表1-4中列出了C++中全部運(yùn)算符的優(yōu)先順序與結(jié)合性,除·*、->*運(yùn)算符外,其餘的都在本章介紹。表1-4C++中運(yùn)算符的優(yōu)先順序與結(jié)合性優(yōu)先順序運(yùn)算符結(jié)合性1[?](?).->後置++後置--左→右2前置++前置--sizeof&*+(正號(hào))-(負(fù)號(hào))~!右→左3(強(qiáng)制轉(zhuǎn)換類型)右→左4·*->*左→右5*/%左→右6+-左→右7<<>>左→右8<><=>=左→右9==!=左→右10&左→右11^左→右12|左→右13&&左→右14||左→右15?:右→左16=*=/=%=+=-?=<<=>>=&=^=|=右→左17,左→右1.2.6數(shù)據(jù)類型轉(zhuǎn)換當(dāng)運(yùn)算式中出現(xiàn)了多種類型數(shù)據(jù)的混合運(yùn)算時(shí),首先需要進(jìn)行類型轉(zhuǎn)換,其次再計(jì)算運(yùn)算式的值。運(yùn)算式中的類型轉(zhuǎn)換分為兩種:隱含轉(zhuǎn)換和強(qiáng)制轉(zhuǎn)換。

1.隱含轉(zhuǎn)換在混合運(yùn)算時(shí),對(duì)於二元運(yùn)算符要求兩個(gè)運(yùn)算元的類型一致。若參加運(yùn)算的運(yùn)算元類型不一致,系統(tǒng)自動(dòng)對(duì)數(shù)據(jù)進(jìn)行轉(zhuǎn)換(即隱含轉(zhuǎn)換)。具體的規(guī)則如下。①算術(shù)運(yùn)算和關(guān)係運(yùn)算轉(zhuǎn)換的基本原則是將低類型數(shù)據(jù)轉(zhuǎn)換為高類型數(shù)據(jù)。類型越高數(shù)據(jù)的表示範(fàn)圍越大,精度也越高,所以這種轉(zhuǎn)換是安全的。各種類型的高低順序如下:

charshortintunsignedlongunsigned-longfloatdouble

低高

②邏輯運(yùn)算符要求參與運(yùn)算的運(yùn)算元必須是bool型,如果運(yùn)算元是其他類型,則系統(tǒng)自動(dòng)將其轉(zhuǎn)換為bool型。轉(zhuǎn)換方法是:非0數(shù)據(jù)轉(zhuǎn)換為true,0轉(zhuǎn)換為false。③位運(yùn)算的運(yùn)算元必須是整數(shù)。當(dāng)二元位運(yùn)算的運(yùn)算元是不同類型的整數(shù)時(shí),編譯系統(tǒng)會(huì)自動(dòng)進(jìn)行類型轉(zhuǎn)換。

④賦值運(yùn)算要求左值(賦值運(yùn)算符左邊的值)與右值(賦值運(yùn)算符右邊的值)的類型相同。若類型不同,系統(tǒng)會(huì)自動(dòng)進(jìn)行類型轉(zhuǎn)換。但這時(shí)的轉(zhuǎn)換不適用上述的轉(zhuǎn)換規(guī)則,而是一律將右值類型轉(zhuǎn)換為左值類型。下麵的程式段說明了類型轉(zhuǎn)換的規(guī)則:floatfVal;doubledVal;intiVa1unsignedlongulVal;dVal=iVal*ulVal; //iVal被轉(zhuǎn)換為unsignedlong //乘法運(yùn)算的結(jié)果被轉(zhuǎn)換為doubledVal=ulVal+fVal; //ulVal被轉(zhuǎn)換為float //加法運(yùn)算的結(jié)果被轉(zhuǎn)換為double2.強(qiáng)制類型轉(zhuǎn)換強(qiáng)制類型轉(zhuǎn)換又稱為顯式轉(zhuǎn)換,是通過類型識(shí)別字和括弧來實(shí)現(xiàn)的,其語法形式有兩種:

<類型識(shí)別字>(運(yùn)算式)

或(類型識(shí)別字)<運(yùn)算式>

強(qiáng)制類型轉(zhuǎn)換的作用是將運(yùn)算式的結(jié)果類型轉(zhuǎn)換為類型識(shí)別字所指定的類型。例如:floatz=9.74,fraction_part;intwhole_part;whole_part=int(z);//將float型轉(zhuǎn)換為int型時(shí),取整數(shù)部分,捨棄小數(shù)部分fraction_part=z-int(z) //用z減去其整數(shù)部分,得到小數(shù)部分使用強(qiáng)制類型轉(zhuǎn)換時(shí),應(yīng)該注意:①?gòu)纳厦娴睦又锌梢钥吹?,將高類型?shù)據(jù)轉(zhuǎn)換為低類型數(shù)據(jù)時(shí),數(shù)據(jù)精度會(huì)受到損失。

②這種轉(zhuǎn)換是暫時(shí)的、一次性的。例如,int(z)只是將float型變數(shù)z的值取出來,臨時(shí)轉(zhuǎn)換為int型,然後賦給whole_part。而變數(shù)z仍是原來的浮點(diǎn)類型值。1.3數(shù)據(jù)的輸入與輸出1.3.1I/O的書寫格式

C++數(shù)據(jù)的輸入與輸出是通過I/O流來實(shí)現(xiàn)的,I/O流輸入或輸出的是一系列位元組。當(dāng)程式需要在螢?zāi)簧巷@示輸出時(shí),可以使用插入符“<<”向cout輸出流中插入字元。cout是預(yù)定義的流類對(duì)象,“<<”是預(yù)定義的插入符,格式如下:

cout<<運(yùn)算式<<運(yùn)算式…

例如,語句

cout<<"\"Thisisasample.\",hesaid.\n";

的輸出結(jié)果為

"Thisisasample.",hesaid.

當(dāng)程式需要執(zhí)行鍵盤輸入時(shí),可以使用提取操作符“>>”從cin輸入流中抽取字元,格式如下:

cin>>運(yùn)算式>>運(yùn)算式…cin是預(yù)定義的流類對(duì)象,“>>”是預(yù)定義的提取符。例如:

inta;

charc;

cin>>a>>c;

要求從鍵盤上輸入兩個(gè)變數(shù)的值,兩數(shù)之間以空格分隔。若輸入

48↙

這時(shí),變數(shù)a獲取值為4,變數(shù)b獲取值為8的ASCII值38(十六進(jìn)制)。因?yàn)樽償?shù)c的數(shù)據(jù)類型為char,cin能夠知道輸入的變數(shù)類型。1.3.2簡(jiǎn)單的I/O格式控制從上面的介紹中可以看出,當(dāng)我們用cin、cout進(jìn)行數(shù)據(jù)的輸入和輸出時(shí),無論處理的是什麼類型的數(shù)據(jù),都能夠自動(dòng)按照默認(rèn)格式處理。但這還是不夠,我們?nèi)越?jīng)常需要設(shè)置特殊的格式。設(shè)置格式有很多方法,有關(guān)內(nèi)容將在第9章做詳細(xì)介紹,本節(jié)只介紹最簡(jiǎn)單的格式控制。

C++的I/O流類庫(kù)提供了一些控制符,可以直接嵌入到輸入/輸出語句中來實(shí)現(xiàn)I/O格式控制。使用格式控制符首先必須在根源程式的開頭包含iomanip.h。表1-5中列出了幾個(gè)常用的I/O流類庫(kù)格式控制符。表1-5常用的I/O流控制符控制符含義Dec數(shù)值數(shù)據(jù)採(cǎi)用十進(jìn)位Hex數(shù)值數(shù)據(jù)採(cǎi)用十六進(jìn)制Oct數(shù)值數(shù)據(jù)採(cǎi)用八進(jìn)制Ws提取空白符Endl插入換行符,並刷新流Ends插入空字元setprecision(int)設(shè)置浮點(diǎn)數(shù)的小數(shù)位數(shù)(包括小數(shù)點(diǎn))setw(int)設(shè)置域?qū)?/p>

在使用setw(n)時(shí)要注意:

①如果一個(gè)輸出量需要比setw(n)確定的字元數(shù)更多的字元,則該輸出量將使用它所需要的寬度。例如:

floatamount=3.14159;cout<<setw(4)<<amount<<endl;

其運(yùn)行結(jié)果為3.14159。它並不按4位寬度,而是按實(shí)際寬度輸出。②setw(n)僅僅影響下一個(gè)數(shù)值輸出,換句話說,使用setw設(shè)置的間隔方式並不保留其效力。例如:

cout<<setw(8)<<10<<20<<endl;

運(yùn)行結(jié)果為

------1020

運(yùn)行結(jié)果中的下劃線表示空格整數(shù)20並沒有按寬度8輸出。setw()的默認(rèn)寬度為0,意思是按輸出數(shù)值表示的寬度輸出,所以20就緊挨10了。

【例1-3】I/O格式控制例題。按十六進(jìn)制、八進(jìn)制和十進(jìn)位的格式輸出數(shù)據(jù)例題。這三個(gè)控制符都是在iostream.h定義的,所以無需加入頭檔iomanip.h。

#include<iostream.h>voidmain(){ intnumber=1001;cout<<"\tDecimal:"<<dec<<number<<endl <<"\tHexadecimal:"<<hex<<number<<endl <<"\tOctal:"<<oct<<number<<endl;}程式運(yùn)行結(jié)果為Decimal:1001Hexadecimal:3e9Octal:17511.4程式的基本控制結(jié)構(gòu)

學(xué)習(xí)了數(shù)據(jù)類型、運(yùn)算式、賦值語句和數(shù)據(jù)的輸入與輸出後,就可以編寫程式完成一些簡(jiǎn)單的功能了。但是,我們現(xiàn)在寫的程式還只是一些順序執(zhí)行的語句。實(shí)際上,我們所面對(duì)的客觀世界遠(yuǎn)不是這麼簡(jiǎn)單,我們通常解決問題的方法也不是用這樣的順序步驟就可以描述清楚的。例如,有一分段函數(shù)如下,輸入一個(gè)x值,求出y值:

這個(gè)問題由人來判斷並不複雜,但是如何將這一計(jì)算方法用電腦來完成?顯然,用順序執(zhí)行的語句序列是無法描述的,這裏必須進(jìn)行選擇判斷,需要用選擇型控制結(jié)構(gòu)。

再舉一個(gè)簡(jiǎn)單的例子,比如統(tǒng)計(jì)某一個(gè)年級(jí)某門課程的平均成績(jī)。這個(gè)問題人工計(jì)算起來方法很簡(jiǎn)單,但是當(dāng)統(tǒng)計(jì)數(shù)據(jù)量非常大的時(shí)候我們就不得不借助於電腦了。但是計(jì)算方法卻必須由我們?yōu)樗鼫?zhǔn)確地描述清楚。這個(gè)演算法中的一個(gè)主要部分就是進(jìn)行累加,這種大量重複的相同動(dòng)作顯然不適宜由順序執(zhí)行的語句來羅列,需要用迴圈型控制結(jié)構(gòu)。

程式的基本控制結(jié)構(gòu)有三種:順序結(jié)構(gòu)、選擇結(jié)構(gòu)和迴圈結(jié)構(gòu)。其中順序結(jié)構(gòu)的程式是最簡(jiǎn)單的。下麵我們將詳細(xì)介紹C++中的選擇結(jié)構(gòu)和迴圈結(jié)構(gòu)控制語句。在此之前,為了便於描述演算法,我們先介紹一種常用演算法表示工具——程式流程圖。流程圖是用一些圖框表示各種操作的。用圖框表示演算法,具有簡(jiǎn)潔、直觀、易於理解等優(yōu)點(diǎn)。流程圖中常用的符號(hào)如圖1-6所示。圖1-6流程圖的常用符號(hào)1.4.1簡(jiǎn)單選擇結(jié)構(gòu)用if語句可以實(shí)現(xiàn)簡(jiǎn)單選擇結(jié)構(gòu)。if語句的語法形式如下:

if(運(yùn)算式)語句1else語句2if語句的執(zhí)行順序是:首先計(jì)算運(yùn)算式的值。若運(yùn)算式值為true,則執(zhí)行語句1;否則執(zhí)行語句2。執(zhí)行流程如圖1-7所示。其中語句1和語句2不僅可以是一條語句,而且可以是大括弧括起來的多條語句(稱為複合語句)。圖1-7if-else語句流程圖

例如:

if(x>y)cout<<x; else cout<<y;

實(shí)現(xiàn)了從x和y中選擇較大的一個(gè)輸出。if語句中的語句2可以為空。當(dāng)語句2為空時(shí),else可以省略,成為如下形式:

if(運(yùn)算式)語句1

例如,若ch字元等於字元b,則響鈴:

if(ch=='b') cout<<'\a';

【例1-4】輸入一個(gè)年份,判斷是否閏年。分析:閏年的年份可以被4整除而不能被100整除,或者能被400整除。因此,首先輸入年份存放到變數(shù)year中,如果運(yùn)算式((year%4==0&&year%100!=0)||(yeax%400==0))的值為true,則為閏年;否則就不是閏年。根源程式:

#include<iostream.h>voidmain(){intyear; boolIsLeapYear; cout<<"Entertheyear:"; cin>>year; IsLeapYear=((year%4==0&&year%100!=0)||(year%400==0)); if(IsLeapYear) cout<<year<<"isaleapyear"<<endl; else cout<<year<<"isnotaleapyear"<<endl;}

程式運(yùn)行結(jié)果為

Entertheyear:20002000isaleapyear1.4.2多重選擇結(jié)構(gòu)有很多問題是一次簡(jiǎn)單的判斷所解決不了的,需要進(jìn)行多次判斷選擇。這可以有以下幾種方法。

1.嵌套的if語句形式1:if(運(yùn)算式1) if(運(yùn)算式2)語句1 else 語句2elseif(運(yùn)算式3)語句3 else語句4

形式2:

if(運(yùn)算式1)語句1 else if(運(yùn)算式2)語句2else if(運(yùn)算式3)語句3

else 語句n+1

可以看出,形式1的嵌套發(fā)生在if及else分支,形式2的嵌套僅發(fā)生在else分支。形式2的if…elseif語句的執(zhí)行順序如圖1-8所示。圖1-8if…elseif語句流程圖

無論是何種形式,應(yīng)當(dāng)注意:

①if與else的配對(duì)關(guān)係。else總是與它上面最近的if配對(duì)。

②語句1、2、3、4、…、n+1可以是複合語句。

③如果省略某一個(gè)else,if與else的數(shù)目不一樣,為實(shí)現(xiàn)程式設(shè)計(jì)者的意圖,便要用{}括起該層的if語句來確定層次關(guān)係。

例如:

if() {if()語句1}else語句2

這時(shí),{}確定了內(nèi)嵌if語句的範(fàn)圍,因此else與第一個(gè)if配對(duì)?!纠?-5】本章開始舉例中,有一函數(shù):

-1 (x<0) Y=0 (x=0)1 (x>0)

輸入一個(gè)x的值,輸出y的值。分析:通過鍵盤輸入一個(gè)數(shù),這個(gè)數(shù)有三種可能:x=0,x>0,x<0。因此需要進(jìn)行多次判斷,要用多重選擇結(jié)構(gòu)。這裏我們選用嵌套的if…elseif語句。#include<iostream.h>voidmain(){ intx,y; cin>>x; if(x<0)y=-1; elseif(x==0)y=0; elsey=1; cout<<y<<endl;}

程式運(yùn)行結(jié)果為輸入:4

螢?zāi)伙@示:12.switch語句如果在演算法中,雖然需要進(jìn)行多次判斷選擇,但都是判斷同一個(gè)運(yùn)算式的值,這樣就沒有必要在每一個(gè)嵌套的if語句中都計(jì)算一次運(yùn)算式的值,為此,C++中有switch語句專門來解決這類問題。switch語句的語法形式如下:switch(運(yùn)算式) { case常量運(yùn)算式1:語句1case常量運(yùn)算式2:語句2

case常量運(yùn)算式n:語句n default:語句n+1} switch語句的執(zhí)行順序是:首先計(jì)算switch語句中的運(yùn)算式的值,然後在case語句中尋找值相等的常量運(yùn)算式,並以此為入口標(biāo)號(hào),由此開始順序執(zhí)行。如果沒有找到相等的常量運(yùn)算式,則從“default:”開始執(zhí)行。使用switch語句應(yīng)注意下列問題:①switch後面括弧內(nèi)的運(yùn)算式的值只能是整型、字元型、枚舉型。例如,下麵的代碼錯(cuò)誤地用浮點(diǎn)型作switch的運(yùn)算式,它會(huì)引起編譯錯(cuò)誤:floatf=4.0switch(f) //error{//...}②各常量運(yùn)算式的值不能相同,且次序不影響執(zhí)行結(jié)果。例如,下麵的代碼中出現(xiàn)相同的常量值:case'A':cout<<''thisisA\n'';csae65:cout<<''thisis65\n''; //error:'A'等值於65③每個(gè)case分支可以有多條語句,但不必用{}。

④每個(gè)case語句只是一個(gè)入口標(biāo)號(hào),通常我們只需執(zhí)行一個(gè)case後的語句,因此,每個(gè)case分支的最後應(yīng)該加break語句,用來結(jié)束整個(gè)switch結(jié)構(gòu),否則從入口點(diǎn)開始一直執(zhí)行到switch結(jié)構(gòu)的結(jié)束點(diǎn)。

⑤當(dāng)若干分支需要執(zhí)行相同操作時(shí),可以使多個(gè)case分支共用一組語句。

【例1-6】輸入一個(gè)1~3的整數(shù),來計(jì)算相應(yīng)圖形的面積(1-圓形,2-長(zhǎng)方形,3-正方形)。分析:本題需要根據(jù)輸入的數(shù)字決定相應(yīng)面積的計(jì)算,由於數(shù)字1~3分別對(duì)應(yīng)圓形、長(zhǎng)方形和正方形,因此需要運(yùn)用多重分支結(jié)構(gòu)。但是每次判斷的都是輸入的整數(shù),所以選用switch語句最為適宜。

#include<iostream.h>constdoublePI=3.1416;voidmain(){intiType; doubleradius,a,b,area; cout<<"圖形的類型為?(1-圓形,2-長(zhǎng)方形,3-正方形):"; cin>>iType; switch(iType) { case1: cout<<"圓的半徑為:"; cin>>radius; area=PI*radius*radius; cout<<"面積為:"<<area<<endl; break;case2: cout<<"矩形的長(zhǎng)為:"; cin>>a; cout<<"矩形的寬為:"; cin>>b; area=a*b; cout<<"面積為:"<<area<<endl; break;case3: cout<<"正方形的邊長(zhǎng)為:"; cin>>a; area=a*a; cout<<"面積為:"<<area<<endl; break; default: cout<<"不是合法的輸入值!"<<endl; }}程式運(yùn)行結(jié)果為圖形的類型為?(1-圓形,2-長(zhǎng)方形,3-正方形):1圓的半徑為?:2面積為12.56641.4.3迴圈結(jié)構(gòu)在C++中有三種迴圈控制語句。

1.while語句

while語句的語法形式如下:

while(運(yùn)算式)語句

while語句的執(zhí)行順序是:判斷一個(gè)條件運(yùn)算式(迴圈控制條件),以便決定是否應(yīng)當(dāng)進(jìn)入和執(zhí)行循環(huán)體(語句)。當(dāng)條件滿足時(shí)進(jìn)入迴圈,不滿足時(shí)則不再執(zhí)行迴圈。圖1-9是while語句的流程圖。

應(yīng)用while語句時(shí)應(yīng)該注意,一般來說在循環(huán)體中,應(yīng)該包含改變迴圈條件運(yùn)算式值的語句,否則便會(huì)造成死迴圈?!纠?-7】求自然數(shù)1~100之和。分析:本題需要用累加演算法。累加過程是一個(gè)迴圈過程,可以用while語句實(shí)現(xiàn)。

#include<iostream.h>voidmain(){ inti=1,sum=0;while(i<=100) { sum+=i; i++; } cout<<"sum="<<sum<<endl;}程式運(yùn)行結(jié)果為sum=50502.do-whil語句

do-whil語句的語法形式如下:

do語句

while(運(yùn)算式);dowhile語句的執(zhí)行順序是:當(dāng)流程執(zhí)行到do後,立即執(zhí)行循環(huán)體語句,然後再判斷迴圈條件運(yùn)算式的值。運(yùn)算式為true時(shí),繼續(xù)執(zhí)行循環(huán)體;運(yùn)算式為false則結(jié)束迴圈。圖1-10是do-while語句的流程圖。該語句結(jié)構(gòu)使迴圈至少執(zhí)行一次?!纠?-8】用do-while語句編程,求自然數(shù)1~100之和。

#include<iostream.h>voidmain(){ inti(1),sum(0); do{ sum+=i++; }while(i<=100); cout<<"sum="<<sum<<endl;}do-while與while語句都是實(shí)現(xiàn)迴圈結(jié)構(gòu)的,兩者的區(qū)別是:while語句先判斷運(yùn)算式的值,當(dāng)值為true時(shí),再執(zhí)行循環(huán)體;而do-while語句是先執(zhí)行循環(huán)體,再判斷運(yùn)算式的值。在大多數(shù)情況下,如果迴圈控制條件和循環(huán)體中的語句都相同,while迴圈和do-while迴圈的結(jié)果是相同的。但是如果一開始迴圈控制條件就為假,這兩種迴圈的執(zhí)行結(jié)果就不同了,do-while迴圈至少執(zhí)行一次循環(huán)體,while迴圈卻一次都不執(zhí)行?,F(xiàn)在我們將例1-7的題目稍作修改,改為從鍵盤輸入整數(shù)i,請(qǐng)讀者分析在輸入的i值大於10和不大於10的情況下,下麵兩個(gè)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論