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 Delphi Discussion :

opérations sur type ensemble


Sujet :

Langage Delphi

  1. #1
    Membre confirmé
    Avatar de OutOfRange
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 533
    Points : 474
    Points
    474
    Par défaut opérations sur type ensemble
    Bonjour
    Supposons un type ensemble défini comme suit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    type
      TMonEnsemble = set of integer;
    On peut ajouter des nouveaux éléments contenus dans une variable de même type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    procedure AjouterElement(n:integer);
    var
      MonEnsemble:TMonEnsemble;
    begin
      MonEnsemble:=MonEnsemble+[n];
    end;
    Par contre, comment faire pour récupérer les éléments de type integer contenus dans MonEnsemble
    Par exemple si j'ai
    Comment récupérer la valeur entière 6 dans une valiable de type integer
    Choisir, c'est renoncer...

  2. #2
    Membre chevronné

    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 935
    Points : 1 765
    Points
    1 765
    Par défaut
    Salut !

    Tu ferais pas, par hasard, le défi sudoku ?? J'ai eu le meme probleme. Alors je me suis fait une petite fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    function PremierElement(Ensemble : TMonEnsemble) :integer;
    var Trouve : boolean;
    begin
      Result:=1;
      Trouve:=false;
      while (Result<ValeurMaxdetonSet) and not(Trouve) do
      begin
        if Result in Ensemble then
            Trouve:=True;
        inc(Result);
      end;
      if not(Trouve) then Result:=0
                          else Result:=Result-1;
    end;
    Mais je vais surement l'ameliorer, parce que la ...

    Je ne sais pas si il existe un truc déja tout fait ...
    Le truc, en fait, c'est que tu peux savoir si un élément est dans ton ensemble grace a "if Element in Ensemble then"

  3. #3
    Membre confirmé
    Avatar de OutOfRange
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 533
    Points : 474
    Points
    474
    Par défaut
    Salut mick605
    Citation Envoyé par mick605
    Tu ferais pas, par hasard, le défi sudoku ??
    Damned! je suis fait!
    Effectivement, il est toujours possible de tester le contenu avec l'opérateur in
    Mais bon, s'il y avait une soluce moins "bourrin"
    Merci pour ton aide
    Choisir, c'est renoncer...

  4. #4
    rsc
    rsc est déconnecté
    Membre éprouvé
    Avatar de rsc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2004
    Messages
    711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 711
    Points : 918
    Points
    918
    Par défaut
    En fait, tu ne peux pas "parcourir" ton ensemble, et donc déterminer quels sont ses éléments. Tu peux juste vérifier si un élément en fait partie, par
    . C'est logique, c'est la même chose en math
    [mick065] Le nom de ta fonction est trompeur : un ensemble n'a pas de premier élément.

    Du coup, si les éléments de ton ensemble sont pris dans un ensemble de petite taille, et "ordonnable" (par ex 0 à 9 pour le Sudoku) ça peut jouer. Mais généralement il vaut mieux te rabattre sur un type tableau.
    Roland

  5. #5
    Membre confirmé
    Avatar de OutOfRange
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 533
    Points : 474
    Points
    474
    Par défaut
    Salut rsc
    c'est bien ce que je redoutais
    Citation Envoyé par rsc
    Mais généralement il vaut mieux te rabattre sur un type tableau.
    Entièrement d'accord, mais pour le cas du sudoku (9 éléments), la manipulation des ensembles me paraît intéressante
    Et vu que mon souhait est d'extraire le contenu d'un ensemble à 1 seul élément, va pour l'opérateur in
    Merci rsc
    @mick605 si j'ai bien compris ta function renvoie le plus petit élément de l'ensemble
    Quant à moi, je veux juste qu'elle me renvoie l'élément unique
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      function ElmntDansEnsemble(MonEnsemble:set of byte):byte;
      var
        n:1..9;
      begin
        for n:=1 to 9 do
        if n in MonEnsemble then result:=n
      end;
    Choisir, c'est renoncer...

  6. #6
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 266
    Points
    3 266
    Par défaut
    Bonjour,

    Pour ceux qui s'intéressent aux ensembles vous pouvez trouver ici : http://www.developpez.net/forums/d41...native-set-of/
    les unités BigSetD7Older et IntSetD7Older créées par Sjrd pour manipuler des grands ensembles ... qui marchent donc aussi avec des petits ensembles.
    BigSetD7Older et IntSetD7Older fonctionnent sous des version Delphi inférieures à D7 . Sous D5 les opérations sont hyper-speed.

    A+.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  7. #7
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 448
    Points
    28 448
    Par défaut
    Citation Envoyé par OutOfRange Voir le message
    Salut mick605

    Damned! je suis fait!
    Effectivement, il est toujours possible de tester le contenu avec l'opérateur in
    Mais bon, s'il y avait une soluce moins "bourrin"
    Merci pour ton aide
    hihi, personnellement j'ai utilisé un champ de bit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    var
      Values: Integer;
      Value : Integer;
    begin
      Values := GetPossibleValues(x, y); // bits 1 à 9
      for Value := 1 to 9 do
      begin
       if Values = 1 shl Value then
       begin
        // une seule solution : Value
       end;
      end;
    end;
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  8. #8
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    C'est gentil de faire la pub pour mes BigSets, mais je vous déconseille très fortement de les utiliser dans ce cas-ci. Mes BigSets sont une implémentation du comportement exact des set of mais pour des types d'éléments de plus de 256 valeurs différentes.

    Donc c'est totalement contre-nature d'utiliser mes BigSets pour travailler avec des types à 9 valeurs
    Citation Envoyé par Paul TOTH Voir le message
    hihi, personnellement j'ai utilisé un champ de bit
    Euh, ça sert à rien ce que tu fais. Tu rends illisible ton code pour rien.
    Les ensembles set of sont des champs de bits. Et toutes les opérations sur les ensembles sont en temps constant, y compris le in.

    Et si tu veux un (bel) équivalent de ton
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if Values = 1 shl Value then
    c'est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if Values = [Value] then


    Finalement, je rappelle aussi les différentes opérations possibles sur les set of :

    • Value in Set1 = True si Value est dans Set1, False sinon
    • Set1 + Set2 = Union de Set1 et Set2
    • Set1 - Set2 = Ensemble des éléments de Set1 qui ne sont pas dans Set2
    • Set1 * Set2 = Intersection de Set1 et Set2
    • Set1 <= Set2 = True si Set1 est inclus (non strictement) dans Set2, c'est-à-dire si tous les éléments de Set1 sont aussi dans Set2
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  9. #9
    Membre chevronné

    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 935
    Points : 1 765
    Points
    1 765
    Par défaut
    Citation Envoyé par OutOfRange Voir le message
    Damned! je suis fait!
    Effectivement, il est toujours possible de tester le contenu avec l'opérateur in
    Mais bon, s'il y avait une soluce moins "bourrin"
    Je suis d'accord, c'est bourrin !!



    Citation Envoyé par rsc Voir le message
    [mick065] Le nom de ta fonction est trompeur : un ensemble n'a pas de premier élément.
    Ce que je voulais dire par la, c'est

    Citation Envoyé par OutOfRange Voir le message
    @mick605 si j'ai bien compris ta function renvoie le plus petit élément de l'ensemble
    Enfin, l'essentiel, c'est que vous ayez compris ! Ca renvoie la plus petite valeur de l'ensemble ! Vous pouvez toujours changer le nom de la procedure, mais je le trouve explicite.



    Citation Envoyé par OutOfRange Voir le message
    Quant à moi, je veux juste qu'elle me renvoie l'élément unique
    Et bien, tu cherches si ton ensemble contient un seul élement, et si oui, tu prends le premier element ...

    Sinon, y aurait pas une fonction qui renvoie le nombre de valeurs de l'ensemble ? J'imagine que oui, mais a defaut, je me la suis créé !!



    Citation Envoyé par OutOfRange Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      function ElmntDansEnsemble(MonEnsemble:set of byte):byte;
      var
        n:1..9;
      begin
        for n:=1 to 9 do
        if n in MonEnsemble then result:=n
      end;
    Ca marche aussi bien, mais si ton ensemble est [1], ta fonction va passer toutes les valeurs jusqu'a neuf, donc ... calculs inutiles

    Se rabattre sur un type tableau > euh ... je n'en vois pas l'utilité. Les sets of permettent plus de trucs (dans ce cas la) que les tableaux (union, intersection ...) !!

Discussions similaires

  1. Réponses: 1
    Dernier message: 27/06/2010, 08h33
  2. Réponses: 1
    Dernier message: 03/12/2007, 19h22
  3. Probleme sur un ensemble de type dans fonction
    Par jetgirl dans le forum Oracle
    Réponses: 4
    Dernier message: 19/02/2007, 13h04
  4. [2.0] Comment réaliser des opérations sur les ensembles ?
    Par Cereal123 dans le forum Framework .NET
    Réponses: 2
    Dernier message: 23/10/2006, 13h01
  5. opérations sur les dates
    Par coucoucmoi dans le forum Débuter
    Réponses: 2
    Dernier message: 12/08/2003, 11h45

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