fork(32) download
  1. /*
  2. 988 名前:デフォルトの名無しさん [sage]: 2012/02/04(土) 20:06:33.75
  3. [1] 授業単元:C言語
  4. [2] 問題文 初期状態をファイルより読み込みライフゲームを実行しなさい
  5. [3] 環境
  6.  [3.1] OS: Windows7
  7.  [3.2] コンパイラ名とバージョン: VisualStudio2010
  8.  [3.3] 言語: C言語
  9. [4] 期限: 2/5
  10. [5] その他の制限: ライフゲームの作成です。セルの生死を判定するための条件付けをうまく記述することができません。
  11. 他にもツッコミどころ満載ですがどなたか指摘していただけると助かります。お願いします
  12. http://i...content-available-to-author-only...e.com/LFPu6
  13. */
  14.  
  15. #include <stdio.h>
  16. #include <stdlib.h>
  17. #include <unistd.h>
  18.  
  19. #define FieldSize 20
  20. #define TimeMax 20
  21.  
  22. #define ALIVE " O "
  23. #define DEAD " . "
  24.  
  25. /*フィールドの初期化 (ファイルの読み込み)*/
  26. void
  27. init_field(int field[FieldSize][FieldSize], char *fname)
  28. {
  29. int i, j;
  30. FILE *fp;
  31.  
  32. fp = fopen(fname, "r");
  33. if (fp == NULL) {
  34. printf("init_field(): Cannot open \"%s\"\n",fname);
  35. exit(1);
  36. }
  37.  
  38. for (i=0;i<FieldSize;i++) {
  39. for (j=0;j<FieldSize;j++) {
  40. fscanf(fp,"%d ", &field[i][j]);
  41. }
  42. }
  43. fclose(fp);
  44. }
  45.  
  46. int count(int i, int j, int field[FieldSize][FieldSize]){
  47. int move_horizontal, move_vertical;
  48. int sum;
  49.  
  50. sum=0;
  51. for(move_vertical=-1;move_vertical<=1;move_vertical++){
  52. for(move_horizontal=-1;move_horizontal<=1;move_horizontal++){
  53. if (move_vertical == 0 && move_horizontal == 0)
  54. continue;
  55. sum += field[i + move_vertical][j + move_horizontal];
  56. }
  57. }
  58. return sum;
  59. }
  60.  
  61. void update_field(int field[FieldSize][FieldSize])
  62. {
  63. int i, j;
  64. int around = 0;
  65. int new_field[FieldSize][FieldSize];
  66.  
  67. printf("field = %p in update_field()\n", field);
  68.  
  69. memset(new_field, 0, sizeof(new_field));
  70.  
  71. for(i=0;i<FieldSize;i++){
  72. for(j=0;j<FieldSize;j++){
  73. if (i == 0 || j == 0 ||
  74. i == FieldSize - 1 ||
  75. j == FieldSize - 1)
  76. continue;
  77.  
  78. around = count(i, j, field);
  79. if (field[i][j] == 0){
  80. // 死んでいる状態
  81. if (around == 3) {
  82. // 誕生
  83. new_field[i][j] = 1;
  84. }
  85. }
  86. else{
  87. // 生きている状態
  88. if (around == 2 || around == 3){
  89. // 生存
  90. new_field[i][j] = 1;
  91. }
  92. else if (around <= 1) {
  93. // 過疎
  94. new_field[i][j] = 0;
  95. }
  96. else if (around >= 4) {
  97. // 過密
  98. new_field[i][j] = 0;
  99. }
  100. }
  101. }
  102.  
  103. }
  104.  
  105. /*
  106.   for(i = 0;i < 20;i++){
  107.   for(j = 0;j < 20;j++){
  108.   field[i][j] = new_field[i][j];
  109.   }
  110.   }
  111.   */
  112. memcpy(field, new_field, sizeof(new_field));
  113. }
  114.  
  115.  
  116. void
  117. display(int field[FieldSize][FieldSize])
  118. {
  119. int i,j;
  120.  
  121. printf(" ");
  122. for(j=0;j<20;j++)
  123. printf("%3d", j);
  124. printf("\n");
  125.  
  126. for(i=0;i<20;i++){
  127. printf("%3d ", i);
  128. for(j=0;j<20;j++){
  129. if (field[i][j] == 0) {
  130. printf("%s", DEAD);
  131. }
  132. else{
  133. printf("%s", ALIVE);
  134. }
  135. }
  136. printf("\n");
  137. }
  138. }
  139.  
  140. int main(int argc, char *argv[])
  141. {
  142. int t;
  143. int field[FieldSize][FieldSize];
  144.  
  145. if(argc!=2){
  146. printf("実行方法 : ./a.out 初期状態のファイル\n");
  147. }
  148.  
  149. //system("clear");
  150. printf("field = %p in main()\n", field);
  151. init_field(field, argv[1]);
  152. printf("field =\n");
  153. display(field);
  154. printf("\n");
  155.  
  156. //sleep(1);
  157. system("clear");
  158.  
  159. for(t=0;t<TimeMax;t++){
  160. printf("t = %d\n", t);
  161. update_field(field);
  162. display(field);
  163. sleep(1);
  164. system("clear");
  165. }
  166.  
  167. return 0;
  168. }
Runtime error #stdin #stdout 0.01s 1852KB
stdin
Standard input is empty
stdout
実行方法 : ./a.out 初期状態のファイル
field = 0xbf988be0 in main()
init_field(): Cannot open "(null)"