2桁以上の逆ポーランド式の計算について
Posted: 2018年11月25日(日) 15:08
数日前に「逆ポーランド式の計算について」というトピックを投稿させていただいたものです。
今回も学校の課題に詰まっていて、課題の提出期限も迫ってしまっているので、こちらで聞かせていただこうと思いました。
課題は、2桁以上の逆ポーランド式の計算をするプログラムを作成するというもので、数字を区別するために、数字の間のみに"|"を入力して区別するというものです。
以下が現在作成途中のプログラムになります。
こちらがmain関数の前までのプログラムです。
こちらがmain関数です。
動きとしては、計算したい逆ポーランド式の計算式を入力し配列exprによみこみ、その文字式の長さ分i=0からループさせます。
exprが数字なら配列expr2に格納していき、数字を分ける"|"や演算子ならそこまでのexpr2中身をスタックに積み、配列expr2を初期化する。
演算子で場合分けをした場合も、expr2が空ならすぐに計算をさせるように組みたいのですがうまくいきません。
これは考え方がそもそも間違っているのでしょうか。それとも、プログラムの組み方がおかしいのでしょうか。
課題の期限も迫っていてとても焦っています。
よろしくお願いします。
今回も学校の課題に詰まっていて、課題の提出期限も迫ってしまっているので、こちらで聞かせていただこうと思いました。
課題は、2桁以上の逆ポーランド式の計算をするプログラムを作成するというもので、数字を区別するために、数字の間のみに"|"を入力して区別するというものです。
以下が現在作成途中のプログラムになります。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
/*外部変数*/
char stack[100];
int sp;
/*スタックポインタを初期化する関数init_stack*/
void init_stack(void)
{
sp = -1;
}
/*スタックにデータをひとつ入れる関数push*/
void push(int a)
{
sp += 1;
stack[sp] = a;
}
/*スタックからデータをひとつ取り出す関数pop*/
int pop()
{
int n;
if(sp > -1){
n = stack[sp];
sp -= 1;
}
else{
printf("-\n");
}
return n;
}
/*スタックに収納された値をすべて表示する関数show_stack*/
void show_stack()
{
int i;
for(i = 0;i < sp + 1 ; i++){
printf("%d",stack[i]);
}
}
#define SIZE 100
int main(void){
char expr[SIZE];/*計算したい逆ポーランド式を格納しておく文字列*/
char expr2[SIZE];/*2桁の数字文字を数値に変換するときに使用する*/
char expr3[SIZE];/*expr2[SIZE]を初期化するのに使用する*/
int x,y,z;/*計算の時に使用する*/
int k,i;/*ループにおいて使用する*/
int suuti;/*計算結果*/
int t = 0;/*2桁の文字の処理で利用*/
char a = '+';
char s = '-';
char m = '*';
char d = '/';
char w = '|';
init_stack();
printf("これから作成したプログラムの動作の確認をします.\n");
printf("計算したい逆ポーランド式を入力してください。\n");
scanf("%s",expr);
k = strlen(expr);
for(i = 0;i < k; i++){
if(expr[i] <= '9' && expr[i] >= '0'){
expr2[t] = expr[i];
t++;
}
else if(expr[i] == w){
suuti = atoi(expr2);
expr2[SIZE] = expr3[SIZE];/*初期化*/
suuti = atoi(expr3);/*初期化*/
push(suuti);
t = 0;
i++;
}
else if(expr[i] == a){
if(t==0){
x = pop();
y = pop();
z = y + x;
push(z);
}
else{
suuti = atoi(expr2);
expr2[SIZE] = expr3[SIZE];/*初期化*/
suuti = atoi(expr3);/*初期化*/
push(suuti);
x = pop();
y = pop();
z = y + x;
push(z);
t = 0;
}
}
else if(expr[i] == s){
if(t==0){
x = pop();
y = pop();
z = y - x;
push(z);
t = 0;
}
else{
suuti = atoi(expr2);
expr2[SIZE] = expr3[SIZE];/*初期化*/
suuti = atoi(expr3);/*初期化*/
push(suuti);
x = pop();
y = pop();
z = y - x;
push(z);
t = 0;
}
}
else if(expr[i] == m){
if(t==0){
x = pop();
y = pop();
z = y * x;
push(z);
}
else{
suuti = atoi(expr2);
expr2[SIZE] = expr3[SIZE];/*初期化*/
suuti = atoi(expr3);/*初期化*/
push(suuti);
x = pop();
y = pop();
z = y * x;
push(z);
t = 0;
}
}
else if(expr[i] == d){
if(t==0){
x = pop();
y = pop();
if(x == 0){
printf("計算できません。(%d ÷ %d)\n",y,x);
}
else{
z = y / x;
push(z);
}
}
else{
suuti = atoi(expr2);
expr2[SIZE] = expr3[SIZE];/*初期化*/
suuti = atoi(expr3);/*初期化*/
push(suuti);
x = pop();
y = pop();
if(x == 0){
printf("計算できません。(%d ÷ %d)\n",y,x);
}
else{
z = y / x;
push(z);
t = 0;
}
}
}
else{
printf("不正な操作です。\n");
}
}
printf("入力された逆ポーランド式の計算の答えは");
show_stack();
printf("です。\n");
return 0;
}
動きとしては、計算したい逆ポーランド式の計算式を入力し配列exprによみこみ、その文字式の長さ分i=0からループさせます。
exprが数字なら配列expr2に格納していき、数字を分ける"|"や演算子ならそこまでのexpr2中身をスタックに積み、配列expr2を初期化する。
演算子で場合分けをした場合も、expr2が空ならすぐに計算をさせるように組みたいのですがうまくいきません。
これは考え方がそもそも間違っているのでしょうか。それとも、プログラムの組み方がおかしいのでしょうか。
課題の期限も迫っていてとても焦っています。
よろしくお願いします。