質問編集履歴

2

意図的に内容を抹消する行為にあたるため

2021/06/01 04:45

投稿

fegeryh
fegeryh

スコア10

test CHANGED
File without changes
test CHANGED
@@ -1 +1,413 @@
1
+ ```ここに言語を入力
2
+
3
+ コード
4
+
5
+ #include <limits.h>
6
+
7
+ #include <stdio.h>
8
+
9
+ #include <string.h>
10
+
11
+ #include <stdlib.h>
12
+
13
+ #define MAX 10
14
+
15
+ #define NAME_LEN 20
16
+
17
+ #define String_Max 80
18
+
19
+ /*--- 身体データ型 ---*/
20
+
21
+ typedef struct {
22
+
23
+ int height; /* 身長 */
24
+
25
+ double vision; /* 視力 */
26
+
27
+ } Body;
28
+
29
+ /*--- 身体検査データ型 ---*/
30
+
31
+ typedef struct {
32
+
33
+ char *name; /* 氏名 */
34
+
35
+ Body body; /* 身体データ型 ---*/
36
+
37
+ } PhysCheck;
38
+
39
+ /*--- int型キューを実現する構造体 ---*/
40
+
41
+ typedef struct {
42
+
43
+ int max; /* キューの容量 */
44
+
45
+ int num; /* 現在の要素*/
46
+
47
+ int front; /* 先頭要素カーソル*/
48
+
49
+ int rear; /* 末尾要素のカーソル*/
50
+
51
+ int **que; /* キュー本体*/
52
+
53
+ } IntQueue;
54
+
55
+ /*--- 身体検査データ型スタックを実現する構造体 ---*/
56
+
57
+ typedef struct {
58
+
59
+ int max; /* スキューの容量 */
60
+
61
+ int ptr; /* 現在の要素*/
62
+
63
+ int *que; /* スキュー本体*/
64
+
65
+ } ArraylnQueue;
66
+
67
+ /*--- Boyer-Moore 法による文字列探索 ---*/
68
+
69
+ char *bm_match(char *pat, char *txt) {
70
+
71
+ char *pt; /* txt をなぞるカーソル */
72
+
73
+ char *pp; /* pat をなぞるカーソル */
74
+
75
+ int txt_len = strlen(txt); /* txt の文字数 */
76
+
77
+ int pat_len = strlen(pat); /* pat の文字数 */
78
+
79
+ int skip[UCHAR_MAX + 1]; /* スキップテーブル */
80
+
81
+ int i;
82
+
83
+ for (i = 0; i <= UCHAR_MAX; i++) {
84
+
85
+ skip[i] = pat_len;
86
+
87
+ }
88
+
89
+ for (pp = pat; *pp != '\0'; pp++) {
90
+
91
+ skip[*pp] = strlen(pp) - 1;
92
+
93
+ }
94
+
95
+ skip[*(pp - 1)] =
96
+
97
+ pat_len; /* パターンの最後文字の移動距離はパターンの文字数 */
98
+
99
+ pt = txt + pat_len - 1; /* pat の末尾と比較する txt の文字を決定 */
100
+
101
+ while (
102
+
103
+ pt <
104
+
105
+ txt + txt_len) { /* txt の比較する文字の位置が txt の末尾を越えるまで */
106
+
107
+ pp = pat + pat_len - 1; /* pat の最後の文字に着目 */
108
+
109
+ while (*pt == *pp) {
110
+
111
+ if (pp == pat)
112
+
113
+ return pt; /* 一致した文字がパターンの最初の文字になれば終了 */
114
+
115
+ pp--;
116
+
117
+ pt--;
118
+
119
+ }
120
+
1
- Yajdhsgvzkhgqidigwhishwjusjsshgyfeihh if vsjaiyxhdueywidh
121
+ pt += (skip[*pt] > strlen(pp)) ? skip[*pt] : strlen(pp);
122
+
123
+ }
124
+
125
+ return NULL;
126
+
127
+ }
128
+
129
+ /*---キューの初期化 ---*/
130
+
131
+ int Initialize(IntQueue *q, int max){
132
+
133
+ q->num = q->front = q->rear = 0;
134
+
135
+ if((q->que=calloc(max,sizeof(int)))==NULL){
136
+
137
+ q->max = 0; /* 配列の確保に失敗 */
138
+
139
+ return -1;
140
+
141
+ }
142
+
143
+ q->max = max;
144
+
145
+ return 0;
146
+
147
+ }
148
+
149
+ /*--- キューの後始末 ---*/
150
+
151
+ void Terminate(IntQueue *s)
152
+
153
+ {
154
+
155
+ if (s->que != NULL)
156
+
157
+ free(s->que); /* 配列の開放 */
158
+
159
+ s->max= s->num= s->front= s->rear= 0;
160
+
161
+ }
162
+
163
+ /*--- キューにデータをエンキュー ---*/
164
+
165
+ int Enque(IntQueue *q, int x){
166
+
167
+ if (q->num >= q->max)
168
+
169
+ return -1; /* キューは満杯 */
170
+
171
+ else {
172
+
173
+ q->num++;
174
+
175
+ q->que[q->rear++] = x;
176
+
177
+ if (q->rear == q->max) q->rear = 0;
178
+
179
+ return 0;
180
+
181
+ }
182
+
183
+ }
184
+
185
+ /*--- キューからデータをデキュー---*/
186
+
187
+ int Deque(IntQueue *q, int *x){
188
+
189
+ if (q->num <= 0)/* キューは空 */
190
+
191
+ return -1;
192
+
193
+ else {
194
+
195
+ q->num--;
196
+
197
+ *x = q->que[q->front++];
198
+
199
+ if (q->front == q->max) q->front = 0;
200
+
201
+ return 0;
202
+
203
+ }
204
+
205
+ }
206
+
207
+ /*--- キューからデータをピーク---*/
208
+
209
+ int Peek(const IntQueue *q, int *x)
210
+
211
+ {
212
+
213
+ if (q->num <= 0)
214
+
215
+ return -1;
216
+
217
+ *x = q->que[q->front];
218
+
219
+ return 0;
220
+
221
+ }
222
+
223
+ /*--- キューの容量 ---*/
224
+
225
+ int Capacity(const ArraylnQueue *q) {
226
+
227
+ return q->max;
228
+
229
+ }
230
+
231
+ /*--- スタックに積まれているデータ数 ---*/ int Size(const ArraylnQueue *q) {
232
+
233
+ return q->ptr;
234
+
235
+ }
236
+
237
+ /*--- 身体検査データを1つ表示 ---*/
238
+
239
+ void OneDataPrint(const PhysCheck *x) {
240
+
241
+ printf("%-18.18s%4d%5.1f\n", x->name, x->body.height, x->body.vision);
242
+
243
+ }
244
+
245
+ /*--- キューの全データの表示 ---*/
246
+
247
+ void Print(const IntQueue *q)
248
+
249
+ {
250
+
251
+ int i;
252
+
253
+ for(i = 0; i < q->num; i++)
254
+
255
+ printf("%d",q->que[(i+q->front)%q->max]);
256
+
257
+ putchar('\n');
258
+
259
+ }
260
+
261
+ /*--- スタックのデータにあるパターンの表示とその数を数える ---*/
262
+
263
+ int Search(ArraylnQueue *q, char *name) {
264
+
265
+ int i, last, num = 0;
266
+
267
+ char *txt, *pat = name;
268
+
269
+ for (i = 0; i < q->ptr; i++) { /* 底から頂上へ */
270
+
271
+ txt = q->que[i]->name;                   **エラー箇所**
272
+
273
+ while ((txt = bm_match(pat, txt)) != NULL) {
274
+
275
+ num++;
276
+
277
+ txt++;
278
+
279
+ last = i;
280
+
281
+ }
282
+
283
+ }
284
+
285
+ if (num > 0) OneDataPrint(q->que[last]);
286
+
287
+ return num;
288
+
289
+ }
290
+
291
+ int main(void) {
292
+
293
+ IntQueue que;
294
+
295
+
296
+
297
+ if (Initialize(&que, 64) == -1) {
298
+
299
+ puts("キューの生成に失敗しました.\n");
300
+
301
+ return 1;
302
+
303
+ }
304
+
305
+ while (1) {
306
+
307
+ int menu, num;
308
+
309
+ PhysCheck x;
310
+
311
+ char name[String_Max];
312
+
313
+ printf("現在のデータ数:%d/%d\n", Size(&que), Capacity(&que));
314
+
315
+ printf("(1) エンキュー (2) デキュー (3) ピーク (4) 表示 (5)探索 (0) 終了:");
316
+
317
+ scanf("%d", &menu);
318
+
319
+ if (menu == 0) break;
320
+
321
+ switch (menu) {
322
+
323
+ case 1: /* エンキュー */
324
+
325
+ printf("名前: ");
326
+
327
+ scanf("%s", name);
328
+
329
+ x.name = name;
330
+
331
+ printf("身長: ");
332
+
333
+ scanf("%d", &(x.body.height));
334
+
335
+ printf("視力: ");
336
+
337
+ scanf("%lf", &(x.body.vision));
338
+
339
+ if (Enque(&que, x) == -1)
340
+
341
+ puts("\a エラー:エンキューに失敗しました。\n");
342
+
343
+ break;
344
+
345
+ case 2: /* デキュー */
346
+
347
+ if (Deque(&s, &x) == -1)
348
+
349
+ puts("\a エラー:デキューに失敗しました。\n");
350
+
351
+ else {
352
+
353
+ printf("デキューしたデータは,");
354
+
355
+ OneDataPrint(&x);
356
+
357
+ }
358
+
359
+ break;
360
+
361
+ case 3: /* ピーク */
362
+
363
+ if (Peek(&que, &x) == -1)
364
+
365
+ puts("\a エラー:ピークに失敗しました。\n");
366
+
367
+ else {
368
+
369
+ printf("ピークしたデータは,");
370
+
371
+ OneDataPrint(&x);
372
+
373
+ }
374
+
375
+ break;
376
+
377
+ case 4: /* 表示 */
378
+
379
+ Print(&que);
380
+
381
+ break;
382
+
383
+ case 5: /* 検索 */
384
+
385
+ printf("探す名前:");
386
+
387
+ scanf("%s", name);
388
+
389
+ if ((num = Search(&que, name)) > 0) {
390
+
391
+ printf("名前に含まれるパターン数は,%d 個です,\n", num);
392
+
393
+ } else {
394
+
395
+ puts("\a エラー:パターンは存在しません。\n ");
396
+
397
+ }
398
+
399
+ break;
400
+
401
+ }
402
+
403
+ }
404
+
405
+ Terminate(&que);
406
+
407
+ return 0;
408
+
409
+ }
410
+
411
+ ```
412
+
413
+ 動的スタックのプログラムを,動的なキューに変更したプログラムを書きたいのですがエラーでてしまい解決ができません。

1

2021/06/01 04:45

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -1,423 +1 @@
1
- ```ここに言語を入力
2
-
3
- コード
4
-
5
- #include <limits.h>
6
-
7
- #include <stdio.h>
8
-
9
- #include <string.h>
10
-
11
- #include <stdlib.h>
12
-
13
- #define MAX 10
14
-
15
- #define NAME_LEN 20
16
-
17
- #define String_Max 80
18
-
19
-
20
-
21
- /*--- 身体データ型 ---*/
22
-
23
- typedef struct {
24
-
25
- int height; /* 身長 */
26
-
27
- double vision; /* 視力 */
28
-
29
- } Body;
30
-
31
- /*--- 身体検査データ型 ---*/
32
-
33
- typedef struct {
34
-
35
- char *name; /* 氏名 */
36
-
37
- Body body; /* 身体データ型 ---*/
38
-
39
- } PhysCheck;
40
-
41
- /*--- int型キューを実現する構造体 ---*/
42
-
43
- typedef struct {
44
-
45
- int max; /* キューの容量 */
46
-
47
- int num; /* 現在の要素*/
48
-
49
- int front; /* 先頭要素カーソル*/
50
-
51
- int rear; /* 末尾要素のカーソル*/
52
-
53
- int **que; /* キュー本体*/
54
-
55
- } IntQueue;
56
-
57
- /*--- 身体検査データ型スタックを実現する構造体 ---*/
58
-
59
- typedef struct {
60
-
61
- int max; /* スキューの容量 */
62
-
63
- int ptr; /* 現在の要素*/
64
-
65
- int *que; /* スキュー本体*/
66
-
67
- } ArraylnQueue;
68
-
69
- /*--- Boyer-Moore 法による文字列探索 ---*/
70
-
71
- char *bm_match(char *pat, char *txt) {
72
-
73
- char *pt; /* txt をなぞるカーソル */
74
-
75
- char *pp; /* pat をなぞるカーソル */
76
-
77
- int txt_len = strlen(txt); /* txt の文字数 */
78
-
79
- int pat_len = strlen(pat); /* pat の文字数 */
80
-
81
- int skip[UCHAR_MAX + 1]; /* スキップテーブル */
82
-
83
- int i;
84
-
85
- for (i = 0; i <= UCHAR_MAX; i++) {
86
-
87
- skip[i] = pat_len;
88
-
89
- }
90
-
91
- for (pp = pat; *pp != '\0'; pp++) {
92
-
93
- skip[*pp] = strlen(pp) - 1;
94
-
95
- }
96
-
97
- skip[*(pp - 1)] =
98
-
99
- pat_len; /* パターンの最後文字の移動距離はパターンの文字数 */
100
-
101
- pt = txt + pat_len - 1; /* pat の末尾と比較する txt の文字を決定 */
102
-
103
- while (
104
-
105
- pt <
106
-
107
- txt + txt_len) { /* txt の比較する文字の位置が txt の末尾を越えるまで */
108
-
109
- pp = pat + pat_len - 1; /* pat の最後の文字に着目 */
110
-
111
- while (*pt == *pp) {
112
-
113
- if (pp == pat)
114
-
115
- return pt; /* 一致した文字がパターンの最初の文字になれば終了 */
116
-
117
- pp--;
118
-
119
- pt--;
120
-
121
- }
122
-
123
- pt += (skip[*pt] > strlen(pp)) ? skip[*pt] : strlen(pp);
1
+ Yajdhsgvzkhgqidigwhishwjusjsshgyfeihh if vsjaiyxhdueywidh
124
-
125
- }
126
-
127
- return NULL;
128
-
129
- }
130
-
131
- /*---キューの初期化 ---*/
132
-
133
- int Initialize(IntQueue *q, int max){
134
-
135
- q->num = q->front = q->rear = 0;
136
-
137
- if((q->que=calloc(max,sizeof(int)))==NULL){
138
-
139
- q->max = 0; /* 配列の確保に失敗 */
140
-
141
- return -1;
142
-
143
- }
144
-
145
- q->max = max;
146
-
147
- return 0;
148
-
149
- }
150
-
151
- /*--- キューの後始末 ---*/
152
-
153
- void Terminate(IntQueue *s)
154
-
155
- {
156
-
157
- if (s->que != NULL)
158
-
159
- free(s->que); /* 配列の開放 */
160
-
161
- s->max= s->num= s->front= s->rear= 0;
162
-
163
- }
164
-
165
-
166
-
167
- /*--- キューにデータをエンキュー ---*/
168
-
169
- int Enque(IntQueue *q, int x){
170
-
171
- if (q->num >= q->max)
172
-
173
- return -1; /* キューは満杯 */
174
-
175
- else {
176
-
177
- q->num++;
178
-
179
- q->que[q->rear++] = x;
180
-
181
- if (q->rear == q->max) q->rear = 0;
182
-
183
- return 0;
184
-
185
- }
186
-
187
- }
188
-
189
- /*--- キューからデータをデキュー---*/
190
-
191
- int Deque(IntQueue *q, int *x){
192
-
193
- if (q->num <= 0)/* キューは空 */
194
-
195
- return -1;
196
-
197
- else {
198
-
199
- q->num--;
200
-
201
- *x = q->que[q->front++];
202
-
203
- if (q->front == q->max) q->front = 0;
204
-
205
- return 0;
206
-
207
- }
208
-
209
- }
210
-
211
- /*--- キューからデータをピーク---*/
212
-
213
- int Peek(const IntQueue *q, int *x)
214
-
215
- {
216
-
217
- if (q->num <= 0)
218
-
219
- return -1;
220
-
221
- *x = q->que[q->front];
222
-
223
- return 0;
224
-
225
- }
226
-
227
- /*--- キューの容量 ---*/
228
-
229
- int Capacity(const ArraylnQueue *q) {
230
-
231
- return q->max;
232
-
233
- }
234
-
235
- /*--- スタックに積まれているデータ数 ---*/ int Size(const ArraylnQueue *q) {
236
-
237
- return q->ptr;
238
-
239
- }
240
-
241
- /*--- 身体検査データを1つ表示 ---*/
242
-
243
- void OneDataPrint(const PhysCheck *x) {
244
-
245
- printf("%-18.18s%4d%5.1f\n", x->name, x->body.height, x->body.vision);
246
-
247
- }
248
-
249
- /*--- キューの全データの表示 ---*/
250
-
251
- void Print(const IntQueue *q)
252
-
253
- {
254
-
255
- int i;
256
-
257
- for(i = 0; i < q->num; i++)
258
-
259
- printf("%d",q->que[(i+q->front)%q->max]);
260
-
261
- putchar('\n');
262
-
263
- }
264
-
265
-
266
-
267
- /*--- スタックのデータにあるパターンの表示とその数を数える ---*/
268
-
269
- int Search(ArraylnQueue *q, char *name) {
270
-
271
- int i, last, num = 0;
272
-
273
- char *txt, *pat = name;
274
-
275
- for (i = 0; i < q->ptr; i++) { /* 底から頂上へ */
276
-
277
- txt = q->que[i]->name;                   **エラー箇所**
278
-
279
- while ((txt = bm_match(pat, txt)) != NULL) {
280
-
281
- num++;
282
-
283
- txt++;
284
-
285
- last = i;
286
-
287
- }
288
-
289
- }
290
-
291
- if (num > 0) OneDataPrint(q->que[last]);
292
-
293
- return num;
294
-
295
- }
296
-
297
- int main(void) {
298
-
299
- IntQueue que;
300
-
301
-
302
-
303
- if (Initialize(&que, 64) == -1) {
304
-
305
- puts("キューの生成に失敗しました.\n");
306
-
307
- return 1;
308
-
309
- }
310
-
311
-
312
-
313
- while (1) {
314
-
315
- int menu, num;
316
-
317
- PhysCheck x;
318
-
319
- char name[String_Max];
320
-
321
-
322
-
323
- printf("現在のデータ数:%d/%d\n", Size(&que), Capacity(&que));
324
-
325
- printf("(1) エンキュー (2) デキュー (3) ピーク (4) 表示 (5)探索 (0) 終了:");
326
-
327
- scanf("%d", &menu);
328
-
329
- if (menu == 0) break;
330
-
331
- switch (menu) {
332
-
333
- case 1: /* エンキュー */
334
-
335
- printf("名前: ");
336
-
337
- scanf("%s", name);
338
-
339
- x.name = name;
340
-
341
- printf("身長: ");
342
-
343
- scanf("%d", &(x.body.height));
344
-
345
- printf("視力: ");
346
-
347
- scanf("%lf", &(x.body.vision));
348
-
349
- if (Enque(&que, x) == -1)
350
-
351
- puts("\a エラー:エンキューに失敗しました。\n");
352
-
353
- break;
354
-
355
- case 2: /* デキュー */
356
-
357
- if (Deque(&s, &x) == -1)
358
-
359
- puts("\a エラー:デキューに失敗しました。\n");
360
-
361
- else {
362
-
363
- printf("デキューしたデータは,");
364
-
365
- OneDataPrint(&x);
366
-
367
- }
368
-
369
- break;
370
-
371
- case 3: /* ピーク */
372
-
373
- if (Peek(&que, &x) == -1)
374
-
375
- puts("\a エラー:ピークに失敗しました。\n");
376
-
377
- else {
378
-
379
- printf("ピークしたデータは,");
380
-
381
- OneDataPrint(&x);
382
-
383
- }
384
-
385
- break;
386
-
387
- case 4: /* 表示 */
388
-
389
- Print(&que);
390
-
391
- break;
392
-
393
- case 5: /* 検索 */
394
-
395
- printf("探す名前:");
396
-
397
- scanf("%s", name);
398
-
399
- if ((num = Search(&que, name)) > 0) {
400
-
401
- printf("名前に含まれるパターン数は,%d 個です,\n", num);
402
-
403
- } else {
404
-
405
- puts("\a エラー:パターンは存在しません。\n ");
406
-
407
- }
408
-
409
- break;
410
-
411
- }
412
-
413
- }
414
-
415
- Terminate(&que);
416
-
417
- return 0;
418
-
419
- }
420
-
421
- ```
422
-
423
- 動的スタックのプログラムを,動的なキューに変更したプログラムを書きたいのですがエラーでてしまい解決ができません。