かっこが対応するかどうかのプログラムを作りました。
しかし、最後のifのところでfalse1、false2に数字が代入されていません。なぜなのでしょうか?
c
1#include <stdio.h> 2#include <stdlib.h> 3const int MAXSIZE = 130; /* スタックサイズ */ 4/: スタックするデータ構造*/ 5typedef struct kakko Kakko; 6struct kakko { 7 int kind; /* 括弧の種類*/ 8 int line; /* 位置:行 */ 9 int pos; /* 位置:列 */ 10}; 11Kakko stack[130]; 12int pnt; 13 14 15Kakko pop(void) 16{ 17 if (pnt < 0 || pnt == 0) { 18 printf("NG\n"); 19 exit(1); 20 } 21 pnt--; 22 return stack[pnt]; 23} 24 25void push(Kakko b) 26{ 27 if (pnt >= MAXSIZE) { 28 printf("NG\n"); 29 exit(1); 30 } 31 stack[pnt] = b; 32 pnt++; 33 34} 35 36/* stackが空かどうか*/ 37int empty(void) 38{ 39 return (pnt == 0) ? 1 : 0; 40} 41 42/* スタックの最上位の文字種を返す*/ 43int peek() 44{ 45 return stack[pnt-1].kind; 46} 47 48/* 括弧の判別*/ 49int kind(int ch) 50{ 51 int code; 52 switch (ch) { 53 case '(': 54 code = 1; 55 break; 56 case ')': 57 code = 2; 58 break; 59 case '{': 60 code = 3; 61 break; 62 case '}': 63 code = 4; 64 break; 65 case '[': 66 code = 5; 67 break; 68 case ']': 69 code = 6; 70 break; 71 default: 72 code = 0; // 括弧以外の文字 73 break; 74 } 75 return code; 76} 77int main(void) 78{ 79 int ch; 80 char fname[64]; /* ファイル名*/ 81 int k; /* 文字の種類*/ 82 int line = 1, pos = 0; 83 int False1 = 0; 84 int False2 = 0; /*NG表示*/ 85 Kakko kakkos, temp; 86 pnt = 0; /* スタックポインタの初期化*/ 87 88 /*一文字ずつ読む*/ 89 while ((ch = getchar()) != EOF) { 90 if (ch == '\n') { 91 line++; pos=0; 92 /*printf("%d行目\n", line);*/ 93 continue; 94 } 95 pos++; 96 /*printf("%d", pos);*/ 97 k = kind(ch); 98 if (k > 0) { /* 文字が括弧の場合*/ 99 if (k % 2) { /* 開き括弧の場合*/ 100 kakkos.kind = k; 101 kakkos.line = line; 102 kakkos.pos = pos; 103 push(kakkos); 104 } else if (!empty() && (k == peek()+1)) { 105 temp = pop(); /* 対応する閉じカッコ有り*/ 106 } else { /*なし*/ 107 printf("対応する開き括弧がない\n"); 108 printf("%d行目の%d文字目。\n", line, pos); 109 False1 = 1; 110 } 111 } 112 if (!empty()) { 113 printf("対応する閉じ括弧がない。\n"); 114 while (!empty()) { 115 temp = pop(); 116 printf("%d行目の%d文字目。\n", temp.line, temp.pos); 117 False2 = 1; 118 } 119 } 120 } 121 printf("%d\n", False1); /*ここでFalse1,False2に何が入ってるのか確認しようとしても何も表示されません*/ 122 printf("%d\n", False2); 123 if (False1 == 1 || False2 == 1){ 124 printf("ng\n"); 125 } 126 else 127 printf("ok\n"); 128 return 0; 129}
回答3件
あなたの回答
tips
プレビュー