譚浩強(第四版)C++程序設(shè)計課件_第1頁
譚浩強(第四版)C++程序設(shè)計課件_第2頁
譚浩強(第四版)C++程序設(shè)計課件_第3頁
譚浩強(第四版)C++程序設(shè)計課件_第4頁
譚浩強(第四版)C++程序設(shè)計課件_第5頁
已閱讀5頁,還剩812頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

C++程序設(shè)計第3章程序設(shè)計初步第4章函數(shù)與預(yù)處理第5章數(shù)組第6章指針第7章自定義數(shù)據(jù)類型第2篇

面向過程的程序設(shè)計第3章程序設(shè)計初步3.1面向過程的程序設(shè)計和算法3.2C++程序和語句3.3賦值語句3.4C++的輸入與輸出3.5編寫順序結(jié)構(gòu)的程序3.6關(guān)系運算和邏輯運算3.7選擇結(jié)構(gòu)和if語句3.8條件運算符和條件表達式3.9多分支選擇結(jié)構(gòu)和switch語句3.10編寫選擇結(jié)構(gòu)的程序3.11循環(huán)結(jié)構(gòu)和循環(huán)語句3.12循環(huán)的嵌套3.13break語句和continue語句3.14編寫循環(huán)結(jié)構(gòu)的程序在面向過程的程序設(shè)計中,程序設(shè)計者必須指定計算機執(zhí)行的具體步驟,程序設(shè)計者不僅要考慮程序要“做什么”,還要解決“怎么做”的問題,根據(jù)程序要“做什么”的要求,寫出一個個語句,安排好它們的執(zhí)行順序。怎樣設(shè)計這些步驟,怎樣保證它的正確性和具有較高的效率,這就是算法需要解決的問題。3.1面向過程的程序設(shè)計和算法一個面向過程的程序應(yīng)包括以下兩方面內(nèi)容:(1)對數(shù)據(jù)的描述。在程序中要指定數(shù)據(jù)的類型和數(shù)據(jù)的組織形式,即數(shù)據(jù)結(jié)構(gòu)(datastructure)。(2)對操作的描述。即操作步驟,也就是算法(algorithm)。對于面向過程的程序,可以用下面的公式表示:程序=算法+數(shù)據(jù)結(jié)構(gòu)作為程序設(shè)計人員,必須認真考慮和設(shè)計數(shù)據(jù)結(jié)構(gòu)和操作步驟(即算法)。算法是處理問題的一系列的步驟。算法必須具體地指出在執(zhí)行時每一步應(yīng)當怎樣做。3.1.1算法的概念不要認為只有“計算”的問題才有算法。廣義地說,為解決一個問題而采取的方法和步驟,就稱為“算法”。計算機算法可分為兩大類別:數(shù)值算法和非數(shù)值算法。數(shù)值算法的目的是求數(shù)值解。非數(shù)值算法包括的面十分廣泛,最常見的是用于事務(wù)管理領(lǐng)域。目前,計算機在非數(shù)值方面的應(yīng)用遠遠超過了在數(shù)值方面的應(yīng)用。C++既支持面向過程的程序設(shè)計,又支持面向?qū)ο蟮某绦蛟O(shè)計。無論面向過程的程序設(shè)計還是面向?qū)ο蟮某绦蛟O(shè)計,都離不開算法設(shè)計。1.自然語言用中文或英文等自然語言描述算法。但容易產(chǎn)生歧義性,在程序設(shè)計中一般不用自然語言表示算法。2.流程圖

可以用傳統(tǒng)的流程圖或結(jié)構(gòu)化流程圖。用圖的形式表示算法,比較形象直觀,但修改算法時顯得不大方便。3.偽代碼(pseudocode)

偽代碼是用介于自然語言和計算機語言之間的文字和符號來描述算法。如3.1.2算法的表示ifxispositivethenprintxelseprint-x用偽代碼寫算法并無固定的、嚴格的語法規(guī)則,只需把意思表達清楚,并且書寫的格式要寫成清晰易讀的形式。它不用圖形符號,因此書寫方便、格式緊湊,容易修改,便于向計算機語言算法(即程序)過渡。4.用計算機語言表示算法用一種計算機語言去描述算法,這就是計算機程序。由第1章已知,一個程序包含一個或多個程序單位(每個程序單位構(gòu)成一個程序文件)。每一個程序單位由以下幾個部分組成:(1)預(yù)處理命令。如#include命令和#define命令。(2)聲明部分。例如對數(shù)據(jù)類型和函數(shù)的聲明,以及對變量的定義。(3)函數(shù)。包括函數(shù)首部和函數(shù)體,在函數(shù)體中可以包含若干聲明語句和執(zhí)行語句。如下面是一個完整的C++程序:3.2C++程序和語句#include<iostream>//預(yù)處理命令usingnamespacestd;//在函數(shù)之外的聲明部分inta=3;//在函數(shù)之外的聲明部分intmain()//函數(shù)首部{floatb;//函數(shù)內(nèi)的聲明部分b=4.5;//執(zhí)行語句

cout<<a<<b;//執(zhí)行語句

return0;//執(zhí)行語句}如果一個變量在函數(shù)之外進行聲明,此變量是全局變量,它的有效范圍是從該行開始到本程序單位結(jié)束。如果一個變量在函數(shù)內(nèi)聲明,此變量是局部變量,它的有效范圍是從該行開始到本函數(shù)結(jié)束。C++程序結(jié)構(gòu)可以用圖3.1表示。圖3.1程序應(yīng)該包括數(shù)據(jù)描述(由聲明語句來實現(xiàn))和數(shù)據(jù)操作(由執(zhí)行語句來實現(xiàn))。數(shù)據(jù)描述主要包括數(shù)據(jù)類型的聲明、函數(shù)和變量的定義、變量的初始化等。數(shù)據(jù)操作的任務(wù)是對已提供的數(shù)據(jù)進行加工。C++程序中最小的獨立單位是語句(statement)。它相當于一篇文章中的一個句子。句子是用句號結(jié)束的。語句一般是用分號結(jié)束的(復(fù)合語句是以右花括號結(jié)束的)。C++語句可以分為以下4種:1.聲明語句如inta,b;在C語言中,只有產(chǎn)生實際操作的才稱為語句,對變量的定義不作為語句,而且要求對變量的定義必須出現(xiàn)在本塊中所有程序語句之前。因此C程序員已經(jīng)養(yǎng)成了一個習慣:在函數(shù)或塊的開頭位置定義全部變量。在C++中,對變量(以及其他對象)的定義被認為是一條語句,并且可以出現(xiàn)在函數(shù)中的任何行,即可以放在其他程序語句可以出現(xiàn)的地方,也可以放在函數(shù)之外。這樣更加靈活,可以很方便地實現(xiàn)變量的局部化(變量的作用范圍從聲明語句開始到本函數(shù)或本塊結(jié)束)。2.執(zhí)行語句通知計算機完成一定的操作。執(zhí)行語句包括:(1)控制語句,完成一定的控制功能。C++有9種控制語句,即

①if()~else~(條件語句)②for()~(循環(huán)語句)③while()~(循環(huán)語句)④do~while()(循環(huán)語句)⑤continue(結(jié)束本次循環(huán)語句)⑥break(中止執(zhí)行switch或循環(huán)語句)⑦switch(多分支選擇語句)⑧goto(轉(zhuǎn)向語句)⑨return(從函數(shù)返回語句)(2)函數(shù)和流對象調(diào)用語句。函數(shù)調(diào)用語句由一次函數(shù)調(diào)用加一個分號構(gòu)成一個語句,例如sort(x,y,z);//假設(shè)已定義了sort函數(shù),它有3個參數(shù)cout<<x<<endl;//流對象調(diào)用語句(3)表達式語句。由一個表達式加一個分號構(gòu)成一個語句。最典型的是:由賦值表達式構(gòu)成一個賦值語句。i=i+1//是一個賦值表達式i=i+1;//是一個賦值語句任何一個表達式的最后加一個分號都可以成為一個語句。一個語句必須在最后出現(xiàn)分號。表達式能構(gòu)成語句是C和C++語言的一個重要特色。C++程序中大多數(shù)語句是表達式語句(包括函數(shù)調(diào)用語句)。3.空語句下面是一個空語句:;即只有一個分號的語句,它什么也不做。有時用來做被轉(zhuǎn)向點,或循環(huán)語句中的循環(huán)體。4.復(fù)合語句可以用{}把一些語句括起來成為復(fù)合語句。如下面是一個復(fù)合語句。{z=x+y;if(z>100)z=z-100;cout<<z;}注意:復(fù)合語句中最后一個語句中最后的分號不能省略。在本章中將介紹幾種順序執(zhí)行的語句,在執(zhí)行這些語句的過程中不會發(fā)生流程的控制轉(zhuǎn)移。前面已介紹,賦值語句是由賦值表達式加上一個分號構(gòu)成。(1)C++的賦值語句具有其他高級語言的賦值語句的功能。但不同的是:C++中的賦值號“=”是一個運算符,可以寫成a=b=c=d;而在其他大多數(shù)語言中賦值號不是運算符,上面的寫法是不合法的。3.3賦值語句(2)關(guān)于賦值表達式與賦值語句的概念。在C++中,賦值表達式可以包括在其他表達式之中,例如if((a=b)>0)cout<<″a>0″<<endl;按語法規(guī)定if后面的()內(nèi)是一個條件?,F(xiàn)在在x的位置上換上一個賦值表達式“a=b”,其作用是:先進行賦值運算(將b的值賦給a),然后判斷a是否大于0,如大于0,執(zhí)行cout<<″a>0″<<endl;。在if語句中的“a=b”不是賦值語句而是賦值表達式,這樣寫是合法的。不能寫成if((a=b;)>0)cout<<″a>0″<<endl;因為在if的條件中不能包含賦值語句。C++把賦值語句和賦值表達式區(qū)別開來,增加了表達式的種類,能實現(xiàn)其他語言中難以實現(xiàn)的功能。輸入和輸出并不是C++語言中的正式組成成分。C和C++本身都沒有為輸入和輸出提供專門的語句結(jié)構(gòu)。輸入輸出不是由C++本身定義的,而是在編譯系統(tǒng)提供的I/O庫中定義的。C++的輸出和輸入是用“流”(stream)的方式實現(xiàn)的。圖3.2和圖3.3表示C++通過流進行輸入輸出的過程。3.4C++的輸入與輸出圖3.2圖3.3有關(guān)流對象cin、cout和流運算符的定義等信息是存放在C++的輸入輸出流庫中的,因此如果在程序中使用cin、cout和流運算符,就必須使用預(yù)處理命令把頭文件stream包含到本文件中:#include<iostream>盡管cin和cout不是C++本身提供的語句,但是在不致混淆的情況下,為了敘述方便,常常把由cin和流提取運算符“>>”實現(xiàn)輸入的語句稱為輸入語句或cin語句,把由cout和流插入運算符“<<”實現(xiàn)輸出的語句稱為輸出語句或cout語句。根據(jù)C++的語法,凡是能實現(xiàn)某種操作而且最后以分號結(jié)束的都是語句。cout語句的一般格式為

cout<<表達式1<<表達式2<<……<<表達式n;cin語句的一般格式為cin>>變量1>>變量2>>……>>變量n;在定義流對象時,系統(tǒng)會在內(nèi)存中開辟一段緩沖區(qū),用來暫存輸入輸出流的數(shù)據(jù)。在執(zhí)行cout語句時,先把插入的數(shù)據(jù)順序存放在輸出緩沖區(qū)中,直到輸出緩沖區(qū)滿或遇到cout語句中的endl(或′\n′,ends,flush)為止,此時將緩沖區(qū)中已有的數(shù)據(jù)一起輸出,并清空緩沖區(qū)。輸出流中的數(shù)據(jù)在系統(tǒng)默認的設(shè)備(一般為顯示器)輸出。*3.4.1輸入流與輸出流的基本操作一個cout語句可以分寫成若干行。如cout<<″ThisisasimpleC++program.″<<endl;可以寫成cout<<″Thisis″//注意行末尾無分號<<″aC++″<<″program.″<<endl;//語句最后有分號也可寫成多個cout語句,即cout<<″Thisis″;//語句末尾有分號cout<<″aC++″;cout<<″program.″;cout<<endl;以上3種情況的輸出均為ThisisasimpleC++program.注意不能用一個插入運算符“<<”插入多個輸出項:cout<<a,b,c;//錯誤,不能一次插入多項cout<<a+b+c;//正確,這是一個表達式,作為一項在用cout輸出時,用戶不必通知計算機按何種類型輸出,系統(tǒng)會自動判別輸出數(shù)據(jù)的類型,使輸出的數(shù)據(jù)按相應(yīng)的類型輸出。如已定義a為int型,b為float型,c為char型,則cout<<a<<′′<<b<<′′<<c<<endl;會以下面的形式輸出:4345.789a與cout類似,一個cin語句可以分寫成若干行。如cin>>a>>b>>c>>d;可以寫成

cin>>a//注意行末尾無分號>>b//這樣寫可能看起來清晰些>>c>>d;也可以寫成cin>>a;cin>>b;cin>>c;cin>>d;以上3種情況均可以從鍵盤輸入:1234↙也可以分多行輸入數(shù)據(jù):1↙23↙4↙在用cin輸入時,系統(tǒng)也會根據(jù)變量的類型從輸入流中提取相應(yīng)長度的字節(jié)。如有charc1,c2;inta;floatb;cin>>c1>>c2>>a>>b;如果輸入123456.78↙注意:34后面應(yīng)該有空格以便和56.78分隔開。也可以按下面格式輸入:123456.78↙(在1和2之間有空格)不能用cin語句把空格字符和回車換行符作為字符輸入給字符變量,它們將被跳過。如果想將空格字符或回車換行符(或任何其他鍵盤上的字符)輸入給字符變量,可以用3.4.3節(jié)介紹的getchar函數(shù)。在組織輸入流數(shù)據(jù)時,要仔細分析cin語句中變量的類型,按照相應(yīng)的格式輸入,否則容易出錯。上面介紹的是使用cout和cin時的默認格式。但有時人們在輸入輸出時有一些特殊的要求,如在輸出實數(shù)時規(guī)定字段寬度,只保留兩位小數(shù),數(shù)據(jù)向左或向右對齊等。C++提供了在輸入輸出流中使用的控制符(有的書中稱為操縱符),見書中表3.1。需要注意的是:如果使用了控制符,在程序單位的開頭除了要加iostream頭文件外,還要加iomanip頭文件。舉例:輸出雙精度數(shù)。*3.4.2在輸入流與輸出流中使用控制符doublea=123.456789012345;對a賦初值(1)cout<<a;輸出:123.456(2)cout<<setprecision(9)<<a;輸出:123.456789(3)cout<<setprecision(6);恢復(fù)默認格式(精度為6)(4)cout<<setiosflags(ios∷fixed);輸出:123.456789(5)cout<<setiosflags(ios∷fixed)<<setprecision(8)<<a;輸出:123.45678901(6)cout<<setiosflags(ios∷scientific)<<a;輸出:1.234568e+02(7)cout<<setiosflags(ios∷scientific)<<setprecision(4)<<a;輸出:1.2346e02下面是整數(shù)輸出的例子:intb=123456;對b賦初值(1)cout<<b;輸出:123456(2)cout<<hex<<b;輸出:1e240(3)cout<<setiosflags(ios∷uppercase)<<b;輸出:1E240(4)cout<<setw(10)<<b<<′,′<<b;輸出:123456,123456(5)cout<<setfill(′*′)<<setw(10)<<b;輸出:****123456(6)cout<<setiosflags(ios∷showpos)<<b;輸出:+123456如果在多個cout語句中使用相同的setw(n),并使用setiosflags(ios∷right),可以實現(xiàn)各行數(shù)據(jù)右對齊,如果指定相同的精度,可以實現(xiàn)上下小數(shù)點對齊。例3.1各行小數(shù)點對齊。#include<iostream>#include<iomanip>usingnamespacestd;intmain(){doublea=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;return0;}輸出如下:123.46(字段寬度為10,右對齊,取兩位小數(shù))3.14-3214.67先統(tǒng)一設(shè)置定點形式輸出、取兩位小數(shù)、右對齊。這些設(shè)置對其后的輸出均有效(除非重新設(shè)置),而setw只對其后一個輸出項有效,因此必須在輸出a,b,c之前都要寫setw(10)。C++還保留了C語言中用于輸入和輸出單個字符的函數(shù),使用很方便。其中最常用的有g(shù)etchar函數(shù)和putchar函數(shù)。1.putchar函數(shù)(字符輸出函數(shù))putchar函數(shù)的作用是向終端輸出一個字符。例如putchar(c);它輸出字符變量c的值。3.4.3用getchar和putchar函數(shù)進行字符的輸入和輸出例3.2輸出單個字符。#include<iostream>//或者包含頭文件stdio.h:#include<stdio.h>usingnamespacestd;intmain(){chara,b,c;a=′B′;b=′O′;c=′Y′;putchar(a);putchar(b);putchar(c);putchar(′\n′);putchar(66);putchar(79);putchar(89);putchar(10);return0;}運行結(jié)果為BOYBOY可以看到:用putchar可以輸出轉(zhuǎn)義字符,putchar(′\n′)的作用是輸出一個換行符,使輸出的當前位置移到下一行的開頭。putchar(66)的作用是將66作為ASCII碼轉(zhuǎn)換為字符輸出,66是字母′B′的ASCII碼,因此putchar(66)輸出字母′B′。其余類似。putchar(10)中的10是換行符的ASCII碼,putchar(10)輸出一個換行符,作用與putchar(′\n′)相同。也可以輸出其他轉(zhuǎn)義字符,如

putchar(′\101′)(輸出字符′A′,八進制的101是′A′的ASCII碼)

putchar(′\′′)(輸出單引號字符′)

putchar(′\015′)(輸出回車,不換行,使輸出的當前位置移到本行開頭)2.getchar函數(shù)(字符輸入函數(shù))此函數(shù)的作用是從終端(或系統(tǒng)隱含指定的輸入設(shè)備)輸入一個字符。getchar函數(shù)沒有參數(shù),其一般形式為getchar()函數(shù)的值就是從輸入設(shè)備得到的字符。例3.3輸入單個字符。#include<iostream>usingnamespacestd;intmain(){charc;c=getchar();putchar(c+32);putchar(′\n′);return0;}在運行時,如果從鍵盤輸入大寫字母′A′并按回車鍵,就會在屏幕上輸出小寫字母′a′。請注意,getchar()只能接收一個字符。getchar函數(shù)得到的字符可以賦給一個字符變量或整型變量,也可以不賦給任何變量,作為表達式的一部分。例如,例3.3第5行可以用下面一行代替:putchar(getchar()+32);putchar(′\n′);因為getchar()讀入的值為′A′,′A′+32是小寫字母′a′的ASCII碼,因此putchar函數(shù)輸出′a′。此時不必定義變量c。也可用cout輸出getchar函數(shù)得到字符的ASCII的值:cout<<getchar();這時輸出的是整數(shù)97,因為用getchar()讀入的實際上是字符的ASCII碼,現(xiàn)在并未把它賦給一個字符變量,cout就按整數(shù)形式輸出。如果改成cout<<(c=getchar());//設(shè)c已定義為字符變量則輸出為字母′a′,因為要求輸出字符變量c的值??梢钥吹接胮utchar和getchar函數(shù)輸出和輸入字符十分靈活方便,由于它們是函數(shù)所以可以出現(xiàn)在表達式中,例如cout<<(c=getchar()+32);在C語言中是用printf函數(shù)進行輸出,用scanf函數(shù)進行輸入的。C++保留了C語言的這一用法。在此只作很簡單的介紹。scanf函數(shù)一般格式是scanf(格式控制,輸出表列)printf函數(shù)的一般格式是printf(格式控制,輸出表列)3.4.4用scanf和printf函數(shù)進行輸入和輸出例3.4用scanf和printf函數(shù)進行輸入和輸出。#include<iostream>usingnamespacestd;intmain(){inta;floatb;charc;scanf(″%d%c%f″,&a,&c,&b);//注意在變量名前要加地址運算符&

printf(″a=%d,b=%f,c=%c\n″,a,b,c);return0;}運行情況如下:12A67.98↙(本行為輸入,輸入的3個數(shù)據(jù)間以空格相間)a=12,b=67.980003,c=A(本行為輸出)輸入的整數(shù)12送給整型變量a,字符′A′送給字符變量c,67.98送給單精度變量b。例3.5求一元二次方程式ax2+bx+c=0的根。a,b,c的值在運行時由鍵盤輸入,它們的值滿足b2-4ac≥0。根據(jù)求x1,x2的算法。它可以編寫出以下C++程序:#include<iostream>#include<cmath>//由于程序要用到數(shù)學函數(shù)sqrt,故應(yīng)包含頭文件cmathusingnamespacestd;intmain(){floata,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;return0;}3.5編寫順序結(jié)構(gòu)的程序運行情況如下:4.58.82.4↙x1=-0.327612x2=-1.17794如果程序中要用到數(shù)學函數(shù),都要包含頭文件cmath(也可以用老形式的頭文件math.h,但提倡使用C++新形式的頭文件,請參閱第14章14.3節(jié))。在寫程序時,一定要注意將數(shù)學表達式正確地轉(zhuǎn)換成合法的C++表達式。可以看到:順序結(jié)構(gòu)的程序中的各執(zhí)行語句是順序執(zhí)行的。這種程序最簡單,最容易理解。往往要求根據(jù)某個指定的條件是否滿足來決定執(zhí)行的內(nèi)容。例如,購物在1000元以下的打九五折,1000元及以上的打九折。C++提供if語句來實現(xiàn)這種條件選擇。如ifamount<1000tax=0.95;//amount代表購物總額,tax代表折扣elsetax=0.9;//若amount<1000,條件滿足,tax=0.95,否則tax=0.9pay=amount*tax;//pay為實付款流程可以用圖3.4表示。圖3.43.6關(guān)系運算和邏輯運算上面if語句中的“amount<1000”實現(xiàn)的不是算術(shù)運算,而是關(guān)系運算。實際上是比較運算,將兩個數(shù)據(jù)進行比較,判斷比較的結(jié)果。“amount<1000”就是一個比較式,在高級語言中稱為關(guān)系表達式,其中“>”是一個比較符,稱為關(guān)系運算符。C++的關(guān)系運算符有:①< (小于)②<= (小于或等于) 優(yōu)先級相同(高)③> (大于)④>= (大于或等于) ⑤== (等于)⑥!= (不等于) 優(yōu)先級相同(低)3.6.1關(guān)系運算和關(guān)系表達式關(guān)于優(yōu)先次序:①前4種關(guān)系運算符(<,<=,>,>=)的優(yōu)先級別相同,后兩種也相同。前4種高于后兩種。例如,“>”優(yōu)先于“==”。而“>”與“<”優(yōu)先級相同。②關(guān)系運算符的優(yōu)先級低于算術(shù)運算符。③關(guān)系運算符的優(yōu)先級高于賦值運算符。例如:c>a+b等效于c>(a+b)a>b==c等效于(a>b)==ca==b<c等效于a==(b<c)a=b>c等效于a=(b>c)用關(guān)系運算符將兩個表達式連接起來的式子,稱為關(guān)系表達式。關(guān)系表達式的一般形式可以表示為表達式關(guān)系運算符表達式其中的“表達式”可以是算術(shù)表達式或關(guān)系表達式、邏輯表達式、賦值表達式、字符表達式。例如,下面都是合法的關(guān)系表達式:a>b,a+b>b+c,(a==3)>(b==5),′a′<′b′,(a>b)>(b<c)關(guān)系表達式的值是一個邏輯值,即“真”或“假”。例如,關(guān)系表達式“5==3”的值為“假”,“5>=0”的值為“真”。在C和C++中都用數(shù)值1代表“真”,用0代表“假”。如果有以下賦值表達式:d=a>b則d得到的值為1f=a>b>cf得到的值為0C語言沒有提供邏輯型數(shù)據(jù),關(guān)系表達式的值(真或假)分別用數(shù)值1和0代表。C++增加了邏輯型數(shù)據(jù)。邏輯型常量只有兩個,即false(假)和true(真)。邏輯型變量要用類型標識符bool來定義,它的值只能是true和false之一。如boolfound,flag=false;//定義邏輯變量found和flag,并使flag的初值為falsefound=true;//將邏輯常量true賦給邏輯變量found由于邏輯變量是用關(guān)鍵字bool來定義的,因此又稱為布爾變量。邏輯型常量又稱為布爾常量。所謂邏輯型,就是布爾型。設(shè)立邏輯類型的目的是為了看程序時直觀易懂。3.6.2邏輯常量和邏輯變量在編譯系統(tǒng)處理邏輯型數(shù)據(jù)時,將false處理為0,將true處理為1。因此,邏輯型數(shù)據(jù)可以與數(shù)值型數(shù)據(jù)進行算術(shù)運算。如果將一個非零的整數(shù)賦給邏輯型變量,則按“真”處理,如flag=123;//賦值后flag的值為truecout<<flag;輸出為數(shù)值1。有時只用一個關(guān)系表達式還不能正確表示所指定的條件。C++提供3種邏輯運算符:(1)&&邏輯與(相當于其他語言中的AND)(2)||邏輯或(相當于其他語言中的OR)(3)!邏輯非(相當于其他語言中的NOT)邏輯運算舉例如下:a&&b若a,b為真,則a&&b為真。a||b若a,b之一為真,則a||b為真。!a若a為真,則!a為假。書中表3.2為邏輯運算的“真值表”。3.6.3邏輯運算和邏輯表達式在一個邏輯表達式中如果包含多個邏輯運算符,按以下的優(yōu)先次序:(1)!(非)→&&(與)→(或),即“!”為三者中最高的。(2)邏輯運算符中的“&&”和“||”低于關(guān)系運算符,“!”高于算術(shù)運算符。例如:(a>b)&&(x>y)可寫成a>b&&x>y(a==b)||(x==y)可寫成a==b||x==y(!a)||(a>b)可寫成!a||a>b將兩個關(guān)系表達式用邏輯運算符連接起來就成為一個邏輯表達式,上面幾個式子就是邏輯表達式。邏輯表達式的一般形式可以表示為表達式邏輯運算符表達式邏輯表達式的值是一個邏輯量“真”或“假”。前面已說明,在給出邏輯運算結(jié)果時,以數(shù)值1代表“真”,以0代表“假”,但在判斷一個邏輯量是否為“真”時,采取的標準是:如果其值是0就認為是“假”,如果其值是非0就認為是“真”。例如:(1)若a=4,則!a的值為0。因為a的值為非0,被認作“真”,對它進行“非”運算,得“假”,“假”以0代表。(2)若a=4,b=5,則a&&b的值為1。因為a和b均為非0,被認為是“真”。(3)a,b值同前,a-b||a+b的值為1。因為a-b和a+b的值都為非零值。(4)a,b值同前,!a||b的值為1。(5)4&&0||2的值為1。在C++中,整型數(shù)據(jù)可以出現(xiàn)在邏輯表達式中,在進行邏輯運算時,根據(jù)整型數(shù)據(jù)的值是0或非0,把它作為邏輯量假或真,然后參加邏輯運算。通過這幾個例子可以看出:邏輯運算結(jié)果不是0就是1,不可能是其他數(shù)值。而在邏輯表達式中作為參加邏輯運算的運算對象可以是0(“假”)或任何非0的數(shù)值(按“真”對待)。如果在一個表達式中的不同位置上出現(xiàn)數(shù)值,應(yīng)區(qū)分哪些是作為數(shù)值運算或關(guān)系運算的對象,哪些作為邏輯運算的對象。實際上,邏輯運算符兩側(cè)的表達式不但可以是關(guān)系表達式或整數(shù)(0和非0),也可以是任何類型的數(shù)據(jù),如字符型、浮點型或指針型等。系統(tǒng)最終以0和非0來判定它們屬于“真”或“假”。例如′c′&&′d′的值為1??梢詫⒈?.2改寫成書中表3.3形式。熟練掌握C++的關(guān)系運算符和邏輯運算符后,可以巧妙地用一個邏輯表達式來表示一個復(fù)雜的條件。例如,要判別某一年(year)是否為閏年。閏年的條件是符合下面兩者之一:①能被4整除,但不能被100整除。②能被100整除,又能被400整除。例如2004、2000年是閏年,2005、2100年不是閏年??梢杂靡粋€邏輯表達式來表示:(year%4==0&&year%100!=0)||year%400==0

當給定year為某一整數(shù)值時,如果上述表達式值為真(1),則year為閏年;否則year為非閏年??梢约右粋€“!”用來判別非閏年:!((year%4==0&&year%100!=0)||year%400==0)若表達式值為真(1),year為非閏年。也可以用下面的邏輯表達式判別非閏年:(year%4!=0)||(year%100==0&&year%400!=0)若表達式值為真,year為非閏年。請注意表達式中右面的括號內(nèi)的不同運算符(%,!,&&,==)的運算優(yōu)先次序。if語句是用來判定所給定的條件是否滿足,根據(jù)判定的結(jié)果(真或假)決定執(zhí)行給出的兩種操作之一。3.7選擇結(jié)構(gòu)和if語句1.if(表達式)語句例如:if(x>y)cout<<x<<endl;這種if語句的執(zhí)行過程見圖3.5(a)。2.if(表達式)語句1else語句2例如:if(x>y)cout<<x;elsecout<<y;見圖3.5(b)。3.7.1if語句的3種形式圖3.53.if(表達式1)語句1elseif(表達式2)語句2elseif(表達式3)語句3…elseif(表達式m)語句melse語句n流程圖見圖3.6。例如:if(number>500)cost=0.15;elseif(number>300)cost=0.10;elseif(number>100)cost=0.075;elseif(number>50)cost=0.05;elsecost=0;圖3.6說明:(1)從圖3.5和圖3.6可以看到:3種形式的if語句都是由一個入口進來,經(jīng)過對“表達式”的判斷,分別執(zhí)行相應(yīng)的語句,最后歸到一個共同的出口。這種形式的程序結(jié)構(gòu)稱為選擇結(jié)構(gòu)。在C++中if語句是實現(xiàn)選擇結(jié)構(gòu)主要的語句。(2)3種形式的if語句中在if后面都有一個用括號括起來的表達式,它是程序編寫者要求程序判斷的“條件”,一般是邏輯表達式或關(guān)系表達式。(3)第2、第3種形式的if語句中,在每個else前面有一分號,整個語句結(jié)束處有一分號。(4)在if和else后面可以只含一個內(nèi)嵌的操作語句(如上例),也可以有多個操作語句,此時用花括號“{}”將幾個語句括起來成為一個復(fù)合語句。例3.6求三角形的面積。#include<iostream>#include<cmath>//使用數(shù)學函數(shù)時要包含頭文件cmath#include<iomanip>//使用I/O流控制符要包含頭文件iomanipusingnamespacestd;intmain(){doublea,b,c;cout<<″pleaseentera,b,c:″;cin>>a>>b>>c;if(a+b>c&&b+c>a&&c+a>b){//復(fù)合語句開始

doubles,area;//在復(fù)合語句內(nèi)定義變量

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é)束elsecout<<″itisnotatrilateral!″<<endl;return0;}運行情況如下:pleaseentera,b,c:2.453.674.89↙area=4.3565變量s和area只在復(fù)合語句內(nèi)用得到,因此在復(fù)合語句內(nèi)定義,它的作用范圍為從定義變量開始到復(fù)合語句結(jié)束。如果在復(fù)合語句外使用s和area,則會在編譯時出錯,系統(tǒng)認為這兩個變量未經(jīng)定義。將某些變量局限在某一范圍內(nèi),與外界隔離,可以避免在其他地方被誤調(diào)用。在if語句中又包含一個或多個if語句稱為if語句的嵌套。一般形式如下:if()if()語句1else語句2 內(nèi)嵌ifelseif()語句3else語句4 內(nèi)嵌if應(yīng)當注意if與else的配對關(guān)系。else總是與它上面最近的、且未配對的if配對。假如寫成3.7.2if語句的嵌套if()if()語句1elseif()語句2else語句3 內(nèi)嵌if編程序者把第一個else寫在與第一個if(外層if)同一列上,希望else與第一個if對應(yīng),但實際上else是與第二個if配對,因為它們相距最近,而且第二個if并未與任何else配對。為了避免誤用,最好使每一層內(nèi)嵌的if語句都包含else子句(如本節(jié)開頭列出的形式),這樣if的數(shù)目和else的數(shù)目相同,從內(nèi)層到外層一一對應(yīng),不致出錯。如果if與else的數(shù)目不一樣,為實現(xiàn)程序設(shè)計者的企圖,可以加花括號來確定配對關(guān)系。例如:if(){if()語句1}//這個語句是上一行if語句的內(nèi)嵌ifelse語句2//本行與第一個if配對這時{}限定了內(nèi)嵌if語句的范圍,{}外的else不會與{}內(nèi)的if配對。關(guān)系清楚,不易出錯。若在if語句中,當被判別的表達式的值為“真”或“假”時,都執(zhí)行一個賦值語句且給同一個變量賦值時,可以用簡單的條件運算符來處理。例如,若有以下if語句:if(a>b)max=a;elsemax=b;可以用條件運算符(?:)來處理:max=(a>b)?a:b;其中“(a>b)?a:b”是一個“條件表達式”。它是這樣執(zhí)行的:如果(a>b)條件為真,則條件表達式的值就取“?”后面的值,即條件表達式的值為a,否則條件表達式的值為“:”后面的值,即b。3.8條件運算符和條件表達式條件運算符要求有3個操作對象,稱三目(元)運算符,它是C++中惟一的一個三目運算符。條件表達式的一般形式為表達式1?表達式2∶表達式3條件運算符的執(zhí)行順序是:先求解表達式1,若為非0(真)則求解表達式2,此時表達式2的值就作為整個條件表達式的值。若表達式1的值為0(假),則求解表達式3,表達式3的值就是整個條件表達式的值?!癿ax=(a>b)?a:b”

的執(zhí)行結(jié)果是將條件表達式的值賦給max。也就是將a和b二者中的大者賦給max。條件運算符優(yōu)先于賦值運算符,因此上面賦值表達式的求解過程是先求解條件表達式,再將它的值賦給max。條件表達式中,表達式1的類型可以與表達式2和表達式3的類型不同。如x?′a′∶′b′如果已定義x為整型變量,若x=0,則條件表達式的值為字符′b′的ASCII碼。表達式2和表達式3的類型也可以不同,此時條件表達式的值的類型為二者中較高的類型。如有條件表達式x>y?1:1.5,如果x≤y,則條件表達式的值為1.5,若x>y,值應(yīng)為1,由于C++把1.5按雙精度數(shù)處理,雙精度的類型比整型高,因此,將1轉(zhuǎn)換成雙精度數(shù),以此作為表達式的值。例3.7輸入一個字符,判別它是否為大寫字母,如果是,將它轉(zhuǎn)換成小寫字母;如果不是,不轉(zhuǎn)換。然后輸出最后得到的字符。#include<iostream>usingnamespacestd;intmain(){charch;cin>>ch;ch=(ch>=′A′&&ch<=′Z′)?(ch+32):ch;//判別ch是否大寫字母,是則轉(zhuǎn)換

cout<<ch<<endl;return0;}switch語句是多分支選擇語句,用來實現(xiàn)多分支選擇結(jié)構(gòu)。它的一般形式如下:switch(表達式){case常量表達式1:語句1

case常量表達式2:語句2...

case常量表達式n:語句ndefault:語句n+1}3.9多分支選擇結(jié)構(gòu)和switch語句例如,要求按照考試成績的等級打印出百分制分數(shù)段,可以用switch語句實現(xià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<<″error\n″;}說明:(1)switch后面括號內(nèi)的“表達式”,允許為任何類型。(2)當switch表達式的值與某一個case子句中的常量表達式的值相匹配時,就執(zhí)行此case子句中的內(nèi)嵌語句,若所有的case子句中的常量表達式的值都不能與switch表達式的值匹配,就執(zhí)行default子句的內(nèi)嵌語句。(3)每一個case表達式的值必須互不相同,否則就會出現(xiàn)互相矛盾的現(xiàn)象(對表達式的同一個值,有兩種或多種執(zhí)行方案)。(4)各個case和default的出現(xiàn)次序不影響執(zhí)行結(jié)果。例如,可以先出現(xiàn)“default:…”,再出現(xiàn)“case′D′:…”,然后是“case′A′:…”。(5)執(zhí)行完一個case子句后,流程控制轉(zhuǎn)移到下一個case子句繼續(xù)執(zhí)行。“case常量表達式”只是起語句標號作用,并不是在該處進行條件判斷。在執(zhí)行switch語句時,根據(jù)switch表達式的值找到與之匹配的case子句,就從此case子句開始執(zhí)行下去,不再進行判斷。例如,上面的例子中,若grade的值等于′A′,則將連續(xù)輸出:85~10070~8460~69<60

error因此,應(yīng)該在執(zhí)行一個case子句后,使流程跳出switch結(jié)構(gòu),即終止switch語句的執(zhí)行??梢杂靡粋€break語句來達到此目的。將上面的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<<″error\n″;break;}最后一個子句(default)可以不加break語句。如果grade的值為′B′,則只輸出“70~84”。流程圖見圖3.7。圖3.7在case子句中雖然包含一個以上執(zhí)行語句,但可以不必用花括號括起來,會自動順序執(zhí)行本case子句中所有的執(zhí)行語句。(6)多個case可以共用一組執(zhí)行語句,如...

case′A′:case′B′:case′C′:cout<<″>60\n″;break;...當grade的值為′A′、′B′或′C′時都執(zhí)行同一組語句。例3.8編寫程序,判斷某一年是否為閏年。#include<iostream>usingnamespacestd;intmain(){intyear;boolleap;cout<<″pleaseenteryear:″;//輸出提示

cin>>year;//輸入年份

if(year%4==0)//年份能被4整除{if(year%100==0)//年份能被4整除又能被100整除{if(year%400==0)//年份能被4整除又能被400整除

leap=true;//閏年,令leap=true(真)

elseleap=false;}//非閏年,令leap=false(假)

else//年份能被4整除但不能被100整除肯定是閏年

leap=true;}//是閏年,令leap=true3.10編寫選擇結(jié)構(gòu)的程序else//年份不能被4整除肯定不是閏年

leap=false;//若為非閏年,令leap=falseif(leap)cout<<year<<″is″;//若leap為真,就輸出年份和“是”

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

cout<<″aleapyear.″<<endl;//輸出“閏年”

return0;}運行情況如下:①2005↙2005isnotaleapyear.②1900↙1900isnptaleapyear.也可以將程序中第8~16行改寫成以下的if語句:if(year%4!=0)leap=false;elseif(year%100!=0)leap=true;elseif(year%400!=0)leap=false;elseleap=true;也可以用一個邏輯表達式包含所有的閏年條件,將上述if語句用下面的if語句代替:if((year%4==0&&year%100!=0)||(year%400==0))leap=true;elseleap=false;例3.9運輸公司對用戶計算運費。路程(s)越遠,每公里運費越低。標準如下:

s<250km沒有折扣250≤s<5002%折扣500≤s<10005%折扣1000≤s<20008%折扣2000≤s<300010%折扣3000≤s15%折扣設(shè)每公里每噸貨物的基本運費為p(price的縮寫),貨物重為w(wright的縮寫),距離為s,折扣為d(discount的縮寫),則總運費f(freight的縮寫)的計算公式為f=p*w*s*(1-d)圖3.8據(jù)此寫出程序如下:#include<iostream>usingnamespacestd;intmain(){intc,s;floatp,w,d,f;cout<<″pleaseenterp,w,s:″;cin>>p>>w>>s;if(s>=3000)c=12;elsec=s/250;switch(c){case0:d=0;break;case1:d=2;break;case2:case3:d=5;break;case4:case5:case6:case7:d=8;break;case8:case9:case10:case11:d=10;break;case12:d=15;break;}f=p*w*s*(1-d/100.0);cout<<″freight=″<<f<<endl;return0;}運行情況如下:pleaseenterp,w,s:10020300↙freight=588000在人們所要處理的問題中常常遇到需要反復(fù)執(zhí)行某一操作的情況。這就需要用到循環(huán)控制。許多應(yīng)用程序都包含循環(huán)。順序結(jié)構(gòu)、選擇結(jié)構(gòu)和循環(huán)結(jié)構(gòu)是結(jié)構(gòu)化程序設(shè)計的3種基本結(jié)構(gòu),是各種復(fù)雜程序的基本構(gòu)造單元。因此程序設(shè)計者必須熟練掌握選擇結(jié)構(gòu)和循環(huán)結(jié)構(gòu)的概念及使用方法。3.11循環(huán)結(jié)構(gòu)和循環(huán)語句while語句的一般形式如下:while(表達式)語句其作用是:當指定的條件為真(表達式為非0)時,執(zhí)行while語句中的內(nèi)嵌語句。其流程圖見圖3.9。其特點是:先判斷表達式,后執(zhí)行語句。while循環(huán)稱為當型循環(huán)。圖3.93.11.1用while語句構(gòu)成循環(huán)例3.10求1+2+3+…+100。用流程圖表示算法,見圖3.10。根據(jù)流程圖寫出程序:#include<iostream>usingnamespacestd;intmain(){inti=1,sum=0;while(i<=100){sum=sum+i;i++;}cout<<″sum=″<<sum<<endl;}運行結(jié)果為sum=5050圖3.10需要注意:(1)循環(huán)體如果包含一個以上的語句,應(yīng)該用花括號括起來,以復(fù)合語句形式出現(xiàn)。如果不加花括號,則while語句的范圍只到while后面第一個分號處。(2)在循環(huán)體中應(yīng)有使循環(huán)趨向于結(jié)束的語句。do-while語句的特點是先執(zhí)行循環(huán)體,然后判斷循環(huán)條件是否成立。其一般形式為do

語句

while(表達式);它是這樣執(zhí)行的:先執(zhí)行一次指定的語句(即循環(huán)體),然后判別表達式,當表達式的值為非零(“真”)時,返回重新執(zhí)行循環(huán)體語句,如此反復(fù),直到表達式的值等于0為止,此時循環(huán)結(jié)束??梢杂脠D3.11表示其流程。3.11.2用do-while語句構(gòu)成循環(huán)圖3.11圖3.12例3.11用do-while語句求1+2+3+…+100。先畫出流程圖,見圖3.12??删帉懗鱿旅娴某绦颍?include<iostream>usingnamespacestd;intmain(){inti=1,sum=0;do{sum=sum+i;i++;}while(i<=100);cout<<″sum=″<<sum<<endl;return0;}運行結(jié)果與例3.10相同。可以看到:對同一個問題可以用while語句處理,也可以用dowhile語句處理。dowhile語句結(jié)構(gòu)可以轉(zhuǎn)換成while結(jié)構(gòu)。圖3.11可以改畫成圖3.13的形式,二者完全等價。而圖3.13中虛線框部分就是一個while結(jié)構(gòu)。圖3.13C++中的for語句使用最為廣泛和靈活,不僅可以用于循環(huán)次數(shù)已經(jīng)確定的情況,而且可以用于循環(huán)次數(shù)不確定而只給出循環(huán)結(jié)束條件的情況,它完全可以代替while語句。for語句的一般格式為for(表達式1;表達式2;表達式3)語句它的執(zhí)行過程如下:(1)先求解表達式1。(2)求解表達式2,若其值為真(值為非0),則執(zhí)行for語句中指定的內(nèi)嵌語句,然后執(zhí)行下面第(3)步。若為假(值為0),則結(jié)束循環(huán),轉(zhuǎn)到第(5)步。3.11.3用for語句構(gòu)成循環(huán)(3)求解表達式3。(4)轉(zhuǎn)回上面第(2)步驟繼續(xù)執(zhí)行。(5)循環(huán)結(jié)束,執(zhí)行for語句下面的一個語句。可以用圖3.14來表示for語句的執(zhí)行過程。圖3.14for語句最簡單的形式也是最容易理解的格式如下:for(循環(huán)變量賦初值;循環(huán)條件;循環(huán)變量增值)語句例如for(i=1;i<=100;i++)sum=sum+i;它的執(zhí)行過程與圖3.10完全一樣。它相當于以下語句:

i=1;while(i<=100){sum=sum+i;i++;}顯然,用for語句簡單、方便。for語句的使用有許多技巧,如果熟練地掌握和運用for語句,可以使程序精煉簡潔。說明:(1)for語句的一般格式中的“表達式1”可以省略,此時應(yīng)在for語句之前給循環(huán)變量賦初值。(2)如果表達式2省略,即不判斷循環(huán)條件,循環(huán)無終止地進行下去。也就是認為表達式2始終為真。(3)表達式3也可以省略,但此時程序設(shè)計者應(yīng)另外設(shè)法保證循環(huán)能正常結(jié)束。(4)可以省略表達式1和表達式3,只有表達式2,即只給循環(huán)條件。(5)3個表達式都可省略。(6)表達式1可以是設(shè)置循環(huán)變量初值的賦值表達式,也可以是與循環(huán)變量無關(guān)的其他表達式。(7)表達式一般是關(guān)系表達式(如i<=100)或邏輯表達式(如a<b&&x<y),但也可以是數(shù)值表達式或字符表達式,只要其值為非零,就執(zhí)行循環(huán)體。C++中的for語句比其他語言中的循環(huán)語句功能強得多??梢园蜒h(huán)體和一些與循環(huán)控制無關(guān)的操作也作為表達式1或表達式3出現(xiàn),這樣程序可以短小簡潔。但過分地利用這一特點會使for語句顯得雜亂,可讀性降低,建議不要把與循環(huán)控制無關(guān)的內(nèi)容放到for語句中。(1)3種循環(huán)都可以用來處理同一問題,一般情況下它們可以互相代替。(2)while和do-while循環(huán),是在while后面指定循環(huán)條件的,在循環(huán)體中應(yīng)包含使循環(huán)趨于結(jié)束的語句(如i++,或i=i+1等)。

for循環(huán)可以在表達式3中包含使循環(huán)趨于結(jié)束的操作,甚至可以將循環(huán)體中的操作全部放到表達式3中。因此for語句的功能更強,凡用while循環(huán)能完成的,用for循環(huán)都能實現(xiàn)。(3)用while和do-while循環(huán)時,循環(huán)變量初始化的操作應(yīng)在while和do-while語句之前完成。而for語句可以在表達式1中實現(xiàn)循環(huán)變量的初始化。3.11.4幾種循環(huán)的比較一個循環(huán)體內(nèi)又包含另一個完整的循環(huán)結(jié)構(gòu),稱為循環(huán)的嵌套。內(nèi)嵌的循環(huán)中還可以嵌套循環(huán),這就是多層循環(huán)。3種循環(huán)(while循環(huán)、dowhile循環(huán)和for循環(huán))可以互相嵌套。例如,下面幾種都是合法的形式:(1)while(){┆while(){…}}3.12循環(huán)的嵌套(2)do{┆do{…}while();}while();(3)for(;;){┆for(;;){…}}(4)while(){┆do{…}while();┆}(5)for(;;){┆while(){…}┆}(6)do{┆for(;;){…}}while();在3.9節(jié)中已經(jīng)介紹過用break語句可以使流程跳出switch結(jié)構(gòu),繼續(xù)執(zhí)行switch語句下面的一個語句。實際上,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),不能單獨使用或用于其他語句中。3.13break語句和continue語句continue語句的一般格式為continue;其作用為結(jié)束本次循環(huán),即跳過循環(huán)體中下面尚未執(zhí)行的語句,接著進行下一次是否執(zhí)行循環(huán)的判定。continue語句和break語句的區(qū)別是:continue語句只結(jié)束本次循環(huán),而不是終止整個循環(huán)的執(zhí)行。而break語句則是結(jié)束整個循環(huán)過程,不再判斷執(zhí)行循環(huán)的條件是否成立。如果有以下兩個循環(huán)結(jié)構(gòu):(1)while(表達式1){┆if(表達式2)break┆}(2)while(表達式1){┆if(表達式2)continue;┆}程序(1)的流程圖如圖3.18所示,而程序(2)的流程如圖3.19所示。請注意圖3.18和圖3.19中當“表達式2”為真時流程的轉(zhuǎn)向。

圖3.18圖3.19例3.12用下面公式求π的近似值。π/4≈1-1/3+1/5-1/7+…直到最后一項的絕對值小于10-7為止。根據(jù)給定的算法很容易編寫程序如下:#include<iostream>#include<iomanip>#include<cmath>usingnamespacestd;intmain(){ints=1;doublen=1,t=1,pi=0;while((fabs(t))>1e-7){pi=pi+t;n=n+2;3.14編寫循環(huán)結(jié)構(gòu)的程序s=-s;t=s/n;}pi=pi*4;cout<<″pi=″<<setiosflags(ios∷fixed)<<setprecision(6)<<pi<<endl;return0;}運行結(jié)果為pi=3.141592注意:不要把n定義為整型變量,否則在執(zhí)行“t=s/n;”時,得到t的值為0(原因是兩個整數(shù)相除)。例3.13求Fibonacci數(shù)列前40個數(shù)。這個數(shù)列有如下特點:第1、2個數(shù)為1、1。從第3個數(shù)開始,每個數(shù)是其前面兩個數(shù)之和。即F1=1(n=1)F2=1(n=2)Fn=Fn-1+Fn-2(n≥3)這是一個有趣的古典數(shù)學問題:有一對兔子,從出生后第3個月起每個月都生一對兔子。小兔子長到第3個月后每個月又生一對兔子。假設(shè)所有兔子都不死,問每個月的兔子總數(shù)為多少?可以從書中表3.4看出兔子數(shù)的規(guī)律。根據(jù)給出的每月兔子總數(shù)的關(guān)系,可編寫程序如下:#include<iostream>#include<iomanip>usingnamespacestd;intmain(){longf1,f2;inti;f1=f2=1;for(i=1;i<=20;i++){cout<<setw(12)<<f1<<setw(12)<<f2;//設(shè)備輸出字段寬度為12,每次輸出兩個數(shù)

if(i%2==0)cout<<endl;//每輸出完4個數(shù)后換行,使每行輸出4個數(shù)

f1=f1+f2;//左邊的f1代表第3個數(shù),是第1、2個數(shù)之和

f2=f2+f1;//左邊的f2代表第4個數(shù),是第2、3個數(shù)之和}

return0;}例3.14找出100~200間的全部素數(shù)。編寫程序如下:#include<iostream>#include<cmath>#include<iomanip>usingnamespacestd;intmain(){intm,k,i,n=0;boolprime;//定義布爾變量primefor(m=101;m<=200;m=m+2)//判別m是否為素數(shù),m由101變化到200,增量為2{prime=true;//循環(huán)開始時設(shè)prime為真,即先認為m為素數(shù)k=int(sqrt(m));//用k代表根號m的整數(shù)部分

for(i=2;i<=k;i++)//此循環(huán)作用是將m被2~根號m除,檢查是否能整除if(m%i==0)//如果能整除,表示m不是素數(shù){prime=false;//使prime變?yōu)榧賐reak;//終止執(zhí)行本循環(huán)}

if(prime)//如果m為素數(shù){cout<<setw(5)<<m;//輸出素數(shù)m,字段寬度為5

n=n+1;//n用來累計輸出素數(shù)的個數(shù)}

if(n%10==0)cout<<endl;//輸出10個數(shù)后換行}

cout<<endl;//最后執(zhí)行一次換行

return0;}例3.15譯密碼。為使電文保密,往往按一定規(guī)律將電文轉(zhuǎn)換成密碼,收報人再按約定的規(guī)律將其譯回原文。例如,可以按以下規(guī)律將電文變成密碼:將字母A變成字母E,a變成e,即變成其后的第4個字母,W變成A,X變成B,Y變成C,Z變成D。見圖3.20。字母按上述規(guī)律轉(zhuǎn)換,非字母字符不變。如″Wonderful!″轉(zhuǎn)換為″Asrhivjyp!″。輸入一行字符,要求輸出其相應(yīng)的密碼。圖3.20程序如下:#include<iostream>usingnamespacestd;intmain(){charc;while((c=getchar())!=′\n′){if((c>=′a′&&c<=′z′)||(c>=′A′&&c<=′Z′)){c=c+4;

溫馨提示

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

評論

0/150

提交評論