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

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

新規登録して質問してみよう
ただいま回答率
85.48%
アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

Q&A

0回答

682閲覧

スタックを動的なものに変更したくプログラムを変更した際にエラーが出る

fegeryh

総合スコア10

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

0グッド

0クリップ

投稿2021/05/24 12:19

編集2021/05/25 04:53

#include <stdio.h>
#define MAX 20
/--- 身体データ型 ---/
typedef struct{
int height; /* 身長 /
double vision; /
視力 /
}
Body ;
/
--- 身体検査データ型 ---/
typedef struct{
Body body; /
身体データ型 ---/
char name; / 氏名 /
} PhysCheck;
/
--- 身体検査データ型スタックを実現する構造体 ---
/
typedef struct{
int max; /スタックの容量/
int ptr; /スタックポインタ/
PhysCheck stk[MAX]; /スタック本体/
}PhysCheckStack;
/--- スタックの初期化 ---/
int Initialize(PhysCheckStack s, int max){
s->ptr = 0;
s->max = max;
return 0;
}
/
--- スタックの後始末 ---/
void Terminate(PhysCheckStack s){
if (s->stk != NULL){
while( --s->ptr >= 0)
free(s->stk[s->ptr]); /
動的な文字列保存用配列を解放 /
free(s->stk);
}
s->max = s->ptr = 0;
}
/
--- スタックにデータをプッシュ ---
/
int Push(PhysCheckStack s, PhysCheck x){
if(s->ptr>=s->max) return -1; /スタック満杯/
if((s->stk[s->ptr] = calloc(strlen(x)+1,sizeof(char)))==NULL)
/
データをコピーするための動的な文字列保存用配列を確保することに失敗 /
return -1;
strcpy(s->stk[s->ptr], x);
s->ptr++;
return 0;
}
/
--- スタックからデータをポップ ---/
int Pop(PhysCheckStack s, PhysCheck x){
if (s->ptr <= 0) return -1; /
スタックは空 /
s->ptr--;
strcpy(x, s->stk[s->ptr]);
free(s->stk[s->ptr]); /
ポップしたので,動的な文字列保存用配列を解放 /
return 0;
}
/
--- スタックからデータをピーク ---
/
int Peek(PhysCheckStack s, PhysCheck x){
if (s->ptr <= 0) return -1;
x = s->stk[s->ptr - 1];
return 0;
}
/
--- スタックの容量 ---
/
int Capacity(const PhysCheckStack s){
return s->max;
}
/
--- スタックに積まれているデータ数 ---
/
int Size(const PhysCheckStack s){
return s->ptr;
}
/
--- スタックの全データの表示 ---
/
void Print(const PhysCheckStack s){
int i;
for(i = 0; i < s->ptr; i++) printf("%s,%d,%f", s->stk[i].name, s->stk[i].body.height, s->stk[i].body.vision);
putchar('\n');
}
/
--- スタックの探索 ---*/
int Search(PhysCheckStack *s, PhysCheck *x){
int i=0, j=0,p, n=0;
for(i=0; i<s->ptr; i++){
p=0;
while(s->stk[i].name[p]!='\0' && x->name[p]!='\0'){
if(s->stk[i].name[p]==x->name[p])p++;
else break;
}
if(x->name[p]=='\0' && s->stk[i].name[p]=='\0'){
j=i;
n++;
}
}
if(n==0)
return 0;
else printf("%s,%d,%f\n", s->stk[j].name, s->stk[j].body.height, s->stk[j].body.vision);
}
int main(void){
PhysCheckStack s;

Initialize(&s, MAX);

while (1){
int menu;
PhysCheck x;
printf("現在のデータ数:%d%d\n",Size(&s),Capacity(&s));
printf("(1) プッシュ(2) ポップ(3) ピーク(4) 表示(5) 探索(0) 終了:");
scanf("%d", &menu);

if(menu==0) break; switch (menu) { case 1: /* プッシュ */ printf("データ(身長):"); scanf("%d", &x.body.height); printf("データ(視力):"); scanf("%lf", &x.body.vision); printf("データ(名前):"); scanf("%s", &x.name); if (Push(&s, x) == -1) puts("\a エラー:プッシュに失敗しました。"); break; case 2: /* ポップ */ if (Pop(&s, &x) == -1) puts("\a エラー:ポップに失敗しました。"); else if("ポップしたデータは、名前:%s、身長:%d、視力:%fです。\n", x.name, x.body.height, x.body.vision); break; case 3: /* ピーク */ if (Peek(&s, &x) == -1) puts("\a エラー:ピークに失敗しました。"); else if("ピークしたデータは、名前:%s、身長:%d、視力:%fです。\n", x.name, x.body.height, x.body.vision); break; case 4: /* 表示 */ Print(&s); break; case 5:/* 探索 */ printf("名前:"); scanf("%s", &x.name); if(Search(&s,&x)==0) puts("\aパターンは存在しません."); break; }

}
return 0;
}

スタックを動的なものに変更したくプログラムを変えたのですが、/--- スタックにデータをプッシュ ---/のところにエラーがでてしまいます。どう解決していいかわかりません。

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

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

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

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

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

fiveHundred

2021/05/24 12:22

どう見てもC#ではないので、適切なタグに変更してください。 また、質問文のコードは専用の書式を使ってください。
jbpb0

2021/05/24 12:38

c++のコードの一番最初の行のすぐ上に ```c++ だけの行を追加してください また、c++のコードの一番最後の行のすぐ下に ``` だけの行を追加してください 現状、コードがとても読み辛いです 質問にコードを載せる際に上記をやってくれたら、他人がコードを読みやすくなり、コードの実行による現象確認もやりやすくなるので、回答されやすくなります
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問