
主題: [資訊電機] [問題]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 的位置不對 .. ^^
....
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
我剛剛是了一下 .. 可以耶 .. ^^
我貼出來好了 ..
#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) {....} 而已
#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寫到:
...
...
另外, 萬一真的需要讓程式暫停, 後面才結束, 建議用:
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
我已經大致把一些細節改美觀了,完整呈現!!
/*
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 |