IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

le carré magique


Sujet :

C

  1. #1
    Membre à l'essai
    Inscrit en
    Novembre 2006
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 19
    Points : 12
    Points
    12
    Par défaut le carré magique
    salut tout le monde !

    ben j'ai essayé d'ecrire un programme qui teste si une matrice carrée est un carrée magique ou non, le programme que j'ai fait me parait logique mais j'arrive pas à detecter l'erreur ;voici le code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    #include lt;stdio.hgt;
    #include lt;conio.hgt;
     
    main()
     
    { int a[20][20]; int i,j,n,s,t,magique;
     
           do
           { printf(quot;entrer la valeur de n la dimension du c.m : quot;);scanf(quot;%dquot;,amp;n);
           }
            while ((ngt;20)||(nlt;=0));
    for(i=0;ilt;n;i++)
    { for(j=0;jlt;n;j++)
      {  printf(quot;entrer la valeur de a[%i][%i]: quot;,i,j);scanf(quot;%dquot;,amp;a[i][j]);}
     }
     clrscr();
     for(i=0,s=0;ilt;n;i++)
      { s+=a[i][i];}
      t=s;
      for(i=0,s=0;ilt;n;i++)
      {s+=a[i][n-i-1];}
      if(s!=t) {magique=0;}
     
      for(i=0,s=0;ilt;n;i++)
       {for(j=0;jlt;n;j++)
        {s+=a[i][j];}
        if(s!=t) {magique=0;}
        }
     
       for(j=0,s=0;jlt;n;j++)
       {for(i=0;ilt;n;i++)
        {s+=a[i][j];}
        if(s!=t) {magique=0;}
     
        }
        if(magique==0) { printf(quot; n'est pas un carré magiquequot;);}
        else { printf(quot;est un carré magiquequot;);}
     
        getch();
        }
    MERCI D'AVANCE

  2. #2
    Membre expérimenté
    Avatar de granquet
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    1 201
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 201
    Points : 1 421
    Points
    1 421
    Par défaut
    http://emmanuel-delahaye.developpez....s.htm#typemain

    c'est pas bon du tout ... a moins que ...

    et
    c'est pas standard.

    et honte a moi je ne sais pas ce qu'est un carré magique ...
    click my www
    ............|___
    ...................\
    .................._|_
    ..................\ /
    ..................."

  3. #3
    Membre à l'essai
    Inscrit en
    Novembre 2006
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 19
    Points : 12
    Points
    12
    Par défaut standard...
    ben je travaille avec borland C++ ;le getch() c'est pour afficher le resultat parceque sinon le programme s'exsecute sans que le resultat s'affiche.....

    pour ce qui concerne le carré magique: c'est une matrice carrée dont la somme des éléments de chaque diagonale= la somme des element de chaque colonne=la somme des élement de chaque ligne.

  4. #4
    Membre à l'essai
    Inscrit en
    Novembre 2006
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 19
    Points : 12
    Points
    12
    Par défaut ...
    pour le main() je ne suis pas sûre mais je crois qu'on n'a pas besoin de int main() mais de main() puisque j'utilise getch() et non pas le return0 qui retoune une valeur entiere!!

  5. #5
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Une des joies du C :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    scanf(quot;%dquot;,amp;a[i,j]);}
    C'est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    scanf(quot;%dquot;,amp;a[i][j])
    qu'il faut mettre
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  6. #6
    Membre à l'essai
    Inscrit en
    Octobre 2006
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 20
    Points : 23
    Points
    23
    Par défaut
    tu n'a pas pas initialiser ton "magique" alors que rien ne t'assure qu'il differe de 0.

    le carre n'est pas magique dés que tu trouve une ligne, colonne ou diagonale qui differe de ta premier somme; alors pourqui tester tout.
    tu devrais plutot faire une fonction avec ton carré en entrée et un booleen en sortie et retourner dés que la condition est satisfaite.
    cest plus pro.

  7. #7
    Membre à l'essai
    Inscrit en
    Octobre 2006
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 20
    Points : 23
    Points
    23
    Par défaut
    puis l'erreur s'est quoi .
    q'est ce que tu as comme resultat si y on a un

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    633
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 633
    Points : 711
    Points
    711
    Par défaut
    Bonjour,
    Citation Envoyé par mahis_
    pour le main() je ne suis pas sûre mais je crois qu'on n'a pas besoin de int main() mais de main() puisque j'utilise getch() et non pas le return0 qui retoune une valeur entiere!!
    Besoin ou pas, ça fait partie du standard, et ce que tu utilises dedans n'a rien à voir : dans tous les cas, main doit renvoyer un entier.

    Au passage, soigne l'indentation de ton code, tu verras que ça rend la lecture beaucoup plus facile (c'est fait pour ça).
    Compilation sans erreur ne signifie pas programme sans erreur.
    L'indentation n'a pas été imaginée pour faire beau, mais pour faciliter la lecture des programmes.

  9. #9
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 612
    Points : 30 612
    Points
    30 612
    Par défaut
    Salut,

    Bon, déjà, je te conseillerais de revoir un peu la manière de "formater" ton code:

    une déclaration/instruction par ligne, c'est l'idéal

    La copie de ton code absolument sans la moindre correction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
     
    #include lt;stdio.hgt;
    #include lt;conio.hgt;
     
    int main() /* Attention, main est une fontion qui renvoie un int ;) */
    { 
        int a[20][20]; 
        int i;
        int j;
        int n;
        int s;
        int t;
        int magique;
        do
        {
            printf(quot;entrer la valeur de n la dimension du c.m : quot;);
            scanf(quot;%dquot;,amp;n);
        }while ((ngt;20)||(nlt;=0));
        for(i=0;ilt;n;i++)
        { 
            for(j=0;jlt;n;j++)
            {
                printf(quot;entrer la valeur de a[%i][%i]: quot;,i,j);
                scanf(quot;%dquot;,amp;a[i,j]);
            }
        }
        clrscr();
        for(i=0,s=0;ilt;n;i++)
        {
            s+=a[i][i];
        }
        t=s;
        for(i=0,s=0;ilt;n;i++)
        {
            s+=a[i][n-i-1];
        }
        if(s!=t)
        {
            magique=0;
        }     
        for(i=0,s=0;ilt;n;i++)
        {
            for(j=0;jlt;n;j++)
            {
                s+=a[i][j];
            }
            if(s!=t)
            {
                magique=0;
            }
        }
        for(j=0,s=0;jlt;n;j++)
        {
            for(i=0;ilt;n;i++)
            {
                s+=a[i][j];
            }
            if(s!=t)
            {
                magique=0;
            }
        }
        if(magique==0)
        {
            printf(quot; n'est pas un carré magiquequot;);
        }
        else
        {
            printf(quot;est un carré magiquequot;);
        }
        getch();
        /* seul ajout de ma part */
        return 0;
    }
    Avoue que c'est plus facile à lire comme cela non ???

    Ce qui nous amene à plusieurs remarques:

    1 Tu n'initialise magique que dans les tests..., qui, de prime abord, risquent de n'etre jamais effectués...

    Cela signifie que, quand tu lance l'application, magique peut valoir... tout et n'importe quoi (les crasses laissées par la dernière utilisation de la mémoire...)

    Avec un peu de chance (car ton carre sera considéré comme magique si on n'entre pas dans un des tests), il ne vaut pas 0, mais avec un peu de malchance... oui... Et ton carré magique sera considéré comme... ne l'étant pas

    Pour éviter ce problème il est indispensable d'initialiser dés le départ, ou en tout cas, avant de commencer ta vérification, magique à une valeur qui, de prime abord, permettra de considérer que le carré est magique (du moins, selon la logique que tu semble suivre...)

    2 Le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for(i=0,s=0;ilt;n;i++)
    {
        s+=a[i][i];
    }
    me déplait au plus haut point...
    pourquoi ne pas coder sous la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    s=0;
    for(i=0;ilt;n;i++)
    {
        s+=a[i][i];
    }
    voire, comme il n'y a qu'une seule instruction à exécuter
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    s=0;
    for(i=0;ilt;n;i++)
        s+=a[i][i];
    /*la suite, aligné avec le f de for */
    ???

    3La partie du code (qui, selon toute vraissemblance, est la vérification du coté magique du carré)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    
    /* je préfere sortir l'initialisation des variables qui ne doivent pas
     * etre incrémentés  des boucles */
        s=0;
        for(i=0;i<n;i++)
        {
            s+=a[i][i];
        }
        t=s;
        for(i=0,s=0;i<n;i++)
        {
            s+=a[i][n-i-1];
        }
        if(s!=t)
        {
    /* si on passe ici, le reste des vérifications n'a aucune raison d'être
     * effectué car le carre ne sera manifestement pas magique */ 
            magique=0;
        }     
        s=0;
        for(i=0;i<n;i++)
        {
            for(j=0;j<n;j++)
            {
                s+=a[i][j];
            }
            if(s!=t)
            {
    /* La remarque est valable ici aussi */
                magique=0;
            }
        }
        s=0;
        for(j=0;j<n;j++)
        {
            for(i=0;i<n;i++)
            {
                s+=a[i][j];
            }
            if(s!=t)
            {
                magique=0;
            }
        }
    ne me semble pas tout à fait logique...

    En effet dés le moment où magique passe à 0, c'est que le carré n'est pas magique, et que tu peux arreter les autres vérifications...

    Tu gagneras en temps d'exécution si, un jour, tu venais à décider d'autoriser les matrices carrées (beaucoup) plus importantes (le gain étant vraissemblablement minime ici)

    Pour ce qui concerne la première boucle, il n'y a pas grand chose à faire, il faut l'exécuter entierement... Par contre, pour les autres, on peut très bien envisager de n'entrer dans la boucle que si magique est différent de 0

    Cela donnerait un code du genre de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
    s=0;
    for(i=0;ilt;n;i++)
    {
       s+=a[i][i];
    }
    t=s;
    for(i=0,s=0;ilt;n;i++)
    {
        s+=a[i][n-i-1];
    }
    if(s!=t)
        magique=0;
    i=0;
    s=0;
    /* on n'entrera dans cette boucle que si il est encore possible d'avoir un
     * carré magique ;) */
    while(ilt;20 amp;amp; magique!=0)
    {
        for(j=0;jlt;n;j++)
        {
            s+=a[i][j];
        }
        if(s!=t)
            magique=0;
        ++i;
    }
    s=0;
    j=0
    /* et ici aussi */
    while(jlt;20 amp;amp; magique!=0)
    {
        for(i=0;ilt;n;i++)
        {
            s+=a[i][j];
        }
        if(s!=t)
            magique=0;
        ++j;
    }
    /* et on rajoute quand meme l'affichage du résultat ;) */
    if(magique!=0)
        printf(quot;C'est un carre magique\nquot;);
    else
        printf(quot;Ce n'est pas un carre magique\nquot;);
    exit 0; /* sortie sans erreur de l'application */
    Le code n'est pas forcément plus court (si ce n'est les accolades inutiles retirées ) mais il est, en tout état de cause, bien plus rapide à l'exécution... vu qu'il y a deux boucles imbriquées dans lesquelles on ne rentrera peut etre pas...

    Seul le fait de tomber sur un carré magique pourrait ralentir l'exécution...
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  10. #10
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par koala01
    voire, comme il n'y a qu'une seule instruction à exécuter
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    s=0;
    for(i=0;ilt;n;i++)
        s+=a[i][i];
    /*la suite, aligné avec le f de for */
    <...>
    Le code n'est pas forcément plus court (si ce n'est les accolades inutiles retirées )
    OK, c'est techniquement possible, mais l'expérience montre qu'il est préférable de laisser les accolades :
    • Ca rend le code plus lisible et plus homogène.
    • Ca rend le code plus facile à maintenir
    Pas de Wi-Fi à la maison : CPL

  11. #11
    Membre à l'essai
    Inscrit en
    Novembre 2006
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 19
    Points : 12
    Points
    12
    Par défaut
    Tu n'initialise magique que dans les tests..., qui, de prime abord, risquent de n'etre jamais effectués...

    Cela signifie que, quand tu lance l'application, magique peut valoir... tout et n'importe quoi (les crasses laissées par la dernière utilisation de la mémoire...)
    j'ai initialisé la variable magique par 1 au début du programme et j'ai changé les trucs que vous avez signalés mais le resultat est toujours faux à chaque execution le programme affiche : le carré n'est pas magique !! pour toutes les valeurs entrées même si elles verifient la condition du carré magique !!!

  12. #12
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Je signale quand même que si la fonction de saisie des valeurs avec le scanf faux est maintenue, ça ne risque pas de donner le bon résultat, voir mon post précédent.
    [Edit] apparemment, ça a été fait [/Edit]
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  13. #13
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 612
    Points : 30 612
    Points
    30 612
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    OK, c'est techniquement possible, mais l'expérience montre qu'il est préférable de laisser les accolades :
    • Ca rend le code plus lisible et plus homogène.
    • Ca rend le code plus facile à maintenir
    On est bien d'accord là dessus...

    Simplement, (c'est vrai, j'aurais du préciser que je n'était pas d'accord avec l'idée ) je me rappelle d'un post où je disais d'utiliser des accolades meme pour les bloc "mono instruction" et que quelqu'un m'a fait la remarque que j'étais un peu excessif...

    L'astuce est que, comme la "mise en forme" du code n'influe ne rien sur la compilation, chacun est susceptible de voir midi à sa porte

    Citation Envoyé par mahis_
    j'ai initialisé la variable magique par 1 au début du programme et j'ai changé les trucs que vous avez signalés mais le resultat est toujours faux à chaque execution le programme affiche : le carré n'est pas magique !! pour toutes les valeurs entrées même si elles verifient la condition du carré magique !!!
    Alors, c'est qu'il faut envisager de revoir la logique qui permet de déterminer si le carré est magique ou non...

    Les corrections que j'ai proposées partaient du principe que, quand meme, la logique que tu présente est correcte...

    D'autres remarques peuvent d'ailleurs très bien venir à l'esprit, sans juger de la qualité de ta logique...

    Ainsi, on pourrait se demander pourquoi ne pas, au lieu de préparer une matrice fixe de 20*20, demaner la taille de la matrice et l'allouer dynamiquement??? Cela aurait l'avantage de ne pas présenter une limite arbitraire supplémentaire

    Il n'est pas exclu du tout que la vérification foire parce que tu vérifie d'office... les 20 positions de ta matrice de 20*20... alors, par exemple, qu'il est possible que, tu aies "des crasses" dans les positions inutilisées...

    Soit, il faudra veiller à ce que meme les positions inutilisée soient correctement initialisées (AKA: à une valeur correcte pour que les tests restent juste), soit il faudra veiller à n'utiliser que la taille réellement indiquée par l'utilisateur...
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  14. #14
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par koala01
    Simplement, (c'est vrai, j'aurais du préciser que je n'était pas d'accord avec l'idée ) je me rappelle d'un post où je disais d'utiliser des accolades meme pour les bloc "mono instruction" et que quelqu'un m'a fait la remarque que j'étais un peu excessif...
    Ce n'était certainement pas moi.
    Pas de Wi-Fi à la maison : CPL

  15. #15
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 612
    Points : 30 612
    Points
    30 612
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Ce n'était certainement pas moi.
    Je n'ai jamais sous entendu non plus que c'était toi

    J'ai juste dit que quelqu'un (pronom indéfini par excellence) m'avait fait la remarque
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  16. #16
    Membre à l'essai
    Inscrit en
    Novembre 2006
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 19
    Points : 12
    Points
    12
    Par défaut
    Citation Envoyé par Trap D
    Je signale quand même que si la fonction de saisie des valeurs avec le scanf faux est maintenue, ça ne risque pas de donner le bon résultat, voir mon post précédent.
    oui bien sur que j'ai pris en compte ta remarque et je l'ai même corrigé dans le code que j'ai mis au début ;mais ce n'est pas ça la source du probleme

  17. #17
    Membre à l'essai
    Inscrit en
    Novembre 2006
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 19
    Points : 12
    Points
    12
    Par défaut
    Ainsi, on pourrait se demander pourquoi ne pas, au lieu de préparer une matrice fixe de 20*20, demaner la taille de la matrice et l'allouer dynamiquement??? Cela aurait l'avantage de ne pas présenter une limite arbitraire supplémentaire

    Il n'est pas exclu du tout que la vérification foire parce que tu vérifie d'office... les 20 positions de ta matrice de 20*20... alors, par exemple, qu'il est possible que, tu aies "des crasses" dans les positions inutilisées...

    Soit, il faudra veiller à ce que meme les positions inutilisée soient correctement initialisées (AKA: à une valeur correcte pour que les tests restent juste), soit il faudra veiller à n'utiliser que la taille réellement indiquée par l'utilisateur...
    cette taille de 20*20 est proposée dans l'ennocée comme taille maximale;mais je ne vois pas de raison pour initialiser les positions inutilisées puisque le traitement se passe jusqu'à ' n' saisi par l'utilisateur!!

  18. #18
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 612
    Points : 30 612
    Points
    30 612
    Par défaut
    En fait, c'est une erreur de ma part en te proposant la modification...

    J'ai écrit mes boucles sous la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    while(variablelt;20 amp;amp; magique!=0) /*variable étant i ou j, selon la boucle ;) */
    {
    ...
    }
    alors qu'il aurait fallu écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    while(variablelt;n amp;amp; magique!=0) /*meme remarque ;) */
    {
    ...
    }
    Car, de fait, comme dans les boucles que j'ai proposées, on teste aussi les valeurs non définies de la matrice... il y a peu de chance que l'on arrive à un carré magique
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  19. #19
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 612
    Points : 30 612
    Points
    30 612
    Par défaut
    Ceci dit, l'intéret d'initialiser toutes tes variables à des données neutres est, justement, de permettre une plus grande tolérence aux erreurs d'attention

    Comme tu ne sais jamais avec précision (à part si tu commence à vérifier le langage machine) où vont aller se loger tes variables dans la mémoire, et, encore moins, l'usage des adresses mémoires qui a pu etre fait par les programmes exécutés avant, tu n'es jamais sur que d'une chose: c'est que tu n'est absolument pas sur de la valeur de ta variable tant que tu ne l'a pas définie explicitement (quelle que soit la manière dont tu la définis )

    Il est donc toujours sage, meme si tu prévois des variables surnuméraires, d'au moins les définir à une valeur "qui ne risque rien"...

    On le fait bien avec les pointeurs
    il est conseillé de le faire avec les chaines de caractères
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    char machaine[255];
    int i;
    for(i=0;ilt;255;i++)
       machaine[i]='\0';
    Pourquoi décider, sous prétexte qu'on travaille avec une matrice ou avec des entiers, de faire différemment???
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  20. #20
    Membre éclairé Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Points : 858
    Points
    858
    Par défaut
    Citation Envoyé par koala01
    il est conseillé de le faire avec les chaines de caractères
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    char machaine[255];
    int i;
    for(i=0;ilt;255;i++)
       machaine[i]='\0';
    Ou plus simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char machaine[255] = {0};
    Software Failure. Press left mouse button to continue.
    Guru Meditation #0100000C.000FE800

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Problème de vitesse lors de recherche de carré magique
    Par niniwizard dans le forum Prolog
    Réponses: 22
    Dernier message: 16/01/2009, 13h11
  2. Construction Carré magique
    Par nianko dans le forum Débuter
    Réponses: 2
    Dernier message: 29/05/2008, 09h34
  3. Carré magique mauvais affichage
    Par bdptaki dans le forum Delphi
    Réponses: 8
    Dernier message: 14/05/2007, 16h43
  4. [TP] Programme carré magique
    Par Henry22 dans le forum Turbo Pascal
    Réponses: 3
    Dernier message: 31/03/2007, 14h40
  5. probléme carré magique
    Par pipip dans le forum C
    Réponses: 4
    Dernier message: 29/11/2006, 18h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo