C言語関係掲示板

過去ログ

No.1326 switch → forなどに変換

[戻る] [ホームページ]
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' みたいに書きませんか?