fork download
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. #define FieldSize 20
  5. #define TimeMax 20
  6.  
  7. /************************************************************************
  8.   フィールドの初期化 (ファイルの読み込み)
  9. ************************************************************************/
  10. void init_field(int field[FieldSize][FieldSize], char *fname){
  11. int i,j;
  12. FILE *fp;
  13.  
  14. if((fp=fopen(fname,"r"))==NULL){
  15. printf("init_field(): Cannot open \"%s\"\n",fname);
  16. exit(1);
  17. }
  18.  
  19. for(i=0;i<FieldSize;i++){
  20. for(j=0;j<FieldSize;j++){
  21. fscanf(fp,"%d ",&field[i][j]);
  22. }
  23. }
  24. fclose(fp);
  25. }
  26.  
  27. /************************************************************************
  28.   (I,J)の周囲の8マスのうち 状態が1であるものを数える
  29. ************************************************************************/
  30. int count(int I, int J, int field[FieldSize][FieldSize]){
  31. int i,j;
  32. int i_tmp,j_tmp;
  33. int sum;
  34.  
  35. sum=0;
  36. for(i=-1;i<=1;i++){
  37. for(j=-1;j<=1;j++){
  38. /* field[I+i][J+j]の値が1のものを数える
  39.   ただし、I(/J)が 0 や FieldSize-1 のときには注意が必要 */
  40. /*** この部分を自分で書く ***/
  41. sum += ( (i||j)&&
  42. ((i_tmp = I+i) >= 0) && (i_tmp < FieldSize) &&
  43. ((j_tmp = J+j) >= 0) && (j_tmp < FieldSize) &&
  44. (field[i_tmp][j_tmp])
  45. );
  46. }
  47. }
  48. return sum;
  49. }
  50.  
  51. /************************************************************************
  52.   状態の更新
  53. ************************************************************************/
  54. void update_field(int field[FieldSize][FieldSize]){
  55. int i,j;
  56. int around; /* 周囲の8マスのうち状態が1であるものの数 */
  57. int new_field[FieldSize][FieldSize]; /* 次の状態 */
  58.  
  59. for(i=0;i<FieldSize;i++){
  60. for(j=0;j<FieldSize;j++){
  61. around=count(i,j,field);
  62. /* 周囲に3つ1があれば次の状態は1 */
  63. /*** この部分を自分で書く ***/
  64.  
  65. /* 周囲に2つ1があり、現在の状態が1であれば 次の状態は1 */
  66. /*** この部分を自分で書く ***/
  67.  
  68. /* それ以外の場合は 0 */
  69. /*** この部分を自分で書く ***/
  70. new_field[i][j] = ( (around|field[i][j]) == 3 );
  71.  
  72. }
  73. }
  74.  
  75. /* 次の状態の情報(new_field)を fieldにコピー */
  76. /*** この部分を自分で書く ***/
  77. (void)memcpy(field,new_field,sizeof(new_field));
  78.  
  79.  
  80. }
  81.  
  82. /************************************************************************
  83.   状態(field)の表示
  84. ************************************************************************/
  85. void display(int field[FieldSize][FieldSize]){
  86. int i,j;
  87.  
  88. /* field[i][j]が1であれば■を
  89.   0であれば□を表示する */
  90. /*** この部分を自分で書く ***/
  91. for(i=0;i<FieldSize;i++){
  92. for(j=0;j<FieldSize;j++){
  93. printf(field[i][j]?"■":"□");
  94. }
  95. printf("\n");
  96. }
  97.  
  98.  
  99.  
  100. }
  101.  
  102. /************************************************************************
  103.   メインプログラム
  104. ************************************************************************/
  105. int main(int argc, char *argv[]){
  106. int t;
  107. int field[FieldSize][FieldSize];
  108.  
  109. if(argc!=2){
  110. printf("実行方法 : ./a.out 初期状態のファイル\n");
  111. }
  112.  
  113. /* Linuxで実行する場合は //でコメントアウトしてあるところの
  114. //を消すと表示のされ方が変わる */
  115.  
  116. //system("clear");
  117. init_field(field, argv[1]);
  118. //display(field);
  119. //sleep(1);
  120. //system("clear");
  121. for(t=0;t<TimeMax;t++){
  122. update_field(field);
  123. display(field);
  124. //sleep(1);
  125. //system("clear");
  126. }
  127.  
  128. return 0;
  129. }
  130.  
  131.  
  132.  
Runtime error #stdin #stdout 0s 2380KB
stdin
Standard input is empty
stdout
実行方法 : ./a.out 初期状態のファイル
init_field(): Cannot open "(null)"