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

Pascal Discussion :

Optimisation d'un code !


Sujet :

Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 28
    Par défaut Optimisation d'un code !
    Bonjour à tous !! Mon problème :

    Voici une procedure qui a pour but de résoudre un carré latin (3 par 3 cases). Voyez vous même :

    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
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    procedure resolution(var t : tableau);
     
    label 1;
     
    var i, j : integer;
     
    begin
     
         for j := 1 to n do begin
     
             for i := 1 to n do begin
     
                 if t[i, j] = 0 then begin
     
                    1:
     
                    inc(t[i, j]);
     
                    if (j = 1) and (i = 1) then begin
     
                       while (t[i, j] = t[i, j + 1]) or (t[i, j] = t[i, j + 2]) or (t[i, j] = t[i + 1, j]) or (t[i, j] = t[i + 2, j]) do begin
     
                             inc(t[i, j]);
     
                       end;
     
                    end;
     
                    if (j = 1) and (i = 2) then begin
     
                       while (t[i, j] = t[i, j + 1]) or (t[i, j] = t[i, j + 2]) or (t[i, j] = t[i + 1, j]) or (t[i, j] = t[i - 1, j]) do begin
     
                             inc(t[i, j]);
     
                       end;
     
                    end;
     
                    if (j = 1) and (i = 3) then begin
     
                       while (t[i, j] = t[i, j + 1]) or (t[i, j] = t[i, j + 2]) or (t[i, j] = t[i - 1, j]) or (t[i, j] = t[i - 2, j]) do begin
     
                             inc(t[i, j]);
     
                       end;
     
                    end;
     
                    if (j = 2) and (i = 1) then begin
     
                       while (t[i, j] = t[i, j + 1]) or (t[i, j] = t[i, j - 1]) or (t[i, j] = t[i + 1, j]) or (t[i, j] = t[i + 2, j]) do begin
     
                             inc(t[i, j]);
     
                       end;
     
                    end;
     
                    if (j = 2) and (i = 2) then begin
     
                       while (t[i, j] = t[i, j + 1]) or (t[i, j] = t[i, j - 1]) or (t[i, j] = t[i + 1, j]) or (t[i, j] = t[i - 1, j]) do begin
     
                             inc(t[i, j]);
     
                       end;
     
                    end;
     
                    if (j = 2) and (i = 3) then begin
     
                       while (t[i, j] = t[i, j + 1]) or (t[i, j] = t[i, j - 1]) or (t[i, j] = t[i - 1, j]) or (t[i, j] = t[i - 2, j]) do begin
     
                             inc(t[i, j]);
     
                       end;
     
                    end;
     
                    if (j = 3) and (i = 1) then begin
     
                       while (t[i, j] = t[i, j - 1]) or (t[i, j] = t[i, j - 2]) or (t[i, j] = t[i + 1, j]) or (t[i, j] = t[i + 2, j]) do begin
     
                             inc(t[i, j]);
     
                       end;
     
                    end;
     
                    if (j = 3) and (i = 2) then begin
     
                       while (t[i, j] = t[i, j - 1]) or (t[i, j] = t[i, j - 2]) or (t[i, j] = t[i + 1, j]) or (t[i, j] = t[i - 1, j]) do begin
     
                             inc(t[i, j]);
     
                       end;
     
                    end;
     
                    if (j = 3) and (i = 3) then begin
     
                       while (t[i, j] = t[i, j - 1]) or (t[i, j] = t[i, j - 2]) or (t[i, j] = t[i - 1, j]) or (t[i, j] = t[i - 2, j]) do begin
     
                             inc(t[i, j]);
     
                       end;
     
                    end;
     
                 end;
     
                 if t[i, j] > 3 then begin
     
                    t[i, j] := 0;
     
                    dec(i);
     
                    if i < 1 then begin
     
                       i := 3;
     
    		           dec(j);
     
                       if j < 1 then begin
     
                          erreur('Ce tableau est impossible !');
     
                       end;
     
                    end;
     
                    while (t[i, j] <> 0) and (t[i, j] = s[i, j]) do begin
     
                          dec(i);
     
                          if i < 1 then begin
     
                             i := 3;
     
    			             dec(j);
     
                             if j < 1 then begin
     
                                erreur('Ce tableau est impossible !');
     
                             end;
     
                          end;
     
                    end;
     
                    goto 1;
     
                 end;
     
             end;
     
         end;
     
    end;
    Mais j'ai un souci majeur concernant cette procédure, c'est que si je veux changer le n (ici n est une constante égale à 3) en une valeur supérieure, alors il me faut réécrire beaucoup plus de lignes (ici 9 test mais imaginons un tableau de 9 par 9 cases il faudrait 81 tests !!! ). Pouvez vous m'indiquer une méthode pour optimiser ce code pour ne pas avoir de problèmes lors du changement de la constante n ?

    Merci d'avance pour vos réponse !!

  2. #2
    ALT
    ALT est déconnecté
    Membre Expert
    Avatar de ALT
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2002
    Messages
    1 343
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 343
    Par défaut
    Petite piste de réflexion :
    - Pourquoi autant de tests ?
    - Que se passerait-il s'il y avait, par exemple 4x4 cases ? 5x5 ?
    - Entre autres, est-ce que le traitement pour les cases "du milieu" ne serait-il pas commun à toutes ces cases ?
    - Ensuite, quoi de commun entre toutes les cases des bords ?
    - Comment traiter de façon identique toutes ces cases ?

    À la fin de cette étude, ton code sera plus simple & plus clair.

    Bon courage

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 28
    Par défaut
    Petite absence ce week-end...

    Alors alors ça parais compliqué tout ca... Surtout que ce programme je l'ai eu sous le nez durant quelques heures et la je ne vois plus trop autrement que ce que j'ai fait... Je n'arrive pas a voir aussi ce qui se passe d'identique dans les cases externe (ou du bord comme tu l'a dit précédemment) et dans celles du "milieu"... et le seul moyen, pour moi , de trouver un moyen de traiter toutes les cases de la même manière est de faire une boucle qui englobe ma procédure en écrivant un seul test qui variera en fonction de cette boucle mais le souci c'est que même ca je n'arrive plus à trouver... help help

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

    Informations forums :
    Inscription : Octobre 2004
    Messages : 633
    Par défaut
    Bonjour,

    Commençons par optimiser l'écriture du code :

    pourquoi toutes ces lignes vides ?

    Certes, il en faut un peu pour aérer le code, mais une ligne vide sur 2, ça ne fait que rendre le code moins lisible (comme ceux de tous, mon écran n'est pas extensible, et je n'ai pas les moyens de me payer un 46 pouces 4000 * 3000 )

    Et virer ce goto qui me défrise.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 28
    Par défaut
    beu le goto ca te défrise ?

    Enfait c'est le seul truc qui me paraissais possible pour ca...

    Pour les lignes vides en fait je crois que c'est quand j'ai fait le copié-collé... eheh

    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
    75
    76
    77
    78
    79
    80
    81
     
    procedure resolution(var t : tableau);
    label 1;
    var i, j : integer;
    begin
         for j := 1 to n do begin
             for i := 1 to n do begin
                 if t[i, j] = 0 then begin
                    1:
                    inc(t[i, j]);
                    if (j = 1) and (i = 1) then begin
                       while (t[i, j] = t[i, j + 1]) or (t[i, j] = t[i, j + 2]) or (t[i, j] = t[i + 1, j]) or (t[i, j] = t[i + 2, j]) do begin
                             inc(t[i, j]);
                       end;
                    end;
                    if (j = 1) and (i = 2) then begin
                       while (t[i, j] = t[i, j + 1]) or (t[i, j] = t[i, j + 2]) or (t[i, j] = t[i + 1, j]) or (t[i, j] = t[i - 1, j]) do begin
                             inc(t[i, j]);
                       end;
                    end;
                    if (j = 1) and (i = 3) then begin
                       while (t[i, j] = t[i, j + 1]) or (t[i, j] = t[i, j + 2]) or (t[i, j] = t[i - 1, j]) or (t[i, j] = t[i - 2, j]) do begin
                             inc(t[i, j]);
                       end;
                    end;
                    if (j = 2) and (i = 1) then begin
                       while (t[i, j] = t[i, j + 1]) or (t[i, j] = t[i, j - 1]) or (t[i, j] = t[i + 1, j]) or (t[i, j] = t[i + 2, j]) do begin
                             inc(t[i, j]);
                       end;
                    end;
                    if (j = 2) and (i = 2) then begin
                       while (t[i, j] = t[i, j + 1]) or (t[i, j] = t[i, j - 1]) or (t[i, j] = t[i + 1, j]) or (t[i, j] = t[i - 1, j]) do begin
                             inc(t[i, j]);
                       end;
                    end;
                    if (j = 2) and (i = 3) then begin
                       while (t[i, j] = t[i, j + 1]) or (t[i, j] = t[i, j - 1]) or (t[i, j] = t[i - 1, j]) or (t[i, j] = t[i - 2, j]) do begin
                             inc(t[i, j]);
                       end;
                    end;
                    if (j = 3) and (i = 1) then begin
                       while (t[i, j] = t[i, j - 1]) or (t[i, j] = t[i, j - 2]) or (t[i, j] = t[i + 1, j]) or (t[i, j] = t[i + 2, j]) do begin
                             inc(t[i, j]);
                       end;
                    end;
                    if (j = 3) and (i = 2) then begin
                       while (t[i, j] = t[i, j - 1]) or (t[i, j] = t[i, j - 2]) or (t[i, j] = t[i + 1, j]) or (t[i, j] = t[i - 1, j]) do begin
                             inc(t[i, j]);
                       end;
                    end;
                    if (j = 3) and (i = 3) then begin
                       while (t[i, j] = t[i, j - 1]) or (t[i, j] = t[i, j - 2]) or (t[i, j] = t[i - 1, j]) or (t[i, j] = t[i - 2, j]) do begin
                             inc(t[i, j]);
                       end;
                    end;
                 end;
                 if t[i, j] > 3 then begin
                    t[i, j] := 0;
                    dec(i);
                    if i < 1 then begin
                       i := 3;
    		           dec(j);
                       if j < 1 then begin
                          erreur('Ce tableau est impossible !');
                       end;
                    end;
                    while (t[i, j] <> 0) and (t[i, j] = s[i, j]) do begin
                          dec(i);
                          if i < 1 then begin
                             i := 3;
    			             dec(j);
                             if j < 1 then begin
                                erreur('Ce tableau est impossible !');
                             end;
                          end;
                    end;
                    goto 1;
                 end;
             end;
         end;
    end;

  6. #6
    Membre expérimenté Avatar de Ultima
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    223
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2006
    Messages : 223
    Par défaut
    Bonjour,

    Il est vrai que goto est un élément du langage pascale, mais il est totalement déconseillé, voir interdit, de l’utiliser . La raison en est simple : il y a des centaines de manière d’optimiser un code sans utiliser goto.

    J'ai une idée pour optimiser ton programme mais j'aimerai que tu m'explique éxactement, c-a-d clairement ce que la procedure resolution doit faire.

    Salut.

Discussions similaires

  1. Optimisation d'un code SQL
    Par Myriam25 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 29/11/2007, 11h14
  2. [Optimisation C++] Calcul code altitude
    Par Spout dans le forum C++
    Réponses: 7
    Dernier message: 13/11/2007, 22h17
  3. Y a-t-il une solution pour optimiser mon petit code ?
    Par pierre987321 dans le forum Delphi
    Réponses: 20
    Dernier message: 14/06/2007, 10h53
  4. Optimisation de mon code ActionScript
    Par amnesias dans le forum Flash
    Réponses: 9
    Dernier message: 01/04/2007, 22h04
  5. [MMX] Optimisation d'un code C++ -> plus lent
    Par Laurent Gomila dans le forum x86 32-bits / 64-bits
    Réponses: 12
    Dernier message: 17/05/2006, 18h47

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