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

C Discussion :

Calcul des combinaisons des chaines de caractères


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Mai 2009
    Messages
    392
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 392
    Par défaut Calcul des combinaisons des chaines de caractères
    Bonsoir,

    J'ai un fichier texte "exemple.txt" qui contient dans chaque une seule chaine de caractère(attribut). On sait en avance le nombre d'attribut.
    Prenez un exemple de ce fichier contenant 5 attributs:
    nom, prenom, age, adresse, emploi

    Voici le fichier exemple.txt :
    nom
    prenom
    age
    adresse
    emploi

    Je voudrais par un programme C de sauvegarder dans un autre fichier "resultat.txt" toutes les combinaisons possibles de ces différents attributs. c'est à dire toutes les combinaisons possibles :
    - de taille 1: les combinaisons des attributs de taille 1 parmi 5.
    Donc on a 5 combinaisons:
    nom, prenom, age, adresse, emploi

    - de taille 2:les combinaisons des attributs de taille 2 parmi 5.
    Donc on a 10 combinaisons:
    nom prenom, nom age, nom adresse, nom emploi, prenom age, prenom adresse, prenom emploi, age adresse, age emploi, adresse emploi

    - de taille 3:les combinaisons des attributs de taille 3 parmi 5.
    Donc on a 10 combinaisons:
    nom prenom age, nom prenom adresse, nom prenom emploi, nom age adresse, nom age emploi, nom adresse emploi, prenom age adresse, prenom age emploi, prenom adresse emploi, age adresse emploi

    - de taille 4:les combinaisons des attributs de taille 4 parmi 5.
    Donc on a 5 combinaisons:
    nom prenom age adresse, nom prenom age emploi, nom prenom adresse emploi, prenom age adresse emploi


    - de taille 5:les combinaisons des attributs de taille 5 parmi 5.
    Donc on a 1 combinaison:
    nom prenom age adresse emploi

    Je pense à stocker le résultat dans un autre fichier.
    Voici le fichier resultat.txt :
    nom
    prenom
    age
    adresse
    emploi
    nom prenom
    nom age
    nom adresse
    nom emploi
    prenom age
    prenom adresse
    prenom emploi
    age adresse
    age emploi
    adresse emploi
    nom prenom age
    nom prenom adresse
    nom prenom emploi
    nom age adresse
    nom age emploi
    nom adresse emploi
    prenom age adresse
    prenom age emploi
    prenom adresse emploi
    age adresse emploi
    nom prenom age adresse
    nom prenom age emploi
    nom prenom adresse emploi
    prenom age adresse emploi
    nom prenom age adresse emploi

    Je trouvé une difficulté de calculer ces combinaisons et par la suite les sauvegarde. Je serais très content pour vos aides.

    Merci.

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par siempre Voir le message
    Bonsoir,

    J'ai un fichier texte "exemple.txt" qui contient dans chaque une seule chaine de caractère(attribut). On sait en avance le nombre d'attribut.
    Prenez un exemple de ce fichier contenant 5 attributs:
    nom, prenom, age, adresse, emploi

    Voici le fichier exemple.txt :
    nom
    prenom
    age
    adresse
    emploi

    Je voudrais par un programme C de sauvegarder dans un autre fichier "resultat.txt" toutes les combinaisons possibles de ces différents attributs. c'est à dire toutes les combinaisons possibles :
    - de taille 1: les combinaisons des attributs de taille 1 parmi 5.
    Donc on a 5 combinaisons:
    nom, prenom, age, adresse, emploi

    - de taille 2:les combinaisons des attributs de taille 2 parmi 5.
    Donc on a 10 combinaisons:
    nom prenom, nom age, nom adresse, nom emploi, prenom age, prenom adresse, prenom emploi, age adresse, age emploi, adresse emploi

    - de taille 3:les combinaisons des attributs de taille 3 parmi 5.
    Donc on a 10 combinaisons:
    nom prenom age, nom prenom adresse, nom prenom emploi, nom age adresse, nom age emploi, nom adresse emploi, prenom age adresse, prenom age emploi, prenom adresse emploi, age adresse emploi

    - de taille 4:les combinaisons des attributs de taille 4 parmi 5.
    Donc on a 5 combinaisons:
    nom prenom age adresse, nom prenom age emploi, nom prenom adresse emploi, prenom age adresse emploi


    - de taille 5:les combinaisons des attributs de taille 5 parmi 5.
    Donc on a 1 combinaison:
    nom prenom age adresse emploi

    Je trouvé une difficulté de calculer ces combinaisons et par la suite les sauvegarde. Je serais très content pour vos aides.

    Merci.
    Etant donné que l'ordre n'a pas d'importance (dans ton exemple taille 2, tu cites nom + prenom mais pas prenom + nom), le nombre d'items pour une taille n sera le calcul combinatoire donc
    120 / ((5 - n)! * n!)

    Exemple taille 2: t'as 120 / ((5 - 2)! * 2!) = 120 / (3! * 2!) = 120 / (6 * 2) = 10 items

    Citation Envoyé par siempre Voir le message
    - de taille 2:les combinaisons des attributs de taille 2 parmi 5.
    Donc on a 10 combinaisons:
    nom prenom, nom age, nom adresse, nom emploi, prenom age, prenom adresse, prenom emploi, age adresse, age emploi, adresse emploi
    C'est bien 10 items.

    Maintenant, pour sortir tes items, il te faut une fonction récursive. Bon, je t'en ai écrite une mais en Python parce que ce langage possède des outils de concaténation et de traitement de tableaux qui permettent d'aller très vite (je l'ai écrite en 10mn) mais que le C ne possède pas et que j'ai pas envie de réinventer (par exemple elem[x:y] donne tous les éléments d'un tableau situés entre les positions x et y => va donc le réécrire en C...)
    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
    #!/usr/bin/env python
    # coding: Latin-1 -*-
     
    def combi(liste, prof, base=""):
    	result=""
    	if prof == 1:
    		for item in liste:
    			if base != "": result=result + base + ", " + item + "\n"
    			else:  result=result + item + "\n"
    		# for
    		return result
    	# if
     
    	result=""
    	for i in range(len(liste) - 1):
    		if base != "": result=result + combi(liste[i + 1:], prof - 1, base + ", " + liste[i])
    		else: result=result + combi(liste[i + 1:], prof - 1, liste[i])
    	# for
    	return result
    # combi()
     
    import sys
    print combi(["nom", "prenom", "age", "adresse", "emploi"], int(sys.argv[1]))
    Et mes essais
    c:>combi.py 1
    nom
    prenom
    age
    adresse
    emploi

    c:>combi.py 2
    nom, prenom
    nom, age
    nom, adresse
    nom, emploi
    prenom, age
    prenom, adresse
    prenom, emploi
    age, adresse
    age, emploi
    adresse, emploi

    c:>combi.py 3
    nom, prenom, age
    nom, prenom, adresse
    nom, prenom, emploi
    nom, age, adresse
    nom, age, emploi
    nom, adresse, emploi
    prenom, age, adresse
    prenom, age, emploi
    prenom, adresse, emploi
    age, adresse, emploi

    c:>combi.py 4
    nom, prenom, age, adresse
    nom, prenom, age, emploi
    nom, prenom, adresse, emploi
    nom, age, adresse, emploi
    prenom, age, adresse, emploi

    c:>combi.py 5
    nom, prenom, age, adresse, emploi
    Voilà - T'as plus qu'à reprendre l'algo et le réécrire en C...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Membre éclairé
    Inscrit en
    Mai 2009
    Messages
    392
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 392
    Par défaut
    Bonjour,

    Je n'ai pas compris votre idée.
    De plus,
    Mais, je dois obtenir le résultat qui me donne la liste de toutes les combinaisons à partir de taille 2 jusqu'à N sachant que N n'est pas connu en avance.

    Comment on obtient le résultat suivant:

    nom prenom
    nom age
    nom adresse
    nom emploi
    prenom age
    prenom adresse
    prenom emploi
    age adresse
    age emploi
    adresse emploi
    nom prenom age
    nom prenom adresse
    nom prenom emploi
    nom age adresse
    nom age emploi
    nom adresse emploi
    prenom age adresse
    prenom age emploi
    prenom adresse emploi
    age adresse emploi
    nom prenom age adresse
    nom prenom age emploi
    nom prenom adresse emploi
    prenom age adresse emploi
    nom prenom age adresse emploi

    je ne comprends pas le code Python ?

    Merci.

Discussions similaires

  1. ajouter des espaces à une chaine de caractères
    Par tricette dans le forum Shell et commandes POSIX
    Réponses: 8
    Dernier message: 28/09/2012, 13h09
  2. [XL-2007] Fonction calculant la somme des chiffres des cellules d'une même couleur
    Par XceSs dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 14/08/2010, 00h23
  3. Conversion valeur des mois en chaine de caractères
    Par babou466 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 10/03/2009, 09h12
  4. Gestion des majuscules des miniscules des accent
    Par issam16 dans le forum Access
    Réponses: 2
    Dernier message: 13/07/2006, 14h21

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