このプログラムは正しいか?後、デバッグできません・・・

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ケント

このプログラムは正しいか?後、デバッグできません・・・

#1

投稿記事 by ケント » 14年前

問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;
}

アバター
h2so5
副管理人
記事: 2212
登録日時: 15年前
住所: 東京
連絡を取る:

Re: このプログラムは正しいか?後、デバッグできません・・・

#2

投稿記事 by h2so5 » 14年前

ぱっと見た限りだと、17行目のwhileは絶対に無限ループになりますね。
( *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: このプログラムは正しいか?後、デバッグできません・・・

#3

投稿記事 by ケント » 14年前

そうなんですか・・・誰でも良いので良ければプログラムの編集をお願いしますm(__)m

かずま

Re: このプログラムは正しいか?後、デバッグできません・・・

#4

投稿記事 by かずま » 14年前

すみません。《手順》に従わないプログラムなら書けるんですが。

コード:

#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;
}

beatle
記事: 1281
登録日時: 14年前
住所: 埼玉
連絡を取る:

Re: このプログラムは正しいか?後、デバッグできません・・・

#5

投稿記事 by beatle » 14年前

挿入記法とやらを逆ポーランド記法に直すSimple Calculatorというプログラムの説明を読んでみました.
挿入記法とは,中置記法のことでしょうか.つまり私達が普段から使っている数式 a + b * c のようなものでしょうか.

それから,h2so5さんも言ってますが,「デバッグできない」という発言の真意を聞きたいです.

ケント

Re: このプログラムは正しいか?後、デバッグできません・・・

#6

投稿記事 by ケント » 14年前

逆ポーランドについての画像があるのですが、貼り方が分からないので文章でお伝えしますが、
かずまさんがやっているプログラムが正しいのかなと思います・・・後beatleさんの内容について。確かにデバッグ出来ないと言うことはどこかが間違ってるんですよね^^;

ケント

Re: このプログラムは正しいか?後、デバッグできません・・・

#7

投稿記事 by ケント » 14年前

因みにですが、
【問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-*
   ↑最終段階としてはこういう実行結果を作りたいのであります・・・

beatle
記事: 1281
登録日時: 14年前
住所: 埼玉
連絡を取る:

Re: このプログラムは正しいか?後、デバッグできません・・・

#8

投稿記事 by beatle » 14年前

ケント さんが書きました:後beatleさんの内容について。確かにデバッグ出来ないと言うことはどこかが間違ってるんですよね^^;
ええと,ケントさんが「デバッグ」という言葉をどういう意味で使っているのかを知りたかったのですが.

デバッグとは本来,「バグを取り除く」という意味です.ソースコードをじっくり読んでバグを見つけて取り除くのもデバッグですし,一度コンパイルして実行し,実行結果をヒントとしてバグを見つけて取り除くのもデバッグです.
ですから,「デバッグできない」というのは,本来のデバッグの意味を考えれば,ケントさんがソースコードさえ読む気がない,ということを意味します.
ですから,「デバッグ出来ないと言うことはどこかが間違ってる」というのは変です.どこかが間違っているからデバッグするんです.
しかし,ケントさんの文章を見ていると,どうもデバッグという言葉を他の意味で使っているらしいという感じがします.

細かい用語の使い方をつついているようで申し訳ない気もしますね.ごめんなさい.

ケント

Re: このプログラムは正しいか?後、デバッグできません・・・

#9

投稿記事 by ケント » 14年前

そうなんですか・・・自分はまだ勉強し始めたばかりだったので、全然意味がわかりませんでした・・・

ケント

再度お願いしますm(__)m

#10

投稿記事 by ケント » 14年前

問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>
 
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;
}
↑問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-*
   ↑最終段階としてはこういう実行結果を作りたいのであります・・・分かる方いればお願いします。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: このプログラムは正しいか?後、デバッグできません・・・

#11

投稿記事 by softya(ソフト屋) » 14年前

かずまさんのコードで完成とされたみたいですが、かずまさん自身が《手順》に従っていないと書いていますので課題としては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の何処の部分に当たるかを書いてみてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ケント

Re: このプログラムは正しいか?後、デバッグできません・・・

#12

投稿記事 by ケント » 14年前

かずまさん自身、手順に従ってプログラムしてないと言われましたが、これで合ってると思うんです。
因みに、僕のプログラムは

コード:

#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の問題が全く分からないと言う状況です。

non
記事: 1097
登録日時: 15年前

Re: このプログラムは正しいか?後、デバッグできません・・・

#13

投稿記事 by non » 14年前

ケント さんが書きました:
ですが、正常にビルドはできるのですが、実行画面が何もできません。
おかしいな、本当に何も出ないのですか?
non

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: このプログラムは正しいか?後、デバッグできません・・・

#14

投稿記事 by softya(ソフト屋) » 14年前

ケント さんが書きました:かずまさん自身、手順に従ってプログラムしてないと言われましたが、これで合ってると思うんです。
問題文に全く従っていませんので提出してもNGを食らう可能性が大きいです。なぜ従わなかったので説明できますか?
答えが合っているのと手順に則っているかは別の問題です。

かずまさんのプログラムと各Stepがどう対応しているか説明してみてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ケント

Re: このプログラムは正しいか?後、デバッグできません・・・

#15

投稿記事 by ケント » 14年前

厳しいww勉強になりませんが、誰か答えのプログラムを教えてくだされば一番助かるんですけどね・・・

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: このプログラムは正しいか?後、デバッグできません・・・

#16

投稿記事 by softya(ソフト屋) » 14年前

ケント さんが書きました:厳しいww勉強になりませんが、誰か答えのプログラムを教えてくだされば一番助かるんですけどね・・・
申し訳ないですが、この掲示板のポリシーです。 フォーラムルール → http://dixq.net/board/board.html
宿題のサポートは致しますが考えるのはケントさんと言うことですね。これは大前提です。
結局理解出来ないと後で困ることになるので、今困っておくべきだと思いますよ。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

non
記事: 1097
登録日時: 15年前

Re: このプログラムは正しいか?後、デバッグできません・・・

#17

投稿記事 by non » 14年前

あそこまで、自分で作ったなら愛着があるでしょ。
あのプログラムの何が気に入らないの?
だから、何も出ないってことはないでしょって言ってるのに、どうなの?
non

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: このプログラムは正しいか?後、デバッグできません・・・

#18

投稿記事 by softya(ソフト屋) » 14年前

マルチポストされていたみたいですね。
「kannsilyasiteさんの質問一覧 - Yahoo!知恵袋」
http://my.chiebukuro.yahoo.co.jp/my/mys ... nsilyasite
フォーラムルールに従って相互リンクをお願いします。

結局、どれも自分で作ったプログラでは無いということみたいです。

これも同じ方かも知れません。あるいはご学友かも。
「kakeru2200さんの質問一覧 - Yahoo!知恵袋」
http://my.chiebukuro.yahoo.co.jp/my/mys ... kakeru2200
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

閉鎖

“C言語何でも質問掲示板” へ戻る