Tp6_2.c 3.36 KB
#include <stdio.h>
#include <string.h>

#define N 3

//lecture mat taille N*N
void lireMatrice (int mat[][N], int n){
        
    int i,j;
    for(i=0; i <= n-1 ; i++){
       
        for(j=0; j <= n-1; j++){
            scanf("%d", &mat[i][j]);
        }
    }
}

// affiche matrice carre
void afficheMat (int mat[][N], int n){
    int i,j;
    for(i=0; i <= n-1 ; i++){
       
        for(j=0; j <= n-1; j++){
           printf(" %d ", mat[i][j]);
        }
        printf("\n");
    }    
}
// affiche vecteur
void afficheVect (int mat[], int n){
    int i;
    for(i=0; i <= n-1 ; i++){
       
        
           printf(" %d ", mat[i]);
       
        
    }  
    printf("\n");
}



void setMatriceVals (int mat[], int n){
   
    int i;
    
    for(i=0; i <= n-1 ; i++){
            mat[i]=0;
            
    }
    afficheVect(mat,n);
}

//calcul somme ligne donnee
int calcSommeLigne (int mat[][N], int n, int ligne){
    int j;
    int somme = mat [ligne][0];
       
        for(j=1; j <= n-1; j++){
           somme += mat[ligne][j];
        }
        //printf("%d",somme);
        return somme;
}


void sommeLigneEtVerifNormal(int mat[][N], int val[], int * estNormal, int * sommeLigne, int n){
    *sommeLigne = calcSommeLigne(mat, n, 0);
    int sommeTempo;
    int i =0;
    int j=0;
    while (*estNormal == 1 && i<n){
        sommeTempo = 0;
        while (*estNormal == 1 && j<n ){
            if(val[((mat[i][j])-1)] == 0){
                           
            sommeTempo+= mat[i][j];
            val[((mat[i][j])-1)]=1;
            
            
            afficheVect(val,2*n);
              
            } else {
                *estNormal = 0;
            }
            j++;
          
        }
        if(sommeTempo != *sommeLigne){
         *estNormal =0;   
        }
        i++;
    }
}




//calcul somme col donnee
int calcSommeCol (int mat[][N], int n, int col){
    int i;
    int somme = mat [0][col];
       
        for(i=1; i <= n-1; i++){
           somme += mat[i][col];
        }
        //printf("%d",somme);
        return somme;
}

//calcul somme col donnee
void calcSommeDiag (int mat[][N], int n, int * sommeHB, int * sommeBH){
    int i;
    *sommeHB = mat [0][0];
    *sommeBH = mat [n-1][0];   
        for(i=1; i <= n-1; i++){
           *sommeHB += mat[i][i];
           *sommeBH += mat[n-1-i][i];
           
        }
        //printf("%d et %d",*sommeHB, *sommeBH);
        
}

int estMagiqueNormal(int mat[][N], int n){
    int matVals [2*n];
    setMatriceVals(matVals, 2*n);
    
    
    
    int i=0;
    int estMagique=1;
    int sumLigne;
    sommeLigneEtVerifNormal(mat,matVals, &estMagique, &sumLigne,n);
    printf("%d",sumLigne);
    int sommeHB, sommeBH;
    calcSommeDiag(mat, N, &sommeHB, &sommeBH);
    
    if(sommeHB != sommeBH){
        estMagique = 1;
    }
    
    while (i < n && estMagique ==1){
        
        
        if((sumLigne != calcSommeCol(mat, N,i)) || (sumLigne != sommeHB)){
            estMagique = 0;
        }
        
        i++;
    }
    return estMagique;
}

int main (){
 
    int mat [N][N];
    lireMatrice(mat, N);
    
    afficheMat(mat, N);
    calcSommeLigne(mat, N,1);
    calcSommeCol(mat, N,1);
    
    int sommeHB, sommeBH;
    calcSommeDiag(mat, N, &sommeHB, &sommeBH);
    
    if( estMagiqueNormal(mat,N) == 1){
        printf("MAGIQUE NORMAL");
    }else{ 
        printf("Non");
        
    }
    return 1;  
    
}