ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

C言語とC++言語コミュのパスカルからCに変換したい場合

  • mixiチェック
  • このエントリーをはてなブックマークに追加
パスカルからC言語に変換したいのですが、
いまいちよくわかりません。
procedure realno;
var inch : char;
begin read (inch);

if sign(inch) thrn read (inch);
while digit(inch) do read (inch);
if inch ='.'then read (inch) else error;
if digit(inch) then read (inch) else error;
while digit(inch) do read(inch);
if inch='e'
then begin read(inch);
if sign(inch) then read (inch);
if digit(inch) then read (inch) else error;
while digit(inch) do read(inch)
end
end

だいたいの形はできたのですが、
.を読ませたり、最後のreturnでerrorがたくさん出力されるなど、
よくわかりません。
実行例
125はNO
125.はNO
125eはNO
125.eはYES
-125.86e32はYES
となる予定です。

考えたプログラム↓
#include<stdio.h>


main()
{ int c;//←これはintでいいのでしょうか?

printf("Input Number:");
scanf("%d",&c);
printf("%d",c);

c=getchar();
if (sign(c)) c=getchar();
while(digit(c)) c=getchar();
if (c=='.') c=getchar(); else error(c);
if (digit(c)) c=getchar(); else error(c);
while(digit(c)) c=getchar();
if (c=='e'){c=getchar();
if (sign(c)) c=getchar();
if (digit(c)) c=getchar(); else error(c);
while(digit(c)) c=getchar();
}
}

sign()
{
int c;

if(c=='+')
return;
else if(c=='-')
return;
else error(c);
}

digit()
{
int c;

if(c=='1')
return;
else if(c=='2')
return;
else if(c=='3')
return;
else if(c=='4')
return;
else if(c=='5')
return;
else if(c=='6')
return;
else if(c=='7')
return;
else if(c=='8')
return;
else if(c=='9')
return;
else error(c);

}

error()
{
printf("error\n");
return 0;
}

どなたか知恵をおかしください。
よろしくお願いします。

コメント(13)

もともとの PASCAL を極力再現してみた。

ただ、もともとの PASCAL のソースコードでは、
実行例どおりにはならないはずですが。
#125.e( . の後に e がくるパターン)は3つめの if で error に行くはず。

#include<stdio.h>

int main( void ) ;
bool sign( char c ) ;
bool digit( char c ) ;
void error( bool *rc ) ;

int main( void )
{
char buff[100] ;
char *inch ;
bool rc ;

printf("Input Number:");
scanf( "%s", &buff );
printf("%s\r\n", buff );

rc = true ;
inch = (char *)buff ;
if( sign( *inch )) inch++ ;
while( digit( *inch )) inch++ ;
if( *inch =='.' ) inch++ ; else error( &rc ) ;
if( digit( *inch )) inch++ ; else error( &rc ) ;
while( digit( *inch )) inch++ ;
if( *inch == 'e' ) inch++ ;
if( sign( *inch )) inch++ ;
if( digit( *inch )) inch++ ; else error( &rc ) ;
while( digit( *inch )) inch++ ;
return( rc ) ;
}

bool sign( char c )
{
if( c == '+' || c == '-' ) return( true ) ; else return( false ) ;
}

bool digit( char c )
{
if( c >= '0' && c <= '9' ) return( true ) ; else return( false ) ;
}

void error( bool *rc )
{
printf("error\n");
*rc = false ; // NO
}

int の戻りに bool 返してるけどまあいいや。

> hidenov vonnaskyさん

解答ありがとうござます。
実行してみたところ、無数のエラーが出てしまいました泣き顔
bool型は使用したことがないためまったくどう対処していいかわかりません
すみませんが、
もう一度おちからをお貸しくださいませんか?
古いCコンパイラを使っているなら、bool型対応していないかも知れないので、
とりあえず#includeの後くらいに
#define bool int
とか姑息な定義をして回避してみると良いのかも。。。
#define true 1
#define false 0

も忘れずにねぇ〜

> Minonさん & hidenov vonnaskyさん

解答ありがとうございます!!!
いわれたとおりにしたら、できました!
でもerrorが3こでたりしてしまうので、
あとは自分で解決したいと思います。
すごく困っていたので、本当に助かりました!
ありがとうございました!
bool型やtrue, falseはC++で追加されたキーワードではありませんでしたっけ???

あと、buffの終わりをチェックしてないので、このままだと確保した領域以外も参照してしまいます。
errorを出力したら、終了するようにしないとですね
> bool型やtrue, falseはC++で追加されたキーワードではありませんでしたっけ???

全然関係ない話では?
先日はお世話になりました。
とても助かりました。

またで申し訳ないのですが、助けていただきたい問題があります。

procedure PROGRAM;
begin if symbol <>beg
then error;
symbol := lexical;
DECLIST;
if symbol := lexical;
STATELIST;
if symbol <> fin
then error
end;
procedure DECLIST;
begin if symbol <> d
then error;
symbol :=lexical;
X
end;
procedure X;
begin if symbol=semi
then bigin symbol := lexical;
DECLIST
end
else if symbol =comma
then
else error
end;
procedure STATELIST;
bigin if symbol <> s
then bigin symbol := lexical;
STATELIST
end
else if symbol = fin
then
else error
end

というパスカルの構文解析のプログラムをc言語にしたいのですが…
考えた結果よくわからず、時間もなくて困っています。
どなたかお力を貸してくださいませんか。
お願いします。
質問・依頼に対する直接的な解答ではなくてすみませんが,
さあやさんの環境で Pascal が動くようにする方が早いのではないでしょうか?
勝手ながらPascal→Cの変換を行うことが必須ではないと思います.

ご呈示の様にプログラムが長いわけでもなく,変換することが必須で,
かつ期限があるとなると学校の課題やらではなかろうかと邪推します.
(本当に課題だった場合は他に適切なコミュニティあります.)

もし業務や研究に必要なコードでしたら尚更ご本人がコードを理解されている
必要があると思いますし,そのためには1回目と同様にご自身の作った
Cコードを提示してその悪い点,間違っている点を修正するのが良いと思います.
考えた結果わからない、というのは Pascal と c 以前にコードを整理していないからでは?

if 文とサブプロシージャ呼び出し程度しか利用していないので、きちんと流れ図を書けば
理解できるはずですよ。
フローチャートでも教えたその日にやらせるような流れ図のレベルですしね。

ログインすると、みんなのコメントがもっと見れるよ

mixiユーザー
ログインしてコメントしよう!

C言語とC++言語 更新情報

C言語とC++言語のメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。