質問編集履歴

3

ソースコードを変更した

2023/05/15 10:45

投稿

sho888
sho888

スコア14

test CHANGED
@@ -1 +1 @@
1
- char * name= s->stk[i].name;ここの箇所で式には構造体たは共用体型を使用する必要があるが int 型が使われるとわれる
1
+ 実行結果がうきません
test CHANGED
@@ -10,9 +10,7 @@
10
10
  ■■な機能を実装中に以下のエラーメッセージが発生しました。
11
11
 
12
12
  ### 発生している問題・エラーメッセージ
13
- char * name= s->stk[i].name;ここの箇所で式には構造体または共用体型を使用する必要があるが
13
+
14
- int 型が使われるといわれる。
15
-
16
14
  ```
17
15
  エラーメッセージ
18
16
  ```
@@ -54,14 +52,14 @@
54
52
  return 0;
55
53
  }
56
54
 
57
- int Push(PhysCheckStack *s,PhysCheck x){
55
+ int Push(PhysCheckStack *s,PhysCheck *x){
58
56
  if(s->ptr>= s->max) return -1;
59
- s->stk[s->ptr]=x;
57
+ s->stk[s->ptr] =* x;
60
58
  s->ptr++;
61
59
  return 0;
62
60
  }
63
61
 
64
- int Pop(PhysCheckStack *s,PhysCheck *x){
62
+ int Pop(PhysCheckStack *s, PhysCheck *x){
65
63
  if(s->ptr <=0) return -1;
66
64
  s->ptr--;
67
65
  *x=s->stk[s->ptr];
@@ -121,22 +119,25 @@
121
119
  int Search(PhysCheckStack *s,PhysCheck *x){
122
120
  int num=0;
123
121
  char *pt=x->name;
124
- int i=s->ptr;
122
+
123
+
125
124
 
126
125
  char s1[80];
127
126
  scanf("%s",s1);
128
- for ( i = 0; i < s->stk; i++) {
127
+ for (int i = 0; i < s->ptr; i++){
129
-
130
- while((pt= kmp_search(s1,s->stk[i].name))!=NULL){
128
+ pt=kmp_match(s1,s->stk[i].name);
131
- pt++;
129
+ if(pt==NULL){
130
+ printf("%s %d %lf\n",s->stk[i].name,s->stk[i].body.height,s->stk[i].body.vision);
132
- num++;
131
+ break;
133
132
  }
133
+ pt++;
134
+ num++;
134
135
  }
135
136
  if(num==0){
136
137
 
137
138
  return 0;}
138
139
  else{
139
- printf("%s %d %lf\n",s->stk[i].name,s->body[num].height,x->body[num].vision);
140
+
140
141
  return num;}
141
142
  }
142
143
 
@@ -145,10 +146,10 @@
145
146
 
146
147
  int main(void)
147
148
  {
149
+ PhysCheckStack s;
148
- PhysCheck s;
150
+ PhysCheck x;
149
-
150
- Initialize(&s,MAX);
151
+
151
- PhysCheck *y, a[] = {
152
+ PhysCheck a[] = {
152
153
  {"AKASAKA Tadao", 162, 0.3},
153
154
  {"KATOH Tomiaki", 173, 0.7},
154
155
  {"SAITOH Syouji", 175, 2.0},
@@ -159,7 +160,7 @@
159
160
  {"", -3, -0.3} /*フラグ*/
160
161
  };
161
162
 
162
-
163
+ Initialize(&s,MAX);
163
164
 
164
165
 
165
166
 
@@ -167,7 +168,7 @@
167
168
 
168
169
 
169
170
  while (1) {
170
- int menu, x;
171
+ int menu;
171
172
 
172
173
  printf("現在のデータ数%d / %d\n", Size(&s), Capacity(&s));
173
174
  printf("(1)プッシュ (2)ポップ (3)ピーク (4)表示 (5) 探査 (0) 終了:");
@@ -179,7 +180,7 @@
179
180
  case 1:
180
181
  printf("データ:");
181
182
  scanf("%d", &x);
182
- if (Push(&s, x) == -1)
183
+ if(Push(&s, &x)==-1)
183
184
  puts("\a エラー: プッシュに失敗しました。");
184
185
  break;
185
186
 
@@ -200,7 +201,7 @@
200
201
  case 4:
201
202
  Print(&s);
202
203
  break;
203
- case 5:if(Search(&y,&a)==0) {
204
+ case 5:if(Search(&s,&x)==0) {
204
205
  printf("パターンは存在しません。\n");
205
206
  return -1;}
206
207
  else return 0;
@@ -218,10 +219,6 @@
218
219
 
219
220
 
220
221
 
221
-
222
-
223
-
224
-
225
222
  ```
226
223
 
227
224
  ### 試したこと

2

構造体を追加した

2023/05/15 09:47

投稿

sho888
sho888

スコア14

test CHANGED
File without changes
test CHANGED
@@ -20,7 +20,6 @@
20
20
  ### 該当のソースコード
21
21
 
22
22
  ```C言語
23
-
24
23
  #include <stdio.h>
25
24
  #include <string.h>
26
25
 
@@ -28,6 +27,7 @@
28
27
  #define MAX 10
29
28
  #define PSC 1
30
29
  #define MaxPatt 1024
30
+
31
31
 
32
32
 
33
33
  typedef struct {
@@ -39,44 +39,48 @@
39
39
  {
40
40
  char name[20];
41
41
  Body body;
42
- int max;
42
+
43
- int ptr;
43
+
44
- int stk[MAX];
45
44
  } PhysCheck;
46
-
45
+ typedef struct {
46
+ PhysCheck stk[MAX];
47
+ int max;
48
+ int ptr;
49
+ } PhysCheckStack;
50
+
47
- int Initialize(PhysCheck *s,int max){
51
+ int Initialize(PhysCheckStack *s,int max){
48
52
  s->ptr=0;
49
53
  s->max=max;
50
54
  return 0;
51
55
  }
52
56
 
53
- int Push(PhysCheck *s,int x){
57
+ int Push(PhysCheckStack *s,PhysCheck x){
54
58
  if(s->ptr>= s->max) return -1;
55
59
  s->stk[s->ptr]=x;
56
60
  s->ptr++;
57
61
  return 0;
58
62
  }
59
63
 
60
- int Pop(PhysCheck *s, int *x){
64
+ int Pop(PhysCheckStack *s,PhysCheck *x){
61
65
  if(s->ptr <=0) return -1;
62
66
  s->ptr--;
63
67
  *x=s->stk[s->ptr];
64
68
  return (0);
65
69
  }
66
- int Peek(PhysCheck *s,int *x){
70
+ int Peek( PhysCheckStack *s,PhysCheck * x){
67
71
  if(s->ptr<=0) return -1;
68
72
  *x= s->stk[s->ptr-1];
69
73
  return 0;
70
74
  }
71
75
 
72
- int Capacity(const PhysCheck *s){
76
+ int Capacity(const PhysCheckStack *s){
73
77
  return s->max;
74
78
  }
75
- int Size(const PhysCheck *s){
79
+ int Size(const PhysCheckStack *s){
76
80
  return s->ptr;
77
81
  }
78
82
 
79
- void Print(const PhysCheck *s){
83
+ void Print(const PhysCheckStack *s){
80
84
  int i;
81
85
  for(i=0;i<s->ptr;i++)
82
86
  printf("%d",s->stk[i]);
@@ -114,22 +118,25 @@
114
118
  }
115
119
 
116
120
 
117
- int Search(PhysCheck *s,PhysCheck *x){
121
+ int Search(PhysCheckStack *s,PhysCheck *x){
118
122
  int num=0;
119
123
  char *pt=x->name;
124
+ int i=s->ptr;
120
125
 
121
126
  char s1[80];
122
127
  scanf("%s",s1);
123
- for (int i = 0; i < s->stk; i++) {
128
+ for ( i = 0; i < s->stk; i++) {
124
129
 
125
- num += kmp_search(s1,pt[i]);
130
+ while((pt= kmp_search(s1,s->stk[i].name))!=NULL){
126
-
131
+ pt++;
132
+ num++;
133
+ }
127
134
  }
128
135
  if(num==0){
129
136
 
130
137
  return 0;}
131
138
  else{
132
- printf("%s %d %lf\n",x->name[num],x->body[num].height,x->body[num].vision);
139
+ printf("%s %d %lf\n",s->stk[i].name,s->body[num].height,x->body[num].vision);
133
140
  return num;}
134
141
  }
135
142
 
@@ -139,9 +146,9 @@
139
146
  int main(void)
140
147
  {
141
148
  PhysCheck s;
142
-
149
+
143
150
  Initialize(&s,MAX);
144
- PhysCheck *y, x[] = {
151
+ PhysCheck *y, a[] = {
145
152
  {"AKASAKA Tadao", 162, 0.3},
146
153
  {"KATOH Tomiaki", 173, 0.7},
147
154
  {"SAITOH Syouji", 175, 2.0},
@@ -193,7 +200,7 @@
193
200
  case 4:
194
201
  Print(&s);
195
202
  break;
196
- case 5:if(Search(&s,&x)==0) {
203
+ case 5:if(Search(&y,&a)==0) {
197
204
  printf("パターンは存在しません。\n");
198
205
  return -1;}
199
206
  else return 0;
@@ -211,6 +218,10 @@
211
218
 
212
219
 
213
220
 
221
+
222
+
223
+
224
+
214
225
  ```
215
226
 
216
227
  ### 試したこと

1

関数searchの中を変えました。

2023/05/15 08:04

投稿

sho888
sho888

スコア14

test CHANGED
File without changes
test CHANGED
@@ -1,6 +1,5 @@
1
1
  ### 実現したいこと
2
- char * name= s->stk[i].name;
2
+ 関数searchはパターンの文字列を入力すると,スタック上に積まれている身体検査データの名前をすべて探索し,最後に見つけたパターンの身体検査データ(名前,身長,視力)を 表示するようにしたいです。また、パターンの文字列(x->name)で指定された文字列を,スタックs上に積まれているすべての身体検査データの名前を底から頂上に向かって探索し,見つけたパターンの個数を関数の戻り値として返します。
3
- この部分をなおしたいが、よくわからない。
4
3
 
5
4
 
6
5
  ### 前提
@@ -21,6 +20,7 @@
21
20
  ### 該当のソースコード
22
21
 
23
22
  ```C言語
23
+
24
24
  #include <stdio.h>
25
25
  #include <string.h>
26
26
 
@@ -31,13 +31,14 @@
31
31
 
32
32
 
33
33
  typedef struct {
34
- double vision; // �X�^�b�N�̗e��
34
+ double vision;
35
35
  int height;
36
36
 
37
37
  } Body;
38
38
  typedef struct
39
- { Body body;
39
+ {
40
40
  char name[20];
41
+ Body body;
41
42
  int max;
42
43
  int ptr;
43
44
  int stk[MAX];
@@ -116,10 +117,20 @@
116
117
  int Search(PhysCheck *s,PhysCheck *x){
117
118
  int num=0;
118
119
  char *pt=x->name;
120
+
121
+ char s1[80];
122
+ scanf("%s",s1);
119
- for (int i = 0; i < s->ptr; i++) {
123
+ for (int i = 0; i < s->stk; i++) {
120
- char * name= s->stk[i].name;
124
+
121
- num += kmp_search(name, pt);
125
+ num += kmp_search(s1,pt[i]);
126
+
122
127
  }
128
+ if(num==0){
129
+
130
+ return 0;}
131
+ else{
132
+ printf("%s %d %lf\n",x->name[num],x->body[num].height,x->body[num].vision);
133
+ return num;}
123
134
  }
124
135
 
125
136
 
@@ -128,28 +139,31 @@
128
139
  int main(void)
129
140
  {
130
141
  PhysCheck s;
142
+
143
+ Initialize(&s,MAX);
131
144
  PhysCheck *y, x[] = {
132
- {{ 162, 0.3}, "AKASAKA Tadao" },
145
+ {"AKASAKA Tadao", 162, 0.3},
133
- {{ 173, 0.7}, "KATOH Tomiaki" },
146
+ {"KATOH Tomiaki", 173, 0.7},
134
- {{ 175, 2.0}, "SAITOH Syouji" },
147
+ {"SAITOH Syouji", 175, 2.0},
135
- {{ 171, 1.5}, "TAKEDA Shinya" },
148
+ {"TAKEDA Shinya", 171, 1.5},
136
- {{ 168, 0.4}, "NAGAHAMA Masaki"},
149
+ {"NAGAHAMA Masaki", 168, 0.4},
137
- {{ 174, 1.2}, "HAMADA Tetsuaki"},
150
+ {"HAMADA Tetsuaki", 174, 1.2},
138
- {{ 169, 0.8}, "MATSUTOMI Akio" },
151
+ {"MATSUTOMI Akio", 169, 0.8},
139
- {{ -3,-0.3}, "" } /*フラグ*/
152
+ {"", -3, -0.3} /*フラグ*/
140
153
  };
141
154
 
142
-
143
- if (Initialize(&s, 64) == -1) {
155
+
144
- puts("スタックの生成に失敗しました");
156
+
145
- return 1;
157
+
146
- }
158
+
159
+
160
+
147
161
 
148
162
  while (1) {
149
163
  int menu, x;
150
164
 
151
165
  printf("現在のデータ数%d / %d\n", Size(&s), Capacity(&s));
152
- printf("(1)プッシュ (2)ポップ (3)ピーク (4)表示 (0) 終了:");
166
+ printf("(1)プッシュ (2)ポップ (3)ピーク (4)表示 (5) 探査 (0) 終了:");
153
167
  scanf("%d", &menu);
154
168
 
155
169
  if (menu == 0) break;
@@ -179,16 +193,24 @@
179
193
  case 4:
180
194
  Print(&s);
181
195
  break;
196
+ case 5:if(Search(&s,&x)==0) {
197
+ printf("パターンは存在しません。\n");
182
- }
198
+ return -1;}
199
+ else return 0;
200
+
201
+
202
+
183
203
  }
184
204
 
185
-
205
+ }
186
206
 
187
207
  return 0;
188
208
  }
189
209
 
190
210
 
191
211
 
212
+
213
+
192
214
  ```
193
215
 
194
216
  ### 試したこと