こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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

Visual studio community 2015の C++をやっているのですが、電卓プログラムを作ろうと思い、
http://saeki-ce.xsrv.jp/C_src/dentaku01.html
よりプログラムを引っ張ってきて、それを繰り返せるようにしたいのですが、上手くいきません。
一応プログラムを張っておくと(これは試行錯誤中のものです)(所々敬行がおかしくなっているかもしれませんが、コピペをした時に起ってしまったものです)
#include <stdio.h>
#include <stdlib.h>
void main()
{
int 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計算式: "); 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);

}
}
こんな風にしてみたのですが、2回目以降が、計算式を入力していないのに1回分が終わってしまいます。(無限ループをしてしまいます。)
上の状態だと、エラーで、「初期化されていないローカル変数’b’が使用されます」と出てしまいます。
どう改善すればいいでしょうか?
教えてください

投稿日時 - 2017-02-03 23:20:45

QNo.9289472

困ってます

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

ではこれで
#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);
}
}

投稿日時 - 2017-02-05 09:40:47

お礼

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

投稿日時 - 2017-02-05 11:17:07

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.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);
}
}

こうです。

投稿日時 - 2017-02-04 17:46:33

補足

何度も申し訳ないのですが、これを実行したところ
エラー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.お試し用~省略~ お試し用\お試し用\お試し用.cpp14と
エラー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.お試し用~省略~ お試し用\お試し用\お試し用.cpp46
と出てしまいました。 解決方法はありますかね?
本当に何度もすみません。

投稿日時 - 2017-02-05 09:19:22

ANo.2

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

投稿日時 - 2017-02-04 10:49:31

補足

#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回目と同じになってしまいます。もう少し教えてくださいませんか?

投稿日時 - 2017-02-04 17:25:18

ANo.1

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

投稿日時 - 2017-02-03 23:33:29

補足

#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回目と同じになってしまいます。もう少し教えてくださいませんか?

投稿日時 - 2017-02-04 17:24:58

あなたにオススメの質問