• ベストアンサー

C++に関する質問です。。

#include <stdio.h> #define g 9.8 int main() { char phase[32]; char water; char air; int 粘度_water; double 密度_water,粘度_air,密度_air; printf("粒子は水あるいは空気中を沈降しますか?\n"); printf("水中を沈降する場合はwaterを入力してください。\n"); printf("空気中を沈降する場合はairを入力してください---"); scanf("%s",phase); printf("粒子は%s中を沈降します\n",phase); if(phase=water) { printf("粘度_water=%d , 密度_water=%5.3f\n", 1000,1.0e-3); } else { printf("粘度_air=%3.1f , 密度_air=%8.6f\n",1.2 ,1.8e-5); } return 0; } 実行してみると、 error C2106: '=' : 左のオペランドが、左辺値になっていませんというエラーが出ました。どうしてエラーが出るかを教えてください。よろしくお願いします。。

質問者が選んだベストアンサー

  • ベストアンサー
  • Yanch
  • ベストアンサー率50% (114/225)
回答No.2

文字列同士の比較には<string.h>をインクルードして、strcmp()を使いましょう。 strcmp()の詳細につきましては、リファレンスを参照してください。 #include <stdio.h> #include <string.h> #define g 9.8 int main() {   char phase[32];   char water;   char air;   int nendo_water;   double mitsudo_water, nendo_air, mitsudo_air;      printf("粒子は水あるいは空気中を沈降しますか?\n");   printf("水中を沈降する場合はwaterを入力してください。\n");   printf("空気中を沈降する場合はairを入力してください---");      scanf("%s",phase);   printf("粒子は%s中を沈降します\n",phase);      if (strcmp("water", phase) == 0) {     printf("粘度_water=%d , 密度_water=%5.3f\n", 1000, 1.0e-3);   }   else {     printf("粘度_air=%3.1f , 密度_air=%8.6f\n",1.2 , 1.8e-5);   }      return 0; }

blizzardoo
質問者

お礼

ありがとうございました!! すごく助かりました!!

その他の回答 (5)

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.6

既に回答が出ているように... > if(phase=water) { ↑が問題の箇所で、 std::string phase; std::cin >> phase; printf("粒子は%s中を沈降します\n",phase.c_str()); if(phase == "water") { とでもするのが妥当かと思います。 ただ、 > error C2106: '=' : 左のオペランドが、左辺値になっていません というエラーメッセージは適切ではありませんね。 なぜなら、元の(charの配列である)phaseは左辺値だからです。 ところで、 > 変数名には2バイト文字を使わない方がいいと思います。 に関しては、移植性さえ諦めれば特に問題はありません。 本来であれば移植性の問題もないはずなのですが、実在するC++処理系の多くは標準準拠度が低いために国際文字名をサポートしませんから。

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.5

>int 粘度_water; >double 密度_water,粘度_air,密度_air; 変数名には2バイト文字を使わない方がいいと思います。 >printf("粘度_water=%d , 密度_water=%5.3f\n", 1000,1.0e-3); 1000と1.0e-3という「固定の」値を出力するだけでいいのですか? だとすると、ほとんど意味がないプログラムですね。 >printf("粘度_air=%3.1f , 密度_air=%8.6f\n",1.2 ,1.8e-5); 同上 >#define g 9.8 何のために#defineしていますか?何かの計算に使うためではないのですか?

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.4

幾つか間違いがあります。 (1)実行ではなく、コンパイルエラーです。 (2)if(phase=water) { =で代入していますが、値が同じか判定する場合は、==と書きます。 (3)一番の問題は、 phaseはchar型の配列で、waterはchar型ですので代入できません。これがエラーメッセージの原因です。 プログラムを見る限り入力された文字列がwaterか判定するプログラムだと思いますので、waterを変数名にする意味は有りません。 でif(phase=="water") { と書いても間違いで、strcmp()関数を使う必要があります。 ちゃんとした参考書を読まれていますか?もし読まれていたら、その本を。無いなら参考になる初心者向けのホームページなどから文字列に関する処理の所とポインタに関して再勉強をお勧めします。

  • aigaion
  • ベストアンサー率47% (287/608)
回答No.3

if(phase=water) { phase に waterを代入しようとしていますね phase は char型の配列(char型へのポインタ)、waterはchar型です。 C++では、char型の配列にchar型を代入する演算子が存在しないためエラーがでます。

回答No.1

if ( phase == water ) { では? =が1つ足りてない

関連するQ&A