Vous êtes sur la page 1sur 7

/* Declaration de fonctionnalites supplementaires */

#include <stdlib.h> /* EXIT_SUCCESS */


#include <stdio.h> /* printf() */

/* Declarations constantes et types utilisateurs */


#define NMAX 15
#define TRUE 1
#define FALSE 0

/* Declarations de fonctions utilisateurs */

/* saisie affichage et sauvegarde */


int saisie_carre(int T[NMAX][NMAX]);
int saisie_carre_fichier(int T[NMAX][NMAX], char nomF[]);
void affichage_carre(int T[NMAX][NMAX], int n);
void affichage_carre_complet(int T[NMAX][NMAX], int n);
int sauvegarde_carre_fichier(int T[NMAX][NMAX], int n, char nomF[]);
/* calcule les sommes */
int somme_ligne(int T[NMAX][NMAX], int n, int ligne);
int somme_colonne(int T[NMAX][NMAX], int n, int colonne);
int somme_diagonale(int T[NMAX][NMAX], int n);
int somme_diagonale2(int T[NMAX][NMAX], int n);
/* test si un carre est magique */
/* renvoie la constante magique (ou 0 si pas magique) */
int est_magique(int T[NMAX][NMAX], int n);
/* test si un carre magique est normal */
int est_normal(int T[NMAX][NMAX], int n);
/* effectue la somme des carres T1 et T2 d'ordre n */
/* le resultat est dans T d'ordre n */
void somme_carre(int T1[NMAX][NMAX], int T2[NMAX][NMAX],
int T[NMAX][NMAX], int n);
/* effectue le produit des carres T1 et T2 d'ordre n1 et n2 */
/* le resultat est dans T d'ordre renvoye par la fonction */
int produit_carre(int T1[NMAX][NMAX], int n1,
int T2[NMAX][NMAX], int n2, int T[NMAX][NMAX]);

/* Fonction principale */
int main()
{
/* Declaration et initialisation des variables */
int taille, taille2, taille3;
int carreMag1[NMAX][NMAX];
int carreMag2[NMAX][NMAX];
int carreMag3[NMAX][NMAX];
int carreMag4[NMAX][NMAX];

//saisie du tableau par l'utilisateur


//taille=saisie_carre(tabMag);
//affichage_carre(carreMag1,taille);

//saisie du tableau a partir d'un fichier


taille=saisie_carre_fichier(carreMag1,"carre1.txt");
if (taille==0)
printf("probleme lors de la saisie\n");
else
affichage_carre_complet(carreMag1,taille);

taille2=saisie_carre_fichier(carreMag2,"carre2.txt");
if (taille2==0)
printf("probleme lors de la saisie\n");
else
affichage_carre_complet(carreMag2,taille2);

// test somme de deux carres


if (taille!=0 && taille2!=0)
{
somme_carre(carreMag1,carreMag2,carreMag3,taille);
printf("La somme des 2 carres precedents est :\n");
affichage_carre_complet(carreMag3,taille);
sauvegarde_carre_fichier(carreMag3,taille,"carre3.txt");
}

taille=saisie_carre_fichier(carreMag4,"carre4.txt");
if (taille==0)
printf("probleme lors de la saisie\n");
else
affichage_carre_complet(carreMag4,taille);

taille=saisie_carre_fichier(carreMag1,"carre5.txt");
if (taille==0)
printf("probleme lors de la saisie\n");
else
affichage_carre_complet(carreMag1,taille);

taille2=saisie_carre_fichier(carreMag2,"carre6.txt");
if (taille2==0)
printf("probleme lors de la saisie\n");
else
affichage_carre_complet(carreMag2,taille2);

// test produit de deux carres


if (taille!=0 && taille2!=0)
{
taille3=produit_carre(carreMag1,taille,carreMag2,taille2,carreMag3);
printf("Le produit des 2 carres precedents est :\n");
affichage_carre_complet(carreMag3,taille3);
sauvegarde_carre_fichier(carreMag3,taille3,"carre7.txt");
}

/* Valeur fonction */
return EXIT_SUCCESS;
}

/* Definitions de fonctions utilisateurs */

/* saisie d'un carre entre par l'utilisateur */


int saisie_carre(int T[NMAX][NMAX])
{
int n;
int i,j;
printf("Quelle taille ? ");
scanf("%d",&n);
printf("Entrer les %dx%d valeurs\n",n,n);
for(i=0;i<n;i++)
for(j=0;j<n;j++)
scanf("%d",&T[i][j]);
return n;
}

/* saisie d'un carre a partir d'un fichier */


int saisie_carre_fichier(int T[NMAX][NMAX], char nomF[])
{
int n;
int i,j;
FILE * f = fopen(nomF,"r");
if (f==NULL)
return 0; //aucun element lu

printf("Lecture du carre dans le fichier %s\n",nomF);


//lecture du nombre de lignes
fscanf(f,"%d",&n);

// on lit les valeurs


for(i=0;i<n;i++)
for(j=0;j<n;j++)
fscanf(f,"%d",&T[i][j]);

//fermeture du fichier
if (fclose(f)) //en cas de probleme lors de la fermeture
return 0;
return n;
}

/* Afficher un tableau a l'ecran */


void affichage_carre(int T[NMAX][NMAX], int nb)
{
int i,j;
for(i=0;i<nb;i++)
{
for(j=0;j<nb;j++)
printf("%3d ",T[i][j]);
printf("\n");
}
}

/* Afficher un tableau a l'ecran ainsi que ces caracteristiques */


void affichage_carre_complet(int T[NMAX][NMAX], int nb)
{
int OK;
affichage_carre(T,nb);
OK=est_magique(T,nb);
if (OK)
if (est_normal(T,nb))
printf("C'est un carre magique normal de constante magique
%d\n",OK);
else
{
printf("C'est un carre magique de constante magique %d ",OK);
printf("mais il n'est pas normal\n");
}
else
printf("Ce n'est pas un carre magique\n");
}

/* sauvegarde d'un carre dans un fichier */


int sauvegarde_carre_fichier(int T[NMAX][NMAX], int n, char nomF[])
{
int i,j;
FILE * f = fopen(nomF,"w");
if (f==NULL)
return 0; //aucun element lu

printf("Sauvegarde du carre dans le fichier %s\n",nomF);


//ecriture du nombre de lignes
fprintf(f,"%d\n",n);

// on ecrit les valeurs


for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
fprintf(f,"%3d ",T[i][j]);
fprintf(f,"\n");
}

//fermeture du fichier
if (fclose(f)) //en cas de probleme lors de la fermeture
return 0;
return n;
}

/* retourne la somme des elements de la ligne ligne */


int somme_ligne(int T[NMAX][NMAX], int n, int ligne)
{
int j;
int somme=0;
for(j=0;j<n;j++)
somme+=T[ligne][j];
return somme;
}

/* retourne la somme des elements de la colonne colonne */


int somme_colonne(int T[NMAX][NMAX], int n, int colonne)
{
int i;
int somme=0;
for(i=0;i<n;i++)
somme+=T[i][colonne];
return somme;
}
/* retourne la somme des elements de la premiere diagonale */
int somme_diagonale(int T[NMAX][NMAX], int n)
{
int i;
int somme=0;
for(i=0;i<n;i++)
somme+=T[i][i];
return somme;
}

/* retourne la somme des elements de la deuxieme diagonale */


int somme_diagonale2(int T[NMAX][NMAX], int n)
{
int i,k=n-1;
int somme=0;
for(i=0;i<n;i++)
{
somme+=T[i][k];
k--;
}
return somme;
}

/* test si un carre est magique */


/* renvoie la constante magique (ou 0 si pas magique) */
int est_magique(int T[NMAX][NMAX], int n)
{
int i,j;

//initialisation de la somme pour la premiere ligne


int somme=somme_ligne(T,n,0);
//comparaison avec les autres lignes
for(i=1;i<n;i++)
if(somme!=somme_ligne(T,n,i))
return FALSE;
//comparaison avec les colonnes
for(j=0;j<n;j++)
if (somme!=somme_colonne(T,n,j))
return FALSE;
//comparaison avec les deux diagonales
//lapremiere
if (somme!=somme_diagonale(T,n))
return FALSE;
//la seconde
if (somme!=somme_diagonale2(T,n))
return FALSE;

return somme;
}

/* test si un carre magique est normal */


int est_normal(int T[NMAX][NMAX], int n)
{
int Tab[NMAX*NMAX+1];
int n2=n*n;
int i,j;
// initialisation a 0
for(i=0;i<=n2;i++)
Tab[i]=0;
// parcours du carre magique
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
if(T[i][j]<=n2)
Tab[T[i][j]]=1;
else
return FALSE;
}
// tous a 1 ?
i=1;
while (i<=n2)
{
if(Tab[i]!=1)
return FALSE;
i++;
}
return TRUE;
}

/* effectue la somme des carres T1 et T2 d'ordre n */


/* le resultat est dans T d'ordre n */
void somme_carre(int T1[NMAX][NMAX], int T2[NMAX][NMAX],
int T[NMAX][NMAX], int n)
{
int i,j;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
T[i][j]=T1[i][j]+T2[i][j];
}

/* effectue le produit des carres T1 et T2 d'ordre n1 et n2 */


/* le resultat est dans T d'ordre renvoye par la fonction */
int produit_carre(int T1[NMAX][NMAX], int n1,
int T2[NMAX][NMAX], int n2, int T[NMAX][NMAX])
{
int i,j,k,l;
int n=n1*n2;
//(c) Dans le carre d'ordre n2, reduire de 1 les valeurs
//(d) Multiplier par n1*n1
for(i=0;i<n2;i++)
for(j=0;j<n2;j++)
for(k=0;k<n1;k++)
for(l=0;l<n1;l++)
T[n1*i+k][n1*j+l]=n1*n1*(T2[i][j]-1);
//(e) Ajouter le carre d'ordre n1 duplique
for(i=0;i<n1;i++)
for(j=0;j<n1;j++)
for(k=0;k<n2;k++)
for(l=0;l<n2;l++)
T[i+k*n1][j+l*n1]+=T1[i][j];
return n;
}

Vous aimerez peut-être aussi