版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024跨國(guó)廣告代理協(xié)議
- 2025年度產(chǎn)學(xué)研合作項(xiàng)目技術(shù)研發(fā)與市場(chǎng)應(yīng)用協(xié)議4篇
- 2024年04月浙江臺(tái)州銀行寧波分行社會(huì)招考(422)筆試歷年參考題庫(kù)附帶答案詳解
- 2025年度分手后子女撫養(yǎng)協(xié)議書(shū)范本下載3篇
- 2025年度城市綜合體場(chǎng)地服務(wù)合作合同4篇
- 2025年度國(guó)際商務(wù)大廈廠房租賃合同英文版3篇
- 2024版智能穿戴設(shè)備技術(shù)轉(zhuǎn)讓合同
- 2025年度廠房設(shè)備融資租賃與市場(chǎng)拓展合同4篇
- 2024年03月重慶重慶銀行貿(mào)易金融部招考筆試歷年參考題庫(kù)附帶答案詳解
- 2025年度產(chǎn)學(xué)研合作人才培養(yǎng)及項(xiàng)目支持協(xié)議4篇
- 《線(xiàn)控底盤(pán)技術(shù)》2024年課程標(biāo)準(zhǔn)(含課程思政設(shè)計(jì))
- 學(xué)校對(duì)口幫扶計(jì)劃
- 倉(cāng)庫(kù)倉(cāng)儲(chǔ)安全管理培訓(xùn)課件模板
- 風(fēng)力發(fā)電場(chǎng)運(yùn)行維護(hù)手冊(cè)
- 《3-6歲兒童學(xué)習(xí)與發(fā)展指南》專(zhuān)題培訓(xùn)
- 河道旅游開(kāi)發(fā)合同
- 情人合同范例
- 建筑公司勞務(wù)合作協(xié)議書(shū)范本
- 安徽省合肥市2023-2024學(xué)年高一上學(xué)期物理期末試卷(含答案)
- 《基于杜邦分析法的公司盈利能力研究的國(guó)內(nèi)外文獻(xiàn)綜述》2700字
- 儒家思想講解課程設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論