掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.27424

逆ポーランド表記の計算
投稿者---ぱにぃ(2006/06/29 15:32:05)


#include<stdio.h>
#include<ctype.h>
#include<stdlib.h>

void    PUSH( int * );
void    POP ( int * );
#define MAX_SP  100;
#define MAX_LEN 500;

static int  SP,stack_flg;
static int  stack[MAX_SP];

int main(){
    
    int   i,x=0,y=0,work=0,ret=0;
    char  Porland[MAX_LEN];
    
    gets(Porland);
    
    for(i = 0 ; Porland[i] != "\n" ; i++){
        if(!(isdigit(Porland[i]))){
            switch(Porland[i]){
                case '*': if(SP < 1){
                                printf("\n入力エラーです\n");
                                return 0;
                            }
                           
                           POP(&y);
                           POP(&x);
                           work = x * y;
                           PUSH(&work);
                           if(stack_flg == 1){
                               printf("スタックがいっぱいです。");
                               return 0;
                              }
                           
                           break;
                           
                case '/': if(SP < 1){
                                printf("\n入力エラーです\n");
                                return 0;
                            }
                           
                           POP(&y);
                           POP(&x);
                           work = x / y;
                           PUSH(&work);
                           if(stack_flg == 1){
                               printf("スタックがいっぱいです。");
                               return 0;
                              }         
                           
                           break;
                           
                case '+': if(SP < 1){
                                printf("\n入力エラーです\n");
                                return 0;
                            }
                           
                           POP(&y);
                           POP(&x);
                           work = x + y;
                           PUSH(&work);
                           if(stack_flg == 1){
                               printf("スタックがいっぱいです。");
                               return 0;
                              }         
                           
                           break;

                case '-': if(SP < 1){
                                printf("\n入力エラーです\n");
                                return 0;
                            }
                           
                           POP(&y);
                           POP(&x);
                           work = x - y;
                           PUSH(&work);
                           if(stack_flg == 1){
                               printf("スタックがいっぱいです。");
                               return 0;
                              }         
                           
                           break;
                           
                default : if(i == 0){
                                printf("\n入力エラーです\n");
                                return 0;
                            }
                            else{
                                if(!(isspace(Porland[i]))){
                                    printf("\n入力エラーです\n");
                                    return 0;   
                                }
                                else{
                                    PUSH(&work);
                              if(stack_flg == 1){
                                  printf("スタックがいっぱいです。");
                                  return 0;
                                  }         
                                }
                            }
            }
        }
        else{
            if(isdigit(Porland[i+1])){
                work = work + atoi(Porland[i]) * 10;
            }
            else{
                work = work + atoi(Porland[i]);
            }
        }
    }
        
        POP(&ret);
        printf("\n\nX=%d",ret);
        return 0;
}
    
void PUSH( int *w_data ){
    
    stack[SP] = *w_data;
    SP++;
    if(SP == MAX_SP){
        stack_flg = 1;
    }

}
    
void POP( int *w_ret ){

    SP--;   
    *w_ret = stack[SP];
}


ふと、思い立ち
書いてみたのですが。
以下のエラー・警告が出て困っています。
最近Cの勉強を始めたばかりでまだまだ、初心者です。
助言いただけるとありがたいです。

Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
11: 配列境界 に ] がない
11: 宣言が正しく終了していない
16: 配列境界 に ] がない(関数 main )
16: 式の構文エラー(関数 main )
18: 未定義のシンボル Porland(関数 main )
123: 未定義のシンボル stack(関数 PUSH )
125: If文に ) がない(関数 PUSH )
125: 式の構文エラー(関数 PUSH )
129: パラメータ 'w_data' は一度も使用されない(関数 PUSH )
134: 未定義のシンボル stack(関数 POP )
135: パラメータ 'w_ret' は一度も使用されない(関数 POP )
*** 9 errors in Compile ***



この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:逆ポーランド表記の計算 27425 気分屋 2006/06/29 15:41:19


No.27425

Re:逆ポーランド表記の計算
投稿者---気分屋(2006/06/29 15:41:19)


# セミコロンがいらない
× #define MAX_SP  100;
× #define MAX_LEN 500;

○ #define MAX_SP  100
○ #define MAX_LEN 500

# 文字は''で囲む。""で囲むと文字列になってしまう。
× for(i = 0 ; Porland[i] != "\n" ; i++){
○ for(i = 0 ; Porland[i] != '\n' ; i++){




この投稿にコメントする

削除パスワード

No.27427

Re:逆ポーランド表記の計算
投稿者---ぱにぃ(2006/06/29 17:47:01)


ありがとうございます!!
初歩的なミスでしたね・・・
お恥ずかしいです。
助かりました!!!

助言していただいたとおりに変更したところ
エラーが2つにへりました。
以下の2つです。

108: パラメータ '__s' は const signed char * 型として定義されているので int は渡せない(関数 main )
111: パラメータ '__s' は const signed char * 型として定義されているので int は渡せない(関数 main )
*** 2 errors in Compile ***

さらにわからないエラーが・・・・
調べてみたんですが。。。。よくわからないです。。。


この投稿にコメントする

削除パスワード

No.27428

Re:逆ポーランド表記の計算
投稿者---Yuki(2006/06/29 18:10:15)


atoiを見直してみてください。

エラーの行数が出ているので、その部分を見ると良いですよ。


この投稿にコメントする

削除パスワード

No.27429

Re:逆ポーランド表記の計算
投稿者---ぱにぃ(2006/06/29 18:26:49)


数式をgets()で文字列として受け取り
Porlandのi番目の要素をint型に変換ととらえているのですが。

何がおかしいのかがさっぱりで・・・・
Porlandは文字型配列なのだから、引数も文字型じゃないんですか?

うぅ・・・わからない・・・・


この投稿にコメントする

削除パスワード

No.27430

Re:逆ポーランド表記の計算
投稿者---気分屋(2006/06/29 18:32:15)


char chr = 'a';
char str[100] = "abc";

上記の二つを例として使用します。

chrは文字です。
strは文字列です。
str[0]は文字です。
&str[0]は文字列です。

printf("%c", chr);		# aを表示(文字)
printf("%s", str);		# abcを表示(文字列)
printf("%c", str[0]);	# aを表示(文字)
printf("%s", &str[0]);	# abcを表示(文字列)
printf("%s", &str[1]);	# bcを表示(文字列)



この投稿にコメントする

削除パスワード

No.27432

Re:逆ポーランド表記の計算
投稿者---iijima(2006/06/29 18:53:38)


atoi関数の引数には文字列を渡さなくてはなりません。
文字型の値(整数値)と文字列(char型配列)の違いを認識してください。



この投稿にコメントする

削除パスワード

No.27433

Re:逆ポーランド表記の計算
投稿者---iijima(2006/06/29 19:03:04)


おまけのサンプル:

    char s[] = "1";
    char c   = '1';
    int i;

    i = atoi( s ); // OK
    i = atoi( c ); // Error



この投稿にコメントする

削除パスワード

No.27434

Re:逆ポーランド表記の計算
投稿者---iijima(2006/06/29 19:06:14)


あー、このサンプル方が理解し易いかな:

    char s[] = "1";
    int i;

    i = atoi( s );      // OK
    i = atoi( s[ 0 ] ); // Error



この投稿にコメントする

削除パスワード

No.27437

Re:逆ポーランド表記の計算
投稿者---ぱにぃ(2006/06/29 19:58:37)


みなさん、ありがとうございます!!

文字型配列(きわめて小さいもの)を用意し
そこに、代入してからatoi()で変換する方法で解決できました!!

で、コンパイルしてみたのですが。。。。

Fatal: ファイル 逆ポーランド表記法計算.OBJ が開けません

と、メッセージが・・・・

あ〜もぅ。。。意味わからない。。。
どうすればいいんでしょうか?
質問ばかりしてすみません。



この投稿にコメントする

削除パスワード

No.27438

Re:逆ポーランド表記の計算
投稿者---papa(2006/06/29 20:43:55)


>Fatal: ファイル 逆ポーランド表記法計算.OBJ が開けません

ソースファイル名に日本語を使わないで、
英数字だけにしてみてはいかがでしょうか。

ちなみに、ポーランドの英語表記はPolandです(3文字目のrは不要)。


この投稿にコメントする

削除パスワード

No.27443

Re:逆ポーランド表記の計算
投稿者---ぱにぃ(2006/06/29 21:27:47)


解決できました!!
ありがとうございます。

ファイル名には日本語は使わないほうがいいのですね。
勉強になりました。

協力してくださったみなさん、本当にありがとうございます!!


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧