実現したいこと
関数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/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
関数 Search() がどういう入力で呼ばれてどういう結果を返すつもりなのか説明していただけますか。
関数searchはパターンの文字列を入力すると,スタック上に積まれている身体検査データの名前をすべて探索し,最後に見つけたパターンの身体検査データ(名前,身長,視力)を 表示するようにしたいです。また、パターンの文字列(x->name)で指定された文字列を,スタックs上に積まれているすべての身体検査データの名前を底から頂上に向かって探索し,見つけたパターンの個数を関数の戻り値として返します。
今のコードは更新される前のコードより意図が読めなくなりました。
scanf("%d", &x); で構造体 PhysCheck の読み込みはできませんし、main() のローカル配列 a は未使用です。全体的にどういう意図なのかが伝わりません。
あと、人にコードを見せるときはちゃんとインデントをしてください。