Advertisement
Guest User

Untitled

a guest
Feb 18th, 2018
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.36 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. void Assegna_valori(int n, char scacchiera[45][45],int riga,int colonna,char *tempA,char *tempB,char *tempC,char *tempD,char *tempE, char *tempF,char *tempG,char *tempH);
  5. void stampa_matrice(char scacchiera[45][45]);
  6. int conta_vive(char,char,char,char,char,char,char,char);
  7.  
  8. int main() {
  9. /**
  10. * Si consideri una scacchiera in cui ogni casella rappresenta una cellula, che può essere viva o morta
  11. * Prendendo in esame ogni singola casella, ne aggiorna il suo state in base al numero di cellule vive
  12. * che gli sono intorno.
  13. */
  14. char scacchiera[45][45];
  15. /*
  16. La scacchiera deve essere aggiornata solo alla fine di ogni passo: ciò significa che l’algoritmo deve usare un
  17. array per memorizzare la scacchiera attuale e un array per memorizzare la scacchiera
  18. modificata
  19. */
  20. char scacchiera_temporanea[45][45];
  21.  
  22. char A,B,C,D,E,F,G,H;
  23. int lives = 0;
  24. int colonna=0,riga=0;
  25. int rig=0,col=0;
  26. int i=0,j=0,n=45,itest=0,ntest=0;
  27. int scelta;
  28. int iv,nv,cv,rv;
  29. // I due for assegnano all'intera matrice il valore ' ', riempiendo la matrice di cellule al momento "morte".
  30. for (j=0; j<n; j++) {
  31. for(i=0; i<n; i++) {
  32. scacchiera[j][i] = ' ';
  33. }
  34. }
  35. // La scelta dell'utente determina la nostra configurazione iniziale di cellule "vive"
  36.  
  37. printf("Specificare quale test vuoi effettuare :\n");
  38. printf("1) Solo 7 cellule centrali della riga centrale sono vive\n");
  39. printf("2) Solo 7 cellule centrali della colonna centrale sono vive\n");
  40. printf("3) Solo le 4 cellule in posizione 22,22 22,23 23,22 23,23 sono vive\n");
  41. printf("4) Inserisci manualmente la configurazione\n>");
  42.  
  43. scanf("%d", &scelta);
  44.  
  45. switch(scelta) {
  46. case 1:
  47. // Modifichiamo la riga centrale della scacchiera in modo che in mezzo ad essa ci siano 7 cellule vive
  48. itest=19;
  49. ntest=25;
  50. // il for va da 19 a 25 in modo da sfruttare direttamente l'indice per la modifica della matrice
  51. for(itest=19;itest<=ntest;itest++) {
  52.  
  53. scacchiera[22][itest] = '*';
  54. // Passiamo quindi le cellule dallo stato morte a vive
  55. }
  56. break;
  57.  
  58. case 2:
  59. // Modifichiamo la colonna centrale della scacchiera in modo che in mezzo ad essa ci siano 7 cellule vive
  60. itest=19;
  61. ntest=25;
  62. // il for va da 19 a 25 in modo da sfruttare direttamente l'indice per la modifica della matrice
  63. for(itest=19;itest<=ntest;itest++) {
  64. scacchiera[itest][22] = '*';
  65. // Passiamo quindi le cellule dallo stato morte a vive
  66. }
  67. break;
  68.  
  69. case 3:
  70. // Nella terza configurazione, passiamo direttamente le coordinate nelle matrici e le passiamo da morte a vive
  71. scacchiera[22][22] = '*';
  72. scacchiera[22][23] = '*';
  73. scacchiera[23][22] = '*';
  74. scacchiera[23][23] = '*';
  75. break;
  76. case 4:
  77. // Nel 4° Caso assegniamo manualmente alla scacchiera le cellule vive
  78. printf("Quante cellule vive contiene la tua configurazione di partenza? \n");
  79. scanf("%d", &nv);
  80. // Il ciclo ogni volta chiede la posizione delle cellule vive assegnate dall'utente
  81. iv=0;
  82. for(iv=0;iv<nv;iv++)
  83. {
  84. printf("Inserisci le coordinate della %d cellula viva nel formato RIGA,COLONNA Es: 22,25\n",iv+1);
  85. scanf("%d,%d",&rv,&cv);
  86. // Dopo aver letto le coordinate le passiamo negli indici di riga e di colonna e assegniamo il valore * di Cellula Viva
  87. scacchiera[rv][cv] = '*';
  88. }
  89. break;
  90. }
  91. // Ottenendo la nostra matrice/scacchiera configurata copiamo tutto il suo contenuto nella matrice/scacchiera temporanea
  92. for (colonna=0; colonna<n; colonna++) {
  93. for(riga=0; riga<n; riga++) {
  94. scacchiera_temporanea[riga][colonna]=scacchiera[riga][colonna];
  95. }
  96. }
  97.  
  98. colonna = 0;
  99. riga = 0;
  100. i=0;
  101.  
  102. // L’algoritmo esamina n volte la scacchiera
  103. for (i=1; i<=n; i++) {
  104.  
  105. // Faccio scorrere tutta la scacchiera
  106. for(riga=0;riga<n;riga++) {
  107. for (colonna=0;colonna<n;colonna++) {
  108. /*
  109. Nella procedura seguente mando in input l'indice di riga e di colonna dell'interazione, la scacchiera, e il numero totale di righe e colonne (n)
  110. la procedura restituisce in output il contenuto delle caselle che sono intorno alla cellula in esame
  111. */
  112. Assegna_valori(n, scacchiera, riga, colonna, &A,&B,&C,&D,&E,&F,&G,&H);
  113.  
  114. /*
  115. Dopo aver controllato se la casella che sto esaminando si trova nei bordi e negli ancoli della scacchiera
  116. Vado a contollare quante cellule vive sono intorno alla cellula che stiamo esaminando con la function conta_vive in check.c
  117. che restituisce in output appunto il numero delle vive
  118. */
  119. lives = conta_vive(A,B,C,D,E,F,G,H);
  120.  
  121. // In base al numero di cellule vive contate intorno alla cellula in esame
  122. // Possiamo quindi modificarne il contenuto
  123.  
  124. // Se una cellula ha esattamente tre cellule vicine vive allora la cellula deve essere posta nello stato “viva”
  125. if(lives == 3) { scacchiera_temporanea[riga][colonna] = '*'; }
  126.  
  127. // Se una cellula ha 1,2 o 4 cellule vicine vive allora la cellula permane nello stato in cui si trova
  128. if(lives == 1 || lives == 2 || lives == 4) { scacchiera_temporanea[riga][colonna] = scacchiera[riga][colonna]; }
  129.  
  130. // Se una cellula ha 5 o più cellule vicine vive allora la cellula deve essere posta nello stato “morta”
  131. if(lives >= 5) { scacchiera_temporanea[riga][colonna] = ' '; }
  132.  
  133. // La scacchiera deve essere aggiornata solo alla fine di ogni passo
  134.  
  135. for(rig=0; rig<n; rig++) {
  136. for (col=0; col<n; col++) {
  137. // Ricopio quindi la configurazione ottenuta, all'interno della matrice.
  138. scacchiera[rig][col]=scacchiera_temporanea[rig][col];
  139. }
  140. }
  141. // Riporto il numero di vive a 0, in modo da ricontare il contenuto nel passo successivo
  142. lives=0;
  143. }
  144. }
  145.  
  146. /* L’algoritmo visualizza tutto l’array 2D al temine del secondo, terzo,
  147. quarto, sesto, ottavo, decimo, 20-simo, 30-simo e 45-simo passo. */
  148.  
  149. if(i == 2 || i == 3 || i == 4 || i == 6 || i == 8 || i == 10 || i == 20 || i == 30 || i == 45)
  150. {
  151. stampa_matrice(&scacchiera);
  152. /*
  153. Alla fine della stampa di ogni matrice "pulisco" (CLEAR) la schermata
  154. ad eccezione alla stampa dell'ultima elaborazione della scacchiera
  155. in modo che alla fine del intero processo rimanga una stampa dell'elaborazione ottenuta
  156. */
  157. if(i != 45) {system("cls");};
  158. }
  159.  
  160. }
  161. system("pause");
  162.  
  163. }
  164.  
  165.  
  166. /*
  167. Prendendo in input le lettere che hanno come valore le cellule che sono intorno
  168. alla cellula che stiamo elaborando, riusciamo a contare le cellule vive
  169. controllando se il loro valore corrisponde a *, il valore che contraddistingue le cellule vive
  170. */
  171. int conta_vive(char A,char B,char C,char D,char E,char F,char G,char H) {
  172. int conto_vive = 0;
  173. if(A == '*') { conto_vive++; }
  174. if(B == '*') { conto_vive++; }
  175. if(C == '*') { conto_vive++; }
  176. if(D == '*') { conto_vive++; }
  177. if(E == '*') { conto_vive++; }
  178. if(F == '*') { conto_vive++; }
  179. if(G == '*') { conto_vive++; }
  180. if(H == '*') { conto_vive++; }
  181. return conto_vive;
  182. }
  183.  
  184. // La procedura stampa la matrice con l'utilizzo di due cicli
  185. // Che scorrono la matrice e a ogni iterazione stampano il contenuto di ciscuna casella
  186. void stampa_matrice(char scacchiera[45][45]) {
  187. int r=0,c=0,n=45;
  188. for(r=0;r<n;r++) {
  189. for (c=0;c<n;c++) {
  190.  
  191. printf("%c", scacchiera[r][c]);
  192. }
  193. // Alla fine di ogni riga vado a capo
  194. printf("\n");
  195. }
  196.  
  197. };
  198.  
  199.  
  200. void Assegna_valori(int n, char scacchiera[45][45],int riga,int colonna,char *tempA,char *tempB,char *tempC,char *tempD,char *tempE, char *tempF,char *tempG,char *tempH) {
  201. /*
  202. Alcune cellule prese in esame, possono non avere 8 cellule intorno
  203. Se ad esempio mi trovo negli spigoli (Esempio [0][0], oppure [44][44]), la cellula ha solo 3 cellule vicine
  204. Se mi trovo ai bordi, la cellula ha solo 5 cellule vicine
  205. */
  206. // Controllo quindi se mi trovo negli spigoli
  207. if(riga == 0) {
  208. if(colonna == 0) {
  209. // Le cellule che quindi non esistono le dò come cellule "morte"
  210. // Non verranno quindi conteggiate da conta_vive();
  211.  
  212. *tempA = ' ';
  213. *tempB = ' ';
  214. *tempC = ' ';
  215. *tempD = ' ';
  216. *tempF = ' ';
  217. /*
  218. Le cellule esistenti invece, possono essere sia vive che morte
  219. Copio quindi i loro valori nelle variabili,
  220. Posso modificare gli indici e copiare ogni volta il valore perchè
  221. la loro posizione intorno alla cellula in esame sarà sempre la stessa
  222. */
  223. *tempE = scacchiera[riga+1][colonna];
  224. *tempG = scacchiera[riga][colonna+1];
  225. *tempH = scacchiera[riga+1][colonna+1];
  226. }
  227. // N-1 perchè l'ultima colonna e l'ultima riga nella scacchiera sarà 44
  228. // dato che partendo da 0 avremo i nostri 45 elementi
  229. if(colonna == n-1) {
  230. *tempA = ' ';
  231. *tempD = ' ';
  232. *tempF = ' ';
  233. *tempG = ' ';
  234. *tempH = ' ';
  235. *tempB = scacchiera[riga][colonna-1];
  236. *tempC = scacchiera[riga+1][colonna-1];
  237. *tempE = scacchiera[riga+1][colonna];
  238. }
  239. }
  240.  
  241.  
  242. if(riga == n-1) {
  243. if(colonna == n-1) {
  244. *tempC = ' ';
  245. *tempE = ' ';
  246. *tempH = ' ';
  247. *tempG = ' ';
  248. *tempF = ' ';
  249. *tempA = scacchiera[riga-1][colonna-1];
  250. *tempB = scacchiera[riga][colonna-1];
  251. *tempD = scacchiera[riga-1][colonna];
  252. }
  253. if(colonna == 0) {
  254. *tempA = ' ';
  255. *tempB = ' ';
  256. *tempC = ' ';
  257. *tempE = ' ';
  258. *tempH = ' ';
  259.  
  260. *tempD = scacchiera[riga-1][colonna];
  261. *tempF = scacchiera[riga-1][colonna+1];
  262. *tempG = scacchiera[riga][colonna+1];
  263.  
  264. }
  265. }
  266. // Controllo sui bordi
  267. else if(riga == 0)
  268. {
  269. *tempA = ' ';
  270. *tempD = ' ';
  271. *tempF = ' ';
  272. *tempB = scacchiera[riga][colonna-1];
  273. *tempC = scacchiera[riga+1][colonna-1];
  274. *tempE = scacchiera[riga+1][colonna];
  275. *tempG = scacchiera[riga][colonna+1];
  276. *tempH = scacchiera[riga+1][colonna+1];
  277. }
  278. else if(riga == n-1) {
  279. *tempC = ' ';
  280. *tempE = ' ';
  281. *tempH = ' ';
  282. *tempA = scacchiera[riga-1][colonna-1];
  283. *tempB = scacchiera[riga][colonna-1];
  284. *tempD = scacchiera[riga-1][colonna];
  285. *tempF = scacchiera[riga-1][colonna+1];
  286. *tempG = scacchiera[riga][colonna+1];
  287.  
  288. }
  289. else {
  290. // Se non mi trovo sui bordi, posso quindi copiare tutti i valori delle cellule che sono intorno alla cellula in esame
  291. // Modificando gli indici di riga e di colonna.
  292. *tempA = scacchiera[riga-1][colonna-1];
  293. *tempB = scacchiera[riga][colonna-1];
  294. *tempC = scacchiera[riga+1][colonna-1];
  295. *tempD = scacchiera[riga-1][colonna];
  296. *tempE = scacchiera[riga+1][colonna];
  297. *tempF = scacchiera[riga-1][colonna+1];
  298. *tempG = scacchiera[riga][colonna+1];
  299. *tempH = scacchiera[riga+1][colonna+1];
  300. }
  301. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement