• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:VSC2015 電卓プログラムの繰り返しに関して)

VSC2015 電卓プログラムの繰り返しに関して

このQ&Aのポイント
  • Visual studio community 2015のC++を使って電卓プログラムを作成しています。プログラムを上手く繰り返せるようにしたいのですが、エラーが発生して正常に動作しません。
  • プログラムは http://saeki-ce.xsrv.jp/C_src/dentaku01.html から取得しました。初回の計算は正常に行われますが、2回目以降は無限ループしてしまい、エラーが発生します。
  • エラーメッセージによると、ローカル変数'b'が初期化されていないというエラーが出ています。どのように改善すればいいでしょうか?

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

  • ベストアンサー
  • maiko0333
  • ベストアンサー率19% (839/4401)
回答No.4

ではこれで #include <stdio.h> #include <stdlib.h> void main() { int b=1; while( b== 1) { int x = 0, y = 0, z = 0, i = 0, j; char c[128], c1[128], op; printf("\n電卓(Ver.1.0)\n"); printf("\n計算式: "); scanf_s("%s", &c, 10); // 計算式入力 //--1つめの数-- for (j = 0; c[i] >= '0' && c[i] <= '9'; i++) { c1[j] = c[i]; j++; } // 1文字取り出す c1[j] = '\0'; x = atoi(c1); // 整数値に変換 //--演算子-- op = c[i]; i++; // 演算子を取り出す //--2つめの数-- for (j = 0; c[i] >= '0' && c[i] <= '9'; i++) { c1[j] = c[i]; j++; } // 1文字取り出す c1[j] = '\0'; y = atoi(c1); // 整数値に変換 //--計算実行-- switch (op) { case '+': z = x + y; break; case '-': z = x - y; break; case '*': z = x*y; break; case '/': z = x / y; break; case '%': z = x%y; break; default: printf("\a"); // ブザー } printf("\n答: %d\n", z); printf("もう一度やるには1を、やめるには2を押してください。\n"); scanf_s("%d", &b); fflush(stdin); } }

lapis0311
質問者

お礼

あっ!! 出来ました!!ありがとうございます。 これからもっと勉強してこれが簡単に書けるようにしていきたいです! ベストアンサーにさせていただきます

その他の回答 (3)

  • maiko0333
  • ベストアンサー率19% (839/4401)
回答No.3

#include <stdio.h> #include <stdlib.h> void main() { int b=1; while( b== 1) { int x = 0, y = 0, z = 0, i = 0, j; char c[128], c1[128], op; printf("\n電卓(Ver.1.0)\n"); printf("\n計算式: "); scanf("%s", &c); // 計算式入力 //--1つめの数-- for (j = 0; c[i] >= '0' && c[i] <= '9'; i++) { c1[j] = c[i]; j++; } // 1文字取り出す c1[j] = '\0'; x = atoi(c1); // 整数値に変換 //--演算子-- op = c[i]; i++; // 演算子を取り出す //--2つめの数-- for (j = 0; c[i] >= '0' && c[i] <= '9'; i++) { c1[j] = c[i]; j++; } // 1文字取り出す c1[j] = '\0'; y = atoi(c1); // 整数値に変換 //--計算実行-- switch (op) { case '+': z = x + y; break; case '-': z = x - y; break; case '*': z = x*y; break; case '/': z = x / y; break; case '%': z = x%y; break; default: printf("\a"); // ブザー } printf("\n答: %d\n", z); printf("もう一度やるには1を、やめるには2を押してください。\n"); scanf("%d", &b); fflush(stdin); } } こうです。

lapis0311
質問者

補足

何度も申し訳ないのですが、これを実行したところ エラー C4996 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. お試し用 ~省略~ お試し用\お試し用\お試し用.cpp 14 と エラー C4996 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. お試し用 ~省略~ お試し用\お試し用\お試し用.cpp 46 と出てしまいました。 解決方法はありますかね? 本当に何度もすみません。

  • maiko0333
  • ベストアンサー率19% (839/4401)
回答No.2

テストしました。 gets_s(c); // 計算式入力  ではなくて、 scanf_s("%s", &c); を使用しましょう。

lapis0311
質問者

補足

#include <stdio.h> #include <stdlib.h> void main() { int b; printf("\n電卓(Ver.1.0)\n"); int x = 0, y = 0, z = 0, i = 0, j; char c[128], c1[128], op; printf("\n計算式: "); gets_s(c); // 計算式入力 //--1つめの数-- for (j = 0; c[i] >= '0' && c[i] <= '9'; i++) { c1[j] = c[i]; j++; } // 1文字取り出す c1[j] = '\0'; x = atoi(c1); // 整数値に変換 //--演算子-- op = c[i]; i++; // 演算子を取り出す //--2つめの数-- for (j = 0; c[i] >= '0' && c[i] <= '9'; i++) { c1[j] = c[i]; j++; } // 1文字取り出す c1[j] = '\0'; y = atoi(c1); // 整数値に変換 //--計算実行-- switch (op) { case '+': z = x + y; break; case '-': z = x - y; break; case '*': z = x*y; break; case '/': z = x / y; break; case '%': z = x%y; break; default: printf("\a"); // ブザー } printf("\n答: %d\n", z); printf("もう一度やるには1を、やめるには2を押してください。\n"); scanf_s("%d", &b); while (b == 1) { int x = 0, y = 0, z = 0, i = 0, j; char c[128], c1[128], op; printf("\n電卓(Ver.1.0)\n"); printf("\n計算式: "); scanf_s("%d", &b); // 計算式入力 //--1つめの数-- for (j = 0; c[i] >= '0' && c[i] <= '9'; i++) { c1[j] = c[i]; j++; } // 1文字取り出す c1[j] = '\0'; x = atoi(c1); // 整数値に変換 //--演算子-- op = c[i]; i++; // 演算子を取り出す //--2つめの数-- for (j = 0; c[i] >= '0' && c[i] <= '9'; i++) { c1[j] = c[i]; j++; } // 1文字取り出す c1[j] = '\0'; y = atoi(c1); // 整数値に変換 //--計算実行-- switch (op) { case '+': z = x + y; break; case '-': z = x - y; break; case '*': z = x*y; break; case '/': z = x / y; break; case '%': z = x%y; break; default: printf("\a"); // ブザー } printf("\n答: %d\n", z); printf("もう一度やるには1を、やめるには2を押してください。\n"); scanf_s("%d", &b); } } こういうことですか? ただこれだと、2回までしかできず、答えが1回目と同じになってしまいます。もう少し教えてくださいませんか?

  • maiko0333
  • ベストアンサー率19% (839/4401)
回答No.1

>「初期化されていない まず、int b;  がまずいですよね。 int b=1; でいいでしょう。 >2回目以降 これはscanf_s("%d", &b);だと思います。 数字キーを押してEnterですよね。 数字はbに入りますがEnterはどこに行くのでしょう? 実は次のgets_s(c);   に入ってしまうんです。 なので、scanf_s("%d\n", &b);かfflush(stdin); をしてください。

lapis0311
質問者

補足

#include <stdio.h> #include <stdlib.h> void main() { int b; printf("\n電卓(Ver.1.0)\n"); int x = 0, y = 0, z = 0, i = 0, j; char c[128], c1[128], op; printf("\n計算式: "); gets_s(c); // 計算式入力 //--1つめの数-- for (j = 0; c[i] >= '0' && c[i] <= '9'; i++) { c1[j] = c[i]; j++; } // 1文字取り出す c1[j] = '\0'; x = atoi(c1); // 整数値に変換 //--演算子-- op = c[i]; i++; // 演算子を取り出す //--2つめの数-- for (j = 0; c[i] >= '0' && c[i] <= '9'; i++) { c1[j] = c[i]; j++; } // 1文字取り出す c1[j] = '\0'; y = atoi(c1); // 整数値に変換 //--計算実行-- switch (op) { case '+': z = x + y; break; case '-': z = x - y; break; case '*': z = x*y; break; case '/': z = x / y; break; case '%': z = x%y; break; default: printf("\a"); // ブザー } printf("\n答: %d\n", z); printf("もう一度やるには1を、やめるには2を押してください。\n"); scanf_s("%d", &b); while (b == 1) { int x = 0, y = 0, z = 0, i = 0, j; char c[128], c1[128], op; printf("\n電卓(Ver.1.0)\n"); printf("\n計算式: "); scanf_s("%d", &b); // 計算式入力 //--1つめの数-- for (j = 0; c[i] >= '0' && c[i] <= '9'; i++) { c1[j] = c[i]; j++; } // 1文字取り出す c1[j] = '\0'; x = atoi(c1); // 整数値に変換 //--演算子-- op = c[i]; i++; // 演算子を取り出す //--2つめの数-- for (j = 0; c[i] >= '0' && c[i] <= '9'; i++) { c1[j] = c[i]; j++; } // 1文字取り出す c1[j] = '\0'; y = atoi(c1); // 整数値に変換 //--計算実行-- switch (op) { case '+': z = x + y; break; case '-': z = x - y; break; case '*': z = x*y; break; case '/': z = x / y; break; case '%': z = x%y; break; default: printf("\a"); // ブザー } printf("\n答: %d\n", z); printf("もう一度やるには1を、やめるには2を押してください。\n"); scanf_s("%d", &b); } } こういうことですか? ただこれだと、2回までしかできず、答えが1回目と同じになってしまいます。もう少し教えてくださいませんか?

関連するQ&A