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

Turbo Pascal Discussion :

Calculer le max de chaque ligne d'un tableau puis le min de ces max [Turbo Pascal]


Sujet :

Turbo Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2014
    Messages : 19
    Par défaut Calculer le max de chaque ligne d'un tableau puis le min de ces max
    Salut
    Voilà, j'ai un petit problème avec ce programme en Turbo Pascal (un programme qui permet de calculer le max de chaque ligne et après le min de ces max). Ce qu'il y a, c'est que quand j'exécute, quand j'entre les valeurs max de chaque ligne en premier le programme ne les affiche pas mais si j'entre ces valeurs au milieu ou à la fin ils seront affichés .....
    Voici mon programme.
    Vous pouvez essayer de l'exécuter en entrant ces valeurs :
    5 8 4
    3 9 7
    2 1 6
    et il va s'exécuter normalement ; au contraire, si vous entrez ces valeurs :
    8 5 4
    9 3 7
    2 1 6
    vous remarquez la différence : il n'y a que le 6 qui apparaît ......
    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
    progiram heh;
    uses crt;
    var [1..10,1..10] of integer; i,i:integer;
    max,min:array[1..100] of integer;
    begin
    clrscr;
    for i:=1 to 3 do 
    for j:=1 to 3 do begin
    read (t[i,j]);
    end;
    for i :=1 to 3 do begin
    max[i]:=t[i,1];
    end;
    for i:=1 to 3 do 
    for j :=2 to 3 do begin
    if t[i,j]>max[i] then begin max[i]:=t[i,j];
    write('le max est', ' ',max[i]);
    end; end;
    min[i]:=max[1];
    for i:=1 to 3 do begin
    if min[i]>max[i] then min(i]:=max[i];
    write(le min des max est', ' ',min [i]);
    end;
    readln;readln;
    end.
    Merci pour votre aide

  2. #2
    Membre chevronné
    Homme Profil pro
    .
    Inscrit en
    Juin 2002
    Messages
    239
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : .
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2002
    Messages : 239
    Par défaut
    Bonjour.

    Pour bien comprendre ce qui se passe, il faut INDENTER !

    C'est une habitude qu'il faut prendre, car cela permet de voir les erreurs et cela facilite la maintenance.
    Et c'est indispensable quand il y a des blocs imbriqués comme c'est le cas ici.

    Le bloc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for i:=1 to 3 do 
    for j :=2 to 3 do begin
    if t[i,j]>max[i] then begin max[i]:=t[i,j];
    write('le max est', ' ',max[i]);
    end; end;
    n'est pas indenté, ce qui ne permet pas de voir facilement ce qu'il fait.

    Si on l'indente, on obtient çà :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    for i:=1 to 3 do 
        for j :=2 to 3 do 
            begin
                 if t[i,j]>max[i] 
                    then begin 
                               max[i]:=t[i,j];
                               write('le max est', ' ',max[i]);
                         end; 
            end;
    Il apparaît alors clairement que l'instruction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    write('le max est', ' ',max[i]);
    n'est pas placée là où il faudrait.

    Le bloc correct est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for i:=1 to 3 do 
        begin
             for j :=2 to 3 do 
                 if t[i,j]>max[i] then max[i]:=t[i,j];
             write('le max est', ' ',max[i]);
        end;
    Quant à l'instruction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    write('le max est', ' ',max[i]);
    elle pourrait être remplacée par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    writeln('le max de la ligne ',i,' est ',max[i]);

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2014
    Messages : 19
    Par défaut
    Oui c'est vrai mais pourquoi ne met-on pas un begin après then ??

  4. #4
    Membre chevronné
    Homme Profil pro
    .
    Inscrit en
    Juin 2002
    Messages
    239
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : .
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2002
    Messages : 239
    Par défaut
    Les mots clés " begin " et " end " servent à regrouper plusieurs instructions en une seule.

    S'il n'y a qu'une seule instruction après le " then ", il sont inutiles.

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2014
    Messages : 19
    Par défaut
    Je suis désolé, Prof, je vous ai cassé la tête mais vraiment je n'ai pas compris pourquoi on met le begin après la boucle i et non pas après la boucle j ?? J'ai besoin de votre aide, svp.

  6. #6
    Membre éprouvé Avatar de Modulpro
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2010
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2010
    Messages : 76
    Par défaut
    Bonjour,

    Comme Prof l'a expliqué, les mots clés BEGIN et END servent à créer un "bloc" d'instructions, donc regrouper ensemble plusieurs instructions.

    Lors de l'exécution d'une boucle, seul le bloc qui suit la ligne du for est répété. Il y a alors deux possibilités, selon ce que doit faire le programme :
    - sois la boucle ne doit contenir qu'une seule instruction, il n'y a alors pas besoin de BEGIN et END,
    - sois la boucle comporte plusieurs instructions, il est alors impératif de les regrouper dans un bloc BEGIN...END. Si cela n'est pas fait, seul la première des instructions sera exécutée plusieurs fois (c'est une erreur courante)

    Il est à noter que dans le premier cas, il est également possible de mettre BEGIN et END. On obtient alors un bloc composé d'une seule instruction. Il est même souvent recommandé de le faire pour éviter les erreurs (si l'on veut par exemple ajouter par la suite une deuxième instruction à la boucle)

    Ainsi, dans le code suivant, l'instruction write('le max est', ' ',max[i]); est exécutée à chaque tour de la boucle i, mais pas lors de la boucle j (ce qui est le comportement souhaité ! )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for i:=1 to 3 do 
        begin
             for j :=2 to 3 do 
                 if t[i,j]>max[i] then max[i]:=t[i,j];
             write('le max est', ' ',max[i]);
        end;
    Ce code est donc équivalent à celui-là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    for i:=1 to 3 do 
        begin
             for j :=2 to 3 do 
                 begin
                     if t[i,j]>max[i] then max[i]:=t[i,j];
                 end;
             write('le max est', ' ',max[i]);
        end;

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL] Calculer une somme pour chaque ligne et colonne d'un tableau
    Par baggie dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 21/05/2010, 09h55
  2. Réponses: 1
    Dernier message: 30/11/2009, 15h29
  3. Réponses: 2
    Dernier message: 20/10/2008, 09h24
  4. Listbox dans chaques lignes d'un tableau
    Par benjamin-mermoz dans le forum ASP.NET
    Réponses: 1
    Dernier message: 24/06/2008, 15h39
  5. trait en dessous de chaque ligne d'un tableau
    Par auduma dans le forum Balisage (X)HTML et validation W3C
    Réponses: 7
    Dernier message: 14/04/2005, 13h51

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