fork download
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #include <limits.h>
  5. #define line 100
  6.  
  7.  
  8. typedef struct{
  9. double weight;
  10. double eyesight;
  11. int age;
  12. int height;
  13. } Data;
  14.  
  15. typedef struct{
  16. char *name;
  17. Data data;
  18. } sinntaisokutei ;
  19.  
  20. typedef struct{
  21. int max;
  22. int pos;
  23. sinntaisokutei **stack;
  24. } sinntaisokuteistack;
  25.  
  26.  
  27. int Initialize(sinntaisokuteistack *s, int max){
  28. s->pos = 0;
  29. if ((s->stack = calloc(max, sizeof(sinntaisokutei *))) == NULL) {
  30. s->max = 0;
  31. return -1;
  32. }
  33.  
  34. s->max = max;
  35. return 0;
  36. }
  37.  
  38. void Terminate(sinntaisokuteistack *s){
  39. if (s->stack != NULL){
  40. while( --s->pos >= 0)
  41. free(s->stack[s->pos]);
  42. free(s->stack);
  43. }
  44. s->max = s->pos = 0;
  45. }
  46.  
  47. int Push(sinntaisokuteistack *s, sinntaisokutei *x){
  48. if (s->pos >= s->max) {
  49. return -1;
  50. }
  51. if ((s->stack[s->pos] = calloc(1, sizeof(sinntaisokutei))) == NULL) {
  52. return -1;
  53. }
  54. memcpy(s->stack[s->pos++],x,sizeof(sinntaisokutei));
  55. return 0;
  56. }
  57.  
  58. int Pop(sinntaisokuteistack *s, sinntaisokutei *x){
  59. if (s->pos <= 0){
  60. return -1;
  61. }
  62. s->pos--;
  63. memcpy(x,s->stack[s->pos],sizeof(sinntaisokutei));
  64. free(s->stack[s->pos]);
  65. return 0;
  66. }
  67.  
  68. int Peek(sinntaisokuteistack *s, sinntaisokutei *x){
  69. if (s->pos <= 0) {
  70. return -1;
  71. }
  72. memcpy(x,s->stack[s->pos-1],sizeof(sinntaisokutei));
  73. return 0;
  74. }
  75.  
  76. int Maximumnumber(const sinntaisokuteistack *s){
  77. return s->max;
  78. }
  79.  
  80. int Registrationnumber(const sinntaisokuteistack *s){
  81. return s->pos;
  82. }
  83.  
  84.  
  85. void Print2(const sinntaisokutei *x){
  86. printf("%-18.18s%.2lf%5.4d%5.4d%.2lf\n", x->name, x->data.weight, x->data.age, x->data.height, x->data.eyesight);
  87. }
  88.  
  89.  
  90. void Print(const sinntaisokuteistack *s){
  91. int i;
  92. for(i = 0; i < s->pos; i++) {
  93. Print2(s->stack[i]);
  94. }
  95. putchar('\n');
  96. }
  97.  
  98.  
  99. int main(void){
  100. sinntaisokuteistack s;
  101. int max;
  102. printf("何人登録しますか");
  103. scanf("%d", &max);
  104. if (Initialize(&s, max)==-1){
  105. puts("登録できません.\n");
  106. return 1;
  107. }
  108.  
  109. while (1) {
  110. int select;
  111. sinntaisokutei x[line];
  112. printf("現在のデータ数:%d/%d\n",Registrationnumber(&s), Maximumnumber(&s));
  113. printf("(1)登録 (2)削除 (3)次に削除されるデータ (4)全データ表\示 (0)終了:");
  114. scanf("%d", &select);
  115. if (select == 0) break;
  116.  
  117. switch (select) {
  118. case 1:
  119. x->name=malloc(1024);
  120.  
  121. printf("名前: "); scanf("%s", x->name);
  122. printf("体重: "); scanf("%lf", &(x->data.weight));
  123. printf("年齢: "); scanf("%d", &(x->data.age));
  124. printf("視力: "); scanf("%lf", &(x->data.eyesight));
  125. printf("身長: "); scanf("%d", &(x->data.height));
  126. if (Push(&s, x) == -1)
  127. puts("\aエラー:登録できませんでした.\n");
  128. break;
  129. case 2:
  130. if (Pop(&s, x) == -1)
  131. puts("\aエラー:削除出来ませんでした.\n");
  132. else{
  133. printf("削除したしたデータは");
  134. Print2(x);
  135. }
  136. break;
  137. case 3:
  138. if (Peek(&s, x) == -1)
  139. puts("\aエラー:表\示できませんでした.\n");
  140. else{
  141. printf("次に削除されるデータは%s", x);
  142. }
  143. break;
  144. case 4:
  145. Print(&s);
  146. break;
  147. }
  148. }
  149. Terminate(&s);
  150. return 0;
  151. }
Success #stdin #stdout 0s 2148KB
stdin
10
1
tanaka 1 1 1 1
yamamoto 2 2 2 2
4
0


stdout
何人登録しますか現在のデータ数:0/10
(1)登録 (2)削除 (3)次に削除されるデータ (4)全データ表示 (0)終了:名前: 体重: 年齢: 視力: 身長: 現在のデータ数:1/10
(1)登録 (2)削除 (3)次に削除されるデータ (4)全データ表示 (0)終了:名前: 体重: 年齢: 視力: 身長: 現在のデータ数:2/10
(1)登録 (2)削除 (3)次に削除されるデータ (4)全データ表示 (0)終了:tanaka            1.00 0001 00011.00
yamamoto          2.00 0002 00022.00

現在のデータ数:2/10
(1)登録 (2)削除 (3)次に削除されるデータ (4)全データ表示 (0)終了: