プロが教える店舗&オフィスのセキュリティ対策術

ご閲覧頂き、ありがとうございます。
初心者プログラマです。
昨日、案を思い立ち、ボォーっとした冴えない頭をフル稼働させて、
(頭が痛いのです。)
頑張って作りました。
昨日まで、(VisualStudio使ってます)デバッグエラーなどに
悩まされていましたが、
今日、色々手直しすることで、エラーは解消されました。
然し、今日気づいた事が有ります。
このようなプログラムです。
/*-------------------------------------------------------------------------*/
#include <stdio.h>
#include <math.h>

int main() {
int m = 0;
int a = 0;
int b = 0;
int c = 0;
double d = 0;

printf("このプログラムは、三平方の定理\n");
printf(" / | \n");
printf(" c / | \n");
printf(" /   |a \n");
printf(" /   | \n");
printf("  ̄ ̄ ̄ ̄ ̄     \n");
printf(" 底辺b       \n");
printf("が、a^2*b^2=c^2である  \n");
printf("ことを利用した、三角形の辺を \n");
printf("計算するアプリケーションです \n");
printf("どちらを計算しますか? \n");
printf("1 = 斜辺cを計算する。 \n");
printf("2 = 底辺bを計算する。 \n");
printf("3 =   aを計算する。 \n");
printf("入力して下さい >   ");
while ((m = getchar()) != '\n') {
if(m = '1') {
printf("\n aの値を入力して下さい。 >");
scanf_s("%d", &a);
printf("\n bの値を入力して下さい。 >");
scanf_s("%d", &b);
c = (a*a) + (b*b);
printf("\n計算結果\n");
printf("%d×%d=%dなので、\n", a, b, c);
printf("答えは√%d(%f)となる。", c, sqrt(c));
}
else if(m = '2') {
printf("\n aの値を入力して下さい。 >");
scanf_s("%d", &a);
printf("\n cの値を入力して下さい。 >");
scanf_s("%d", &c);
b = (a*a) - (c*c);
printf("\n計算結果\n");
printf("%d×%d=%dなので、\n", a, c, b);
printf("答えは√%d(%f)となる。", b, sqrt(c));
}
else if(m = '3') {
printf("\n cの値を入力して下さい。 >");
scanf_s("%d", &c);
printf("\n bの値を入力して下さい。 >");
scanf_s("%d", &b);
a = (c*c) - (b*b);
printf("\n計算結果\n");
printf("%d×%d=%dなので、\n", c, b, a);
printf("答えは√%d(%f)となる。", a, sqrt(a));
}
}
return 0;
}
/*------------------------------------------------------------------------------*/

昨日まで、whileは使わず、ifとelse ifだけを使っていましたが、
僕が教科書としているプログラムの本を見る限り、if文の構成より、
while文のほうが作りやすいのかなと思い、その本を丸パクリし、
書き上げました。
然し、
コンパイル後、

入力して下さい >

と表示されたあと、1か2か3と入力したら、
if文の構成を見たらわかるかと思いますが、
1と入力すると、普通に斜辺cの計算をしますが、
2と入力しても、3と入力しても、1と同じように、
aの値を入力してください >

bの値を入力してください >
と出てしまいます。
1,2,3、どれも違うプログラムにしたいです。

プログラムの書き方がおかしいのかもしれませんが、
どうか、ご回答、宜しくお願いします。

A 回答 (4件)

> f(m = '1') {


> else if(m = '2') {
> else if(m = '3') {

C言語でプログラミングしているときに、誰もが一度は通る道です。
= と == の違いに注意しましょう。
    • good
    • 0
この回答へのお礼

ご回答、ありがとうございます。
今気づきました。
うわーっッッッ。
わかってたつもりだったのです。
あー。=なんですね。問題は。
貴方がいなければ気付きませんでした。
本当にありがとうございます。
うわっ、俺、馬鹿だな、、、

お礼日時:2015/04/12 22:45

まぁ既に回答付いているので対処はできるでしょうが……



なぜ
>2と入力しても、3と入力しても、1と同じように、
となるのか…について説明(?)でもしてみましょうかね。

>if(m = '1') {
で、mの値に関わらず'1'を代入します。
んで、代入式の評価として真が返されます。
ということでこの条件式は常に真となります。

http://www.bohyoh.com/CandCPP/FAQ/FAQ00021.html
    • good
    • 0
この回答へのお礼

ご回答、ありがとうございます。
自分が恥ずかしいです。
実は、受験明けで、プログラムを書くのが久しぶりだったものですから、忘れていました。
もう、自分の馬鹿、、、
そうなんですね、if(m = 1)は、1を代入するんですね。
そりゃ、すべて1の場合になりますよね。
もっと、勉強して、これから、頑張って行きたいと思います。
ご回答、本当にありがとうございました。

お礼日時:2015/04/12 23:10

>そうなんですね、if(m = 1)は、1を代入するんですね。


>そりゃ、すべて1の場合になりますよね。

1を代入するから1の場合になる。
とはちょっと違うのでご注意を。
# '1'と1では違うが本質はそこではないので。
条件式の記述の仕方から、「最初の判定が真になった」だけです。

やっぱり既に指摘されていますが、コンパイル時に警告として表示されていませんでしたか?
警告レベルを上げるオプション指定していれば今時のコンパイラなら警告出ていると思いますが。


ちなみに、こういう誤りを回避するために右辺と左辺を置き換える。という手もあります。
if('1' == m) {
ならエラーにはなりませんが
if('1' = m) {
ならばコンパイルエラーですので。
# コーディング規約とかで認めない場合や、推奨している場合などまちまちですけどね。
    • good
    • 0
この回答へのお礼

勘違いしていたみたいですね。申し訳ありません。
やっぱり、かなり勉強不足ですね。
もっと勉強して、Wr5さんのような、素晴らしい人になろうと思います。

お礼日時:2015/04/13 00:28

本題とは無関係ですが, 「if文の構成より、while文のほうが作りやすい」ってどういうことなんでしょうか.



if と switch で悩むことはあるし実際質問の状況だとどっちにしようか考えるけど, 「if にするか while にするかを検討する」って状況が想像できない.
    • good
    • 0
この回答へのお礼

ご回答、有り難う御座います。
あっっっっ(゜ロ゜;
違うんです。
僕の教科書にしている本に、似たようなプログラムがあったんです。
それでは、while文を使っていて、教科書と同じにした方が、書きやすいと思ったのです。
そして、書き間違えました。
大改造前に、
Scanf_sを使っていたのですが、while文に変更したんです。
そうだ。忘れてた。
本当に、文を間違えてしまい、申し訳ありませんでした。
そして、ご回答、本当にありがとうございます。
これからも、プログラマになれるように、頑張ります!!

お礼日時:2015/04/13 07:18

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!