このプログラムは正しいか?後、デバッグできません・・・
-
ケント
このプログラムは正しいか?後、デバッグできません・・・
問1、次のような《条件》のもとに、挿入記法で記述された式を逆ポーランド記法に変換するプログラムを、《手順》を参考にして作れ。
《条件》 ・オペランドはアルファベット1文字からなる。
・演算子は+、-、*、/の4つの2項演算だけとする。
・与えられる挿入記法の式には誤りがないものとする。
・因子(オペランドおよび演算子)の優先順位は次のように定める。
オペランド(優先順位→)3
*、/ ・・・2
+、- ・・・1
《手順》(ファイル画像参照)
Step 1・・・挿入記法の式から取り出した因子を格納する作業用の文字(char)型配列work[・]と逆ポーランド記法の式を作る文字型配列polish[・]を準備する。
Step 2・・・与式の左端から右端までの各因子にStep 2.1~Step 2.3 の操作を順次(繰り返し)行う。
Step 2.1・・・与式から1つの因子を取り出す。
Step 2.2・・・次の条件式を満たす間、work の終端の格納因子を取り出して、polish の終端に追加格納する。
[取り出した因子の優先順位] ≦ [work に格納された終端の格納因子の優先順位]
Step 2.3・・・Step 2.1 で取り出した因子をwork の終端に格納する。
Step 3・・・work に残っている格納因子を終端から順次取り出し、polish の終端に順次格納する。
#include <stdio.h>
#define PRI(X) ( ( X == ' ' || X == '-' )? 1: ( X == '*' || X == '/' )? 2: 3 )
int main( void )
{
char infix[ 256 ], work[ 256 ], polish[ 256 ];
char *pinfix, *pwork, *ppolish;
printf( "input infix notation > " );
scanf( "%s", infix );
pinfix = infix;
pwork = work;
ppolish = polish;
while( *pinfix )
{
while( PRI( *pinfix ) <= PRI( *( pwork - 1 ) ) &&
pwork != work )
{
*( ppolish ) = *( --pwork );
}
*( pwork ) = *( pinfix );
}
while( work != pwork )
{
*( ppolish ) = *( --pwork );
}
*ppolish = '\0';
printf( "polish : %s", polish );
return 0;
}
《条件》 ・オペランドはアルファベット1文字からなる。
・演算子は+、-、*、/の4つの2項演算だけとする。
・与えられる挿入記法の式には誤りがないものとする。
・因子(オペランドおよび演算子)の優先順位は次のように定める。
オペランド(優先順位→)3
*、/ ・・・2
+、- ・・・1
《手順》(ファイル画像参照)
Step 1・・・挿入記法の式から取り出した因子を格納する作業用の文字(char)型配列work[・]と逆ポーランド記法の式を作る文字型配列polish[・]を準備する。
Step 2・・・与式の左端から右端までの各因子にStep 2.1~Step 2.3 の操作を順次(繰り返し)行う。
Step 2.1・・・与式から1つの因子を取り出す。
Step 2.2・・・次の条件式を満たす間、work の終端の格納因子を取り出して、polish の終端に追加格納する。
[取り出した因子の優先順位] ≦ [work に格納された終端の格納因子の優先順位]
Step 2.3・・・Step 2.1 で取り出した因子をwork の終端に格納する。
Step 3・・・work に残っている格納因子を終端から順次取り出し、polish の終端に順次格納する。
#include <stdio.h>
#define PRI(X) ( ( X == ' ' || X == '-' )? 1: ( X == '*' || X == '/' )? 2: 3 )
int main( void )
{
char infix[ 256 ], work[ 256 ], polish[ 256 ];
char *pinfix, *pwork, *ppolish;
printf( "input infix notation > " );
scanf( "%s", infix );
pinfix = infix;
pwork = work;
ppolish = polish;
while( *pinfix )
{
while( PRI( *pinfix ) <= PRI( *( pwork - 1 ) ) &&
pwork != work )
{
*( ppolish ) = *( --pwork );
}
*( pwork ) = *( pinfix );
}
while( work != pwork )
{
*( ppolish ) = *( --pwork );
}
*ppolish = '\0';
printf( "polish : %s", polish );
return 0;
}
Re: このプログラムは正しいか?後、デバッグできません・・・
ぱっと見た限りだと、17行目のwhileは絶対に無限ループになりますね。
( *pinfix )の値が更新される箇所がどこにも無いので。
あとデバッグできないという意味がよく分かりませんが、
正しいプログラムだったらデバッグできるはずです。
( *pinfix )の値が更新される箇所がどこにも無いので。
#include <stdio.h>
#define PRI(X) ( ( X == ' ' || X == '-' )? 1: ( X == '*' || X == '/' )? 2: 3 )
int main( void )
{
char infix[ 256 ], work[ 256 ], polish[ 256 ];
char *pinfix, *pwork, *ppolish;
printf( "input infix notation > " );
scanf( "%s", infix );
pinfix = infix;
pwork = work;
ppolish = polish;
while( *pinfix )
{
while( PRI( *pinfix ) <= PRI( *( pwork - 1 ) ) && pwork != work )
{
*( ppolish ) = *( --pwork );
}
*( pwork ) = *( pinfix );
}
while( work != pwork )
{
*( ppolish ) = *( --pwork );
}
*ppolish = '\0';
printf( "polish : %s", polish );
return 0;
}
正しいプログラムだったらデバッグできるはずです。
-
かずま
Re: このプログラムは正しいか?後、デバッグできません・・・
すみません。《手順》に従わないプログラムなら書けるんですが。
#include <stdio.h>
int main(void)
{
char infix[256], polish[256], *pi = infix, *pp = polish, c, d;
printf("input infix notation > ");
scanf("%s", infix);
for (*pp++ = *pi++; (c = *pi++) == '*' || c == '/'; *pp++ = c)
*pp++ = *pi++;
for (; c == '+' || c == '-'; *pp++ = c, c = d)
for (*pp++ = *pi++; (d = *pi++) == '*' || d == '/'; *pp++ = d)
*pp++ = *pi++;
*pp = '\0';
printf("polish : %s\n", polish);
return 0;
}
Re: このプログラムは正しいか?後、デバッグできません・・・
挿入記法とやらを逆ポーランド記法に直すSimple Calculatorというプログラムの説明を読んでみました.
挿入記法とは,中置記法のことでしょうか.つまり私達が普段から使っている数式 a + b * c のようなものでしょうか.
それから,h2so5さんも言ってますが,「デバッグできない」という発言の真意を聞きたいです.
挿入記法とは,中置記法のことでしょうか.つまり私達が普段から使っている数式 a + b * c のようなものでしょうか.
それから,h2so5さんも言ってますが,「デバッグできない」という発言の真意を聞きたいです.
-
ケント
Re: このプログラムは正しいか?後、デバッグできません・・・
逆ポーランドについての画像があるのですが、貼り方が分からないので文章でお伝えしますが、
かずまさんがやっているプログラムが正しいのかなと思います・・・後beatleさんの内容について。確かにデバッグ出来ないと言うことはどこかが間違ってるんですよね^^;
かずまさんがやっているプログラムが正しいのかなと思います・・・後beatleさんの内容について。確かにデバッグ出来ないと言うことはどこかが間違ってるんですよね^^;
-
ケント
Re: このプログラムは正しいか?後、デバッグできません・・・
因みにですが、
【問1】に準じた《条件》のもとで、挿入記法で記述された括弧を含む式を逆ポーランド記
法に変換するプログラムを作れ。
《方針:ヒント》
・【問1】の《手順》Step 2.1 で
⇒ 与式から取り出した因子が‘(’の場合、無条件に(Step 2.2 を飛ばし)work の終端に‘(’格納する(Step 2.3 を実行する)。
⇒ 与式から取り出した因子が‘)’の場合、無条件に(Step 2.2 を飛ばし)work の終端
から‘(’が現われるまで順次格納因子を取り出し、polish の終端に順次格納する。
‘(’はpolish に格納せずに廃棄、‘)’はpolish, work のいずれにも格納せずに廃棄する(Step 2.3 は実行しない)。
《例》
・ 挿入記法:a*((b +c)*d-e) ⇒ 逆ポーランド記法:abc+d *e-*
↑最終段階としてはこういう実行結果を作りたいのであります・・・
【問1】に準じた《条件》のもとで、挿入記法で記述された括弧を含む式を逆ポーランド記
法に変換するプログラムを作れ。
《方針:ヒント》
・【問1】の《手順》Step 2.1 で
⇒ 与式から取り出した因子が‘(’の場合、無条件に(Step 2.2 を飛ばし)work の終端に‘(’格納する(Step 2.3 を実行する)。
⇒ 与式から取り出した因子が‘)’の場合、無条件に(Step 2.2 を飛ばし)work の終端
から‘(’が現われるまで順次格納因子を取り出し、polish の終端に順次格納する。
‘(’はpolish に格納せずに廃棄、‘)’はpolish, work のいずれにも格納せずに廃棄する(Step 2.3 は実行しない)。
《例》
・ 挿入記法:a*((b +c)*d-e) ⇒ 逆ポーランド記法:abc+d *e-*
↑最終段階としてはこういう実行結果を作りたいのであります・・・
Re: このプログラムは正しいか?後、デバッグできません・・・
ええと,ケントさんが「デバッグ」という言葉をどういう意味で使っているのかを知りたかったのですが.ケント さんが書きました:後beatleさんの内容について。確かにデバッグ出来ないと言うことはどこかが間違ってるんですよね^^;
デバッグとは本来,「バグを取り除く」という意味です.ソースコードをじっくり読んでバグを見つけて取り除くのもデバッグですし,一度コンパイルして実行し,実行結果をヒントとしてバグを見つけて取り除くのもデバッグです.
ですから,「デバッグできない」というのは,本来のデバッグの意味を考えれば,ケントさんがソースコードさえ読む気がない,ということを意味します.
ですから,「デバッグ出来ないと言うことはどこかが間違ってる」というのは変です.どこかが間違っているからデバッグするんです.
しかし,ケントさんの文章を見ていると,どうもデバッグという言葉を他の意味で使っているらしいという感じがします.
細かい用語の使い方をつついているようで申し訳ない気もしますね.ごめんなさい.
-
ケント
再度お願いしますm(__)m
問1、次のような《条件》のもとに、挿入記法で記述された式を逆ポーランド記法に変換するプログラムを、《手順》を参考にして作れ。
《条件》 ・オペランドはアルファベット1文字からなる。
・演算子は+、-、*、/の4つの2項演算だけとする。
・与えられる挿入記法の式には誤りがないものとする。
・因子(オペランドおよび演算子)の優先順位は次のように定める。
オペランド(優先順位→)3
*、/ ・・・2
+、- ・・・1
《手順》
Step 1・・・挿入記法の式から取り出した因子を格納する作業用の文字(char)型配列work[・]と逆ポーランド記法の式を作る文字型配列polish[・]を準備する。
Step 2・・・与式の左端から右端までの各因子にStep 2.1~Step 2.3 の操作を順次(繰り返し)行う。
Step 2.1・・・与式から1つの因子を取り出す。
Step 2.2・・・次の条件式を満たす間、work の終端の格納因子を取り出して、polish の終端に追加格納する。
[取り出した因子の優先順位] ≦ [work に格納された終端の格納因子の優先順位]
Step 2.3・・・Step 2.1 で取り出した因子をwork の終端に格納する。
Step 3・・・work に残っている格納因子を終端から順次取り出し、polish の終端に順次格納する。
↑問1のプログラムはこれで正しいとおもいます。
そして次の問なのですが、
問2、【問1】に準じた《条件》のもとで、挿入記法で記述された括弧を含む式を逆ポーランド記
法に変換するプログラムを作れ。
《方針:ヒント》
・【問1】の《手順》Step 2.1 で
⇒ 与式から取り出した因子が‘(’の場合、無条件に(Step 2.2 を飛ばし)work の終端に‘(’格納する(Step 2.3 を実行する)。
⇒ 与式から取り出した因子が‘)’の場合、無条件に(Step 2.2 を飛ばし)work の終端
から‘(’が現われるまで順次格納因子を取り出し、polish の終端に順次格納する。
‘(’はpolish に格納せずに廃棄、‘)’はpolish, work のいずれにも格納せずに廃棄する(Step 2.3 は実行しない)。
《例》
・ 挿入記法:a*((b +c)*d-e) ⇒ 逆ポーランド記法:abc+d *e-*
↑最終段階としてはこういう実行結果を作りたいのであります・・・分かる方いればお願いします。
《条件》 ・オペランドはアルファベット1文字からなる。
・演算子は+、-、*、/の4つの2項演算だけとする。
・与えられる挿入記法の式には誤りがないものとする。
・因子(オペランドおよび演算子)の優先順位は次のように定める。
オペランド(優先順位→)3
*、/ ・・・2
+、- ・・・1
《手順》
Step 1・・・挿入記法の式から取り出した因子を格納する作業用の文字(char)型配列work[・]と逆ポーランド記法の式を作る文字型配列polish[・]を準備する。
Step 2・・・与式の左端から右端までの各因子にStep 2.1~Step 2.3 の操作を順次(繰り返し)行う。
Step 2.1・・・与式から1つの因子を取り出す。
Step 2.2・・・次の条件式を満たす間、work の終端の格納因子を取り出して、polish の終端に追加格納する。
[取り出した因子の優先順位] ≦ [work に格納された終端の格納因子の優先順位]
Step 2.3・・・Step 2.1 で取り出した因子をwork の終端に格納する。
Step 3・・・work に残っている格納因子を終端から順次取り出し、polish の終端に順次格納する。
#include <stdio.h>
int main(void)
{
char infix[256], polish[256], *pi = infix, *pp = polish, c, d;
printf("input infix notation > ");
scanf("%s", infix);
for (*pp++ = *pi++; (c = *pi++) == '*' || c == '/'; *pp++ = c)
*pp++ = *pi++;
for (; c == '+' || c == '-'; *pp++ = c, c = d)
for (*pp++ = *pi++; (d = *pi++) == '*' || d == '/'; *pp++ = d)
*pp++ = *pi++;
*pp = '\0';
printf("polish : %s\n", polish);
return 0;
}そして次の問なのですが、
問2、【問1】に準じた《条件》のもとで、挿入記法で記述された括弧を含む式を逆ポーランド記
法に変換するプログラムを作れ。
《方針:ヒント》
・【問1】の《手順》Step 2.1 で
⇒ 与式から取り出した因子が‘(’の場合、無条件に(Step 2.2 を飛ばし)work の終端に‘(’格納する(Step 2.3 を実行する)。
⇒ 与式から取り出した因子が‘)’の場合、無条件に(Step 2.2 を飛ばし)work の終端
から‘(’が現われるまで順次格納因子を取り出し、polish の終端に順次格納する。
‘(’はpolish に格納せずに廃棄、‘)’はpolish, work のいずれにも格納せずに廃棄する(Step 2.3 は実行しない)。
《例》
・ 挿入記法:a*((b +c)*d-e) ⇒ 逆ポーランド記法:abc+d *e-*
↑最終段階としてはこういう実行結果を作りたいのであります・・・分かる方いればお願いします。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: このプログラムは正しいか?後、デバッグできません・・・
かずまさんのコードで完成とされたみたいですが、かずまさん自身が《手順》に従っていないと書いていますので課題としてはNGだと思われます。
「よければプログラムをお教え頂きたいです。 • C言語交流フォーラム ~ mixC++ ~」
http://dixq.net/forum/viewtopic.php?f=3&t=10126
あとケントさんの「デバックできない」について具体的な説明をお願いします。
[追記]
あとインデントが出来ていないので見なおして下さい。読みづらいばかりかバグのもとです。
「投稿前チェックリスト(beatleさん作成)」
http://uchan.net/w/index.php?mixcpp%2F% ... 5%B9%A5%C8
【追記の追記】
よく分からなければ、ご自分のプログラムとかずまさんのプログラムにコメントでStepの何処の部分に当たるかを書いてみてください。
「よければプログラムをお教え頂きたいです。 • C言語交流フォーラム ~ mixC++ ~」
http://dixq.net/forum/viewtopic.php?f=3&t=10126
あとケントさんの「デバックできない」について具体的な説明をお願いします。
[追記]
あとインデントが出来ていないので見なおして下さい。読みづらいばかりかバグのもとです。
「投稿前チェックリスト(beatleさん作成)」
http://uchan.net/w/index.php?mixcpp%2F% ... 5%B9%A5%C8
【追記の追記】
よく分からなければ、ご自分のプログラムとかずまさんのプログラムにコメントでStepの何処の部分に当たるかを書いてみてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
ケント
Re: このプログラムは正しいか?後、デバッグできません・・・
かずまさん自身、手順に従ってプログラムしてないと言われましたが、これで合ってると思うんです。
因みに、僕のプログラムは
です。ですが、正常にビルドはできるのですが、実行画面が何もできません。
なので、問1はかずまさんのプログラムを引用させてもらいましたが、問2の問題が全く分からないと言う状況です。
因みに、僕のプログラムは
#include <stdio.h>
#define PRI(X) ( ( X == '+' || X == '-' )? 1: ( X == '*' || X == '/' )? 2: 3 )
int main( void )
{
char infix[ 256 ], work[ 256 ], polish[ 256 ];
char *pinfix, *pwork, *ppolish;
printf( "input infix notation > " );
scanf( "%s", infix );
pinfix = infix;
pwork = work;
ppolish = polish;
while( *pinfix )
{
while( PRI( *pinfix ) <= PRI( *( pwork - 1 ) ) &&
pwork != work )
{
*( ppolish++ ) = *( --pwork );
}
*( pwork++ ) = *( pinfix++ );
}
while( work != pwork )
{
*( ppolish++ ) = *( --pwork );
}
*ppolish = '\0';
printf( "polish : %s", polish );
return 0;
}です。ですが、正常にビルドはできるのですが、実行画面が何もできません。
なので、問1はかずまさんのプログラムを引用させてもらいましたが、問2の問題が全く分からないと言う状況です。
Re: このプログラムは正しいか?後、デバッグできません・・・
おかしいな、本当に何も出ないのですか?ケント さんが書きました:
ですが、正常にビルドはできるのですが、実行画面が何もできません。
non
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: このプログラムは正しいか?後、デバッグできません・・・
問題文に全く従っていませんので提出してもNGを食らう可能性が大きいです。なぜ従わなかったので説明できますか?ケント さんが書きました:かずまさん自身、手順に従ってプログラムしてないと言われましたが、これで合ってると思うんです。
答えが合っているのと手順に則っているかは別の問題です。
かずまさんのプログラムと各Stepがどう対応しているか説明してみてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: このプログラムは正しいか?後、デバッグできません・・・
申し訳ないですが、この掲示板のポリシーです。 フォーラムルール → http://dixq.net/board/board.htmlケント さんが書きました:厳しいww勉強になりませんが、誰か答えのプログラムを教えてくだされば一番助かるんですけどね・・・
宿題のサポートは致しますが考えるのはケントさんと言うことですね。これは大前提です。
結局理解出来ないと後で困ることになるので、今困っておくべきだと思いますよ。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: このプログラムは正しいか?後、デバッグできません・・・
あそこまで、自分で作ったなら愛着があるでしょ。
あのプログラムの何が気に入らないの?
だから、何も出ないってことはないでしょって言ってるのに、どうなの?
あのプログラムの何が気に入らないの?
だから、何も出ないってことはないでしょって言ってるのに、どうなの?
non
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: このプログラムは正しいか?後、デバッグできません・・・
マルチポストされていたみたいですね。
「kannsilyasiteさんの質問一覧 - Yahoo!知恵袋」
http://my.chiebukuro.yahoo.co.jp/my/mys ... nsilyasite
フォーラムルールに従って相互リンクをお願いします。
結局、どれも自分で作ったプログラでは無いということみたいです。
これも同じ方かも知れません。あるいはご学友かも。
「kakeru2200さんの質問一覧 - Yahoo!知恵袋」
http://my.chiebukuro.yahoo.co.jp/my/mys ... kakeru2200
「kannsilyasiteさんの質問一覧 - Yahoo!知恵袋」
http://my.chiebukuro.yahoo.co.jp/my/mys ... nsilyasite
フォーラムルールに従って相互リンクをお願いします。
結局、どれも自分で作ったプログラでは無いということみたいです。
これも同じ方かも知れません。あるいはご学友かも。
「kakeru2200さんの質問一覧 - Yahoo!知恵袋」
http://my.chiebukuro.yahoo.co.jp/my/mys ... kakeru2200
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。