• 締切済み

プログラミングについての質問です。

プログラミングについての質問です。 できるだけ早めの解答をお待ちしてます。 次の構文をC言語として表したいのですが、一応作っては見たもののできません。 1.S→E<A4> 2.E→TX 3.X→+<A1>T<A2>X 4.X→ε 5.T→FY 6.Y→*<A1>F<A2>Y 7.Y→ε 8.F→-<A1>F<A2>Y 9.F→I<A1> 10.F→(E) 11.I→a|b|c|d|e A1はスタック上に項目を挿入するという動作。 A2はスタックから3つの項目を除去し、それらを'='と次に割り当てられる4つ組とともに印刷し、この整数をスタックにおくという動作。 A3はスタックから2つの項目を除去し、それらを'='と次に割り当てられる4つ組とともに印刷し、この整数をスタックにおくという動作。 A4はスタックから1つの項目を除去する。 #include<stdio.h> #include<string.h> intmain(void) { charsymbol[10][10]; inti=0,j,k=0; printf("Inputsymbol:"); while(1) {scanf("%s",symbol[i]); if(strcmp(symbol[i],"_")==0) {i--;break;} i++;} printf("symbol="); for(j=0;j<=i;j++) {printf("%s",symbol[j]);} printf("¥n"); gotoS; S: if(strcmp(symbol[k],"a"|"b"|"c"|"d"|"e")==0) {gotoE;return;} elseif(strcmp(symbol[k],"-")==0) {gotoE;return;} elseif(strcmp(symbol[k],"(")==0) {gotoE;return;} else {gotoerror;} E: if(strcmp(symbol[k],"a"|"b"|"c"|"d"|"e")==0) {gotoT;gotoX;return;} elseif(strcmp(symbol[k],"-")==0) {gotoT;gotoX;return;} elseif(strcmp(symbol[k],"(")==0) {gotoT;gotoX;return;} else {gotoerror;} X: if(strcmp(symbol[k],"+")==0) {k++;gotoT;gotoX;return;} else {if(strcmp(symbol[k],"_")!=0) {gotoerror;} elseif(strcmp(symbol[k],")")!=0) {gotoerror;} } T: if(strcmp(symbol[k],"a"|"b"|"c"|"d"|"e")==0) {gotoF;gotoY;return;} elseif(strcmp(symbol[k],"-")==0) {gotoF;gotoY;return;} elseif(strcmp(symbol[k],"(")==0) {gotoF;gotoY;return;} else {gotoerror;} Y: if(strcmp(symbol[k],"*")==0) {k++;gotoF;gotoY;return;} elseif(strcmp(symbol[k],"_")==0) {gotoerror;} elseif(strcmp(symbol[k],")")==0) {gotoerror;} elseif(strcmp(symbol[k],"+")==0) {gotoerror;} I: if(strcmp(symbol[k],"a"|"b"|"c"|"d"|"e")==0) {k++; } elsegotoerror; F: if(strcmp(symbol[k],"-")==0) {k++;gotoF; } else if(strcmp(symbol[k],"a"|"b"|"c"|"d"|"e")==0) {gotoI;} else {if(strcmp(symbol[k],"(")==0) {k++;gotoE; if(strcmp(symbol[k],")")!=0) gotoerror;} elsegotoerror;} error: printf("No¥n"); exit(1); 制限字数の関係でプログラムを削ったりしています。 見にくくてすみません。 御指導よろしくお願いします。

みんなの回答

  • siffon9
  • ベストアンサー率64% (136/211)
回答No.2

構文はともかくA1~A4の説明が良く解りませんね。 > A1はスタック上に項目を挿入するという動作。 ・挿入する「項目」が不明。何を挿入するの? ・「挿入」というのは、スタックのトップに積むという意味ですか? > A2はスタックから3つの項目を除去し、それらを'='と次に割り当てられる4つ組とともに印刷し、この整数をスタックにおくという動作。 ・「'='と次に割り当てられる4つ組」が意味不明 ・「この整数」って何? ・「スタックにおく」と「スタック上に(項目を)挿入する」は同じ意味ですか? > A3はスタックから2つの項目を除去し、 ・A3が構文にありません あとプログラムは、各構文をラベルとgoto文で表現されていますが、関数にしたほうが良いのではないでしょうか。というかreturn文があるのは、関数を意図しているような気がするのですが。 1.S→E<A4> だったら void parse_S(){ parse_E(); /* 構文Eの処理 */ exec_A4(); /* <A4>の処理 */ return; } みたいな感じ?

回答No.1

構文の意味がさっぱりわからないので、ロジック面はパスします。 とりあえずソースを見て気になったところ…… まず、ソースがごちゃごちゃしてわかりにくくなるだけなので、gotoは使わずに関数化しましょう。 > if(strcmp(symbol[k],"a"|"b"|"c"|"d"|"e")==0)  こんなこと書いてもsymbol[k]が"a"~"e"のいずれかかどうかなんて判定はできません。  ・strcmpの文字列比較は1個ずつ  ・比較文字をORするのじゃなく、比較結果をORしましょう。 > {gotoE;return;}  gotoで飛んだら戻ってこないので、その後のreturnは無意味です。 > {gotoT;gotoX;return;}  同様にgoto X以降は絶対に通りません。

関連するQ&A

  • C言語の配列の使い方について質問です。

    以下のプログラムを配列を使って見やすくしたいのですが、どのように作ったら良いでしょうか? 宜しくお願いします。 #include<stdio.h> int main(void) { int a, b, c, d, e, f, g, h, i, j, k, l, m ,n, o; /*5段目の処理*/ for(a = 1; a <= 15; a++) { for(b = 1; b <= 15; b++) { if(a == b) continue; for(c = 1; c <= 15; c++) { if(a == c || b == c) continue; for(d = 1; d <= 15; d++) { if(a == d || b == d || c == d) continue; for(e = 1; e <= 15; e++) { if(a == e || b == e || c == e || d == e) continue; // printf("%d %d %d %d %d\n", a, b, c, d, e); ////4段目//// if(a>b){ f=a-b; } else if(a<b){ f=b-a; } if(b>c){ g=b-c; } else if(b<c){ g=c-b; } if(c>d){ h=c-d; } else if(c<d){ h=d-c; } if(d>e){ i=d-e; } else if(e<d){ i=e-d; } // printf(" %d %d %d %d \n", f, g, h, i); /////3段目//// if(f>g){ j=f-g; } else if(f<g){ j=g-f; } if(g>h){ k=g-h; } else if(g<h){ k=h-g; } if(h>i){ l=h-i; } else if(h<i){ l=i-h; } // printf(" %d %d %d \n", j, k, l); /////2段目//// if(j>k){ m=j-k; } else if(j<k){ m=k-j; } if(k>l){ n=k-l; } else if(k<l){ n=l-k; } // printf(" %d %d \n", m, n); /////三段目///// if(m>n){ o=m-n; } else if(m<n){ o=n-m; } // printf(" %d \n", o); if(a != b != c != d != e != f != g != h != i != j != k != l != m != n != o){ printf("%d %d %d %d %d\n", a, b, c, d, e); printf(" %d %d %d %d \n", f, g, h, i); printf(" %d %d %d \n", j, k, l); printf(" %d %d \n", m, n); printf(" %d \n", o); } } } } } } }

  • C言語における複素数の四則演算について

    複素数の四則演算(a+biとc+diの四則演算)について、for文を用いて表示するプログラムについて、???の部分に何を入れたらよいかわからず、うまく実行することができません。和・差・積・商の計算種別を入れるみたいなのですが、何を入れたらいいのかわかりません。 #include <stdio.h> void fukuso(double a,double b,double c,double d,double *e,double *f,int keisan); int main(void) { double a=4, b=8, c=4, d=3, e, f; int i; for(i=1;i<5;i++){ fukuso(a,b,c,d,&e,&f,???); if(i==1) printf("和演算\n"); else if(i==2) printf("差演算\n"); else if(i==3) printf("積演算\n"); else printf("商演算\n"); printf("e=%f f=%f i\n",e,f); } return (0); } void fukuso(double a1,double b1,double a2,double b2,double *a3,double *b3,int keisan) { if(keisan==1){ *e=a+c; *f=a+c; } else if(keisan==2){ *e=a-c; *f=b-d; } else if(keisan==3){ *e=a*c-b*d; *f=a*d+c*b; } else{ *e=(a*c+b*d)/(c*c+d*d); *f=(-a*d+c*b)/(c*c+d*d); } }

  • c言語 スタックの標準入力の課題です

    c言語のスタックについての質問です。 実装したのですが、標準入力の部分を i 9 o i 8 i 7 o i 6 i 5 o i 4 o o i 3 i 2 i 1 o o e といったように指示を一括してやるために直す方法を教えていただきたいです。 iはプッシュ oはポップ eは終了 sは入力時点でのスタックに格納された全体の内容表示 となってます。 #include<stdio.h> #define MaxSize 100 //スタックサイズ int stack[MaxSize];//スタック int sp;//スタックポインタ int push(int); int pop(int *); void show_stack(); void main(void) { int c,n; while(printf("]"),(c=getchar())!=EOF){ rewind(stdin); if(c=='i'||c=='I'){ printf("data--> "); scanf("%d", &n); rewind(stdin); if(push(n)==-1){ printf("スタックがいっぱいです\n"); } } if(c=='o'||c=='O'){ if(pop(&n)==-1) printf("スタックは空です\n"); else printf("stack data-->%d\n",n); if(c=='e'||c=='E') break; } if(c=='s'||c=='S') show_stack(); } } int push(int n)//スタックにデータをつむプッシュ { if(sp<MaxSize){ ++sp; stack[sp]=n; return 0; } else return -1; } int pop(int *n) { if(sp>0){ *n=stack[sp]; sp--; return 0; } else return -1; } void show_stack() { int i; puts("スタックの内容"); if(sp<0){ printf("スタックは空です。\n"); } else for(i=sp;i>=1;i--) { printf("%11d\n",stack[i]); printf("\n"); } }

  • プログラミング(じゃんけんゲーム)

    C言語をしています。 そこでわからない所がありのですが、解説お願いします。 作りたいのは、乱数を使ったジャンケン5回戦で、 一番最後に、何勝何敗何引き分けかを表示させ、 2人のうちどちらが勝ったかです。 最後の何勝何敗何引き分けかを どう書いたらいいかがわかりません。 関数のひきわたしみたいな感じでするというのはわかります。 できたところまでのプログラムが、以下のようなコードです。 #include <stdio.h> #include <stdlib.h> #include <time.h> int main() { int a,c,i; printf("じゃんけんをしましょう。 (グー=1 チョキ=2 パー=3)\n"); for(i=i; i<=5; i++) { srand(time(NULL)); c = rand()%3+1; scanf("%d",&a); if(a==1 && c==1) printf("私もグー=1なので、あいこです。\n"); else if(a==1 && c==2) printf("私はチョキ=2なので、あなたの勝ちです。\n"); else if(a==1 && c==3) printf("私はパー=3なので、あなたの負けです。\n"); else if(a==2 && c==1) printf("私はグー=1なので、あなたの負けです。\n"); else if(a==2 && c==2) printf("私もチョキ=2なので、あいこです。\n"); else if(a==2 && c==3) printf("私はパー=3なので、あなたの勝ちです。\n"); else if(a==3 && c==1) printf("私はグー=1なので、あなたの勝ちです。\n"); else if(a==3 && c==2) printf("私はチョキ=2なので、あなたの負けです。\n"); else if(a==3 && c==3) printf("私もパー=3なので、あいこです。\n"); else printf("正しい手を入れてください。\n"); } return 0; }

  • 二分法のプログラムについて

    下の用なプログラムを作ったのですがどうしても正しい答えを導くことができません。自分でもいろいろ調べてみましたがわかりません。誰かご教授宜しくお願いします。 #include<stdio.h> #include<stdlib.h> #define MAX 10 int n , count; double c[MAX+1]; double a,b,e; void nyuuryoku(void) { int i; printf("nの入力>"); scanf("%d",&n); if(n>MAX){printf("最大次数を超えている");exit(1);} else if(n<0){printf("nが負");exit(2);} else{for(i=0;i<=n;i++){printf("係数の値>");scanf("%lf",&c[i]);} }} double f(double x) {double y; int i; y = c[0]; for(i=1;i<=n;i++){ y=y*x+c[i];} return y; } void hani(void){ printf("aの値>");scanf("%lf",&a); printf("bの値>");scanf("%lf",&b); printf("eの値>");scanf("%lf",&e); if(e<=0){printf("eが0または負"); exit(3);} if(f(a)==0){printf("%f",f(a)); exit(4);} if(f(b)==0){printf("%f",f(b)); exit(5);} if(f(a)*f(b)>0){printf("初期値異常"); exit(6);}} double nibun(void) {double c; if(b>a){ while(b-a>e){ count++; c=(a+b)/2; if(f(c)==0){ return c;} if(f(a)*f(c)<0){b=c;} if(f(b)*f(c)<0){a=c;} } return a;} if(a>b){ while(a-b>e){ count++; c=(a+b)/2; if(f(c)==0){ return c;} if(f(b)*f(c)<0){a=c;} if(f(a)*f(c)<0){b=c;} } return a;} } void syutsuryoku(double x){ printf("x=%lf\n",x); printf("f(x)=%lf\n",f(x)); printf("繰り返し回数=%d\n",count); } int main(void){ double ans; count=0; nyuuryoku(); hani(); ans = nibun(); syutsuryoku(ans); }

  • 2次方程式の解 Cプログラミング

    C言語でのプログラムの添削をお願いします。 2次方程式の解を求めるものなのですが。 #include<stdio.h> #include<math.h> main(){ double a,b,c,d; double x1=0; double x2=0; scanf("%lf %lf %lf" ,&a,&b,&c); printf("a=%f b=%f c=%f\n" ,a,b,c); d=b*b-4*a*c; if(d>0){ x1=(-b+sqrt(d))/2*a; x2=(-b-sqrt(d))/2*a; printf("x=%f,%f\n" ,x1,x2); }else if(d<0){ x1=-b/2*a; x2=sqrt(-d)/2*a; printf("x=%f+%fi,%f-%fi\n" ,x1,x2,x1,x2); }else{ printf("x=%f\n" ,x1); } return 0; } このとき、 a=-7,b=2,c=-1 を与えると x=7.000000+-17.146428i,7.000000--17.146428i という値が返ってきます。 他にも、虚数解のときに間違った値が返ってきてしまう気がするのですが、いかがでしょうか? 実数解のときは正しいようです。 回答よろしくお願いします。

  • c言語 プログラミング(初心者)

    解を判定するプログラミングを作成したのですが、a,b,cを0,1,2と入力したときに解に0.00000が出てきて解がおかしくなります。 どなたか詳しい方教えてください。また簡潔にできる点などありましたらご指摘お願いします。 #include <stdio.h> #include <math.h> int main (void) { double a,b,c,d,x1,x2; printf("ax^2+bx+c=0 の係数を入力してください\n"); scanf("%lf %lf %lf",&a,&b,&c ); if(a==0){ if(b==0) { printf("解は存在しません\n"); } else { x1=-c/b; printf("解は %f です\n",x1); } } else { d=b*b-4*a*c; if(d>=0){ x1=(-b+sqrt(d))/(2.0*a); x2=(-b-sqrt(d))/(2.0*a); if(d==0){ printf("解は %f (重解)です\n",x1); } else { printf("解は %f と %f です\n",x1,x2); } } else { printf("実数解は存在しません(虚数解)\n"); } } return 0; }

  • Visual C++でのプログラミング

    学校でプログラミングの課題が出たので自分のパソコンに Microsoft Visual C++ 2010 Express をインストールして作ってみました。 それが以下のプログラムです。 これは任意の値nを入力してa[n]までの配列をつくり それを降順に並び替えるものです。 #include <stdio.h> #define N 10000 int main(){ int a[N],i,j,max,min,n,temp; n=0; printf("n="); scanf("%d",n); if(N<n){ return 0; } else if(n<=0){ return 0; } else if(n<=N){ for(i=0;i<=n;i++){ printf("a[%d]",i); scanf("%d\n",&a[i]); } max=min=a[0]; for(i=1;i<n;i++){ if(max<a[i]){ max=a[i]; } else if(min>a[i]){ min=a[i]; } } printf("a[i]のソート結果\n"); for(i=0;i<n;i++);{ for(j=i+1;j<n;j++){ if(a[i]<a[j]){ temp=a[i]; a[i]=a[j]; a[j]=temp; } } } for(i=0;i<n;i++){ printf("a[i]=%d\n",a[i]); } printf("Max=%d\n",max); printf("Min=%d\n",min); } } これをVisual C++でデバックすると 『test.exeの0x0fcbe42e(msvcr100d.dll)にハンドルされていない例外が発生しました:0C0000005: 場所 0x00000000 に書き込み中のアクセス違反が発生しました。』 と表示されて実行できません。 今日インストールしたばかりなのでどこでエラーが起きているのかわかりません。 これはプログラミングとVisual C++のどっちが原因なのでしょうか? もしお分かりになるならば、具体的な解決方法や プログラムの訂正点などを教えていただきたいです。

  • このプログラミングのいけないところは?

    こういうプログラムを作ったんですけど、なぜか正常に作動しません!理由をおしえてください!!!!!! お願いしますーーー!!ちなみに内容はドイツ語です。 #include "stdafx.h" void tyuusinn(); void head_1(); void head_2(); int main() { while(1){ tyuusinn(); } return 0; } void tyuusinn() { int a; printf("(1)→sein,haben,werdenについて\n"); printf("(2)→定冠詞\n"); printf("表示したい項目を選んでください\n"); scanf_s("%d",&a); if(a == 1){ head_1(); } else if(a == 2){ head_2(); } } void head_1() { char a[90] = " sein haben werden"; printf("%6s\n",a); printf("------------------------------\n"); char b[90] = "ich bin habe werde"; printf("%6s\n",b); char c[90] = "du bist hast wirst"; printf("%6s\n",c); char d[90] = "er ist hat wird"; char e[90] = "wir sind haben werden"; char f[90] = "ihr seid habt werdet"; char g[90] = "sie sind haben werden"; printf("%6s\n%6s\n%6s\n%6s\n",d,e,f,g); return; } void head_2() { char a[90] = "der des dem den"; char b[90] = "die der der die"; char c[90] = "das des dem das"; char x[90],y[90],z[90]; printf("男性名詞は?\n"); scanf("%s",&x); if(x == a) printf("正解です。\n"); else printf("不正解!正解は%sです。\n",a); printf("女性名詞は?\n"); scanf("%s",&y); if(y == b) printf("正解です。\n"); else printf("不正解!正解は%sです。\n",b); printf("中性名詞は?\n"); scanf("%s",&z); if(z == c) printf("正解です。\n"); else printf("不正解!正解は%sです。\n",c); return; }

  • C言語のプログラミングについて質問です。

    以下の文を出力して入力:に16進数を入れると10進数に変換した数値の小さい列順に並ぶプログラムを作りたいのですがうまく出来ません。 仕様は以下に記載します。 入力:__、__、__、__、__EnterKeyで結果を表示。 以下のバブルソートの文のどこをいじれば良いでしょうか? 返答宜しくお願いします。 #include <stdio.h> int main (void) { char data[256]; int val[100]; int i = 0; int work; int j; int k; printf("入力 = "); scanf("%s",data); for(i=0;i<100;i++){ val[i] = 0; } k=0; for(i = 0;i<100 ; i++){ if(data[i] == 0x00){ //data[i]がNULLだったら処理を抜ける k++; break; //enterキーでprintf出力 } else if(data[i] == ','){ //カンマだったら /*printf("%d\n",k);*/ k++; } else{ if(data[i] >= 'A' && data[i] <= 'Z'){ //data[i]にAからZが入ったら val[k] = val[k] *16 + data[i] -'A'+10; } else if(data[i] >= '0' && data[i] <= '9'){ //data[i]に0から9が入ったら val[k] = val[k] *16 + data[i] -'0'; } } } /* printf("k=%d\n",k); for(i=0;i<k;i++){ printf("出力 = %d\n",val[i]); } */ //バブルソート//     for(i=0; i<k-1; i++) { if(val[i] < val[i+1]) { } else{ work = val[i]; val[i] = val[i+1]; val[i+1] = work; } } for(i=0;i<k;i++) { printf("出力 = %d\n",val[i]); } }