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

下載本文檔

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

文檔簡(jiǎn)介

第2章C++語(yǔ)言基礎(chǔ)2.1編碼基礎(chǔ)2.2數(shù)據(jù)類(lèi)型2.3常量與變量2.4運(yùn)算符和表達(dá)式2.5基本語(yǔ)句2.6構(gòu)造類(lèi)型2.7函數(shù)2.8指針?biāo)伎碱}

2.1編碼基礎(chǔ)

C++語(yǔ)言是在C語(yǔ)言的基礎(chǔ)上增加了對(duì)面向?qū)ο蟪绦蛟O(shè)計(jì)的支持發(fā)展起來(lái)的,而VisualC++6.0又是以C++為基礎(chǔ)的。因此,學(xué)習(xí)VisualC++6.0語(yǔ)言編程,首先要掌握C++程序設(shè)計(jì)的基礎(chǔ)知識(shí),對(duì)C++的基本組成、基本符號(hào)、保留字和標(biāo)識(shí)符有一定的了解,它們是閱讀和編寫(xiě)程序的基礎(chǔ)。2.1.1基本組成

一個(gè)C++程序通常由預(yù)處理命令、函數(shù)、語(yǔ)句、變量、輸入輸出以及注釋等幾個(gè)部分組成。例如:

#include<iostream.h> //預(yù)處理命令

voidmain(void) //主函數(shù)

{

charmyname[10]; //變量

cout<<''請(qǐng)輸入姓名:''; //輸出

cin>>myname[10]; //輸入

cout<<''歡迎使用VisualC++6.0''<<endl; //輸出

}其中#include<iostream.h>是預(yù)處理命令。voidmain(void)是函數(shù),main是主函數(shù)名。每條語(yǔ)句用分號(hào)結(jié)束。charmyname[10]表示定義字符串變量,myname是變量名。cin>>myname[10]表示通過(guò)鍵盤(pán)輸入變量myname的值。cout<<"歡迎使用VisualC++6.0"<<endl表示在屏幕上顯示雙引號(hào)里的內(nèi)容,endl表示顯示后換行?!?/”表示其右邊的內(nèi)容為該語(yǔ)句的注釋。

1.預(yù)處理命令

在C++程序中,預(yù)處理命令以“#”開(kāi)始,其作用是在編譯之前將系統(tǒng)定義的頭文件“iostream.h”包含到當(dāng)前程序中。該頭文件設(shè)置了C++的輸入輸出環(huán)境,如cin、cout就是在iostream.h中定義的標(biāo)準(zhǔn)輸入、輸出設(shè)備標(biāo)識(shí)符。C++提供三種預(yù)處理命令:宏定義命令、文件包含命令以及條件編譯命令。

2.函數(shù)

一個(gè)C++程序通常由若干個(gè)函數(shù)組成,這些函數(shù)有C++系統(tǒng)提供的庫(kù)函數(shù),也有用戶(hù)根據(jù)需要編寫(xiě)的自定義函數(shù)。在C++程序的這些函數(shù)中,必須有且僅有一個(gè)主函數(shù)main,函數(shù)體用大括號(hào){}括起來(lái),不論主函數(shù)位于什么位置,該程序都是從主函數(shù)開(kāi)始執(zhí)行的。

3.變量

在C++程序中,需要將數(shù)據(jù)存放于內(nèi)存單元中,而變量就是用來(lái)存儲(chǔ)和訪(fǎng)問(wèn)內(nèi)存單元中數(shù)據(jù)的標(biāo)識(shí)符。變量有整型、字符型、浮點(diǎn)型等基本數(shù)據(jù)類(lèi)型。

4.語(yǔ)句

語(yǔ)句是組成程序的基本單元,如順序語(yǔ)句、選擇語(yǔ)句、循環(huán)語(yǔ)句等。所有的語(yǔ)句以分號(hào)結(jié)束,最簡(jiǎn)單的語(yǔ)句是空語(yǔ)句,它僅包括一個(gè)分號(hào)。

5.輸入和輸出

在C++程序中常有輸入和輸出語(yǔ)句,特別是通過(guò)鍵盤(pán)輸入以及屏幕輸出的功能,幾乎每個(gè)程序都要用到。

6.注釋

一個(gè)高質(zhì)量、有價(jià)值的C++源程序應(yīng)加上必要的注釋?zhuān)@可以提高程序的可讀性。注釋并不參加程序的運(yùn)行。

注釋有兩種方式:“//”表示的是單行注釋?zhuān)?*…*/”表示的是多行注釋。2.1.2基本符號(hào)

C++程序中的基本符號(hào)有以下三類(lèi):

1.字母

大小寫(xiě)英文字母:A~Z,a~z,共52個(gè)符號(hào)。

2.?dāng)?shù)字

數(shù)字字符:0~9,共10個(gè)符號(hào)。

3.特殊字符

空格 ! # % ^ & * _(下劃線(xiàn)) + = - ~ < > / \

'

" ; . , () [] {}等,共33個(gè)符號(hào)。2.1.3關(guān)鍵字

在C++程序中關(guān)鍵字又稱(chēng)為保留字,是有特定的專(zhuān)門(mén)含義的單詞,在編程時(shí)不能用于其他用途。下面列出常用的關(guān)鍵字,如表2-1所示,其含義和用法在相關(guān)的章節(jié)中再加以介紹。

需要注意的是,記住這些常用的關(guān)鍵字,可以避免用戶(hù)在定義標(biāo)識(shí)符時(shí)與關(guān)鍵字重名而產(chǎn)生錯(cuò)誤。

表2-1C++常用的關(guān)鍵字2.1.4標(biāo)識(shí)符

標(biāo)識(shí)符是程序員聲明的單詞,用于命名程序正文中的一些實(shí)體,如變量、常量、函數(shù)和其他用戶(hù)自定義對(duì)象等。為了增加程序的可讀性,在定義標(biāo)識(shí)符時(shí),注意做到“見(jiàn)名知意”。在C++中,命名標(biāo)識(shí)符的規(guī)則如下:

(1)必須以字母或下劃線(xiàn)“_”開(kāi)頭,由字母、數(shù)字或下劃線(xiàn)組成,如:Abc、n1、_s_2等都是合法的標(biāo)識(shí)符,而3abc、A*B、&Num都是不合法的,標(biāo)識(shí)符中間不允許有空格。

(2)不能使用C++中的關(guān)鍵詞,如if、for、int等都不能用作標(biāo)識(shí)符。

(3)標(biāo)識(shí)符中字母區(qū)分大小寫(xiě),如Abc和abc認(rèn)為是不同的標(biāo)識(shí)符。

(4)標(biāo)識(shí)符的有效長(zhǎng)度為32,也就是說(shuō)前32個(gè)字符相同的兩個(gè)不同的標(biāo)識(shí)符認(rèn)為是同一個(gè)標(biāo)識(shí)符。

2.2數(shù)據(jù)類(lèi)型

在各種程序設(shè)計(jì)語(yǔ)言中,數(shù)據(jù)類(lèi)型的規(guī)定和處理方法是各不相同的。C++的數(shù)據(jù)類(lèi)型可以大致分為基本數(shù)據(jù)類(lèi)型和自定義數(shù)據(jù)類(lèi)型。

2.2.1基本數(shù)據(jù)類(lèi)型

基本數(shù)據(jù)類(lèi)型由系統(tǒng)定義和提供,常用的有int(整型)、float(單精度浮點(diǎn)型)、double(雙精度浮點(diǎn)型)、char(字符型)、void(無(wú)值型)、bool(邏輯型)等。在基本類(lèi)型前面加上類(lèi)型修飾符就形成了基本類(lèi)型的派生類(lèi)型。類(lèi)型修飾符有signed(有符號(hào)的)、unsigned(無(wú)符號(hào)的)、short(短型的)、long(長(zhǎng)型的)四種。

各種基本數(shù)據(jù)類(lèi)型及其常用的派生類(lèi)型的描述及表示范圍如表2-2所示。

表2-2C++的基本數(shù)據(jù)類(lèi)型注:出現(xiàn)[int]可以省略,即在int之前有類(lèi)型修飾符signed、unsigned、short、long時(shí),可以省略關(guān)鍵字int。2.2.2自定義數(shù)據(jù)類(lèi)型

自定義數(shù)據(jù)類(lèi)型是由用戶(hù)根據(jù)所需構(gòu)造的數(shù)據(jù)類(lèi)型,包括數(shù)組、指針、結(jié)構(gòu)、枚舉以及類(lèi)等。

以下僅介紹枚舉類(lèi)型,其他類(lèi)型將在后面章節(jié)中陸續(xù)介紹。

枚舉是將變量的值一一列舉出來(lái),使變量的值限于列舉的范圍內(nèi)。

枚舉的一般形式是:

enum<類(lèi)型名>{<枚舉值表>}<枚舉變量表>;

每個(gè)枚舉值均有一個(gè)固定的整數(shù)值。如果沒(méi)有顯式賦值,則第一個(gè)枚舉值為0,后續(xù)枚舉值依次遞增1。如果有顯式賦值,則可以設(shè)置1個(gè)或多個(gè)特定值,其未賦值的后續(xù)枚舉值依次遞增1。例如:

enumday1{Sun,Mon,Tue,Wed,Thu,Fri,Sat};

enumday2{Mon=1,Tue,Wed,Thu,Fri,Sat,Sun};

由此可以看出,枚舉類(lèi)型day1沒(méi)有顯式賦值,它的7個(gè)值為Sun=0,Mon=1,Tue=2,Wed=3,Thu=4,Fri=5,Sat=6。枚舉類(lèi)型day2有顯式賦值,它的7個(gè)值為Mon=1,Tue=2,Wed=3,Thu=4,Fri=5,Sat=6,Sun=7。

2.3常?量?與?變?量

根據(jù)程序中數(shù)據(jù)的可變性,數(shù)據(jù)可以分為常量與變量?jī)纱箢?lèi)。常量是在程序運(yùn)行過(guò)程中不變的量,變量是在程序運(yùn)行過(guò)程中可以發(fā)生變化的值。在編程時(shí),常量和變量必須遵循“先聲明,后使用”的原則,即所有常量和變量必須在使用前用說(shuō)明語(yǔ)句進(jìn)行說(shuō)明,否則編譯器就會(huì)產(chǎn)生錯(cuò)誤。

2.3.1常量

在程序運(yùn)行過(guò)程中,其值不變的量稱(chēng)為常量。根據(jù)不同的數(shù)據(jù)類(lèi)型,常量可以有以下表示方法。

1.整型常量

整型常量可以用十進(jìn)制、八進(jìn)制和十六進(jìn)制表示。

1)十進(jìn)制整型常量

十進(jìn)制整型常量即十進(jìn)制整數(shù),如12,345等。

2)八進(jìn)制整型常量

以0開(kāi)頭的數(shù)是八進(jìn)制整數(shù),它由0~7的數(shù)字組成。如065,表示八進(jìn)制數(shù)65,相當(dāng)于十進(jìn)制數(shù)53;如-017,表示八進(jìn)制數(shù)-17,相當(dāng)于十進(jìn)制數(shù)-15。

3)十六進(jìn)制整型常量

以0x或0X開(kāi)頭的數(shù)是十六進(jìn)制整數(shù),它由0~9、a~f或A~F組成。如0x7b,表示十六進(jìn)制數(shù)0x7b,相當(dāng)于十進(jìn)制數(shù)123;如-0x2f,表示十六進(jìn)制數(shù)-0x2f,相當(dāng)于十進(jìn)制數(shù)-47。

2.浮點(diǎn)型常量

浮點(diǎn)型常量即實(shí)數(shù),它有十進(jìn)制和指數(shù)兩種表示形式。

1)十進(jìn)制形式

它由整數(shù)部分和小數(shù)部分組成,如0.12、.12、1.2、12.0、0.0等。需要注意的是這些數(shù)都必須包含小數(shù)點(diǎn)。

2)指數(shù)形式

指數(shù)形式采用科學(xué)記數(shù)法,它可以表示出很大或很小的浮點(diǎn)數(shù)。如1.2e8或1.2E8,表示1.2×108。需要注意的是,字母e或E前必須有數(shù)字,且字母e或E后面的指數(shù)必須是整數(shù)。

3.字符常量

字符常量是用一對(duì)單引號(hào)括起來(lái)的一個(gè)字符,如‘A’、‘b’、‘&’等都是字符常量。注意‘A’和‘a(chǎn)’是兩個(gè)不同的字符常量。

4.字符串常量

字符串常量是用一對(duì)雙引號(hào)括起來(lái)的一個(gè)字符序列。如“Hello!”、“abcd”等都是字符串常量。注意:字符串常量可以包括空格、轉(zhuǎn)義序列符或其他字符。由于雙引號(hào)是字符串的分界符,因此如果需要在字符串中出現(xiàn)雙引號(hào)則必須用“|”表示。字符串常量必須寫(xiě)在同一行,若要換行,則需要用“\”連接。

5.符號(hào)常量

在C++語(yǔ)言中,也可以用一個(gè)標(biāo)識(shí)符表示一個(gè)常量,根據(jù)定義方法區(qū)分,又分為const常量和宏常量。

1)?const常量

用const定義的常量,即正規(guī)常量,其說(shuō)明語(yǔ)句的一般形式是:

const<類(lèi)型名><常量名>=<表達(dá)式>;

例如:

constfloatpi=3.14;//定義常量pi的值為3.14使用規(guī)則如下:

(1)必須以const開(kāi)頭;

(2)類(lèi)型名為基本類(lèi)型及其派生類(lèi)型;

(3)常量名為標(biāo)識(shí)符;

(4)表達(dá)式應(yīng)與常量類(lèi)型一致。

在程序中用pi代替3.14,可以提高程序的可讀性和可維護(hù)性。

2)宏常量

用#define定義的常量,即宏常量,其說(shuō)明語(yǔ)句的一般形式是:

#define<宏名><常量>

例如:

#definePI3.14;//定義宏常量pi的值為3.14

使用規(guī)則如下:

(1)宏名可以是簡(jiǎn)單的字符名,也可是帶有參數(shù)的函數(shù)名;

(2)常量可以是數(shù)值、字符串和函數(shù)等。

由于宏替換是在編譯時(shí)把出現(xiàn)的所有的宏名PI都用3.14來(lái)替換,相當(dāng)于兩個(gè)字符串的替換,所以容易產(chǎn)生錯(cuò)誤,因此在大多數(shù)情況下建議使用const常量。2.3.2變量

變量是指在程序運(yùn)行過(guò)程中其值可以發(fā)生變化的量,它可以用來(lái)存儲(chǔ)程序中需要處理的數(shù)據(jù),可以放在程序的任何位置。但需要注意的是:在使用變量前,必須要用說(shuō)明語(yǔ)句對(duì)變量進(jìn)行說(shuō)明。

1.變量說(shuō)明

變量說(shuō)明語(yǔ)句的一般形式是:

[<存儲(chǔ)類(lèi)>]<類(lèi)型名或類(lèi)型定義><變量名表>;

其中各部分的功能及使用規(guī)則如下:

1)存儲(chǔ)類(lèi)

(1)?auto屬于一次性存儲(chǔ),其存儲(chǔ)空間可以被若干變量多次覆蓋使用;

(2)

register存放在通用寄存器中;

(3)?extern在所有函數(shù)和程序段中都可引用;

(4)?static在內(nèi)存中是以固定地址存放的,在整個(gè)程序運(yùn)行期間都有效。

其中,[<存儲(chǔ)類(lèi)>]的方括號(hào)表示可以缺省,作為auto變量。

2)類(lèi)型名或類(lèi)型定義

在任何變量說(shuō)明語(yǔ)句中,數(shù)據(jù)類(lèi)型定義不可缺省。

3)變量名表

其格式為以下幾種:

<變量名>

<變量名>=<表達(dá)式>

<變量名1>=[<表達(dá)式1>],<變量名2>=[<表達(dá)式2>],…

其中表達(dá)式就是變量的初始化值。

例如:

inti; //定義整型變量i

charch1=‘A’; //定義字符型變量ch1,并賦值為字符A

floatnum1=1.2,num2,num3=29.6; //定義單精度浮點(diǎn)型變量num1,

//num2,num3;并將num1賦值

//為1.2,將num2賦值為29.62.變量作用范圍

在C++語(yǔ)言中,變量說(shuō)明語(yǔ)句可以出現(xiàn)在程序的任何位置。在不同的位置聲明,其作用域不同。它主要分為全局變量和局部變量。

(1)全局變量:其說(shuō)明語(yǔ)句不在任何一個(gè)類(lèi)定義、函數(shù)定義和復(fù)合語(yǔ)句(程序塊)中的變量。全局變量所占用的空間在內(nèi)存的數(shù)據(jù)區(qū),在程序運(yùn)行的整個(gè)過(guò)程中位置保持不變。

(2)局部變量:其說(shuō)明語(yǔ)句在某一個(gè)類(lèi)定義、函數(shù)定義或復(fù)合語(yǔ)句(程序塊)中的變量。局部變量所占用的空間在為程序運(yùn)行時(shí)設(shè)置的臨時(shí)工作區(qū)中,以堆棧的形式允許反復(fù)占用和釋放。

【例2-1】通過(guò)變量的位置認(rèn)識(shí)全局變量和局部變量的作用域。

程序如下:

#include“stdafx.h”

#include<iostream.h>

intmain(intargc,char*argv[])

{

intnum1=0,num2=0; //定義全局變量num1,num2,并賦初值

num1++;

num2++;

//將num1加1后賦給num1,將num2加1后

//賦給num2

cout<<“num1=”<<num1<<“,”<<“num2=”<<num2<<endl;

//輸出num1,num2的值

{

floatnum1=7.7;

//定義局部變量num1

num1++; num2++;

cout<<"num1="<<num1<<","<<"num2="<<num2<<endl;

}

num1++; num2++;

cout<<“num1=”<<num1<<“,”<<“num2=”<<num2<<endl;

return0;

}

上例中全局變量int型num1的作用域?yàn)?~7行和13~16行,int型num2的作用域?yàn)?~16行;局部變量float型num1的作用域?yàn)?~12行。

程序運(yùn)行結(jié)果如圖2-1所示。圖2-1變量的作用域運(yùn)行結(jié)果

2.4運(yùn)算符和表達(dá)式

C++語(yǔ)言中運(yùn)算符是表示實(shí)現(xiàn)某種運(yùn)算的符號(hào),表達(dá)式是運(yùn)算符和操作數(shù)的組合,通過(guò)運(yùn)算符和表達(dá)式可以實(shí)現(xiàn)程序編制中所需的大量操作。下面將介紹C++的運(yùn)算符、運(yùn)算符的優(yōu)先級(jí)和結(jié)合規(guī)則以及表達(dá)式等基本內(nèi)容。

2.4.1算術(shù)運(yùn)算符

C++的算術(shù)運(yùn)算符包含單目運(yùn)算符和雙目運(yùn)算符,其中單目運(yùn)算符有減、增量、減量運(yùn)算符,雙目運(yùn)算符有加、減、乘、除和模運(yùn)算符。表2-3列出了各算術(shù)運(yùn)算符(設(shè)整型變量a=12,b=5)。

1.單目減

單目減相當(dāng)于取負(fù)號(hào)運(yùn)算。例如:-a的值為-12。

2.增量運(yùn)算

增量運(yùn)算有前綴增量和后綴增量?jī)煞N形式。

前綴增量:++<運(yùn)算分量>;//使用運(yùn)算分量前其值加1

后綴增量:<運(yùn)算分量>++;//使用運(yùn)算分量后其值加1

例如:

++a;//相當(dāng)于a=a+1,即把a(bǔ)加1的值賦給a

b=++a;//相當(dāng)于a=a+1,b=a,即先把a(bǔ)加1的值賦給a,再把a(bǔ)的值賦給b

a++;//相當(dāng)于a=a+1,即把a(bǔ)加1的值賦給a

b=a++;//相當(dāng)于a=a+1,b=a,即先把a(bǔ)的值賦給b,再把a(bǔ)加1的值賦給a

3.減量運(yùn)算

減量運(yùn)算除了將加法改為減法外,其余和增量運(yùn)算完全相同。

4.優(yōu)先級(jí)和結(jié)合性

優(yōu)先級(jí)是指多種運(yùn)算之間的先后關(guān)系。在算術(shù)運(yùn)算符中,單目運(yùn)算的優(yōu)先級(jí)最高,其次是?*?(乘)、/?(除)和%(求余),最后是+(加)、-(減)。

運(yùn)算符的結(jié)合性是指運(yùn)算符和操作數(shù)的結(jié)合方式,它有“從左到右”和“從右到左”兩種。對(duì)于優(yōu)先級(jí)相同的運(yùn)算符,按照它們的結(jié)合性進(jìn)行處理。在算術(shù)運(yùn)算符中,除單目運(yùn)算符外,其余雙目運(yùn)算符的結(jié)合性都是從左到右的。2.4.2賦值運(yùn)算符

賦值運(yùn)算符是程序設(shè)計(jì)中最基本的運(yùn)算符,利用賦值運(yùn)算符可以給一個(gè)變量賦值。其一般形式為:

<變量名>=<表達(dá)式>;

其中,各部分的作用如下:

(1)表達(dá)式:一般要求其類(lèi)型與變量名的類(lèi)型一致。

(2)“=”為賦值運(yùn)算符,它不同于數(shù)學(xué)上的等號(hào)。賦值運(yùn)算的作用是:先計(jì)算右邊表達(dá)式的值,然后將值賦給左邊的變量。例如:

sum=num1+num2;

s=s+n;

在程序中經(jīng)常出現(xiàn)類(lèi)似于s=s+n這樣的賦值語(yǔ)句,C++還允許采用更為簡(jiǎn)潔的形式寫(xiě)為s+=n。于是構(gòu)成了復(fù)合賦值運(yùn)算符,如表2-4所示。

在賦值運(yùn)算符中,復(fù)合賦值運(yùn)算符和賦值運(yùn)算符的優(yōu)先級(jí)是一樣的。賦值運(yùn)算符的優(yōu)先級(jí)僅高于后面要講到的逗號(hào)運(yùn)算符。

賦值運(yùn)算符的結(jié)合性是從右到左的。下面的例子用來(lái)解釋表2-4中逐位與、逐位或及逐位異或的含義。

例如:a的值為3,對(duì)應(yīng)的二進(jìn)制數(shù)是011;b的值為5,對(duì)應(yīng)的二進(jìn)制數(shù)是101。

a&=b,即二進(jìn)制數(shù)011和101逐位與,得到001,相當(dāng)于十進(jìn)制數(shù)1,所以運(yùn)行后a的結(jié)果是1。

a|=b,即二進(jìn)制數(shù)011和101逐位或,得到111,相當(dāng)于十進(jìn)制數(shù)7,所以運(yùn)行后a的結(jié)果是7。

a^=b,即二進(jìn)制數(shù)011和101逐位異或,得到110,相當(dāng)于十進(jìn)制數(shù)6,所以運(yùn)行后a的結(jié)果是6。2.4.3關(guān)系運(yùn)算符

關(guān)系運(yùn)算符是雙目運(yùn)算符,作用是將兩個(gè)運(yùn)算分量進(jìn)行大小比較,其結(jié)果類(lèi)型為bool。若關(guān)系成立,則值為true,否則為false。

表2-5列出了C++提供的6種關(guān)系運(yùn)算符。上表中的前4種即?<?(小于)、<=?(小于等于)、>?(大于)、>=?(大于等于)優(yōu)先級(jí)相同,并高于后面的2種即?==?(等于)、!=?(不等于)。關(guān)系運(yùn)算符的優(yōu)先級(jí)低于算術(shù)運(yùn)算符,它的結(jié)合性是從左到右的。2.4.4邏輯運(yùn)算符

C++提供3種邏輯運(yùn)算符,單目運(yùn)算符有邏輯非,雙目運(yùn)算符有邏輯與和邏輯或。其結(jié)果類(lèi)型為bool,其值只能為true或false。

在C++語(yǔ)言中,bool型和int型都屬于整數(shù)類(lèi)型,bool值true和false同時(shí)分別對(duì)應(yīng)于int型的值1和0,而整型也可以轉(zhuǎn)換成bool型,非零整數(shù)轉(zhuǎn)換為true,而0轉(zhuǎn)換成false。

這3種邏輯運(yùn)算符如表2-6所示。上表中的!(邏輯非)、&&(邏輯與)、||(邏輯或)優(yōu)先級(jí)依次從高到低。!(邏輯非)的優(yōu)先級(jí)比算術(shù)運(yùn)算符和關(guān)系運(yùn)算符高,而&&(邏輯與)、||(邏輯或)的優(yōu)先級(jí)低于關(guān)系運(yùn)算符。

邏輯運(yùn)算符的結(jié)合性是從左到右的。2.4.5條件運(yùn)算符

條件運(yùn)算符是三目運(yùn)算符,其一般形式為:

<表達(dá)式1>?<表達(dá)式2>:<表達(dá)式3>

該表達(dá)式的使用規(guī)則如下:

(1)表達(dá)式1必須是bool類(lèi)型。

(2)執(zhí)行順序及結(jié)果。先求解表達(dá)式1。若表達(dá)式1的值為true,則求解表達(dá)式2,表達(dá)式2的值為最終結(jié)果;若表達(dá)式1的值為false,則求解表達(dá)式3,表達(dá)式3的值為最終結(jié)果。例如:

x=a>b?a:b;//作用是將a,b中大的數(shù)賦值給x

(3)優(yōu)先級(jí)和結(jié)合性。條件運(yùn)算符優(yōu)先級(jí)高于賦值運(yùn)算符,低于邏輯運(yùn)算符。條件運(yùn)算符的結(jié)合性是從右到左的。2.4.6逗號(hào)運(yùn)算符

逗號(hào)運(yùn)算符可以使多個(gè)表達(dá)式寫(xiě)在一行上,從而大大簡(jiǎn)化了程序,其一般形式為:

<表達(dá)式1>,<表達(dá)式2>

該表達(dá)式的使用規(guī)則如下:

(1)執(zhí)行順序及結(jié)果。先求解表達(dá)式1,再求解表達(dá)式2,最終結(jié)果為表達(dá)式2的值。

例如:

a=2*4,a*6//最終結(jié)果為48

(2)優(yōu)先級(jí)和結(jié)合性。逗號(hào)運(yùn)算符是優(yōu)先級(jí)最低的運(yùn)算符。逗號(hào)運(yùn)算符的結(jié)合性是從左到右的。2.4.7sizeof運(yùn)算符

字長(zhǎng)提取符sizeof運(yùn)算符實(shí)際上是系統(tǒng)提供的一個(gè)函數(shù),其一般形式為:

sizeof(<運(yùn)算分量>)

該表達(dá)式的使用規(guī)則如下:

(1)運(yùn)算分量可以是類(lèi)型名,也可以是表達(dá)式。

(2)結(jié)果值為“類(lèi)型名”所指定的類(lèi)型或“表達(dá)式”的結(jié)果類(lèi)型所占的字節(jié)數(shù)。

例如:

inta

sizeof(short)//返回值是2

sizeof(a)//返回值是4

C++提供了對(duì)數(shù)據(jù)進(jìn)行位運(yùn)算的功能,其運(yùn)算符如表2-7所示。其中,左移運(yùn)算(<<)指左移后,低位補(bǔ)0,高位舍棄。右移運(yùn)算(>>)指右移后,低位舍棄;高位無(wú)符號(hào)數(shù)補(bǔ)0,有符號(hào)數(shù)補(bǔ)“符號(hào)位”。

位運(yùn)算符的優(yōu)先級(jí)低于算術(shù)運(yùn)算符,高于邏輯運(yùn)算符&&(邏輯與),||(邏輯或)。

位運(yùn)算符的結(jié)合性除單目運(yùn)算符按位取反是從右到左,其余雙目位運(yùn)算符都是從左到右的。

注意:在編程時(shí),如果對(duì)于運(yùn)算符的優(yōu)先級(jí)不確定時(shí),可以添加括號(hào)保證結(jié)果正確,因?yàn)橛欣ㄌ?hào)的部分優(yōu)先計(jì)算。

2.5基本語(yǔ)句

C++提供了順序語(yǔ)句、選擇語(yǔ)句、循環(huán)語(yǔ)句來(lái)實(shí)現(xiàn)結(jié)構(gòu)化程序設(shè)計(jì)的三種結(jié)構(gòu),即順序結(jié)構(gòu)、選擇結(jié)構(gòu)和循環(huán)結(jié)構(gòu)。

2.5.1順序語(yǔ)句

順序語(yǔ)句就是所有語(yǔ)句按照出現(xiàn)的順序先后執(zhí)行。順序語(yǔ)句包括表達(dá)式、空語(yǔ)句和復(fù)合語(yǔ)句。

1.表達(dá)式語(yǔ)句

表達(dá)式語(yǔ)句是最簡(jiǎn)單的語(yǔ)句,任何一個(gè)表達(dá)式加上分號(hào)就是一個(gè)表達(dá)式語(yǔ)句,其一般形式為:

表達(dá)式;

例如:

a+b;

num1=num2;

表達(dá)式語(yǔ)句與表達(dá)式的區(qū)別:表達(dá)式可以包含在其他表達(dá)式中,而語(yǔ)句不可。

例如:

if((a=b)>0)t=a;

不可寫(xiě)為

if((a=b;)>0)t=a;

2.空語(yǔ)句

空語(yǔ)句就是什么都不做的語(yǔ)句,相當(dāng)于一個(gè)空表達(dá)式,其一般形式為:

3.復(fù)合語(yǔ)句

復(fù)合語(yǔ)句是由兩條以上的語(yǔ)句組成,并用一對(duì)大括號(hào){}括起來(lái)。它又稱(chēng)為塊語(yǔ)句或塊程序,其一般形式為:

{

<語(yǔ)句1>

<語(yǔ)句2>

<語(yǔ)句n>

}

例如:

{

sum=sum+i;

i++;

}

4.基本輸入和輸出語(yǔ)句

在前面的章節(jié)中,用到cin和cout分別實(shí)現(xiàn)從鍵盤(pán)輸入和在顯示器上輸出。絕大多數(shù)C++程序都使用了系統(tǒng)提供的I/O流,以實(shí)現(xiàn)基本的輸入和輸出操作。在I/O流類(lèi)的定義中,把C++語(yǔ)言中的左、右移位運(yùn)算符“<<”和“>>”,通過(guò)運(yùn)算符重載的方法定義為插入(輸出)和提取(輸入)運(yùn)算符。cin和cout是預(yù)先定義的流的對(duì)象,分別為標(biāo)準(zhǔn)輸入流和標(biāo)準(zhǔn)輸出流,一般代表標(biāo)準(zhǔn)輸入設(shè)備(鍵盤(pán))和標(biāo)準(zhǔn)輸出設(shè)備(顯示器)。例如:

cin>>a;

//表示從鍵盤(pán)輸入變量a的值

cout<<a; //表示在顯示器上輸出變量a的值

為了更好地調(diào)整輸入輸出格式,C++提供了格式控制函數(shù)和格式控制符。

1)?flags

flags函數(shù)的形式一般有以下兩種:

longflags(long1Flags);

longflags();

第一種形式是通過(guò)參數(shù)1Flags重新設(shè)置標(biāo)志字并返回原來(lái)的標(biāo)志字;另一種形式是無(wú)參的flags函數(shù)用來(lái)返回當(dāng)前的標(biāo)志字。

2)?setf

setf函數(shù)的形式一般有以下兩種:

longsetf(long1Flags);

longsetf(long1Flags,long1Mask);

第一種形式是通過(guò)參數(shù)1Flags來(lái)設(shè)置指定的格式控制標(biāo)志位;另一種形式是用來(lái)設(shè)置指定的格式控制標(biāo)志位的值。

3)?unsetf

unsetf函數(shù)的一般形式為:

longunsetf(long1Flags);

這種形式是通過(guò)參數(shù)1Flags來(lái)清除指定的格式控制標(biāo)志位(使那些位的值為“0”)。

4)?fill

fill函數(shù)的形式一般有以下兩種:

charfill(charcFill);

charfill();

第一種形式是將填充字符設(shè)置為cFill,并返回原填充字符;另一種形式是無(wú)參數(shù)的fill函數(shù)將返回當(dāng)前的填充字符。

5)?precision

precision函數(shù)的形式一般有以下兩種:

intprecision(intnp);

intprecision();

第一種形式是設(shè)置浮點(diǎn)數(shù)精度為np,并返回原精度;另一種形式是無(wú)參數(shù)的precision函數(shù)將返回當(dāng)前的浮點(diǎn)數(shù)精度。

6)?width

width函數(shù)的形式一般有以下兩種:

intwidth(intnw);

intwidth();

第一種形式設(shè)置當(dāng)前顯示數(shù)據(jù)的域?qū)抧w,并返回原域?qū)挘涣硪环N形式是無(wú)參的width函數(shù)將返回當(dāng)前顯示數(shù)據(jù)的域?qū)挕?/p>

定義在iostream.h文件中的無(wú)參I/O控制符有:

(1)?endl:輸出時(shí)插入換行符并刷新流。

(2)?ends:輸出時(shí)在字符串后插入NULL作為結(jié)束符。

(3)?flush:刷新流,將緩沖區(qū)中的當(dāng)前信息立即輸出到目標(biāo)設(shè)備。

(4)?ws:輸入時(shí)略去前導(dǎo)的空白字符(空格、Tab鍵、換行)。

(5)?dec:令I(lǐng)/O數(shù)據(jù)按十進(jìn)制格式(默認(rèn)數(shù)制)。

(6)?hex:令I(lǐng)/O數(shù)據(jù)按十六進(jìn)制格式。

(7)?oct:令I(lǐng)/O數(shù)據(jù)按八進(jìn)制格式。

【例2-2】

使用格式控制函數(shù)和格式控制符顯示不同輸出格式的數(shù)據(jù)。

程序如下:

#include"stdafx.h" //頭文件

#include<iostream.h>

#include<iomanip.h>

intmain(intargc,char*argv[])

{ constfloatNum=3.1415926;

cout<<"1234567890"<<endl; //定位

cout.flags(ios::right); //設(shè)置對(duì)齊的標(biāo)志位是右

cout<<setw(10)<<Num<<endl; //顯示數(shù)據(jù)的域?qū)捠?0

cout.fill(‘*’); //填充字符'*'

cout.width(12); //顯示數(shù)據(jù)的域?qū)捠?2

cout<<Num<<endl;

cout.precision(4);

//浮點(diǎn)數(shù)的有效個(gè)數(shù)為4

cout<<Num<<endl;

cout.setf(ios::showpos); //顯示正號(hào)

cout.precision(3); //浮點(diǎn)數(shù)的有效個(gè)數(shù)為3

cout<<Num<<endl;

cout.unsetf(ios::showpos); //顯示正號(hào)

intn; cout<<''輸入一個(gè)八進(jìn)制整數(shù):'';

cin>>oct>>n;

//輸入一個(gè)八進(jìn)制數(shù)

cout<<''八進(jìn)制數(shù)n是:''<<oct<<n<<endl;

cout<<''對(duì)應(yīng)的十進(jìn)制數(shù)是:''<<dec<<n<<endl;

cout<<''對(duì)應(yīng)的十六進(jìn)制數(shù)是:''<<hex<<n<<endl;

return0;

}程序運(yùn)行結(jié)果如圖2-2所示。圖2-2格式控制運(yùn)行結(jié)果2.5.2選擇語(yǔ)句

選擇語(yǔ)句用來(lái)判斷所給定的條件是否滿(mǎn)足,根據(jù)判斷結(jié)果,選擇執(zhí)行不同的分支語(yǔ)句。常用的選擇語(yǔ)句有:if語(yǔ)句、if-else語(yǔ)句、多重if-else語(yǔ)句和switch語(yǔ)句。

1.if語(yǔ)句

if語(yǔ)句為單分支條件語(yǔ)句,其一般形式為:

if(<表達(dá)式>)<語(yǔ)句>;

該表達(dá)式可以是int型、long型、char型和enum型,其值等于0為假,非0為真。語(yǔ)句可以是任何類(lèi)型的語(yǔ)句,也可以是語(yǔ)句塊。該語(yǔ)句的作用是:如果表達(dá)式的值為真,則執(zhí)行后面的語(yǔ)句;否則跳過(guò)后面的語(yǔ)句。單分支結(jié)構(gòu)流程如圖2-3所示。圖2-3單分支結(jié)構(gòu)流程

【例2-3】

已知兩個(gè)變量x和y,比較它們的大小。當(dāng)x小于y時(shí),交換這兩個(gè)變量的值,使x的值大于y。

程序如下:

#include"stdafx.h"

#include<iostream.h>

intmain(intargc,char*argv[])

{

intx,y,t; //定義變量x,y,t,其中t為中間變量

cout<<"Pleaseenterxandy:"<<endl;

cin>>x>>y;

if(x<y) //單分支結(jié)構(gòu),判斷x,y的大小

{

t=x;x=y;y=t;

}

cout<<"x="<<x<<","<<"y="<<y<<endl;

return0;

}

程序運(yùn)行結(jié)果如圖2-4所示。圖2-4比較兩個(gè)數(shù)大小運(yùn)行結(jié)果

2.if-else語(yǔ)句

if-else語(yǔ)句為雙分支條件語(yǔ)句,其一般形式為:

if(<表達(dá)式>)<語(yǔ)句1>;else<語(yǔ)句2>;

該語(yǔ)句的作用是:如果表達(dá)式的值為真,則執(zhí)行后面的語(yǔ)句1;否則執(zhí)行語(yǔ)句2。雙分支結(jié)構(gòu)流程如圖2-5所示。

【例2-4】

計(jì)算分段函數(shù):圖2-5雙分支結(jié)構(gòu)流程輸入x,得到相應(yīng)的y值。用雙分支條件語(yǔ)句來(lái)實(shí)現(xiàn)該程序。

程序如下:

#include“stdafx.h”

#include<iostream.h>

#include<math.h> //包含數(shù)學(xué)函數(shù)頭文件

intmain(intargc,char*argv[])

{

floatx,y; //定義x,y

cout<<“輸入x:”<<endl;

cin>>x;

if(x!=0)

//雙分支結(jié)構(gòu)

y=sin(x)+sqrt(x*x+2);

else

y=cos(x)-3*x;

cout<<“y=”<<y<<endl;

return0;

}

程序運(yùn)行結(jié)果如圖2-6所示。圖2-6計(jì)算分段函數(shù)運(yùn)行結(jié)果

3.多重if-else語(yǔ)句

多重if-else語(yǔ)句為多分支條件語(yǔ)句,其一般形式為:

if(<表達(dá)式1>)<語(yǔ)句1>;

elseif(<表達(dá)式2>)<語(yǔ)句2>;

elseif(<表達(dá)式n>)<語(yǔ)句n>;

else<語(yǔ)句n+1>;

該語(yǔ)句為if語(yǔ)句的嵌套,在嵌套時(shí),C++語(yǔ)言規(guī)定每個(gè)else只與其前面最近的未配對(duì)的if配對(duì),也可以用{}確定層次關(guān)系。該語(yǔ)句的作用是根據(jù)不同的表達(dá)式值確定執(zhí)行哪個(gè)語(yǔ)句塊,依次測(cè)試表達(dá)式1、表達(dá)式2、…,一旦遇到表達(dá)式的值為真,則執(zhí)行該條件下的語(yǔ)句塊。多分支結(jié)構(gòu)流程如圖2-7所示。圖2-7多分支結(jié)構(gòu)流程

【例2-5】

輸入學(xué)生的百分制成績(jī),判斷該學(xué)生的等級(jí)。

等級(jí)評(píng)定條件為:程序如下:#include"stdafx.h"#include<iostream.h>intmain(intargc,char*argv[]){floatscore; //定義學(xué)生分?jǐn)?shù)scorecout<<"輸入學(xué)生分?jǐn)?shù):"<<endl;cin>>score;

if(score>=90) //多分支結(jié)構(gòu)

cout<<"優(yōu)"<<endl;

elseif(score>=80)

cout<<"良"<<endl;

elseif(score>=70)

cout<<"中"<<endl;

elseif(score>=60)

cout<<"及格"<<endl;

else

cout<<"不及格"<<endl;

return0;

}程序也可以寫(xiě)成:

#include"stdafx.h"

#include<iostream.h>

intmain(intargc,char*argv[])

{

floatscore; //定義學(xué)生分?jǐn)?shù)score

cout<<"輸入學(xué)生分?jǐn)?shù):"<<endl;

cin>>score;

if(score>=90) //多分支結(jié)構(gòu)

cout<<"優(yōu)"<<endl;

else

{

if(score>=80)

cout<<"良"<<endl;

else {

if(score>=70)

cout<<“中”<<endl;

else

{

if(score>=60)

cout<<“及格”<<endl;

else

cout<<“不及格”<<endl;

}

}

}

return0;

}

程序運(yùn)行結(jié)果如圖2-8所示。圖2-8判斷學(xué)生成績(jī)的等級(jí)運(yùn)行結(jié)果

4.switch語(yǔ)句

switch語(yǔ)句也稱(chēng)情況語(yǔ)句,它是多分支語(yǔ)句的另一種表示形式,這種語(yǔ)句條件表示直觀,但必須符合其規(guī)定的語(yǔ)法規(guī)則書(shū)寫(xiě)。其一般形式為:

switch(<表達(dá)式>)

{

case<常量表達(dá)式1>:<語(yǔ)句1>;break;

case<常量表達(dá)式2>:<語(yǔ)句2>;break;

case<常量表達(dá)式n>:<語(yǔ)句n>;break;

default:<語(yǔ)句n>;break;

}該語(yǔ)句的作用是:首先計(jì)算switch表達(dá)式后的值,然后將其結(jié)果與case后面的各常量表達(dá)式進(jìn)行比較。若匹配,則執(zhí)行該分支后的語(yǔ)句。執(zhí)行完該分支后,?遇到break語(yǔ)句,?則退出switch語(yǔ)句。若其結(jié)果與case后面的各常量表達(dá)式都不匹配,則執(zhí)行default后面的語(yǔ)句。其流程如圖2-9所示。

在使用switch語(yǔ)句時(shí)應(yīng)注意以下幾點(diǎn):

(1)若case后面沒(méi)有break語(yǔ)句,則程序順序執(zhí)行后續(xù)的語(yǔ)句,直到switch語(yǔ)句結(jié)束。這樣就不能實(shí)現(xiàn)多分支選擇。

(2)?switch語(yǔ)句只能對(duì)表達(dá)式的結(jié)果為固定的值進(jìn)行判斷,而不能對(duì)其結(jié)果是否在某區(qū)域進(jìn)行判斷,這與多重if-else語(yǔ)句有所不同。

(3)每個(gè)常量表達(dá)式的值不能相同,case的次序不影響執(zhí)行結(jié)果。圖2-9switch語(yǔ)句流程

【例2-6】

輸入兩個(gè)整數(shù),再輸入運(yùn)算符,并將運(yùn)算符轉(zhuǎn)換成對(duì)應(yīng)的四則運(yùn)算。

程序如下:

#include"stdafx.h"

#include<iostream.h>

intmain(intargc,char*argv[])

{

intx,y;

charopr;

cout<<"輸入兩個(gè)整數(shù):";

cin>>x>>y;

cout<<"輸入運(yùn)算符:";

cin>>opr;

switch(opr)

{

case‘+’:cout<<x+y<<endl;break;

?case‘-’:cout<<x-y<<endl;break;

?case‘*’:cout<<x*y<<endl;break;

?case‘/’:cout<<x/y<<endl;break;

?case‘%':cout<<x%y<<endl;break;

}

return0;

}

程序運(yùn)行結(jié)果如圖2-10所示。圖2-10swtich用法運(yùn)行結(jié)果2.5.3循環(huán)語(yǔ)句

循環(huán)語(yǔ)句用來(lái)在指定的條件下多次重復(fù)執(zhí)行一組語(yǔ)句。常用的形式有for語(yǔ)句、while語(yǔ)句和do-while語(yǔ)句。

1.for語(yǔ)句

for語(yǔ)句是最常見(jiàn)的、功能最強(qiáng)的循環(huán)語(yǔ)句。它既可以用于循環(huán)次數(shù)確定的情況,也可以用于循環(huán)次數(shù)不確定而只給出循環(huán)結(jié)束條件的情況。其一般形式為:

for(<表達(dá)式1>;<表達(dá)式2>;<表達(dá)式3>)<語(yǔ)句>;其中,for是關(guān)鍵字,語(yǔ)句可以是單條語(yǔ)句,也可以是語(yǔ)句塊,它是要被循環(huán)重復(fù)執(zhí)行的程序段,故又稱(chēng)為循環(huán)體。表達(dá)式1是對(duì)循環(huán)控制變量進(jìn)行初始化,表達(dá)式2是循環(huán)條件,當(dāng)判斷條件為非0時(shí),開(kāi)始執(zhí)行循環(huán)體,然后計(jì)算表達(dá)式3,表達(dá)式3對(duì)循環(huán)控制變量進(jìn)行遞增或遞減,?再判斷表達(dá)式2的值是否為非0,若是,繼續(xù)執(zhí)行循環(huán)體,再計(jì)算表達(dá)式3,如此反復(fù),直到表達(dá)式2等于0為止。for循環(huán)結(jié)構(gòu)的流程如圖2-11所示。需要注意的是:這三個(gè)表達(dá)式都可以缺省,但分號(hào)“;”不能省略。在使用循環(huán)結(jié)構(gòu)編程時(shí)應(yīng)保證循環(huán)一定會(huì)終止,否則,循環(huán)可能永不結(jié)束。圖2-11for循環(huán)結(jié)構(gòu)的流程【例2-7】

計(jì)算1~100的奇數(shù)和。

程序如下:

#include"stdafx.h"

#include<iostream.h>

intmain(intargc,char*argv[])

{

ints=0;

for(inti=1;i<=100;i=i+2)s+=i;

cout<<"1~100的奇數(shù)和是:"<<s<<endl;

return0;

}

程序運(yùn)行結(jié)果如圖2-12所示。圖2-12for語(yǔ)句求1~100的奇數(shù)和運(yùn)行結(jié)果

2.while語(yǔ)句

while語(yǔ)句是最簡(jiǎn)單的循環(huán)語(yǔ)句,它實(shí)際上是for語(yǔ)句在表達(dá)式1和表達(dá)式3為空時(shí)的特殊情形。其一般形式為:

while(<表達(dá)式>)<語(yǔ)句>;

其中,表達(dá)式用來(lái)判定循環(huán)是否繼續(xù),當(dāng)表達(dá)式條件成立時(shí),執(zhí)行循環(huán)體。while語(yǔ)句要求能夠在循環(huán)體內(nèi)改變表達(dá)式的值,以使表達(dá)式條件不成立時(shí)退出循環(huán)體。語(yǔ)句為循環(huán)體。while循環(huán)結(jié)構(gòu)的流程如圖2-13所示。圖2-13while循環(huán)結(jié)構(gòu)的流程

【例2-8】用輾轉(zhuǎn)相除法求兩個(gè)自然數(shù)m,n的最大公約數(shù)。

求最大公約數(shù)的算法思想:

(1)?m除以n得余數(shù)r;

(2)若r≠0,則將m←n,n←r,重復(fù)執(zhí)行步驟(1);

(3)若r=0,則n為求得的最大公約數(shù),算法結(jié)束,否則重復(fù)執(zhí)行步驟(1)。

程序如下:

#include"stdafx.h"

#include<iostream.h>

intmain(intargc,char*argv[])

{

intm,n,r; cout<<"輸入正整數(shù)m:";

cin>>m;

cout<<"輸入正整數(shù)n:";

cin>>n;

r=m%n;//求余

while(r!=0)

{

m=n;

n=r;

r=m%n;

}

cout<<"最大公約數(shù)是:"<<n<<endl;

return0;

}

程序運(yùn)行結(jié)果如圖2-14所示。圖2-14求最大公約數(shù)運(yùn)行結(jié)果

3.do-while語(yǔ)句

do-while語(yǔ)句是while語(yǔ)句的一種變化形式。?其一般形式為:

do<語(yǔ)句>while(<表達(dá)式>);

do-while先執(zhí)行循環(huán)體,然后判斷表達(dá)式是否成立,?若成立則重復(fù)執(zhí)行循環(huán)體,否則退出循環(huán)。do-while循環(huán)結(jié)構(gòu)的流程如圖2-15所示。

do-while語(yǔ)句與while語(yǔ)句的主要區(qū)別是:do-while語(yǔ)句的循環(huán)體至少被執(zhí)行一次,而while語(yǔ)句先判斷條件,有可能一次也不執(zhí)行。

【例2-9】

輸入一個(gè)正整數(shù),求出它的所有因子并輸出。圖2-15do-while循環(huán)結(jié)構(gòu)的流程程序如下:

#include"stdafx.h"

#include<iostream.h>

intmain(intargc,char*argv[])

{

unsignedintn,f=1;

cout<<"輸入一個(gè)正整數(shù):";

cin>>n;

cout<<"整數(shù)"<<n<<"的因子有";

do

{

if(n%f==0)cout<<f<<"";//判斷是否為因子,并輸出每一個(gè)因子

f++;

}while(f<=n);

cout<<endl;

return0;

}程序運(yùn)行結(jié)果如圖2-16所示。圖2-16do-while語(yǔ)句求數(shù)的因子運(yùn)行結(jié)果

4.循環(huán)的嵌套

在一個(gè)循環(huán)體內(nèi)又包含了一個(gè)完整的循環(huán)結(jié)構(gòu)稱(chēng)為循環(huán)的嵌套。

【例2-10】

編程求“水仙花數(shù)”。所謂“水仙花數(shù)”是指一個(gè)三位數(shù),其各位數(shù)字立方和等于該數(shù)本身。例如,153是水仙花數(shù),因?yàn)?53=13+53+33。

方法1:利用三重循環(huán)編寫(xiě)程序。因?yàn)椤八苫〝?shù)”是三位數(shù),所以一定都在100~999范圍內(nèi)。外循環(huán)變量i控制百位數(shù)字從1變化到9,中層循環(huán)變量j控制十位數(shù)字從0變化到9,內(nèi)循環(huán)變量k控制個(gè)位數(shù)字從0變化到9。程序如下:

#include''stdafx.h''

#include<iostream.h>

intmain(intargc,char*argv[])

{

inti,j,k,m,n;

cout<<''水仙花數(shù)是:''<<endl;

for(i=1;i<=9;i++) //外循環(huán)

for(j=0;j<=9;j++) //中層循環(huán)

for(k=0;k<=9;k++) //內(nèi)循環(huán)

{

m=i*i*i+j*j*j+k*k*k; //立方和

n=100*i+10*j+k; //該數(shù)

if(m==n)cout<<m<<endl;

}

return0;

}

程序運(yùn)行結(jié)果如圖2-17所示。圖2-17循環(huán)嵌套求水仙花數(shù)運(yùn)行結(jié)果方法2:不使用循環(huán)嵌套,只用一個(gè)for語(yǔ)句編寫(xiě)程序。

程序如下:

#include''stdafx.h''

#include<iostream.h>

intmain(intargc,char*argv[])

{

inti,j,k,n;

cout<<''水仙花數(shù)是:''<<endl;

for(n=100;n<=999;n++)

{

i=n/100;//i為百位數(shù)字

j=n/10-i*10//j為十位數(shù)字

k=n%10//k為個(gè)位數(shù)字

if(i*i*i+j*j*j+k*k*k==n)

cout<<n<<endl;

}

return0;

}2.5.4轉(zhuǎn)向語(yǔ)句

轉(zhuǎn)向語(yǔ)句是用來(lái)實(shí)現(xiàn)無(wú)條件轉(zhuǎn)移的語(yǔ)句。常用的語(yǔ)句形式有:break語(yǔ)句、continue語(yǔ)句、goto語(yǔ)句和return語(yǔ)句。

1.break語(yǔ)句

break語(yǔ)句又稱(chēng)跳出語(yǔ)句,用來(lái)結(jié)束循環(huán)結(jié)構(gòu),然后執(zhí)行循環(huán)體后面的語(yǔ)句。其一般形式為:

break;

break語(yǔ)句也可以作為switch語(yǔ)句的出口,用于退出case結(jié)構(gòu)。

【例2-11】

輸出100以?xún)?nèi)所有的素?cái)?shù)。

素?cái)?shù),也稱(chēng)質(zhì)數(shù),就是一個(gè)大于2且只能被1和本身整除的整數(shù)。判斷素?cái)?shù)的常用算法是:對(duì)于i,只要能被2到i-1中任何一個(gè)數(shù)整除,i就不是素?cái)?shù),否則i是素?cái)?shù)。程序如下:

#include''stdafx.h''

#include<iostream.h>

intmain(intargc,char*argv[])

{

constn=100;

cout<<''100以?xún)?nèi)的素?cái)?shù)有:''<<endl;

for(inti=2;i<=n;i++)

{

intflag=1;

//flag相當(dāng)于一個(gè)判斷標(biāo)志,首先用來(lái)

//假設(shè)m為素?cái)?shù)

for(intj=2;j<i;j++)

//判斷i是否是素?cái)?shù),也可以將j<i改為j<=sqrt(i)

{

if(i%j==0){flag=0;break;}

//如果i能被j整除,該i不是素

//數(shù),退出本次循環(huán)

}

if(flag==1)cout<<i<<‘,’;

//依次顯示判斷出的素?cái)?shù)

}

cout<<endl;

return0;

}

程序運(yùn)行結(jié)果如圖2-18所示。圖2-18break語(yǔ)句求素?cái)?shù)運(yùn)行結(jié)果

2.continue語(yǔ)句

continue語(yǔ)句又稱(chēng)繼續(xù)語(yǔ)句,可以用來(lái)跳出本次循環(huán)而進(jìn)入下一次循環(huán)。其一般形式為:

continue;

continue語(yǔ)句與break語(yǔ)句的主要區(qū)別是:continue語(yǔ)句是根據(jù)條件判斷只結(jié)束本次循環(huán),不結(jié)束整個(gè)循環(huán)結(jié)構(gòu),而break語(yǔ)句則結(jié)束整個(gè)循環(huán)結(jié)構(gòu),不再進(jìn)行判斷,然后執(zhí)行循環(huán)體后面的語(yǔ)句?!纠?-12】

輸出100以?xún)?nèi)所有能被7整除的數(shù)。

程序如下:

#include"stdafx.h"

#include<iostream.h>

intmain(intargc,char*argv[])

{

intn=100,i;

cout<<"100以?xún)?nèi)能被7整除的數(shù)有:"<<endl;

for(i=1;i<=n;i++)

{

if(i%7!=0)continue; //如果i不能被7整除,則開(kāi)始下

//一次循環(huán)

cout<<i<<‘,’; //如果i能被7整除,則輸出

}

cout<<endl;

return0;

}

程序運(yùn)行結(jié)果如圖2-19所示。圖2-19continue語(yǔ)句運(yùn)行結(jié)果

3.goto語(yǔ)句

goto語(yǔ)句又稱(chēng)轉(zhuǎn)向語(yǔ)句,用來(lái)將程序無(wú)條件跳轉(zhuǎn)到指定的標(biāo)號(hào)語(yǔ)句處。其一般形式為:

goto<標(biāo)號(hào)>;

其中標(biāo)號(hào)是一個(gè)標(biāo)志符,其定義出現(xiàn)在標(biāo)號(hào)語(yǔ)句中;它的一般形式為:

<標(biāo)號(hào)>:<語(yǔ)句>

需要注意的是:goto語(yǔ)句的使用會(huì)使程序結(jié)構(gòu)不清晰,可讀性差。在結(jié)構(gòu)化程序設(shè)計(jì)中要求盡量少用或不用goto語(yǔ)句。

【例2-13】

通過(guò)鍵盤(pán)輸入一個(gè)數(shù),如果該數(shù)不是兩位數(shù),即小于10或大于99就用goto語(yǔ)句轉(zhuǎn)到標(biāo)號(hào)位置,要求重新輸入。程序如下:

#include''stdafx.h''

#include<iostream.h>

intmain(intargc,char*argv[])

{

intnum;

L1:cout<<''輸入一個(gè)兩位數(shù):''<<endl;

cin>>num;

cout<<num<<endl;

if(num<10||num>99)gotoL1;//如果輸入的數(shù)num不是兩位數(shù),則重新輸入

return0;

}

程序運(yùn)行結(jié)果如圖2-20所示。圖2-20goto語(yǔ)句舉例運(yùn)行結(jié)果

4.return語(yǔ)句

return語(yǔ)句又稱(chēng)返回語(yǔ)句,可以用來(lái)停止執(zhí)行當(dāng)前函數(shù),轉(zhuǎn)而執(zhí)行調(diào)用該函數(shù)后面的語(yǔ)句。其一般形式為:

return<表達(dá)式>;

表達(dá)式可以是任何類(lèi)型的變量,也可以是void型。需要注意的是所返回的表達(dá)式的類(lèi)型必須與函數(shù)的類(lèi)型一致。

【例2-14】

編寫(xiě)一函數(shù)返回兩個(gè)數(shù)的最小值。

程序如下:

#include''stdafx.h''

#include<iostream.h>

intmax(intx,inty){ return(x<y?x:y);}//返回x,y的最小值

intmain(intargc,char*argv[])

{

inta,b;

cout<<"輸入兩個(gè)數(shù),求出最小值:"<<endl;

cin>>a>>b;

cout<<"最小值為:"<<max(a,b)<<endl;

return0;

}

程序運(yùn)行結(jié)果如圖2-21所示。圖2-21return語(yǔ)句舉例運(yùn)行結(jié)果

2.6構(gòu)造類(lèi)型

在前面講到由用戶(hù)構(gòu)造的自定義數(shù)據(jù)類(lèi)型,其中對(duì)枚舉類(lèi)型已經(jīng)作了相應(yīng)介紹,本節(jié)就對(duì)屬于構(gòu)造類(lèi)型的數(shù)組、結(jié)構(gòu)、聯(lián)合以及typedef等類(lèi)型進(jìn)行一一介紹。

2.6.1數(shù)組

數(shù)組并不是一種數(shù)據(jù)類(lèi)型,而是一組相同類(lèi)型的變量的集合。在程序中使用數(shù)組的好處是可以用一個(gè)統(tǒng)一的數(shù)組名代表邏輯上相關(guān)的一組數(shù)據(jù),并用下標(biāo)表示各元素在數(shù)組中的位置。

1.?dāng)?shù)組的聲明

一維數(shù)組的聲明,其一般形式為:

<類(lèi)型名><數(shù)組名>[<元素個(gè)數(shù)>]={<初值表>};

多維數(shù)組的聲明,其一般形式為:

<類(lèi)型名><數(shù)組名>[<下標(biāo)表達(dá)式1>][<下標(biāo)表達(dá)式2>]…

各部分的含義如下。

(1)類(lèi)型名:可以是基本類(lèi)型名,也可以是基本類(lèi)型的派生類(lèi)型名、類(lèi)名、枚舉類(lèi)型名、結(jié)構(gòu)、聯(lián)合類(lèi)型名。

(2)數(shù)組名:是標(biāo)志符,表示數(shù)組元素在內(nèi)存中的起始位置,是常量,不能賦值。

(3)元素個(gè)數(shù):是一個(gè)正整數(shù),表示數(shù)組的元素個(gè)數(shù)或數(shù)組的大小。元素個(gè)數(shù)要用方括號(hào)“[]”括起來(lái)。方括號(hào)不可缺省,元素個(gè)數(shù)則可缺省,但必須賦初值,系統(tǒng)會(huì)根據(jù)所賦的初值個(gè)數(shù)來(lái)確定數(shù)組的大小。

(4)初值表:可以缺省,用大括號(hào)“{}”括起來(lái),并用逗號(hào)“,”分開(kāi)每個(gè)初值。

例如:

charch[10]; //定義長(zhǎng)度為10的一維字符型數(shù)組

inta[]={3,6,9}; //定義一維整型數(shù)組a并給數(shù)組第0到第2個(gè)元素依次賦值為3,6,9

floatb[3][5]; //定義二維單精度浮點(diǎn)型數(shù)組b,該數(shù)組有3行5列

2.?dāng)?shù)組元素的引用

定義數(shù)組時(shí)用數(shù)組名表示該數(shù)組的整體,但C++語(yǔ)言沒(méi)有提供對(duì)數(shù)組進(jìn)行整體操作的運(yùn)算符和運(yùn)算,而是在數(shù)組的具體操作時(shí)針對(duì)每個(gè)數(shù)組元素進(jìn)行,即通過(guò)下標(biāo)變量進(jìn)行。

數(shù)組元素引用的一般形式為:

<數(shù)組名>[<下標(biāo)>]…

下標(biāo)表達(dá)式的個(gè)數(shù)應(yīng)與維數(shù)相同。注意下標(biāo)表達(dá)式的值從0開(kāi)始,并且不允許改變,所以數(shù)組的有效下標(biāo)為從0到表達(dá)式的值(元素個(gè)數(shù))減1。

例如:

inta[5];

共有5個(gè)數(shù)組元素,分別為a[0],a[1],a[2],a[3],a[4]。數(shù)組定義后,系統(tǒng)會(huì)根據(jù)數(shù)組的大小開(kāi)辟相應(yīng)的內(nèi)存,并依次存放。

例如:

intb[3,5];

其存放次序?yàn)椋?/p>

b[0][0],b[0][1],b[0][2],b[0][3],b[0][4],

b[1][0],b[1][1],b[1][2],b[1][3],b[1][4],

b[2][0],b[2][1],b[2][2],b[2][3],b[2][4].

需要注意的是:為了提高程序的執(zhí)行速度,C++語(yǔ)言對(duì)于數(shù)組的越界使用不作檢查,所以編程時(shí)要注意在數(shù)組元素的引用時(shí)不要超過(guò)所定義的長(zhǎng)度。

3.?dāng)?shù)組的賦值

給數(shù)組元素賦值,有初始化、賦值語(yǔ)句、輸入語(yǔ)句三種方式。

1)初始化

即在定義時(shí),便給數(shù)組元素指定相應(yīng)的值。例如:

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

相當(dāng)于給a[0],a[1],a[2],a[3]分別賦值為1、2、3、4,而a[4]沒(méi)有賦初值。

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

相當(dāng)于分行給二維數(shù)組賦初值。

2)賦值語(yǔ)句

例如:

a[4]=2*a[3];

相當(dāng)于把2×4=8賦值給a[4]。

3)輸入語(yǔ)句

例如:

for(inti=0;i<5;i++)cin>>a[i];

相當(dāng)于通過(guò)循環(huán)語(yǔ)句和鍵盤(pán)操作,給數(shù)組的5個(gè)元素依次賦值。

【例2-15】

矩陣的轉(zhuǎn)置。

例如a矩陣為:轉(zhuǎn)置后的矩陣b為:矩陣轉(zhuǎn)置的方法是將a數(shù)組第i行第j列的元素賦值給b數(shù)組第j行第i列。程序如下:

#include"stdafx.h"

#include<iostream.h>

intmain(intargc,char*argv[])

{

inta[3][5],n=1; //定義一個(gè)3行5列的矩陣a

intb[5][3]; //定義一個(gè)5行3列的矩陣b

inti,j;

cout<<"a矩陣為:"<<endl;

for(i=0;i<3;i++)

{

for(j=0;j<5;j++)

{ a[i][j]=n++; //依次給元素賦值為1,2,3…

b[j][i]=a[i][j]; //將a轉(zhuǎn)置后賦值給b

cout.width(5); //控制輸出格式,輸出寬度為5

cout<<a[i][j];

}

cout<<endl;

}

cout<<''a矩陣的轉(zhuǎn)置b矩陣為:''<<endl;

for(i=0;i<5;i++)

{

for(j=0;j<3;j++)

{

cout.width(5); //控制輸出格式,輸出寬度為5

cout<<b[i][j];

}

cout<<endl;

}

return0;

}

程序運(yùn)行結(jié)果如圖2-22所示。圖2-22矩陣的轉(zhuǎn)置運(yùn)行結(jié)果

4.字符數(shù)組

從表面上看,一個(gè)字符串就是一個(gè)字符數(shù)組,但在C++語(yǔ)言中,它們是不完全相同的。

字符串是一個(gè)以空字符‘\0’作為結(jié)束符的字符型數(shù)組。從下面的例子可以看出其區(qū)別:

charch1[]={"Hello"};

//ch1的字符長(zhǎng)度為6,由5個(gè)字符和‘\0’組成

charch2[7]={"Hello"};

//ch2的字符長(zhǎng)度為7,前6個(gè)元素已賦初值并

//分別為'H','e','l','l','o'和'

\0'

charch3[5]={'H','e','l','l','o'};

//ch3的字符長(zhǎng)度為5,其5個(gè)元素已賦

//初值并分別為'H','e','l','l','o'

5.?dāng)?shù)組的應(yīng)用

數(shù)組在程序設(shè)計(jì)中使用頻繁,為了熟練地掌握數(shù)組的使用,下面介紹一些常用算法。

1)數(shù)組排序

排序是將一組數(shù)按遞增或遞減的次序排列。排序有很多種方法,常用的有比較交換法、選擇法、冒泡法以及插入法等,最簡(jiǎn)單的是選擇法。

【例2-16】

用選擇法對(duì)數(shù)組a進(jìn)行遞增排序。

思路:

①?gòu)膎個(gè)數(shù)中,逐個(gè)比較,從中選出最小(遞增)的數(shù)及所在的下標(biāo),與第1個(gè)數(shù)交換位置。

②除第1個(gè)數(shù),其余n-1個(gè)數(shù)按①方法。

排序進(jìn)行的過(guò)程如圖2-23所示。圖2-23選擇法排序過(guò)程示意圖程序如下:

#include"stdafx.h"

#include<iostream.h>

intmain(intargc,char*argv[])

{

inti,j,k,t;

inta[6]={7,6,9,4,2,8};

intn=6;

cout<<"排序前的數(shù)組:";

for(i=0;i<n;i++)

cout<<a[i]<<"";

cout<<endl;

for(i=0;i<n-1;i++) //進(jìn)行n-1輪比較

{

k=i; //對(duì)第i輪比較時(shí),初始假定第i個(gè)元素最小

for(j=i+1;j<n;j++)

if(a[j]<a[k])k=j;//在i~n個(gè)元素中選出最小元素的下標(biāo)

t=a[k];a[k]=a[i];a[i]=t;//在i~n個(gè)元素中選出最小元素與第i個(gè)

//元素交換

}

cout<<“排序后的數(shù)組:”;

for(i=0;i<n;i++)

cout<<a[i]<<“”;

cout<<endl;

return0;

}

程序運(yùn)行結(jié)果如圖2-24所示。圖2-24選擇法排序運(yùn)行結(jié)果

2)分類(lèi)統(tǒng)計(jì)

分類(lèi)統(tǒng)計(jì)是經(jīng)常遇到的運(yùn)算,是將一批數(shù)據(jù)按分類(lèi)的條件統(tǒng)計(jì)每一類(lèi)中包含的個(gè)數(shù)。

【例2-17】

隨機(jī)產(chǎn)生20位同學(xué)的成績(jī),統(tǒng)計(jì)各個(gè)分?jǐn)?shù)段人數(shù),即0~59、60~69、70~79、80~89、90~100,并顯示結(jié)果。

程序如下:

#include"stdafx.h"

#include<ios

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論