1. 程式人生 > >C++學習筆記——第四天 程式控制結構

C++學習筆記——第四天 程式控制結構

目標

  • 瞭解C++的面向過程的結構化設計方法
  • 熟練掌握C++支援的三種程式結構:順序結構,選擇結構,迴圈結構
  • 掌握轉向語句的功能及其使用

順序結構

順序結構是指按照所有語句出現的順序先後執行,先出現的先執行,後出現的後執行。順序結構的語句一般包含三種:表示式語句;輸入語句;輸出語句。

表示式語句
一般形式:
表示式;
複合語句
{
<語句1>
<語句2>
……
<語句n>
}

輸入語句
C++沒有提供輸入/輸出語句。其輸入/輸出功能由函式(scanf,printf)或流控制來實現。
輸入/輸出流(I/O流)是輸入或輸出的一系列位元組。C++定義了包含過載運算子。“<<”和”>>”的iostream類。

#include<iostream>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    int a;
    cin>>a; //輸入語句
    getchar();
    return 0;
}

這裡寫圖片描述

輸出語句

#include<iostream>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    cout<<"Hello.\n";   //輸出語句
    getchar();
    return
0; }

這裡寫圖片描述

格式控制符

  • flags:該函式一般有以下兩種形式,第一種形式是通過引數1Flags重新設定標誌字並返回原來的標誌字;另一種形式是通過無引數的flags函式返回當前的標誌字。
    long flags(long 1Flags);
    long flags();
  • setf:該函式一般也有以下兩種形式:第一種形式是通過引數1Flags來設定指定的格式控制標誌位;第二種形式是用來設定指定的格式控制標誌位的值
    long setf(long 1Flags);
    long setf(long 1Flags,long 1Mask);
  • unsetf:該函式一般形式如下,這種形式是通過引數1Flags來清除指定的格式控制標誌位(使那些位的值為“0”)
    long unsetf(long 1Flags);
  • fill:函式一般有以下兩種形式,第一種形式是將填充字元設定為cFill,並返回原填充字元;第二種形式是通過無引數的fill函式返回當前的填充字元。
    char fill(char cFill);
    char fill();
  • precision:該函式形式一般也有以下兩種,第一種形式是設定浮點數精度為np,並返回原精度;第二種形式是通過無引數的precision函式返回當前的浮點數精度。
    int precision(int np);
    int precision();
  • width:該函式的形式一般也有以下兩種,第一種形式設定當前顯示資料的域寬nw,並返回原域寬;第二種形式是通過無引數的width函式返回當前顯示資料的域寬。
    int width(int nw);
    int width();
    例如:
    控制不同進位制的進出。
#include<iostream>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    int a=1000;
    cout<<"預設下:"<<a<<endl;
    cout<<"十進位制下:"<<dec<<a<<endl;
    cout<<"八進位制下:"<<oct<<a<<endl;
    cout<<"十六進位制下:"<<hex<<a<<endl;

    getchar();
    return 0;
}

這裡寫圖片描述

控制輸出寬度

#include "stdafx.h"
#include<iostream>
#include <iomanip>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    int a =1234567890;
    double b = 123.45;
    cout<<setw(10)<<a<<endl;
    cout<<setw(10)<<b<<endl;
    cout<<setw(8)<<b<<endl;
    cout<<setw(6)<<b<<endl;
    cout<<setw(4)<<b<<endl;

    getchar();
    return 0;
}

這裡寫圖片描述
寬度達不到setw控制符中設定的寬度時,將在輸出內容前面填補空格,大於控制符中設定的寬度時,系統將全部予以輸出。

控制輸出精度

#include "stdafx.h"
#include<iostream>
#include <iomanip>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    double a =1.23456789;
    cout<<a<<endl;
    cout<<setprecision(3)<<a<<endl;
    cout<<setprecision(10)<<a<<endl;

    getchar();
    return 0;
}

這裡寫圖片描述

這裡寫圖片描述

應用示例

#include "stdafx.h"
#include<iostream>
#include <iomanip>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    const double Num = 123.4567;
    cout.flags(ios::right); //設定對其的標誌位是右
    cout<<setw(10)<<Num<<endl;
    cout.fill('*');//填充字元*
    cout.width(12);//顯示資料的域寬是12
    cout<<Num<<endl;
    cout.precision(4);//浮點數的有效個數為4
    cout<<Num<<endl;
    cout.setf(ios::showpos);//顯示正號
    cout.precision(2);
    cout<<Num<<endl;
    cout.unsetf(ios::showpos);//顯示正號
    int n;
    cout<<"輸出一個八進位制整數:";
    cin>>oct>>n;
    cout<<"八進位制數n是:"<<oct<<n<<endl;
    cout<<"對應的十進位制數是"<<dec<<n<<endl;
    cout<<"對應的十六進位制數是"<<hex<<n<<endl;
    getchar();
    getchar();
    return 0;
}

這裡寫圖片描述

選擇結構

用來判斷所給定的語句是否滿足條件,根據判斷結果,選擇執行不同分支語句,常用語句if,if…else,多重if…else,和switch。
if語句
一般形式:
表示式可以是int,long,char和enum型。

if(<表示式>)
    <語句>

#include "stdafx.h"
#include<iostream>
#include <iomanip>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    int x,y,temp;
    cout<<"Please input 2 numbers:";
    cin>>x>>y;
    if(x<y)
    {
        temp=x;
        x=y;
        y=temp;
    }
    cout<<"x="<<x<<endl;
    cout<<"y="<<y<<endl;
    getchar();
    getchar();
    return 0;
}

這裡寫圖片描述

if…else語句
if…else語句是雙分支語句一般形式為

if(<表示式><語句1>;
else
    <語句2>

#include "stdafx.h"
#include<iostream>
#include <iomanip>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    int score;
    cout<<"請輸入學生分數:"<<endl;
    cin>>score;
    if(score>=60)
        cout<<"及格"<<endl;
    else
        cout<<"不及格"<<endl;
    getchar();
    getchar();
    return 0;
}

這裡寫圖片描述

多重if…else語句
多重if…else語句為多分支條件語句或if…else if…else語句一般形式為

if(<表示式1><語句1>;
else if(<表示式2>)
    <語句2>;
    ……
else if(<表示式n>)
    <語句n>;
else
    <語句n+1>
#include<iostream>
#include <iomanip>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    int score;
    cout<<"請輸入學生分數:"<<endl;
    cin>>score;
    if(score>=90)
        cout<<"優"<<endl;
    else if(score>=80)
        cout<<"良"<<endl;
    else if(score>=70)
        cout<<"中"<<endl;
    else if(score>=60)
        cout<<"及格"<<endl;
    else
        cout<<"不及格"<<endl;
    getchar();
    getchar();
    return 0;
}

這裡寫圖片描述

多分支條件語句可以使用if語句的巢狀實現

#include "stdafx.h"
#include<iostream>
#include <iomanip>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    int score;
    cout<<"請輸入學生分數:"<<endl;
    cin>>score;
    if(score>=60)
    {
        if(score>=70)
        {
            if(score>=80)
            {
                if(score>=90)
                    cout<<"優"<<endl;
                else
                    cout<<"良"<<endl;
            }
            else
                cout<<"中"<<endl;
        }
        else
            cout<<"及格"<<endl;
    }
    else
        cout<<"不及格"<<endl;


    getchar();
    getchar();
    return 0;
}

這裡寫圖片描述

switch語句
switch語句也稱情況語句,也是一種多分支語句,說明語句的一般形式:

switch(<表示式1>)
{
case<常量表達式1>;
<語句1>;breakcase<常量表達式2>;
<語句2>;break;
……
case<常量表達式n>;
<語句n>;breakdefault:
<語句n>;break;
}
#include "stdafx.h"
#include<iostream>
#include <iomanip>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    int day;
    cout<<"請輸入0~6的數值:"<<endl;
    cin>>day;
    switch(day)
    {
    case 0:
        cout<<"星期日"<<endl;
        break;
    case 1:
        cout<<"星期一"<<endl;
        break;
    case 2:
        cout<<"星期二"<<endl;
        break;
    case 3:
        cout<<"星期三"<<endl;
        break;
    case 4:
        cout<<"星期四"<<endl;
        break;
    case 5:
        cout<<"星期五"<<endl;
        break;
    case 6:
        cout<<"星期六"<<endl;
        break;
    default:
        cout<<"輸入非法"<<endl;

    }

    getchar();
    getchar();
    return 0;
}

這裡寫圖片描述
這裡寫圖片描述
注意
- 若case後面沒有break語句,則程式順序執行後續的語句,直到switch語句結束。這樣就不能實現多分支選擇。
- switch語句只能對錶達式的結果是否為固定的值進行判斷,而不能對其結果是否在某區域進行判斷,這與多重if…else語句有所不同
- 每個常量表達式的值不能相同,case語句的排列順序不影響執行結果

應用示例

// lianxi.cpp : 定義控制檯應用程式的入口點。
//

#include "stdafx.h"
#include<iostream>
#include <iomanip>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    float a,b,c,d;
    cout<<"a=";
    cin>>a;
    cout<<"b=";
    cin>>b;
    cout<<"c=";
    cin>>c;
    d=b*b-4*a*c;
    if(a==0)
        cout<<"不是一元二次方程"<<endl;
    else if(d>0)
    {
        cout<<"方程有兩個實根!"<<endl;
        cout<<"x1="<<(-b+sqrt(d))/(2*a)<<endl;
        cout<<"x2="<<(-b-sqrt(d))/(2*a)<<endl;
    }
    else if(d==0)
    {
        cout<<"方程有一個實根!"<<endl;
        cout<<"x1=x2="<<-b/(2*a)<<endl;
    }
    else
        cout<<"方程無實根!"<<endl;
    getchar();
    getchar();
    getchar();
    getchar();
    getchar();
    getchar();
    return 0;
}

這裡寫圖片描述

迴圈結構

迴圈結構用來在指定條件下多次重複執行同一組語句。常用形式:

  • for語句
  • while語句
  • do…while語句

for語句
一般形式:

for(<表示式1><表示式2><表示式3>)
    <語句>
  • 表示式1對迴圈控制變數進行初始化
  • 表示式2是迴圈條件
  • 表示式3是對迴圈控制變數進行遞增或遞減
    三個表示式可以預設但分號不能省略
#include "stdafx.h"
#include<iostream>
#include <iomanip>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    int i;
    int sum=0;
    for(i=2;i<=100;i=i+2)//for迴圈
    {
        sum +=i;
    }
    cout<<"100內所有偶數和為:"<<sum<<endl;
    getchar();
    return 0;
}

這裡寫圖片描述

while語句
一般形式:

while(<表示式>)
    <語句>
// lianxi.cpp : 定義控制檯應用程式的入口點。
//

#include "stdafx.h"
#include<iostream>
#include <iomanip>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    int i;
    int sum=0;
    i=2;
    while(i<=100)//while迴圈
    {
        sum +=i;
        i=i+2;
    }
    cout<<"100內所有偶數和為:"<<sum<<endl;
    getchar();
    return 0;
}

這裡寫圖片描述

do…while語句
do…while語句的迴圈體至少被執行一次
一般形式為:

do
<語句>
while(<表示式>);
// lianxi.cpp : 定義控制檯應用程式的入口點。
//

#include "stdafx.h"
#include<iostream>
#include <iomanip>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    int i;
    int sum=0;
    i=2;
    do
    {
        sum+=i;
        i=i+2;
    }
    while(i<=100);//do...while迴圈
    cout<<"100內所有偶數和為:"<<sum<<endl;
    getchar();
    return 0;
}

這裡寫圖片描述

多重迴圈
多重迴圈(迴圈巢狀)是指迴圈語句的迴圈體內又包含另一個迴圈語句。
在多重迴圈中,迴圈巢狀的執行順序是先執行最裡層的迴圈語句,依次往外執行,最後執行最外層的迴圈
列印一個九九乘法表

// lianxi.cpp : 定義控制檯應用程式的入口點。
//

#include "stdafx.h"
#include<iostream>
#include <iomanip>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    int bcs,cs;
    for(bcs=1;bcs<=9;bcs++)
    {
        for(cs=1;cs<=bcs;cs++)
        { 
            cout<<bcs<<'*'<<cs<<"="<<bcs*cs<<' ';
        }
        cout<<endl;
    }
    getchar();
    return 0;
}

這裡寫圖片描述

應用示例
求1000內的所有水仙花數。所謂水仙花數是指一個位數,其各位數字立方和等於該數字本身。

// lianxi.cpp : 定義控制檯應用程式的入口點。
//

#include "stdafx.h"
#include<iostream>
#include <iomanip>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    int i,j,k,n,m;
    for(i=1;i<=9;i++)//百位數從1到9變化,不能取0;如果百位為0就不是三位數了
    {
        for(j=0;j<=9;j++)//十位從0到9,允許取0
        {
            for(k=0;k<=9;k++)//十位從0到9,允許取0
            {
                n=i*100+j*10+k;//這個數等於百位數乘以100加上十位數乘以10在加上個位數
                m=i*i*i+j*j*j+k*k*k;    //百位上數的立方加上十位上數的立方加上個位上數的立方
                if(n==m)
                    cout<<n<<" ";
                //這是一個三位數是否為水仙花數的條件,即水仙花數是各位數字立方和等於該數字本身
            }
        }
    }
    cout<<endl;
    getchar();
    return 0;
}

這裡寫圖片描述

轉向語句

轉向語句是C++中用來實現無條件轉移的語句,常見的有四種

  1. break語句(跳出語句):用來結束迴圈結構,然後執行迴圈體後面的語句,一般形式
    break;

  2. continue語句(繼續語句):可用來跳出本次迴圈而進入下一次迴圈,一般形式
    continue;
    區別:continue語句是根據條件判斷只結束本次迴圈,不結束整個迴圈結構。

  3. goto語句(轉向語句):用來將程式無條件跳轉到指定的標號語句處,一般形式
    goto<標號>;
    其中標號是一個識別符號,放在語句的最前面,一般形式
    <標號>:<語句>

  4. return語句(返回語句):可用來停止執行當前函式,轉而執行呼叫該函式後面的語句,一般形式
    return<表示式>;
    例如

// lianxi.cpp : 定義控制檯應用程式的入口點。
//

#include "stdafx.h"
#include<iostream>
#include <iomanip>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    int n=100;
    int i,j;
    for(i=2;i<=n;i++)
    {
        int flag=1;
        for(j=2;j<i;j++)

            if(i%j==0)
            {
                flag=0;
                break;
            }
            if(flag==1)
                cout<<i<<",";
    }
    cout<<endl;
    getchar();
    return 0;
}

這裡寫圖片描述

參考:《21天學通C++》作者:劉蕾