No.17865![]() |
switch → forなどに変換 投稿者---k(2004/11/08 16:41:15) |
||
#include <stdio.h> double F2C( double ); double C2F( double ); double input_tempC( void ); int judge_temp( double ); int main( void ){ double iCel; /* 説明を表示 */ printf( "摂氏と華氏双方の温度とそれに従ってメッセージを出力するプログラムです\n\n" ); iCel = input_tempC(); /* 摂氏温度取得 */ switch( judge_temp( iCel )){ case 1: printf( "Cold\n" ); break; case 2: printf( "Cool\n" ); break; case 3: printf( "Warm\n" ); break; case 4: printf( "Hot\n" ); } printf( "摂氏%f度、華氏%f度\n", iCel, C2F( iCel ) ); return 0; } double F2C( double a ){ /* 華氏→摂氏変換関数 */ a = ( a - 32 ) / 1.8; return a; } double C2F( double a ){ /* 摂氏→華氏変換関数 */ a = 1.8 * a + 32; return a; } double input_tempC( void ){ /* 温度と表示単位を入力させ、摂氏の温度を返す関数 */ double a; char b; /* 値の入力と代入 */ inputdialog: printf( "温度と表示単位(摂氏[Celsius] = C,華氏[Fahrenheit] = F)を入力してください >>>" ); scanf( "%lf %c", &a, &b ); switch( b ){ case 67: case 99: return a; case 70: case 102: return F2C( a ); default: /* エラーメッセージを表示して再度入力させる */ printf( "エラー:表示単位に予期しない文字が入力されました\n" ); goto inputdialog; } } int judge_temp( double a ){ /* 摂氏の温度を受け取って、 10℃以下で1、20℃以下で2、30℃以下で3、それ以上で4を返す関数 */ if( 10 >= a ) return 1; if( 20 >= a ) return 2; if( 30 >= a ) return 3; return 4; } 上のプログラミングをswitchを使う必要は無いといわれました。どうしたらいいですか?おそらくfor文などをつかうはずなんですが |
No.17867![]() |
Re:switch → forなどに変換 投稿者---επιστημη(2004/11/08 16:44:30) |
||
>上のプログラミングをswitchを使う必要は無いといわれました。 switchを使うのは自然だし悪くないと思いますが。 |
No.17869![]() |
Re:switch → forなどに変換 投稿者---k(2004/11/08 16:47:27) |
||
>>上のプログラミングをswitchを使う必要は無いといわれました。 > >switchを使うのは自然だし悪くないと思いますが。 しかし先生から再提出をくらいました。judge_temp関数が返す値でswitch文で分岐させ、メッセージを表示しているのですが。 switchを使わない場合どうしたらいいですか? |
No.17870![]() |
Re:switch → forなどに変換 投稿者---επιστημη(2004/11/08 16:52:46) |
||
>switchを使わない場合どうしたらいいですか? const char* message[] = { "", "Cold", "Cool", "Warm", "Hot" }; printf("%s\n", message[judge_temp(iCel)]; |
No.17874![]() |
Re:switch → forなどに変換 投稿者---REE(2004/11/08 17:01:23) |
||
>>>上のプログラミングをswitchを使う必要は無いといわれました。 >> >>switchを使うのは自然だし悪くないと思いますが。 > >しかし先生から再提出をくらいました。 switchではどうして駄目なのか分からない場合は、その先生に理由を聞いてみましょう。 理由を聞かずに修正しても、再々提出になりかねません。 例えば、επιστημηさんの案で直した場合、 「配列なんか使う必要が無い」と言われるかもしれませんよ? |
No.17876![]() |
Re:switch → forなどに変換 投稿者---k(2004/11/08 17:05:11) |
||
「もっと簡単にしろ」といわれました。 明日先生に質問してみます。ありがとうございました。 |
No.17877![]() |
Re:switch → forなどに変換 投稿者---επιστημη(2004/11/08 17:08:13) |
||
>「もっと簡単にしろ」といわれました。 switch使うのがいちばん簡単だと思います (^^ |
No.17878![]() |
Re:switch → forなどに変換 投稿者---επιστημη(2004/11/08 17:11:54) |
||
>「もっと簡単にしろ」といわれました。 judge_tempが"Cold","Cool"などの文字列を返してはいかがでしょう。 # それが'より簡単'だというのなら。 |
No.17879![]() |
Re:switch → forなどに変換 投稿者---k(2004/11/08 17:13:43) |
||
>>「もっと簡単にしろ」といわれました。 > >judge_tempが"Cold","Cool"などの文字列を返してはいかがでしょう。 ># それが'より簡単'だというのなら。 やってみます。ありがとうございました |
No.17880![]() |
Re:switch → forなどに変換 投稿者---REE(2004/11/08 17:14:25) |
||
>>「もっと簡単にしろ」といわれました。 > >judge_tempが"Cold","Cool"などの文字列を返してはいかがでしょう。 ># それが'より簡単'だというのなら。 それよりもjudge_tempの中で表示した方がより簡単そうですよ。 |
No.17881![]() |
Re:switch → forなどに変換 投稿者---επιστημη(2004/11/08 17:28:14) |
||
>それよりもjudge_tempの中で表示した方がより簡単そうですよ。 簡単簡単って、どうすることが簡単なのかわからんのよ。 関数なんか用意せずにmain一本で書くのがいちばん簡単とも言えるわけで。 |
No.17892![]() |
Re:switch → forなどに変換 投稿者---かずま(2004/11/08 19:05:58) |
||
> 関数なんか用意せずにmain一本で書くのがいちばん簡単とも言えるわけで。 #include <stdio.h> int main(void) { double c, f, a; char b; puts("摂氏と華氏双方の温度とそれに従ってメッセージを出力するプログラム\n"); for (;;) { printf("温度と表示単位(摂氏[Celsius] = C, 華氏[Fahrenheit] = F)を入力>>> "); if (scanf("%lf %c", &a, &b) != 2) return 1; if (b == 'c' || b == 'C') { c = a, f = 1.8*a + 32; break; } if (b == 'f' || b == 'F') { f = a, c = (a-32)/1.8; break; } puts("エラー:表示単位に予期しない文字が入力されました"); } if (c <= 10) puts("Cold"); else if (c <= 20) puts("Cool"); else if (c <= 30) puts("Warm"); else puts("Hot"); printf("摂氏%.1f度、華氏%.1f度\n", c, f); return 0; } |
No.17910![]() |
Re:switch → forなどに変換 投稿者---επιστημη(2004/11/09 10:09:57) |
||
ほぉら、こんなに簡単 ^^; |
No.17871![]() |
Re:switch → forなどに変換 投稿者---REE(2004/11/08 16:53:16) |
||
>上のプログラミングをswitchを使う必要は無いといわれました。どうしたらいいですか?おそらくfor文などをつかうはずなんですが switchを使わないようにする場合、大抵はif文に置き換わります。 でもswitchを使わないようにする前に、gotoを使わないようにする方が先ですね。 |
No.17873![]() |
Re:switch → forなどに変換 投稿者---k(2004/11/08 16:55:16) |
||
>でもswitchを使わないようにする前に、gotoを使わないようにする方が先ですね。 ラベルとgoto文を使用して、表示単位に小文字か大文字のc、fが入力されなかった場合は再度温度と表示単位を求めるようにした |
No.17875![]() |
Re:switch → forなどに変換 投稿者---REE(2004/11/08 17:03:40) |
||
> >>でもswitchを使わないようにする前に、gotoを使わないようにする方が先ですね。 > >ラベルとgoto文を使用して、表示単位に小文字か大文字のc、fが入力されなかった場合は再度温度と表示単位を求めるようにした それは分かりますが、goto文を使わなくても同じ動作をさせることが出来ます。 そして、個人的には、switchを無くすよりもgotoを無くす方が有益に感じました。 |
No.17893![]() |
Re:switch → forなどに変換 投稿者---Hermit(2004/11/08 19:10:07) |
||
goto は、時に有用ですが、 通常、わかりにくいプログラムになることが多いです。 別に、普通に書けば、goto 使う必要ないでしょう。 switch の所も、関数中で if で分けてるだけだし、 関数をそのまま展開(else if にして)すれば十分かけるし、 switch にすることによって、条件判断が関数を見るまでわかりません。 非常に冗長だと私は思いましたが。 あと、F と、C の判別の switch も、数値で書いてあるので、 パッと見、何の判断かわかりませんでした。 普通、case 'F': case 'f' みたいに書きませんか? |