




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
第2章程序控制結構
2.1順序結構
2.2選擇結構
2.3循環結構
2.4控制轉向語句
2.5程序實例
1第2章程序控制結構
2.1順序結構
2.2按照語句出現的先后順序依次執行。2.1順序結構
語句1語句2圖2.1順序結構流程圖2按照語句出現的先后順序依次執行。2.1順序結構語句12.1.1定義語句說明語句在C++程序中,一個標識符(變量名、常量名、函數名、對象名等)在使用之前必須先定義,通知編譯器為其分配存儲空間,或告訴編譯器它的存在及其特征。例如:inta=0,b=3;constdoublepi=3.14159; intsum(int,int); floatscore[50][3]; 32.1.1定義語句說明語句32.1.2表達式語句形式:<表達式>;可以進行的操作通常包括賦值操作,復合賦值操作,增量、減量操作,函數調用操作和輸入輸出操作。例如: i++; --j; abs(x);cout<<a+b; cin>>i>>j;sum=a+b; a=b=c; i=1,j=2; b*=c; 42.1.2表達式語句形式:<表達式>;i++; s2.1.3復合語句形式: {<語句1><語句2>……<語句n>}作用:當程序中某個位置在語法上只允許一條語句,而在語義上要執行多條語句才能完成某個操作時,需要使用復合語句。例如:if(x==0){cout<<a;cout<<b;}52.1.3復合語句形式:例如:52.1.4空語句形式:;
作用:當程序中某個位置在語法上需要一條語句,而在語義上又不要求執行任何動作時,可放上一條空語句。一般適用于在循環語句中做空循環體例如:for(m=0;m<1000;m++);62.1.4空語句形式:;輸入和輸出并不是C++語言中的正式組成成分。C和C++本身都沒有為輸入和輸出提供專門的語句結構。輸入輸出不是由C++本身定義的,而是在編譯系統提供的I/O庫中定義的。C++的輸出和輸入是用“流”(stream)的方式實現的。圖3.2和圖3.3表示C++通過流進行輸入輸出的過程。2.1.5基本輸入輸出7輸入和輸出并不是C++語言中的正式組成成分。C和C++本身都圖3.2圖3.388有關流對象cin、cout和流運算符的定義等信息是存放在C++的輸入輸出流庫中的,因此如果在程序中使用cin、cout和流運算符,就必須使用預處理命令把頭文件stream包含到本文件中:#include<iostream>盡管cin和cout不是C++本身提供的語句,但是在不致混淆的情況下,為了敘述方便,常常把由cin和流提取運算符“>>”實現輸入的語句稱為輸入語句或cin語句,把由cout和流插入運算符“<<”實現輸出的語句稱為輸出語句或cout語句。根據C++的語法,凡是能實現某種操作而且最后以分號結束的都是語句。9有關流對象cin、cout和流運算符的定義等信息是存放在C+在C++中,所有輸入輸出是通過輸入輸出流來實現的。在C++中,將數據從一個對象到另一個對象的流動抽象為“流”。在iostream庫中包含一個標準輸入流對象cin和一個標準輸出流對象cout,分別用來實現從鍵盤讀取數據,以及將數據在屏幕上輸出。要使用cin和cout,需要在C++程序開頭加上如下包含命令:#include<iostream>//新標準中的頭文件名usingnamespacestd;//引入std名字空間中的標識符10在C++中,所有輸入輸出是通過輸入輸出流來實現的。101.標準輸入流cincin負責從鍵盤讀取數據,使用提取運算符“>>”就可以將鍵盤鍵入的數據讀入到變量中。語法格式:
cin>>變量1>>變量2>>…>>變量n;變量可以是任意數據類型,輸入時各個數據之間用空格鍵、Tab鍵或Enter鍵分隔。例如:inta,b;cin>>a>>b;鍵盤上輸入:93↙a9鍵盤b3鍵盤111.標準輸入流cincin負責從鍵盤讀取數據,使用提取運算2.標準輸出流cout負責將數據輸出到屏幕上,使用插入運算符“<<”就可以將數據顯示在屏幕上當前光標所在位置。語法格式:
cout<<表達式1<<表達式2<<…<<表達式n;表達式可以是任意類型的,數據輸出的格式由系統自動決定。122.標準輸出流cout負責將數據輸出到屏幕上,使用插入運算表2.1常用格式控制符格式控制符說明示例語句結果endl輸出換行符cout<<120<<endl<<240;120240dec十進制表示cout<<dec<<120;120hex十六進制表示cout<<hex<<120;78oct八進制表示cout<<oct<<120;170setw(intn)設置數據輸出的寬度cout<<'x'<<setw(3)<<'y';xy(中間有2個空格)13表2.1常用格式控制符格式控制符說明示例語表2.1常用格式控制符格式控制符說明示例語句結果setfill(charc)設置填充字符cout<<setfill('')<<setw(6)<<120;120setprecision(intn)設置浮點數的精度(有效數字位數或小數位數)cout<<setprecision(5)<<12.3456;12.346setiosflags(ios::fixed)定點格式輸出cout<<setiosflags(ios::fixed)<<12.3456789;12.345679setiosflags(ios::scientific)指數格式輸出cout<<setiosflags(ios::scientific)<<12.3456789;1.234568e+001浮點型默認精度為614表2.1常用格式控制符格式控制符說明示例語【例2.1】cout應用示例#include<iostream>usingnamespacestd;intmain(){ intm=2,n=8; doublepai_1=3.14159265; floatpai_2=3.141f; charch1='A',ch2='B'; boolok=true; cout<<"m="<<m<<endl; cout<<"n="<<n<<endl; cout<<"pai_1="<<pai_1<<",pai_2="<<pai_2<<endl; cout<<"ch1="<<ch1<<",ch2="<<ch2<<endl; cout<<"ok="<<ok<<endl; cout<<"!ok="<<!ok<<endl;return0;}圖2.2cout應用示例15【例2.1】cout應用示例#include<iostr【例2.2】使用格式控制符輸出數據#include<iostream>#include<iomanip>usingnamespacestd;intmain(){ inta=35; doubleb=12.3456789;
1:cout<<"1234567890123"<<endl;
2:cout<<dec<<a<<‘’<<hex<<a<<‘’<<oct<<a<<endl;//352343
3:cout<<b<<endl;//12.3457
4:cout<<setprecision(4)<<b<<endl;//
12.35
5:cout<<setw(10)<<b<<endl;//
12.35
6:cout<<setw(10)<<setfill('#')<<b<<endl;//
#####12.35
7:cout<<setiosflags(ios::scientific)<<b<<endl;//
1.2346e+001
8:cout<<setprecision(3)<<b<<endl;//1.235e+001
9:cout<<setprecision(2)<<b<<endl;//1.23e+001 return0;}16【例2.2】使用格式控制符輸出數據#include<io2.2選擇結構按照給定條件有選擇地執行程序中的語句C++中:if語句:實現n分支,要求n個表達式。switch語句:實現多分支,只用1個表達式。172.2選擇結構按照給定條件有選擇地執行程序中的語句172.2.1if語句1.if語句(單分支)語法格式:
if(表達式)語句說明:(1)表達式是任意的數值、字符、關系、邏輯表達式,它表示條件,以true(非0)表示真,false(0)表示假。表達式必須用圓括號括起來。(2)內嵌語句,可以是單條語句,或復合語句。執行順序182.2.1if語句1.if語句(單分支)執行順序18bat73773【例2.3】輸入兩個整數a和b,按從小到大的順序輸出這兩個數。分析若a>b,則將a、b交換,否則不交換。兩數交換可采用借助于第三個變量間接交換的方法if(a>b) {t=a;a=b;b=t;}19bat73773【例2.3】輸入兩個整數a和b,按從小到大的#include<iostream>usingnamespacestd;intmain(){ inta,b,t; cout<<"請輸入兩個整數a,b:"<<endl; cin>>a>>b; if(a>b) {t=a;a=b;b=t;} cout<<a<<'<'<<b<<endl;return0;}{a=a+b;b=a-b;a=a-b;}20#include<iostream>{a=a+b;b=a-2.if-else語句(雙分支)if(表達式)語句1else語句2true表達式語句1false語句2圖2.7雙分支if語句流程圖212.if-else語句(雙分支)if(表達式)true表【例2.4】輸入一個年份,判斷是否為閏年。分析閏年的年份可以被4整除而不能被100整除,或者能被400整除。#include<iostream>usingnamespacestd;intmain(){ intyear; cout<<"請輸入年份:"; cin>>year;
if((year%4==0&&year%100!=0)||(year%400==0))
cout<<year<<"年是閏年"<<endl; else
cout<<year<<"年不是閏年"<<endl;return0;}22【例2.4】輸入一個年份,判斷是否為閏年。分析閏年的年份可3.if-elseif語句(多分支)if(表達式1)語句1elseif(表達式2)語句2……elseif(表達式n)語句nelse語句n+1falsefalse…falsetruetrue表達式1
表達式2表達式n語句n語句n+1語句2語句1true233.if-elseif語句(多分支)if(表達式1)f【例2.5】根據x的值,計算分段函數y的值。y的計算公式為:24【例2.5】根據x的值,計算分段函數y的值。y的計算公式為:#include<iostream>#include<cmath>usingnamespacestd;intmain(){ doublex,y; cout<<"請輸入x:"; cin>>x;
if(x<0) y=fabs(x); elseif(x<10) y=exp(x)*sin(x); elseif(x<20) y=pow(x,3); else y=(3+2*x)*log(x); cout<<"y="<<y<<endl;return0;}圖2.10計算分段函數25#include<iostream>圖2.10計算分段函4.if語句的嵌套形式if或else后面的內嵌語句本身又是一個if語句例如:if(表達式1)
if(表達式2)語句1else語句2else
if(表達式3)語句3else語句4264.if語句的嵌套形式if或else后面的內嵌語句本身又是一(1)為了增強程序的可讀性,建議采用鋸齒型的書寫形式。(2)if語句嵌套時,else子句總是與在它前面、距它最近、且尚未匹配的if配對。(3)為明確匹配關系,避免匹配錯誤,建議將內嵌的if語句一律用“{}”括起來。if(x>0)
if(y>0)cout<<"x與y均大于0";elsecout<<"x大于0,y小于等于0";注意:如何使之與第一個if配對?27(1)為了增強程序的可讀性,建議采用鋸齒型的書寫形式。if【例2.6】從鍵盤上輸入兩個字符,比較其大小,輸出大于、等于和小于的判斷結果。#include<iostream>usingnamespacestd;intmain(){ charch1,ch2; cout<<"請輸入兩個字符:"; cin>>ch1>>ch2;
if(ch1!=ch2)
if(ch1>ch2) cout<<ch1<<"大于"<<ch2<<endl; else cout<<ch1<<"小于"<<ch2<<endl; else cout<<ch1<<"等于"<<ch2<<endl;return0;}28【例2.6】從鍵盤上輸入兩個字符,比較其大小,輸出大于、等于2.2.2switch語句switch(表達式){
case常量表達式1:語句1case常量表達式2:語句2…case常量表達式n:語句n[default:語句序列n+1]}注意:表達式只能是整型、字符型或枚舉型注意:常量表達式1~n的值必須各不相同。292.2.2switch語句switch(表達式)注意:有無無false有無falsetrue計算表達式的值常量表達式1語句1break常量表達式2語句2break無有false常量表達式ntrue語句nbreakdefault語句n+1true有圖2.12switch語句執行流程30有無無false有無falsetrue計算表達式的值常量表達【例2.7】將輸入的百分制成績按以下規定轉換成相應的等級:成績等級100~90優秀89~80良好79~70中等69~60及格59~0不及格31【例2.7】將輸入的百分制成績按以下規定轉換成相應的等級:#include<iostream>usingnamespacestd;intmain(){ floatscore; cout<<"請輸入成績:"; cin>>score; if(score>=0&&score<=100)
switch(int(score)/10) { case10: case9:cout<<score<<"分:優秀"<<endl;break; case8:cout<<score<<"分:良好"<<endl;break; case7:cout<<score<<"分:中等"<<endl;break; case6:cout<<score<<"分:及格"<<endl;break; default:cout<<score<<“分:不及格”<<endl; } else cout<<"輸入數據有誤!"<<endl;return0;}共用同一個語句組
思考:若省去break語句,情況會怎樣?
32#include<iostream>共用同一個語句組思考循環?利用計算機重復處理某些實際問題2.3循環結構33循環?利用計算機重復處理某些實際問題2.3循環結構33循環的引出
示例1
求1+2+3+4+5+...+100=?特點:1.步驟多2.工作雷同s=0;s=s+1;s=s+2;s=s+3;...s=s+100;100條s=s+ii=i+134循環的引出特點:2.工作雷同s=0;100條s=s+ii2.3.1while語句while(表達式)
語句falsetrue表達式語句圖2.14while語句流程圖循環體執行重復工作的語句循環判斷條件352.3.1while語句while(表達式)fa假表達式循環體真求1+2+3+4+5+...+100=?
s=0;s=s+1;s=s+2;s=s+3;...s=s+100;i<=100s=s+ii=i+1i是循環變量36假表達式循環體真求1+2+3+4+5+...+100=?【例2.8】求1+2+3+……+100#include<iostream>usingnamespacestd;intmain(){ inti(1),sum(0);//定義變量,初始化
while(i<=100)//構造循環
{
sum+=i;
//循環體,多次執行
i++; } cout<<"sum="<<sum<<endl;return0;}sumi第1次初始值0112第2次33...第99次4950100第100次505010137【例2.8】求1+2+3+……+100#include<2.3.2do-while語句do語句while(表達式);falsetrue表達式語句圖2.15do-while語句流程圖382.3.2do-while語句dofalsetrue表達【例2.10】求自然數1~100之和,要求用do-while語句實現。#include<iostream>usingnamespacestd;intmain(){ inti(1),sum(0);
do {
sum+=i;
i++; }while(i<=100); cout<<"sum="<<sum<<endl;return0;}inti(1),sum(0);while(i<=100)
{
sum+=i;
i++;}循環體和條件表達式都相同39【例2.10】求自然數1~100之和,要求用do-whilwhile(1>2)cout<<”IlikeC++!”<<endl;//相當于一個空操作語句docout<<”IlikeC++!”<<endl;while(1>2);//輸出一行文字信息:IlikeC++!注意:當第一次循環表達式的值為真時,while與do-while的結果完全一樣,否則結果不相同。若while后面的表達式一開始就是為假時,兩種循環結果相同嗎?40while(1>2)注意:若while后面的表達式一開始就是【例2.11】輸入一個自然數,將該數的每一位數字按反序輸出。例如:輸入12345,輸出54321。#include<iostream>usingnamespacestd;voidmain(){ unsignedlongintnum,digital; cout<<"請輸入一個自然數:"; cin>>num;
do {
digital=num%10;
num/=10;
cout<<digital; }while(num>0); cout<<endl;}41【例2.11】輸入一個自然數,將該數的每一位數字按反序輸出。for(表達式1;表達式2;表達式3
)<語句>表達式2執行<語句>非00退出循環表達式1表達式32.3.3for語句循環變量賦初值循環判斷條件改變循環變量42for(表達式1;表達式2;表達式3)表達式2執行<語句>【例2.12】求自然數1~100之和,要求用for語句實現。#include<iostream>usingnamespacestd;intmain(){ inti,sum(0); for(i=1;i<=100;i++)
sum+=i; cout<<"sum="<<sum<<endl;return0;}43【例2.12】求自然數1~100之和,要求用for語句實現。for(表達式1;表達式2;表達式3
)<語句>表達式1;while(表達式2){<語句>;
表達式3;}44for(表達式1;表達式2;表達式3)表達式1;44【例2.13】一個小球從100米高處落下,每次落地后反彈回原高度的一半,再落下。求它在第10次落地時共經過多少米?第10次反彈多高?分析:第1次落地時經過的米數為s=100第1次落地后反彈高度為h=100/2第2次落地時經過的米數為s=100+h*2第2次落地后反彈高度為h=h/2第3次落地時經過的米數為s=s+h*2……45【例2.13】一個小球從100米高處落下,每次落地后反彈回#include<iostream>#include<iomanip>usingnamespacestd;intmain(){ floats=100.0,h=s/2;
for(inti=2;i<=10;i++) {
s=s+h*2;
h=h/2; }cout<<setiosflags(ios::fixed)<<setprecision(3); cout<<"第10次落地時,共經過"<<s<<"米;"<<"反彈的高度是"<<h<<"米"<<endl;return0;}思考該小球反彈多少次才能靜止下來?46#include<iostream>思考該小球反彈多少注意:for語句中的三個表達式可以部分省略或全部省略,但;不能省略,若省略表達式2,則表示循環條件為真。for(;i<=100;i++)//省略表達式1,注意其后的分號不能省
sum+=i;intsum=0;for(inti=1;;i++)//省略表達式2,注意其后的分號同樣不能省{sum+=i;if(i>=100)break};//break語句用于跳出循環intsum=0;for(inti=1;i<=100;)//省略表達式3sum+=i++; //在循環體中對循環變量i遞增47注意:for語句中的三個表達式可以部分省略或全部省略,但;不inti=1,sum=0;for(;;){sum+=i++; if(i>100)break;}三個表達式都可以是任何類型的C++表達式。inti,sum;for(i=1,sum=0;i<=100;sum+=i,i++);表達式1可以是變量定義語句,即循環控制變量可在其中定義。intsum=0;for(inti=1;i<=100;i++)sum+=i;48inti=1,sum=0;三個表達式都可以是任何類型的C在屏幕上顯示平面圖形****************
for(j=1;j<=2*i-1;j++)cout<<’*’;i:行號for(i=1;i<=4;i++){}cout<<endl;****************2.3.4多重循環49在屏幕上顯示平面圖形for(j=1;j<=2*i-1循環嵌套:循環體內包含另一個完整的循環結構。三種循環語句皆可以相互嵌套。…for(…){…while(…){…}do{…}while(…);…}50循環嵌套:循環體內包含另一個完整的循環結構。…50【例2.14】編程顯示輸出九九乘法表圖2.19九九乘法表運行界面51【例2.14】編程顯示輸出九九乘法表圖2.19九九truefalsei=1i<=9?truefalsej=1j<=9?顯示i*j表達式j++i++#include<iostream>usingnamespacestd;intmain(){cout<<"\t\t\t九九乘法表"<<endl;cout<<"\t\t\t------------------"<<endl;
for(inti=1;i<=9;i++){
for(intj=1;j<=9;j++)
cout<<i<<"×"<<j<<'='<<i*j<<'\t';cout<<endl;}return0;}52truefalsei=1i<=9?truefalsej=1圖2.21下三角的九九乘法表圖2.22上三角的九九乘法表思考:打印上三角或下三角程序如何改動?53圖2.21下三角的九九乘法表圖2.22上三角的九九乘注意:(1)內循環控制變量與外循環控制變量不能同名。
(2)外循環必須完全包含內循環,不能交叉。
(3)若循環體內有if語句,或if語句內有循環語句,也不能交叉。
(4)利用goto語句可以從循環體內轉向循環體外,但絕對不允許從循環體外轉入循環體內。
(5)當嵌套使用各種循環語句時,特別需要嚴格按照縮進規則來書寫程序。有時還應適當配以注釋,以保持清晰易辯的結構特征。54注意:(1)內循環控制變量與外循環控制變量不能同名。
(2)2.4控制轉向語句2.4.1break語句break;用于下列兩種情況:1、在開關語句中,其功能是退出開關語句,執行其后的語句;2、在循環體中,其功能是用來退出該重循環552.4控制轉向語句2.4.1break語句break【例2.15】從鍵盤上輸入若干個正整數,直到輸入負整數為止,計算并輸出顯示已輸入的正整數之和。輸入的數不超過20個。
#include<iostream>usingnamespacestd;constintM=20;intmain(){ inti,n,sum=0; cout<<"請輸入若干個正整數(輸入負數就結束輸入):"<<endl; for(i=0;i<M;i++) { cin>>n;
if(n<0)break;//當輸入負數時,就退出循環 sum+=n; } cout<<"輸入的正整數之和為:"<<sum<<endl;return0;}56【例2.15】從鍵盤上輸入若干個正整數,直到輸入負整數為2.4.2continue語句格式:continue;功能:只用在循環體中,用來結束該次循環。在循環體中遇到continue語句時,本次循環結束,回到循環條件判斷是否執行下一次循環。572.4.2continue語句格式:57在while和do-while循環結構中,continue語句將使執行流程直接跳轉到循環條件的判定部分,然后決定循環是否繼續進行。在for循環結構中,當遇到continue時,執行流程將跳過循環體中余下的語句,而轉去執行for語句中的表達式3,然后根據表達式2進行循環條件的判定以決定是否繼續執行for循環體。58在while和do-while循環結構中,continue語while(i<=100){
break;
}cout<<sum<<endl;while(i<=100){
continue;
}break和continue語句的區別59while(i<=100)while(i<=100)brea【例2.16】輸出100以內能夠被7整除的所有整數。#include<iostream>#include<iomanip>usingnamespacestd;intmain(){ for(inti=1;i<=100;i++) {
if(i%7!=0)
continue;//如果i不能被7整除,則退出本次循環
cout<<setw(5)<<i; } cout<<endl;return0;}思考:(1)將continue改為break,則輸出有什么變化?(2)不采用continue語句,用其它方法如何實現?60【例2.16】輸出100以內能夠被7整除的所有整數。#i2.4.3goto語句goto標號;標號:語句;標號語句將流程轉到標號所指定的標號語句處。612.4.3goto語句goto標號;標號語句將流程轉到【例2.17】利用goto語句實現計算前100個自然數之和并輸出結果#include<iostream>usingnamespacestd;intmain(){ inti=1,sum=0;
loop:sum+=i; i++; if(i<=100)
gotoloop;
cout<<"sum="<<sum<<endl;return0;}62【例2.17】利用goto語句實現計算前100個自然數之和2.5程序實例【例2.18】輸入兩個正整數,求最大公約數。算法思想:(1)對于已知兩數m,n,使得m>n(2)m除以n得余數r(3)若r=0,則n為最大公約數,結束;否則執行(4)(4)m←n,n←r,再重復執行(2)mnr1252521210輾轉相除法while((r=m%n)!=0){m=n;n=r;}cout<<n;632.5程序實例【例2.18】輸入兩個正整數,求最大公#include<iostream>usingnamespacestd;intmain(){ intm,n,t,r; cout<<"請輸入兩個正整數:"; cin>>m>>n;
if(m<n){t=m;m=n;n=t;}//使得m>=n
while((r=m%n)!=0)
{ m=n; n=r; } cout<<"最大公約數為:"<<n<<endl;return0;}64#include<iostream>64【例
2.19】顯示輸出3~100之間的所有素數。分析:(1)素數:一個大于1的除了它自身和1以外,不能被其它任何正整數所整除的整數。判別某數m是否為素數,最簡單的方法是:用i=2,3,,m-1逐個除,只要有一個能整除,m就不是素數,可以用break提前結束循環;若都不能整除,則m是素數。(2)如果m不是素數,則必然能被分解為兩個因子a和b,并且其中之一必然小于等于sqrt(m)
,另一個必然大于等于sqrt(m)。所以要判斷m是否為素數,可簡化為判斷它能否被2至sqrt(m)之間的數整除即可。因為若m不能被2至sqrt(m)之間的數整除,則必然也不能被sqrt(m)至m-1之間的數整除。(3)在退出循環以后,如果是因為找到了一個能整除m的數而通過break退出循環的,則i<=sqrt(m);反之,如果是正常退出循環的,則i=sqrt(m)+1。因此,在循環結束后,只要判斷i是否大于sqrt(m),若是,則表明m是素數,輸出該素數。(4)要判斷多個數是否為素數,需要使用雙重循環。外循環每循環一次提供一個數,由內循環通過多次除法判斷其是否為素數。65【例2.19】顯示輸出3~100之間的所有素數。分析:6#include<iostream>#include<cmath>usingnamespacestd;intmain(){ cout<<"3~100之間的素數是:"<<endl;for(intm=3;m<100;m+=2) { intk=int(sqrt(m));
for(inti=2;i<=k;i++)
if(m%i==0)break;
if(i>k)
cout<<m<<'\t'; } cout<<endl;return0;}66#include<iostream>66【例2.20】輸入x,計算sin(x)。計算公式為:當第n項的絕對值小于10-6時結束。分析:關鍵是找部分級數和的通項:67【例2.20】輸入x,計算sin(x)。計算公式為:當第…… intn=1; doublex,t,sinx(0);//變量t保存每一項的值;給sinx變量賦初值0 cout<<"請輸入x的值:"; cin>>x;
t=x;//將求和式的第一項值x賦給t
while(fabs(t)>=0.000001) {
sinx+=t;
t=-t*x*x/((n+1)*(n+2));
n+=2; } cout<<"編程求得的sin("<<x<<")="<<sinx<<endl;
cout<<"調用標準函數求得的sin("<<x<<")="<<sin(x)<<endl;
…………68……68【例2.21】求“水仙花數”。所謂“水仙花數”是指一個三位正整數,其各位數字的立方和等于該數本身。
例如:153=13+53+33。方法1:利用三重循環編寫程序因為“水仙花數”是三位整數,所以取值范圍為100~999。外循環變量i控制百位數字從1變化到9中層循環變量j控制十位數字從0變化到9內循環變量k控制個位數字從0變化到9。……inti,j,k,n;cout<<"水仙花數:";for(i=1;i<=9;i++)
for(j=0;j<=9;j++) for(k=0;k<=9;k++){m=i*i*i+j*j*j+k*k*k;n=100*i+10*j+k;
if(m==n)
cout<<m<<'';}……69【例2.21】求“水仙花數”。所謂“水仙花數”是指一個三方法2:不使用循環嵌套,只用1個for語句編寫程序。…………intmain(){ inti,j,k,n; cout<<"水仙花數:";
for(n=100;n<1000;n++) {
i=n/100;//i為百位數字 j=n/10-i*10;//j為十位數字 k=n%10;//k為個位數字
if(i*i*i+j*j*j+k*k*k==n)
cout<<n<<''; }…………70方法2:不使用循環嵌套,只用1個for語句編寫程序。…………【例2.22】用“枚舉法”求解百元買百雞問題。假定公雞5元1只,母雞3元1只,小雞1元3只,現在有100元錢要買100只雞,且需包含公雞、母雞和小雞,編程列出所有可能的購雞方案。分析
設公雞、母雞、小雞各為x、y、z只,可列出方程:采用試湊法(也稱為窮舉法或枚舉法)來實現,即將可能出現的各種情況一一羅列測試,判斷是否滿足條件,采用循環結構來實現。71【例2.22】用“枚舉法”求解百元買百雞問題。假定公雞5#include<iostream>usingnamespacestd;intmain(){ intx,y,z; cout<<"公雞數\t"<<"母雞數\t"<<"小雞數\t"<<endl; for(x=1;x<=19;x++)
//公雞最多買(100-3-1/3)/5只
for(y=1;y<=31;y++)
//母雞最多買(100-5-1/3)/3只 {
z=100-x-y;
if(5*x+3*y+z/3.0==100) cout<<x<<'\t'<<y<<'\t'<<z<<endl; }return0;}72#include<iostream>72【例2.23】用牛頓迭代法求一元方程2x3-4x2+3x-6=0在x=1.5附近的根,要求精度為10-6。分析:“迭代法”又稱為“遞推法”,其基本思想是把一個復雜的計算過程轉化為簡單過程的多次重復,每次重復都是從舊值的基礎上遞推出新值,并由新值代替舊值。圖2.29牛頓迭代法示意圖f(x1)x3y0CBAxx1x2
x4D曲線在A點的斜率為:f'(x1)=f(x1)/(x1-x2)x2=x1-f(x1)/f'(x1)Xn+1=xn-f(xn)/f'(xn)輸入x1值,由公式求出x2,再由x2從公式求出x3,......,直到|xn+1-xn|﹤10-6時可視xn+1為方程f(x)=0在X1附近的一個近似根。73【例2.23】用牛頓迭代法求一元方程2x3-4x2+3x-在本題中,用f表示f(xn),用f1表示f'(xn),得:f=2xn3-4xn2+3xn-6=(2(xn-2)xn+3)xn-6f1=6xn2-8xn+3
=2(3xn-4)xn+3在程序中,用xn表示xn,用xn1表示xn+174在本題中,用f表示f(xn),用f1表示f'(xn),得#include<iostream>#include<cmath>usingnamespacestd;intmain(){ floatxn,xn1,f,f1; cout<<"請輸入x的初值:"; cin>>xn1;
do {
xn=xn1;
f=(2*(xn-2)*xn+3)*xn-6;
f1=2*(3*xn-4)*xn+3;
xn1=xn-f/f1; }while(fabs(xn1-xn)>=1e-6); cout<<"方程的一個根為:"<<xn1<<endl;return0;}75#include<iostream>75第2章程序控制結構
2.1順序結構
2.2選擇結構
2.3循環結構
2.4控制轉向語句
2.5程序實例
76第2章程序控制結構
2.1順序結構
2.2按照語句出現的先后順序依次執行。2.1順序結構
語句1語句2圖2.1順序結構流程圖77按照語句出現的先后順序依次執行。2.1順序結構語句12.1.1定義語句說明語句在C++程序中,一個標識符(變量名、常量名、函數名、對象名等)在使用之前必須先定義,通知編譯器為其分配存儲空間,或告訴編譯器它的存在及其特征。例如:inta=0,b=3;constdoublepi=3.14159; intsum(int,int); floatscore[50][3]; 782.1.1定義語句說明語句32.1.2表達式語句形式:<表達式>;可以進行的操作通常包括賦值操作,復合賦值操作,增量、減量操作,函數調用操作和輸入輸出操作。例如: i++; --j; abs(x);cout<<a+b; cin>>i>>j;sum=a+b; a=b=c; i=1,j=2; b*=c; 792.1.2表達式語句形式:<表達式>;i++; s2.1.3復合語句形式: {<語句1><語句2>……<語句n>}作用:當程序中某個位置在語法上只允許一條語句,而在語義上要執行多條語句才能完成某個操作時,需要使用復合語句。例如:if(x==0){cout<<a;cout<<b;}802.1.3復合語句形式:例如:52.1.4空語句形式:;
作用:當程序中某個位置在語法上需要一條語句,而在語義上又不要求執行任何動作時,可放上一條空語句。一般適用于在循環語句中做空循環體例如:for(m=0;m<1000;m++);812.1.4空語句形式:;輸入和輸出并不是C++語言中的正式組成成分。C和C++本身都沒有為輸入和輸出提供專門的語句結構。輸入輸出不是由C++本身定義的,而是在編譯系統提供的I/O庫中定義的。C++的輸出和輸入是用“流”(stream)的方式實現的。圖3.2和圖3.3表示C++通過流進行輸入輸出的過程。2.1.5基本輸入輸出82輸入和輸出并不是C++語言中的正式組成成分。C和C++本身都圖3.2圖3.3838有關流對象cin、cout和流運算符的定義等信息是存放在C++的輸入輸出流庫中的,因此如果在程序中使用cin、cout和流運算符,就必須使用預處理命令把頭文件stream包含到本文件中:#include<iostream>盡管cin和cout不是C++本身提供的語句,但是在不致混淆的情況下,為了敘述方便,常常把由cin和流提取運算符“>>”實現輸入的語句稱為輸入語句或cin語句,把由cout和流插入運算符“<<”實現輸出的語句稱為輸出語句或cout語句。根據C++的語法,凡是能實現某種操作而且最后以分號結束的都是語句。84有關流對象cin、cout和流運算符的定義等信息是存放在C+在C++中,所有輸入輸出是通過輸入輸出流來實現的。在C++中,將數據從一個對象到另一個對象的流動抽象為“流”。在iostream庫中包含一個標準輸入流對象cin和一個標準輸出流對象cout,分別用來實現從鍵盤讀取數據,以及將數據在屏幕上輸出。要使用cin和cout,需要在C++程序開頭加上如下包含命令:#include<iostream>//新標準中的頭文件名usingnamespacestd;//引入std名字空間中的標識符85在C++中,所有輸入輸出是通過輸入輸出流來實現的。101.標準輸入流cincin負責從鍵盤讀取數據,使用提取運算符“>>”就可以將鍵盤鍵入的數據讀入到變量中。語法格式:
cin>>變量1>>變量2>>…>>變量n;變量可以是任意數據類型,輸入時各個數據之間用空格鍵、Tab鍵或Enter鍵分隔。例如:inta,b;cin>>a>>b;鍵盤上輸入:93↙a9鍵盤b3鍵盤861.標準輸入流cincin負責從鍵盤讀取數據,使用提取運算2.標準輸出流cout負責將數據輸出到屏幕上,使用插入運算符“<<”就可以將數據顯示在屏幕上當前光標所在位置。語法格式:
cout<<表達式1<<表達式2<<…<<表達式n;表達式可以是任意類型的,數據輸出的格式由系統自動決定。872.標準輸出流cout負責將數據輸出到屏幕上,使用插入運算表2.1常用格式控制符格式控制符說明示例語句結果endl輸出換行符cout<<120<<endl<<240;120240dec十進制表示cout<<dec<<120;120hex十六進制表示cout<<hex<<120;78oct八進制表示cout<<oct<<120;170setw(intn)設置數據輸出的寬度cout<<'x'<<setw(3)<<'y';xy(中間有2個空格)88表2.1常用格式控制符格式控制符說明示例語表2.1常用格式控制符格式控制符說明示例語句結果setfill(charc)設置填充字符cout<<setfill('')<<setw(6)<<120;120setprecision(intn)設置浮點數的精度(有效數字位數或小數位數)cout<<setprecision(5)<<12.3456;12.346setiosflags(ios::fixed)定點格式輸出cout<<setiosflags(ios::fixed)<<12.3456789;12.345679setiosflags(ios::scientific)指數格式輸出cout<<setiosflags(ios::scientific)<<12.3456789;1.234568e+001浮點型默認精度為689表2.1常用格式控制符格式控制符說明示例語【例2.1】cout應用示例#include<iostream>usingnamespacestd;intmain(){ intm=2,n=8; doublepai_1=3.14159265; floatpai_2=3.141f; charch1='A',ch2='B'; boolok=true; cout<<"m="<<m<<endl; cout<<"n="<<n<<endl; cout<<"pai_1="<<pai_1<<",pai_2="<<pai_2<<endl; cout<<"ch1="<<ch1<<",ch2="<<ch2<<endl; cout<<"ok="<<ok<<endl; cout<<"!ok="<<!ok<<endl;return0;}圖2.2cout應用示例90【例2.1】cout應用示例#include<iostr【例2.2】使用格式控制符輸出數據#include<iostream>#include<iomanip>usingnamespacestd;intmain(){ inta=35; doubleb=12.3456789;
1:cout<<"1234567890123"<<endl;
2:cout<<dec<<a<<‘’<<hex<<a<<‘’<<oct<<a<<endl;//352343
3:cout<<b<<endl;//12.3457
4:cout<<setprecision(4)<<b<<endl;//
12.35
5:cout<<setw(10)<<b<<endl;//
12.35
6:cout<<setw(10)<<setfill('#')<<b<<endl;//
#####12.35
7:cout<<setiosflags(ios::scientific)<<b<<endl;//
1.2346e+001
8:cout<<setprecision(3)<<b<<endl;//1.235e+001
9:cout<<setprecision(2)<<b<<endl;//1.23e+001 return0;}91【例2.2】使用格式控制符輸出數據#include<io2.2選擇結構按照給定條件有選擇地執行程序中的語句C++中:if語句:實現n分支,要求n個表達式。switch語句:實現多分支,只用1個表達式。922.2選擇結構按照給定條件有選擇地執行程序中的語句172.2.1if語句1.if語句(單分支)語法格式:
if(表達式)語句說明:(1)表達式是任意的數值、字符、關系、邏輯表達式,它表示條件,以true(非0)表示真,false(0)表示假。表達式必須用圓括號括起來。(2)內嵌語句,可以是單條語句,或復合語句。執行順序932.2.1if語句1.if語句(單分支)執行順序18bat73773【例2.3】輸入兩個整數a和b,按從小到大的順序輸出這兩個數。分析若a>b,則將a、b交換,否則不交換。兩數交換可采用借助于第三個變量間接交換的方法if(a>b) {t=a;a=b;b=t;}94bat73773【例2.3】輸入兩個整數a和b,按從小到大的#include<iostream>usingnamespacestd;intmain(){ inta,b,t; cout<<"請輸入兩個整數a,b:"<<endl; cin>>a>>b; if(a>b) {t=a;a=b;b=t;} cout<<a<<'<'<<b<<endl;return0;}{a=a+b;b=a-b;a=a-b;}95#include<iostream>{a=a+b;b=a-2.if-else語句(雙分支)if(表達式)語句1else語句2true表達式語句1false語句2圖2.7雙分支if語句流程圖962.if-else語句(雙分支)if(表達式)true表【例2.4】輸入一個年份,判斷是否為閏年。分析閏年的年份可以被4整除而不能被100整除,或者能被400整除。#include<iostream>usingnamespacestd;intmain(){ intyear; cout<<"請輸入年份:"; cin>>year;
if((year%4==0&&year%100!=0)||(year%400==0))
cout<<year<<"年是閏年"<<endl; else
cout<<year<<"年不是閏年"<<endl;return0;}97【例2.4】輸入一個年份,判斷是否為閏年。分析閏年的年份可3.if-elseif語句(多分支)if(表達式1)語句1elseif(表達式2)語句2……elseif(表達式n)語句nelse語句n+1falsefalse…falsetruetrue表達式1
表達式2表達式n語句n語句n+1語句2語句1true983.if-elseif語句(多分支)if(表達式1)f【例2.5】根據x的值,計算分段函數y的值。y的計算公式為:99【例2.5】根據x的值,計算分段函數y的值。y的計算公式為:#include<iostream>#include<cmath>usingnamespacestd;intmain(){ doublex,y; cout<<"請輸入x:"; cin>>x;
if(x<0) y=fabs(x); elseif(x<10) y=exp(x)*sin(x); elseif(x<20) y=pow(x,3); else y=(3+2*x)*log(x); cout<<"y="<<y<<endl;return0;}圖2.10計算分段函數100#include<iostream>圖2.10計算分段函4.if語句的嵌套形式if或else后面的內嵌語句本身又是一個if語句例如:if(表達式1)
if(表達式2)語句1else語句2else
if(表達式3)語句3else語句41014.if語句的嵌套形式if或else后面的內嵌語句本身又是一(1)為了增強程序的可讀性,建議采用鋸齒型的書寫形式。(2)if語句嵌套時,else子句總是與在它前面、距它最近、且尚未匹配的if配對。(3)為明確匹配關系,避免匹配錯誤,建議將內嵌的if語句一律用“{}”括起來。if(x>0)
if(y>0)cout<<"x與y均大于0";elsecout<<"x大于0,y小于等于0";注意:如何使之與第一個if配對?102(1)為了增強程序的可讀性,建議采用鋸齒型的書寫形式。if【例2.6】從鍵盤上輸入兩個字符,比較其大小,輸出大于、等于和小于的判斷結果。#include<iostream>usingnamespacestd;intmain(){ charch1,ch2; cout<<"請輸入兩個字符:"; cin>>ch1>>ch2;
if(ch1!=ch2)
if(ch1>ch2) cout<<ch1<<"大于"<<ch2<<endl; else cout<<ch1<<"小于"<<ch2<<endl; else cout<<ch1<<"等于"<<ch2<<endl;return0;}103【例2.6】從鍵盤上輸入兩個字符,比較其大小,輸出大于、等于2.2.2switch語句switch(表達式){
case常量表達式1:語句1case常量表達式2:語句2…case常量表達式n:語句n[default:語句序列n+1]}注意:表達式只能是整型、字符型或枚舉型注意:常量表達式1~n的值必須各不相同。1042.2.2switch語句switch(表達式)注意:有無無false有無falsetrue計算表達式的值常量表達式1語句1break常量表達式2語句2break無有false常量表達式ntrue語句nbreakdefault語句n+1true有圖2.12switch語句執行流程105有無無false有無falsetrue計算表達式的值常量表達【例2.7】將輸入的百分制成績按以下規定轉換成相應的等級:成績等級100~90優秀89~80良好79~70中等69~60及格59~0不及格106【例2.7】將輸入的百分制成績按以下規定轉換成相應的等級:#include<iostream>usingnamespacestd;intmain(){ floatscore; cout<<"請輸入成績:"; cin>>score; if(score>=0&&score<=100)
switch(int(score)/10) { case10: case9:cout<<score<<"分:優秀"<<endl;break; case8:cout<<score<<"分:良好"<<endl;break; case7:cout<<score<<"分:中等"<<endl;break; case6:cout<<score<<"分:及格"<<endl;break; default:cout<<score<<“分:不及格”<<endl; } else cout<<"輸入數據有誤!"<<endl;return0;}共用同一個語句組
思考:若省去break語句,情況會怎樣?
107#include<iostream>共用同一個語句組思考循環?利用計算機重復處理某些實際問題2.3循環結構108循環?利用計算機重復處理某些實際問題2.3循環結構33循環的引出
示例1
求1+2+3+4+5+...+100=?特點:1.步驟多2.工作雷同s=0;s=s+1;s=s+2;s=s+3;...s=s+100;100條s=s+ii=i+1109循環的引出特點:2.工作雷同s=0;100條s=s+ii2.3.1while語句while(表達式)
語句falsetrue表達式語句圖2.14while語句流程圖循環體執行重復工作的語句循環判斷條件1102.3.1while語句while(表達式)fa假表達式循環體真求1+2+3+4+5+...+100=?
s=0;s=s+1;s=s+2;s=s+3;...s=s+100;i<=100s=s+ii=i+1i是循環變量111假表達式循環體真求1+2+3+4+5+...+100=?【例2.8】求1+2+3+……+100#include<iostream>usingnamespacestd;intmain(){ inti(1),sum(0);//定義變量,初始化
while(i<=100)//構造循環
{
sum+=i;
//循環體,多次執行
i++; } cout<<"sum="<<sum<<endl;return0;}sumi第1次初始值0112第2次33...第99次4950100第100次5050101112【例2.8】求1+2+3+……+100#include<2.3.2do-while語句do語句while(表達式);falsetrue表達式語句圖2.15
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 英語教育行業專業術語練習題
- 五年級語文古詩賞析與背景知識
- 網絡運營服務協議條款說明
- 《物理公式記憶與實際應用教案》
- 數學公式與計算能力測試卷
- 教育經費投入情況統計表格(年度)
- 零售商店經營數據表
- 地理自然環境保護練習題
- 電力電氣工程基礎習題集萃
- 一氧化碳中試平臺的經濟效益評估與投資回報分析
- 九師聯盟2024-2025學年高二下學期6月摸底聯考語文試題(含答案)
- 非遺文化掐絲琺瑯景泰藍
- 電動葫蘆考試題及答案
- 2025廣東省勞動合同樣本
- 2025餐飲兼職合同樣本
- 農資安全宣傳課件
- 綠色營銷試題及答案詳解
- 2025年三級電子商務師(網商)理論考試題庫(濃縮500題)
- 2025年下半年浙江省杭州建德市部分事業單位招聘(134人)易考易錯模擬試題(共500題)試卷后附參考答案
- 炎癥性腸病營養治療專家共識(第三版)解讀課件
- 2025國家開放大學電大【信息管理概論】形考12答案 及 一體化終結性測試答案
評論
0/150
提交評論