vendredi 7 février 2014

Carré magique (Langage C)

Un carré magique d'ordre n est un tableau carré n*n dans lequel on écrit une et une seule fois les nombres entiers de
1 a n², de sorte que la somme des n nombres de chaque ligne, colonne ou diagonale soit constante.

Pour les carrés magiques d'ordre impair, on dispose de l'algorithme suivant
1. la case (n,(n+1)/2) contient 1;
2. si la case (i,j) contient la valeur k, alors on place la valeur k+1 dans la case (i+1,j+1), si cette case est vide,
ou dans la case (i-1,j) sinon. On respecte la règle selon laquelle un indice supérieur à n est ramené a 1.

Notons que (i,j) désigne la case de la ligne i et la colonne j, avec i,j commencent à 1.
Question : écrire un programme complet en C qui permet de construire des carrés magiques de tailles saisis au clavier.


Réponse:

#include <stdio.h>
#include <stdlib.h>

int ** Alloc_Init(int n)
{
    int **m,i,j;
    m=malloc(n*sizeof(int*));        //Allocation de mémoire
    for(i=0;i<n;i++)
        m[i]=malloc(n*sizeof(int));  //Allocation de mémoire

    for(i=0;i<n;i++)
        for(j=0;j<n;j++)
            m[i][j]=0;                //Initialisation
    return m;
}

void remplir(int **t,int n)
{
    int i=n-1,j=n/2,k;
    t[i][j]=1;
    for(k=2;k<=n*n;k++)
    {
        if(t[(i+1)%n][(j+1)%n]==0)
        {
            i=(i+1)%n;
            j=(j+1)%n;
        }
        else
            if(i==0)
                i=n-1;
            else
                i=i-1;
        t[i][j]=k;
    }
}

void afficher(int **m,int n)
{
    int i,j;
    printf("le carre magique d'ordre %d\n\n",n);
    for(i=0;i<n;i++)
    {
        printf("\t");
        for(j=0;j<n;j++)
            printf("%d ",m[i][j]);
        printf("\n");
    }
}

main()
{
    int n,**carre;
    do
    {
        printf("entrer l'ordre de carre magique n\nn= ");
        scanf("%d",&n);
        if(n%2==0)
            printf("n n'est pas impair\n");
        printf("\n");
    }while(n%2==0);
    carre=Alloc_Init(n);
    remplir(carre,n);
    afficher(carre,n);
}

0 commentaires :

Enregistrer un commentaire

Copyright @ 2013 programmerma . Designed by Templateism | Love for The Globe Press