ページ 11

else文がifと一致しません

Posted: 2013年6月10日(月) 20:09
by ayaco
学校でif文と複合文まで教わりました。

二つの整数A,Bを入力し、

A=Bならば、「AとBは等しいです」

A>Bならば、「最大値はAです」
         「最小値はBです」

A<Bならば、「最大値はBです」
         「最小値はAです」

と表示するプログラムの課題が出ました。

教わった範囲でプログラムを組んだのですが、「c2181 : else文がifと一致しません」とエラーが出てしまいます。
参考書などでできる限り調べ、修正を加えましたが、エラーがなくなりません。
そのため、今回質問させていただきました。よろしくお願いします。

コード:

#include <stdio.h>

int main (void)
{
    int na, nb, max, min;

    puts("二つの整数を入力してください。");
    printf("A:");    scanf("%d", &na);
    printf("B:");    scanf("%d", &nb);
	
    if (na = nb);
       puts("AとBは等しいです");
    
    else if (na > nb){
        max = na;
        min = nb;
}
	
    else if {
        max = nb;
	min = na;
}
    printf("大きい方は%dです\n", max);
    printf("小さい方は%dです\n", min);



    return (0);
}


Re: else文がifと一致しません

Posted: 2013年6月10日(月) 20:18
by 超絶右留斗羅天才プログラマー
問題のある部分は、
①11行目のif文の括弧の後にセミコロンがついていること
②11行目のif文の条件式に==ではなく=が使われていること
③19行目のelse文の後にifがついていること
です。

以下のようにすることで動くようになります(*´▽`*)

コード:

#include<stdio.h>
int main (void)
{
    int na, nb, max, min;
 
    puts("二つの整数を入力してください。");
    printf("A:");    scanf("%d", &na);
    printf("B:");    scanf("%d", &nb);
    
    if (na == nb){
       puts("AとBは等しいです");
	}else if (na > nb){
        max = na;
        min = nb;
	}else{
        max = nb;
	    min = na;
	}
    printf("大きい方は%dです\n", max);
    printf("小さい方は%dです\n", min);
    return (0);
}

Re: else文がifと一致しません

Posted: 2013年6月10日(月) 20:23
by conio
最初のif文の後にカッコが無く、不要なセミコロンが付いています。
それが原因です。

まとめると、
----------------------------------------------------------
・if文が { }で囲まれていない   ※注1
・インデントが揃っていない
・等しいと判定する部分が、代入になっている。
正: na == nb
誤: na = nb
----------------------------------------------------------
です。

※注1 ・・・ ifの条件によって実行される文が1行だけなら、カッコで囲まなくてもOKです。
        ですが、不要なバグの原因になるので、if文によって実行される箇所は
        全てカッコで囲むべきだと自分は思います。

Re: else文がifと一致しません

Posted: 2013年6月10日(月) 21:58
by みけCAT
超絶右留斗羅天才プログラマーさんのプログラムだと、A==Bの時も「大きい方は~」「小さい方は~」が表示されてしまいそうです。
また、課題は「最大値は~」「最小値は~」と表示することでしたよね?
そして、課題で指定されている出力のAとBの解釈が統一されていません。
等しい時はAとBをそのまま用いていますが、等しくないときはAとBに実際の数値が代入されています。
統一したほうがいいのではないでしょうか?

Re: else文がifと一致しません

Posted: 2013年6月10日(月) 22:26
by 超絶右留斗羅天才プログラマー
超絶右留斗羅天才プログラマーさんのプログラムだと、A==Bの時も「大きい方は~」「小さい方は~」が表示されてしまいそうです。
仰る通りです。
ayako様はコンパイルエラーで悩んでおられるようでしたので、あえてそこはそのままです(*´ω`*)

Re: else文がifと一致しません

Posted: 2013年6月11日(火) 06:41
by ayaco
みけCAT さんが書きました:超絶右留斗羅天才プログラマーさんのプログラムだと、A==Bの時も「大きい方は~」「小さい方は~」が表示されてしまいそうです。
また、課題は「最大値は~」「最小値は~」と表示することでしたよね?
そして、課題で指定されている出力のAとBの解釈が統一されていません。
等しい時はAとBをそのまま用いていますが、等しくないときはAとBに実際の数値が代入されています。
統一したほうがいいのではないでしょうか?

ご指摘ありがとうございます。
A==Bのときの文章を間違えていたようです。
また、統一した方がいいとのことでしたが、先生の指示ですので、
ご了承ください。

Re: else文がifと一致しません

Posted: 2013年6月11日(火) 06:45
by ayaco
[quote="超絶右留斗羅天才プログラマー"]問題のある部分は、
①11行目のif文の括弧の後にセミコロンがついていること
②11行目のif文の条件式に==ではなく=が使われていること
③19行目のelse文の後にifがついていること
です。



丁寧なご指摘ありがとうございます。
指摘の通り修正を加えたところ、コンパイルエラーがなくなりました。

ただ、「A==B」のとき、文章が三つ表示されてしまいます。
このようになってしまう原因はなんでしょうか?
また、「AとBが等しいです」という一文のみ表示するにはどうしたらよいのでしょうか?

Re: else文がifと一致しません

Posted: 2013年6月11日(火) 07:41
by あたっしゅ
>ただ、「A==B」のとき、文章が三つ表示されてしまいます。
>このようになってしまう原因はなんでしょうか?

プログラムが、そう書かれているからです。
求めていることが、書いたプログラムと一致しない、ということは、よくあることです。

コード:

if( na == nb ) {
	puts("AとBは等しいです");
} else {
	if( na > nb ) {
(中略)
	}
	printf("大きい方は%dです\n", max);
	printf("小さい方は%dです\n", min);
}
今回は、あえて、全部は書きません。

Re: else文がifと一致しません

Posted: 2013年6月11日(火) 12:04
by 超絶右留斗羅天才プログラマー
ayaco さんが書きました:ただ、「A==B」のとき、文章が三つ表示されてしまいます。
このようになってしまう原因はなんでしょうか?
また、「AとBが等しいです」という一文のみ表示するにはどうしたらよいのでしょうか?
エラーが取れたみたいで良かったです(*´▽`*)
はい、19行目と20行目のprintfが必ず通るので、値が等しい場合に3行表示されます。
やり方は思いついたものでも3パターンほどあるのですが、一例を紹介します。

値が等しい場合のみその2行が表示されないようにしました。

コード:

#include<stdio.h>
int main (void)
{
    int na, nb, max, min;
 
    puts("二つの整数を入力してください。");
    printf("A:");    scanf("%d", &na);
    printf("B:");    scanf("%d", &nb);
    
    if (na == nb){
       puts("AとBは等しいです");
    }else if (na > nb){
        max = na;
        min = nb;
        printf("大きい方は%dです\n", max);
        printf("小さい方は%dです\n", min);
    }else{
        max = nb;
        min = na;
        printf("大きい方は%dです\n", max);
        printf("小さい方は%dです\n", min);
    }
    return (0);
}

Re: else文がifと一致しません

Posted: 2013年6月11日(火) 12:50
by non
そう作るなら、maxやminはいらないなぁ。

Re: else文がifと一致しません

Posted: 2013年6月11日(火) 13:08
by usao
最も少ない変更で済ますならこうかな?

コード:

if (na == nb){
    puts("AとBは等しいです");
    return 0;  //←コレを追加
}else if (na > nb){
    ....

Re: else文がifと一致しません

Posted: 2013年6月11日(火) 13:14
by 超絶右留斗羅天才プログラマー
non さんが書きました:そう作るなら、maxやminはいらないなぁ。
仰る通りです。
ayako様は、何故か3行表示されて悩んでおられるようでしたので、あえてそこはそのままです(*´ω`*)

Re: else文がifと一致しません

Posted: 2013年6月11日(火) 13:23
by box
non さんが書きました:そう作るなら、maxやminはいらないなぁ。
全くもってそのとおりです。
maxやminを持ち出したことで、かえってややこしくなってしまっていますね。

Re: else文がifと一致しません

Posted: 2013年6月11日(火) 13:38
by box
要するに、
naとnbが等しければ、「等しい」と出力する。
等しくないとき、naの方が大きければ、「naの方が大きい。nbの方が小さい」と出力する。
上記のいずれにも当てはまらないとき、「nbの方が大きい。naの方が小さい」と出力する。

このロジックを日本語からC言語に翻訳すればOKです。

Re: else文がifと一致しません

Posted: 2013年6月11日(火) 17:07
by ayaco
超絶右留斗羅天才プログラマーさんの一例の通り組んでみたところ、うまく動きました!
まだまだ、if文や複合文についての理解が足りていなかったようです。
皆様のご指摘に、勉強不足を痛感しています。

教えてくださった皆様、本当にありがとうございました!