Board logo

主題: [資訊電機] [問題]C++中switch的寫法該如何寫? [打印本頁]

發表人: 老江    時間: 2005-4-5 09:42 PM     主題: [問題]C++中switch的寫法該如何寫?

最近在練習寫c++
遇到了一個例題,看起來應該是用switch的寫法
不過怎麼寫程式都給我自爆
連去網路上查教學copy回來的程式碼都自爆(題外話,用google搜尋竟然都搜到大陸香港才有教學..)
想問一下switch的寫法
switch (enter){
case ' a':
    prinft("xxx");
    break;
default:
    printf("yyy");
}
是不是大概是這樣寫
還有其中enter是用char定義嗎?
因為程式的要求是輸入一個代號
然後做出不同動作
所以說一開始是
char enter;
printf("請輸入代號");
scanf("%c",&enter);
用%c應該沒錯吧

附上題目讓大家看看好了,免得我說半天沒人看懂
Write a program that computes the area of different shapes.The program repeatedly ask the user for a command (a single character).,and performs the action as shown blew.

User enters        Action
------------------------------------------------------------------------
q                  programs ends
e                  get two numbers from keyboard and display the area of a rectangular
f                   Get an radius from keyboard and display the area of a circle
s                   Get a number from keyboard and display the area of a equal lateral hexagon
all others       Display an error message "Invalid Number"

應該是用switch加上副程式來寫吧
發表人: Acute    時間: 2005-4-5 10:43 PM

對阿, 但是, 'a' 前面不該有空白
還有, 是printf, 不是prinft

你要的應該大約是:
switch (enter)
{
   case 'q':
   case 'Q':
       //
       break;
   case 'e':
   case 'E':
       //
       break;
   case 'f':
   case 'F':
       //
       break;
   case 's':
   case 'S':
       //
       break;
   default:
       //
       break;
}



Acute.
發表人: GERRYccc    時間: 2005-4-6 10:06 AM


引用:
寫到:
哈哈。。偷來改。。藍色的是我改過的= =||
你要的應該大約是:
switch (enter)
{
   case 'q':
   case 'Q':
       動作;
       break;
   case 'e':
   case 'E':
       動作;
       break;
   case 'f':
   case 'F':
       動作;
       break;
   case 's':
   case 'S':
       動作;
       break;
   default:
       動作;
       break;
}


switch (迴圈條件) //可用字元變數char,也可以用整數型態變數int,double,...,隨你^^

另外,你的題目是英文的,我看不懂= =||..可以翻譯中文嗎??

[GERRYccc 在 2005-4-6 10:12 AM 作了最後編輯]
發表人: 柚祐    時間: 2005-4-6 04:10 PM

呵呵 .. 都被別人講完了 .. ^^

大概就是 default 後面記得加上 break 是要小心的地方 .. 就這樣 ..

default:
動作;
break;
發表人: Acute    時間: 2005-4-6 05:48 PM


引用:
柚祐寫到:
呵呵 .. 都被別人講完了 .. ^^

大概就是 default 後面記得加上 break 是要小心的地方 .. 就這樣 ..

default:
動作;
break;


閒閒沒事來吐槽
習慣上, default 會寫在最後面 (老江也是寫在最後面)
switch-case 的最後面一個, break 省略是不會錯誤的
因為他執行完畢, 後面沒東西了, 並不會構成錯誤

Acute.
發表人: 老江    時間: 2005-4-6 09:37 PM

我寫完了
但是很慘烈的是..會自爆
先貼上我寫的程式碼
#include< stdio.h >
double rec(double r1,double r2);
double cir(double r);
double hex(double h);
int main(void)
{
    char enter;
    double r1,r2,r,h;
    printf("請輸入代號>");
    scanf("%c",&enter);
    switch(enter)
    {
    case 'q':
    case 'Q':
         return 0;
         break;
    case 'e':
    case 'E':
         printf("請輸入長與寬>");
         scanf("%lf,%lf",&r1,&r2);
         printf("面積是%f",rec(r1,r2));
         break;
    case 'f':
    case 'F':
         printf("請輸入圓半徑>");
         scanf("%lf",&r);
         printf("面積是%f",cir(r));
         break;
    case 's':
    case 'S':
         printf("請輸入六邊形邊長>");
         scanf("%lf",&h);
         printf("面積是%f√3",hex(h));
         break;
    default:
            printf("Invaild Number");
            return 0;
    }
}
double rec(double r1,double r2)
{
       return (r1*r2);
}
double cir(double r)
{
       return (r*r*3.14);
}
double hex(double h)
{
       return (h*1.5);
}                  

Switch方面輸入正常代號都沒問題,會跑出下一步要求輸入數字
但是一旦打到default裡的
就自爆
printf那行沒出現就爆了
病症二
輸入完數字之後
自爆
我在想是副程式的問題
不過看了半天好像沒寫錯啊

[老江 在 2005-4-6 09:53 PM 作了最後編輯]
發表人: 柚祐    時間: 2005-4-6 09:58 PM

哎呀 ~ 被小毒王吐槽了 ~~ ^^

我是不太熟break;的意義 .. 只有乖乖照著書來寫 .. ^^

=============

to: 老江

你這樣真的可以編譯成功嗎 ??  #include 後面沒有乎 ?


另外後面 return 0 的位置不對 .. ^^

CODE:
[Copy to clipboard]
....

         printf("面積是%f√3",hex(h));
         break;
    default:
            printf("Invaild Number");
    }
            return 0;
}

-----
改了應該就可以了 ...

[柚祐 在 2005-4-6 10:00 PM 作了最後編輯]
發表人: 老江    時間: 2005-4-6 10:07 PM

#include後面是有打的
不過copy太順,論壇把它看作html語法所以沒顯示出來
編譯都沒有問題
所以自爆找不出在那錯了

return 0我改了位子了
編譯..OK
執行..自爆

之前那個位子他也沒查出有錯

發表人: 柚祐    時間: 2005-4-6 10:26 PM

我剛剛是了一下 .. 可以耶 .. ^^

我貼出來好了 ..

CODE:
[Copy to clipboard]
#include<stdio.h>
#include <stdlib.h>

double rec(double r1,double r2);
double cir(double r);
double hex(double h);

int main(void)
{
    char enter;
    double r1,r2,r,h;
    printf("請輸入代號>"); scanf("%c",&enter);
   
    switch(enter)
    {
    case 'q':
    case 'Q':
         return 0;
         break;
    case 'e':
    case 'E':
         printf("請輸入長與寬>");
         scanf("%lf,%lf",&r1,&r2);
         printf("面積是%f",rec(r1,r2));
         break;
    case 'f':
    case 'F':
         printf("請輸入圓半徑>");
         scanf("%lf",&r);
         printf("面積是%f",cir(r));
         break;
    case 's':
    case 'S':
         printf("請輸入六邊形邊長>");
         scanf("%lf",&h);
         printf("面積是%f√3",hex(h));
         break;
    default:
         printf("Invaild Number");
         break;
    }

    system("PAUSE");
    return 0;
}

double rec(double r1,double r2)
{
       return (r1*r2);
}
double cir(double r)
{
       return (r*r*3.14);
}
double hex(double h)
{
       return (h*1.5);
}   

發表人: 老江    時間: 2005-4-6 10:40 PM

#include < stdlib.h >
system("PAUSE");

我很仔細的看了幼幼跟我的程式差別
發現少這兩行而已
就讓我的程式不再自爆
這兩行到底是有何德何能
我敗了...orz


我原本的程式是錯在邏輯上嗎
想想也沒錯的感覺
到底是怎麼一回事
發表人: 柚祐    時間: 2005-4-6 11:23 PM

喔 .. 原來你的自爆的意思是這個阿 .. ^^

我用的整合編譯器是 Dev-C++  是需要加上這個語法  system("PAUSE");

是想要讓結果暫時停留在畫面之中 ...

好像不能算是C語言的一部分 (詳情我也不清楚) ..


至於其他的編譯器我就不知道需不需要加了 ?  (順便問一下 .. 你是用什麼呢 ? )

[柚祐 在 2005-4-7 07:07 AM 作了最後編輯]
發表人: Acute    時間: 2005-4-7 10:48 AM

感覺上不對 @_@
程式已經說, q  結束程式, 那表示, q command 以前, 程式不應該結束
此外, system () 是執行一個外部程式或命令, 沒事也別用
程式應該這樣比較合理: (我直接拿你們的code, 加上while (1) {....} 而已

CODE:
[Copy to clipboard]
#include<stdio.h>

#include <stdlib.h>



double rec(double r1,double r2);

double cir(double r);

double hex(double h);



int main(void)

{

    char enter;

    double r1,r2,r,h;


    while (1)
    {


       printf("請輸入代號>"); scanf("%c",&enter);
   
      
   
       switch(enter)
   
       {
   
          case 'q':
      
          case 'Q':
      
               return 0;
      
               break;
      
          case 'e':
      
          case 'E':
      
               printf("請輸入長與寬>");
      
               scanf("%lf,%lf",&r1,&r2);
      
               printf("面積是%f",rec(r1,r2));
      
               break;
      
          case 'f':
      
          case 'F':
      
               printf("請輸入圓半徑>");
      
               scanf("%lf",&r);
      
               printf("面積是%f",cir(r));
      
               break;
      
          case 's':
      
          case 'S':
      
               printf("請輸入六邊形邊長>");
      
               scanf("%lf",&h);
      
               printf("面積是%f√3",hex(h));
      
               break;
      
          default:
      
               printf("Invaild Number");
      
               break;
   
       }

    }

}



double rec(double r1,double r2)

{

       return (r1*r2);

}

double cir(double r)

{

       return (r*r*3.14);

}

double hex(double h)

{

       return (h*1.5);

}   
另外, 萬一真的需要讓程式暫停, 後面才結束, 建議用:
printf ("Press Enter to continue...");
getchar ();


Acute.
發表人: GERRYccc    時間: 2005-4-7 03:12 PM


引用:
Acute寫到:
...

CODE:
[Copy to clipboard]
...
另外, 萬一真的需要讓程式暫停, 後面才結束, 建議用:
printf ("Press Enter to continue...");
getchar ();

Acute.


來抓毒王錯字.....要讓他暫停應該是 getch(); 這樣就好了:icons8
送花送花~~~~要送三朵唷
========================================
補充:抓失敗,被反抓

[GERRYccc 在 2005-4-8 03:36 PM 作了最後編輯]
發表人: 老江    時間: 2005-4-7 08:03 PM

我是用Bloodshed Dev-C++
原本想灌微軟的.net
不過好肥..
所以就灌了這個

自爆就是說程式自己就關了
之前會一直遇到這問題(第一篇程式碼時)

的確應該是在輸入Q之前程式都不應該關掉
我之前是想說用goto next讓他繼續跑
不過不行

在加入小神童的while之後就不會在跑完一項就跳掉了
不過每次都會看到那句Invaild Number

這好像是必然的結果

不過我不知道有while (1)這種用法呢
我認識的while是在那邊算count算到滿足條件為止
沒想到還可以打個(1)就好了
真是太神奇了
發表人: Acute    時間: 2005-4-7 10:43 PM


引用:
GERRYccc寫到:

引用:
Acute寫到:
...

...
另外, 萬一真的需要讓程式暫停, 後面才結束, 建議用:
printf ("Press Enter to continue...");
getchar ();

Acute.


來抓毒王錯字.....要讓他暫停應該是 getch(); 這樣就好了:icons8
送花送花~~~~要送三朵唷


gerry, 今天就教你C 語言, 算你30朵花, 自己去送

1. getch(), getche() 這是DOS 環境下, Microsoft/Borland 在百般無聊情形下, 提供的取得字元方法, 所以, 這兩個function 在Windows 32 bits console program 中就無法使用了 (使用MSVC 6.0 選擇建立console program)

2. getchar () 這是標準的C function, 90% 的platform 都會提供這個function, so, 要讓你的C program 可以跨平台, 必須使用這個function, 不能用那些特定compiler 提供的function

Acute.
發表人: Acute    時間: 2005-4-7 10:48 PM


引用:
老江寫到:
我是用Bloodshed Dev-C++
原本想灌微軟的.net
不過好肥..
所以就灌了這個

自爆就是說程式自己就關了
之前會一直遇到這問題(第一篇程式碼時)

的確應該是在輸入Q之前程式都不應該關掉
我之前是想說用goto next讓他繼續跑
不過不行

在加入小神童的while之後就不會在跑完一項就跳掉了
不過每次都會看到那句Invaild Number

這好像是必然的結果

不過我不知道有while (1)這種用法呢
我認識的while是在那邊算count算到滿足條件為止
沒想到還可以打個(1)就好了
真是太神奇了


你會每次看到一個Invaild Number 是因為你輸入兩個字元, 但是只讀取一個
你想你按鍵的順序, 先按字母E, 再按Enter key, 所以, 你輸入兩個字元
但是你的程式scanf("%c",&enter); 只收走一個字元, 所以, 另一個, 下次收到
你可以在scanf 後面加一個getchar (), 這樣子, 解決眼前問題
但是user 輸入錯誤, 你依然是錯
等我晚一點有空再告訴你怎麼辦... 我要回家了, 哈

Acute.
發表人: Acute    時間: 2005-4-7 11:34 PM

程式利用gets () 一次取得一個字串輸入, 而不要取得字元輸入
這樣子, 可以避免掉很多問題
也就是:

char buf[255]

gets (buf);

然後buf[0] 就相當於你的enter
這樣子, 萬一user 一次輸入好幾個字元, 你會通通收下來, 然後只解釋第一個字元 (因為只用buf[0])
另外, 程式要稍微好看一點點, 前面應該加一些printf 敘述, 把允許的command 印出來

最後... 以上的程式碼... 是C 語言, 不是C++

Acute.
發表人: 老江    時間: 2005-4-8 08:00 AM

原來如此
enter key也能算是一個字元啊
我再去查查get的用法好了

其實我只是懶的打這麼多printf...XD

題外話
小神童的簽名檔裡第二個連結消失了喔
"指定的主題不存在或已被刪除,請返回。"
發表人: GERRYccc    時間: 2005-4-8 05:38 PM

我已經大致把一些細節改美觀了,完整呈現!!

CODE:
[Copy to clipboard]
/*
User enters        Action
------------------------------------------------------------------------
q                  programs ends
e                  get two numbers from keyboard and display the area of a rectangular
f                   Get an radius from keyboard and display the area of a circle
s                   Get a number from keyboard and display the area of a equal lateral hexagon
all others       Display an error message "Invalid Number"
*/
#include<stdio.h>

double rec(double r1,double r2);
double cir(double r);
double hex(double h);

int main(void)
{
    while(1)
{
    char enter[255];
    double r1,r2,r,h;
    printf("Q:離開程式\n");
    printf("E:計算長方形面積\n");
    printf("F:計算圓面積\n");
    printf("S:計算等邊六邊形面積\n");
    printf("\n請輸入代號>"); gets (enter);
    switch(enter[0])
    {
    case 'q':
    case 'Q':
         return 0;
         break;
    case 'e':
    case 'E':
         printf("\n請輸入長方形的長>");
         scanf("%lf",&r1);
         printf("請輸入長方形的寬>");
         scanf("%lf",&r2);
         printf("\n長方形面積:%f",rec(r1,r2));
         break;
    case 'f':
    case 'F':
         printf("\n請輸入圓半徑>");
         scanf("%lf",&r);
         printf("\n圓面積:%f",cir(r));
         break;
    case 's':
    case 'S':
         printf("\n請輸入六邊形邊長>");
         scanf("%lf",&h);
         printf("\n六邊形面積:%f",hex(h));
         break;
    default:
            printf("\n###########################");
         printf("\nInvaild Number,輸入錯誤");
            printf("\n###########################");
         printf("\n\n請按任意鍵後重新輸入...");
         break;
    }
    printf("\n\n");
    getchar();
    printf("\n\n");
}
}
//副程式區
double rec(double r1,double r2)
{
       return (r1*r2);
}
double cir(double r)
{
       return (r*r*3.14);
}
double hex(double h)
{
       return (h*1.5);
}
我已經把程式改好了,之前變亂碼是因為我用幼幼那套DEV-C++在學校寫的結果...
一時不察,請見諒…另外,DEV-C++不支援getchar(); 跟 gets (); 令我納悶,
並不是沒有看阿Q的講解唷^^"
現在在家已經把程式成功寫出來了,也排版好了!請笑納^^"
<hr>
2005-04-12-補充:今天到學校把寫好的這段程式碼又COPY到DEV-C++卻又可以正常執行了
我錯怪DEV-C++哩...不過當天為啥不能用,我還是無解

[GERRYccc 在 2005-4-11 09:37 AM 作了最後編輯]
發表人: Acute    時間: 2005-4-9 03:05 AM

GERRYccc 你都不看我前面的發文喔
兩篇文都在說如何避免出現輸入錯誤的問題
真是被你打敗了...

so, 我不是跟你要花, 我是要罰你不認真看文
一篇不認真看, 罰10朵, so, 總共20朵, 記得繳來
還要負責把程式寫好

Acute.
發表人: 老江    時間: 2005-4-9 09:30 AM

我的程式突然變的好巨大
而且怎麼還有看起來像亂碼的東西
這真的是我的那個小程式嗎XD

//和/* */是一樣的嗎?
我發現GERRY的註解都這樣寫
發表人: jocosn    時間: 2005-4-9 10:45 AM


引用:
老江寫到:
我的程式突然變的好巨大
而且怎麼還有看起來像亂碼的東西
這真的是我的那個小程式嗎XD

//和/* */是一樣的嗎?
我發現GERRY的註解都這樣寫


都是註解,一個可以跨行,一個不行
老江你書看的不夠多,不然就是看錯本
書要先看再寫程式,邊看邊寫或是不看就寫會很慘的
發表人: Acute    時間: 2005-4-10 03:07 AM

C 語言課程Part II:

/* .... */    這是最初的C 語言註解方式, 在開始跟結束的符號中間, 可以加任意長度, 任意行數的註解
//      這是ANSI C 開始才有的註解方式, 僅適用單行的模式, 也就是, 該符號之後一直到該行結束為止都是註解

某些早期的compiler 並無法支援// 的註解方式 ^^"
^^" 其實這些在小神童的C 語言筆記當中, 都有提到喲

Acute.
發表人: jocosn    時間: 2005-4-10 06:40 AM


引用:
Acute寫到:
..........
^^" 其實這些在小神童的C 語言筆記當中, 都有提到喲
Acute.


有沒有 "小神童傳奇之C++ 語言筆記"、或是 "小神童傳奇之C# 語言筆記"
"小神童傳奇之 C 式語言筆記 3 部曲--C、C++、C#"
發表人: GERRYccc    時間: 2005-4-11 03:36 AM


引用:
老江寫到:
我的程式突然變的好巨大
而且怎麼還有看起來像亂碼的東西
這真的是我的那個小程式嗎XD

//和/* */是一樣的嗎?
我發現GERRY的註解都這樣寫


不好意思,一時不察,中文都變亂碼了...
因為在學校用的是FREE軟體,所以怪怪~呵呵...
在家已經修正OK囉~用的是 Builder6

也有執行測試過了…很美觀嚕唷^^




歡迎光臨 TWed2k (http://twed2k.org/) Powered by Discuz! 4.1.0