• No se han encontrado resultados

Pràctica Final. Programació I Evolució de Cèl lules - Autor: Ferran Orriols López NIE: Autor: Marc Unió NIE: 47723

N/A
N/A
Protected

Academic year: 2021

Share "Pràctica Final. Programació I Evolució de Cèl lules - Autor: Ferran Orriols López NIE: Autor: Marc Unió NIE: 47723"

Copied!
6
0
0

Texto completo

(1)

Pràctica Final

Programació I 2005-2006

- Evolució de Cèl·lules -

Autor: Ferran Orriols López NIE: 47782

(2)

0. Introducció

Hem estructurat la memòria en tres parts per tal de poder entendre el programa de la millor manera possible, però abans d’entrar en aquestes tres parts veiem, molt breument, com està estructurat el main ( programa principal):

1. Declaració de variables.

2. Inicialització a 0 per totes les variables necessàries.

3. Llegir l’arxiu d’entrada i guardar la primera generació a la matriu mapa_inicial[10][10]. 4. Crear les noves generacions, imprimir els diferents estats i anar creant les estadístiques. 5. Finalment mostrar totes les estadístiques obtingudes.

1. Estructures de dades i declaració de les variables

1.1 Els nostres tipus de dades:

Primer de tot, nosaltres hem definit els nostres propis tipus Tcasella i Tpunt_major com a structs de variables enteres que ens serviran per poder estructurar millor el programa tal i com ho veurem més endavant. typedef struct{ int total; int acumulat; }Tcasella; typedef struct{ int major; int i_major; int j_major; }Tpunt_major;

1.2 Estructures de dades més importants del programa:

Pel funcionament general del programa fem servir els tipus de dades estructurades com són les matrius per tal de guardar l’estat de cada cèl·lula en cada element de la taula. En total farem servir 3 matrius de 10 x 10 :

· La matriu actual (mapa) de tipus char que és a partir d'on farem els càlculs.

· La matriu nova (mapa_nou) de tipus char que l’utilitzarem per anar guardant la següent generació. Un cop s’ha calculat la generació per cada una de les cèl·lules, copiem aquesta matriu a la matriu actual amb la funció (void actualitzar_mapa_a_mapanou()) per poder calcular la següent generació. · Finalment, usem una tercera matriu (mapa_estadistica) de tipus Tcasella on cada element de la matriu conté dos valors gràcies a un struct. Aquest struct conté quants cops hi ha hagut vida en aquella casella (matriu_estadistica[i][j].total) i la durada de la vida d'una cèl·lula en concret (matriu_estadistica[i][j].acumulat).

(3)

1.3 Variables necessàries per la utilització de fitxers

Pel què fa alhora de llegir fitxers declarem els arxius *fentrada i *fsortida on llegirem l’arxiu d’entrada i escriurem l’arxiu de sortida respectivament. Primer de tot, hem hagut de calcular la llargada que tindrà el nom de l'arxiu de sortida. Llavors es mira la mida i usant la funció malloc reservem l’espai necessari per emmagatzemar la cadena de caràcters que contindrà el nom de l'arxiu (nom_arxiu).

1.4 Altres tipus de variables

A més a més definirem altres variables de tipus enter (int) dins del programa principal main que ens serviran per poder saber en quina generació ens trobem (variable generació), el nombre de cèl·lules de cada generació (variable num_cel_gen), la posició del element de la matriu en la qual ens trobem (variable i j), etc . També crearem un vector de 10 elements on cada element es guardarà el nombre de cèl·lules vives en una generació concreta. Totes aquestes variables ens serviran per calcular les estadístiques i gràfiques del programa.

2. Funcionament general del programa

Podem dividir el programa principal en tres grans blocs:

1- La lectura de l’arxiu d’entrada i la creació del de sortida. 2- La generació dels nous escenaris.

3- L’obtenció i procés de les dades per les estadístiques .

2.1- Lectura de l’arxiu d’entrada i creació del de sortida

Donades les condicions de l’enunciat, la primera línia de l’arxiu d’entrada contindrà el nom de l’arxiu de sortida. Com que es desconeix la longitud que tindrà el nom de l’arxiu, en la pràctica s’opta per dotar el programa per assumir qualsevol nom.

El primer pas és veure la llargada que tindrà el nom, amb la funció num_caracter. Aquesta funció la usem directament dins la funció malloc i d’aquesta manera creem l’espai necessari per emmagatzemar la cadena de caràcters que contindrà l’arxiu de sortida (fsortida).

Un cop tenim l’espai necessari, obrim l’arxiu de nou amb la funció fopen (cosa que ens situa de nou el cursor al principi de l’arxiu) i amb la funció fgets guardem a fsortida la primera línia de fentrada (que conté el nom de l’arxiu de sortida).

A continuació, usem la funció fscanf per obtenir el nombre de generacions que haurà de fer el programa i que està contingut a la segona línia de l’arxiu d’entrada.

Ara ja només queda llegir el mapa inicial amb la funció mapa_inicial i podrem començar a generar noves generacions de cèl·lules.

2.2- La generació de nous escenaris:

Com que ara ja sabem el nombre de generacions que hem de crear, construïm una iteració for que amb la variable passos ens indicarà el nombre de vegades que hem de recorre el bucle. Aquest for tindrà la següent forma: for(generacio=1; generacio<passos; generacio++) Així la variable generació ens indicarà a cada moment en quina generació ens trobem. Notem que comencem per la generació = 1 ja que la generació = 0 ja ha estat calculada quan hem llegit l’arxiu d’entrada.

Un cop construït el bucle de les generacions, recorrerem la matriu casella a casella comprovant si hi ha una cèl·lula morta (‘-‘) o una cèl·lula viva (‘*’). Llavors es cridarà a la funció corresponent a l’estat de la cèl·lula ( estat_celules_mortes o estat_celules_vives). Aquestes funcions cridaran a una altre funció anomenada entorn que contarà el nombre de cèl·lules vives que l’envolten i llavors

(4)

segons aquest nombre es decidirà si la cèl·lula està mort o viva. Aquestes decisions s’aniran guardant a la matriu mapa_nou ja que d’aquesta manera no sobreescrivim en el mapa que estem treballant. Un cop acabat el recorregut, imprimim la matriu mapa_nou i llavors el copiem a sobre del mapa vell, gràcies a la funció (actualitzar_mapa_a_mapanou), per tal de poder construir la següent generació.

2.3- L’obtenció i procés de les dades per les estadístiques

Per generar les dades per les estadístiques es treballa bàsicament amb la funció estadística. Cada cop que neix o mor una cèl·lula, se li envia a la funció estadística tota la informació de la mateixa: posició i i j, si neix o mor, ...

Amb aquesta informació, la funció estadística ens valora els cops que hi ha hagut vida en un lloc, per una banda, i la durada de la vida de cada cèl·lula. En cas de morir, ho compararà amb la que ha viscut més temps i si la supera, guardarà la nova informació.

Per aconseguir la gràfica d’estadístiques hem creat un vector de 10 elements on cada element anirà guardant el nombre de cèl·lules vives de la generació en la qual ens trobem en aquell moment. Aquest vector s’inicialitzarà a 0 cada 10 cops ja que cada 10 generacions mostrarem el gràfic dels elements del vector i ja no ens caldrà més la seva informació. També crearem una variable cont que ens servirà per saber l’índex del vector que hem de guardar el nombre de cèl·lules de cada generació. Aquesta variable també l’inicialitzarem a 0 cada 10 cops ja que així ens assegurem que mai es sobrepassi del límit, ja que anirà de 0 a 9 i llavors tornarà a començar. La funció gràfica realitzarà l’assignació del número de cèl·lules corresponent per a cada element del vector i imprimirà cada 10 cops el gràfic d’aquest vector.

3. Detall de les funcions utilitzades

Trobarem totes les funcions ordenades al igual que a la capçalera del programa.

int num_caracters( FILE *fentrada);

Aquesta funció obre l’arxiu entrada.txt i conta quants caràcters hi ha fins que troba un salt de línia. Retorna els nombre de caràcters que té la primera línia.

void mapa_inicial( char mapa[N][N], FILE *fentrada, casella mapa_estadistica[N][N], punt_major *pmax);

Aquesta funció llegeix de l’arxiu d’entrada el primer mapa. Ho fa guardant de l’arxiu d’entrada els caràcters que es va trobant a mapa, tenint en compte que els salts de línia no els ha de contar. Per cada cèl·lula que troba viva, envia la seva informació a la funció estadística.

void estat_celules_vives( char mapa[N][N], char mapa_nou[N][N], Tcasella mapa_estadistica[N][N], int i, int j, Tpunt_major *pmax,int *num_cel_gen);

Primer de tot crida a la funció entorn i li passa el mapa vell, la posició i j de la casella i un -1 per tal de que quan entorn calculi tot l’entorn de la cèl·lula s’inicialitzi el contador a -1 ja que sinó també sumaria la posició de la cèl·lula protagonista. Guardem el valor que ens torna entorn a la variable numcelvecinas. Segons les regles del joc apliquem els if per les condicions necessàries i decidim si aquesta cèl·lula ha de viure, és a dir que el mapa_nou li passem un ‘*’ o mort, el mapa_nou li passem un ‘-‘. Tan si viu o mort ho farem saber a la funció estadística passant els paràmetres necessaris.

(5)

void estat_celules_mortes(char mapa[N][N],char mapa_nou[N][N],Tcasella mapa_estadistica[N][N],int i,int j,Tpunt_major *pmax, int *num_cel_gen)

Els únics canvis respecte funció estat_celules_vives són:

· A la funció entorn li passarem un 0 ja que la cèl·lula protagonista està morta. · Les regles per la cèl·lula morta són diferents que per la cèl·lula viva.

· Només li passarem els paràmetres a la funció estadística si la cèl·lula morta sobreviu.

int entorn( char mapa[N][N], int i, int j, int cont)

Creem dos bucles que ens permetin recorre una matriu més petita dins de la matriu principal agafant com a referència la posició de la cèl·lula que volem analitzar. Aquesta matriu més petita serà un entorn que recorrerà les 8 caselles que envolten la cèl·lula protagonista més la casella d’aquesta. Cada casella es comprovarà si forma part de la matriu principal amb un if amb les condicions següents: if((((i+k)> -1) && ((i+k)< N )) && (((j+l)> -1) && ((j+l)< N )))

Un cop accedim a la casella del entorn mirem si hi ha una cèl·lula viva ‘*’ i llavors li sumem una unitat al contador cont.

void actualitzar_mapa_a_mapanou(char mapa[N][N],char mapa_nou[N][N])

Fa la funció de copiar el mapa_nou sobre el mapa (mapa vell) casella per casella.

void imprimir_mapa( char mapa[N][N],FILE *fsortida);

Tal i com el seu nom indica el seu nom, imprimeix el valor del caràcter de cada element de la matriu del mapa (mapa vell) deixant un espai de separació entre element i element i un cop finalitzat la fila o tota la matriu imprimeix un salt de línea.

void imprimir_mapa_est(casella mapa[N][N],FILE *fsortida);

Idèntica a la funció imprimir_mapa, però ara imprimeix els camps .total de la matriu

mapa_estadística.

void inicialitza_estadistica(casella mapa_estadistica[N][N]);

Aquesta és una funció d’inicialització. Recorre la matriu mapa_estadistica posició a posició i dóna valor 0 a cada camp de cada cèl·lula (matriu_estadistica[i][j].total i .acumulat).

void estadistica(int i, int j, int viu,casella mapa_estadistica[N][N],punt_major *pmax);

Aquesta és la funció que processa la informació que rep de les cèl·lules que van naixent o morint. Els seus paràmetres són la i i la j de la cèl·lula que treballem, el paràmetre viu que és 0 si la cèl·lula ha mort o 1 si ha nascut o continua vivint. També li passem mapa_estadística per guardar la informació i l’struct pmax que conté la informació sobre la cèl·lula que ha viscut més temps.

En el cas de que rebi informació sobre una cèl·lula que neix o segueix vivint, la funció suma u a

mapa_estadistica[i][j].total, mapa_estadistica[i][j].acumulat i a num_cel_gen.

En el cas de que una cèl·lula mori, el que es fa és comparar el paràmetre .acumulat d’aquella cèl·lula amb el que hi ha a pmax(corresponent a la cèl·lula que ha viscut més temps fins al moment). Si la cèl·lula que acaba de morir no supera en vida a la de pmax, es reinicia el contador .acumulat a

(6)

void grafica(int generacio,int vector[10],int *cont,int *num_cel_gen,FILE *fsortida)

Aquesta funció és l’encarregada d’assignar els valors de cada element del vector segons num_cel_gen, que és el número de cèl·lula de la generació. A més a més, cada deu generacions, la funció calcularà la gràfica i mostrarà els 10 elements del vector que hem anat guardant. Per fer això necessitem saber el màxim del vector i un bucle que imprimeix-hi el gràfic en forma de barres. Un cop acabada la gràfica ,en el main, inicialitzarem el vector i cont a 0 per tornar a començar de nou.

void comprovar_acumulades_nomortes( casella mapa_estadistica[N][N],punt_major *pmax);

Donat que la funció estadística s’executa al crear o matar cèl·lules, ens trobem amb un problema en la última iteració. Com que no en genera cap de nova, no valora la durada de la vida de les cèl·lules que estan vives en aquell moment. Per això, per la última generació existeix aquest cas excepcional, pel qual hem de comparar amb pmax les vides acumulades de les cèl·lules que viuen en la última generació.

Referencias

Documento similar

E ditorial Marfil ens presenta un conte que tracta sobre una tradició molt im- portant per als més menuts, però tam- bé per als més grans, com La nit dels Reis Mags.. Importància que

Una de les més estúpides manies intel·lectuals que circulen sense parar des de fa un segle i mig o abans encara és la fixació per la idea de crisi. Tota generació que arriba a

En un congrés, convé disposar d’un pla o full de ruta per tal de garantir la igualtat d’accés de totes les persones, tant ponents com participants.. Comunicació : Tant si el

Els  flavanols  (i  especialment  les  catequines)  han  demostrat  capacitat  per  disminuir  la  viabilitat  de  cèl∙lules  canceroses  (Katiyar  et  al., 

D'altra banda la següent proposició demostra que si és resol el problema de trobar la dimensió i la base per T-indistingibilitats, aleshores també estarà resolt per S-mètriques

Per aquest motiu, l’àlbum Migrants és una eina que representa fidelment la situació dels refugiats i que pot permetre als xiquets i xiquetes saber més d’aquest tema.. A més a

Voldria examinar breument la manera mitjan~ant la qual textos d'aquest tipus --i en particular el de Parets-- ens ajuden a explorar un dels aspectes més interessants

Així doncs, entenem el text no solament com un sistema gramatical, sinó com un       marc que ens ofereix pistes per veure quina és la identitat discursiva dels participants; la