(八十六)switch語句

2021-07-08 17:57:05 字數 4877 閱讀 7877

switch的格式是:

switch(int型別變數名)

注意:(假設int型別變數名為a)

①case後面的數字,代表選擇,在int型別變數名的值等於該數字時,執行相應case後面的**,

並且!從這行開始一直執行到最後乙個case的**。除非使用break結束switch。如假設a為1,他會執行**1,然後執行**2,然後執行**3,而非僅僅只執行**1。

②假如int變數的值不等於case後面的數字,如果有default,則執行這一行後面的**;如果沒有,那麼不會執行switch裡面的**,跳過switch,執行之後的**。

③可以在switch外面套一層do while進行約束,while的條件是非case選擇,例如case選擇是1~4,while則是!=1&&!=2&&!=3&&!=4這樣。或者假如變數a是int型別,

do  cout<<"重新輸入:";cin>>a;}

while(a<1||a>4);

④假如選擇後面執行的東西比較多,使用自建函式比較好

⑤case 1也可以換為case 'a'等

⑥default 表示如果以前都不符合,則執行這一行**。

上**:

#includeusing namespace std;

void change();

void money();

void meinv();

void work();

void study();

int main()

} while (a < 1 || a>4);

system("pause");

return 0;

}void change()

void money()

void meinv()

void work()

void study()

輸出:

從以下選擇中,挑乙個你喜歡的吧!

1.一千萬美金。

2.乙個絕世美女\壯漢。

3.乙個待遇優渥的工作。

4.乙個可以任意學習的機會

你的選擇是:1

你獲得了一千萬美金,但是,你確定你會花麼……

請按任意鍵繼續. . .

總結:

①使用do while的好處是,必定執行一次switch,當我們需要使用者必須經歷這個選擇的時候,使用這個比較好;

②使用int的優點在於,好設定,while的條件設定簡單。

缺點在於:假如使用者輸入字元(比如字母a),那麼會無限執行default後面的第一行**,如:cout <<

"你輸入錯啦,請重新輸入:";

③將int變數改為char型別,則需要相對修改**。主要修改內容是,case後面的字元,從1改為'1'(表示是字元1),while括號內的判斷語句。

如**:

char a;

change();

do } while (a !='1'&&a!='2'&&a!='3'&&a!='4');

輸出:

從以下選擇中,挑乙個你喜歡的吧!

1.一千萬美金。

2.乙個絕世美女\壯漢。

3.乙個待遇優渥的工作。

4.乙個可以任意學習的機會

你的選擇是:g

你輸入錯啦,請重新輸入:f

你輸入錯啦,請重新輸入:1

你獲得了一千萬美金,但是,你確定你會花麼……

請按任意鍵繼續. . .

這個時候,無論輸入哪個字元,都不會有問題了。

但出現了新問題:

①假如使用者連續輸入多個字元,例如:1234這樣,那麼結果只會讀取使用者輸入的第乙個字元(即'1'),似乎只能在之前註明輸入多個字元只會讀取乙個,以防止使用者產生誤解。

②假如連續輸入幾個字元,例如aaa(3個大寫字母a),那麼就會連續彈出三段"你輸入錯啦,請重新輸入:"這樣的文字。原因在於緩衝區的字元多次讀取。

解決方法:加上**:

cin.sync(); //用於清除輸入緩衝區的各種字元

於是問題解決。

ps:switch用在動作選擇感覺比較好。

即如**:

void combat()

cin.sync(); //用於清除輸入緩衝區的各種字元

} while (act != 'a'&&act != 'b'&&act != 'c'&&act != 'd');

}

a、b、c這三個函式相對簡單。

a:執行對對方造成傷害,結束動作,輪到對方;

b:增加防禦係數,結束動作後,輪到對方動作時減少對自己的傷害;

c:逃跑成功則離開combat()函式,逃跑失敗則結束動作,輪到對方;

d:呼叫技能函式,比較複雜。

假如執行成功動作,成功執行乙個動作(比如說類似攻擊函式的函式),返回值為'd',然後if通過判斷,執行break結束switch,又因為不在while範圍內,結束while。

假如沒有成功執行動作(比如沒有技能可以用),例如返回乙個值'f',因為,不在if範圍,於是無法break,執行default**,又因為在while範圍判斷內,因此重新執行選擇。

switch多種選擇執行同一行**:

即比如無論我輸入小寫a還是大寫a,都執行同乙個函式,比如上面的attact()。

但問題是,while判斷的條件又增多了。

這種方式,利用的是switch函式在非break情況下,會從符合要求的該行逐行往下執行的特點。

**:

do

cin.sync(); //用於清除輸入緩衝區的各種字元

} while (act != 'a'&&act != 'b'&&act != 'c'&&act != 'd'&&act != 'a'&&act != 'b'&&act != 'c'&&act != 'd');

效果是a和a,b和b等,是等價的。

switch的缺點:

①不適合執行範圍。例如case後面要麼是'a',要麼是'1',但不能是》1等。

②只能執行整數(包括char型別,因為char型別能轉為ascii碼,而ascii碼的每個符號的int值都是整數),不能執行浮點數。例如:case '1.1'是不行的,甚至int a改為double a,編譯器都會提示出錯。

使用列舉作為標籤:

列舉在使用方法上類似int型別變數,也存在同樣的缺點(即輸入字母時會出現無限迴圈輸出),以下**改自int型別變數的**:

enum;	//宣告列舉,因為初始a=1,於是b=2,c=3,d=4

int m;

change(); //某個顯示函式

do } while (md); //除了有些時候可能更顯眼一些,並沒有發現有什麼特別的優點。

由於cin不支援輸入列舉名字,例如上面的a、b、c、d,因此還是需要int型別變數m。

在switch(m)的括號裡面,也需要是int型別的變數m。

在case後面,可以用列舉相應的名字進行代替,例如a代替1等。

注意:列舉天生特點,後面的列舉變數名,在未宣告的情況下,自動比前面的值大1。

使用while限制switch:

如果說,使用do while的目的是為了要求必須執行一次判斷,然後要求不符合條件的輸入,就需要重新輸入。

那麼使用while的特點就是,不符合條件的,直接不進行判斷和出現相應的選擇了。

例如,我們假設觸發某個選擇支,要求好感度達到50以上,於是**:

if (好感度》50)

//m給個不符合要求的值

while (好感度》50 && m != 'a' && m != 'b') //好感度滿足,且輸入的不符合要求則迴圈

}

假如好感度滿足條件,才有機會觸發這個支線。

假如好感度不滿足條件,if和while的判斷都不能通過,於是跳過,即無switch選擇。

也可以用在,比如說,如果玩家願意做出乙個選擇,並等待一定時間,那麼就可以增長乙個屬性(變數),只要玩家不願意退出,那麼就可以無限進行,大概**思路如下:

**:

#include#includeusing namespace std;

int gold = 0; //全域性變數gold

int vit = 0;

void abc();

void def(); //def函式省略不寫,類同abc函式

int main()

cout << "假如你需要繼續進行,請輸入a或者b,否則輸入任意鍵結束迴圈:";

cin >> a; }}

void abc()

void def()

輸出:

你現在金錢為:0

你現在vit為:0

a你的金錢增長了10g

你現在金錢為:10

假如你需要繼續進行,請輸入a或者b,否則輸入任意鍵結束迴圈:a

你的金錢增長了10g

你現在金錢為:20

假如你需要繼續進行,請輸入a或者b,否則輸入任意鍵結束迴圈:b

你的vit增長了10

你現在vit為:20

假如你需要繼續進行,請輸入a或者b,否則輸入任意鍵結束迴圈:b

你的vit增長了10

你現在vit為:20

假如你需要繼續進行,請輸入a或者b,否則輸入任意鍵結束迴圈:r

請按任意鍵繼續. . .

一念永恆 第八十六章 又來這套

白小純一路心驚膽顫,速度飛快,直接跑下了山,甚至跑出了宗門,在靈溪宗山門外的坊市裡,他轉悠了好久。怎麼辦。白小純愁眉苦臉,他心底委屈的不得了,一想起分明是那只鳥自己過來搶走了丹藥,可如今怎麼也都解釋不清楚,周長老也不講理 不過,我好像是 第一?白小純正發愁時,忽然想起了什麼,愣了一下。哎呀,以我掌門...

十八 十六進製制轉八進位制

問題 十六進製制轉八進位制 問題描述 給定n個十六進製制正整數,輸出它們對應的八進位制數。輸入格式 輸入的第一行為乙個正整數n 1 n 10 接下來n行,每行乙個由0 9 大寫字母a f組成的字串,表示要轉換的十六進製制正整數,每個十六進製制數長度不超過100000。輸出格式 輸出n行,每行為輸入對...

二,十,八,十六進製制之間的轉換

4位二進位制數 1101 沒有4位用0補齊 轉化為十進位制的演算法 把1101對應8421,對應著有1的數相加,即為 8 4 1 13。比如隨便乙個小於等於15的正整數 11 小於等於15的原因是8 4 2 1 15 轉化為二進位制的演算法 11可由8421這四個數中對應的821組成。即為 1011...