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...