Salve ragazzi sono in difficolta' con il progetto che sto svolgendo. Quest'é la traccia :
Questo invece è il codice:
#include <stdio.h>
#include <stdlib.h>
void Assegna_valori(int n, char scacchiera[45][45],int riga,int colonna,char *tempA,char *tempB,char *tempC,char *tempD);
void stampa_matrice(char scacchiera[45][45]);
int conta_vive(char,char,char,char);
int main() {
/**
* Si consideri una scacchiera in cui ogni casella rappresenta una cellula, che può essere viva o morta
* Prendendo in esame ogni singola casella, ne aggiorna il suo state in base al numero di cellule vive
* che gli sono intorno.
*/
char scacchiera[45][45];
/*
La scacchiera deve essere aggiornata solo alla fine di ogni passo: ciò significa che l’algoritmo deve usare un
array per memorizzare la scacchiera attuale e un array per memorizzare la scacchiera
modificata
*/
char scacchiera_temporanea[45][45];
char A,B,C,D;
int lives = 0;
int colonna=0,riga=0;
int rig=0,col=0;
int i=0,j=0,n=45,itest=0,ntest=0;
int scelta;
int iv,nv,cv,rv;
// I due for assegnano all'intera matrice il valore ' ', riempiendo la matrice di cellule al momento "morte".
for (j=0; j<n; j++) {
for(i=0; i<n; i++) {
scacchiera[j][i] = ' ';
}
}
// La scelta dell'utente determina la nostra configurazione iniziale di cellule "vive"
printf("Specificare quale test vuoi effettuare :\n");
printf("1) Solo la cellula in posizione 22,22 e viva\n");
printf("2) Solo le cellule in posizione 22,22 22,23 sono vive\n");
printf("3) Solo le 4 cellule in posizione 0,0 44,44 44,43 sono vive\n");
printf("4) Inserisci manualmente la configurazione\n>");
scanf("%d", &scelta);
switch(scelta) {
case 1:
// Nella prima configurazione, passiamo direttamente le coordinate nelle matrici e le passiamo da morte a vive
scacchiera[22][22] = '*';
// Passiamo quindi le cellule dallo stato morte a vive
break;
case 2:
// Nella seconda configurazione, passiamo direttamente le coordinate nelle matrici e le passiamo da morte a vive
scacchiera[22][22] = '*';
scacchiera[22][23] = '*';
// Passiamo quindi le cellule dallo stato morte a vive
break;
case 3:
// Nella terza configurazione, passiamo direttamente le coordinate nelle matrici e le passiamo da morte a vive
scacchiera[0][0] = '*';
scacchiera[44][44] = '*';
scacchiera[44][43] = '*';
break;
case 4:
// Nel 4° Caso assegniamo manualmente alla scacchiera le cellule vive
printf("Quante cellule vive contiene la tua configurazione di partenza? \n");
scanf("%d", &nv);
// Il ciclo ogni volta chiede la posizione delle cellule vive assegnate dall'utente
iv=0;
for(iv=0;iv<nv;iv++)
{
printf("Inserisci le coordinate della %d cellula viva nel formato RIGA,COLONNA Es: 22,25\n",iv+1);
scanf("%d,%d",&rv,&cv);
// Dopo aver letto le coordinate le passiamo negli indici di riga e di colonna e assegniamo il valore * di Cellula Viva
scacchiera[rv][cv] = '*';
}
break;
}
// Ottenendo la nostra matrice/scacchiera configurata copiamo tutto il suo contenuto nella matrice/scacchiera temporanea
for (colonna=0; colonna<n; colonna++) {
for(riga=0; riga<n; riga++) {
scacchiera_temporanea[riga][colonna]=scacchiera[riga][colonna];
}
}
colonna = 0;
riga = 0;
i=0;
// L’algoritmo esamina n volte la scacchiera
for (i=1; i<=n; i++) {
// Faccio scorrere tutta la scacchiera
for(riga=0;riga<n;riga++) {
for (colonna=0;colonna<n;colonna++) {
/*
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)
la procedura restituisce in output il contenuto delle caselle che sono intorno alla cellula in esame
*/
Assegna_valori(n, scacchiera, riga, colonna, &A,&B,&C,&D);
/*
Dopo aver controllato se la casella che sto esaminando si trova nei bordi e negli angoli della scacchiera
Vado a contollare quante cellule vive sono intorno alla cellula che stiamo esaminando con la function conta_vive in check.c
che restituisce in output appunto il numero delle vive
*/
lives = conta_vive(A,B,C,D);
// In base al numero di cellule vive contate intorno alla cellula in esame
// Possiamo quindi modificarne il contenuto
// Se una cellula ha 1,2 o 3 cellule vicine vive allora la cellula é posta nello stato viva
if(lives == 1 || lives == 2 || lives == 3) { scacchiera_temporanea[riga][colonna] = scacchiera[riga][colonna] = '*'; }
// Se una cellula ha 4 o più cellule vicine vive allora la cellula deve essere posta nello stato “morta”
if(lives >= 4) { scacchiera_temporanea[riga][colonna] = ' '; }
// La scacchiera deve essere aggiornata solo alla fine di ogni passo
for(rig=0; rig<n; rig++) {
for (col=0; col<n; col++) {
// Ricopio quindi la configurazione ottenuta, all'interno della matrice.
scacchiera[rig][col]=scacchiera_temporanea[rig][col];
}
}
// Riporto il numero di vive a 0, in modo da ricontare il contenuto nel passo successivo
lives=0;
}
}
/* L’algoritmo visualizza tutto l’array 2D al temine del secondo, terzo,
quarto, sesto, ottavo, decimo, 20-simo, 30-simo e 45-simo passo. */
if(i == 2 || i == 3 || i == 4 || i == 6 || i == 8 || i == 10 || i == 20 || i == 30 || i == 45)
{
stampa_matrice(&scacchiera);
/*
Alla fine della stampa di ogni matrice "pulisco" (CLEAR) la schermata
ad eccezione alla stampa dell'ultima elaborazione della scacchiera
in modo che alla fine del intero processo rimanga una stampa dell'elaborazione ottenuta
*/
if(i != 45) {system("cls");};
}
}
system("pause");
}
/*
Prendendo in input le lettere che hanno come valore le cellule che sono intorno
alla cellula che stiamo elaborando, riusciamo a contare le cellule vive
controllando se il loro valore corrisponde a *, il valore che contraddistingue le cellule vive
*/
int conta_vive(char A,char B,char C,char D) {
int conto_vive = 0;
if(A == '*') { conto_vive++; }
if(B == '*') { conto_vive++; }
if(C == '*') { conto_vive++; }
if(D == '*') { conto_vive++; }
return conto_vive;
}
// La procedura stampa la matrice con l'utilizzo di due cicli
// Che scorrono la matrice e a ogni iterazione stampano il contenuto di ciscuna casella
void stampa_matrice(char scacchiera[45][45]) {
int r=0,c=0,n=45;
for(r=0;r<n;r++) {
for (c=0;c<n;c++) {
printf("%c", scacchiera[r][c]);
}
// Alla fine di ogni riga vado a capo
printf("\n");
}
};
void Assegna_valori(int n, char scacchiera[45][45],int riga,int colonna,char *tempA,char *tempB,char *tempC,char *tempD) {
/*
Aalcune cellule prese in esame, possono non avere 4 cellule intorno
Sse ad esempio mi trovo negli spigoli (Esempio [0][0], oppure [44][44]), la cellula ha solo 3 cellule vicine
Sse mi trovo ai bordi, la cellula ha solo 5 cellule vicine
*/
// Controllo quindi se mi trovo negli spigoli
if(riga == 0) {
if(colonna == 0) {
// Le cellule che quindi non esistono le dò come cellule "morte"
// Non verranno quindi conteggiate da conta_vive();
*tempA = ' ';
*tempB = ' ';
*tempC = ' ';
*tempD = ' ';
}
// N-1 perchè l'ultima colonna e l'ultima riga nella scacchiera sarà 44
// dato che partendo da 0 avremo i nostri 45 elementi
if(colonna == n-1) {
*tempA = ' ';
*tempD = ' ';
*tempB = scacchiera[riga][colonna-1];
*tempC = scacchiera[riga+1][colonna-1];
}
}
if(riga == n-1) {
if(colonna == n-1) {
*tempC = ' ';
*tempA = scacchiera[riga-1][colonna-1];
*tempB = scacchiera[riga][colonna-1];
*tempD = scacchiera[riga-1][colonna];
}
if(colonna == 0) {
*tempA = ' ';
*tempB = ' ';
*tempC = ' ';
*tempD = scacchiera[riga-1][colonna];
}
}
// Controllo sui bordi
else if(riga == 0)
{
*tempA = ' ';
*tempD = ' ';
*tempB = scacchiera[riga][colonna-1];
*tempC = scacchiera[riga+1][colonna-1];
}
else if(riga == n-1) {
*tempC = ' ';
*tempA = scacchiera[riga-1][colonna-1];
*tempB = scacchiera[riga][colonna-1];
*tempD = scacchiera[riga-1][colonna];
}
else {
// Se non mi trovo sui bordi, posso quindi copiare tutti i valori delle cellule che sono intorno alla cellula in esame
// Modificando gli indici di riga e di colonna.
*tempA = scacchiera[riga-1][colonna-1];
*tempB = scacchiera[riga][colonna-1];
*tempC = scacchiera[riga+1][colonna-1];
*tempD = scacchiera[riga-1][colonna];
}
}
Quando Provo ad esempio ad eseguire la prima voce del menu in cui mi dovrebbe uscire la cellula nella posizione di array [22][22] con le corrispettive cellule vive o morte , ho la seguente soluzione (al mio parere errata) :
grazie mille per l'aiuto !!