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

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

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

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

Q&A

2回答

854閲覧

実行結果がうまくいきません。

sho888

総合スコア14

C

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

0グッド

0クリップ

投稿2023/05/15 03:21

編集2023/05/15 10:45

実現したいこと

関数searchはパターンの文字列を入力すると,スタック上に積まれている身体検査データの名前をすべて探索し,最後に見つけたパターンの身体検査データ(名前,身長,視力)を 表示するようにしたいです。また、パターンの文字列(x->name)で指定された文字列を,スタックs上に積まれているすべての身体検査データの名前を底から頂上に向かって探索し,見つけたパターンの個数を関数の戻り値として返します。

前提

ここに質問の内容を詳しく書いてください。
(例)
TypeScriptで●●なシステムを作っています。
■■な機能を実装中に以下のエラーメッセージが発生しました。

発生している問題・エラーメッセージ

エラーメッセージ

該当のソースコード

C言語

1#include <stdio.h> 2#include <string.h> 3 4 5#define MAX 10 6#define PSC 1 7#define MaxPatt 1024 8 9 10 11typedef struct { 12 double vision; 13 int height; 14 15} Body; 16typedef struct 17{ 18 char name[20]; 19 Body body; 20 21 22} PhysCheck; 23typedef struct { 24 PhysCheck stk[MAX]; 25 int max; 26 int ptr; 27} PhysCheckStack; 28 29int Initialize(PhysCheckStack *s,int max){ 30 s->ptr=0; 31 s->max=max; 32 return 0; 33} 34 35int Push(PhysCheckStack *s,PhysCheck *x){ 36 if(s->ptr>= s->max) return -1; 37 s->stk[s->ptr] =* x; 38 s->ptr++; 39 return 0; 40} 41 42int Pop(PhysCheckStack *s, PhysCheck *x){ 43 if(s->ptr <=0) return -1; 44 s->ptr--; 45 *x=s->stk[s->ptr]; 46 return (0); 47} 48int Peek( PhysCheckStack *s,PhysCheck * x){ 49 if(s->ptr<=0) return -1; 50 *x= s->stk[s->ptr-1]; 51 return 0; 52} 53 54int Capacity(const PhysCheckStack *s){ 55 return s->max; 56} 57int Size(const PhysCheckStack *s){ 58 return s->ptr; 59} 60 61void Print(const PhysCheckStack *s){ 62 int i; 63 for(i=0;i<s->ptr;i++) 64 printf("%d",s->stk[i]); 65 putchar('\n'); 66} 67 68char *kmp_match(char *pat, char *txt){ 69 char *pt ; /* txt をなぞるカーソル */ 70 char *pp ; /* pat をなぞるカーソル */ 71 char *skip[MaxPatt]; /* スキップテーブル */ 72 pp = pat; 73 skip[PSC] = pp; 74 pt = pp + PSC; 75 while (*pt != '\0') { 76 if (*pt == *pp) 77 skip[++pt-pat] = ++pp; 78 else if (pp == pat) 79 skip[++pt-pat] = pp; 80 else 81 pp = skip[pp - pat]; 82 } 83 for(pp = pat, pt = txt; *pt != '\0' && *pp != '\0';){ 84 if (*pt == *pp) { 85 pt++; 86 pp++; 87 } 88 else if (pp == pat) 89 pt++; 90 else 91 pp = skip[pp - pat]; 92 } 93 if (*pp == '\0') 94 return pt - strlen(pat); 95 return NULL; 96} 97 98 99int Search(PhysCheckStack *s,PhysCheck *x){ 100 int num=0; 101 char *pt=x->name; 102 103 104 105 char s1[80]; 106 scanf("%s",s1); 107 for (int i = 0; i < s->ptr; i++){ 108 pt=kmp_match(s1,s->stk[i].name); 109 if(pt==NULL){ 110 printf("%s %d %lf\n",s->stk[i].name,s->stk[i].body.height,s->stk[i].body.vision); 111 break; 112 } 113 pt++; 114 num++; 115 } 116 if(num==0){ 117 118 return 0;} 119 else{ 120 121 return num;} 122} 123 124 125 126 127int main(void) 128{ 129 PhysCheckStack s; 130 PhysCheck x; 131 132 PhysCheck a[] = { 133 {"AKASAKA Tadao", 162, 0.3}, 134 {"KATOH Tomiaki", 173, 0.7}, 135 {"SAITOH Syouji", 175, 2.0}, 136 {"TAKEDA Shinya", 171, 1.5}, 137 {"NAGAHAMA Masaki", 168, 0.4}, 138 {"HAMADA Tetsuaki", 174, 1.2}, 139 {"MATSUTOMI Akio", 169, 0.8}, 140 {"", -3, -0.3} /*フラグ*/ 141 }; 142 143 Initialize(&s,MAX); 144 145 146 147 148 149 150 while (1) { 151 int menu; 152 153 printf("現在のデータ数%d / %d\n", Size(&s), Capacity(&s)); 154 printf("(1)プッシュ (2)ポップ (3)ピーク (4)表示 (5) 探査 (0) 終了:"); 155 scanf("%d", &menu); 156 157 if (menu == 0) break; 158 159 switch (menu) { 160 case 1: 161 printf("データ:"); 162 scanf("%d", &x); 163 if(Push(&s, &x)==-1) 164 puts("\a エラー: プッシュに失敗しました。"); 165 break; 166 167 case 2: 168 if (Pop(&s, &x) == -1) 169 puts("\a エラー: ポップに失敗しました。"); 170 else 171 printf("ポップしたデータは%dです。\n", x); 172 break; 173 174 case 3: 175 if (Peek(&s, &x) == -1) 176 puts("\aエラー: ポップに失敗しました。"); 177 else 178 printf("ピークしたデータは%dです\n", x); 179 break; 180 181 case 4: 182 Print(&s); 183 break; 184 case 5:if(Search(&s,&x)==0) { 185 printf("パターンは存在しません。\n"); 186 return -1;} 187 else return 0; 188 189 190 191 } 192 193 } 194 195 return 0; 196} 197 198 199 200 201

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

int32_t

2023/05/15 07:31

関数 Search() がどういう入力で呼ばれてどういう結果を返すつもりなのか説明していただけますか。
sho888

2023/05/15 08:19

関数searchはパターンの文字列を入力すると,スタック上に積まれている身体検査データの名前をすべて探索し,最後に見つけたパターンの身体検査データ(名前,身長,視力)を 表示するようにしたいです。また、パターンの文字列(x->name)で指定された文字列を,スタックs上に積まれているすべての身体検査データの名前を底から頂上に向かって探索し,見つけたパターンの個数を関数の戻り値として返します。
int32_t

2023/05/15 11:57

今のコードは更新される前のコードより意図が読めなくなりました。 scanf("%d", &x); で構造体 PhysCheck の読み込みはできませんし、main() のローカル配列 a は未使用です。全体的にどういう意図なのかが伝わりません。 あと、人にコードを見せるときはちゃんとインデントをしてください。
guest

回答2

0

修正してみましたが,期待した動作ですか?

C

1/* pwlqna95q5we2p_revised.c */ 2 3#include <stdio.h> 4#include <stdlib.h> 5#include <string.h> 6 7#define MAX 10 8#define NAMELGT 20 9 10typedef struct { 11 int height; 12 double vision; 13} Body; 14 15typedef struct { 16 char name[NAMELGT+1]; 17 Body body; 18} PhysCheck; 19 20typedef struct { 21 PhysCheck stk[MAX]; 22 int max; 23 int ptr; 24} PhysCheckStack; 25 26int Initialize(PhysCheckStack *s, PhysCheck a[], int n); 27int Push(PhysCheckStack *s, PhysCheck *x); 28int Pop(PhysCheckStack *s, PhysCheck *x); 29int Peek(PhysCheckStack *s, PhysCheck *x); 30int Capacity(const PhysCheckStack *s); 31int Size(const PhysCheckStack *s); 32int ScanName(PhysCheck *x); 33int ScanInt(int *i); 34int ScanPerson(PhysCheck *x); 35void PrintPerson(const PhysCheck *stki); 36void PrintStack(const PhysCheckStack *s); 37int Search(PhysCheckStack *s, PhysCheck *x); 38 39int main(void) { 40 PhysCheckStack s; 41 PhysCheck x; 42 PhysCheck a[] = { 43 {"AKASAKA Tadao", {162, 0.3}}, 44 {"KATOH Tomiaki", {173, 0.7}}, 45 {"SAITOH Syouji", {175, 2.0}}, 46 {"TAKEDA Shinya", {171, 1.5}}, 47 {"NAGAHAMA Masaki", {168, 0.4}}, 48 {"HAMADA Tetsuaki", {174, 1.2}}, 49 {"MATSUTOMI Akio", {169, 0.8}} 50 }; 51 int n = (sizeof a) / (sizeof a[0]); 52 int k; // 探査して見つかった人を s.stk[k] とする 53 54 Initialize(&s,a,n); 55 56 while (1) { 57 int menu; 58 59 printf("\n現在のデータ数%d / %d\n", Size(&s), Capacity(&s)); 60 do { 61 printf("(1)プッシュ (2)ポップ (3)ピーク (4)表示 (5) 探査 (0) 終了: "); 62 ScanInt(&menu); 63 } while (menu < 0 || menu > 5); 64 if (menu == 0) { 65 break; 66 } 67 switch (menu) { 68 case 1: 69 printf("プッシュするデータ:\n"); 70 if (ScanPerson(&x) != 0) { 71 puts("\a エラー: データの読み込みに失敗しました。"); 72 } 73 else if(Push(&s, &x) == -1) { 74 puts("\a エラー: プッシュに失敗しました。"); 75 } 76 break; 77 case 2: 78 if (Pop(&s, &x) == -1) { 79 puts("\a エラー: ポップに失敗しました。"); 80 } else { 81 printf("ポップしたデータは以下のとおりです。\n"); 82 PrintPerson(&x); 83 } 84 break; 85 case 3: 86 if (Peek(&s, &x) == -1) { 87 puts("\aエラー: ポップに失敗しました。"); 88 } else { 89 printf("ピークしたデータは以下のとおりです。\n"); 90 PrintPerson(&x); 91 } 92 break; 93 case 4: 94 PrintStack(&s); 95 break; 96 case 5: 97 printf("探査する名前:\n"); 98 if (ScanName(&x) == -1) { 99 puts("\a エラー: 探査する名前の読み込みに失敗しました。"); 100 } 101 if ((k = Search(&s,&x)) < 0) { 102 puts("\a エラー: パターンは存在しません。"); 103 } else { 104 PrintPerson(&(s.stk[k])); 105 } 106 break; 107 default: 108 puts("\a これは表示されないはず。"); 109 } 110 } 111 112 return 0; 113} 114 115int Initialize(PhysCheckStack *s, PhysCheck a[], int n) { 116 s->ptr = 0; 117 s->max = MAX; 118 for (int i = 0; i < n; i++) { 119 if (Push(s,&a[i]) == -1) { 120 return -1; 121 } 122 } 123 124 return 0; 125} 126 127int Push(PhysCheckStack *s, PhysCheck *x) { 128 if(s->ptr >= s->max) { 129 return -1; 130 } 131 s->stk[s->ptr] = *x; 132 (s->ptr)++; 133 134 return 0; 135} 136 137int Pop(PhysCheckStack *s, PhysCheck *x) { 138 if(s->ptr <= 0) { 139 return -1; 140 } 141 (s->ptr)--; 142 *x = s->stk[s->ptr]; 143 144 return 0; 145} 146 147int Peek(PhysCheckStack *s, PhysCheck *x) { 148 if(s->ptr <= 0) { 149 return -1; 150 } 151 *x = s->stk[s->ptr-1]; 152 153 return 0; 154} 155 156int Capacity(const PhysCheckStack *s) { 157 return s->max; 158} 159 160int Size(const PhysCheckStack *s) { 161 return s->ptr; 162} 163 164void clearbuf(void) { 165 while (getchar() != '\n') { 166 ; 167 } 168} 169 170char *myfgets(char *s, int n, FILE *stream) { 171 char *ans, *p; 172 173 if ((ans = fgets(s,n,stream)) != NULL) { 174 if ((p = strchr(s,'\n')) != NULL) { 175 *p = '\0'; 176 } else if (stream == stdin) { 177 clearbuf(); 178 } 179 } 180 181 return ans; 182} 183 184int ScanName(PhysCheck *x) { 185 char buf[NAMELGT+1]; 186 187 printf("名前: "); 188 strcpy(x->name,myfgets(buf,(sizeof buf),stdin)); 189 if (strcmp(x->name,"") == 0) { 190 return -1; 191 } 192 193 return 0; 194} 195 196int ScanInt(int *i) { 197 enum {MAXDGT = 12}; // 入力する整数の桁数の最大値 198 char buf[MAXDGT+1]; 199 char *endptr; 200 201 if (strcmp(myfgets(buf,(sizeof buf),stdin),"") != 0) { 202 endptr = NULL; 203 *i = strtol(buf,&endptr,10); 204 if (*endptr != '\0') { 205 printf("警告: endptr: \"%s\"\n",endptr); 206 *i = -1; 207 } 208 } else { 209 return -1; 210 } 211 212 return 0; 213} 214 215int ScanDouble(double *d) { 216 enum {MAXDGT = 32}; // 入力する小数の桁数の最大値 217 char buf[MAXDGT+1]; 218 char *endptr; 219 220 if (strcmp(myfgets(buf,(sizeof buf),stdin),"") != 0) { 221 endptr = NULL; 222 *d = strtod(buf,&endptr); 223 if (*endptr != '\0') { 224 printf("警告: endptr: \"%s\"\n",endptr); 225 } 226 } else { 227 return -1; 228 } 229 230 return 0; 231} 232 233int ScanPerson(PhysCheck *x) { 234 int rtn; 235 236 /* 名前の入力 */ 237 rtn = ScanName(x); 238 /* 身長の入力 */ 239 printf("身長: "); 240 if (ScanInt(&(x->body.height)) != 0) { 241 x->body.height = -3; 242 x->body.vision = 0.3; 243 rtn = -1; 244 } 245 /* 視力の入力 */ 246 printf("視力: "); 247 if (ScanDouble(&(x->body.vision)) != 0) { 248 x->body.vision = 0.3; 249 rtn = -1; 250 } 251 252 return rtn; 253} 254 255void PrintPerson(const PhysCheck *stki) { 256 printf("%-*s, ",NAMELGT+1,stki->name); 257 printf("%3d, ",stki->body.height); 258 printf("%.1f\n",stki->body.vision); 259} 260 261void PrintStack(const PhysCheckStack *s) { 262 for(int i = 0; i < s->ptr; i++) { 263 PrintPerson(&(s->stk[i])); 264 } 265} 266 267int Search(PhysCheckStack *s, PhysCheck *x) { 268 int rtn = -1; 269 270 for (int i = 0; i < s->ptr; i++) { 271 if (strstr(s->stk[i].name,x->name) != NULL) { 272 rtn = i; 273 break; 274 } 275 } 276 277 return rtn; 278} 279 280/* ビルドのオプション指定例 281gcc の場合: 282> gcc -W -Wall -finput-charset=cp932 -fexec-charset=cp932 pwlqna95q5we2p_revised.c 283 284cl の場合: 285> cl /W3 /wd4996 /nologo pwlqna95q5we2p_revised.c 286*/
  • 未使用だった main() のローカル配列 a[] は,メニュー表示前にスタックに積んでおくデータだと思うので,Initialize() をそのように書きかえました.
  • プッシュ時に読み込むデータは,一人分のデータ(氏名・身長・視力)だと思うので,そのための関数 ScanPerson() を追加しました.
  • 探査時に読み込むデータは氏名のみだと思うので,氏名だけ読み込む関数 ScanName() を追加しました.
  • 一人分のデータの表示と,スタックに積まれているデータの一覧表示が必要だと思うので,表示のための関数を PrintPerson() と PrintStack() に分けました.
  • もともとあった関数は,戻り値の型を int にして,操作が成功したときに 0,失敗したときに -1 を返す作りのようだったので,追加した関数もそのように合わせました.
  • 文字列を探査する部分を strstr() で書いてしまいましたが,kmp_match() (Knuth–Morris–Pratt法)を使っても実現できると思います.
  • コメントに書いた gcc のビルドオプションは,いわゆるダメ文字(表示の「表」)対策です.
  • ScanInt() なる馬鹿馬鹿しい関数は,メニュー選択時に誤って文字列を入力した時にも,入力をやり直せるようにしたものです.

投稿2023/07/06 09:34

編集2023/07/06 09:45
obeSolitary

総合スコア106

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

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

0

ここの箇所で式には構造体または共用体型を使用する必要があるが int 型が使われるといわれる。

エラーメッセージのとおりです。s->stk[i]int型なので、.nameを続けることはできません。

投稿2023/05/15 03:32

maisumakun

総合スコア145201

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

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

sho888

2023/05/15 03:47

s->stk[i]をchar型に変換する場合はどうすればよいですか?
maisumakun

2023/05/15 03:59

どのような値を得たいのでしょうか?
sho888

2023/05/15 07:14

パターンの文字列を入力して、パターンの文字列(x->name)で指定された文字列の値を得たいです。
sho888

2023/05/15 08:05

スタック上に積まれている身体検査データの名前をすべて探索し,最後に見つけたパターンの身体検査データ(名前,身長,視力)を 表示するようにしたいです
maisumakun

2023/05/15 08:11

stkとnameが同じ構造体のプロパティとなっていますが、それは意図どおりなのでしょうか?
sho888

2023/05/15 08:18

同じ構造体のプロパティにしないとするとどうなりますか?
maisumakun

2023/05/15 08:22

設計の意図が読み取れないので判断がつかないです。
sho888

2023/05/15 08:29

スタックで扱えるようにする「身体検査データ型スタックを実現する構造体」PhysCheckStack型にしたいため 同じ構造体のプロパティにしました。
maisumakun

2023/05/15 08:31

PhysCheckを増やせば、スタックの長さではなく個数が増えていくことになるのですが、それで問題はないのでしょうか?
sho888

2023/05/15 08:43

あっすいません。スタックの個数とは、例えば、stk[max]が複数生成されるという意味ですか?
maisumakun

2023/05/15 08:57

> スタックの個数とは、例えば、stk[max]が複数生成されるという意味ですか? そのとおりです。
sho888

2023/05/15 09:46

ごめんなさい。自分の理解不足でした。PhysCheckStackの構造体を作りました。 ソースコードを修正したので見てください
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

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

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問