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

Langage Pascal Discussion :

[LG]Fonction random


Sujet :

Langage Pascal

  1. #1
    Membre à l'essai
    Inscrit en
    Février 2005
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 20
    Points : 13
    Points
    13
    Par défaut [LG]Fonction random
    Bonjour!

    J'ai commencé le pascal il y a une semaine et j'aimerais savoir 2 ou 3 petites choses :

    1) Quelle est la différence entre une fonction et une procédure (j'ai regardé le tuto de turbo pascal mais je ne saisis pas bien la différence).

    2) Comment puis-je utiliser la fonction random pour faire un remplissage de tableau par ex (remplir aléatoirement un tableau de 10X10 ne contenant que des 0 avec 35 nombres 1). Je sais qu'il faut utiliser le randomize au départ mais...je suis un peu perdu.

    Merci d'avance de bien vouloir me répondre même si je sais que je pose de bêtes questions.

  2. #2
    Membre éclairé

    Inscrit en
    Avril 2003
    Messages
    284
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 284
    Points : 773
    Points
    773
    Par défaut
    une fonction, c'est exactement la meme chose qu'une procedure, mais ça renvoie un resultat.

    Par exemple si tu as une procedure:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    procedure : diviserpar2(i : integer);
    begin
     i := i div 2;
    end;
    quand tu ecris dans ton code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    diviserpar2(MonEntier); // MonEntier etant une variable définie
                                       //auparavant et connue
    tu effectues un MonEntier := MonEntier div 2;


    Si tu crées une fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    function : TestDivisiblePar2(i : integer):boolean;
    begin
    TestdiviserPar2 := false;
     i := i div 2;
     if (i mod 2 =0) then TestdiviserPar2 := true;
    end;
    Là tu peux l'utiliser ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if TestdiviserPar2(MonEntier) then writeln ... etc...
    tu obtiens une nouvelle valeur pour MonEntier : MonEntier := MonEntier div 2
    et tu obtiens un resultat true ou false suivant que MonEntier mod 2 = 0 ou non.
    bref : non seulement tu fait la meme chose qu'avec la procedure (tu modifies MonEntier) mais tu as un resultat (ici un boolean) qui te permet de réagir en fonction...

    PS pour attribuer la valeur à la fonction j'ai utilisé le nom de cette dernière :
    par exemple dans l'expression :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TestdiviserPar2 := true;
    Certains compilateurs acceptent l'utilisation du terme générique result à la place, ie : Voili Voilo

  3. #3
    Membre à l'essai
    Inscrit en
    Février 2005
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 20
    Points : 13
    Points
    13
    Par défaut
    Merci

  4. #4
    Membre éclairé

    Inscrit en
    Avril 2003
    Messages
    284
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 284
    Points : 773
    Points
    773
    Par défaut
    Pour le remplissage de ton tableau je vai te le dire en français pour te laisser coder un peu

    Au début tu utilises juste une fois randomize pour que ta fonction random démarre par un nombre au hazard, sinon elle va toujours sortir la meme serie de nombres.
    Puis tu devrais faire une boucle jusquà ce que ...(toutes tes cases (35) soient remplies voir plus bas)
    dans cette boucle tu tires un nombre alléatoire compris entre les bonnes valeurs (deux nombres si tu utilises un tableau à deux dimensions), puis tu vas lire dans la case correspondant à ce (/ces) nombre(/s) aléatoire(/s). Si là case est vide (ou plus exactement, contient un zéro), tu mets un 1 dedans et tu dis que tu as rempli 1 case de plus.
    tu continues tant que tu n'a pas rempli 35 cases...

    Je préfère ne pas te donner un code tout fait pour te permettre de tester et d'apprendre.

    Demandes plus d'infos si tu as du mal.

    Clandestino.

  5. #5
    Membre expert
    Avatar de Eric Sigoillot
    Inscrit en
    Mars 2002
    Messages
    1 212
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 212
    Points : 3 369
    Points
    3 369
    Par défaut
    Ouh là là là là...
    Pas mal d'erreurs dans tout ça ! Y'a des choses à revoir...

    Tout d'abord, pour la différence fonctions / procédures, il suffisait d'aller consulter la FAQ Pascal dans laquelle se trouve la réponse
    http://pascal.developpez.com/faq/?pa...l#Diffprocfunc

    Citation Envoyé par Clandestino
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    procedure : diviserpar2(i : integer);
    begin
     i := i div 2;
    end;
    Ca, ce n'est pas du Pascal ! Je n'ai jamais vu trainer un signe deux-points après le mot réservé procedure ou function. La déclaration correcte, pour le moment, serait donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    procedure DiviserPar2(i: Integer);
    Citation Envoyé par Clandestino
    quand tu ecris dans ton code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    diviserpar2(MonEntier); // MonEntier etant une variable définie
                                       //auparavant et connue
    tu effectues un MonEntier := MonEntier div 2;
    Faux, complètement faux ! Tu confonds ici le passage des paramètres par valeur et le passage par adresse.
    Il faut relire ça : http://pascal.developpez.com/faq/?pa...l#Paramvaladdr

    L'appel de DiviserPar2(MonEntier) n'aura strictement aucun impact sur la valeur de MonEntier en sortie de procédure...
    Si on souhaite affecter la valeur de MonEntier, il faut passer le paramètre par adresse, en déclarant la procédure comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    procedure DiviserPar2(var i: Integer);
    Va falloir reprendre tout ça

    En ce qui concerne ton tableau à remplir de zéro et devant contenir 35 un placés aléatoirement, une piste de résolution...

    • Tout d'abord, initialiser le tableau avec des zéros (on peut utiliser FillChar, voir dans l'aide)
    • Initialiser une variable à zéro sensée contenir le nombre de 1 déjà placés dans le tableau
    • Créer une boucle, qui tant que la variable recensant le nombre de 1 placés est inférieure à 35, fait :[list:3a2b4c2e7d]
    • Tire une position au hasard avec Random
    • Teste si un 1 se trouve à cette position
      - Si oui, passer son chemin...
      - Si non, placer un 1 et incrémenter la valeur de la variable comptabilisant les 1 placés dans le tableau
    [/list:u:3a2b4c2e7d]

    N'hésite pas à reposer des questions...

    @++
    Règles du forum
    F.A.Q Pascal

    Pour me joindre (aucune question technique, merci)

  6. #6
    Membre à l'essai
    Inscrit en
    Février 2005
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 20
    Points : 13
    Points
    13
    Par défaut
    merci

  7. #7
    Membre à l'essai
    Inscrit en
    Février 2005
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 20
    Points : 13
    Points
    13
    Par défaut
    Est-ce quuelque chose dans ce style fonctionnerait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    type grille = array [1..10] of array [1..10] of integer;
    var tableau = grille;
    procedure tab35 (var : tableau : grille; x:integer);
    begin
         randomize;
         n:= 0;
         while &#40;n<35&#41; do
         begin
              a &#58;= random&#40;x&#41; +1;
              b &#58;= random&#40;x&#41; +1;
         end;
         tableau &#91;a,b&#93; &#58;= 1
    end.

  8. #8
    Membre expert
    Avatar de Eric Sigoillot
    Inscrit en
    Mars 2002
    Messages
    1 212
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 212
    Points : 3 369
    Points
    3 369
    Par défaut
    Citation Envoyé par platoon5
    Est-ce quuelque chose dans ce style fonctionnerait
    Le plus sûr est de tester dans ton cas !

    J'ai corrigé ton code, qui ne fonctionnera pas comme tu le souhaites, car il manque les tests dont j'ai parlé plus haut.

    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
     
    &#40;** Les types sont tres souvent noté avec un T comme premiere lettre en Pascal. C'est une bonne habitude à prendre.
    De plus, une structure array of array peut se simplifier en un seul array **&#41;
    type 
     TGrille = array&#91;1..10, 1..10&#93; of Integer;
     
    &#40;** Une variable se déclare avec NomVariable&#58; TypeVariable; **&#41;
    var
      Tableau&#58; TGrille;
     
    &#40;** Pourquoi un "&#58;" après var ??? 
    J'ai renommé le paramètre "tableau" pour éviter la confusion avec la variable globale **&#41;
    procedure Tab35&#40;var Tab&#58; TGrille; x&#58; Integer&#41;;
    &#40;** Déclaration de n, a et b **&#41;
    var
      n, a, b&#58; Integer;
    begin
      &#40;** Randomize est appelé en début de programme seulement &#58; je l'ai déplacé **&#41;
      &#123;randomize;&#125;
     
      n &#58;= 0;
      while n < 35 do
      begin
        a &#58;= Random&#40;x&#41; +1;
        b &#58;= Random&#40;x&#41; +1;
        &#40;** a et b ont été choisi, c'est ici qu'il faut toucher au tableau, pas en dehors de la boucle ! **&#41;
        Tab&#91;a, b&#93; &#58;= 1;
    &#40;** Il faut incrémenter n, et il manque le test de vérification dont j'ai parlé **&#41;
        Inc&#40;n&#41;;
      end;
    &#40;** C'est une procédure &#58; un ";" après le end... **&#41;
    end;
     
    &#40;** Où est le programme principal ??? Ajouté... **&#41;
    begin
      Randomize;
      Tab35&#40;Tableau, 10&#41;;
    end.
    Relis tout ça

    @++
    Règles du forum
    F.A.Q Pascal

    Pour me joindre (aucune question technique, merci)

  9. #9
    Membre éclairé

    Inscrit en
    Avril 2003
    Messages
    284
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 284
    Points : 773
    Points
    773
    Par défaut
    hihihi hdd34, (pardon pour le hors sujet)
    Tout a fait d'accord avec toi pour le ':' qui n'a rien a faire dans la declaration, j'ai ecrit ce truc directement en postant et je ne sais pas pourquoi j'ai mis un ':' là !!!

    Par contre, l'expression que tu cites comme fausse viendrait dans le corps du programme (j'ai dit 'dans ton code') et après la déclaration de la procedure précédemment décrite ( j'ai dit 'si tu as une procedure') ...

    Si tu me relis tu verras que je voulais dire : si tu as une procedure définie comme suit.... et que tu l'utilises comme celà ensuite... (dans le corps de ton programme.)

    j'ai pris volontairement une procedure et une fonctions avec un paramètre passé pour justement faire une distinction entre le resultat de la fonction, et son incidence sur un paramètre passé...

    J'ai appris quelque chose qui m'a étonné en te relisant: les compilateurs que j'utilise remplissent les tableaux d'entiers de zéros à leur création, je ne soupçonnais pas que ce ne soit pas automatique...

    Je me rends compte que je ne suis pas si clair que celà en voulant expliquer les choses... La pédagogie réclame de véritables dons... je tournerai 20 fois ma langue dans ma bouche la prochaine fois



    Clan

  10. #10
    Membre à l'essai
    Inscrit en
    Février 2005
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 20
    Points : 13
    Points
    13
    Par défaut
    Merci pour tes précieux conseils

  11. #11
    Membre à l'essai
    Inscrit en
    Février 2005
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 20
    Points : 13
    Points
    13
    Par défaut
    Est-ce quelque chose dans ce type pourrait marcher?

    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
     
    type grille = array &#91;1..10&#93; of array &#91;1..10&#93; of integer; 
    var tableau = grille; 
    procedure tab35 &#40;var tableau &#58; grille; x&#58;integer&#41;; 
    begin 
         randomize; 
         n&#58;= 0; 
         while &#40;n<35&#41; do 
         begin 
              a &#58;= random&#40;x&#41; +1; 
              b &#58;= random&#40;x&#41; +1; 
              tableau &#91;a,b&#93; &#58;=1
         while &#40;tableau &#91;a,b&#93; =1&#41; do
         begin 
              a &#58;= random&#40;x&#41; +1; 
              b &#58;= random&#40;x&#41; +1
         end;
                tableau &#91;a,b&#93; =1
    end.

  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,

    Manifestement, tu n'as pas lu, ou pas compris, ce que Hdd34 t'a expliqué sur les erreurs de ton code.

    Alors relis en essayant de comprendre, et demande plus de précisions si tu ne comprends pas.
    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 à l'essai
    Inscrit en
    Février 2005
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 20
    Points : 13
    Points
    13
    Par défaut
    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
     
    type Tgrille = array &#91;1..10&#93; of array &#91;1..10&#93; of integer; 
    var Tableau = Tgrille; 
    procedure Tab35 &#40;var Tableau &#58; Tgrille; x&#58;integer&#41;; 
    begin 
         randomize; 
         n&#58;= 0; 
         while &#40;n<35&#41; do 
         begin 
              n &#58;= n+1;
              a &#58;= random&#40;x&#41; +1; 
              b &#58;= random&#40;x&#41; +1; 
              if &#40;Tgrille &#91;a,b&#93; <>1&#41;;
              then begin Tgrille &#91;a,b&#93; &#58;=1
                      end
              else
         end;
    end;
    Si j'ai bien compris, mon tableau étant rempli de 0, la fonction random va me sortir un 0. A ce moment-là, je teste si Tgrille [a,b] contient déjà un 1.
    Si c'est le cas, je recommence la boucle. Si ce n'est pas le cas Tgrille[a,b] reçoit 1. Ainsi de suite jusque 35.

  14. #14
    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 platoon5
    Si j'ai bien compris, mon tableau étant rempli de 0
    Si tu ne remplis pas explicitement ton tableau avec des zéros, il va contenir n'importe quoi (mais ça peut dépendre du compilateur)

    Citation Envoyé par platoon5
    Si j'ai bien compris, mon tableau étant rempli de 0, la fonction random va me sortir un 0
    La fonction random n'a aucun rapport avec le contenu de ton tableau (dont le nom est Tableau, pas Tgrille).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ...
    var Tableau = Tgrille;
    ...
    Il faut écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ...
    var Tableau &#58; Tgrille;
    ...
    Normalement, randomize ne s'appelle qu'une fois, généralement au début du programme. Mais si c'est le seul endroit où tu utilises random, ce n'est pas génant.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
              ...
              if &#40;Tgrille &#91;a,b&#93; <>1&#41;;
              ...
    il ne faut pas de point virgule à la fin de la ligne, et le nom de la variable est Tableau, pas Tgrille, qui est son type.

    J'aurais plutôt écris quelque chose comme ceci:
    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
     
    &#123; il vaut toujours mieux utiliser une constante pour une valeur qu'on utilise en divers endroits du code &#58; il est ainsi beaucoup plus facile de modifier la valeur &#125;
     
    const AMAX = 10;
     
    type Tgrille = array &#91;1..AMAX&#93; of array &#91;1..AMAX&#93; of integer;
     
    var Tableau &#58; Tgrille;
     
    &#123; a priori, on n'a pas besoin de passer la valeur de la limite, et on assume que le tableau est rempli de zéros avant appel de la procedure &#125;
     
    procedure Tab35 &#40;var Tableau &#58; Tgrille&#41;;
    var a,b,n &#58; integer; &#123; ne pas oublier de déclarer les variables locales &#125;
    begin
         randomize;  &#123; à mettre ailleurs, probablement &#125;
         n&#58;= 1;
         while &#40;n<=35&#41; do
         begin
              a &#58;= random&#40;AMAX&#41; +1;
              b &#58;= random&#40;AMAX&#41; +1;
              if &#40;Tableau&#91;a,b&#93; = 0&#41; Tableau&#91;a,b&#93; &#58;=1;
              inc&#40;n&#41;;
         end;
    end;
    A noter que cette manière de faire ne te garantit pas que tu auras 35 valeurs mises à 1 dans ton tableau, car tu peux par hasard valider 2 ou plusieurs fois la même case. Si tu tiens à ce que 35 cases soient mises à 1, il faut écrire:
    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
     
    procedure Tab35 &#40;var Tableau &#58; Tgrille&#41;;
    var a,b,n &#58; integer; &#123; ne pas oublier de déclarer les variables locales &#125;
    begin
         randomize;  &#123; à mettre ailleurs, probablement &#125;
         n&#58;= 1;
         while &#40;n<=35&#41; do
         begin
              a &#58;= random&#40;AMAX&#41; +1;
              b &#58;= random&#40;AMAX&#41; +1;
              if &#40;Tableau&#91;a,b&#93; = 0&#41; then
              begin
                Tableau&#91;a,b&#93; &#58;=1;
                inc&#40;n&#41;;
              end;
         end;
    end;
    Voilà, j'espère que c'est clair.

    Petit conseil amical : je crois que tu as besoin de revoir les bases du Pascal avant de continuer (pour programmer correctement, il faut avoir un minimum de connaissances sur le langage utilisé).
    Les codes que tu as proposés ne doivent pas compiler, quel que soit ton compilateur (je n'ai pas testé, n'ayant pas de compilateur Pascal, mais à lire ce que tu écris...).
    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.

  15. #15
    Membre à l'essai
    Inscrit en
    Février 2005
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 20
    Points : 13
    Points
    13
    Par défaut
    Je suis d"solé mais comme écrit dans mon premier message j'ai commencé il y a très peu de temps.

  16. #16
    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 platoon5
    Je suis d"solé mais comme écrit dans mon premier message j'ai commencé il y a très peu de temps.
    Je sais bien que tu es débutant, mais ce n'est pas une raison pour reposter du code quasiment inchangé, avec toutes les erreurs qui l'empêchent de compiler déjà, et de fonctionner si jamais tu arrivais à le compiler, après avoir corrigé uniquement les erreurs de syntaxe.

    Hdd34 t'avais donné un programme corrigé, dont tu n'as tenu aucun compte.

    D'où question : pourquoi demander de l'aide si tu ne tiens pas compte des réponses obtenues ?

    Ce n'est pas ainsi que tu progresseras, alors fait un effort : apprendre à programmer ne s'improvise pas en faisant n'importe quoi, en espérant que ça va fonctionner.

    ps : ceci est ma dernière intervention dans ce sujet.
    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.

  17. #17
    Membre à l'essai
    Inscrit en
    Février 2005
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 20
    Points : 13
    Points
    13
    Par défaut
    Merci quand même.

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

Discussions similaires

  1. [Forth] Fonction random
    Par kamfezz dans le forum Autres langages
    Réponses: 3
    Dernier message: 16/04/2023, 15h33
  2. Problème fonction random avec linux
    Par fabetvince dans le forum C
    Réponses: 12
    Dernier message: 26/05/2006, 00h45
  3. [Fortran 77] Fonction random
    Par ajsd0208 dans le forum Fortran
    Réponses: 1
    Dernier message: 15/07/2005, 13h58
  4. [LG]Utilisation de la fonction Random
    Par chloe95 dans le forum Langage
    Réponses: 1
    Dernier message: 01/03/2005, 15h20
  5. Fonction Random en Assembleur
    Par chidi dans le forum Assembleur
    Réponses: 5
    Dernier message: 21/05/2004, 11h16

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