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 :

Recherche du plus petit élément d'un tableau plus grand qu'une donnée


Sujet :

Pascal

  1. #1
    Membre du Club
    Inscrit en
    Octobre 2006
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 89
    Points : 53
    Points
    53
    Par défaut Recherche du plus petit élément d'un tableau plus grand qu'une donnée
    Bonjour,
    Je voudrais trouver parmi les valeurs d'un tableau, la valeur exactement plus grande qu'une valeur donnée. exemple pour être sûr de me faire comprendre;
    un tableau contient : 2 5 3 3 8 9
    si je donne à la procédure 5 elle doit trouver 8.
    J'ai des problèmes dans mon programme principal alors je vous demande de vérifier cette procédure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    procedure mppm(table: tab; n: integer; var x:integer);
    var i,min:integer;
    begin
    min:=maximum(table,n);
    for i:=1 to n do if (table[i]>x) and (table[i]<min) then min:=table[i];
    x:=min;
    end;
    j'utilise une procédure et non une fonction pour pouvoir exécuter le traitement autant de fois que je veux à l'aide d'une boucle "for" : for i:= 1 to k do mppm(t,n,x);


    Merci.
    Écrire une procédure dont le temps de création dépend essentiellement de ma vitesse de frappe au clavier n'a pas le moindre intérêt !
    --- droggo.

  2. #2
    Expert confirmé
    Avatar de krachik
    Inscrit en
    Décembre 2004
    Messages
    1 964
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 964
    Points : 4 015
    Points
    4 015
    Par défaut
    Je voudrais trouver parmi les valeurs d'un tableau, la valeur exactement plus grande qu'une valeur donnée. exemple pour être sûr de me faire comprendre;
    un tableau contient : 2 5 3 3 8 9
    si je donne à la procédure 5 elle doit trouver 8.
    juste une chose pourquoi ne pas trier ton tableau et de recuperer apres l'element qui suit l'element donné?

    j'utilise une procédure et non une fonction pour pouvoir exécuter le traitement autant de fois que je veux à l'aide d'une boucle "for" : for i:= 1 to k do mppm(t,n,x);
    ta boucle n'est pas tres ulise du moment ou tu ne passes meme pas i en parametre,ta procedure va juste faire la meme chose k fois
    par contre tu pouras utiliser une fonction qui te renvoi le nombre que tu cherches simplement
    Aussi indente bien ton code il sera plus lisible pour tout le monde et pour toi et c'est mieux de mettre comme variable max au lieu de min juste pour ne pas tromper son attention
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    procedure mppm(table: tab; n: integer; var x:integer);
    var i,max:integer;
    begin
       max:=maximum(table,n);
       for i:=1 to n do 
             if (table[i]>x) and (table[i]<max) 
             then max:=table[i];
       x:=max;
    end;
    montres aussi ce que tu fais dans le programme principal
    Je suis ce que je suis grâce à ce que nous sommes tous Humanité aux Humains!! !

    Entre ce que je pense, ce que je veux dire, ce que je crois dire, ce que je dis ce que vous avez envie d'entendre, ce que vous croyez entendre, ce que vous entendez, ce que vous avez envie de comprendre, ce que vous comprenez ... Il y a dix possibilités que nous ayons des difficultés à communiquer. Mais essayons quand meme ....... E. Wells

  3. #3
    Membre du Club
    Inscrit en
    Octobre 2006
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 89
    Points : 53
    Points
    53
    Par défaut
    Je cherche une solution sans trier le tableau, celle avec je l'ai déjà trouvée. J'ai aussi trouvé une autre solution mais je la juge trop lente car pour trouver le suivant élément, elle cherche élément + 1 dans le tableau puis élément + 2 puis +3 et ainsi de suite jusqu'à trouver un élément...
    J'aimerai à présent me concentrer sur celle là;
    ta boucle n'est pas tres ulise du moment ou tu ne passes meme pas i en parametre,ta procedure va juste faire la meme chose k fois
    Je ne vois pas pourquoi! Si la procédure permet de trouver le plus petit élément plus grand que x, que je lui passe le minimum du tableau la première fois et que une fois trouvé, x prend la valeur cherchée, pourquoi ne puis-je pas repeter ce traitement ?
    Écrire une procédure dont le temps de création dépend essentiellement de ma vitesse de frappe au clavier n'a pas le moindre intérêt !
    --- droggo.

  4. #4
    Expert confirmé
    Avatar de krachik
    Inscrit en
    Décembre 2004
    Messages
    1 964
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 964
    Points : 4 015
    Points
    4 015
    Par défaut
    alors juste avant de continuer il faut qu'on d'accord sur certains points:
    Je voudrais trouver parmi les valeurs d'un tableau, la valeur exactement plus grande qu'une valeur donnée.
    for i:= 1 to k do mppm(t,n,x);
    tu repetes ta procedure k fois (parce que tu ne passes pas en parametre i et qu'il y a deja une boucle dans ta procedure

    Question :que fait ta fonction maximum? et c'est quoi la variable x(je suppose que c'est le nombre donné)?

    x prend la valeur cherchée, pourquoi ne puis-je pas repeter ce traitement ?
    pour trouver koi?(tel que c'est fait la meme chose)
    Je suis ce que je suis grâce à ce que nous sommes tous Humanité aux Humains!! !

    Entre ce que je pense, ce que je veux dire, ce que je crois dire, ce que je dis ce que vous avez envie d'entendre, ce que vous croyez entendre, ce que vous entendez, ce que vous avez envie de comprendre, ce que vous comprenez ... Il y a dix possibilités que nous ayons des difficultés à communiquer. Mais essayons quand meme ....... E. Wells

  5. #5
    Membre du Club
    Inscrit en
    Octobre 2006
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 89
    Points : 53
    Points
    53
    Par défaut
    la fonction maximum me donne le maximum du tableau

    j'ai mis var avant x c'est à dire qu'après le traitement procédural x va changer de valeur
    exemple : 5 2 6 3 6 7
    si je fais mppm(t,n,2)
    x prend 3
    si je fais for i:=1 to 3 do mppm(t,n,2) j'ai envie de trouver x=6
    Écrire une procédure dont le temps de création dépend essentiellement de ma vitesse de frappe au clavier n'a pas le moindre intérêt !
    --- droggo.

  6. #6
    Membre du Club
    Inscrit en
    Octobre 2006
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 89
    Points : 53
    Points
    53
    Par défaut
    alors voici tout le programme
    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
     
    program KPPE;
    uses wincrt;
    type tab=array[1..100] of integer;
    procedure remptab(table:tab;n:integer);
    var i:integer;
    begin
    for i:=1 to n do
           begin
           write('valeur numéro ', i,' du tableau : ');
           read(table[i]);
           end;
    for i:=1 to n do write(table[i]:6);
    end;
    function maximum(table :tab; n:integer):integer;
    var max,m,i:integer;
    begin
    m:=table[1];
    for i:=1 to n do if table[i]>m then m:=table[i];
    max:=m;
    end;
    function minimum(table:tab; n:integer):integer;
    var i,c:integer;
    begin
    c:=table[1];
    for i:=1 to n do if table[i]<c then c:=table[i];
    minimum:=c;
    end;
     
     
     
     
    function DF(table:tab; n:integer):integer;
    var CF:boolean; i,j,c,f:integer;
    begin
    CF:=true;	
    f:=1;
    for i:=1 to n do
    	begin
    	CF:=true;
    	for j:=1 to i-1 do if table[j]=table[i] then CF:=false;
    	if CF then for c:=(i+1) to n do if table[i]=table[c] then f:=f+1;
    	end;
    DF:=n-f;
    end;
     
    var
    t:tab; i,k,y,a,n:integer;
    begin
    repeat
    write('quelle est la longueur du tableau (n)?   ');
    read(n);
    until n in [2..20];
    remptab(T,n);
    writeln(chr(13),' k? ' );
    readln(k);
    if not k in [1..DF(T,n)] then writeln('Pas de ',k,'ième plus petit élément!') 
    else
    begin
    y:=minimum(T,n)-1;
    for i:=1 to k do mppm(T,n,y);
    repeat a:=a+1 until T[a]=y;
    writeln('Le ',k,'ième plus petit élément est  ',y, ' et l''indice de sa première apparition est ',a,'.');
    end
    end.
    Écrire une procédure dont le temps de création dépend essentiellement de ma vitesse de frappe au clavier n'a pas le moindre intérêt !
    --- droggo.

  7. #7
    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,

    Il faudrait que tu mettes ton programme en forme :

    - indentation propre et régulière (fais-le, tu verras que ça te simplifiera la vie)

    - pourquoi parfois 3 ou 4 lignes pour séparer les fonctions, et très souvent aucune (je suggère 1 ligne vide entre chaque fonction)

    - des sauts de ligne pour éclaircir tout ça (pas trop, les lignes vides diminuent la visibilité du code, nos écrans n'étant pas extensibles).

    - et, bien entendu, des commentaires. Il faut prendre l'habitude de le faire immédiatement, même s'il s'agit d'un commentaire simplifié, destiné à être complété plus tard.
    A l'usage, tu verras que c'est utile, ne serait-ce que pour faciliter la lecture et la compréhension pour autrui, ainsi que pour toi, si tu dois reprendre un programme après une longue interruption.


    Quand tu écris
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    procedure remptab(table:tab;n:integer);
    es-tu conscient que ta procédure va travailler sur une copie locale de ton tableau passé en paramètre (en clair, ton tableau original n'est pas modifié).
    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.

  8. #8
    Membre du Club
    Inscrit en
    Octobre 2006
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 89
    Points : 53
    Points
    53
    Par défaut
    Oui quelle bêtise! En plus ce n'est pas la première fois.
    Je suis très content, ça marche enfin et mon raisonnement était donc correct!!

    L'indentation :
    Quand je fais une boucle "for" avec une seule ligne de traitement, je la mets juste derrière le "do" ou alors je saute une ligne?
    exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for i:=1 to 4 do if CF then T[i]:=T[i-1];
    PS : j'ai lu en octobre un cours sur l'indentation ici j'en ai retenu des choses comme "il ne faut pas mettre if CF=true then... mais plutôt if CF then ..." ou encore "éviter les sauts de ligne qui ne servent à rien"...
    Dois-je le relire d'après-vous?

    Merci beaucoup de votre soutien.
    Écrire une procédure dont le temps de création dépend essentiellement de ma vitesse de frappe au clavier n'a pas le moindre intérêt !
    --- droggo.

  9. #9
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 944
    Points : 59 430
    Points
    59 430
    Billets dans le blog
    2
    Par défaut
    Pour ton information, Philippe Gormand a rassemblé une série de conseils d'écriture en Pascal :
    http://philippe-gormand.developpez.c...i/Indentation/
    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
    La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]

  10. #10
    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,

    Le problème du passage de paramètres en oubliant var est une erreur courante quand on débute, et on passe souvent du temps à comprendre ce qui se passe, puisqu'on a l'impression de disposer du tableau.

    Pour la présentation du code, l'impératif est d'indenter correctement : chaque bloc de code doit être décalé par rapport au bloc qui le contient.

    Les lignes vides ne doivent pas être trop nombreuses, seulement pour mettre des limites claires à des blocs de code (par exemple, pour séparer le code des différentes fonctions/procédures).

    Citation Envoyé par katrena99
    PS : j'ai lu en octobre un cours sur l'indentation ici j'en ai retenu des choses comme "il ne faut pas mettre if CF=true then... mais plutôt if CF then ..."
    Ça, ce n'est pas un problème d'indentation, mais de codage, et ça vient d'un codage en C, pas en Pascal.

    En Pascal, il faut écrire
    En C, écrire
    marche parce que false = 0, true = 1, et que le C considère comme vraie toute valeur <> 0.
    Mais je déconseille cette notation, même si elle est correcte.

    Citation Envoyé par katrena99
    "éviter les sauts de ligne qui ne servent à rien"
    C'est exact, mais il reste utile d'en mettre de temps en temps, pour éclaircir le code (uniquement si ç'est utile, par exemple pour séparer le code de 2 fonctions, etc...)
    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.

  11. #11
    Expert confirmé
    Avatar de krachik
    Inscrit en
    Décembre 2004
    Messages
    1 964
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 964
    Points : 4 015
    Points
    4 015
    Par défaut
    Bonjour
    En Pascal, il faut écrire

    Code :
    if CF=true then...
    mais c'est pareil de que d'ecrire
    si on omet le =true le compilateur le fait par defaut donc il n'est pas nécéssaire (je parle bien de PASCAL)
    Je suis ce que je suis grâce à ce que nous sommes tous Humanité aux Humains!! !

    Entre ce que je pense, ce que je veux dire, ce que je crois dire, ce que je dis ce que vous avez envie d'entendre, ce que vous croyez entendre, ce que vous entendez, ce que vous avez envie de comprendre, ce que vous comprenez ... Il y a dix possibilités que nous ayons des difficultés à communiquer. Mais essayons quand meme ....... E. Wells

  12. #12
    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 krachik
    Bonjour

    mais c'est pareil de que d'ecrire
    si on omet le =true le compilateur le fait par defaut donc il n'est pas nécéssaire (je parle bien de PASCAL)
    Es-tu sûr que c'est standard ?
    Moi je veux bien, mais ça ne correspond pas à ce que j'ai appris en Pascal.

    De toute manière, comme je l'ai déjà précisé, je n'encourage pas l'utilisation d'expressions utilisant le principe "bof, le compilateur s'en occupe".
    Pour quelques caractères à taper de plus, on peut rendre le code plus évident à lire.
    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.

  13. #13
    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,

    Rapport à mon message précédent : oups, au temps pour moi.

    J'étais parti sur l'idée que dans
    CF était un entier, je me demande d'ailleurs encore pourquoi.

    Bref, cette notation est effectivement parfaitement valide et standard, même sans les parenthèses (que j'ai l'habitude de toujours mettre, même si elles sont inutiles).
    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.

  14. #14
    Membre confirmé Avatar de Haywire
    Homme Profil pro
    Développeur Java
    Inscrit en
    Mars 2006
    Messages
    462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2006
    Messages : 462
    Points : 573
    Points
    573
    Par défaut
    Et je rajouterais que parfois si on nomme bien ses fonctions ça peut rendre le code plus lisible.
    exemple: une fonction qui dit si une liste est vide, on l'appele isEmpty ou estVide.
    Ensuite on peut ecrire: if estVide(maListe) then ....
    Ce qui sera plus facile a lire que : if estVide(Maliste) = true then ...
    Développeur écolo, je suis pour le développement durable.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 08/10/2010, 15h27
  2. Réponses: 3
    Dernier message: 05/12/2008, 03h39
  3. Réponses: 1
    Dernier message: 23/04/2007, 10h11
  4. Trouver le Kième plus petit élément d'un tableau
    Par katrena99 dans le forum Pascal
    Réponses: 10
    Dernier message: 15/11/2006, 23h36
  5. Réponses: 11
    Dernier message: 26/05/2006, 17h51

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