前提・実現したいこと
逆ポーランド記法で負の数にも対応するプログラムを完成させたいです。
発生している問題・エラーメッセージ
うまく計算できません。stack overflowが表示されます。
該当のソースコード
C
1#include <stdio.h> 2#include <stdlib.h> 3#include <ctype.h> 4#include <string.h> 5 6typedef long ELEMENT; 7 8#define STACK_SIZE 100 9 10ELEMENT stack[STACK_SIZE]; 11int n; 12 13/*push関数**/ 14void push(ELEMENT x) 15{ 16 if (n>=STACK_SIZE){ 17 printf("stack overflow"); 18 exit(1); 19 } 20 stack[n++]=x; 21} 22 23/*pop関数*/ 24ELEMENT pop() 25{ 26 if (n<=0){ 27 printf("stack underflow"); 28 exit(1); 29 } 30 return stack[--n]; 31} 32 33 34int is_digit(char *formula) 35{ 36 if (*formula=='+' || *formula=='-'){ 37 formula++; 38 if (*formula>='0' && *formula<='9'){ 39 return 1; 40 } 41 return 0; 42 } 43 if (*formula>='0' && *formula<='9'){ 44 return 1; 45 } 46 return 0; 47} 48 49int getnumber(char *formula) 50{ 51 int sign=0; 52 if (*formula=='+'){ 53 formula++; 54 }else if (*formula=='-'){ 55 sign=1; 56 formula++; 57 } 58 while (*formula>='0' && *formula<='9'){ 59 n=n*10+(*formula-'0'); 60 formula++; 61 } 62 if (sign) return -n; 63 return n; 64} 65 66void calcuration(char *formula,FILE *fp) 67{ 68 long a,b,x; 69 while(*formula){ 70 if (is_digit(formula)){ 71 72 x=getnumber(formula); 73 74 push(x); 75 76 77 78 }else{ 79 switch (*formula){ 80 case '.': 81 pop(); 82 break; 83 case '+': 84 b=pop();a=pop(); 85 push(a+b); 86 break; 87 case '-': 88 b=pop();a=pop(); 89 push(a-b); 90 break; 91 case '*': 92 b=pop();a=pop(); 93 push(a*b); 94 break; 95 case '/': 96 b=pop();a=pop(); 97 push(a/b); 98 break; 99 case ' ': 100 break; 101 case '\n': 102 printf("Answer:%ld",pop()); 103 104 default: 105 printf("不正な入力です。\n"); 106 while (*formula){ 107 ; 108 break; 109 } 110 } 111 formula++; 112 } 113 114 115 } 116 fclose(fp); 117} 118 119 120int main(void) 121{ 122 n=0; /*スタックの初期化*/ 123 124 int s; 125 char formula[32]={0}; 126 printf("数字データの時はスタックに積み、ピリオドの時はスタックから降ろします。(EOFで終了)\n"); 127 printf("データ入力の方法を選んでください。\n0..キーボード/1..ファイル:"); 128 scanf("%d",&s); 129 FILE *fp=stdin; 130 131 if (s==1){ 132 fp=fopen("data.txt","r"); 133 if (fp==NULL){ 134 printf("ファイルオープン失敗\n"); 135 return 1; 136 } 137 fgets(formula,32,fp); 138 calcuration(formula,fp); 139 }else if (s==0){ 140 printf("Input:"); 141 scanf("%s",formula); 142 calcuration(formula,fp); 143 } 144 145 146 return 0; 147} 148 149 150 151#include <stdio.h> 152#include <stdlib.h> 153#include <ctype.h> 154 155typedef long ELEMENT; 156 157#define STACK_SIZE 100 158 159ELEMENT stack[STACK_SIZE]; 160int n; 161 162/*push関数**/ 163void push(ELEMENT x) 164{ 165 if (n>=STACK_SIZE){ 166 printf("stack overflow"); 167 exit(1); 168 } 169 stack[n++]=x; 170} 171 172/*pop関数*/ 173ELEMENT pop() 174{ 175 if (n<=0){ 176 printf("stack underflow"); 177 exit(1); 178 } 179 return stack[--n]; 180} 181 182int is_digit(char *formula) 183{ 184 if (*formula=='+' || *formula=='-'){ 185 formula++; 186 if (*formula>='0' && *formula<='9'){ 187 return 1; 188 } 189 return 0; 190 } 191 if (*formula>='0' && *formula<='9'){ 192 return 1; 193 } 194 return 0; 195} 196 197 198解決ver↓ 199 200int main(void) 201{ 202 n=0; /*スタックの初期化*/ 203 204 int s; 205 printf("数字データの時はスタックに積み、ピリオドの時はスタックから降ろします。(EOFで終了)\n"); 206 printf("データ入力の方法を選んでください。\n0..キーボード/1..ファイル:"); 207 scanf("%d",&s);putchar('\n'); 208 long x,a,b; 209 FILE *fp=stdin; 210 211 if (s==1){ 212 fp=fopen("data.txt","r"); 213 if (fp==NULL){ 214 printf("ファイルオープン失敗\n"); 215 return 1; 216 } 217 } 218 219 char str[32]={0}; 220 221 222 if (s==0) 223 printf("input:"); 224 225 while((fscanf(fp,"%s",str)!=EOF)){ 226 227 if (is_digit(str)){ 228 x=atoi(str); 229 push(x); 230 231 }else{ 232 233 switch (str[0]){ 234 case '.': 235 pop(); 236 break; 237 case '+': 238 b=pop();a=pop(); 239 push(a+b); 240 break; 241 case '-': 242 b=pop();a=pop(); 243 push(a-b); 244 break; 245 case '*': 246 b=pop();a=pop(); 247 push(a*b); 248 break; 249 case '/': 250 b=pop();a=pop(); 251 push(a/b); 252 break; 253 case ' ': 254 break; 255 case 'A': /*Aで答えを表示*/ 256 if(n!=0) 257 printf("答えは%ldです。",pop()); 258 n=0; 259 break; 260 261 default: 262 printf("不正な入力です。\n"); 263 while ((fscanf(fp,"%s",str)!=EOF)) 264 ; 265 break; 266 } 267 } 268 } 269 fclose(fp); 270 return 0; 271} 272 273 274
試したこと
ネットにあるものも参考にさせてもらいました。formulaのインクリメントをいじってみたりしましたが効果出ず。。
補足情報(FW/ツールのバージョンなど)
Xcode Version 11.2 (11B52)
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/06/10 05:03