fork(2) 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. i_tmp=I+i;
  39. j_tmp=J+j;
  40.  
  41. /* 自分自身は数えない */
  42. if(i==0 && j==0){
  43. continue;
  44. }
  45. /* 範囲外も数えない */
  46. if(i_tmp<0 || i_tmp>=FieldSize){
  47. continue;
  48. }
  49. if(j_tmp<0 || j_tmp>=FieldSize){
  50. continue;
  51. }
  52.  
  53. sum+=field[i_tmp][j_tmp];
  54. }
  55. }
  56. return sum;
  57. }
  58.  
  59. /************************************************************************
  60.   状態の更新
  61. ************************************************************************/
  62. void update_field(int field[FieldSize][FieldSize]){
  63. int i,j;
  64. int around; /* 周囲の8マスのうち状態が1であるものの数 */
  65. int new_field[FieldSize][FieldSize]; /* 次の状態 */
  66.  
  67. for(i=0;i<FieldSize;i++){
  68. for(j=0;j<FieldSize;j++){
  69. around=count(i,j,field);
  70. if(around==3){
  71. /* 周囲に3つ1があれば次の状態は1 */
  72. new_field[i][j]=1;
  73. } else if(around==2 && field[i][j]==1){
  74. /* 周囲に2つ1があり、現在の状態が1であれば 次の状態は1 */
  75. new_field[i][j]=1;
  76. } else {
  77. new_field[i][j]=0;
  78. }
  79. }
  80. }
  81.  
  82. /* 次の状態の情報(new_field)を fieldにコピー */
  83. for(i=0;i<FieldSize;i++){
  84. for(j=0;j<FieldSize;j++){
  85. field[i][j]=new_field[i][j];
  86. }
  87. }
  88. }
  89.  
  90. /************************************************************************
  91.   状態(field)の表示
  92. ************************************************************************/
  93. void display(int field[FieldSize][FieldSize]){
  94. int i,j;
  95.  
  96. /* field[i][j]が1であれば■を
  97.   0であれば□を表示する */
  98. for(i=0;i<FieldSize;i++){
  99. for(j=0;j<FieldSize;j++){
  100. printf(field[i][j] ? "■" : "□");
  101. }
  102. printf("\n");
  103. }
  104. printf("\n");
  105. }
  106.  
  107. /************************************************************************
  108.   メインプログラム
  109. ************************************************************************/
  110. int main(int argc, char *argv[]){
  111. int t;
  112. int field[FieldSize][FieldSize];
  113.  
  114. if(argc!=2){
  115. printf("実行方法 : ./a.out 初期状態のファイル\n");
  116. }
  117.  
  118. /* Linuxで実行する場合は //でコメントアウトしてあるところの
  119. //を消すと表示のされ方が変わる */
  120.  
  121. //system("clear");
  122. init_field(field, argv[1]);
  123. //display(field);
  124. //sleep(1);
  125. //system("clear");
  126. for(t=0;t<TimeMax;t++){
  127. update_field(field);
  128. display(field);
  129. //sleep(1);
  130. //system("clear");
  131. }
  132.  
  133. return 0;
  134. }
  135.  
  136.  
  137.  
Runtime error #stdin #stdout 0s 2424KB
stdin
Standard input is empty
stdout
実行方法 : ./a.out 初期状態のファイル
init_field(): Cannot open "(null)"