版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1第三章程序設計初步3.1基于過程的程序設計和算法3.2C++的程序結構和語句3.3賦值操作3.4C++的輸入與輸出3.5編寫順序結構的程序3.6關系運算和邏輯運算3.7選擇結構和if語句3.8循環(huán)結構和循環(huán)語句23.1基于過程的程序設計和算法
在基于過程的程序設計中,程序設計者必須指定計算機執(zhí)行的具體步驟,程序設計者不僅要考慮程序要“做什么”,還要解決“怎么做”的問題,根據(jù)程序要“做什么”的要求,寫出一個個語句,安排好它們的執(zhí)行順序?
怎樣設計這些步驟,怎樣保證它的正確性和具有較高的效率,這就是算法需要解決的問題?
33.1.1算法的概念
一個面向過程的程序應包括以下兩方面內容:(1)對數(shù)據(jù)的描述?在程序中要指定數(shù)據(jù)的類型和數(shù)據(jù)的組織形式,即數(shù)據(jù)結構?(2)對操作的描述?即操作步驟,也就是算法。對于面向過程的程序,可以用下面的公式表示:
程序=算法+數(shù)據(jù)結構
4不要認為只有“計算”的問題才有算法?廣義地說,
為解決一個問題而采取的方法和步驟,就稱為“算法”?計算機算法可分為兩大類別:數(shù)值算法和非數(shù)值算法?數(shù)值算法的目的是求數(shù)值解?非數(shù)值算法包括的面十分廣泛,最常見的是用于事務管理領域?目前,計算機在非數(shù)值方面的應用遠遠超過了在數(shù)值方面的應用?C++既支持面向過程的程序設計,又支持面向對象的程序設計?無論面向過程的程序設計還是面向對象的程序設計,都離不開算法設計?53.1.2算法的表示1.自然語言用中文或英文等自然語言描述算法?但容易產生歧義性,在程序設計中一般不用自然語言表示算法?2.流程圖可以用傳統(tǒng)的流程圖或結構化流程圖?用圖的形式表示算法,比較形象直觀,但修改算法時顯得不大方便?3.偽代碼偽代碼是用介于自然語言和計算機語言之間的文字和符號來描述算法?如6
ifxispositivethenprintxelseprint-x用偽代碼寫算法并無固定的?嚴格的語法規(guī)則,只需把意思表達清楚,并且書寫的格式要寫成清晰易讀的形式?它不用圖形符號,因此書寫方便?格式緊湊,容易修改,便于向計算機語言算法(即程序)過渡?4.用計算機語言表示算法
用一種計算機語言去描述算法,這就是計算機程序?
教材中常用的:流程圖和計算機語言73.2C++的程序結構和語句
由第1章已知,一個程序包含一個或多個程序單位(每個程序單位構成一個程序文件)?每一個程序單位由以下幾個部分組成:(1)預處理命令?如#include命令和#define命令?(2)全局聲明?例如對數(shù)據(jù)類型和函數(shù)的聲明,以及對變量的定義?(3)函數(shù)?包括函數(shù)首部和函數(shù)體,在函數(shù)體中可以包含若干聲明語句和執(zhí)行語句?8#include<iostream>//預處理命令usingnamespacestd;//在函數(shù)之外的聲明部分inta=3;//在函數(shù)之外的聲明部分intmain()//函數(shù)首部{floatb;//函數(shù)內的聲明部分
b=4.5;//執(zhí)行語句
cout<<a<<b;//執(zhí)行語句
return0;//執(zhí)行語句}910C++語句可以分為以下4種:1.聲明語句如inta,b;
在C語言中,只有產生實際操作的才稱為語句,對變量的定義不作為語句,而且要求對變量的定義必須出現(xiàn)在本塊中所有程序語句之前?因此C程序員已經養(yǎng)成了一個習慣:在函數(shù)或塊的開頭位置定義全部變量?
在C++中,對變量(以及其他對象)的定義被認為是一條語句,并且可以出現(xiàn)在函數(shù)中的任何行,即可以放在其他程序語句可以出現(xiàn)的地方,也可以放在函數(shù)之外?112.執(zhí)行語句通知計算機完成一定的操作?執(zhí)行語句包括:(1)控制語句,完成一定的控制功能?C++有9種控制語句,即①if()~else~(條件語句)②for()~(循環(huán)語句)③while()~(循環(huán)語句)④do~while()(循環(huán)語句)⑤continue(結束本次循環(huán)語句)⑥break(中止執(zhí)行switch或循環(huán)語句)⑦switch(多分支選擇語句)⑧goto(轉向語句)⑨return(從函數(shù)返回語句)12(2)函數(shù)和流對象調用語句?函數(shù)調用語句由一次函數(shù)調用加一個分號構成一個語句,例如:sort(x,y,z);//假設已定義了sort函數(shù),它有3個參數(shù)
cout<<x<<endl;//流對象調用語句(3)表達式語句?由一個表達式加一個分號構成一個語句?最典型的是:由賦值表達式構成一個賦值語句?i=i+1i=i+1;任何一個表達式的最后加一個分號都可以成為一個語句?一個語句必須在最后出現(xiàn)分號?表達式能構成語句是C和C++語言的一個重要特色?是一個賦值表達式
是一個賦值語句133.空語句下面是一個空語句:;即只有一個分號的語句,它什么也不做?4.復合語句用{}把一些語句括起來成為復合語句?{z=x+y;if(z>100)z=z-100;cout<<z;}注意:復合語句中最后一個語句中最后的分號不能省略?143.3賦值操作前面已介紹,賦值語句是由賦值表達式加上一個分號構成?(1)C++的賦值語句具有其他高級語言的賦值語句的功能?但不同的是:C++中的賦值號“=”是一個運算符,可以寫成:a=b=c=d;而在其他大多數(shù)語言中賦值號不是運算符,上面的寫法是不合法的?15(2)關于賦值表達式與賦值語句的概念?在C++
中,賦值表達式可以包括在其他表達式之中.例如
if((a=b)>0)cout<<"a>0"<<endl;
不能寫成
if((a=b;)>0)cout<<"a>0"<<endl;因為在if的條件中不能包含賦值語句?C++把賦值語句和賦值表達式區(qū)別開來,增加了表達式的種類,能實現(xiàn)其他語言中難以實現(xiàn)的功能?163.4C++的輸入與輸出輸入和輸出并不是C++語言中的正式組成成分?C和C++本身都沒有為輸入和輸出提供專門的語句結構?輸入輸出不是由C++本身定義的,而是在編譯系統(tǒng)提供的I/O庫中定義的?C++的輸出和輸入是用“流”(stream)的方式實現(xiàn)的?17有關流對象cin?cout和流運算符的定義等信息是存放在C++的輸入輸出流庫中的,因此如果在程序中使用cin?cout和流運算符,就必須使用預處理命令把頭文件stream包含到本文件中:#include<iostream>C++通過流進行輸出的過程C++通過流進行輸入的過程18*3.4.1輸入流與輸出流的基本操作cout語句的一般格式為
cout<<表達式1<<表達式2<<……<<表達式n;cin語句的一般格式為
cin>>變量1>>變量2>>……>>變量n;在定義流對象時,系統(tǒng)會在內存中開辟一段緩沖區(qū),用來暫存輸入輸出流的數(shù)據(jù)?在執(zhí)行cout語句時,先把插入的數(shù)據(jù)順序存放在輸出緩沖區(qū)中,直到輸出緩沖區(qū)滿或遇到cout語句中的endl(或'\n',ends,flush)為止,此時將緩沖區(qū)中已有的數(shù)據(jù)一起輸出,并清空緩沖區(qū)?輸出流中的數(shù)據(jù)在系統(tǒng)默認的設備(一般為顯示器)輸出?19
一個cout語句可以分寫成若干行?如cout<<"ThisisasimpleC++program."<<endl;可以寫成cout<<"Thisis"http://注意行末尾無分號<<"aC++"<<"program."<<endl;//語句最后有分號也可寫成多個cout語句,即cout<<"Thisis";//語句末尾有分號cout<<"aC++";cout<<"program.";cout<<endl;20注意不能用一個插入運算符“<<”插入多個輸出項:cout<<a,b,c;//錯誤,不能一次插入多項cout<<a+b+c;//正確,這是一個表達式.作為一項在用cout輸出時,用戶不必通知計算機按何種類型輸出,系統(tǒng)會自動判別輸出數(shù)據(jù)的類型,使輸出的數(shù)據(jù)按相應的類型輸出?如已定義a為int型,b為float型,c為char型,則cout<<a<<‘,'<<b<<‘,'<<c<<endl;會以下面的形式輸出:4,345.789,a21與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↙22在用cin輸入時,系統(tǒng)也會根據(jù)變量的類型從輸入流中提取相應長度的字節(jié)?如有
charc1,c2;inta;floatb;cin>>c1>>c2>>a>>b;cout<<c1<<","<<c2<<","<<a<<","<<b<<endl;如果輸入123456.78↙也可以按下面格式輸入:123456.78↙(在1和2之間有空格)輸出如下:1,2,34,56.78輸出同上23注意:不能用cin語句把空格字符和回車換行符作為字符輸入給字符變量,它們將被跳過?如果想將空格字符或回車換行符(或任何其他鍵盤上的字符)輸入給字符變量,可以用getchar函數(shù)(3.4.3節(jié)介紹)?在組織輸入流數(shù)據(jù)時,要仔細分析cin語句中變量的類型,按照相應的格式輸入,否則容易出錯?24*3.4.2在輸入流與輸出流中使用控制符上面介紹的是使用cout和cin時的默認格式?但有時人們在輸入輸出時有一些特殊的要求,如在輸出實數(shù)時規(guī)定字段寬度,只保留兩位小數(shù),數(shù)據(jù)向左或向右對齊等?C++提供了在輸入輸出流中使用的控制符(有的書中稱為操縱符),見書中表3.1?需要注意的是:如果使用了控制符,在程序單位的開頭除了要加iostream頭文件外,還要加iomanip頭文件?25浮點數(shù)輸出舉例:doublea=123.456789012345;對a賦初值(1)cout<<a;
輸出:123.456或123.457
(2)cout<<setprecision(9)<<a;
輸出:123.456789(3)cout<<setiosflags(ios∷fixed)<<setprecision(8)<<a;
輸出:123.45678901(4)cout<<setiosflags(ios∷scientific)<<a;
輸出:1.234568e+002(5)cout<<setiosflags(ios∷scientific)<<setprecision(4)<<a;
輸出:1.2346e+002注意四舍五入問題,vc6為后者26整數(shù)輸出舉例:intb=123456;對b賦初值(1)cout<<b;
輸出:123456(2)cout<<setw(10)<<b<<','<<b;
輸出:123456,123456
設置相同寬度右對齊
精度相同綜合使用27如果在多個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.463.14-3214.67統(tǒng)一設置定點形式輸出?取兩位小數(shù)?右對齊?這些設置對其后的輸出均有效(除非重新設置),而setw只對其后一個輸出項有效,因此必須在輸出a,b,c之前都要寫setw(10)?283.4.3用getchar和putchar函數(shù)進行字符的輸入和輸出C++還保留了C語言中用于輸入和輸出單個字符的函數(shù),使用很方便?其中最常用的有getchar函數(shù)和putchar函數(shù)?1.putchar函數(shù)(字符輸出函數(shù))putchar函數(shù)的作用是向終端輸出一個字符?
例如putchar(c);它輸出字符變量c的值?29
例3.2輸出單個字符?#include<iostream>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;}運行結果為BOYBOY30
putchar('\101')(輸出字符'A',八進制的101是'A'的ASCII碼)putchar('\'')(輸出單引號字符')putchar('\015')(輸出回車,不換行,使輸出的當前位置移到本行開頭)312.getchar函數(shù)(字符輸入函數(shù))此函數(shù)的作用是從終端(或系統(tǒng)隱含指定的輸入設備)輸入一個字符?getchar函數(shù)沒有參數(shù),函數(shù)的值就是從輸入設備得到的字符?例3.3輸入單個字符?#include<iostream>usingnamespacestd;intmain(){charc;c=getchar();putchar(c+32);putchar('\n');return0;}在運行時,如果從鍵盤輸入大寫字母'A'并按回車鍵,就會在屏幕上輸出小寫字母'a'?32請注意,getchar()只能接收一個字符?getchar函數(shù)得到的字符可以賦給一個字符變量或整型變量,也可以不賦給任何變量,作為表達式的一部分?例3.3中的:
charc;c=getchar();putchar(c+32);putchar('\n');可以用下面程序行代替:putchar(getchar()+32);putchar('\n');此時不必定義變量c?33假設:charc;思考下面代碼行的功能:(輸入時敲入A)(1)cout<<(c=getchar());(2)cout<<(c=getchar()+32);可以看到用putchar和getchar函數(shù)輸出和輸入字符十分靈活方便,由于它們是函數(shù)所以可以出現(xiàn)在表達式中。輸出A輸出a343.4.4用scanf和printf函數(shù)進行輸入和輸出不做要求353.5編寫順序結構的程序例3.5求一元二次方程式ax2+bx+c=0的根?a,b,c的值在運行時由鍵盤輸入,它們的值滿足b2-4ac≥0?#include<iostream>#include<cmath>//由于程序要用到數(shù)學函數(shù)sqrtusingnamespacestd;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;}運行結果如下:4.58.82.4↙x1=-0.327612x2=-1.17794363.6關系運算和邏輯運算往往要求根據(jù)某個指定的條件是否滿足來決定執(zhí)行的內容?例如,購物在1000元以下的打九五折,1000元及以上的打九折?C++提供if語句來實現(xiàn)這種條件選擇?//amount代表購物總額,tax代表折扣
//pay為實付款
if(amount<1000)tax=0.95;elsetax=0.9;pay=amount*tax;373.6.1關系運算和關系表達式上面if語句中的“amount<1000”實現(xiàn)的不是算術運算,而是關系運算?實際上是比較運算,將兩個數(shù)據(jù)進行比較,判斷比較的結果?“amount<1000”就是一個比較式,在高級語言中稱為關系表達式,其中“>”是一個比較符,稱為關系運算符?C++的關系運算符有:①< (小于)②<= (小于或等于) ③> (大于)④>= (大于或等于) ⑤== (等于)⑥!= (不等于)優(yōu)先級相同(高)優(yōu)先級相同(低)38關于優(yōu)先次序:①前4種關系運算符(<,<=,>,>=)的優(yōu)先級別相同,后兩種也相同?前4種高于后兩種?例如,“>”優(yōu)先于“==”?而“>”與“<”優(yōu)先級相同?②關系運算符的優(yōu)先級低于算術運算符?③關系運算符的優(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)用關系運算符將兩個表達式連接起來的式子,稱為關系表達式?39關系表達式的一般形式可以表示為表達式關系運算符表達式其中的“表達式”可以是算術表達式或關系表達式?邏輯表達式?賦值表達式?字符表達式?例如,下面都是合法的關系表達式:a>b,a+b>b+c,(a==3)>(b==5),'a'<'b',(a>b)>(b<c)關系表達式的值是一個邏輯值,即“真”或“假”?例如,關系表達式“5==3”的值為“假”,“5>=0”的值為“真”?在C和C++中都用數(shù)值1代表“真”,用0代表“假”?如果有以下賦值表達式:d=a>b則d得到的值為1f=a>b>cf得到的值為0403.6.2邏輯常量和邏輯變量C++中提供了邏輯型數(shù)據(jù)?邏輯型常量只有兩個,即false(假)和true(真)?邏輯型變量要用類型標識符bool來定義,它的值只能是true和false之一?如
boolfound,flag=false;found=true;由于邏輯變量是用關鍵字bool來定義的,因此又稱為布爾變量?邏輯型常量又稱為布爾常量?設立邏輯類型的目的是為了看程序時直觀易懂?41在編譯系統(tǒng)處理邏輯型數(shù)據(jù)時,將false處理為0,將true處理為1?因此,邏輯型數(shù)據(jù)可以與數(shù)值型數(shù)據(jù)進行算術運算?如果將一個非零的整數(shù)賦給邏輯型變量,則按“真”處理。如:flag=123;//賦值后flag的值為truecout<<flag;輸出為數(shù)值1?423.6.3邏輯運算和邏輯表達式有時只用一個關系表達式不能正確表示所指定的條件C++提供3種邏輯運算符(運算規(guī)則參考書中表3.2)(1)&&
邏輯與(相當于其他語言中的AND)(2)||
邏輯或(相當于其他語言中的OR)(3)!邏輯非(相當于其他語言中的NOT)邏輯運算舉例如下:a&&b若a,b為真,則a&&b為真?a||b若a,b之一為真,則a||b為真?!a若a為真,則!a為假?43在一個邏輯表達式中如果包含多個邏輯運算符,按以下的優(yōu)先次序:(1)!(非)→&&(與)→||(或),即“!”為三者中最高的?(2)!
>
算術運算符
>
關系運算符>&&>||
>賦值運算符例如:(a>b)&&(x>y)可寫成a>b&&x>y(a==b)||(x==y)可寫成a==b||x==y(!a)||(a>b)可寫成!a||a>b將兩個關系表達式用邏輯運算符連接起來就成為一個邏輯表達式,上面幾個式子就是邏輯表達式?44邏輯表達式的一般形式可以表示為表達式邏輯運算符表達式邏輯表達式的值是一個邏輯量“真”或“假”?在給出邏輯運算結果時,以數(shù)值1代表“真”,以0代表“假”。但在判斷一個邏輯量是否為“真”時,采取的標準是:如果其值是0就認為是“假”,如果其值是非0就認為是“真”?例如:(1)若a=4,則!a的值為0?(2)若a=4,b=5,則a&&b的值為1?(3)a,b值同前,a-b||a+b的值為1?(4)a,b值同前,!a||b的值為1?(5)4&&0||2的值為1?45在C++中,整型數(shù)據(jù)可以出現(xiàn)在邏輯表達式中,在進行邏輯運算時,根據(jù)整型數(shù)據(jù)的值是0或非0,把它作為邏輯量假或真,然后參加邏輯運算?小結:
邏輯運算結果不是0就是1,不可能是其他數(shù)值?而在邏輯表達式中作為參加邏輯運算的運算對象可以是0(“假”)或任何非0的數(shù)值(按“真”對待)?如果在一個表達式中的不同位置上出現(xiàn)數(shù)值,應區(qū)分哪些是作為數(shù)值運算或關系運算的對象,哪些作為邏輯運算的對象?實際上,邏輯運算符兩側的表達式不但可以是關系表達式或整數(shù)(0和非0),也可以是任何類型的數(shù)據(jù),系統(tǒng)最終以0和非0來判定它們屬于“真”或“假”?例如'c'&&'d'的值為1?
46可以將表3.2改寫成書中表3.3形式?熟練掌握C++的關系運算符和邏輯運算符后,可以巧妙地用一個邏輯表達式來表示一個復雜的條件?例如,要判別某一年(year)是否為閏年?閏年的條件是符合下面兩者之一:①能被4整除,但不能被100整除?②能被100整除,又能被400整除?例如2004?2000年是閏年,2005?2100年不是閏年?(year%4==0&&year%100!=0)||year%400==0可以加一個“!”用來判別非閏年:!((year%4==0&&year%100!=0)||year%400==0)473.7選擇結構和if語句if語句是用來判定所給定的條件是否滿足,根據(jù)判定的結果(真或假)決定執(zhí)行給出的兩種操作之一483.7.1if語句的形式1.if(表達式)語句例如:if(x>y)cout<<x<<endl;這種if語句的執(zhí)行過程見圖(a)2.if(表達式)語句1else語句2例如:if(x>y)cout<<x;elsecout<<y;見圖(b)493.if(表達式1)語句1elseif(表達式2)語句2elseif(表達式3)語句3…elseif(表達式m)語句melse語句n例如: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;對應流程圖50說明:(1)3種形式的if語句都是由一個入口進來,經過對“表達式”的判斷,分別執(zhí)行相應的語句,最后歸到一個共同的出口?這種形式的程序結構稱為選擇結構?在C++
中if語句是實現(xiàn)選擇結構主要的語句?(2)3種形式的if語句中在if后面都有一個用括號括起來的表達式,它是程序編寫者要求程序判斷的“條件”,一般是邏輯表達式或關系表達式?(3)第2?第3種形式的if語句中,在每個else前面有一分號,整個語句結束處有一分號?(4)在if和else后面可以只含一個內嵌的操作語句(如上例),也可以有多個操作語句,此時用花括號“{}”將幾個語句括起來成為一個復合語句?51例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){//復合語句開始
doubles,area;//在復合語句內定義變量
s=(a+b+c)/2;area=sqrt(s*(s-a)*(s-b)*(s-c));cout<<setiosflags(ios∷fixed)<<setprecision(4);cout<<"area="<<area<<endl;}//復合語句結束
elsecout<<"itisnotatrilateral!"<<endl;return0;}運行情況如下:pleaseentera,b,c:2.453.674.89↙area=4.3565523.7.2if語句的嵌套在if語句中又包含一個或多個if語句稱為if語句的嵌套?一般形式如下:if()if()語句1else語句2 內嵌ifelseif()語句3else語句4 內嵌if應當注意if與else的配對關系?else總是與它上面最近的?且未配對的if配對?53假如寫成if()if()語句1elseif()語句2else語句3 但實際上else是與第二個if配對,因為它們相距最近。為了避免誤用,最好使每一層內嵌的if語句都包含else子句(如本節(jié)開頭列出的形式),這樣if的數(shù)目和else的數(shù)目相同,從內層到外層一一對應,不致出錯?編程序希望else與第一個if對應54如果if與else的數(shù)目不一樣,為實現(xiàn)程序設計者的圖,可以加花括號來確定配對關系?例如:if()
{if()語句1}//這個語句是上一行if語句的內嵌ifelse
語句2//本行與第一個if配對{}限定了內嵌if語句的范圍,{}外的else不會與{}內的if配對?關系清楚,不易出錯?553.7.3條件運算符和條件表達式若在if語句中,當被判別的表達式的值為“真”或“假”時,都執(zhí)行一個賦值語句且給同一個變量賦值時,可以用簡單的條件運算符來處理?例如,若有以下if語句:if(a>b)max=a;elsemax=b;可以用條件運算符(?:)來處理:max=(a>b)?a:b;56
條件運算符要求有3個操作對象,稱三目(元)運算符,它是C++中惟一的一個三目運算符?條件表達式的一般形式為
表達式1?表達式2∶表達式3條件運算符的執(zhí)行順序是:先求解表達式1,若為非0(真)則求解表達式2,此時表達式2的值就作為整個條件表達式的值?若表達式1的值為0(假),則求解表達式3,表達式3的值就是整個條件表達式的值?“max=(a>b)?a:b”的執(zhí)行結果是將條件表達式的值賦給max?也就是將a和b二者中的大者賦給max?(條件運算符優(yōu)先于賦值運算符)57例3.7輸入一個字符,判別它是否為大寫字母,如果是,將它轉換成小寫字母;如果不是,不轉換?然后輸出最后得到的字符?#include<iostream>usingnamespacestd;intmain(){charch;cin>>ch;
ch=(ch>='A'&&ch<='Z')?(ch+32):ch;//判別ch是否大寫字母,是則轉換
cout<<ch<<endl;return0;}583.7.4多分支選擇結構和switch語句switch語句是多分支選擇語句,用來實現(xiàn)多分支選擇結構?它的一般形式如下:switch(表達式){case常量表達式1:語句1case常量表達式2:語句2...case常量表達式n:語句ndefault:語句n+1}59例如,要求按照考試成績的等級打印出百分制分數(shù)段。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后面括號內的“表達式”,可以為整型類型或字符類型?(2)當switch表達式的值與某一個case子句中的常量表達式的值相匹配時,就執(zhí)行此case子句中的內嵌語句,若所有的case子句中的常量表達式的值都不能與switch表達式的值匹配,就執(zhí)行default子句的內嵌語句?60(3)每一個case表達式的值必須互不相同,否則就會出現(xiàn)互相矛盾的現(xiàn)象(對表達式的同一個值,有兩種或多種執(zhí)行方案)?(4)各個case和default的出現(xiàn)次序不影響執(zhí)行結果?例如,可以先出現(xiàn)“default:…”,再出現(xiàn)“case'D':…”,然后是“case'A':…”?(5)執(zhí)行完一個case子句后,流程控制轉移到下一個case子句繼續(xù)執(zhí)行?“case常量表達式”只是起語句標號作用,并不是在該處進行條件判斷?在執(zhí)行switch語句時,根據(jù)switch表達式的值找到與之匹配的case子句,就從此case子句開始執(zhí)行下去,不再進行判斷?61switch(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";}若grade的值等于'A',則將連續(xù)輸出:
85~10070~8460~69<60error62因此,應該在執(zhí)行一個case子句后,使流程跳出switch結構,即終止switch語句的執(zhí)行?可以用一個break語句來達到此目的?將上面的switch結構改寫如下: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;}在case子句中雖然包含一個以上執(zhí)行語句,但可以不必用花括號括起來,會自動順序執(zhí)行本case子句中所有的執(zhí)行語句?63(6)多個case可以共用一組執(zhí)行語句,如...case'A':case'B':case'C':cout<<">60\n";break;...當grade的值為'A'?'B'或'C'時都執(zhí)行同一組語句?643.7.5編寫選擇結構的程序例3.8編寫程序,判斷某一年是否為閏年?intmain(){intyear;boolleap;cout<<"pleaseenteryear:";cin>>year;//輸入年份
if(year%4==0){if(year%100==0){if(year%400==0)//年份能被400整除
leap=true;//閏年
elseleap=false;//非閏年
}else//年份能被4整除但不能被100整除肯定是閏年
leap=true;//是閏年,令leap=true}else//年份不能被4整除肯定不是閏年
leap=false;運行情況如下:①2005↙2005isnotaleapyear.②1900↙1900isaleapyear.③2004↙2004isaleapyear.if(leap)cout<<year<<"is";elsecout<<year<<"isnot";cout<<"aleapyear."<<endl;return0;}65也可以用一個邏輯表達式包含所有的閏年條件,將上述if語句用下面的if語句代替:if((year%4==0&&year%100!=0)||(year%400==0))leap=true;elseleap=false;66例3.9運輸公司對用戶計算運費?路程(s)越遠,每公里運費越低?標準如下:s<250km沒有折扣
250≤s<5002%折扣
500≤s<10005%折扣1000≤s<20008%折扣2000≤s<300010%折扣3000≤s15%折扣設每公里每噸貨物的基本運費為p(price的縮寫),貨物重為w(wright的縮寫),距離為s,折扣為d(discount的縮寫),則總運費f(freight的縮寫)的計算公式為f=p*w*s*(1-d)67#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;
68switch(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=588000693.8循環(huán)結構和循環(huán)語句在人們所要處理的問題中常常遇到需要反復執(zhí)行某一操作的情況?這就需要用到循環(huán)控制?許多應用程序都包含循環(huán)?順序結構?選擇結構和循環(huán)結構是結構化程序設計的3種基本結構,是各種復雜程序的基本構造單元?因此程序設計者必須熟練掌握選擇結構和循環(huán)結構的概念及使用方法?703.8.1用while語句構成循環(huán)while語句的一般形式如下:while(表達式)語句其作用是:當指定的條件為真(表達式為非0)時,執(zhí)行while語句中的內嵌語句?其特點是:先判斷表達式,后執(zhí)行語句?while循環(huán)稱為當型循環(huán)?while語句對應的流程圖71例3.10求1+2+3+…+100?用流程圖表示的算法?#include<iostream>usingnamespacestd;intmain(){inti=1,sum=0;while(i<=100){sum=sum+i;i++;}cout<<"sum="<<sum<<endl;}運行結果為sum=505072需要注意:(1)循環(huán)體如果包含一個以上的語句,應該用花括號括起來,以復合語句形式出現(xiàn)?如果不加花括號,則while語句的范圍只到while后面第一個分號處?(2)在循環(huán)體中應有使循環(huán)趨向于結束的語句?733.8.2用do-while語句構成循環(huán)do-while語句的特點是先執(zhí)行循環(huán)體,然后判斷循環(huán)條件是否成立?其一般形式為do
語句
while(表達式);它是這樣執(zhí)行的:先執(zhí)行一次指定的語句(即循環(huán)體),然后判別表達式,當表達式的值為非零(“真”)時,返回重新執(zhí)行循環(huán)體語句,如此反復,直到表達式的值等于0為止,此時循環(huán)結束?74do
語句
while(表達式);do-while語句對應的流程圖75例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;}763.8.3用for語句構成循環(huán)C++中的for語句使用最為廣泛和靈活,不僅可以用于循環(huán)次數(shù)已經確定的情況,而且可以用于循環(huán)次數(shù)不確定而只給出循環(huán)結束條件的情況,它完全可以代替while語句?for語句的一般格式為
for(表達式1;表達式2;表達式3)語句它的執(zhí)行過程如下:(1)先求解表達式1?(2)求解表達式2,若其值為真(值為非0),則執(zhí)行for語句中指定的內嵌語句,然后執(zhí)行下面第(3)步?若為假(值為0),則結束循環(huán),轉到第(5)步?(3)求解表達式3?(4)轉回上面第(2)步驟繼續(xù)執(zhí)行?(5)循環(huán)結束,執(zhí)行for語句下面的一個語句?for語句對應的流程圖77
for語句最簡單的形式也是最容易理解的格式如下:
for(循環(huán)變量賦初值;循環(huán)條件;循環(huán)變量增值)語句例如for(i=1;i<=100;i++)sum=sum+i;它相當于以下語句:i=1;while(i<=100){sum=sum+i;i++;}for語句的使用有許多技巧,如果熟練地掌握和運用for語句,可以使程序精煉簡潔?顯然,用for語句簡單?方便?78說明:(1)for語句的一般格式中的“表達式1”可以省略,此時應在for語句之前給循環(huán)變量賦初值?i=1;for(;i<=100;i++)sum=sum+i;(2)如果表達式2省略,即不判斷循環(huán)條件,循環(huán)無終止地進行下去?也就是認為表達式2始終為真?for(i=1;;i++)sum=sum+i;
相當于:inti=1,sum=0;while(1){sum=sum+i;i++;}(3)表達式3也可以省略,但此時程序設計者
應另外設法保證循環(huán)能正常結束?for(i=1;i<=100;){sum=sum+i;i++;}(4)可以省略表達式1和表達式3,只有表達式2,即只給循環(huán)條件?for(;i<=100;){sum=sum+i;i++;}79(5)表達式2一般是關系表達式(如i<=100)或邏輯表達式(如a<b&&x<y),但也可以是數(shù)值表達式或字符表達式,只要其值為非零,就執(zhí)行循環(huán)體?
語句1:for(i=0;(c=getchar())!=‘\n’;i+=c);語句2:for(;(c=getchar())!=‘\n’;)cout<<c;80空語句循環(huán)體內完成的語句
運行結果:Computer↙Computer81C++中的for語句比其他語言中的循環(huán)語句功能強得多?可以把循環(huán)體和一些與循環(huán)控制無關的操作也作為表達式1或表達式3出現(xiàn),這樣程序可以短小簡潔?但過分地利用這一特點會使for語句顯得雜亂,可讀性降低,建議不要把與循環(huán)控制無關的內容放到for語句中?823.8.4循環(huán)的嵌套一個循環(huán)體內又包含另一個完整的循環(huán)結構,稱為循環(huán)的嵌套?內嵌的循環(huán)中還可以嵌套循環(huán),這就是多層循環(huán)?3種循環(huán)(while循環(huán)?dowhile循環(huán)和for循環(huán))可以互相嵌套?例如,下面幾種都是合法的形式:(1)while(){………while(){…}}83(2)do{┆do{…}while();}while();(3)for(;;){┆for(;;){…}}(4)while(){┆do{…}while();┆}(5)for(;;){┆while(){…}┆}(6)do{┆for(;;){…}}while();
843.8.5提前結束循環(huán)(break語句和continue語句)1.用break語句提前結束循環(huán)break語句的一般格式為
break;break語句可以使流程跳出switch結構,繼續(xù)執(zhí)行switch語句下面的一個語句?實際上,break語句還可以用于循環(huán)體內?其作用為使流程從循環(huán)體內跳出循環(huán)體,即提前結束循環(huán),接著執(zhí)行循環(huán)體下面的語句?break語句只能用于循環(huán)語句和switch語句內,不能單獨使用或用于其他語句中?852.用continue語句提前結束循環(huán)continue語句的一般格式為
continue;其作用為結束本次循環(huán),即跳過循環(huán)體中下面尚未執(zhí)行的語句,接著進行下一次是否執(zhí)行循環(huán)的判定?86continue語句和break語句的區(qū)別:continue語句只結束本次循環(huán),而不是終止整個循環(huán)的執(zhí)行?而break語句則是結束整個循環(huán)過程,不再判斷執(zhí)行循環(huán)的條件是否成立?
(1)
while(表達式1){if(表達式2)break;┆}(2)while(表達式1){if(表達式2)continue;┆}87continue語句對應的流程圖break語句對應的流程圖883.8.6編寫循環(huán)結構的程序例3.12用下面公式求π的近似值?直到最后一項的絕對值小于或等于10-7為止?#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;s=-s;t=s/n;}pi=pi*4;cout<<"pi="<<setiosflags(ios∷fixed)<<setprecision(6)<<pi<<endl;return0;}運行結果為pi=3.141592注意:
n的類型(double)若將它定義為int變量,
t=s/n;語句怎樣修改?
求實型表達式的絕對值89例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ù)學問
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030全球RGV小車行業(yè)調研及趨勢分析報告
- 2025年全球及中國變色包裝行業(yè)頭部企業(yè)市場占有率及排名調研報告
- 2025年全球及中國非電動弱勢群體用設備行業(yè)頭部企業(yè)市場占有率及排名調研報告
- 2025年全球及中國汽車燃油回流管路行業(yè)頭部企業(yè)市場占有率及排名調研報告
- 2025年全球及中國家庭一體化儲能系統(tǒng)行業(yè)頭部企業(yè)市場占有率及排名調研報告
- 2025年全球及中國一次性輸尿導管行業(yè)頭部企業(yè)市場占有率及排名調研報告
- 2025年度股東股權贈與合同2篇
- 2025年度高效節(jié)能消防泵房建設及維護服務合同范本3篇
- 專家講座服務合同:2024年高端講座邀請函一
- 二手房交易北京協(xié)議樣式2024年版版
- (T8聯(lián)考)2025屆高三部分重點中學12月第一次聯(lián)考評物理試卷(含答案詳解)
- 工程施工揚塵防治教育培訓
- 紅薯采購合同模板
- 2023年河南省公務員錄用考試《行測》真題及答案解析
- 2024年安徽省公務員錄用考試《行測》真題及答案解析
- 山西省太原市重點中學2025屆物理高一第一學期期末統(tǒng)考試題含解析
- 充電樁項目運營方案
- 2024年農民職業(yè)農業(yè)素質技能考試題庫(附含答案)
- 高考對聯(lián)題(對聯(lián)知識、高考真題及答案、對應練習題)
- 新版《鐵道概論》考試復習試題庫(含答案)
- 【律師承辦案件費用清單】(計時收費)模板
評論
0/150
提交評論