聲明
本系列來至中國大學(xué)慕課-闞道宏老師的C++系列課程的相關(guān)課堂筆記卓缰,闞道宏老師講解細膩慌盯、精準(zhǔn),由淺入深姚炕,徐徐漸進摊欠,有興趣的可以去中國大學(xué)慕課上查看闞道宏老師的相關(guān)課程。
本文僅用于學(xué)習(xí)交流柱宦,若有侵權(quán)些椒,請聯(lián)系我
算法與控制結(jié)構(gòu)
一個完成某種特定任務(wù)的過程,可分解成一組操作步驟掸刊,這組操作步驟即構(gòu)成一個算法免糕。
一、算法
程序設(shè)計過程中,程序員將完成某種程序功能的過程说墨,分解成一組可被計算機執(zhí)行的操作步驟骏全,這組操作步驟就叫算法。
1.1 算法設(shè)計的方法
- 流程圖
- 偽代碼
- 自然語言
1.2 算法結(jié)構(gòu)
- 順序結(jié)構(gòu):按照書寫順序依次執(zhí)行操作步驟的算法
- 選擇結(jié)構(gòu):某些操作步驟需要滿足特定條件才被執(zhí)行的算法
- 循環(huán)結(jié)構(gòu):滿足特定條件下尼斧,將循環(huán)執(zhí)行某些操作步驟的算法
1.3 條件
選擇結(jié)構(gòu)和循環(huán)結(jié)構(gòu)都需要用到條件姜贡,條件成立,我們稱這個條件為真棺棵,否則稱之為假楼咳,C++語言使用布爾類型來表達條件的真假,通過關(guān)系運算符構(gòu)成的關(guān)系表達式來描述條件烛恤。還可以根據(jù)邏輯運算符構(gòu)成的邏輯表達式來符合條件母怜。
- 布爾類型:真(true)/假(false)
- 關(guān)系運算符:大于(>)、大于等于(>=)缚柏、小于(<)苹熏、小于等于(<=)、不等于(!=)币喧、等于(==)
- 邏輯運算符:與(&&)轨域、或(||)、非(!)
使用C++語言杀餐,將設(shè)計好的算法干发,編寫成一組語句序列,這就是C++源程序史翘,為了描述選擇結(jié)構(gòu)和循環(huán)結(jié)構(gòu)的算法枉长,C++分別提供了選擇語句和循環(huán)語句。
二琼讽、布爾類型
2.1 布爾類型數(shù)據(jù)的基本概念
布爾(bool)類型:true必峰、false,true和false都是關(guān)鍵字跨琳,可以定義布爾類型變量保存布爾型數(shù)據(jù)自点,一個布爾型變量占用1個字節(jié),計算機只能存儲數(shù)值數(shù)據(jù)脉让,因此計算機內(nèi)部以1表示true桂敛,0表示false。
#include <iostream>
using namespace std;
int main()
{
bool x = true;//定義一個布爾型變量x溅潜,初始值化為true
cout<<x<<endl;//顯示變量x的值术唬,true被顯示為1
int y; //再定義1個int型變量
y=x;// 將布爾型變量x賦值給int型變量y,C++將自動轉(zhuǎn)化類型滚澜,true被轉(zhuǎn)換為1
cout<<y<<endl;//顯示y的值粗仓,結(jié)果為1
x=5; //將int型變量5賦值給布爾型變量,5被轉(zhuǎn)換為true,即非0轉(zhuǎn)換為true借浊,此時編譯器會提示warning錯誤
cout<<x<<endl;//顯示變量x的值塘淑,true顯示被顯示為1
return0;
}
在布爾型數(shù)據(jù)中,true和false是常量蚂斤。除了賦值運算外存捺,還可以對布爾類型的變量進行關(guān)系運算,或者是邏輯運算曙蒸。
2.2 關(guān)系運算符
由關(guān)系運算符構(gòu)成的表達式捌治,就是關(guān)系表達式,關(guān)系表達式的作用就是比較兩個數(shù)的大小纽窟,比較的結(jié)果是布爾類型肖油,結(jié)果為true說明條件成立,為false說明條件不成立臂港。
關(guān)系運算符 | 優(yōu)先級 | 結(jié)合性 |
---|---|---|
大于(>) | 6 | 從左向右 |
大于等于(>=) | 6 | 從左向右 |
小于(<) | 6 | 從左向右 |
小于等于(<=) | 6 | 從左向右 |
等于(==) | 7 | 從左向右 |
不等于(!=) | 7 | 從左向右 |
2.3 邏輯運算符
邏輯運算符用于判斷復(fù)合條件是否成立森枪。結(jié)果為布爾類型。
邏輯運算符 | 優(yōu)先級 | 運算規(guī)則 |
---|---|---|
與(&&) | 11 | 雙目運算符审孽,真真為真疲恢、否則都為假,相當(dāng)于并取的意思 |
或(||) | 12 | 雙目運算符瓷胧,假假為假,否則都為真棚愤,相當(dāng)于或的意思 |
非(!) | 2 | 單目運算符搓萧,非假即真,非真即假宛畦,相當(dāng)于求反的意思 |
參與邏輯運算的操作數(shù)必須是布爾類型瘸洛,否則將自動轉(zhuǎn)換,其他類型轉(zhuǎn)為布爾類型的規(guī)則是次和,0轉(zhuǎn)為false反肋,非0轉(zhuǎn)為true。
三踏施、選擇語句
算法中某些操作步驟石蔗,需要滿足特定條件才能執(zhí)行,比如求變量x的倒數(shù)畅形,需要判斷x不等于0是否成立养距,若成立進行算法運算,否則應(yīng)提示錯誤信息日熬。
句型:如果......棍厌,就......,否則,,,,,,
選擇結(jié)構(gòu)/分支結(jié)構(gòu):如果條件成立,則執(zhí)行算法分支1耘纱,否則執(zhí)行算法分支2
C++語言提供了2中選擇語句句型:
- if—else語句
- switch—case語句
3.1 if—else語句的語法
使用方法:
if(表達式)
{語句1;}
else
{語句2;}
語法說明:
- 表達式:指定一個判斷條件敬肚,該表達結(jié)果應(yīng)為布爾類型,例如關(guān)系表達式或邏輯表達式束析,非布爾類型表達將被自動轉(zhuǎn)換艳馒,0轉(zhuǎn)化為false,非0數(shù)值轉(zhuǎn)化為true
- 語句1:描述算法分支1的C++語句序列畸陡,即表達式成立時執(zhí)行的語句
- 語句2:描述算法分支2的C++語句序列鹰溜,即表達式不成立時執(zhí)行的語句。如果條件不成立時不需要執(zhí)行什么處理丁恭,則可以省略else和{語句2}
- 語句1曹动、語句2可能包含多條C++語句序列,此時必須用一對大括號”{}“括起來牲览,如果只包含一條語句墓陈,則大括號可以省略掉。
- 計算機執(zhí)行該語句時第献,首先計算表達式(即判斷條件)庸毫,若結(jié)果為true(條件成立)飒赃,則執(zhí)行語句1炒事;否則執(zhí)行else后面的語句2。
/*實例一:求一個數(shù)的倒數(shù)*/
#include <iostream>
using namespace std;
int main()
{
double x;
cout<<"請輸入一個數(shù)值:"<<endl;
cin>>x;
if (x!=0) //判斷條件
/*條件成立睡扬,執(zhí)行以下語句,有3條語句韧涨,所以不需大括號括起來*/
{
double y;
y = 1/x;
cout<< "x的倒數(shù)為:"<<y<<endl;
}
else
cout<<"因為x的值等于0,0沒有倒數(shù)"<<endl; //else只有1條語句虑粥,可以省略大括號
return 0;
}
C++語言將一對大括號括起來的語句稱為一條復(fù)合語句娩贷。C++還要一種特殊的語句彬祖,空語句储笑,是由單個腔稀;組成的,計算機在執(zhí)行空語句時不會執(zhí)行任何操作,空語句也沒有任何實際的用途涂圆,只是在某些特殊的語法場合需要空語句模狭。
/*實例二:判斷一個年份是不是閏年*/
#include <iostream>
using namespace std;
int main()
{
int x;
cout<<"請輸入一個年份:"<< endl;
cin>>x;
if ((x%100!=0 && x%4==0) || x%400==0) //復(fù)合條件判斷語句贩汉,用括號括起來。
cout<<x<<"是閏年";
else
cout<<x<<"不是閏年";
return 0;
}
復(fù)合判斷語句用在if后面匹舞,用括號括起來线脚〈突可以多層嵌套。
/*求解符號函數(shù)*/
#include <iostream>
using namespace std;
int main()
{
float x; //要判斷的數(shù)
cout<<"請輸入一個實數(shù):"<<endl;
cin>>x;
int a; //用來保存結(jié)果
if(x==0) //先判斷0
cout<<"0沒有符號,值為:"<<a;
/*復(fù)合語句判斷x的值姊舵,并確定a的值晰绎,最后輸出提示性語句和a*/
else
{
if(x<0) a=-1;
else a=1;
}
cout<<a<<endl;
return 0;
}
if_else可以多層嵌套括丁,每個else自動的和上面最近的if配對史飞,如果else配對錯誤,那么執(zhí)行結(jié)果也是錯誤的蚯窥。所以為了慎重起見巍沙,上層的if_else語句應(yīng)對添加大括號,將下層的if_else語句括起來
良好的書寫習(xí)慣可以提供代碼的可讀性荷鼠,要合理利用空格句携、縮進、空行和注釋允乐,來區(qū)分語句的層次矮嫉,說明語句的功能和用途。
if_else多層嵌套代碼可讀性低牍疏,C++還提供了一種更加直觀簡潔的寫法if...else if_..._else蠢笋,的書寫方式,求解符號實例可以改造為:
#include <iostream>
using namespace std;
int main()
{
float x; //要判斷的數(shù)
cout<<"請輸入一個實數(shù):"<<endl;
cin>>x;
int a; //用來保存結(jié)果
if(x==0) a=0;
else if(x>0) a=1;
else a=-1;
cout<<a<<endl;
return 0;
}
if-else if-else語法:
if(表達式1) 語句1;
else if(表達式2) 語句2;
......
else if(表達式n) 語句n;
else 語句n+1
- 表達式1~n分別是依次判定的條件鳞陨,表達式結(jié)果應(yīng)該為布爾類型昨寞,例如關(guān)系表達式或邏輯表達式,非布爾類型將自動轉(zhuǎn)換厦滤,0轉(zhuǎn)為false援岩,非0值轉(zhuǎn)為true
- 語句1~n表示對應(yīng)條件成立執(zhí)行的語句,可以是單條掏导,可以是復(fù)合語句或空語句
- 語句n+1享怀,是所有條件都不成立時執(zhí)行的語句,可以是單條語句或復(fù)合語句趟咆,如果條件不成立添瓷,什么都不需要執(zhí)行梅屉,則可省略else 和(語句n+1)
- 計算機執(zhí)行語句時從1~n+1逐一判斷,直到計算表達式為true仰坦,當(dāng)判斷到某條語句為true時履植,會立即執(zhí)行對應(yīng)的語句,后面的語句都會拋棄掉不會再執(zhí)行悄晃,簡而言之玫霎,計算機只能執(zhí)行語句1~n+1中的一條語句。
#include <iostream>
using namespace std;
int main()
{
int x;
cout <<"請輸入一個數(shù)字:"<< endl;
cin >> x;
if(x == 1) cout <<"Today is Monday!"<<endl;
else if (x==2) cout <<"Today is Tuesday!"<<endl;
else if (x==3) cout <<"Today is Thursday!"<<endl;
else if (x==4) cout <<"Today is Wednesday!"<<endl;
else if (x==5) cout <<"Today is Friday!"<<endl;
else if (x==6) cout <<"Today is Saturday!"<<endl;
else if (x==7) cout <<"Today is Sunday!"<<endl;
else cout<<"數(shù)值超出1-7的范圍"<<endl;
return 0;
}
3.2 C++語句條件運算符
符號標(biāo)識:由問號和冒號組成“?:”
在程序設(shè)計中妈橄,如果條件成立庶近,則執(zhí)行算法分支1,否則執(zhí)行算法分支2眷蚓,雙分的if-else支結(jié)構(gòu)鼻种,可以通過條件運算符來實現(xiàn)簡單的分支結(jié)構(gòu)。語法規(guī)則如下:
表達式1 ? 表達式1 : 表達式2
語法說明:
- 有條件運算符構(gòu)成的表達式稱為條件表達式沙热,其中的表達式指定一個判斷條件叉钥,該表達式結(jié)果應(yīng)為布爾類型,例如關(guān)系表達式或邏輯表達式篙贸,非布爾類型將自動轉(zhuǎn)換投队,0轉(zhuǎn)為false,非0值轉(zhuǎn)為true
- 如果表達式的結(jié)果為true爵川,則計算表達式1敷鸦,將其結(jié)果作為整個條件表達的結(jié)果,否則計算表達式2寝贡,將表達式2的結(jié)果作為整個條件表達式的結(jié)果扒披。
- 條件運算符是一個3目運算符,優(yōu)先級為13圃泡,結(jié)合性從右向左碟案。
int a =5, b = 10, c;a>b ? a:b //這是一個條件表達式,結(jié)果為10颇蜡,數(shù)據(jù)類型為int型
cout(a>b ? a:b); //顯示表達式的結(jié)果
c = a>b ? a:b; //將結(jié)果賦值給int型變量c
實列:
#include <iostream>
using namespace std;
int main(){
int a=5,b=10,c;
a>b ? a:b;
cout<<c<<endl;
c= (a>b ? a:b);
return 0;
}
3.3 switch-case語句
分支結(jié)構(gòu)算法中蟆淀,有一類特殊的算法,某一表達式結(jié)果澡匪,可分成若干種情況,每一種情況褒链,只寫一種算法分支唁情,C++語言提供了switch-case結(jié)果來描述這種多分支結(jié)果。語法形式比if-else更加簡潔直觀甫匹。
語法:
switch(表達式)
{
case 常量表達式1:語句1;
case 常量表達式2:語句2;
......
case 常量表達式n:語句n;
default:語句n+1;
}
說明:
- 計算機執(zhí)行該語句時甸鸟,首先計算switch后面的表達式惦费,然后將其結(jié)果與各case后的常量表達式結(jié)果進行比對。若比對成功抢韭,則以比對成功的case語句為起點薪贫,順序執(zhí)行后面的所有語句,直到整個switch語句結(jié)束刻恭,或遇到break語句時中途跳出瞧省,繼續(xù)執(zhí)行switch語句的下一條語句,如果所有比對都不成功鳍贾,則將default語句作為執(zhí)行的起點鞍匾;
- 表達式的結(jié)果應(yīng)當(dāng)是整型(char、short骑科、int橡淑、long),不能是浮點型咆爽;
- 常量表達式1~n分別列出上述表達式可能得出的結(jié)果梁棠,常量表達式只能是常量,或者由常量組成的表達式斗埂,各常量表達式的值不能相同符糊,不能重復(fù);
- 語句1~n分別對應(yīng)常量表達式比對成功時執(zhí)行的語句蜜笤,通常最后都增加一條break語句作為本case的結(jié)束語句濒蒋,語句1~n為復(fù)合語句時,大括號也可以省略把兔;
- 語句n+1時default后面的語句沪伙,所有比對都不成功時應(yīng)執(zhí)行的語句,default語句習(xí)慣上放在最后县好。
實例一:有break語句跳出比對的情況
/*有break語句的情況*/
#include <iostream>
using namespace std;
int main(){
int x;
cout<<"請輸入一個標(biāo)識星期幾的數(shù)值:";
cin>>x;
switch (x) //下列的case語句會根據(jù)switch中x的值進行比較
{
case 1:cout<<"Today is Monday!"<<endl ; break;
case 2:cout<<"Today is Tuesday!"<<endl ; break;
case 3:cout<<"Today is Thursday!"<<endl ; break;
case 4:cout<<"Today is Wednesday!"<<endl ; break;
case 5:cout<<"Today is Friday!"<<endl ; break;
case 6:cout<<"Today is Saturday!"<<endl ; break;
case 7:cout<<"Today is Sunday!"<<endl ; break;
default: cout<<"input error"<<endl;
}
//每個case語句只要是執(zhí)行了cout語句围橡,程序功能就已經(jīng)完成
//使用break語句中途跳出switch語句,繼續(xù)執(zhí)行switch語句的下一條語句缕贡,即return語句
return 0;
}
實例二:無break的情況
#include <iostream>
using namespace std;
int main(){
int mouth;
cout<<"請輸入一個標(biāo)識月份的數(shù)值:";
cin>>mouth; switch (mouth)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:cout<<"這個月是大月翁授,有31天"<<endl; break;
case 4:
case 6:
case 9:
case 11:cout<<"這個月是小月,只有30天"<<endl; break;
case 2:cout<<"2月天數(shù)為28天晾咪,閏年29天"<<endl; break;
default: cout<<"input error"<<endl;
}
return 0;
}
若多個case的語句一樣收擦,可以共用語句。
四谍倦、循環(huán)語句
有些算法塞赂,在滿足特定條件下,將重復(fù)執(zhí)行某些操作步驟昼蛀,這種結(jié)構(gòu)稱之為循環(huán)結(jié)構(gòu)宴猾,循環(huán)結(jié)構(gòu)就是在條件成立時圆存,重復(fù)執(zhí)行某個操作,否則結(jié)束循環(huán)仇哆。
循環(huán)4要素:循環(huán)變量沦辙、初始值、循環(huán)條件讹剔、循環(huán)體
循環(huán)語句:while語句油讯、do—while語句、for語句
實例分析:求奇數(shù)數(shù)列1,3,5.......2n-1的前N項累加和辟拷,公式撞羽,奇數(shù)數(shù)列前N項的和,是一個重復(fù)累積的過程衫冻,累加起點就是n=1時诀紊,累加條件是n
N,直到這個條件不成立隅俘。
4.1 while語句
語法:
while(表達式)
語句
- 表達式指定一個循環(huán)條件邻奠,該表達式結(jié)果應(yīng)為布爾類型,例如關(guān)系表達式或邏輯表達式,非布爾類型將自動轉(zhuǎn)換,0轉(zhuǎn)為false捏鱼,非0值轉(zhuǎn)為true
- 語句是描述循環(huán)體的C++語句,即條件成立時循環(huán)執(zhí)行的語句贰镣,如循環(huán)條件開始就不成立,則循環(huán)體一次也不執(zhí)行膳凝,循環(huán)體中應(yīng)包含循環(huán)條趨向于false的語句碑隆,否則循環(huán)條件一直為true,循環(huán)體將無休止執(zhí)行蹬音,俗稱“死循環(huán)”
- 計算機執(zhí)行該語句時上煤,首先計算表達式(即循環(huán)條件),若結(jié)果為true(條件成立)著淆,則重復(fù)執(zhí)行循環(huán)體語句劫狠,否則跳出循環(huán)。
/*求奇數(shù)數(shù)列1,3,5.......2n-1的前N項累加和*/
#include <iostream>
using namespace std;
int main(){
int N,sum=0,n=1; //定義變量永部,并將用于保存結(jié)果的sum初始化為0独泞,開始的n初始化為1
cout<<"請輸入計算的值:";
cin>>N; //獲取前N項
while (n<=N)
{
sum += 2*n-1; // 等價于sum=sum+2*n-1,
n++; //執(zhí)行完上一條語句,將n自增1苔埋。該條語句用于跳出循環(huán)懦砂,使得循環(huán)條件n<=N趨于false
}
cout<<"前"<<N<<"項的累積結(jié)果為:"<<sum<<endl; //跳出循環(huán)后,執(zhí)行本條語句,顯示變量sum
return 0;
}
4.2 do—while語句
do—while語句是先執(zhí)行循環(huán)體孕惜,在判斷條件。語法如下:
do
語句
while(表達式);
- 表達式指定一個循環(huán)條件晨炕,該條件放在循環(huán)體語句的后面衫画,即先執(zhí)行再判斷條件,該表達式結(jié)果應(yīng)為布爾類型瓮栗,例如關(guān)系表達式或邏輯表達式削罩,非布爾類型將自動轉(zhuǎn)換,0轉(zhuǎn)為false费奸,非0值轉(zhuǎn)為true
- 語句式描述循環(huán)體的C++語言弥激,不管循環(huán)條件是否成立,循環(huán)體都要執(zhí)行一次愿阐,循環(huán)體中應(yīng)包含使循環(huán)條件趨向于false的語句微服,否則將造成死循環(huán)
- 計算機執(zhí)行該語句時,首先執(zhí)行一次循環(huán)體缨历,然后再計算表達式(即循環(huán)條件)以蕴,若結(jié)果為true(條件成立),則重復(fù)執(zhí)行循環(huán)體語句辛孵,否則結(jié)束循環(huán)丛肮。
/*求奇數(shù)數(shù)列1,3,5.......2n-1的前N項累加和*/
#include <iostream>
using namespace std;
int main(){
int N,sum=0,n=1;
cout<<"請輸入計算的值:";
cin>>N;
do
{
sum += 2*n-1;
n++;
}
while (n<=N);
cout<<"前"<<N<<"項的累積結(jié)果為:"<<sum<<endl;
return 0;
}
4.3 for語句
for語句語法:
for(表達式1;表達式2;表達式3)
語句
- 表達式1只在正式循環(huán)前執(zhí)行一次,通常用于循環(huán)算法的賦初始值
- 表達式2指定一個循環(huán)條件魄缚,每次循環(huán)時宝与,先計算該表達式,如果為true冶匹,則執(zhí)行下面的循環(huán)體語句习劫,否則結(jié)束循環(huán)
- 表達式3是在每次循環(huán)體執(zhí)行結(jié)束之后都被執(zhí)行一次,主要用于修改循環(huán)體中的某些變量徙硅,使循環(huán)條件趨向于false
- 語句是描述循環(huán)體的C++語句
- 計算機執(zhí)行該語句時榜聂,首先計算表達式1(通常為賦初始值),再計算表達式2(即循環(huán)條件)嗓蘑,若結(jié)果為true則重復(fù)執(zhí)行循環(huán)體語句须肆,每次執(zhí)行完循環(huán)體語句之后計算一次表達式3(通常用于修改循環(huán)條件中的某些變量),然后再返回表達式2重新判斷桩皿,若表達式2結(jié)果為true豌汇,再次執(zhí)行上述過程一次,直至表達式2判斷為false泄隔,跳出循環(huán)拒贱。
/*求奇數(shù)數(shù)列1,3,5.......2n-1的前N項累加和*/
#include <iostream>
using namespace std;
int main(){
int N,n,sum=0;
cout<<"請輸入計算的值:";
cin>>N;
for(n=1;n<=N;n++) //集中用3個表達式來指定n=1,循環(huán)條件n<=N,以及修改循環(huán)條件中的變量N,使得循環(huán)趨向于false
sum += 2*n-1; //表達式n<=N為true時執(zhí)行的語句
cout<<"前"<<N<<"項的累積結(jié)果為:"<<sum<<endl;
return 0;
}
4.4 逗號“,”運算符
逗號運算符逻澳,可以將多個表達式鏈接在一起闸天,構(gòu)成一個復(fù)合的逗號表達式,
表達式1, 表達式2, ......, 表達式n
- 計算機在執(zhí)行時從左往右依次計算表達式1~n斜做,將最后一個表達式(即表達式n)的結(jié)果作為整個逗號表達式的結(jié)果
- 逗號運算符的優(yōu)先級為15級苞氮,結(jié)合性從左到右
實例說明:
int a,b,c;
a=5, b=10, c=a+b; //依次執(zhí)行,所以a=5, b=10, c=15瓤逼,計算機會將最后的表達式計算結(jié)果(c=a+b)作為該表達式的結(jié)果笼吟,故結(jié)果為15
cout<<(a,b,c); //顯示逗號表達式的結(jié)果,結(jié)果為15
編寫程序時霸旗,可以將多個表達式語句用逗號運算符連接起來贷帮,構(gòu)成一個長的表達式語句,使得程序更加緊湊诱告,利用逗號運算符改寫求奇數(shù)列前N項的累積和程序撵枢。
/*求奇數(shù)數(shù)列1,3,5.......2n-1的前N項累加和*/
#include <iostream>using namespace std;
int main(){
int N,n,sum;
cout<<"請輸入計算的值:";
cin>>N;
for(n=1,sum=0;n<=N;n++) //集中用3個表達式來指定n=1,循環(huán)條件n<=N,以及修改循環(huán)條件中的變量N蔬啡,使得循環(huán)趨向于false
sum += 2*n-1; //表達式n<=N為true時執(zhí)行的語句
cout<<"前"<<N<<"項的累積結(jié)果為:"<<sum<<endl;
return 0;
}
4.5 控制語句
計算機通常是按照語句的書寫順序執(zhí)行程序的诲侮,而某些語句,會造成執(zhí)行順序的跳轉(zhuǎn)箱蟆,例如選擇語句和循環(huán)語句沟绪,造成程序執(zhí)行順序跳轉(zhuǎn)的語句,統(tǒng)稱為控制語句空猜。
-
break語句
break語句的作用就是跳出整個循環(huán)绽慈,例如,我們設(shè)計一個可以求圓的面積和周長的程序辈毯,我們一直輸入半徑坝疼,程序就一直計算,而不必每次都打開程序谆沃。
#include <iostream> using namespace std; int main(){ const int Pi=3.14; double r,s,c; while(true) //使用關(guān)鍵字true將while設(shè)置為死循環(huán)钝凶,如果不跳出循環(huán)的話,while下的語句塊會一直執(zhí)行唁影。 { cout<<"請輸入圓的半徑:"; cin>>r; s = r*r*Pi; c = 2*r*Pi; if(r<0) break; //break的作用就是跳出整個循環(huán) cout<<"一個半徑為:"<<r<<"的圓的面積="<<s<<"周長等于"<<c<<endl; } return 0; }
-
continue
continue 的作用是跳出當(dāng)前循環(huán)耕陷,中途返回,繼續(xù)執(zhí)行下一個循環(huán)据沈。比如設(shè)計一個程序哟沫,能顯示一個范圍內(nèi),能被3整除的數(shù)锌介。
#include <iostream> using namespace std; int main(){ int a,b; cout<<"請輸入取值范圍,小的在前嗜诀,大的在后:"; cin>>a>>b; for(a,b;a<=b;a++) { if (a%3!=0) continue; //如果n不能被3整除猾警,則執(zhí)行continue,跳過此次判斷隆敢,執(zhí)行下一個循環(huán)語句发皿。 cout<<a<<","; //只返回能被3整除的數(shù)。其他的數(shù)都被continue跳出時過略掉了拂蝎。 } return 0; }
continue只能在循環(huán)語句中使用雳窟,而break還能夠在switch-case選擇語句中使用。
五匣屡、算法設(shè)計與評價
程序設(shè)計中,算法應(yīng)當(dāng)時可實現(xiàn)的拇涤,算法應(yīng)當(dāng)能被計算機執(zhí)行捣作,算法應(yīng)當(dāng)完成某種功能,具有使用價值鹅士,因此券躁,我們設(shè)計的算法應(yīng)對具有以下5個特性:
- 有窮性:一個算法必須保證其執(zhí)行步驟是有限的
- 確定性:算法的每個步驟必須有明確的定義,不能含糊不清掉盅,或有二義性
- 有效性:算法每個步驟應(yīng)該能被計算機執(zhí)行也拜,并得到有效的結(jié)果。
- 輸入:算法可以有0個或多個數(shù)額u趾痘,輸入是算法處理的原始數(shù)據(jù)
- 輸出:算法至少要有一個輸出慢哈,輸出是算法處理的結(jié)果
如何評判一個算法的優(yōu)劣,是通過算發(fā)雜程度和內(nèi)存占用量永票,這是評價一個算法優(yōu)劣的基本標(biāo)準(zhǔn)卵贱。
-
算法復(fù)雜度:決定了計算執(zhí)行該算法所續(xù)的時間,完成相同的功能計算復(fù)雜度越小侣集,算法執(zhí)行速度越快键俱,算法就越好。
實列:判斷一個數(shù)是否是素數(shù)
#include <iostream> using namespace std; int main(){ int a; cout<<"請輸入一個正整數(shù):"; cin>>a; bool yes_no = true; for(int n=2; n<a; n++) { if(a%n==0) { yes_no=false;break; } } if(yes_no==true)cout<<a<<"是素數(shù)"; else cout<<a<<"不是素數(shù)"; return 0; }
在上述實例中世分,a只需檢查能否被n~a/2以內(nèi)的數(shù)整除编振,就可以判斷a是否是素數(shù),降低循環(huán)的次數(shù)臭埋,就可以降低程序的算法復(fù)雜程度踪央,從而優(yōu)化程序。保證正確性的情況下斋泄, 程序的執(zhí)行速度越快越好杯瞻。
-
內(nèi)存占用量
內(nèi)存占用量用于評估計算機執(zhí)行算法時,所需空間的大小炫掐,完成相同的功能魁莉,內(nèi)存占用量空間越小,那么算法就越好。
#include <iostream> using namespace std; int main(){ double a, b, c; double sum; cout<<"請依次輸入3個人的成績:"; cin>>a;cin>>b;cin>>c; sum= (a+b+c)/3; cout<<"平均成績?yōu)椋?<<sum<<endl; return 0; }
在該算法中旗唁,定義了4個double型變量畦浓,每個變量占用8個字節(jié),因此總共占用了32個字節(jié)检疫,成績的取值范圍是0-100讶请,使用單精度浮點型float類型完全能夠滿足需求,每個float型變量只占用4個字節(jié)屎媳,總共占用16個字節(jié)夺溢,同時減小變量的定義數(shù)量,也可以減少不必要的內(nèi)存開銷烛谊。對上述程序進行完善:
#include <iostream> using namespace std; int main(){ float source; float sum = 0; cout<<"請依次輸入3個人的成績:"; cin>>source;sum += source; cin>>source;sum += source; cin>>source;sum += source; cout<<"平均成績?yōu)椋?<<sum/3<<endl; return 0; }
通過對程序算法的優(yōu)化风响,新程序內(nèi)存開銷僅占用8個字節(jié)。
最后的實例:求反正切(arctan)函數(shù)的算法設(shè)計丹禀,計算機只能進行算術(shù)運算状勤,關(guān)系運算,邏輯運行等基本運算双泪,不能直接運行對數(shù)函數(shù)這一類的復(fù)雜運算持搜,此類復(fù)雜運算,需要分解成基本運算進行求解焙矛。
公式化解為:葫盼,其中記
分子:
分母:
那么: