程序設(shè)計(jì)-第3章_第1頁
程序設(shè)計(jì)-第3章_第2頁
程序設(shè)計(jì)-第3章_第3頁
程序設(shè)計(jì)-第3章_第4頁
程序設(shè)計(jì)-第3章_第5頁
已閱讀5頁,還剩108頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第3章程序設(shè)計(jì)初步第4章函數(shù)與預(yù)處理第5章數(shù)組第6章指針第7章自定義數(shù)據(jù)類型第2篇面向過程的程序設(shè)計(jì)編程資源請(qǐng)關(guān)注:

2.

C++程序和語句3.

賦值語句4.

C++的輸入與輸出編寫順序結(jié)構(gòu)的程序關(guān)系運(yùn)算和邏輯運(yùn)算7.

選擇結(jié)構(gòu)和if語句條件運(yùn)算符和條件表達(dá)式多分支選擇結(jié)構(gòu)和switch語句10.

編寫選擇結(jié)構(gòu)的程序循環(huán)結(jié)構(gòu)和循環(huán)語句循環(huán)的嵌套break語句和continue語句編寫循環(huán)結(jié)構(gòu)的程序編程資源請(qǐng)關(guān)注:

第3章程序設(shè)計(jì)初步1.

面向過程的程序設(shè)計(jì)和算法在面向過程的程序設(shè)計(jì)中,程序設(shè)計(jì)者必須指定計(jì)算機(jī)執(zhí)行的具體步驟,程序設(shè)計(jì)者不僅要考慮程序要“做什么”,還要解決“怎么做”的問題,根據(jù)程序要“做什么”的要求,寫出一個(gè)個(gè)語句,安排好它們的執(zhí)行順序。怎樣設(shè)計(jì)這些步驟,怎樣保證它的正確性和具有較高的效率,這就是算法需要解決的問題。3.1

面向過程的程序設(shè)計(jì)和算法編程資源請(qǐng)關(guān)注:

一個(gè)面向過程的程序應(yīng)包括以下兩方面內(nèi)容:(1)對(duì)數(shù)據(jù)的描述。在程序中要指定數(shù)據(jù)的類型和數(shù)據(jù)的組織形式,即數(shù)據(jù)結(jié)構(gòu)(data

structure)。(2)對(duì)操作的描述。即操作步驟,也就是算法(algorithm)。對(duì)于面向過程的程序,可以用下面的公式表示:程序=算法+數(shù)據(jù)結(jié)構(gòu)作為程序設(shè)計(jì)

,必須認(rèn)真考慮和設(shè)計(jì)數(shù)據(jù)結(jié)構(gòu)和操作步驟(即算法)。算法是處理問題的一系列的步驟。算法必須具體地在執(zhí)行時(shí)每一步應(yīng)當(dāng)怎樣做。3.1.1

算法的概念編程資源請(qǐng)關(guān)注:

不要認(rèn)為只有“計(jì)算”的問題才有算法。廣義地說,為解決一個(gè)問題而采取的方法和步驟,就稱為“算法”。計(jì)算機(jī)算法可分為兩大類別:數(shù)值算法和非數(shù)值算法。數(shù)值算法的目的是求數(shù)值解。非數(shù)值算法包括的面十分廣泛,最常見的是用于事務(wù)管理領(lǐng)域。目前,計(jì)算機(jī)在非數(shù)值方面的應(yīng)用遠(yuǎn)遠(yuǎn)超過了在數(shù)值方面的應(yīng)用。象C++既支持面向過程的程序設(shè)計(jì),又支持面

的程序設(shè)計(jì)。無論面向過程的程序設(shè)計(jì)還是面象的程序設(shè)計(jì),都離不開算法設(shè)計(jì)。編程資源請(qǐng)關(guān)注:

自然語言用中文或英文等自然語言描述算法。但容易產(chǎn)生歧義性,在程序設(shè)計(jì)中一般不用自然語言表示算法。流程圖可以用傳統(tǒng)的流程圖或結(jié)構(gòu)化流程圖。用圖的形式表示算法,比較形象直觀,但修改算法時(shí)顯得不大方便。偽代碼(pseudo

code)偽代碼是用介于自然語言和計(jì)算機(jī)語言之間的文字和符號(hào)來描述算法。如3.1.2

算法的表示編程資源請(qǐng)關(guān)注:

if

x

is

positive

thenprint

xelseprint-x用偽代碼寫算法并無固定的、嚴(yán)格的語則,只需把意思表達(dá)清楚,并且書寫的格式要寫成清晰易讀的形式。它不用圖形符號(hào),因此書寫方便、格式緊湊,容易修改,便于向計(jì)算機(jī)語言算法(即程序)過渡。4.

用計(jì)算機(jī)語言表示算法用一種計(jì)算機(jī)語言去描述算法,這就是計(jì)算機(jī)程序。編程資源請(qǐng)關(guān)注:

由第1章已知,一個(gè)程序包含一個(gè)或多個(gè)程序單位

(每個(gè)程序單位構(gòu)成一個(gè)程序文件)。每一個(gè)程序單位由以下幾個(gè)部分組成:預(yù)處理命令。如#include命令和#define命令。部分。例如對(duì)數(shù)據(jù)類型和函數(shù)的

,以及對(duì)變量的定義。函數(shù)。包括函數(shù)首部和函數(shù)體,在函數(shù)體中可以包含若干

語句和執(zhí)行語句。如下面是一個(gè)完整的C++程序:3.2

C++程序和語句編程資源請(qǐng)關(guān)注:

#include

<iostream>using

namespace

std;int

a=3;//預(yù)處理命令//在函數(shù)之外的//在函數(shù)之外的

部分//函數(shù)首部//函數(shù)內(nèi)的 部分//執(zhí)行語句//執(zhí)行語句//執(zhí)行語句int

main(

){

float

b;b=4.5;cout<<a<<b;return

0;}如果一個(gè)變量在函數(shù)之

,此變量是全局變量,它的有效范圍是從該行開始到本程序單位結(jié)束。如果一個(gè)變量在函數(shù)內(nèi)

,此變量是局部變量,它的有效范圍是從該行開始到本函數(shù)結(jié)束。C++程序結(jié)構(gòu)可以用圖3.1表示。部分編程資源請(qǐng)關(guān)注:

圖3.1編程資源請(qǐng)關(guān)注:

程序應(yīng)該包括數(shù)據(jù)描述(由 語句來實(shí)現(xiàn))和數(shù)據(jù)操作(由執(zhí)行語句來實(shí)現(xiàn))。數(shù)據(jù)描述主要包括數(shù)據(jù)類型的

、函數(shù)和變量的定義、變量的初始化等。數(shù)據(jù)操作的任務(wù)是對(duì)已提供的數(shù)據(jù)進(jìn)行加工。C++程序中最小的獨(dú)立單位是語句(statement)。它相當(dāng)于一篇文章中的一個(gè)句子。句子是用

結(jié)束的。語句一般是用分號(hào)結(jié)束的(復(fù)合語句是以右花括號(hào)結(jié)束的)。C++語句可以分為以下4種:編程資源請(qǐng)關(guān)注:

1.

語句如int

a,b;在C語言中,只有產(chǎn)生實(shí)際操作的才稱為語句,對(duì)變量的定義

語句,而且要求對(duì)變量的定義必須出現(xiàn)在本塊中所有程序語句之前。因此

C程序員已經(jīng)養(yǎng)成了一個(gè) :

在函數(shù)或塊的開頭位置定義全部變量。在C++中,對(duì)變量(以及其他對(duì)象)的定義被認(rèn)為是一條語句,并且可以出現(xiàn)在函數(shù)中的任何行,即可以放在其他程序語句可以出現(xiàn)的地方,也可以放在函數(shù)之外。這樣更加靈活,可以很方便地實(shí)現(xiàn)變量的局部化(變量的作用范圍從語句開始到本函數(shù)或本塊結(jié)束)。編程資源請(qǐng)關(guān)注:

2.

執(zhí)行語句通知計(jì)算機(jī)完成一定的操作。執(zhí)行語句包括:(1)控制語句,完成一定的控制功能。C++有9種控制語句,即①

if(

)~else~②

for(

)~③

while(

)~④

do~while(

)⑤

continue⑥

break⑦

switch⑧

goto⑨

return(條件語句)(循環(huán)語句)(循環(huán)語句)(循環(huán)語句)(結(jié)束本次循環(huán)語句)(中止執(zhí)行switch或循環(huán)語句)(多分支選擇語句)(轉(zhuǎn)向語句)(從函數(shù)返回語句)編程資源請(qǐng)關(guān)注:

(2)函數(shù)和流對(duì)象調(diào)用語句。函數(shù)調(diào)用語句由一次函數(shù)調(diào)用加一個(gè)分號(hào)構(gòu)成一個(gè)語句,例如sort(x,y,z);cout<<x<<endl;//假設(shè)已定義了sort函數(shù),它有3個(gè)參數(shù)//流對(duì)象調(diào)用語句(3)表達(dá)式語句。由一個(gè)表達(dá)式加一個(gè)分號(hào)構(gòu)成一個(gè)語句。最典型的是:由賦值表達(dá)式構(gòu)成一個(gè)賦值語句。i=i+1i=i+1;//是一個(gè)賦值表達(dá)式//是一個(gè)賦值語句任何一個(gè)表達(dá)式的最后加一個(gè)分號(hào)都可以成為一個(gè)語句。一個(gè)語句必須在最后出現(xiàn)分號(hào)。表達(dá)式能構(gòu)成語句是C和C++語言的一個(gè)重要特色。

C++程序中大多數(shù)語句是表達(dá)式語句(包括函數(shù)調(diào)用語句)。編程資源請(qǐng)關(guān)注:

3.

空語句下面是一個(gè)空語句:;即只有一個(gè)分號(hào)的語句,它什么也不做。有時(shí)用來做被轉(zhuǎn)向點(diǎn),或循環(huán)語句中的循環(huán)體。編程資源請(qǐng)關(guān)注:

4.

復(fù)合語句可以用

{}把一些語句括起來成為復(fù)合語句。如下面是一個(gè)復(fù)合語句。{

z=x+y;if(z>100)

z=z-100;cout<<z;}注意:復(fù)合語句中最后一個(gè)語句中最后的分號(hào)不能省略。在本章中將介紹幾種順序執(zhí)行的語句,在執(zhí)行這些語句的過程中不會(huì)發(fā)生流程的控制轉(zhuǎn)移。編程資源請(qǐng)關(guān)注:

前面已介紹,賦值語句是由賦值表達(dá)式加上一個(gè)分號(hào)構(gòu)成。(1)C++的賦值語句具有其他高級(jí)語言的賦值語句的功能。但不同的是:C++中的賦值號(hào)“=”是一個(gè)運(yùn)算符,可以寫成a=b=c=d;而在其他大多數(shù)語言中賦值號(hào)不是運(yùn)算符,上面的寫法是不合法的。3.3

賦值語句編程資源請(qǐng)關(guān)注:

(2)

關(guān)于賦值表達(dá)式與賦值語句的概念。在C++中,賦值表達(dá)式可以包括在其他表達(dá)式之中,例如if((a=b)>0)

cout<<″a>0″<<endl;按語

定if后面的()內(nèi)是一個(gè)條件?,F(xiàn)在在x的位置上換上一個(gè)賦值表達(dá)式“a=b”,其作用是:先進(jìn)行賦值運(yùn)算(將b的值賦給a),然后判斷a是否大于0,如大于0,執(zhí)行cout<<″a>0″<<endl;。在if語句中的“a=b”不是賦值語句而是賦值表達(dá)式,這樣寫是合法的。不能寫成if((a=b;)>0)

cout<<″a>0″<<endl;因?yàn)樵趇f的條件中不能包含賦值語句。C++把賦值語句和賦值表達(dá)式區(qū)別開來,增加了表達(dá)式的種類,能實(shí)現(xiàn)其他語言中難以實(shí)現(xiàn)的功能。編程資源請(qǐng)關(guān)注:

輸入和輸出并不是C++語言中的正式組成成分。C和C++本身都沒有為輸入和輸出提供專門的語句結(jié)構(gòu)。輸入輸出不是由C++本身定義的,而是在編譯系統(tǒng)提供的I/O庫中定義的。C++的輸出和輸入是用“流”(stream)的方式實(shí)現(xiàn)的。圖3.2和圖3.3表示C++通過流進(jìn)行輸入輸出的過程。3.4

C++的輸入與輸出編程資源請(qǐng)關(guān)注:

圖3.2圖3.3編程資源請(qǐng)關(guān)注:

有關(guān)流對(duì)象cin、cout和流運(yùn)算符的定義等信息是存放在C++的輸入輸出流庫中的,因此如果在程序中使用cin、cout和流運(yùn)算符,就必須使用預(yù)處理命令把頭文件stream包含到本文件中:#include

<iostream>盡管cin和cout不是C++本身提供的語句,但是在不致 的情況下,為了敘述方便,常常把由cin和流提取運(yùn)算符“>>”實(shí)現(xiàn)輸入的語句稱為輸入語句或

cin語句,把由cout和流

運(yùn)算符“<<”實(shí)現(xiàn)輸出的語句稱為輸出語句或cout語句。根據(jù)C++的語

法,凡是能實(shí)現(xiàn)某種操作而且最后以分號(hào)結(jié)束的都是語句。編程資源請(qǐng)關(guān)注:

cout語句的一般格式為cout<<表達(dá)式1<<表達(dá)式2<<……<<表達(dá)式n;cin語句的一般格式為cin>>變量1>>變量2>>……>>變量n;在定義流對(duì)象時(shí),系統(tǒng)會(huì)在內(nèi)存中開辟一段緩沖區(qū),用來暫存輸入輸出流的數(shù)據(jù)。在執(zhí)行cout語句時(shí),先把

的數(shù)據(jù)順序存放在輸出緩沖區(qū)中,直到輸出緩沖區(qū)滿或遇到cout語句中的endl(或′\n′,ends,flush)為止,此時(shí)將緩沖區(qū)中已有的數(shù)據(jù)一起輸出,并清空緩沖區(qū)。輸出流中的數(shù)據(jù)在系統(tǒng)默認(rèn)的設(shè)備(一般為顯示器)輸出。*3.4.1

輸入流與輸出流的基本操作編程資源請(qǐng)關(guān)注:

一個(gè)cout語句可以分寫成若干行。如cout<<″This

is

a

simple

C++

program.″<<endl;可以寫成//注意行末尾無分號(hào)cout<<″This

is

″<<″a

C++

″<<″program.″<<endl;//語句最后有分號(hào)也可寫成多個(gè)cout語句,即//語句末尾有分號(hào)cout<<″This

is

″;cout

<<″a

C++

″;cout

<<″program.″;cout<<endl;以上3種情況的輸出均為編程資源請(qǐng)關(guān)注:

注意不能用一個(gè)cout<<a,b,c;cout<<a+b+c;運(yùn)算符“<<”//錯(cuò)誤,不能一次多個(gè)輸出項(xiàng):多項(xiàng)//正確,這是一個(gè)表達(dá)式,作為一項(xiàng)在用cout輸出時(shí),用戶不必通知計(jì)算機(jī)按何種類型輸出,系統(tǒng)會(huì)自動(dòng)判別輸出數(shù)據(jù)的類型,使輸出的數(shù)據(jù)按相應(yīng)的類型輸出。如已定義a為int型,b為float型,c為char型,則cout<<a<<′

′<<b<<′

′<<c<<endl;會(huì)以下面的形式輸出:4

345.789

a與cout類似,一個(gè)cin語句可以分寫成若干行。如cin>>a>>b>>c>>d;編程資源請(qǐng)關(guān)注:

This

is

a

simple

C++

program.可以寫成//注意行末尾無分號(hào)//這樣寫可能看起來清晰些cin>>a>>b>>c>>d;也可以寫成cin>>a;cin>>b;cin>>c;cin>>d;以上3種情況均可以從鍵盤輸入:

1

2

3 4

↙也可以分多行輸入數(shù)據(jù):編程資源請(qǐng)關(guān)注:

編程資源請(qǐng)關(guān)注:

1↙2

3↙4↙在用cin輸入時(shí),系統(tǒng)也會(huì)根據(jù)變量的類型從輸入流中提取相應(yīng)長(zhǎng)度的字節(jié)。char

c1,c2;int

a;float

b;cin>>c1>>c2>>a>>b;如果輸入1234

56.78↙注意:34后面應(yīng)該有空格以便和56.78分隔開。也可以按下面格式輸入:1

2

34

56.78↙

(在1和2之間有空格)不能用cin語句把空格字符和回車換行符作為字符輸入給字符變量,它們將被跳過。如果想將空格字符或回車換行符(或任何其他鍵盤上的字符)輸入給字符變量,可以用3.4.3節(jié)介紹的getchar函數(shù)。在組織輸入流數(shù)據(jù)時(shí),要仔細(xì)分析cin語句中變量的類型,按照相應(yīng)的格式輸入,否則容易出錯(cuò)。編程資源請(qǐng)關(guān)注:

上面介紹的是使用cout和cin時(shí)的默認(rèn)格式。但有時(shí)人們?cè)谳斎胼敵鰰r(shí)有一些特殊的要求,如在輸出實(shí)數(shù)時(shí)規(guī)定字段寬度,只保留兩位小數(shù),數(shù)據(jù)向左或向右對(duì)齊等。C++提供了在輸入輸出流中使用的控制符(有的書中稱為符),見書中表3.1。需要注意的是:如果使用了控制符,在程序單位的開頭除了要加iostream頭文件外,還要加iomanip頭文件。舉例:輸出雙精度數(shù)。*3.4.2

在輸入流與輸出流中使用控制符編程資源請(qǐng)關(guān)注:

double

a=123.456789012345;對(duì)a賦初值cout<<a;輸出:123.456cout<<setprecision(9)<<a;輸出:123.456789cout<<setprecision(6);恢復(fù)默認(rèn)格式(精度為6)cout<<setiosflags(ios∷fixed);輸出:123.456789cout<<setiosflags(ios∷fixed)<<setprecision(8)<<a;輸出:123.45678901cout<<setiosflags(ios∷scientific)<<a;輸出:1.234568e+02cout<<setiosflags(ios∷scientific)<<setprecision(4)<<a;輸出:1.2346e02下面是整數(shù)輸出的例子:int

b=123456;對(duì)b賦初值cout<<b;輸出:123456cout<<hex<<b;輸出:1e240cout<<setiosflags(ios∷uppercase)<<b;輸出:1E240cout<<setw(10)<<b<<′,′<<b;

輸出:

123456,123456cout<<setfill(′*′)<<setw(10)<<b;輸出:****

123456cout<<setiosflags(ios∷showpos)<<b;輸出:編程資源請(qǐng)關(guān)注:

如果在多個(gè)cout語句中使用相同的setw(n),并使用setiosflags(ios∷right),可以實(shí)現(xiàn)各行數(shù)據(jù)右對(duì)齊,如果指定相同的精度,可以實(shí)現(xiàn)上下小數(shù)點(diǎn)對(duì)齊。例3.1

各行小數(shù)點(diǎn)對(duì)齊。#include

<iostream>#include

<iomanip>using

namespace

std;int

main(

){double

a=123.456,b=3.14159,c=-3214.67;cout<<setiosflags(ios∷fixed)<<setiosflags(ios∷right)<<setprecision(2);cout<<setw(10)<<a<<endl;cout<<setw(10)<<b<<endl;cout<<setw(10)<<c<<endl;return

0;編程資源請(qǐng)關(guān)注:

輸出如下:(字段寬度為10,右對(duì)齊,取兩位小數(shù))123.463.14-3214.67先

設(shè)置定點(diǎn)形式輸出、取兩位小數(shù)、右對(duì)齊。這些設(shè)置對(duì)其后的輸出均有效(除非重新設(shè)置),而setw只對(duì)其后一個(gè)輸出項(xiàng)有效,因此必須在輸出a,b,c之前都要寫setw(10)。編程資源請(qǐng)關(guān)注:

C++還保留了C語言中用于輸入和輸出單個(gè)字符的函數(shù),使用很方便。其中最常用的有g(shù)etchar函數(shù)和putchar函數(shù)。1.

putchar函數(shù)(字符輸出函數(shù))putchar函數(shù)的作用是向終端輸出一個(gè)字符。例如putchar(c);它輸出字符變量c的值。3.4.3

用getchar和putchar

函數(shù)進(jìn)行字符的輸入和輸出編程資源請(qǐng)關(guān)注:

例3.2

輸出單個(gè)字符。//或者包含頭文件stdio.h:#include<stdio.h>#include

<iostream>using

namespace

std;int

main(

){char

a,b,c;a=′B′;b=′O′;c=′Y′;putchar(a);putchar(b);putchar(c);putchar(′\n′);putchar(66);putchar(79);putchar(89);putchar(10);return

0;}運(yùn)行結(jié)果為BOYBOY編程資源請(qǐng)關(guān)注:

可以看到:用putchar可以輸出轉(zhuǎn)義字符,putchar(′\n′)的作用是輸出一個(gè)換行符,使輸出的當(dāng)前位置移到下一行的開頭。putchar(66)的作用是將66作為ASCII碼轉(zhuǎn)換為字符輸出,66是字母′B′的ASCII碼,因此putchar(66)輸出字母′B′。其余類似。putchar(10)中的10是換行符的ASCII碼,

putchar(10)輸出一個(gè)換行符,作用與putchar(′\n′)相同。也可以輸出其他轉(zhuǎn)義字符,如(輸出字符′A′,八進(jìn)制的101是′A′的ASCII(輸出單引號(hào)字符′)(輸出回車,不換行,使輸出的當(dāng)前位置putchar(′\101′)碼)putchar(′\′′)putchar(′\015′)移到本行開頭)編程資源請(qǐng)關(guān)注:

2.

getchar函數(shù)(字符輸入函數(shù))此函數(shù)的作用是從終端(或系統(tǒng)隱含指定的輸入設(shè)備)輸入一個(gè)字符。getchar函數(shù)沒有參數(shù),其一般形式為getchar(

)函數(shù)的值就是從輸入設(shè)備得到的字符。例3.3

輸入單個(gè)字符。#include

<iostream>using

namespace

std;int

main(

){char

c;c=getchar(

);

putchar(c+32);

putchar(′\n′);return

0;}在運(yùn)行時(shí),如果從鍵盤輸入大寫字母′A′并按回車鍵,就會(huì)在屏幕上輸出小寫字母′a′。編程資源請(qǐng)關(guān)注:

請(qǐng)注意,getchar()只能接收一個(gè)字符。getchar函數(shù)得到的字符可以賦給一個(gè)字符變量或整型變量,也可以不賦給任何變量,作為表達(dá)式的一部分。例如,例3.3第5行可以用下面一行代替:putchar(getchar()+32);putchar(′\n′);因?yàn)間etchar(

)讀入的值為′A′,′A′+32是小寫字母′a′的ASCII碼,因此putchar函數(shù)輸出′a′。此時(shí)不必定義變量c。也可用cout輸出getchar函數(shù)得到字符的ASCII的值:cout<<getchar(

);這時(shí)輸出的是整數(shù)97,因?yàn)橛胓etchar()讀入的實(shí)際上是字符的ASCII碼,現(xiàn)在并未把它賦給一個(gè)字符變量,cout就按整數(shù)形式輸出。如果改成編程資源請(qǐng)關(guān)注:

編程資源請(qǐng)關(guān)注:

cout<<(c=getchar());

//設(shè)c已定義為字符變量則輸出為字母′a′,因?yàn)橐筝敵鲎址兞縞的值。可以看到用putchar和getchar函數(shù)輸出和輸入字符十分靈活方便,由于它們是函數(shù)所以可以出現(xiàn)在表達(dá)式中,例如cout<<(c=getchar(

)+32);在C語言中是用printf函數(shù)進(jìn)行輸出,用scanf函數(shù)進(jìn)行輸入的。C++保留了C語言的這一用法。在此只作很簡(jiǎn)單的介紹。scanf函數(shù)一般格式是scanf(格式控制,輸出表列)printf函數(shù)的一般格式是

printf(格式控制,輸出表列)3.4.4

用scanf和printf函數(shù)進(jìn)行輸入和輸出編程資源請(qǐng)關(guān)注:

例3.4

用scanf和printf函數(shù)進(jìn)行輸入和輸出。#include

<iostream>using

namespace

std;int

main(

){int

a;

float

b;

char

c;scanf(″%d

%c

%f″,&a,&c,&b);

//注意在變量名前要加地址運(yùn)算符&\

″,a,b,c);printf(″return

0;}運(yùn)行情況如下:12

A

67.98↙(本行為輸入,輸入的3個(gè)數(shù)據(jù)間以空格相間)a=12,b=67.980003,c=A(本行為輸出)輸入的整數(shù)12送給整型變量a,字符′A′送給字符變量c,67.98送給單精度變量b。編程資源請(qǐng)關(guān)注:

例3.5求一元二次方程式ax2+bx+c=0的根。a,b,c的值在運(yùn)行時(shí)由鍵盤輸入,它們的值滿足b2-4ac≥0。根據(jù)求x1,x2的算法。它可以編寫出以下C++程序:#include

<iostream>//由于程序要用到數(shù)學(xué)函數(shù)sqrt,故應(yīng)包含頭#include

<cmath>文件cmathusing

namespace

std;int

main(

){float

a,b,c,x1,x2;cin>>a>>b>>c;x1=(-b+sqrt(b*b-4*a*c))/(2*a);x2=(-b-sqrt(b*b-4*a*c))/(2*a);cout<<″x1=″<<x1<<endl;cout<<″x2=″<<x2<<endl;return

0;}3.5

編寫順序結(jié)構(gòu)的程序編程資源請(qǐng)關(guān)注:

運(yùn)行情況如下:4.5

8.8

2.4

↙x1=-0.327612x2=-1.17794如果程序中要用到數(shù)學(xué)函數(shù),都要包含頭文件

cmath(也可以用老形式的頭文件math.h,但提倡使用C++新形式的頭文件,請(qǐng)參閱第14章14.3節(jié))。在寫程序時(shí),一定要注意將數(shù)學(xué)表達(dá)式正確地轉(zhuǎn)換成合法的C++表達(dá)式??梢钥吹剑喉樞蚪Y(jié)構(gòu)的程序中的各執(zhí)行語句是順序執(zhí)行的。這種程序最簡(jiǎn)單,最容易理解。編程資源請(qǐng)關(guān)注:

往往要求根據(jù)某個(gè)指定的條件是否滿足來決定執(zhí)行的內(nèi)容。例如,購物在1000元以下的打九五折,

1000元及以上的打九折。C++提供if語句來實(shí)現(xiàn)這種條件選擇。如if

amount<1000

tax=0.95;

//amount代表購物總額,tax代表折扣else

tax=0.9;pay=amount*tax;//若amount<1000,條件滿足,tax=0.95,否則tax=0.9//pay為實(shí)付款流程可以用圖3.4表示。圖3.43.6

關(guān)系運(yùn)算和邏輯運(yùn)算編程資源請(qǐng)關(guān)注:

上面if語句中的“amount<1000”實(shí)現(xiàn)的不是算術(shù)運(yùn)算,而是關(guān)系運(yùn)算。實(shí)際上是比較運(yùn)算,將兩個(gè)數(shù)據(jù)進(jìn)行比較,判斷比較的結(jié)果?!癮mount<1000”就是一個(gè)比較式,在高級(jí)語言中稱為關(guān)系表達(dá)式,其中“>”是一個(gè)比較符,稱為關(guān)系運(yùn)算符。C++的關(guān)系運(yùn)算符有:優(yōu)先級(jí)相同(高)①

<②

<=③

>④

>=⑤

==⑥

!=(小于)(小于或等于)(大于)(大于或等于)(等于)(不等于)優(yōu)先級(jí)相同(低)3.6.1

關(guān)系運(yùn)算和關(guān)系表達(dá)式編程資源請(qǐng)關(guān)注:

關(guān)于優(yōu)先次序:①前4種關(guān)系運(yùn)算符(<,<=,>,>=)的優(yōu)先級(jí)別相同,后兩種也相同。前4種高于后兩種。例如,“>”優(yōu)先于“==”。而“>”與“<”優(yōu)先級(jí)相同。②關(guān)系運(yùn)算符的優(yōu)先級(jí)低于算術(shù)運(yùn)算符。③關(guān)系運(yùn)算符的優(yōu)先級(jí)高于賦值運(yùn)算符。例如:c>a+ba>b==ca==b<ca=b>c等效于c>(a+b)等效于(a>b)==c等效于a==(b<c)等效于a=(b>c)用關(guān)系運(yùn)算符將兩個(gè)表達(dá)式連接起來的式子,稱為關(guān)系表達(dá)式。關(guān)系表達(dá)式的一般形式可以表示為編程資源請(qǐng)關(guān)注:

表達(dá)式關(guān)系運(yùn)算符表達(dá)式其中的“表達(dá)式”可以是算術(shù)表達(dá)式或關(guān)系表達(dá)式、邏輯表達(dá)式、賦值表達(dá)式、字符表達(dá)式。例如,下面都是合法的關(guān)系表達(dá)式:a>b,

a+b>b+c,(a==3)>(b==5),

′a′<′b′,

(a>b)>(b<c)關(guān)系表達(dá)式的值是一個(gè)邏輯值,即“真”或“假”。例如,關(guān)系表達(dá)式“5==3”的值為“假”,“5>=0”的值為“真”。在C和C++中都用數(shù)值1代表“真”,用0代表“假”。如果有以下賦值表達(dá)式:d=a>bf=a>b>c則d得到的值為1f得到的值為0編程資源請(qǐng)關(guān)注:

C語言沒有提供邏輯型數(shù)據(jù),關(guān)系表達(dá)式的值(真或假)分別用數(shù)值1和0代表。C++增加了邏輯型數(shù)據(jù)。邏輯型常量只有兩個(gè),即false(假)和true(真)。邏輯型變量要用類型標(biāo)識(shí)符bool來定義,它的值只能是true和false之一。如//定義邏輯變量found和flag,并使flag的初值bool

found,flag=false;為falsefound=true;//將邏輯常量true賦給邏輯變量found由于邏輯變量是用關(guān)鍵字bool來定義的,因此又稱為布爾變量。邏輯型常量又稱為布爾常量。所謂邏輯型,就是布爾型。設(shè)立邏輯類型的目的是為了看程序時(shí)直觀易懂。3.6.2

邏輯常量和邏輯變量編程資源請(qǐng)關(guān)注:

在編譯系統(tǒng)處理邏輯型數(shù)據(jù)時(shí),將false處理為0,將true處理為1。因此,邏輯型數(shù)據(jù)可以與數(shù)值型數(shù)據(jù)進(jìn)行算術(shù)運(yùn)算。如果將一個(gè)非零的整數(shù)賦給邏輯型變量,則按“真”處理,如//賦值后flag的值為trueflag=123;cout<<flag;輸出為數(shù)值1。編程資源請(qǐng)關(guān)注:

有時(shí)只用一個(gè)關(guān)系表達(dá)式還不能正確表示所指定的條件。C++提供3種邏輯運(yùn)算符:&&

邏輯與||

邏輯或!

邏輯非(相當(dāng)于其他語言中的AND)(相當(dāng)于其他語言中的OR)(相當(dāng)于其他語言中的NOT)邏輯運(yùn)算舉例如下:a

&&

b

若a,b為真,則a

&&

b為真。a||b

若a,b之一為真,則a||b為真。!a

若a為真,則!a為假。書中表3.2為邏輯運(yùn)算的“真值表”。3.6.3

邏輯運(yùn)算和邏輯表達(dá)式編程資源請(qǐng)關(guān)注:

(a>b)

&&

(x>y)(a==b)

||

(x==y)(!a)

||

(a>b)可寫成a>b

&&

x>y可寫成a==b

||

x==y可寫成!a

||

a>b將兩個(gè)關(guān)系表達(dá)式用邏輯運(yùn)算符連接起來就成為一個(gè)邏輯表達(dá)式,上面幾個(gè)式子就是邏輯表達(dá)式。邏輯表達(dá)式的一般形式可以表示為編程資源請(qǐng)關(guān)注:

在一個(gè)邏輯表達(dá)式中如果包含多個(gè)邏輯運(yùn)算符,按以下的優(yōu)先次序:!(非)→

&&(與)→

(或),即“!”為三者中最高的。邏輯運(yùn)算符中的“&&”和“||”低于關(guān)系運(yùn)算符,“!”高于算術(shù)運(yùn)算符。例如:編程資源請(qǐng)關(guān)注:

表達(dá)式邏輯運(yùn)算符表達(dá)式邏輯表達(dá)式的值是一個(gè)邏輯量“真”或“假”。前面已說明,在給出邏輯運(yùn)算結(jié)果時(shí),以數(shù)值1代表“真”,以0代表“假”,但在判斷一個(gè)邏輯量是否為“真”時(shí),采取的標(biāo)準(zhǔn)是:如果其值是0就認(rèn)為是“假”,如果其值是非0就認(rèn)為是“真”。例如:若a=4,則!a的值為0。因?yàn)閍的值為非0,被認(rèn)作“真”,對(duì)它進(jìn)行“非”運(yùn)算,得“假”,“假”以0代表。若a=4,b=5,則a&&b的值為1。因?yàn)閍和b均為非0,被認(rèn)為是“真”。a,b值同前,a-b||a+b的值為1。因?yàn)閍-b和a+b的值都為非零值。a,b值同前,!a

||

b的值為1。4

&&

0

||

2

的值為1。在C++中,整型數(shù)據(jù)可以出現(xiàn)在邏輯表達(dá)式中,在進(jìn)行邏輯運(yùn)算時(shí),根據(jù)整型數(shù)據(jù)的值是0或非0,把它作為邏輯量假或真,然后參加邏輯運(yùn)算。通過這幾個(gè)例子可以看出:

邏輯運(yùn)算結(jié)果不是0就是1,不可能是其他數(shù)值。而在邏輯表達(dá)式中作為參加邏輯運(yùn)算的運(yùn)算對(duì)象可以是0(“假”)或任何非0的數(shù)值(按“真”對(duì)待)。如果在一個(gè)表達(dá)式中的不同位置上出現(xiàn)數(shù)值,應(yīng)區(qū)分哪些是作為數(shù)值運(yùn)算或關(guān)系運(yùn)算的對(duì)象,哪些作為邏輯運(yùn)算的對(duì)象。實(shí)際上,邏輯運(yùn)算符兩側(cè)的表達(dá)式不但可以是關(guān)系表達(dá)式或整數(shù)(0和非0),也可以是任何類型的數(shù)

據(jù),如字符型、浮點(diǎn)型或指針型等。系統(tǒng)最終以0和非0來判定它們屬于“真”或“假”。例如′c

&&

′d′的值為1。編程資源請(qǐng)關(guān)注:

可以將表3.2改寫成書中表3.3形式。熟練掌握C++的關(guān)系運(yùn)算符和邏輯運(yùn)算符后,可以巧妙地用一個(gè)邏輯表達(dá)式來表示一個(gè)復(fù)雜的條件。例如,要判別某一年(year)是否為閏年。閏年的條件是符合下面兩者之一:①能被4整除,但不能被

100整除。②能被100整除,又能被400整除。例如2004、2000年是閏年,2005、2100年不是閏年??梢杂靡粋€(gè)邏輯表達(dá)式來表示:(year

%

4

==

0

&&

year

%

100

!=

0)

||

year

%

400

==

0當(dāng)給定year為某一整數(shù)值時(shí),如果上述表達(dá)式值為真(1),則year為閏年;否則year為非閏年??梢约右粋€(gè)“!”用來判別非閏年:!((year

%

4

==

0

&&

year

%

100

!=

0)

||

year

%

400

==

0)編程資源請(qǐng)關(guān)注:

若表達(dá)式值為真(1),year為非閏年。也可以用下面的邏輯表達(dá)式判別非閏年:(year

%

4

!=

0)

||

(year

%

100

==

0

&&

year

%

400

!=0)若表達(dá)式值為真,year為非閏年。請(qǐng)注意表達(dá)式中右面的括號(hào)內(nèi)的不同運(yùn)算符(%,!,&&,==)的運(yùn)算優(yōu)先次序。編程資源請(qǐng)關(guān)注:

if語句是用來判定所給定的條件是否滿足,根據(jù)判

定的結(jié)果(真或假)決定執(zhí)行給出的兩種操作之一。3.7

選擇結(jié)構(gòu)和if語句編程資源請(qǐng)關(guān)注:

if(表達(dá)式)語句例如:if(x>y)cout<<x<<endl;這種if語句的執(zhí)行過程見圖3.5(a)。if(表達(dá)式)語句1else語句2例如:if

(x>y)cout<<x;else

cout<<y;見圖3.5(b)。3.7.1

if語句的3種形式編程資源請(qǐng)關(guān)注:

圖3.5編程資源請(qǐng)關(guān)注:

3.

if(表達(dá)式1)

語句1else

if(表達(dá)式2)

語句2else

if(表達(dá)式3)

語句3…else

if(表達(dá)式m)

語句melse

語句n流程圖見圖3.6。例如:if (number>500)

cost=0.15;else

if(number>300)

cost=0.10;else

if(number>100)

cost=0.075;else

if(number>50)

cost=0.05;else

cost=0;編程資源請(qǐng)關(guān)注:

圖3.6編程資源請(qǐng)關(guān)注:

說明:(1)從圖3.5和圖3.6可以看到:3種形式的if語句都是由一個(gè)

進(jìn)來,經(jīng)過對(duì)“表達(dá)式”的判斷,分別執(zhí)行相應(yīng)的語句,最后歸到一個(gè)共同的出口。這種形式的程序結(jié)構(gòu)稱為選擇結(jié)構(gòu)。在C++中if語句是實(shí)現(xiàn)選擇結(jié)構(gòu)主要的語句。3種形式的if語句中在if后面都有一個(gè)用括號(hào)括起來的表達(dá)式,它是程序編寫者要求程序判斷的“條件”,一般是邏輯表達(dá)式或關(guān)系表達(dá)式。第2、第3種形式的if語句中,在每個(gè)else前面有一分號(hào),整個(gè)語句結(jié)束處有一分號(hào)。在if和else后面可以只含一個(gè)內(nèi)嵌的操作語句(如上例),也可以有多個(gè)操作語句,此時(shí)用花括號(hào)“{}”將幾個(gè)語句括起來成為一個(gè)復(fù)合語句。編程資源請(qǐng)關(guān)注:

例3.6

求三角形的面積。#include

<iostream>//使用數(shù)學(xué)函數(shù)時(shí)要包含頭文件cmath//使用I/O流控制符要包含頭文件iomanip#include

<cmath>#include

<iomanip>using

namespace

std;int

main(

){double

a,b,c;cout<<″pleaseenter

a,b,c:″;cin>>a>>b>>c;if

(a+b>c

&&

b+c>a

&&

c+a>b)//復(fù)合語句開始//在復(fù)合語句內(nèi)定義變量{double

s,area;s=(a+b+c)/2;area=sqrt(s*(s-a)*(s-b)*(s-c));

cout<<setiosflags(ios∷fixed)<<setprecision(4);

//指定輸出的數(shù)包含4位小數(shù)cout<<″area=″<<area<<endl;

//在復(fù)合語句內(nèi)輸出局部變量的值}

//復(fù)合語句結(jié)束else

cout<<″it

is

not

a

trilateral!″<<endl;return

0;}編程資源請(qǐng)關(guān)注:

運(yùn)行情況如下:please

entera,b,c:2.45

3.67

4.89↙area=4.3565變量s和area只在復(fù)合語句內(nèi)用得到,因此在復(fù)合語句內(nèi)定義,它的作用范圍為從定義變量開始到復(fù)合語句結(jié)束。如果在復(fù)合語句外使用s和area,則定義。,可以會(huì)在編譯時(shí)出錯(cuò),系統(tǒng)認(rèn)為這兩個(gè)變量將某些變量局限在某一范圍內(nèi),與外界避免在其他地方被誤調(diào)用。編程資源請(qǐng)關(guān)注:

在if語句中又包含一個(gè)或多個(gè)if語句稱為if語句的嵌套。一般形式如下:if(

)if()語句1內(nèi)嵌ifelse

語句2elseif()語句3else

語句4內(nèi)嵌if應(yīng)當(dāng)注意if與else的配對(duì)關(guān)系。else總是與它上面最近的、且未配對(duì)的if配對(duì)。假如寫成3.7.2

if語句的嵌套編程資源請(qǐng)關(guān)注:

if(

)if()語句1elseif()語句2else

語句3內(nèi)嵌if編程序者把第一個(gè)else寫在與第一個(gè)if(外層if)同一列上,希望else與第一個(gè)if對(duì)應(yīng),但實(shí)際上else是與第二個(gè)if配對(duì),因?yàn)樗鼈兿嗑嘧罱?,而且第二個(gè)if并未與任何else配對(duì)。為了避免誤用,最好使每一層內(nèi)嵌的if語句都包含else子句(如本節(jié)開頭列出的形式),這樣if的數(shù)目和else的數(shù)目相同,從內(nèi)層到外層一一對(duì)應(yīng),不致出錯(cuò)。編程資源請(qǐng)關(guān)注:

如果if與else的數(shù)目不一樣,為實(shí)現(xiàn)程序設(shè)計(jì)者的企圖,可以加花括號(hào)來確定配對(duì)關(guān)系。例如:if(

){if()語句1}else

語句2//這個(gè)語句是上一行if語句的內(nèi)嵌if//本行與第一個(gè)if配對(duì)這時(shí){}限定了內(nèi)嵌if語句的范圍,{}外的else不會(huì)與{}內(nèi)的if配對(duì)。關(guān)系清楚,不易出錯(cuò)。編程資源請(qǐng)關(guān)注:

若在if語句中,當(dāng)被判別的表達(dá)式的值為“真”或“假”時(shí),都執(zhí)行一個(gè)賦值語句且給同一個(gè)變量賦值時(shí),可以用簡(jiǎn)單的條件運(yùn)算符來處理。例如,若有以下

if語句:if

(a>b)

max=a;else

max=b;可以用條件運(yùn)算符(?:)來處理:max=(a>b)?a:b;其中“(a>b)?a:b”是一個(gè)“條件表達(dá)式”。它是這樣執(zhí)行的:如果(a>b)條件為真,則條件表達(dá)式的值就取“?”后面的值,即條件表達(dá)式的值為a,否則條件表達(dá)式的值為“:”后面的值,即b。3.8

條件運(yùn)算符和條件表達(dá)式編程資源請(qǐng)關(guān)注:

條件運(yùn)算符要求有3個(gè)操作對(duì)象,稱三目(元)運(yùn)算符,它是C++中惟一的一個(gè)三目運(yùn)算符。條件表達(dá)式的一般形式為表達(dá)式1?表達(dá)式2

∶表達(dá)式3條件運(yùn)算符的執(zhí)行順序是:先求解表達(dá)式1,若為非0(真)則求解表達(dá)式2,此時(shí)表達(dá)式2的值就作為整個(gè)條件表達(dá)式的值。若表達(dá)式1的值為0(假),則求解表達(dá)式3,表達(dá)式3的值就是整個(gè)條件表達(dá)式的值?!癿ax=(a>b)?a:b”的執(zhí)行結(jié)果是將條件表達(dá)式的值賦給max。也就是將a和b二者中的大者賦給max。條件運(yùn)算符優(yōu)先于賦值運(yùn)算符,因此上面賦值表達(dá)式的求解過程是先求解條件表達(dá)式,再將它的值賦給max。編程資源請(qǐng)關(guān)注:

條件表達(dá)式中,表達(dá)式1的類型可以與表達(dá)式2和表達(dá)式3的類型不同。如x?

′a′∶′b′如果已定義x為整型變量,若x=0,則條件表達(dá)式的值為字符′b′的ASCII碼。表達(dá)式2和表達(dá)式3的類型也可以不同,此時(shí)條件表達(dá)式的值的類型為二者中較高的類型。

條件表達(dá)式x>y?1:1.5,如果x≤y,則條件表達(dá)式的值為1.5,若x>y,值應(yīng)為

1,由于C++把1.5按雙精度數(shù)處理,雙精度的類型比整型高,因此,將1轉(zhuǎn)換成雙精度數(shù),以此作為表達(dá)式的值。編程資源請(qǐng)關(guān)注:

例3.7輸入一個(gè)字符,判別它是否為大寫字母,如果是,將它轉(zhuǎn)換成小寫字母;如果不是,不轉(zhuǎn)換。然后輸出最后得到的字符。#include

<iostream>using

namespace

std;int

main(

){char

ch;cin>>ch;//判別ch是否大寫字母,是ch=(ch>=′A′

&&

ch<=′Z′)?(ch+32):ch;則轉(zhuǎn)換cout<<ch<<endl;return

0;}編程資源請(qǐng)關(guān)注:

switch語句是多分支選擇語句,用來實(shí)現(xiàn)多分支選擇結(jié)構(gòu)。它的一般形式如下:switch(表達(dá)式){case

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

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

常量表達(dá)式n:語句ndefault:語句n+1}3.9

多分支選擇結(jié)構(gòu)和switch

語句編程資源請(qǐng)關(guān)注:

switch(grade){case

′A′:

cout<<″85~100\n″;case

′B′:

cout<<″70~84\n″;case

′C′:

cout<<″60~69\n″;case

′D′:

cout<<″<60\n″;default

cout<<″e(cuò)rror\n″;}說明:(1)

switch后面括號(hào)內(nèi)的“表達(dá)式”,允許為任何類型。(2)當(dāng)switch表達(dá)式的值與某一個(gè)case子句中的常量

表達(dá)式的值相匹配時(shí),就執(zhí)行此case子句中的內(nèi)嵌

語句,若所有的case子句中的常量表達(dá)式的值都不

能與switch表達(dá)式的值匹配,就執(zhí)行default子句的

內(nèi)嵌語句。編程資源請(qǐng)關(guān)注:

例如,要求按照考試成績(jī)的等級(jí)打印出百分制分?jǐn)?shù)段,可以用switch語句實(shí)現(xiàn):(3)每一個(gè)case表達(dá)式的值必須互不相同,否則就會(huì)出現(xiàn)互相

的現(xiàn)象(對(duì)表達(dá)式的同一個(gè)值,有兩種或多種執(zhí)行方案)。各個(gè)case和default的出現(xiàn)次序不影響執(zhí)行結(jié)果。例如,可以先出現(xiàn)“default:…”,再出現(xiàn)“case′D′:…”,然后是“case

′A′:…”。執(zhí)行完一個(gè)case子句后,流程控制轉(zhuǎn)移到下一個(gè)case子句繼續(xù)執(zhí)行。“case常量表達(dá)式”只是起語句標(biāo)號(hào)作用,并不是在該處進(jìn)行條件判斷。在執(zhí)行

switch語句時(shí),根據(jù)switch表達(dá)式的值找到與之匹配的case子句,就從此case子句開始執(zhí)行下去,不再進(jìn)行判斷。例如,上面的例子中,若grade的值等于′A′,則將連續(xù)輸出:編程資源請(qǐng)關(guān)注:

85~10070~8460~69<60error因此,應(yīng)該在執(zhí)行一個(gè)case子句后,使流程跳出switch結(jié)構(gòu),即終止switch語句的執(zhí)行??梢杂靡粋€(gè)break語句來達(dá)到此目的。將上面的switch結(jié)構(gòu)改寫如下:switch(grade){case

′A′:

cout<<″85~100\n″;break;case

′B′:

cout<<″70~84\n″;break;case

′C′:

cout<<″60~69\n″;break;case

′D′:

cout<<″<60\n″;break;default

cout<<″e(cuò)rror\n″;break;}編程資源請(qǐng)關(guān)注:

最后一個(gè)子句(default)可以不加break語句。如果grade的值為′B′,則只輸出“70~84”。流程圖見圖

3.7。圖3.7編程資源請(qǐng)關(guān)注:

在case子句中雖然包含一個(gè)以上執(zhí)行語句,但可以不必用花括號(hào)括起來,會(huì)自動(dòng)順序執(zhí)行本case子句中所有的執(zhí)行語句。(6)

多個(gè)case可以共用一組執(zhí)行語句,如...case

′A′:case

′B′:case

′C′:

cout<<″>60\n″;break;...當(dāng)grade的值為′A′、′B′或′C′時(shí)都執(zhí)行同一組語句。編程資源請(qǐng)關(guān)注:

例3.8

編寫程序,判斷某一年是否為閏年。#include

<iostream>using

namespace

std;int

main(

){

int

year;bool

leap;cout<<″please

enter

year:″;

//輸出提示cin>>year;if

(year%4==0){if(year%100==0){if

(year%400==0)leap=true;else

leap=false;}//輸入年份//年份能被4整除//年份能被4整除又能被100整除//年份能被4整除又能被400整除//閏年,令leap=true(真)//非閏年,令leap=false(假)elseleap=true;}//年份能被4整除但不能被100整除肯定是閏年//是閏年,令leap=true3.10

編寫選擇結(jié)構(gòu)的程序編程資源請(qǐng)關(guān)注:

//年份不能被4整除肯定不是閏年//若為非閏年,令leap=falseelseleap=false;if

(leap)cout<<year<<″

is

″;else//若leap為真,就輸出年份和“是”//若leap為真,就輸出年份和“不是”//輸出“閏年”cout<<year<<″

is

not

″;cout<<″

a

leap

year.″<<endl;return

0;}運(yùn)行情況如下:①

2005↙2005

is

not

a

leap

year.②

1900↙1900

is

npt

a

leap

year.編程資源請(qǐng)關(guān)注:

也可以將程序中第8~16行改寫成以下的if語句:if(year%4!=0)leap=false;else

if(year%100!=0)leap=true;else

if(year%400!=0)leap=false;elseleap=true;也可以用一個(gè)邏輯表達(dá)式包含所有的閏年條件,將上述if語句用下面的if語句代替:if((year%4

==

0

&&

year%100

!=0)

||

(year%400

==

0))

leap=true;else

leap=false;編程資源請(qǐng)關(guān)注:

例3.9

公司對(duì)用戶計(jì)算運(yùn)費(fèi)。路程(s)越遠(yuǎn),每公里運(yùn)費(fèi)越低。標(biāo)準(zhǔn)如下:s<250km沒有折扣250≤s<5002%折扣500≤s<10005%折扣1000≤s<20008%折扣2000≤s<300010%折扣3000≤s15%折扣設(shè)每公里每噸貨物的基本運(yùn)費(fèi)為p(price的縮寫),貨物重為w(wright的縮寫),距離為s,折扣為d(discount的縮寫),則總運(yùn)費(fèi)f(freight的縮寫)的計(jì)算公式為f=p

*

w

*

s

*

(1

-

d)編程資源請(qǐng)關(guān)注:

圖3.8編程資源請(qǐng)關(guān)注:

據(jù)此寫出程序如下:#include

<iostream>using

namespace

std;int

main(

){int

c,s;float

p,w,d,f;cout<<″please

enter

p,w,s:″;cin>>p>>w>>s;if(s>=3000)

c=12;else

c=s/250;switch

(c){

case

0:d=0;break;case

1:d=2;break;case

2:case

3:d=5;break;case

4:編程資源請(qǐng)關(guān)注:

case

5:case

6:case

7:d=8;break;case

8:case

9:case

10:case

11:d=10;break;case

12:d=15;break;}f=p*w*s*(1-d/100.0);cout<<″freight=″<<f<<endl;return

0;}運(yùn)行情況如下:please

enter

p,w,s:100

20

300↙freight=588000編程資源請(qǐng)關(guān)注:

在人們所要處理的問題中常常遇到需要反復(fù)執(zhí)行某一操作的情況。這就需要用到循環(huán)控制。許多應(yīng)用程序都包含循環(huán)。順序結(jié)構(gòu)、選擇結(jié)構(gòu)和循環(huán)結(jié)構(gòu)是結(jié)構(gòu)化程序設(shè)計(jì)的3種基本結(jié)構(gòu),是各種復(fù)雜程序的基本構(gòu)造單元。因此程序設(shè)計(jì)者必須熟練掌握選擇結(jié)構(gòu)和循環(huán)結(jié)構(gòu)的概念及使用方法。3.11

循環(huán)結(jié)構(gòu)和循環(huán)語句編程資源請(qǐng)關(guān)注:

while語句的一般形式如下:

while(表達(dá)式)語句其作用是:

當(dāng)指定的條件為真(表達(dá)式為非0)時(shí),執(zhí)行while語句中的內(nèi)嵌語句。其流程圖見圖3.9。其特點(diǎn)是:先判斷表達(dá)式,后執(zhí)行語句。while循環(huán)稱為當(dāng)型循環(huán)。圖3.93.11.1

用while語句構(gòu)成循環(huán)編程資源請(qǐng)關(guān)注:

例3.10

求1+2+3+…+100。用流程圖表示算法,見圖3.10。根據(jù)流程圖寫出程序:#include

<iostream>using

namespace

std;int

main(

){int

i=1,sum=0;while

(i<=100){

sum=sum+i;i++;}cout<<″sum=″<<sum<<endl;}運(yùn)行結(jié)果為sum=5050編程資源請(qǐng)關(guān)注:

圖3.10需要注意:循環(huán)體如果包含一個(gè)以上的語句,應(yīng)該用花括號(hào)括起來,以復(fù)合語句形式出現(xiàn)。如果不加花括號(hào),則while語句的范圍只到while后面第一個(gè)分號(hào)處。在循環(huán)體中應(yīng)有使循環(huán)趨向于結(jié)束的語句。編程資源請(qǐng)關(guān)注:

do-while語句的特點(diǎn)是先執(zhí)行循環(huán)體,然后判斷循環(huán)條件是否成立。其一般形式為do語句while(表達(dá)式);它是這樣執(zhí)行的:先執(zhí)行一次指定的語句(即循環(huán)體),然后判別表達(dá)式,當(dāng)表達(dá)式的值為非零(“真”)時(shí),返回重新執(zhí)行循環(huán)體語句,如此反復(fù),直到表達(dá)式的值等于0為止,此時(shí)循環(huán)結(jié)束。可以用圖

3.11表示其流程。3.11.2

用do-while語句構(gòu)成循環(huán)編程資源請(qǐng)關(guān)注:

圖3.11圖3.12編程資源請(qǐng)關(guān)注:

例3.11用do-while語句求1+2+3+…+100。先畫出流程圖,見圖3.12??删帉懗鱿旅娴某绦颍?include

<iostream>using

namespace

std;int

main(

){int

i=1,sum=0;do{

sum=sum+i;i++;}while

(i<=100);cout<<″sum=″<<sum<<endl;return

0;}編程資源請(qǐng)關(guān)注:

圖3.13編程資源請(qǐng)關(guān)注:

運(yùn)行結(jié)果與例3.10相同。可以看到:對(duì)同一個(gè)問題可以用while語句處理,也可以用do

while語句處理。do

while語句結(jié)構(gòu)可以轉(zhuǎn)換成while結(jié)構(gòu)。圖3.11可以改畫成圖3.13的形式,二者完全等價(jià)。而圖3.13中虛線框部分就是一個(gè)while結(jié)構(gòu)。C++中的for語句使用最為廣泛和靈活,不僅可以用于循環(huán)次數(shù)已經(jīng)確定的情況,而且可以用于循環(huán)次數(shù)不確定而只給出循環(huán)結(jié)束條件的情況,它完全可以代替while語句。for語句的一般格式為for(表達(dá)式1;表達(dá)式2;表達(dá)式3)語句它的執(zhí)行過程如下:先求解表達(dá)式1。求解表達(dá)式2,若其值為真(值為非0),則執(zhí)行for語句中指定的內(nèi)嵌語句,然后執(zhí)行下面第(3)步。若為假(值為0),則結(jié)束循環(huán),轉(zhuǎn)到第(5)步。3.11.3

用for語句構(gòu)成循環(huán)編程資源請(qǐng)關(guān)注:

求解表達(dá)式3。轉(zhuǎn)回上面第(2)步驟繼續(xù)執(zhí)行。(5)循環(huán)結(jié)束,執(zhí)行for語句下面的一個(gè)語句??梢杂脠D3.14來表示for語句的執(zhí)行過程。圖3.14編程資源請(qǐng)關(guān)注:

for語句最簡(jiǎn)單的形式也是最容易理解的格式如下:

for(循環(huán)變量賦初值;循環(huán)條件;循環(huán)變量增值)語句例如for(i=1;i<=100;i++)

sum=sum+i;它的執(zhí)行過程與圖3.10完全一樣。它相當(dāng)于以下語句:i=1;while(i<=100){sum=sum+i;i++;}顯然,用for語句簡(jiǎn)單、方便。for語句的使用有許多技巧,如果熟練地掌握和運(yùn)用

for語句,可以使程序精煉簡(jiǎn)潔。編程資源請(qǐng)關(guān)注:

編程資源請(qǐng)關(guān)注:

說明:for語句的一般格式中的“表達(dá)式1”可以省略,此時(shí)應(yīng)在for語句之前給循環(huán)變量賦初值。如果表達(dá)式2省略,即不判斷循環(huán)條件,循環(huán)無終止地進(jìn)行下去。也就是認(rèn)為表達(dá)式2始終為真。表達(dá)式3也可以省略,但此時(shí)程序設(shè)計(jì)者應(yīng)另外設(shè)法保證循環(huán)能正常結(jié)束。可以省略表達(dá)式1和表達(dá)式3,只有表達(dá)式2,即只給循環(huán)條件。3個(gè)表達(dá)式都可省略。表達(dá)式1可以是設(shè)置循環(huán)變量初值的賦值表達(dá)式,也可以是與循環(huán)變量無關(guān)的其他表達(dá)式。(7)表達(dá)式一般是關(guān)系表達(dá)式(如i<=100)或邏輯表達(dá)式(如a<b&&x<y),但也可以是數(shù)值表達(dá)式或字符表達(dá)式,只要其值為非零,就執(zhí)行循環(huán)體。C++中的for語句比其他語言中的循環(huán)語句功能強(qiáng)得多??梢园蜒h(huán)體和一些與循環(huán)控制無關(guān)的操作也作為表達(dá)式1或表達(dá)式3出現(xiàn),這樣程序可以短小簡(jiǎn)潔。但過分地利用這一特點(diǎn)會(huì)使for語句顯得雜亂,可讀性降低,建議

與循環(huán)控制無關(guān)的內(nèi)容放到for語句中。編程資源請(qǐng)關(guān)注:

3種循環(huán)都可以用來處理同一問題,一般情況下它們可以互相代替。while和do-while循環(huán),是在while后面指定循環(huán)條件的,在循環(huán)體中應(yīng)包含使循環(huán)趨于結(jié)束的語句(如i++,或i=i+1等)。for循環(huán)可以在表達(dá)式3中包含使循環(huán)趨于結(jié)束的操作,甚至可以將循環(huán)體中的操作全部放到表達(dá)式

3中。因此for語句的功能更強(qiáng),凡用while循環(huán)能完成的,用for循環(huán)都能實(shí)現(xiàn)。用while和do-while循環(huán)時(shí),循環(huán)變量初始化的操作應(yīng)在while和do-while語句之前完成。而for語句可以在表達(dá)式1中實(shí)現(xiàn)循環(huán)變量的初始化。3.11.4

幾種循環(huán)的比較編程資源請(qǐng)關(guān)注:

一個(gè)循環(huán)體內(nèi)又包含另一個(gè)完整的循環(huán)結(jié)構(gòu),稱為循環(huán)的嵌套。內(nèi)嵌的循環(huán)中還可以嵌套循環(huán),這就是多層循環(huán)。3種循環(huán)(while循環(huán)、do

while循環(huán)和for循環(huán))可以互相嵌套。例如,下面幾種都是合法的形式:(1)while(

){┆while(

){…}}3.12

循環(huán)的嵌套編程資源請(qǐng)關(guān)注:

(2)do{┆do{…}while(

);}while(

);(3)for(;;){┆for(;;){…}}編程資源請(qǐng)關(guān)注:

(4)while(

){┆do{…}while(

);┆}(5)for(;;

){┆while(

){…}┆}編程資源請(qǐng)關(guān)注:

(6)do{┆for

(;;){…}}while(

);編程資源請(qǐng)關(guān)注:

在3.9節(jié)中已經(jīng)介紹過用break語句可以使流程跳出

switch結(jié)構(gòu),繼續(xù)執(zhí)行switch語句下面的一個(gè)語句。實(shí)際上,break語句還可以用于循環(huán)體內(nèi)。break語句的一般格式為break;其作用為使流程從循環(huán)體內(nèi)跳出循環(huán)體,即提前結(jié)束循環(huán),接著執(zhí)行循環(huán)體下面的語句。break語句只能用于循環(huán)語句和switch語句內(nèi),不能單獨(dú)使用或用于其他語句中。3.13

break語句和continue語句編程資源請(qǐng)關(guān)注:

continue語句的一般格式為continue;其作用為結(jié)束本次循環(huán),即跳過循環(huán)體中下面尚未

執(zhí)行的語句,接著進(jìn)行下一次是否執(zhí)行循環(huán)的判定。

continue語句和break語句的區(qū)別是:continue語句

只結(jié)束本次循環(huán),而不是終止整個(gè)循環(huán)的執(zhí)行。而break語句則是結(jié)束整個(gè)循環(huán)過程,不再判斷執(zhí)行循環(huán)的條件是否成立。如果有以下兩個(gè)循環(huán)結(jié)構(gòu):(1)while(表達(dá)式1){┆

if(表達(dá)式2)break

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論