版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 枇杷水彩課程設(shè)計(jì)
- 未來項(xiàng)目課程設(shè)計(jì)
- 桌布鋪設(shè)課程設(shè)計(jì)
- 文化地圖制作課程設(shè)計(jì)
- 汽車設(shè)計(jì)課程設(shè)計(jì)轉(zhuǎn)向器
- 內(nèi)部排序比較課程設(shè)計(jì)
- 淘寶課程設(shè)計(jì)總結(jié)
- 壓力機(jī)機(jī)構(gòu)課程設(shè)計(jì)
- 2024版股權(quán)重組與行業(yè)分析報(bào)告合同3篇
- 2024年協(xié)議離婚程序中個(gè)人名譽(yù)權(quán)及隱私保護(hù)合同3篇
- 玉溪大紅山鐵礦二期北采區(qū)采礦施工組織設(shè)計(jì)
- 必刷題2024六年級(jí)英語上冊(cè)語法規(guī)則專項(xiàng)專題訓(xùn)練(含答案)
- 2024新教科版四年級(jí)上冊(cè)科學(xué)知識(shí)點(diǎn)總結(jié)精簡(jiǎn)版
- 人工智能在礦產(chǎn)勘探中的應(yīng)用分析篇
- 中西文化鑒賞智慧樹知到答案2024年鄭州大學(xué)
- 2024國開大學(xué)《經(jīng)濟(jì)學(xué)基礎(chǔ)》形考任務(wù)2答案
- 2024山東省招聘社區(qū)工作者試題及答案
- 14《答謝中書書》對(duì)比閱讀-2024-2025中考語文文言文閱讀專項(xiàng)訓(xùn)練(含答案)
- DL∕T 5494-2014 電力工程場(chǎng)地地震安全性評(píng)價(jià)規(guī)程
- 顱腦外傷病人的急救和護(hù)理
- 大型儲(chǔ)罐制作安裝施工方案
評(píng)論
0/150
提交評(píng)論