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

Free Pascal Discussion :

Gestion d'un tournoi de pétanque [Free Pascal]


Sujet :

Free Pascal

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Autodidacte passionné
    Inscrit en
    Novembre 2017
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : Belgique

    Informations professionnelles :
    Activité : Autodidacte passionné
    Secteur : Transports

    Informations forums :
    Inscription : Novembre 2017
    Messages : 10
    Points : 6
    Points
    6
    Par défaut Gestion d'un tournoi de pétanque
    Bonsoir,

    Alors voilà, je développe un logiciel de gestion de tournoi de pétanque, rien d'exceptionnel, mais voilà, je coince.

    Le plus gros est fait, ça tourne, mais il faut fignoler quelques détails, et parmi ces détails, celui-ci : le programme doit générer aléatoirement les matchs pour la première partie, et donc tirer au sort les équipes...

    A première vue, je gère, car en sortie de procédure de mélange des équipes (voir ci-dessous) tout est apparemment ok, sauf que plus loin, ça merde mais alors convenable...

    J'aurais donc voulu votre avis concernant cette fameuse procédure de mélange, est-ce qu'à votre avis tout est bon ?

    La voici :
    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
     
    procedure MelangeEquipes();
    var
      i, j, tmp : Integer;
      TabTmpBool : array of boolean;
      TabEquTmp : array of InfosEquipe;
      fini : boolean;
     
    begin
      SetLength(TabTmpBool, NbreEquipes+1);                                                             
      For i := 1 To NbreEquipes Do                                                                      
        TabTmpBool[i] := False;
      SetLength(TabEquRand, NbreEquipes+1);                                                             
      Randomize;                                                                                        
      tmp := random(NbreEquipes)+1;                                                                     
      TabEquRand[1] := tmp;                                                                             
      TabTmpBool[tmp] := true;
      fini := False;                                                                                    
      i := 2;
      Repeat
        tmp := random(NbreEquipes)+1;
        If TabTmpBool[tmp] = False Then
          begin
            TabEquRand[i] := tmp;
            TabTmpBool[tmp] := true;
          end
        Else i -= 1;
        For j := 1 To NbreEquipes Do
          If TabTmpBool[j] = False Then
            break
          Else
            If (TabTmpBool[j] = true) And (j = NbreEquipes) Then
              fini:= true;
        i += 1;
      Until fini = true;
      SetLength(TabEquTmp, NbreEquipes);
      For i := 0 To NbreEquipes - 1 Do
        For j := 1 To NbreEquipes Do
          If TabEquipes[i].Num = TabEquRand[j] Then
             TabEquTmp[j-1] := TabEquipes[i];
      SetLength(TabEquipes, 0);
      SetLength(TabEquipes, NbreEquipes);
      For i := 0 To NbreEquipes - 1 Do
        TabEquipes[i] := TabEquTmp[i];
    end;
    Bon, allez-y molo avec la critique, je me remets au développement après 25 ans sans avoir écrit une seule ligne de code hein...

    J'attends les avis...

    Merci.

  2. #2
    Futur Membre du Club
    Homme Profil pro
    Autodidacte passionné
    Inscrit en
    Novembre 2017
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : Belgique

    Informations professionnelles :
    Activité : Autodidacte passionné
    Secteur : Transports

    Informations forums :
    Inscription : Novembre 2017
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    Oups, et désolé mais au moment de l'envoi, c'était indenté...

  3. #3
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 068
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 068
    Points : 15 441
    Points
    15 441
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par philvani Voir le message
    Oups, et désolé mais au moment de l'envoi, c'était indenté...
    Bonjour ! Le problème vient du fait que vous n'avez pas utilisé les balises appropriées pour le code. Je les ai ajoutées.

    Ma première impression en survolant votre code, c'est qu'il est compliqué. Quelque chose me dit qu'il doit y avoir moyen de faire plus simple.

    Il y a au moins une erreur ici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      SetLength(TabTmpBool, NbreEquipes+1);                                                             
      For i := 1 To NbreEquipes Do                                                                      
        TabTmpBool[i] := False;
    La valeur de i devrait varier de 0 à NbreEquipes - 1. Les tableaux dynamiques commencent toujours à 0.

    Et pourquoi SetLength(TabTmpBool, NbreEquipes+1); ? Pourquoi pas SetLength(TabTmpBool, NbreEquipes); ?
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Autodidacte passionné
    Inscrit en
    Novembre 2017
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : Belgique

    Informations professionnelles :
    Activité : Autodidacte passionné
    Secteur : Transports

    Informations forums :
    Inscription : Novembre 2017
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par Roland Chastain Voir le message
    Bonjour ! Le problème vient du fait que vous n'avez pas utilisé les balises appropriées pour le code. Je les ai ajoutées.

    Ma première impression en survolant votre code, c'est qu'il est compliqué. Quelque chose me dit qu'il doit y avoir moyen de faire plus simple.

    Il y a au moins une erreur ici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      SetLength(TabTmpBool, NbreEquipes+1);                                                             
      For i := 1 To NbreEquipes Do                                                                      
        TabTmpBool[i] := False;
    La valeur de i devrait varier de 0 à NbreEquipes - 1. Les tableaux dynamiques commencent toujours à 0.

    Et pourquoi SetLength(TabTmpBool, NbreEquipes+1); ? Pourquoi pas SetLength(TabTmpBool, NbreEquipes); ?
    Bonsoir et merci pour les balises

    Ceci dit, pour les tableaux, je crois que j'ai commencé à utiliser les tableaux avec NbreEquipes + 1 simplement en continuant avec une erreur de débutant, j'essaie désormais de commencer avec 0, mais les erreurs de débutants ont la peau dure n'est-ce pas... Mais de toute façon, quoi qu'il en soit, même si je commence à stocker à l'indice 1 dans le tableau et que je commence à récupérer les données à l'indice 1, cela ne pose aucun problème si je ne m'abuse?

  5. #5
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 068
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 068
    Points : 15 441
    Points
    15 441
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par philvani Voir le message
    quoi qu'il en soit, même si je commence à stocker à l'indice 1 dans le tableau et que je commence à récupérer les données à l'indice 1, cela ne pose aucun problème si je ne m'abuse?
    Effectivement, ça ne pose aucun problème. Le terme d'erreur que j'ai employé sans réfléchir n'était pas le mot juste.

    Autrement, pour vous aider, ce serait plus facile (en tout cas pour moi) d'avoir un programme complet. Est-ce que vous pourriez ajouter, dans le code que vous avez posté, toutes les variables concernées, avec un petit programme principal qui montre ce que la procédure est supposée faire ?
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Autodidacte passionné
    Inscrit en
    Novembre 2017
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : Belgique

    Informations professionnelles :
    Activité : Autodidacte passionné
    Secteur : Transports

    Informations forums :
    Inscription : Novembre 2017
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    Ok, je vais tâcher de faire cela, mais pas avant jeudi soir, car là je vais plonger dans mes plumes et demain journée et soirée bien remplies...
    Bonne soirée et merci bien 😊

  7. #7
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 552
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 552
    Points : 3 918
    Points
    3 918
    Par défaut
    Salut


    En dehors d'hypothèse particulière, une idée sans doute simple consiste à créer un tableau de couple d'entier (Valeur, Indice) pour lesquels initialement Valeur prend une valeur aléatoire et Indice (ici le numéro de l'équipe) la valeur initiale de l'indice, il suffit de trier, les indices initiaux sont conservés mais déplacés, une petite procédure prend ensuite les équipes deux par deux :

    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
     
    #!/usr/bin/instantfpc
    {$mode objfpc}{$H+}
     
    uses
      SysUtils,
      math;
     
    const
      N = 50;
     
    Type
      TPaire = record
        Indice, Valeur: Integer;
      end;
     
      TMatch = record
        EqRivale1, EqRivale2 : Integer;
      end;
     
    procedure Tri(var t: Array of TPaire);
    begin
    // Blabla, trier les paires sur le membre Valeur
      // Trouver un algo sur le net.
    end;
     
    procedure Init(var t: Array of TPaire);
    var
      I: Integer;
      Taille: Integer;
    begin
      Randomize;
      Taille := High(t) - Low(T) + 1;
      for I := Low(T) to High(t) do
      begin
        t[I].Indice := I;
        t[I].Valeur := Random(Taille);
      end;
    end;
     
    procedure AssemblerMatchs(const Equipes: array of TPaire; var Matchs: Array of TMatch);
    var
       iEquipe, iMatch : Integer;
    begin
      iEquipe := Low(Equipes);
      for iMatch := Low(Matchs) to High(Matchs) do
      begin
        Matchs[iMatch].EqRivale1 := Equipes[iEquipe].Indice;
        Matchs[iMatch].EqRivale2 := Equipes[iEquipe + 1].Indice;
        Inc(iEquipe, 2);
      end;
    end;
     
    var
      Equipes : array of TPaire;
      Matchs : array of TMatch;
    begin
      SetLength(Equipes, N);
      SetLength(Matchs, N div 2); // de préférence un nombre pair, sinon il reste une équipe sur la touche ...
     
      Init(Equipes);
      Tri(Equipes);
      AssemblerMatchs(Equipes, Matchs);
    end.
    Le code n'est pas testé ni terminé, il suffit de reprendre un algo de tri sur le Net, il en existe peut être déjà dans FreePascal, je ne suis pas sûr, pas trop le temps de chercher.
    Il existe sans doute des procédure de tirage aléatoire plus efficace que Random mais je m'en suis contenté ici...

    L'ensemble me parait plus simple que ta solution et met en évidence les étapes des calculs. Il est aussi possible de s'en sortir avec un tableau de booléen, un tirage aléatoire et pourquoi pas le tout dans un énumérateur mais j'ai pas trop le temps ici.

    Cdlt

    M E N S . A G I T A T . M O L E M
    Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal

    "La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
    Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."

  8. #8
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 068
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 068
    Points : 15 441
    Points
    15 441
    Billets dans le blog
    9
    Par défaut
    Mon grain de sel.

    Soit 8 équipes, appelées A, B, C etc.

    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
     
    uses
      Math; { RandomRange }
     
    type
      TEquipe = char;
      TEquipes = array of TEquipe;
     
    function Pick(var aTableau: TEquipes; const aIndex: integer): TEquipe;
    begin
      result := aTableau[aIndex];
      aTableau[aIndex] := aTableau[High(aTableau)];
      SetLength(aTableau, High(aTableau));
    end;
     
    function RandomPick(var aTableau: TEquipes): TEquipe;
    begin
      result := Pick(aTableau, RandomRange(0, High(aTableau)))
    end;
     
    const
      { Équipes. }
      T1: array [0..7] of TEquipe = ('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H');
     
    var
      { Équipes à piocher. }
      T2: array of TEquipe;
      { Rencontres. }
      T3: array [0..3, 0..1] of TEquipe;
      i, j: integer;
     
    begin
      Randomize;
     
      { Remplir le tableau des équipes à piocher. }
      SetLength(T2, 8);
      Move(
        T1[0],
        T2[0],
        8
      );
     
      { Remplir le tableau des rencontres. }
      for i := 0 to 3 do
        for j := 0 to 1 do
          T3[i, j] := RandomPick(T2);
     
      for i := 0 to 3 do
        WriteLn(
          'rencontre n°', Succ(i),
          ' : équipe ', T3[i, 0],
          ' contre équipe ', T3[i, 1]
        );
    end.
    rencontre n°1 : équipe C contre équipe F
    rencontre n°2 : équipe B contre équipe H
    rencontre n°3 : équipe A contre équipe D
    rencontre n°4 : équipe E contre équipe G
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  9. #9
    Futur Membre du Club
    Homme Profil pro
    Autodidacte passionné
    Inscrit en
    Novembre 2017
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : Belgique

    Informations professionnelles :
    Activité : Autodidacte passionné
    Secteur : Transports

    Informations forums :
    Inscription : Novembre 2017
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    Waow..., merci les gars, j'avais annoncé que pas trop de temps pour le moment, c'est pire que prévu

    Mais pas grave, je vais essayer de prendre un peu de temps ce we (pas gagné, mais bon...), puis je vous tiens au courant...

    Quoi qu'il en soit, déjà un grand merci pour vos réponses et pistes...

  10. #10
    Futur Membre du Club
    Homme Profil pro
    Autodidacte passionné
    Inscrit en
    Novembre 2017
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : Belgique

    Informations professionnelles :
    Activité : Autodidacte passionné
    Secteur : Transports

    Informations forums :
    Inscription : Novembre 2017
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    Bonsoir à tous,

    Ben voilà, ben voilà, à force de cogiter, on tombe sur la solution à son problème...

    Donc, mon problème est résolu, un peu grâce à vous tous, mais surtout grâce à moi...

    Alors un grand merci à vous tous pour votre aide

  11. #11
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 552
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 552
    Points : 3 918
    Points
    3 918
    Par défaut
    Salut

    Pardonne ma curiosité, comment as-tu fait au final ?

    Cdlt

    M E N S . A G I T A T . M O L E M
    Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal

    "La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
    Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."

  12. #12
    Futur Membre du Club
    Homme Profil pro
    Autodidacte passionné
    Inscrit en
    Novembre 2017
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : Belgique

    Informations professionnelles :
    Activité : Autodidacte passionné
    Secteur : Transports

    Informations forums :
    Inscription : Novembre 2017
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par e-ric Voir le message
    Salut

    Pardonne ma curiosité, comment as-tu fait au final ?

    Cdlt
    Salut,

    En fait, après toutes mes manips et petite (toute petite...) analyse de vos réponses et pistes, je me suis dit que ma procédure n'était pas si mauvaise que celà..., alambiquée peut-être, mais pas mauvaise...

    Donc j'ai juste supprimé les 3 dernières lignes, celle qui ré-initialise le tableau TabEquipes, ainsi que la boucle qui affecte les valeurs de TabEquTmp à TabEquipes, pour affecter directement les valeurs de TabEquTmp dans la grille des matchs...

    Et miracle, ça fonctionne comme il faut... Enfin, pas de miracle, bien entendu, , mais bon, cela fonctionne

    Donc voilà..., suis content

    Après, quand le soft sera vraiment en service et que j'aurai un peu plus de temps pour une "bonne" analyse, je reviendrai sur mon problème plus en profondeur...

    Et, si qqu'un est intéressé, le soft (et son code) seront dispos dans sa version "finale"

    Cdlt itou

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

Discussions similaires

  1. demande de vérification diagramme de classe: gestion commerciale
    Par manal_b dans le forum Diagrammes de Classes
    Réponses: 1
    Dernier message: 23/06/2014, 09h03
  2. [NHibernate] One-to-many, demande de vérification
    Par dublow dans le forum NHibernate
    Réponses: 3
    Dernier message: 18/08/2010, 23h58
  3. demande de vérification digramme de classe
    Par fsegiste dans le forum Diagrammes de Classes
    Réponses: 0
    Dernier message: 12/05/2010, 17h53
  4. [AC-2003] Demande de vérification d'une date
    Par Piccou dans le forum IHM
    Réponses: 7
    Dernier message: 28/07/2009, 13h36
  5. Demande de vérification
    Par vincent477 dans le forum Modélisation
    Réponses: 8
    Dernier message: 06/10/2008, 12h59

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