Une
solution du problème 3 (VIRUS)
Le jeu de tests pour l'évaluation
/*Ce
programme permet de simuler l'évolution d'une population de virus
Cette évolution suit un certain nombre de règles telles que:
1- Un virus qui a au plus deux voinsins meurt par solitude
2- Un virus qui a plus de 4 voinsins meurt par asphyxie
3- Une cellule vide entourée par trois virus, dans les cellules voisines,
donne naissance à un nouveau virus
En
exécution le programme nécessite deux paramètres :
-
Le nom du fichier contenant la population
initiale de virus
-
Le nom du fichier qui va contenir le résultat
Exemple: c:>virus gen_init1.txt genout1.txt
*/
/*Ce
programme permet de simuler l'évolution d'une population de virus
Cette évolution suit un certain nombre de règles telles que:
1- Un virus qui a au plus deux voinsins meurt par solitude
2- Un virus qui a plus de 4 voinsins meurt par asphyxie
3- Une cellule vide entourée par trois virus, dans les cellules voisines,
donne naissance à un nouveau virus
*/
#include
<stdio.h>
#include <stdlib.h>
#include <string.h>
#define maxn 20
#define minn 5
int tvirus[maxn][maxn];//tableau de virus
FILE *fvirus;//fichier source de virus
FILE *fresultat;//fichier source de virus
int m;//ordre de génération
/* Programme Principal*/
int main(int argc, char *argv[])
{
int Remplir_tvirus(char *);
void Afficher_tvirus(int);
void Evolution(int, int[maxn][maxn]);
void Sortir_resultat(char *,int,int);
int ordre;//compteur ordre génération
int i,j,n;
if(argc != 3)
{
fprintf(stderr,"\nErreur parametres à la commande: nomprog fichiervirus
fichieresultat\n");
return(1);
}
fvirus=fopen(argv[1],"r");
/*Initialisation du tableau tvirus à zéro*/
for (i=0;i<maxn;i++)
for (j=0;j<maxn;j++) tvirus[i][j]=0;
n=Remplir_tvirus(argv[1]);
fclose(fvirus);
Afficher_tvirus(n);
//Evolution de la génération
printf("Donner l'ordre d\'évolution:");
scanf("%d",&m);
for(ordre=1;ordre<=m;ordre++)
{
Evolution(n,tvirus);
Afficher_tvirus(n);
}
printf("Tapez
une touche pour quitter...");
getchar();
//Affichage
et Sortie du résultat
printf("\nEcriture du résultat dans le fichier %s",argv[2]);
Afficher_tvirus(n);
Sortir_resultat(argv[2],n,m);
printf("\nFin Programme Virus");
printf("Tapez une touche pour quitter...");
getchar();
return(0);
}
//
Les fonctions du programme
//Ecriture
du résultat dans un fichier
void
Sortir_resultat(char *nomfresult,int ns,int ms)
{
int is,js;
fresultat=fopen(nomfresult,"w+");
fprintf(fresultat, "%d\n",ms);
for (is=0;is<ns;is++)
for (js=0;js<ns;js++)
if(tvirus[is][js]==1)
fprintf(fresultat,"%d %d\n",is+1,js+1);
fclose(fresultat);
}
//Evolution
d'une génération à une autre
void Evolution(int ne,int tviruse[maxn][maxn])
{
int nvirusvois;//nombre de virus voisins
int ie,je,i1,j1;
//evolution
for(ie=0;ie<ne;ie++)
for(je=0;je<ne;je++)
{
nvirusvois=0;
for(i1=ie-1;i1<=ie+1;i1++)
for(j1=je-1;j1<=je+1;j1++)
{
if((i1>=0)&&(i1<ne)&&(j1>=0)&&(j1<ne))
//Eviter débordement*
{
//Exclure le centre
et incrémenter
if((tviruse[i1][j1]==1)&&
!((i1==ie)&&(j1==je)))
nvirusvois++;
}
}
if(tviruse[ie][je]==0)
{
if(nvirusvois==3) tviruse[ie][je]=1;
}
else
{
if ((nvirusvois<=2)||(nvirusvois>=5))
if (tviruse[ie][je]==1)
tviruse[ie][je]=0;
}
}
}
//Afffichage
de la matrice de virus
void Afficher_tvirus(int na)
{int ia,ja;
getchar();
printf("Affichage tvirus");
printf("\n n=%d\n",na);
getchar();
for (ia=0;ia<na;ia++)
{
for (ja=0;ja<na;ja++)
if(tvirus[ia][ja]==0)
printf(". ");
else printf("* ");
printf("\n");
}
}
//Chargement du tableau à partir du fichier source
int Remplir_tvirus(char *nomfichier)
{
int
x,y,nr;
printf("\nPopulation des Virus\n");
fvirus=fopen(nomfichier,"r");
if (fvirus != NULL)
{
fscanf(fvirus,"%d\n",&nr);
printf("\n n=%d\n",nr);
while(!feof(fvirus))
{ fscanf(fvirus,"%d",&x);
fscanf(fvirus,"%d\n",&y);
tvirus[x-1][y-1]=1;
printf("\ntvirus(%d,%d)=%d",x,y,tvirus[x-1][y-1]);
}
}
fclose(fvirus);
return(nr);
}
Les 5 tests pour le programmes W_ORDERED (20 points par test)
|
Test 1
|
Test2
|
Test3
|
Test4
|
Test5
|
|
GEN_INIT1
|
GEN_INIT2
|
GEN_INIT3
|
GEN_INIT4
|
GEN_INIT5
|
|
6
1
1
1
2
2
2
2
3
3
3
3
4
4
2
4
3
4
4
5
2
5
3
5
4
6
3
6
4
6
5
6
6
|
7
1
1
1
2
1
3
1
4
1
5
1
6
1
7
2
1
2
2
2
4
2
6
2
7
3
4
4
1
4
2
4
3
4
4
4
5
4
6
4
7
5
4
6
1
6
2
6
4
6
6
6
7
7
1
7
2
7
3
7
4
7
5
7
6
7
7
|
17
1
2
1
6
2
1
2
2
2
3
2
4
2
5
2
6
2
7
3
2
3
6
4
2
5
1
5
2
5
3
5
4
5
5
5
6
5
7
6
2
6
6
7
1
7
3
7
5
8
10
8
11
8
12
8
13
8
14
8
15
8
16
8
17
9
8
9
10
9
12
9
14
9
16
10
1
10
2
10
5
10
7
10
9
10
13
10
15
11
5
11
8
12
1
12
2
12
3
12
11
12
14
12
15
13
1
13
2
13
5
13
14
13
15
13
16
14
14
14
15
14
16
15
2
15
3
15
5
15
8
15
10
15
12
15
15
16
10
17
1
17
3
17
5
17
7
17
9
17
10
17
12
17
15
17
17
|
12
1
2
2
1
2
2
2
3
3
3
3
4
4
2
4
3
4
4
4
5
5
4
5
5
5
6
7
1
7
2
7
5
7
8
7
9
7
10
7
11
7
12
8
7
8
9
8
10
8
11
8
12
9
2
9
3
9
4
9
5
9
10
9
11
9
12
10
8
10
10
10
11
10
12
11
1
11
3
11
5
11
10
12
3
12
4
12
5
12
9
12
11
|
9
1
1
1
2
1
3
1
4
1
5
1
6
1
9
2
1
2
2
2
4
2
6
2
9
3
4
4
4
4
1
4
2
4
3
4
4
4
5
4
6
4
9
5
3
5
4
6
1
6
2
6
4
6
6
6
7
6
9
7
1
7
2
7
3
7
4
7
5
7
6
7
7
7
9
8
3
8
4
9
3
9
4
9
5
9
6
9
7
9
8
9
9
|
GEN_OUT1
|
GEN_OUT2
|
GEN_OUT3
|
GEN_OUT4
|
GEN_OUT5
|
|
3
4
3
5
4
|
4
2
6
|
5
2
5
5
13
5
14
6
12
6
14
7
14
7
15
8
14
8
15
8
16
9
14
9
16
9
17
10
15
13
16
13
17
14
16
14
17
15
17
16
16
16
17
17
16
17
17
|
6
10
11
10
12
11
11
11
12
|
3
1
1
1
2
1
3
1
4
1
5
2
1
2
5
3
1
3
2
3
3
3
4
3
6
4
6
|
|