c++ switch 和 while迴圈 基礎題

此乃由下述的網站 所提供的題目

http://www.tcgs.tc.edu.tw/~sagit/cpp/p5.htm

http://www.tcgs.tc.edu.tw/~sagit/cpp/p6.htm

由於if 我已大致了解 再麻煩各位網友的幫忙了 目前要邁向下一階段 swiich 和 while迴圈 一起

switch題

1.編班問題

自由國小有新生 200 名,要編入四個班級裡,學校的作法是將學生依名字的筆劃順序編了 1 到 200 號,然後 1 號在一班、 2 號在二班、 3 號在三班、 4 號在四班,而 5 號又回到一班、 6 號在二班、 7 號在三班、 8 號在四班,以此類推……

現在,我們要寫一個程式,輸入一個 1 到 200 的整數(不必檢查是否超出這個範圍),印出該名學生要編到哪一班,例如:

輸入1:75

輸出1:三班

輸入2:120

輸出2:四班

2.班級編號

為了方便記錄,我們常常把年級和班級以三個數字來稱呼,例如 "三年二班" 稱為 302、二年十一班稱為 211 等,其中百位數為年級,而後兩位數為班級。台中市自由路上的某間女子高中有三個年級,每個年級各有18個班。

現在我們要寫一個程式,輸入前面提到的三位數,然後印出它所代表的班級,如果輸入了無法對應的年級或班級,則印出 "某年" 或 "某班",例如:

輸入1:302

輸出1:三年二班

輸入2:211

輸出2:二年十一班

輸入3:501

輸出3:某年一班

輸入4:119

輸出4:一年某班

提示:請將年級和班級分開用兩次的 switch 來處理,至於如何從輸入的數字取得它的年級和班級,則可以使用 /、% 這兩個運算子。

3.四則運算

請你寫一個程式,可以輸入類似 123+456 這樣的運算式,前後兩個數都是浮點數,中間的運算符號可以是加(+)、減(-)、乘(*)、除(/)等四種,然後印出計算結果,例如:

輸入1:123+456

輸出1:579

輸入2:543-111

輸出2:432

輸入3:30*12

輸出3:360

輸入4:987/4

輸出4:246.75

提示:運算符號為一個字元,以請 char 型態宣告,而在 switch 裡則是用 case '+' : 這樣的語法,也就是把字元前後加上 ' 符號。

while迴圈

1.第二大的因數

對於每個正整數來說,至少有兩個因數─ 1 和自己。現在要寫一個程式,輸入一個正整數 N,印出 N 的因數中第二大那個數。(也就是僅次於 N 的因數)例如:

輸入1:100

輸出1:50

輸入2:13

輸出2:1

提示:假設你輸入的數是 n,則從 n-1、n-2 一個一個試下來,第一個找到 n 的因數就是它第二大的因數。

2.不超過 10000 的最大次方

對於每個小於 10000 的正整數 A,一定有一個正整數 N,使得 A 的 N 次方小於或等於 10000,而 A 的 N+1 次方則超過 10000。現在要寫一個程式,輸入一個整數 A,印出對應的 N 以及 A 的 N 次方的值,例如:

輸入1:10

輸出1:4 10000

輸入2:2

輸出2:13 8192

提示:用一個變數去記錄 a 的 n 次方,每經過一次迴圈,就把它乘上 a 的值,並同時把 n 加一,直到超過 10000 為止。

3.所有位數和

輸入一個正整數,然後印出它所有位數和。例如:

輸入1:123456789

輸出1:45

輸入2:22205108

輸出2:20

提示:我們可以該數除以 10 取其商以及餘數,餘數即是個位數的值,而商則是去掉個位數以後剩下的部分。如此反覆即可算出所有位數的和。

Update:

switch題

1.編班問題

自由國小有新生 200 名,要編入四個班級裡,學校的作法是將學生依名字的筆劃順序編了 1 到 200 號,然後 1 號在一班、 2 號在二班、 3 號在三班、 4 號在四班,而 5 號又回到一班、 6 號在二班、 7 號在三班、 8 號在四班,以此類推……

關於這一題 如何判斷 x<=0||x>200 輸入錯誤

Update 2:

還有關於if 和 switch 如何一起使用呢

Update 3:

麻煩大大幫我看一下

{ int a;

cin >> a;

switch(a%4){

case 1:

cout<< "一班" <

a 為輸入錯誤 如何加在 我寫的程式

Update 4:

int a;

cin >> a;

switch(a%4){

case 1:

cout<< "一班" <

Update 5:

int a;

cin>>a;

switch(a%4){

case 1 :

cout<< "一班" <

Update 6:

http://www.badongo.com/file/11304729

抱歉 貼程式碼 到知識+好像都會出問題 只顯示前面部分 我有把程式碼放到便當狗 麻煩這位大大看一下

Update 7:

scanf("%d", &num);

cls = num / (200/5) +1;

關於大大所寫的這題 scanf還有%d &可以麻煩一一解說一下為何使用它嗎

如果太麻煩 也不勉強 還是很謝謝大大您的幫助

2 Answers

Rating
  • 1 decade ago
    Favorite Answer

    1. switch 一定要配 case, case 裡99.99999%要 break

     if 不一定要配 else

    2. case 一定是整數,所以 switch 只能對整數

     if 只看它是不是 0 (false)。不是 0,就都是真 (true)

     所以,double, float, int, bool char ... 都可以

    3. 也因此,if 可以是範圍,switch 不容易寫成範圍。

    4. 如果是一堆的 if,(通常要4~5個以上)速度會很慢!

     設法把它們變成整數,改用 switch,速度快很多!!

    2008-09-10 07:16:28 補充:

    至於要如何一起使用?

    就像堆積木一樣!

    只要堆起來不會倒、像你要的東西,

    就是對的寫法!

    (不一定是好的寫法!!)

    加油! ^_^

    2008-09-11 06:36:12 補充:

    沒人要幫你,我就下海了。

    請先看意見,自己練過,再看下面的東西!

    因為你問 switch / if,其它的 code 我多數省略

    scanf("%d", &num);

    cls = num / (200/5) +1; // +1 為了方便 cls = 班; 不加也可,case 要從 0開始!

    switch (cls) // switch 寫法

    { case 1: 一班; break;

    case 2: 二班; break;

    ...

    case 5: 五班; break;

    defaule: 錯誤處理; break;

    }

    scanf("%d", &num);

    cls = num / (200/50) +1; // 可以省略

    if (num<0 || num >=201) { 錯誤; } // if 寫法

    else if (num < 51) { 一班; }

    else if (num < 101) { 二班; }

    ...

    else {num < 201 }{ 五班; }

    char *Grad, *Clas;

    scanf("%d", &num);

    grad = num / 100;

    clas = num %100;

    switch (grad)

    { case 1: Grad = "一"; break;

    case 2: Grad = "二"; break;

    case 3: Grad = "三"; break;

    default: Grad = "某"; break;

    }

    switch (clas)

    { case 1: Clas = " 1"; break;

    case 2: Grad = " 2"; break;

    ...

    case 18: Grad = "18"; break;

    default: Grad = "某"; break;

    }

    printf("%s年%s班", Grad, Clas);

    註:這題 clas 可用

    if (clas >= 1 && clas <19)

    { Clas = sprintf(buf, "%02d", clas); }

    else Clas = "某";

    (最前面要加 char buf[8];)

    其它你就自己練習了!

    有了上面二個範例,下面的應該要完全自己練習,才真的有幫你。

    不過,迷你計算機、找第二大 兩題其實是有一點程度的難題!

    寫小程式沒多少差;

    寫大時,...

    初學者,先把積木堆起來不會倒!

    將來,再學怎麼堆好它!

    (找第二大因數那題,你要是照範例寫,我可以寫出快你數百倍以上的程式)

    當你語法會了,要學演算法時,

    寫不出10倍以上的程式,再發問。

    加油! ^_^

    2008-09-11 06:36:59 補充:

    有個 default 打成 defaule 了! :$

    2008-09-11 06:37:56 補充:

    你一年多前一問

    http://tw.knowledge.yahoo.com/question/question?qi...

    我有補點竟見。

    請回去看。

    2008-09-12 09:08:26 補充:

    cin >> a;

    if (a<1 || a>200)

    cout << "錯誤\n";

    switch(a%4)

    沒事不要用 endl!程式N重變慢!

    下面是由快到慢的同一列程式!

    cout << "錯誤\n";

    cout << "錯誤" << '\n'

    cout << "錯誤" << "\n";

    cout << "錯誤" << endl; // 功能多了一小點點,多數情況下用不到!

    2008-09-12 09:08:38 補充:

    scanf("%d", &num);

    scanf 是 C 的寫法。

    速度也 C++ 的 >> 快,但只能輸入 基本型態+字串。

    C++ 把 >> overload 後,可輸入各種型態!

     但也因此是它慢的原因〝之一〞(還有其它原因)。

    scanf 要告訴它:你要使用者輸入的是什麼型態,常用的有:

     d: 十進位

     i: 整數(可以是八進位等)

     f: float

     lf: double

     s: 字串

     c: 字元

    而傳入的變數,要是它的位址!

    所以,前面加了 &

  • 1 decade ago

    抱歉 因為我是初學者 雖然對您來說 可能很簡單 但我因為剛學而已 當然不是很了解 麻煩各位大大了

    2008-09-11 20:41:54 補充:

    int a;

    cin >> a;

    switch(a%4){

    case 1:

    cout<< "一班" <

Still have questions? Get your answers by asking now.