C++第二章: 算法與控制結(jié)構(gòu)

聲明

本系列來至中國大學(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項累加和辟拷,公式\sum^{N}_{n=1}{2n-1}撞羽,奇數(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ù)雜運算,需要分解成基本運算進行求解焙矛。

arctan = x-\left(\frac{x^3}{3}\right)+\left(\frac{x^5}{5}\right)-\left(\frac{x^7}{7}\right)...+\left(\frac{x^{2n+1}}{2n+1}\right)

公式化解為:arctan(x) = \sum^{\infty}_{n=0}(-1)^n\frac{x^{2n+1}}{2n+1}葫盼,其中記f(n)=\frac{x^{2n+1}}{2n+1}

分子:a(0)=x, a(n+1)=a(n)*x^2

分母:b(0)=1, b(n+1)=b(n)+2

那么:f(n)=a(n)/b(n)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市村斟,隨后出現(xiàn)的幾起案子剪返,更是在濱河造成了極大的恐慌,老刑警劉巖邓梅,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件脱盲,死亡現(xiàn)場離奇詭異,居然都是意外死亡日缨,警方通過查閱死者的電腦和手機钱反,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來匣距,“玉大人面哥,你說我怎么就攤上這事∫愦” “怎么了尚卫?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長尸红。 經(jīng)常有香客問我吱涉,道長刹泄,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任怎爵,我火速辦了婚禮特石,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘鳖链。我一直安慰自己姆蘸,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布芙委。 她就那樣靜靜地躺著逞敷,像睡著了一般。 火紅的嫁衣襯著肌膚如雪灌侣。 梳的紋絲不亂的頭發(fā)上兰粉,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天,我揣著相機與錄音顶瞳,去河邊找鬼。 笑死愕秫,一個胖子當(dāng)著我的面吹牛慨菱,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播戴甩,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼符喝,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了甜孤?” 一聲冷哼從身側(cè)響起协饲,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎缴川,沒想到半個月后茉稠,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡把夸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年而线,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片恋日。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡膀篮,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出岂膳,到底是詐尸還是另有隱情誓竿,我是刑警寧澤,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布谈截,位于F島的核電站筷屡,受9級特大地震影響涧偷,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜速蕊,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一嫂丙、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧规哲,春花似錦跟啤、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至袄简,卻和暖如春腥放,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背绿语。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工秃症, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人吕粹。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓种柑,卻偏偏與公主長得像,于是被迫代替她去往敵國和親匹耕。 傳聞我的和親對象是個殘疾皇子聚请,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,914評論 2 355

推薦閱讀更多精彩內(nèi)容