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

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

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

3回答

2083閲覧

stackの使い方

ikuo-biyori

総合スコア56

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2016/10/13 21:50

数値を入力して下さい(正:格納、負:取出)-> 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;
}
}

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fuzzball

2016/10/14 00:12

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

回答3

0

ベストアンサー

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

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

c

1num++; 2stack[num]=x;

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

c

1stack[num]=x; 2num++;

出力(その1)

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

出力(その2)

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

c

1printf("ヘッダ"); 2for (...) { 3 printf("中身"); 4} 5printf("フッタ");

まとめ

c

1if(x > 0) { 2 stack[num] = x; 3 num++; 4 //header 5 printf("num=%d [", num); 6 //values 7 for(i = 0; i < num; i++) { 8 printf("%d", stack[i]); /*おまけ開始*/ 9 if (i == num-1) { 10 /*最後なら閉じ括弧(footer)*/ 11 printf("]\n"); 12 } else { 13 /*途中はスペース(separator)*/ 14 printf(" "); 15 } /*おまけ終了*/ 16 } 17 return 0;/*とりあえず*/ 18}

おまけ

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

c

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

投稿2016/10/14 00:45

編集2016/10/14 00:48
fuzzball

総合スコア16731

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ikuo-biyori

2016/10/14 00:48

お返事ありがとうございます。わかりました。
ttyp03

2016/10/14 00:54

格納(引数の値が正)のときに表示までするんですか? func(0)の意味がなくないですか? なんだかなぁ。
fuzzball

2016/10/14 01:04 編集

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

2016/10/14 01:09

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

2016/10/15 01:35

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

0

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

c

1int func(int x) 2{ 3 static int stack[N]; /* スタック本体 */ 4 static int num=0; /* データ数 */ 5 int i; 6 int r = 0; 7 8 // 格納 9 if( x > 0){ 10 if(num >= N){ 11 r = -2; // オーバーフロー 12 } else { 13 stack[num]=x; 14 num++; 15 } 16 17 // 取出 18 } else if(x < 0){ 19 if(num == 0){ 20 r = -1; // データなし 21 } else { 22 num--; 23 r = stack[num]; 24 } 25 26 // 表示 27 } else { 28 printf("num=%d [", num); 29 for(i = 0; i < num; i++){ 30 printf("%d ", stack[i]); 31 } 32 printf("]\n"); 33 } 34 35 return r; 36} 37

投稿2016/10/14 00:13

ttyp03

総合スコア16998

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

c

1 if(x>0){ 2 //stack[num]=x; 3 num++; 4 stack[num]=x; 5 printf("num=%d [",num); 6 for(i=1;i<=num;i++){ 7 printf("%d ",stack[i]); 8 } 9 printf("]\n"); 10 11 }

投稿2016/10/13 23:17

編集2016/10/13 23:20
A.Ichi

総合スコア4070

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問