• 締切済み

以下のソースコードについて

#include<stdio.h> #include<stdlib.h> #include<string.h> int top, S[1000]; void push(int x) { S[++top] = x; } int pop() { top--; return S[top + 1]; } int main() { int a, b; top = 0; char s[100]; while (scanf_s("%s", s) != EOF) { if (s[0] == '+') { a = pop(); b = pop(); push(a + b); } else if (s[0] == '-') { b = pop(); a = pop(); push(a - b); } else if (s[0] == '*') { a = pop(); b = pop(); push(a*b); } else { push(atoi(s)); } } printf("%d\n", pop()); return 0; } このコードはプログラミングコンテストのためのアルゴリズムとデータ構造という本に 書かれていたコードで、項目はスタック構造に当たるものです。このコードを写してVIsual C++ に通したところ(バージョンは2015)エラーが発生しました。 どうしたらよいでしょうか 問題のURLはhttp://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ALDS1_3_A です。言語はCです。

みんなの回答

回答No.3

出力されるにはwhile文から抜ける必要があり、その条件はscanf_sがEOFを返すことです。 そのためには、Ctrl+Zを入力する必要があります。 topはスタックの位置を記憶しているので、入力されたsの位置とは関係がありません。

回答No.2

どんなエラーが出ますか? Visual Studio 2013で試したところ、コンパイルは通りました。 ただ、scanf_sはバッファサイズを指定しないといけないので、 while(scanf_s("%s",s,99)!=EOF) { でないと実行時に問題が発生します。 回答1の件は、Visual Studio 2013以降ではC99の大半をサポートしているので、問題にならないはずです。

kokoa118
質問者

補足

エラーについて書き忘れていました・・・ コンパイラは通るのですが、入力をするとエラーが発生していました。 なおしたところ入力はできるのですが、出力が出てきません あと関係ない質問ですがs[0]=='+' の演算子の判定部分のところはなぜ添え字が0なのでしょう? 自分はtopだと思ったのですが・・・

  • chie65535
  • ベストアンサー率43% (8526/19383)
回答No.1

> top = 0; > char s[100]; C言語では「変数宣言は、ブロックの先頭のみで可能」です。 上記では、実効コード(実行を行なうコード)である「top = 0;」と言う代入文の次に「char s[100];」という変数宣言が書いてあり、実効コードを書いた後で、変数を宣言しようとしています。 この2行を入れ替えましょう。 蛇足ですが >int pop() { > top--; > return S[top + 1]; >} は int pop() { return S[top--]; } で良いと思われます。

関連するQ&A

  • プログラミング言語Cの演習

    以下のようにプログラミングをしてコンパイルしても特にエラーは無かったのですが・・・、実行しようとするとセグメンテーション違反になってしまいます。誰か分かる方がいたら解答かアドバイス欲しいです。 #include <stdio.h> #include <math.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #define MAXOP 100 #define NUMBER '0' #define MAXVAL 100 #define BUFSIZE 100 int getop(char s[]); int getch(void); void ungetch(int c); void push(double f); double pop(void); int sp = 0; double val[MAXVAL]; char buf[BUFSIZE]; int bufp = 0; main() { int type; double op2; char s[MAXOP]; while ((type = getop(s)) != EOF) { switch (type) { case NUMBER: push(atof(s)); break; case '+': push(pop() + pop()); break; case '-': op2 = pop(); push(pop() - op2); break; case '/': op2 = pop(); if (op2 != 0.0) push(pop() / op2); else printf("error: zero divisor\n"); break; case '%': op2 = pop(); if (op2 != 0.0) push(fmod(pop(), op2)); else printf("error: zero divisor\n"); break; case '\n': printf("\t%.8g\n", pop()); break; default: printf("error: unknown command %s\n", s); break; } } return 0; } int getop(char s[]) { int c, rc; float f; while ((rc = scanf("%c", &c)) != EOF) if ((s[0] = c) != ' ' && c != '\t') break; s[1] = '\0'; if (rc == EOF) return EOF; else if (!isdigit(c) && c != '.') return c; ungetc(c, stdin); scanf("%f", &f); sprintf(s, "%f", f); return NUMBER; } void push(double f) { if (sp < MAXVAL) val[sp++] = f; else printf("error: stack full, can't push %g\n", f); } double pop(void) { if (sp > 0) return val[--sp]; else { printf("error: stack empty\n"); return 0.0; } } int getch(void) { return (bufp > 0) ? buf[--bufp] : getchar(); } void ungetch(int c) { if (bufp >= BUFSIZE) printf("ungetch: too many characters\n"); else buf[bufp++] = c; }

  • このソースコードについて

    AOJにてこのコードを提出したところTime Limit Exceededでドロップされました。 Visual studio 2013 で動かしたところ特に怪しい挙動や間違いを出力することはなかったのですが。。。 ちなみに言語はC++です。 問題のURL http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0056 #include<iostream> #include<math.h> using namespace std; int p[20000],d; void primefinder(int a){ p[0] = 2; int k, l = 0; for (int i = 3; i <= a; i++){ k = (int)sqrt(i); for (int j = 2; j <= k + 1; j++){ if (j == k + 1){ p[++l] = i;} else if (i%j == 0)break; } } d = l + 1; } int main(){ int n,m,q,count; while ((cin >> n), n){ count = 0; m = n / 2; primefinder(m); for (int i = 0; i < d; i++){ q = n - p[i]; if (q <= 1)continue; for (int j = 2; j <= (int)sqrt(q)+1; j++){ if (j == (int)sqrt(q) + 1)count++; else if (q%j == 0)break; } } cout << count << endl; } }

  • Cのソースコードについて

    #include<stdio.h> int main(void) { long a[6000],sum[6000],max=0; int i,j=0,n,m; for (m = 0; m <= 6000; m++) sum[m] = 0; for (i = 0;; i++) { scanf_s("%ld", &a[i]); if (a[i] > 0) sum[j] += a[i]; else if (a[i] < 0) { j++; sum[j] = -1; j++; } else break; } for (n = 0; sum[n] == 0; n++) { if (max < sum[n]) max = sum[n]; } printf("%ld",max); while(1){} return 0; } こんなコードを書いたのですが 答えが常に0になってしまいます。 原因がはっきりしないので教えてください 使用言語はCです

  • C++のソースコードについて

    このコードを書いてビルドまでノーエラーで通ったのですがいざ起動してみると起動した瞬間に動作を停止しました。と表示されて何もできません。 #include<iostream> #include<algorithm> using namespace std; int main(){ long long d[2000], e[2000]; int w[2000], h[2000], a[1501 * 1024], b[1502 * 1024], n, m; while (cin >> n >> m, n){ long k = 1, l = 1, count = 0, f = 0; for (int i = 0; i < n; i++) { d[i] = 0; cin >> w[i]; if (!i)d[0] = w[i]; else d[i] += w[i] + d[i - 1]; } for (int i = 0; i < m; i++) { e[i] = 0; cin >> h[i]; if (!i)e[0] = h[i]; else e[i] += h[i] + e[i - 1]; } a[0] = d[0]; b[0] = e[0]; for (int i = 1; i < n; i++) for (int j = 0; j < i; j++){ a[k] = d[i] - d[j]; k++; } for (int i = 1; i < m; i++) for (int j = 0; j < i; j++){ b[l] = e[i] - e[j]; l++; } sort(a, a + n); sort(b, b + m); for (int i = 0; i < n; i++){ for (; f < m; f++){ if (a[i] == b[f]){ count++; f++; break; } if (a[i] < b[f])break; } } cout << count << endl; } } ちなみにこの問題はhttp://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=2015 です

  • Cのソースコードについて

    以下のソースコードをかきました。 #include<stdio.h> #include<string.h> #define MAX 100005 typedef struct PP { int t; char name[100]; }P; P Q[MAX]; int head, tail, n; void enqueue(P u) { Q[tail] = u; tail = (tail + 1) % MAX; } P dequeue() { P x = Q[head]; head = (head + 1) % MAX; return x; } int min(int a, int b) { return a > b ? a : b; } int main() { int q, sum = 0 , w; scanf("%d %d", &n,&q); for (int i = 1; i <= n; i++){ scanf("%s", Q[i].name); scanf("%d", &Q[i].t); } head = 1; tail = n + 1; P u; while (head != tail) { u = dequeue(); w = min(q, u.t); sum += w; u.t -= w; if (u.t > 0)enqueue(u); else { printf("%s %d", u.name, sum); } } return 0; } これでVisual C++ でコンパイルしたところ特にエラーも起きず問題なく動作しました しかしAOJに提出してみたところコンパイルエラーになってしまい詰んでしまいました どこかダメそうなところがあれば教えてください

  • C言語ソースコードに関する質問です。

    以下の数列について,初項から第15項までを求めるプログラムと実行結果を示せ。 0 1 1 2 3 5 8 13 21(ただし,初項=0,第1項=1とする。) ソースコードを書くと、エラーがでた。 #include <stdio.h> int fib(int n) { if(n==1 || n==2) return 1; else return fib(n-1)+fib(n-2); } int main(void) { int n; for(n=0;n<17;n++) printf("%d,",fib(n)); } 正しソースコードを教えてください! よろしくお願いします。

  • Cのソースコード について

    使用言語はCです。 #include<stdio.h> #include<math.h> int main(void) { double x = 0, y = 0; while (1) { double arg2 = M_PI / 90; int arg1 = 90; int Arg = 0, Len = 0; scanf_s("%d,%d", &Len, &Arg); if (Len == 0 && Arg == 0) { break; } else { arg1 -= Arg; arg2 += (arg1 % 360)*M_PI / 180; x += cos(arg2)*Len; y += sin(arg2)*Len; } } printf("%d\n%d\n", (int)x, (int)y); while (1) {} return 0; } このコードをvisual studio でコンパイルしようとすると、 M_PIは定義されていない とエラーになってしまいます。 M_PIはmath.hに含まれているということでつかったのですが・・・・

  • ソースコードの確認をお願いします。

    コラッツの問題についてのプログラムです。 #include<stdio.h> #include<math.h> main() { int a,b; printf("aに値を入れてください。"); scanf("%d",&a); while(a==1){ if(!(a%2)) {a=a/2; printf("%d",a);} else {a=3a+1; printf("%d",a);} } printf("完了"); } このプログラムでは ”14: ステートメントにセミコロン(;)がない(関数 main() )” というエラーが出てしまいます。 どこが悪いんでしょうか?

  • 教えてください!!

    テキストファイル aesop.txt には、イソップ寓話の一つが英語で書かれている。このファイルを読み込み、各単語を左右反転して標準出力に出力するプログラムを作成したい。つまり、以下の入力 The Dog and the Shadow It happened that a Dog had got a piece of meat and was carrying it home in his mouth to eat it in peace. Now on his way : が以下のようになればよい。 ehT goD dna eht wodahS tI deneppah taht a goD dah tog a eceip fo taem dna saw gniyrrac ti emoh ni sih htuom ot tae ti ni ecaep. woN no sih yaw : 以下の指示に従って、プログラムを作成せよ。 コード #include <stdio.h> #include <stdlib.h> #define STACKSIZE 256 char st[STACKSIZE]; int top=0; int push(char d) { if (top < STACKSIZE) { st[top]=d; top=top+1; return(0); } if(top >= STACKSIZE) return (-1); } char pop(void) { if(top>0){ top=top-1; return(st[top]); } if(top==0) return('\0'); } int main(void){ FILE *fp; int c; char moji; fp = fopen("aesop.txt", "r"); if (fp == NULL){ printf("入力ファイルを開けません\n"); exit(1); while ((c = fgetc(fp)) != EOF){ if(('A'>=c && c<='Z')||('a'>=c && c<='z')){ if(push(c)==0) {push(c);} if(push(c)==-1){ exit(1);} } else { while(top != 0){ moji=pop(); if(moji != '\0') printf("%c",moji); } } printf("%c",c); } } fclose(fp); return (0); } というコードを書いたのですが、実行できませんどこがまちがっているのでしょうか??

  • C言語のソースの説明なんですが

    #include <stdio.h> #define MAX 256 void pushdown(char *S, char x); char popup(char *S); void initialize(char *S); int empty(char *S); int top=0; void pushdown(char *S, char x){ /*スタックSにデータxを記憶*/ if(top<MAX){ top++; S[top]=x; } else{ printf("Stack S overflows.\n"); } } char popup(char *S){ /*スタックSからデータの取出し*/ if(top>0){ top--; return(S[top+1]); } else{ printf("Stack S is empty.\n"); return('\0'); } } void initialize(char *S){ int i; top=0; for(i=1;i<MAX;i++){ S[i]='\0'; } } int empty(char *S){ if(top==0){ return(1); } return(0); } int main(void){ char x; char S[MAX]; pushdown(S,'a'); pushdown(S,'b'); pushdown(S,'c'); x=popup(S); x=popup(S); pushdown(S,'d'); x=popup(S); pushdown(S,'e'); while(!empty(S)){ printf("%c", popup(S)); } printf("\n"); return(0); } 上記のソースリストに説明を載せなくてはいけないのですがどれが何をしているのかほとんど分からなくて困っています。(わかったのは既に書いてある2行分ぐらい) 長くて面倒ですが判る方、どうか助けてください。 (インデント等は省いています)