質問編集履歴

5

追記

2020/06/10 08:45

投稿

junnnnchan
junnnnchan

スコア26

test CHANGED
File without changes
test CHANGED
@@ -293,3 +293,307 @@
293
293
  プッシュ、サーチが出来るように実装したいです
294
294
 
295
295
  char *nameは変えずにコード作成したいです。
296
+
297
+
298
+
299
+ <追記>
300
+
301
+ ```
302
+
303
+ #include <stdio.h>
304
+
305
+ #include <string.h>
306
+
307
+ #include <stdlib.h>
308
+
309
+ /*--- int 型スタックを実現する構造体 ---*/
310
+
311
+
312
+
313
+ typedef struct{
314
+
315
+ double vision; /* 視力 */
316
+
317
+ int height; /* 身長 */
318
+
319
+ } Body ;
320
+
321
+ /*--- 身体検査データ型 ---*/
322
+
323
+ typedef struct{
324
+
325
+ Body body; /* 身体データ型 ---*/
326
+
327
+ char *name; /* 氏名 */
328
+
329
+ } PhysCheck ;
330
+
331
+ typedef struct {
332
+
333
+ int max; /* スタックの容量 */
334
+
335
+ int ptr; /* スタックポインタ */
336
+
337
+ PhysCheck **stk; /* スタック本体*/
338
+
339
+ } PhysCheckStack;
340
+
341
+
342
+
343
+ int Search(PhysCheckStack *s , PhysCheck *x){
344
+
345
+ for(int i = s->ptr-1 ; i >= 0 ; i --){
346
+
347
+ if(strncmp(s->stk[i]->name, x->name ,strlen(x->name)) == 0){//strncmp先頭n文字を比較
348
+
349
+ return i;
350
+
351
+ }
352
+
353
+ }
354
+
355
+ return -1;
356
+
357
+ }
358
+
359
+
360
+
361
+ /*--- スタックの初期化 ---*/
362
+
363
+ int Initialize(PhysCheckStack *s, int max){
364
+
365
+ s->ptr = 0;
366
+
367
+ if ((s->stk = calloc(max, sizeof(PhysCheck *))) == NULL) {
368
+
369
+ s->max = 0; /* char* の配列の確保に失敗 */
370
+
371
+ return -1;
372
+
373
+ }
374
+
375
+ s->max = max;
376
+
377
+ return 0;
378
+
379
+ }
380
+
381
+ /*--- スタックにデータをプッシュ ---*/
382
+
383
+ int Push(PhysCheckStack *s, PhysCheck *x){
384
+
385
+ if (s->ptr >= s->max) return -1; /* スタック満杯 */
386
+
387
+ if ((s->stk[s->ptr] = calloc(strlen(x->name)+1, sizeof(PhysCheck *))) == NULL)
388
+
389
+ /* データをコピーするための動的な文字列保存用配列を確保することに失敗 */
390
+
391
+ return -1;
392
+
393
+ s->stk[s->ptr]->name = calloc(strlen(x->name)+1, sizeof(char));
394
+
395
+ strcpy(s->stk[s->ptr]->name,x->name);
396
+
397
+ s->stk[s->ptr]->body.vision = x->body.vision;
398
+
399
+ s->stk[s->ptr]->body.height = x->body.height;
400
+
401
+ s->ptr++;
402
+
403
+ return 0;
404
+
405
+ }
406
+
407
+ /*--- スタックからデータをポップ ---*/
408
+
409
+ int Pop(PhysCheckStack *s, PhysCheck *x){
410
+
411
+ if (s->ptr <= 0) return -1; /* スタックは空 */
412
+
413
+ s->ptr--;
414
+
415
+ strcpy(x->name,s->stk[s->ptr]->name);
416
+
417
+ x->body.vision = s->stk[s->ptr]->body.vision;
418
+
419
+ x->body.height = s->stk[s->ptr]->body.height;
420
+
421
+ free(s->stk[s->ptr]->name);
422
+
423
+ return (0);
424
+
425
+ }
426
+
427
+ /*--- スタックからデータをピーク ---*/
428
+
429
+ int Peek(PhysCheckStack *s, PhysCheck *x){
430
+
431
+ if (s->ptr <= 0) return -1;
432
+
433
+ strcpy(x->name,s->stk[s->ptr-1]->name);
434
+
435
+ x->body.vision = s->stk[s->ptr-1]->body.vision;
436
+
437
+ x->body.height = s->stk[s->ptr-1]->body.height;
438
+
439
+ return 0;
440
+
441
+ }
442
+
443
+ /*--- スタックの容量 ---*/
444
+
445
+ int Capacity(const PhysCheckStack *s){
446
+
447
+ return s->max;
448
+
449
+ }
450
+
451
+ /*--- スタックに積まれているデータ数 ---*/
452
+
453
+ int Size(const PhysCheckStack *s){
454
+
455
+ return s->ptr;
456
+
457
+ }
458
+
459
+ /*--- スタックの全データの表示 ---*/
460
+
461
+ void Print(const PhysCheckStack *s){
462
+
463
+ int i;
464
+
465
+
466
+
467
+ for(i = 0; i < s->ptr; i++)
468
+
469
+ printf("%s %f %d\n", s->stk[i]->name,s->stk[i]->body.vision,s->stk[i]->body.height);
470
+
471
+ putchar('\n');
472
+
473
+ }
474
+
475
+ void Terminate(PhysCheckStack *s){
476
+
477
+ if(s->stk != NULL)
478
+
479
+ free(s->stk);
480
+
481
+ s->max = s->ptr = 0;
482
+
483
+ }
484
+
485
+ int main(void){
486
+
487
+ PhysCheckStack s;
488
+
489
+ PhysCheck x;
490
+
491
+ int max;
492
+
493
+ char y[100];
494
+
495
+ printf("スタックの大きさを入力してください");
496
+
497
+ scanf("%d", &max);
498
+
499
+ if (Initialize(&s, max)==-1){
500
+
501
+ puts("スタックの生成に失敗しました.\n");
502
+
503
+ }
504
+
505
+ while (1) {
506
+
507
+ int menu;
508
+
509
+ printf("現在のデータ数:%d/%d\n",Size(&s), Capacity(&s));
510
+
511
+ printf("(1) プッシュ (2) ポップ (3) ピーク (4) 表示 (5) 探索 (0) 終了:");
512
+
513
+ scanf("%d", &menu);
514
+
515
+ if (menu == 0) break;
516
+
517
+ switch (menu) {
518
+
519
+ case 1: /* プッシュ */
520
+
521
+ printf("データ:");
522
+
523
+ scanf("%d", &x.body.height);
524
+
525
+ scanf("%s",y);
526
+
527
+ x.name = (char *)malloc(sizeof(char)*(strlen(y) + 1));
528
+
529
+ strcpy(x.name,y);
530
+
531
+ scanf("%lf",&x.body.vision);
532
+
533
+ if (Push(&s, &x) == -1)
534
+
535
+ puts("\a エラー:プッシュに失敗しました。");
536
+
537
+ break;
538
+
539
+ case 2: /* ポップ */
540
+
541
+ if (Pop(&s, &x) == -1)
542
+
543
+ puts("\a エラー:ポップに失敗しました。");
544
+
545
+ else
546
+
547
+ printf("ポップしたデータは%s %.1f %d です。\n", x.name,x.body.vision,x.body.height);
548
+
549
+ break;
550
+
551
+ case 3: /* ピーク */
552
+
553
+ if (Peek(&s, &x) == -1)
554
+
555
+ puts("\a エラー:ピークに失敗しました。");
556
+
557
+ else
558
+
559
+ printf("ピークしたデータは%s %.1f %d です。\n", x.name,x.body.vision,x.body.height);
560
+
561
+ break;
562
+
563
+ case 4: /* 表示 */
564
+
565
+ Print(&s);
566
+
567
+ break;
568
+
569
+ case 5://探索
570
+
571
+ scanf("%s",x.name);
572
+
573
+ int search = Search(&s,&x);
574
+
575
+ if(search == -1){
576
+
577
+ puts("パターンは存在しません");
578
+
579
+ } else{
580
+
581
+ printf("名前に含まれるパターンは%d個です\n",search);
582
+
583
+ }
584
+
585
+ }
586
+
587
+ }
588
+
589
+ return 0;
590
+
591
+ }
592
+
593
+
594
+
595
+ ```
596
+
597
+ 自分なりにやってみました。おそらくもっと効率の良いプログラムがあると思っていますが、今の自分でできることはしました。
598
+
599
+ ポインタについて勉強しなおします。。。

4

詳しく

2020/06/10 08:45

投稿

junnnnchan
junnnnchan

スコア26

test CHANGED
File without changes
test CHANGED
@@ -291,3 +291,5 @@
291
291
  <質問>
292
292
 
293
293
  プッシュ、サーチが出来るように実装したいです
294
+
295
+ char *nameは変えずにコード作成したいです。

3

修正

2020/06/06 01:57

投稿

junnnnchan
junnnnchan

スコア26

test CHANGED
File without changes
test CHANGED
@@ -1,3 +1,5 @@
1
+ <修正後>
2
+
1
3
  ```
2
4
 
3
5
 

2

修正

2020/06/05 15:02

投稿

junnnnchan
junnnnchan

スコア26

test CHANGED
File without changes
test CHANGED
@@ -1,5 +1,7 @@
1
1
  ```
2
2
 
3
+
4
+
3
5
  #include <stdio.h>
4
6
 
5
7
  #include <string.h>
@@ -26,7 +28,7 @@
26
28
 
27
29
  Body body; /* 身体データ型 ---*/
28
30
 
29
- char *name[20]; /* 氏名 */
31
+ char *name; /* 氏名 */
30
32
 
31
33
  } PhysCheck ;
32
34
 
@@ -48,9 +50,9 @@
48
50
 
49
51
  for(int i = 0 ; i < s->ptr ; i ++){
50
52
 
51
- if(strcmp(x->name[s->ptr],s->stk[i].name[s->ptr]) == 0){//string compare 文字一致したら0返す
53
+ if(strcmp(x->name,s->stk[i].name) == 0){//string compare 文字一致したら0返す
52
-
54
+
53
- printf("%s %f %d\n",s->stk[i].name[s->ptr],s->stk[i].body.vision,s->stk[i].body.height);
55
+ printf("%s %f %d\n",s->stk[i].name,s->stk[i].body.vision,s->stk[i].body.height);
54
56
 
55
57
  count ++;
56
58
 
@@ -70,7 +72,7 @@
70
72
 
71
73
  s->ptr = 0;
72
74
 
73
- if ((s->stk[s->ptr].name[s->ptr] = calloc(max, sizeof(char*))) == NULL) {
75
+ if ((s->stk[s->ptr].name = calloc(max, sizeof(char*))) == NULL) {
74
76
 
75
77
  s->max = 0; /* char* の配列の確保に失敗 */
76
78
 
@@ -90,9 +92,9 @@
90
92
 
91
93
  if (s->ptr >= s->max) return -1; /* スタック満杯 */
92
94
 
93
- strcpy(s->stk[s->ptr].name[s->ptr],x->name[s->ptr]);
95
+ strcpy(s->stk[s->ptr].name,x->name);
94
-
96
+
95
- if ((s->stk[s->ptr].name[s->ptr] = calloc(strlen(x->name[s->ptr])+1, sizeof(char*))) == NULL)
97
+ if ((s->stk[s->ptr].name = calloc(strlen(x->name)+1, sizeof(char*))) == NULL)
96
98
 
97
99
  /* データをコピーするための動的な文字列保存用配列を確保することに失敗 */
98
100
 
@@ -116,13 +118,13 @@
116
118
 
117
119
  s->ptr--;
118
120
 
119
- strcpy(x->name[s->ptr],s->stk[s->ptr].name[s->ptr]);
121
+ strcpy(x->name,s->stk[s->ptr].name);
120
122
 
121
123
  x->body.vision = s->stk[s->ptr].body.vision;
122
124
 
123
125
  x->body.height = s->stk[s->ptr].body.height;
124
126
 
125
- free(s->stk[s->ptr].name[s->ptr]);
127
+ free(s->stk[s->ptr].name);
126
128
 
127
129
  return (0);
128
130
 
@@ -134,7 +136,7 @@
134
136
 
135
137
  if (s->ptr <= 0) return -1;
136
138
 
137
- strcpy(x->name[s->ptr],s->stk[s->ptr-1].name[s->ptr]);
139
+ strcpy(x->name,s->stk[s->ptr-1].name);
138
140
 
139
141
  x->body.vision = s->stk[s->ptr-1].body.vision;
140
142
 
@@ -170,7 +172,7 @@
170
172
 
171
173
  for(i = 0; i < s->ptr; i++)
172
174
 
173
- printf("%s %f %d", s->stk[i].name[s->ptr],s->stk[i].body.vision,s->stk[i].body.height);
175
+ printf("%s %f %d", s->stk[i].name,s->stk[i].body.vision,s->stk[i].body.height);
174
176
 
175
177
  putchar('\n');
176
178
 
@@ -204,7 +206,7 @@
204
206
 
205
207
  scanf("%d", &x.body.height);
206
208
 
207
- scanf("%s",x.name[s.ptr]);
209
+ scanf("%s",x.name);
208
210
 
209
211
  scanf("%lf",&x.body.vision);
210
212
 
@@ -222,7 +224,7 @@
222
224
 
223
225
  else
224
226
 
225
- printf("ポップしたデータは%s %.1f %d です。\n", x.name[s.ptr],x.body.vision,x.body.height);
227
+ printf("ポップしたデータは%s %.1f %d です。\n", x.name,x.body.vision,x.body.height);
226
228
 
227
229
  break;
228
230
 
@@ -234,7 +236,7 @@
234
236
 
235
237
  else
236
238
 
237
- printf("ピークしたデータは%s %.1f %d です。\n", x.name[s.ptr],x.body.vision,x.body.height);
239
+ printf("ピークしたデータは%s %.1f %d です。\n", x.name,x.body.vision,x.body.height);
238
240
 
239
241
  break;
240
242
 
@@ -246,7 +248,7 @@
246
248
 
247
249
  case 5://探索
248
250
 
249
- scanf("%s",x.name[s.ptr]);
251
+ scanf("%s",x.name);
250
252
 
251
253
  int search = Search(&s,&x);
252
254
 
@@ -280,10 +282,10 @@
280
282
 
281
283
  <現在>
282
284
 
283
- 今、最初のメニーで1を選択し、push関数に111と入力したあと、aaaと入力するとSegmentation fault と表示されてしいます。
285
+ 二回プッシュするとSegmentation fault (core dumped) と表示されます。
284
286
 
285
287
 
286
288
 
287
289
  <質問>
288
290
 
289
- <したいこと>で話したログラムにするにはどうしたらよいでしょうか
291
+ ッシュ、サーチが出来よう実装したいで

1

修正

2020/06/05 15:01

投稿

junnnnchan
junnnnchan

スコア26

test CHANGED
File without changes
test CHANGED
@@ -286,4 +286,4 @@
286
286
 
287
287
  <質問>
288
288
 
289
- <したいこと>で話したプログラムにするにはどうしたらよいでしょうか
289
+ <したいこと>で話したプログラムにするにはどうしたらよいでしょうか