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 :

Transformer un nombre (obtenu par random) en élément d'une énumération


Sujet :

Langage Pascal

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 10
    Points : 7
    Points
    7
    Par défaut Transformer un nombre (obtenu par random) en élément d'une énumération
    Bonjour,
    J'ai un petit problème. J'aimerais faire un tirage aléatoire d'un jeu de carte. J'ai défini un record pour mes cartes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    program cartes; 
     
    type 
    ordreC=(T2,T3,T4,T5,T6,T7,T8,T9,T10,TV,TD,TR,TA, 
    K2,K3,K4,K5,K6,K7,K8,K9,K10,KV,KD,KR,KA, 
    C2,C3,C4,C5,C6,C7,C8,C9,C10,CV,CD,CR,CA, 
    P2,P3,P4,P5,P6,P7,P8,P9,P10,PV,PD,PR,PA,Vide); 
    carte =record 
    nom:ordreC; 
    end; 
    PaquetCartes = array[1..52] of carte;
    Cepedant je n'arrive pas à faire tirer une carte alétoire (random ne fonctionne pas) et que l'ordinateur me l'affiche. Pouvez-vous m'aider??

    Merci d'avance

  2. #2
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 464
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 464
    Points : 4 311
    Points
    4 311
    Par défaut
    Il faut spécifier randomize, avant de pouvoir utiliser random.

    C'est quoi qui ne fonctionne pas exactement ?
    M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    362
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 362
    Points : 419
    Points
    419
    Par défaut
    Sauf erreur, quand tu définis une énumération, tu disposes de l'instruction Inc.

    Cela doit te permettre de transformer un nombre (obtenu par random) en élément de ton énumération :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    UneCarte := T2 ;
    Inc(UneCarte,NombreAleatoire) ;
    Voici ce que dit Delphi sur Inc :

    Catégorie

    Routines scalaires

    Inc incréments X de 1 ou de N.

    procedure Inc(var X [ ; N: Longint ] );

    Description

    La procédure Inc ajoute un ou N à la variable X.

    X est une variable de type scalaire ou de type PChar si la syntaxe étendue est activée et si N est une expression de type entier. Inc peut être utilisée sur des types énumérés ou sur des variables pointeur. N'utilisez pas Inc sur des propriétés de type scalaire si la propriété utilise une procédure write.

    X s'incrémente d'une unité ou encore de N si N a été spécifié. Autrement dit, Inc(X) équivaut à l'instruction X*:= X + 1 et Inc(X, N) correspond à l'instruction X*:= X + N.

    Inc génère un code optimisé et s'avère particulièrement utile dans les boucles à exécution intensive.

    Remarque

    Inc(S, I) où S est un ShortInt et I un nombre supérieur à 127, provoquera le déclenchement d’une exception EIntOverflow si les vérifications de dépassement et d’étendue sont activées. Sous Delphi 1.0, aucune exception n’était déclenchée.

    Exemple

    var

    IntVar: Integer;
    LongintVar: Longint;
    begin
    Inc(IntVar); { IntVar := IntVar + 1 }
    Inc(LongintVar, 5); { LongintVar := LongintVar + 5 }
    end;

  4. #4
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 464
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 464
    Points : 4 311
    Points
    4 311
    Par défaut
    Autant passer par le tableau de cartes qu'il a défini: le type PaquetCartes.
    M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 10
    Points : 7
    Points
    7
    Par défaut
    Le problème c'est que le random ne fonctionne qu'avec des nombres par exemple random (100). DOnc si je mets random(paquetcarte) bah sa ne marche pas ....
    Donc il y aurait pas une autre fonction identique ???

  6. #6
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Hio,

    Si N est un nombre, tu peux le transtyper en ordreC:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ...
    var
      N : integer;
      c : ordreC;
    ...
      c := ordreC(N);
    ...
    Attention à être sûr que N ne sorte pas de la gamme de valeur imposée par ordreC.
    Si les cons volaient, il ferait nuit à midi.

  7. #7
    Rédacteur
    Avatar de darrylsite
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 299
    Points : 2 501
    Points
    2 501
    Par défaut
    Regarde un peu ce petit 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
     
    USES CRT;
    type
    ordreC=(T2,T3,T4,T5,T6,T7,T8,T9,T10,TV,TD,TR,TA, 
    K2,K3,K4,K5,K6,K7,K8,K9,K10,KV,KD,KR,KA, 
    C2,C3,C4,C5,C6,C7,C8,C9,C10,CV,CD,CR,CA, 
    P2,P3,P4,P5,P6,P7,P8,P9,P10,PV,PD,PR,PA,Vide);
    carte=record
              id:ordrec;
             end;
     
    {max_ordrec est le nombre des elements de ordrec+1}
     
    const  max_ordrec=52;
    tbl:array[0..max_ordrec] of ordrec=
    (T2,T3,T4,T5,T6,T7,T8,T9,T10,TV,TD,TR,TA, 
    K2,K3,K4,K5,K6,K7,K8,K9,K10,KV,KD,KR,KA,
    C2,C3,C4,C5,C6,C7,C8,C9,C10,CV,CD,CR,CA,
    P2,P3,P4,P5,P6,P7,P8,P9,P10,PV,PD,PR,PA,Vide);
    nom:array[0..max_ordrec] of string[20]=
    ('T2','T3','T4','T5','T6','T7','T8','T9','T10','TV','TD','TR','TA',
    'K2','K3','K4','K5','K6','K7','K8','K9','K10','KV','KD','KR','KA',
    'C2','C3','C4','C5','C6','C7','C8','C9','C10','CV','CD','CR','CA',
    'P2','P3','P4','P5','P6','P7','P8','P9','P10','PV','PD','PR','PA','Vide');
     
     
     
     
    var tcarte:array[1..max_ordrec] of CARTE;
         i,j,n  :integer;
         test:boolean;
    begin
    clrscr;
     
    for i:=1 to max_ordrec do
     tcarte[i].id:=tbl[random(max_ordrec+1)]  ;
     
    randomize;
     
    {on remplit le tableau au hazard.mais le tableau ne doit pas contenir
    deux meme element}
    for i:=1 to max_ordrec do
     begin
     test:=true;
     repeat
     n:=random(max_ordrec+1);
     {on verifie si cette carte exite deja dans le tableau}
     for j:=1 to i do
       if n=ord(tcarte[j].id) then
        test:=true;
    {on s'arrete si ce nombre ne se trouve pas dans le tableau}
     
       until test;
    {on insert cette carte dans le tableau}
       tcarte[i].id:=tbl[n];
     end;
     
    {notre tableau est enfin plein.on peut maintemant l' afficher}
    clrscr;
    for i:=1 to max_ordrec do
     write(nom[ord(tcarte[i].id)],' ');
     readln;
     
    END.

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    362
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 362
    Points : 419
    Points
    419
    Par défaut
    Citation Envoyé par wormful_sickfoot Voir le message
    Autant passer par le tableau de cartes qu'il a défini: le type PaquetCartes.
    Mon exemple visait juste à simplifier. On peut écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Var MonPaquet : PaquetCartes ;
     
    ...
    Randomize ;
    ...
    {Affectation de la ième carte du paquet}
    Monpaquet[i] := Inc(T2,random(100)) ;
    sans redéfinir un tableau avec toutes les cartes.

    Bien sûr, si on veut distribuer, il faudra comme Darylsite vérifier les doublons.

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 10
    Points : 7
    Points
    7
    Par défaut
    Merci à tous pour votre aide c'est sympa

    Darrylsite j'ai un petit problème avec ton programme en effet il ne m'affiche qu'environ 24 cartes et parfois j'ai deux fois la meme es-ce normal??

  10. #10
    Rédacteur
    Avatar de darrylsite
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 299
    Points : 2 501
    Points
    2 501
    Par défaut
    Il y' avait bien des doublons dans le tablau. J' ai revu le code et voila ce que ça donne:
    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
     
    USES CRT;
    type
    ordreC=(T2,T3,T4,T5,T6,T7,T8,T9,T10,TV,TD,TR,TA, 
    K2,K3,K4,K5,K6,K7,K8,K9,K10,KV,KD,KR,KA, 
    C2,C3,C4,C5,C6,C7,C8,C9,C10,CV,CD,CR,CA, 
    P2,P3,P4,P5,P6,P7,P8,P9,P10,PV,PD,PR,PA,Vide);
     
    carte=record
              id:ordrec;
             end;
     
    {max_ordrec est le nombre des elements de ordrec+1}
     
    const  max_ordrec=52;
     
    tbl:array[0..max_ordrec] of ordrec=
    (T2,T3,T4,T5,T6,T7,T8,T9,T10,TV,TD,TR,TA, 
    K2,K3,K4,K5,K6,K7,K8,K9,K10,KV,KD,KR,KA,
    C2,C3,C4,C5,C6,C7,C8,C9,C10,CV,CD,CR,CA,
    P2,P3,P4,P5,P6,P7,P8,P9,P10,PV,PD,PR,PA,Vide);
     
    nom:array[0..max_ordrec] of string[20]=
    ('T2','T3','T4','T5','T6','T7','T8','T9','T10','TV','TD','TR','TA',
    'K2','K3','K4','K5','K6','K7','K8','K9','K10','KV','KD','KR','KA',
    'C2','C3','C4','C5','C6','C7','C8','C9','C10','CV','CD','CR','CA',
    'P2','P3','P4','P5','P6','P7','P8','P9','P10','PV','PD','PR','PA','Vide');
     
    var tcarte:array[1..max_ordrec] of CARTE;
         i,j,n  :integer;
         test:boolean;
    begin
    clrscr;
    randomize; 
    for i:=1 to max_ordrec do
     tcarte[i].id:=tbl[random(max_ordrec+1)]  ;
     
    {on remplit le tableau au hazard.mais le tableau ne doit pas
     contenir de doublon}
    for i:=0 to max_ordrec do
     for j:=0 to max_ordrec do
      if i<>j then
        if tcarte[i].id=tcarte[j].id then begin
         repeat
          tcarte[j].id:=tbl[random(max_ordrec+1)]
         until tcarte[i].id<>tcarte[j].id ;
         i:=0;
         end;
     
    {notre tableau est enfin plein.on peut maintemant l' afficher}
    clrscr;
    for i:=0 to max_ordrec do
     write(nom[ord(tcarte[i].id)],' ');
     writeln;
     
    {on verifie s' il ya des doublons et on affiche leurs positions}
     for i:=0 to max_ordrec do
      for j:=0 to max_ordrec do
       if i<>j then
        if tcarte[i].id=tcarte[j].id then
         write(i,'  ',j,'...');
     readln;
     
    END.
    Le mieux sera de chercher à comprendre le code. Je suis toujours là si tu as des problemes avec le code.

  11. #11
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 10
    Points : 7
    Points
    7
    Par défaut
    Merci bien à toi, j'ai à peu près bien compris le code; cependant il me reste un petit truc, le prog de m'affiche que les valeurs de la fin du tableu c'est à dire de 30 à 52 à peu près....Et je ne vois pas d'ou cela vient...

  12. #12
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 10
    Points : 7
    Points
    7
    Par défaut
    Merci à toi
    J'ai réussi finalement à me mélanger ce foutu paquet de cartes

    Je vous met le code au besoin
    Cordialement

    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
    Unit Ucreer;
     
    interface
     
    const  max_ordrec=52;
     
     
         nom:array[1..max_ordrec] of string[2]=
    ('T2','T3','T4','T5','T6','T7','T8','T9','T10','TV','TD','TR','TA',
    'K2','K3','K4','K5','K6','K7','K8','K9','K10','KV','KD','KR','KA',
    'C2','C3','C4','C5','C6','C7','C8','C9','C10','CV','CD','CR','CA',
    'P2','P3','P4','P5','P6','P7','P8','P9','P10','PV','PD','PR','PA');
     
    type
    ordreC=(T2,T3,T4,T5,T6,T7,T8,T9,T10,TV,TD,TR,TA,
    K2,K3,K4,K5,K6,K7,K8,K9,K10,KV,KD,KR,KA,
    C2,C3,C4,C5,C6,C7,C8,C9,C10,CV,CD,CR,CA,
    P2,P3,P4,P5,P6,P7,P8,P9,P10,PV,PD,PR,PA);
     
    carte=record
              id:ordrec;
              nom:string[2];
             end;
     
             paquetcartes=array[1..max_ordrec] of carte;
     
     
     
    var paquet:paquetcartes;
     
        procedure creerpaquet(var paquet:paquetcartes);
        procedure melanger(var paquet:paquetcartes);
     
         implementation
     
    procedure creerpaquet(var paquet:paquetcartes);
    var o:ordrec;
        i:integer;
    begin
    i:=1;
    for o:=T2 to PA do
     begin
      paquet[i].id:=o  ;
      paquet[i].nom:=nom[i];
      i:=i+1;
     end;
     
    end;
     
    procedure melanger(var paquet:paquetcartes);
    var o:ordrec;
        i,j:integer;
        carTemp:carte;
    begin
    randomize;
    for i:=1 to max_ordrec do
     begin
      j:=random(max_ordrec)+1;
      carTemp:=paquet[i];
      paquet[i]:=paquet[j];
      paquet[j]:=carTemp;
     end;
     
    end;
     
     
    begin
     
    END.
    Cependant, j'ai un nombre problème...
    Je vous voudrais associer aux cartes un certain score par exemple le 2 vaut 2, le valet vaut 10...et je voudrais pouvoir aussi additionner ce score lorsque je prends 2 cartes....

  13. #13
    Expert confirmé
    Avatar de Loceka
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    2 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 2 276
    Points : 4 845
    Points
    4 845
    Par défaut
    Une façon simple serait de créer un ensemble (je n'ai pas pascal sous la main et j'ai oublié la déclaration). A partir de là l'indice de ta carte dans l'ensemble serait sa valeur. Dans la doc je sais que tu avais l'exemples avec les jours de la semaine ou les mois de l'année.

    Une autre façon, serait de déclarer une carte comme un "record" de "nom", "valeur".

    Tu peux aussi utiliser un tableau à 2 dimensions...

    bref, tu as vraiment le choix.

  14. #14
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 10
    Points : 7
    Points
    7
    Par défaut
    Merci à tous
    J'ai trouvé une solution j'ai défini précisément chaque carte avec un with

    with paquet [1] do
    ....

    comme cela tout est bien défini même si c'est un peu réberbatif pas de problème
    Cordialement,

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

Discussions similaires

  1. [Windows Phone 8] Comment modifier le style d'un élément de tableau obtenu par Binding ?
    Par gfaye dans le forum Windows Phone
    Réponses: 1
    Dernier message: 13/02/2014, 16h39
  2. Réponses: 9
    Dernier message: 09/01/2010, 04h52
  3. [Batch] Comparer Deux Nombres Généres par un RANDOM
    Par AZzjeioafh dans le forum Scripts/Batch
    Réponses: 2
    Dernier message: 22/09/2009, 20h19
  4. Récupérer les éléments d'une énumération
    Par The eye dans le forum VB.NET
    Réponses: 3
    Dernier message: 11/01/2007, 09h45
  5. [FOP] Transformation XML to PDF par FOP
    Par JustAGphy dans le forum Format d'échange (XML, JSON...)
    Réponses: 13
    Dernier message: 12/05/2004, 15h19

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