質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.22%

stackの使い方

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 1,261

ikuo-biyori

score 56

数値を入力して下さい(正:格納、負:取出)-> 56
num=1 [56 ]
数値を入力して下さい(正:格納、負:取出)-> 83
num=2 [56 83 ]
数値を入力して下さい(正:格納、負:取出)-> 27
num=3 [56 83 27 ]
このように表示したいのですが、実行結果がnum1=[56] num2=[83] num3=[27]というようになってしまいます。どうすれば、良いですか?
stackの配列の使い方について教えてください。
----------------------------------------------------------c言語
コード

include <stdio.h>

define N 10

int func(int);

int main()
{
int n,r;

while(1) {
printf("数値を入力して下さい(正:格納、負:取出)-> ");
scanf("%d",&n);
if (n==0) break;
r=func(n);/* スタックに格納または取出*/
func(0); /* スタックを表示 */
if (r>0) printf("取り出したデータ: %d\n",r); /* 取得データの表示 */
else if (r==-1) printf("エラー(データがありません)\n"); 
else if (r==-2) printf("エラー(オーバーフロー)\n"); 
}
return 0;
}

/* 引数::正の整数:スタックに格納、負の整数:スタックから取出
0:スタックの中身を表示
戻り値:スタックから取り出した値。取出時スタックが空なら-1,
格納時スタックがいっぱいのとき-2、表示の際はいつも0 を返す*/
int func(int x)
{
static int stack[N]; /* スタック本体 */
static int num=0;  /* データ数 */
int i;
if(x>0){
//stack[num]=x;
num++;
stack[num]=x;
for(i=0;i<num;i++){

}  printf("num=%d [%d]\n",num,stack[num]);

}

else if(x<0){
num--;
x=stack[num];
return x;
}
}

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • fuzzball

    2016/10/14 09:12

    コードは ``` で囲って下さい。

    キャンセル

回答 3

checkベストアンサー

0

未実装の部分はこれから作ると仮定して、格納時の処理のみ修正します。

 配列の添字は0から始まります

num++; 
stack[num]=x;

これだと、最初に格納されるのが[1]になってしまいますので、コメントアウトしている方が正解ということになります。

stack[num]=x;
num++;

 出力(その1)

配列の中身を出力するところがstack[num]となっており、これでは全て最後に追加した値だけ出力されてしまいます。stack[i](添字にループカウンタiを指定)が正解です。

 出力(その2)

繰り返さない部分(データ数や括弧)はforループの外に出しましょう。

printf("ヘッダ");
for (...) {
    printf("中身");
}
printf("フッタ");

 まとめ

if(x > 0) { 
    stack[num] = x; 
    num++;
    //header 
    printf("num=%d [", num);
    //values
    for(i = 0; i < num; i++) {
        printf("%d", stack[i]); /*おまけ開始*/
        if (i == num-1) {
            /*最後なら閉じ括弧(footer)*/
            printf("]\n");
        } else {
            /*途中はスペース(separator)*/
            printf(" ");
        }                       /*おまけ終了*/
    }
    return 0;/*とりあえず*/
}

 おまけ

中身の出力部分(コメントのおまけ開始おまけ終了まで)は、三項演算子を使って一行で書くことも出来ます。

printf("%d%s", stack[i], (i == num-1)? "]\n": " ");

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/10/14 10:01 編集

    表示がおかしいという質問なので、それに対しての回答です。回答の冒頭に「未実装の部分はこれから作ると仮定して」と断っていますが。

    キャンセル

  • 2016/10/14 10:09

    あ、すみません。
    fuzzballさんよりかは質問者さん向けのコメントでした。

    キャンセル

  • 2016/10/15 10:35

    >ttyp03さん、すいません。問題をよく見ていませんでした。func(0)はstackを表示する処理を行うものでした。おかげさまで、解決しました。ありがとうございました。

    キャンセル

0

表示の部分だけです、下記の部分を変更してみました。スタック機能全体としては見れていません、stack配列が1から始まっている様です?

if(x>0){
        //stack[num]=x;
        num++;
        stack[num]=x;
        printf("num=%d [",num);
        for(i=1;i<=num;i++){
            printf("%d ",stack[i]);
        }
        printf("]\n");

    }

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

func関数のコメントに書かれていることが実装されていませんね。
戻り値を返さないルートも存在しています。
またA.Ichiさんの回答にあるように、格納開始が[1]から始まってしまっています。
func関数を見直したコードを貼っておきます(未検証)

int func(int x) 
{ 
    static int stack[N]; /* スタック本体 */ 
    static int num=0;  /* データ数 */ 
    int i; 
    int r = 0;

    // 格納
    if( x > 0){ 
        if(num >= N){
            r = -2;        // オーバーフロー
        } else {
            stack[num]=x; 
            num++; 
        }

    // 取出
    } else if(x < 0){ 
        if(num == 0){
            r = -1;    // データなし
        } else {
            num--; 
            r = stack[num]; 
        }

    // 表示
    } else {
        printf("num=%d [", num);
        for(i = 0; i < num; i++){
            printf("%d ", stack[i]);
        }
        printf("]\n");
    }

    return r; 
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.22%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる