• 締切済み

擬似言語にて

この擬似言語のプログラムは、スタックを使って、中置表記法を後置き表記法に変換するプログラムです。 例えば,中置表記法による数式4×(9+3)は,toPostfixの処理の結果,後置表記法による数式493+×に変換するという具合です。 点線の上部分とした部分が全く同じ処理をしているように思えます。下の部分はどのような役割をしているのでしょうか。 ○toPostfix( 文字型: Exptext[],整数型: Textlen, 文字型: Postfix[],整数型: Postfixlen ) ○整数型: k,i ○論理型: sflag ○文字型: work ・initStack() ・k ← 0 上部分 ---------------------------------------------------------- 繰り返し処理(1) i:0,i<Textlen,1  繰り返し(2)    getPriority(Exptext[i])≦getPriority(top()) and top() ≠ "(" ・Postfix[k] ←pop() ・k←k+1  繰り返し(2)終わり  条件処理  (条件) Exptext[i] ≠ ")" 適合するなら ・push(Exptext[i])  しないなら   ・pop() /*取り出した要素は使わない*/ 処理終了 繰り返し(1)終了 ------------------------------------------------------------ ここから下部分 ------------------------------------------------------------- ・sflag ← true 繰り返し sflag = true ・work ← pop() 条件処理  合うなら work ≠ EOS      ・Postfix[k] ← work     ・k ← k+1    合わないなら  sflag ← false 処理終了 繰り返し終了 ・Postfixlen ← k ------------------------------------------------------------ よろしくお願いいたします。

みんなの回答

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

変数の意味もわからなければ関数の意味もわからないし「上部分」と「下部分」がどのような関係なのかもわからないので, それぞれを詳細に説明してください.

rinnshan
質問者

お礼

自己解決しました。 ちなみに、下の部分はスタックから残っている要素を 順に取り出して、Postfix[k]に納入している処理でした。

rinnshan
質問者

補足

失礼しました。大事なことですね(^_^;) 変数名の意味 Exptext[] 文字型 入力 中置表記法による数式が格納されている1次元配列 Textlen 整数型 入力 中置表記法による数式の要素数 Postfix[] 文字型 出力 後置表記法に変換後の数式が格納される1次元配列 Postfixlen 整数型 出力 後置表記法に変換後の数式の要素数 関数の仕様 initStack() スタックを初期化し,スタックに EOS を格納する。 push(文字型:element) スタックに element を格納する。 文字型:pop() スタックから要素を取り出し,その要素を返却する。 文字型:top() スタックの先頭要素の値を返却する。 整数型:getPriority    (文字型:element) 引数で指定された要素 element の優先度を返却する。 上部分の処理としては toPostfix は,スタックを初期化して,Exptext の先頭の要素から順番に次の (1),(2) の処理を繰り返し,Exptext の要素をすべて処理したら,スタックに残っているすべての数式の要素を順に取り出して Postfix に格納する。 (1) Exptext[i] の優先度がスタックの先頭要素の優先度以下で,かつスタックの先頭要素が “(”でない間,スタックから要素を取り出して Postfix に格納する。 (2) Exptext[i] が“)”でなければ,Exptext[i] をスタックに積み,“)”であれば,スタックから要素を一つだけ取り出す。 ということをやっています。 しかし、下部分は論理型の変数が使われているのですが、 どのような役割かわからないです。

関連するQ&A

  • 基本情報の擬似言語についての質問です。

    初めて質問させて頂きます。 前判定繰り返し処理の条件式に以下のような記載があったのですが、ここでi:はどのような処理を行っているのでしょうか。比較の式のあとの"1"も処理が不明です。 また宣言部において整数型のtemp[size÷2]とはどういう整数型になるのでしょうか、配列の中に計算式があるのはどう考えればよいのでしょうか。宜しくお願い致します。 ○mergeSort(........ , 整数型:size) ○整数型:a_idx,span_idx,b_idx,temp[size÷2],.... . . i: a_idx-span_idx,i<b_idx-a_idx,1 /*前判定繰返し条件 ・temp[i]←output[i+span_idx] /*繰返し処理        

  • 擬似言語のある処理について

    擬似言語についてわからないことがあります。 このプログラムはスタックを使って、実数値を10進数字に変換するプログラムです。 今回質問するのは、このプログラムの中でも数値を一桁ずつ10進数字に変換して、スタックに詰め込む部分です。 Fintは整数部分。Idxは変数。 IntはFの小数部をカットする。(つまり、整数部分だけにする処理です。) Chr[]={0,1,2,3,4,5,6,7,8,9},T (Chrは数値に対応する文字列を格納したものです。) Fint←Int(F) 繰り返し処理 Fint>0ならば ・Idx ← Fint - (Fint ÷ 10) × 10;Fintの最下位桁をIdxに取り出す。 ・Push(Chr[Idx]);最下位桁Idxに対応する数字をスタックにプッシュする ・Fint←Fint÷10;次の桁を最下位の桁にシフトする。 繰り返しで上へ 上記の「Fintの最下位桁をIdxに取り出す」という処理は たとえば、12,345という数字があったならば、12の最下位桁2を取り出すということなのだと思いますが、式に当てはめて計算すると 12-(12÷10)×10となりIdxに0という数字が格納されます。 その後に、Chrで0という数値を拾ってきて文字列0が格納されることになります。 しかし、問題文を見ると12,345という数字を変換すると12,345という文字列になっておりなぜ0?になってしまうのという話になります。 私の解釈は間違いだらけだと思いますが訂正していただけると 大変うれしいです。

  • C言語プログラム

    こんな課題が出たのですが、さっぱりわかりません。 誰か解る人がいたら教えてほしいです。 1 3+5+7+…+nと奇数の和を求め、和が100を越えたときのnの値を求めて表示するプログラムをdo~whileを使って作成しなさい。 2  キーボードから3つの数を読み込み、最大値を求める処理を繰り返し行うプログラムを、do~whileを使って作成しなさい。繰り返しの終了は、計算のあとで、'S'(1文字)が入力されるまでとし、それ以外の文字では、処理を続行すること。 3  整数型1次元配列kに整数123,456,789をそれぞれ代入し、その内容を表示するプログラムを作成しなさい。 4  文字型1次元配列strに'u'を、'n'、'i'、'x'それぞれ代入し、その内容を文字列として出力するプログラムを作成しなさい。 5  要素数50の整数型1次元配列mの要素すべてに、その添字に対応した0~49の数値を代入し、その内容を表示するプログラムを作成しなさい。 3は #include <stdio.h> main() { int k[3]; k[0] = 123; k[1] = 456; k[2] = 789; printf("%d\n%d\n%d", k[0], k[1], k[2]); return 0; } と解いてみたんですが、やっぱ間違えてますよね?

  • C言語-繰り返し処理

    キーボードから入力される1以上の整数に対して、次のような処理 をするプログラムを作りたいのです。 入力される整数が5であった場合、 正の整数:5 1***** 2 **** 3 *** 4 ** 5 * (0、または負の数であればエラー、終了するようにする) for文等の繰り返しを使って色々書いてみたのですが、 12345***** などとなってしまいます。 どのように書けばいいのか教えてくださるとありがたいです。

  • アセンブリ言語のプログラム方法がわかりません!!

    アセンブリ言語の問題です。 スタックを使って、接尾辞(Postfix)で数式を計算するプログラムを作ってください。 足し算(add)、引き算(subtract)、掛け算(multiply)は二進化十進表現で計算します。 足し算は'+', 引き算は'-', 掛け算は'*',そして終了を'$'で表します。 計算は8-bitの2の補数をつかって行います。 例えば、 expression: .db 3,9,4,6,'+','-',2,'-','+','$' push 3,9,4,6 (stack: 6 4 9 3) pop 6 and 4, add, push 10 (stack: 10 9 3) pop 10 and 9, subtract, push -1 (stack: -1 3) push 2 (stack: 2 -1 3) pop 2 and -1, subtract, push -3 (stack: -3 3) pop -3 and 3, add, push 0 (stack: 0) pop the 0 into register r0 and stop. というような計算を実行するプログラムを作ってください。 よろしくお願いします。 できればAVR studioを使ってプログラミングしてほしいです。

  • C言語プログラミングの問題がわかりません・・・。

    ただいまC言語を勉強している者です。 【入力するデータ数と各データ(整数)を入力していき,0 以下の整数の数,正の整数の数,0 以下の整数の合計,正の整数の合計を求めるプログラムを作成せよ。】 という問題があり、とりあえず #include "stdio.h" void main() { int i,j,k,l=0,m=0,goukeisei=0,goukeifu=0; printf("入力するデータ数:"); scanf("%d",&i); for(j=1;j<=i;j++); { printf("データを入力してください(整数):"); scanf("%d",&k); if(k>0){ l++; goukeisei+=k; }else{ m++; goukeifu+=k; } } printf("正の整数の数%d\n",l); printf("0以下の整数の数%d\n",m); printf("正の整数の合計%d\n",goukeisei); printf("0以下の整数の合計%d\n",goukeifu); } と作ってみたのですが、入力するデータ数の繰り返しがされません(1回入力して終わりになってしまいます);; for文の使い方が間違っているのでしょうか・・・ 詳しい方教えてくださいm( _ _ )m 尚環境はXPでVC++2008を使っています。よろしくお願いします。

  • C言語の問題

    以下はC言語の問題です。お教えください。 1000以下の素数を求めるプログラム prog.c を作成せよ。各素数を整数4桁で出力し、15個の素数を出力した時点で改行処理 を行うこと。作成したプログラムを提出せよ。 です。 僕の考えでは、 #include <stdio.h> #include <math.h> main(){ int i; int j; int ix; int k; printf("正の整数を入力して下さい: "); scanf("%d",&i); ix=(int)(sqrt((double)i)); k=0; for(j=2;j<=ix;j++) { if(i%j==0) { k=1; } } if(k==0) { printf("%d は素数です\n",i); } else { printf("%d は素数ではありません\n",i); } となると思うのですが。どうやら違うようです。全然わからないので、正しい答えを教えてください。

  • c言語で分からないところがあるので教えてください。

    http://www9.plala.or.jp/sgwr-t/c/Q/ens06-61.html の問題がわかりません。 回答の #include <stdio.h> int main( void ) { int kekka[51]; int a, b, i; int amari; printf( "整数値を2つ入力してください " ); scanf( "%d%d", &a, &b ); if( b == 0 ){ printf( "処理終了\n" ); return 0; } printf( "%d / %d = ", a, b ); kekka[0] = a/b; for ( i = 1; i < 51;i++ ) { amari = a%b; if ( amari == 0 ) break; a = amari * 10; kekka[i] = a/b; } printf( "%d.", kekka[0] ); ここまでの部分はわかったのですが、 下の for ( a = 1; a < i; a++ ) { printf( "%d", kekka[a] ); } の部分がわかりません。 この部分は何を表わしているのか 教えてください。

  • C言語で文字列ではなく、文字の

    C言語で整数型の時は例えば int d[3][5]; などとおいて二次元配列を作り、文字列のときは char a[3][4]="abc,bcd,cde";(←ちょっとこの宣言も合っている自信はないが) という様に置きますよね。こういうのを文字でも利用して、 1 2 3 4 5....... A s t u v w x y.... B i u i k i k u.... C j j j j o o o.... :.................. :................. :................ という様な表を文字の2次元配列を使って printf("%c",c[i][I]); のように表したいのですが、int d[i][I]のように 文字を二次元配列を作ることは出来るんでしょうか? どなたか知っている方がいたら教えてください。

  • C言語 素数判定

    1000以下の素数を求めるプログラム kadai7-2.c を作成せよ。各素数を整数4桁で出力し、15個の素数を出力した時点で改行処理 を行うこと。作成したプログラムを提出せよ。 という問題なのですが、以下のプログラムを実行しても動きませんでした。どこが違うのでしょうか。ご指摘お願いします。 #include<stdio.h> #include<math.h> main(){ int i,j,ix,k,h; for (i=2;i<=1000;i++){ ix=(int)(sqrt((double)i)); k=0; for(j=2;j<=ix;j++){ if(i%j==0){ k=1; } } if(k==0){ printf("%4d",i); h+=1 if(h=15){ printf("\n"); h=0; } }

専門家に質問してみよう