Algorithmes Python
Répondre à la discussion
Page 1 sur 2 1 DernièreDernière
Affichage des résultats 1 à 30 sur 32

Algorithmes Python



  1. #1
    invite4c80defd

    Algorithmes Python


    ------

    Bonjour à tous , je vous contactre aujourd'hui car un problème avec des algorithmes (en python

    Voici l'exo:
    Code:
    "Écrivez la fonction test_lettre :
    
    def test_lettre(mot, etat, c):
        """fonction qui vérifie si une lettre apparait dans un mot, et lorsque
    c'est le cas, ajoute les lettres correspondantes dans l'état.
    
    paramètres :
      - mot, de type chaîne de caractères,
      - etat, de type liste de caractères : les lettres inconnues sont
        représentées par des '_'. Cette liste a la même longueur que le paramètre
        mot,
      - c, de type caractère : la lettre proposée.
    
    retour : "True" si la lettre est présente dans le mot, et False sinon.
    
    L'état est mis à jour en remplaçant les "_" correspondant à la lettre trouvée.
    """
        ...
    Pour ceci, le plus simple est de parcourir les caractères de la chaîne mot :
    
    si le caractère est différent du caractère c passé en argument, on continue
    si le caractère est égal au caractère c passé en argument, le test réussit (la fonction devra donc renvoyer True) et on remplace le '_' correspondant dans la liste etat.
    Attention, comme le mot peut contenir plusieurs fois la même lettre, il ne faut pas s'areter à la première occurence de c qu'on trouve !

    Voila ce que j'ai fais pour le moment ( le prof m'a aidé sur certains points)


    Code:
    def test_lettre(mot,lettre_à_tester):
        etat=["_"]*len(mot)
        a=False
        for i in range(len(mot)):
            if mot[i]==lettre_à_tester:  
                a=True
                etat[i]=mot[i]           
                print("=>bravo:")
            
            else:
                print("mot :", " ".join(etat))
                
        return mot
    1er probleme: quant je veux excuter le prog, je tape dans python shell: test_lettre(mot,e) si je veux tester la lettre e: ça m'écrit que e n'est pas définie. (le programme ci-dessus s'est collé à auche mais il ya normalement des décalages pour rentrer dans les boucles)



    2ème exo qui est une modification du premier:
    "
    Code:
    correspondance = {
        'A': 'AÀÄÂÆ',
        'C': 'CÇ',
        'E': 'EÊÈÉËÆŒ',
        'I': 'IÎÏ',
        'O': 'OÔÖŒ',
        'U': 'UÙÜÛ' }


    Notez en particulier que les lettres doubles ont deux lettres correspondantes.

    Modifier la fonction test_lettre pour qu'elle prenne les accents et lettres doubles en compte.

    Pour ceci, il suffit de modifier le test qui vérifie si le ième caractère de mot est égal à c par un test qui vérifie si le ième caractère du mot apparaît dans la chaîne contenant toutes les variantes du c. (Attention, certains caractères n'ont aucune variante et n'apparaissent donc pas dans le dictionnaire correspondance.)"


    La je ne sais pas comment faire pour le programme prenne en compte "correspondance" et qu'il affiche si besoin , les lettres avec les accents.

    merci beaucoup pour votre aide

    -----
    Dernière modification par JPL ; 17/03/2013 à 02h07.

  2. #2
    invite43901482

    Re : Algorithmes Python

    Bonjour,

    On te demande une fonction avec 3 paramètres "test_lettre(mot, etat, c)", il faut donc respecter cela...

    À la vue de l'exercice ça serait un jeu du pendu.

    "mot" représentant sans doute le mot secret à découvrir
    "etat" représentant la liste des lettres déjà trouvées et non trouvées (représentées par un _)
    "c" la lettre proposée par l'utilisateur

    si le caractère est égal au caractère c passé en argument, le test réussit (la fonction devra donc renvoyer True) et on remplace le '_' correspondant dans la liste etat.
    Je dirais une erreur de recopiage ou un manque de logique.

    On remplace les _ comportant la lettre recherchée et on retourne True si la lettre est trouvée dans etat.

    Votre professeur est d'accord en ajoutant cette citation

    Attention, comme le mot peut contenir plusieurs fois la même lettre, il ne faut pas s'areter à la première occurence de c qu'on trouve !
    Voici l'impression que j'ai, vous êtes en ISN peut être? Les professeurs ont donc découverts pour la plupart ce langage qui est "python", ils ont donc pas suffisamment de recul pour donner un énoncé je dirais "correct".

    Mais le problème reste explicite par la connaissance du jeu du pendu.

    Comme la fonction semble explicite, je ne comprend pas le fait que vous retourniez mot au lieu d'un booléen (True ou False), sachant que c'est un test...

    print permet l'affichage à l'écran, hors on vous demande un retour et non un affichage, donc pas de print (très rare dans une fonction en python)

    Votre professeur doit peut-être s'attendre à un code simple comme celui-ci

    Code:
    def test_lettre(mot, etat, c):
        copie = etat[:]
        longueur = len(mot)
        for i in range(longueur):
            if mot[i] == c:
                etat[i] = c
        if copie != etat:
            return True
        return False
    
    mot = "bonjour"
    etat = ['_', '_', '_', '_', '_', '_', '_']
    lettre = "o"
    
    print(test_lettre(mot, etat, lettre))
    
    print(etat)

  3. #3
    invite4c80defd

    Re : Algorithmes Python

    Merci beaucoup, votre code est en effet très efficace! je viens de le tester et ça fonctionne très bien!
    Maintenant, les choses se compliquent un peu avec le dictionnaire "correspondance"....
    J'avais essayé d'insérer une boucle if dans la boucle if pour faire un test supplémentaire mais ça ne marche pas. Y'a -t-il une méthode ou fonction prédéfinie pour m'aider à savoir si le caractère du mot apparait dans la chaîne contenant toutes les variantes de ce caractere ?

    Merci beaucoup!

  4. #4
    invite43901482

    Re : Algorithmes Python

    N'avez-vous lu que mon code?

    Avez-vous compris au moins?

    Pour faire ce travail ("exo 2"), n'avez-vous pas eu de cours sur les dictionnaires?

    Avec ce cours et votre compréhension du code précédent, vous devriez ne plus avoir de problème, surtout qu'on reste dans le même contexte.

    Bon courage à vous...

  5. A voir en vidéo sur Futura
  6. #5
    invite4c80defd

    Re : Algorithmes Python

    je vais essayer et vous communiquerai ce que j'ai fais

    merci

  7. #6
    invite4c80defd

    Re : Algorithmes Python

    je suis désolé mais je n'y arrive pas.
    Le principe du code est de tester si la lettre choisie apparait dans le mot ou pas. si oui, alors on remplace le"_" par cette lettre mais maintenant le fait qu'elle apparaisse n’est plus la seule condition , il faut vérifier si ce n'est pas une variante de cette lettre qui apparait dans le mot ou pas . Pour cela, dans le
    if mot[i] == c:
    etat[i] = c

    il faut rajouter if ("c appartient au dico" et si c==c ou c==ç, alors ...")
    mais comment ? je sais que dans le dico, je peux demander "AÀÄÂÆ" en tapant correpondance[A] mais ici si j'ai une lettre ( E par exemple) , je peux pas lui dire de faire for i in range(len(correspondance)): if correspondance[i]=...car ça ne marche pas comme ça ...
    qu'en pensez-vous ?

  8. #7
    invite4c80defd

    Re : Algorithmes Python

    bref, je ne vois pas comment rentrer dans le dico et rentrer dans un des carateres du dico si la lettre a tester et bien dans le dico ..

  9. #8
    invite43901482

    Re : Algorithmes Python

    Le principe semble simple, en gros si l'utilisateur entre une lettre spécifique comme À par exemple, il faut transformer ta lettre en A

    Sur ce simple principe on peut créer notre propre fonction de transformation, sachant qu'un minimum de connaissance dans l'utilisation d'un dictionnaire est demandé.

    Dans un dictionnaire, équivalent d'un table de hachage, comprenant clés et valeurs, si votre lettre se trouve dans une de ces valeurs, il faudra en retourner sa clé.

    Ma fonction (le plus simple au niveau syntaxe) serait :

    Code:
    def table(letter):
        correspondance = {
    'A': 'AÀÄÂÆ',
    'C': 'CÇ',
    'E': 'EÊÈÉËÆŒ',
    'I': 'IÎÏ',
    'O': 'OÔÖŒ',
    'U': 'UÙÜÛ' 
    }
        
        for cle in correspondance:
            if lettre in correspondance[cle]:
                return cle
        return lettre
    
    print(table('Â'))
    Avec cela j'en ai bien trop fait il ne vous reste plus rien à faire si ce n'est combiner les deux fonctions.

  10. #9
    invite4c80defd

    Re : Algorithmes Python

    ok merci je ne savais pas que l'on pouvait faire "for c in correspondance" , j'ai appris beaucoup de choses aujourd'hui.
    je vais donc modifier ma fonction avec celle-ci et vous vous dirait si je rencontre un probleme

    merci!

  11. #10
    invite43901482

    Re : Algorithmes Python

    je ne savais pas que l'on pouvait faire "for c in correspondance"
    De mon temps nous n'avions pas la chance d'avoir internet, maintenant avec google vous êtes les rois du monde concernant les connaissances que vous pouvez acquérir.

    Je prend cela pour de la mauvaise volonté, plus que de l'ignorance, sans internet, j'aurais dis le contraire.

    En cherchant 30 secondes, j'ai trouvé ce lien, vous donnant les bases sur les manipulations d'un dictionnaire, à vous de voir, si vous sentez en vous le courage d'un peu de lecture, même si je sais que les élèves lisent de moins en moins

  12. #11
    invite4c80defd

    Re : Algorithmes Python

    j'ai commencé python il n'y a pas si longtemps...et de plus, comme j'ai beaucoup d'autres matieres, je ne peux pas approfondir (sur google par ex) comme je le voudrais..on ne fait pas toujours ce que l'on veut...

    (pour vous, c'est plus facile de chercher cette astuce sur internet car vous savez ce que vous cherchez mais moi pas du tout...)

  13. #12
    invite43901482

    Re : Algorithmes Python

    N'imaginez pas recevoir les réponses toutes cuites comme ci-dessus, il faudra que vous vouliez prendre le temps des recherches et un minimum approfondir pour la réussite de votre travail. Une expression bien connue "on a jamais rien sans rien"...

    Je n'ai cherché qu'un tutoriel sur les dictionnaires en python, via google, puis j'ai lu et vous ai envoyé le lien. Je me suis bien mis à votre place pour ma recherche, si c'est de cela dont vous parliez.

  14. #13
    invite4c80defd

    Re : Algorithmes Python

    A propos du lien , merci c'est gentil car il est assez détaillé. j'avais trouvé une fois un lien avec tout sur python qui pourrait me servir malheureusement, je n'arrive pas a remettre la main dessus ! c'est dommage,il m'aurait surement servi ici ! (en plus, c'est plus agréable, meme si vous ne donniez pas les répones de travailler avec quelqu'un comme vous plutôt qu'avec un site internet devant les yeux!)

  15. #14
    invite43901482

    Re : Algorithmes Python

    j'avais trouvé une fois un lien avec tout sur python qui pourrait me servir malheureusement, je n'arrive pas a remettre la main dessus ! c'est dommage,il m'aurait surement servi ici !
    Difficile de savoir de quel lien vous parlez, cependant vous pouvez commencer à lire le tutoriel de Swinnen.

    (en plus, c'est plus agréable, meme si vous ne donniez pas les répones de travailler avec quelqu'un comme vous plutôt qu'avec un site internet devant les yeux!)
    Ah certes, je ne cache pas l'utilité de parler sur un forum, sinon je ne serais pas là, mais l'aidant demande aussi un minimum de travail pour que l'aide soit utile

  16. #15
    invite4c80defd

    Re : Algorithmes Python

    désolé de revenir à la charge mais j'ai un souci avec votre code:
    for cle in correspondance:
    if lettre in correspondance[cle]:
    return cle
    return lettre

    le "cle" est bien la lettre à tester ? car je me rend compte que j'ai compris de travers en analysant plus en détail le code

  17. #16
    invite43901482

    Re : Algorithmes Python

    le "cle" est bien la lettre à tester ?
    Pas du tout, c'est la lettre que vous mettez en argument de fonction (d'ailleurs c'est pas letter mais lettre dans mon code) qui sera modifié au cas où elle se trouve dans les valeurs du dictionnaire (lettres avec accents étant les valeurs).

    Admettons que vous mettiez 'Ô' en paramètre de la fonction, ça vous retournera 'O'.

    Du coup c'est fort simple de travailler maintenant qu'on a notre fonction table.

    Le code final si pas d'erreur d'étourderie...

    Code:
    def table(lettre):
        lettre = lettre.upper() # Pour mettre en majuscule la lettre en paramètre
        correspondance = {
    'A': 'AÀÄÂÆ',
    'C': 'CÇ',
    'E': 'EÊÈÉËÆŒ',
    'I': 'IÎÏ',
    'O': 'OÔÖŒ',
    'U': 'UÙÜÛ' 
    }
        
        for cle in correspondance:
            if lettre in correspondance[cle]:
                return cle
        return lettre
    
    def test_lettre(mot, etat, c):
        maj = table(c)
        copie = etat[:]
        longueur = len(mot)
        for i in range(longueur):
            if mot[i] == maj:
                etat[i] = maj
        if copie != etat:
            return True
        return False
    
    mot = "BONJOUR"
    etat = ['_', '_', '_', '_', '_', '_', '_']
    lettre = "ô"
    
    print(test_lettre(mot, etat, lettre))
    
    print(etat)

  18. #17
    invite4c80defd

    Re : Algorithmes Python

    ah ok merci beaucoup, je n'avais pas vu que vous aviez écrit letter.
    Je devrais donc arriver finaliser cette question
    merci

  19. #18
    invite4c80defd

    Re : Algorithmes Python

    En continuant mes exos, j'ai encore rencontré un probleme avec unprogramme, peut-être pourrez-vous m'aider à le résoudre:
    la consigne:
    •on commence par tirer un mot au hasard dans le dictionnaire,
    •on initialise une variable "etat" avec des "_",
    •tant que le nombre d'erreurs est plus petit que 8, on demande une lettre à l'utilisateur.

    Pour tirer un mot au hasard, il suffit de récuperer la liste de tous les mots, et de tirer un numéro de case au hasard avec la fonction randint. (N'oubliez pas de faire un

    from random import randint

    Voici un exemple de partie :

    >>> pendu_version1("fichier.txt")

    _ _ _ _ _ _ _ _
    Vous pouvez faire encore 8 erreurs.
    Entrez une lettre, suivie d'un saut de ligne : e
    Dommage...

    _ _ _ _ _ _ _ _
    Vous pouvez faire encore 7 erreurs.
    Entrez une lettre, suivie d'un saut de ligne : a
    Bravo !

    _ A _ _ A _ _ _
    Vous pouvez faire encore 7 erreurs.
    Entrez une lettre, suivie d'un saut de ligne : l
    Dommage...

    _ A _ _ A _ _ _
    Vous pouvez faire encore 6 erreurs.
    Entrez une lettre, suivie d'un saut de ligne :

    ...

    Perdu...
    Le mot secret était 'RAMPANT'.

    Question 5.

    Complétez la procédure pendu_version1. Cette procédure prend en argument le nombre maximal d'erreurs autorisées. Si cette valeur n'est pas donnée, votre procédure utilisera la valeur par défaut de 8.

    voila ce que j'ai fais: (avec une liste a la place du fichier)
    Code:
    from random import randrange
    
    liste = ["python", "couleuvre", "java", "tango"]
    
    def pendu_version1(liste):
        mot=liste[randrange(len(liste))]
    
        etat=["_"]*len(mot)
        print(etat)
        j=8
        while j>=0:
            lettre=str(input("entrez une lettre, suivit d'un saut de ligne"))
            test_lettre(mot, etat, lettre)
    
            j=j-1
    
    
    (la fonction test_lettre est :
    def test_lettre(mot, etat, lettre):
    copie = etat[:]
        longueur = len(mot)
        for i in range(longueur):
            if mot[i] == lettre:                
    etat[i] = lettre        
    if copie != etat:
            return True
        return False
    ce programme me demande 8 fois une lettre mais sans rien faire , pourquoi à votre avis ?
    Dernière modification par JPL ; 17/03/2013 à 02h09. Motif: Ajout de la balise Code (#) pour garder l'indentation

  20. #19
    invite4c80defd

    Re : Algorithmes Python

    dans la fonction test_lettre, la ligne etat[i] = lettre rentre bien dans le if situé au-dessus, mais cette erreur n'était pas là lorsque j'ai testé le code, il y a donc quelque chose d’autre qui ne fonctionne a pas .

  21. #20
    invite43901482

    Re : Algorithmes Python

    Bonjour,

    Vous avez vraiment un problème dans la lecture de l'énoncé, même si vous l'avez simulé avec une liste ce n'est pas la bonne manière de faire car un fichier en paramètre ne sera pas une liste, vous n'êtes donc pas cohérent avec l'énoncé.

    Ensuite je suppose que ton prof veut des mots en majuscules, car si je m'appui sur le dictionnaire correspondance, il essaie de faire correspondre des majuscules.

    La fonction test_lettre est un test, il faut donc l'utiliser en tant que tel...

    Votre boucle while ne s'arrête pas si le joueur trouve toutes les lettres.

    Voilà votre code de simulation, j'espère que vous trouverez comment ouvrir un fichier et rechercher un mot, avec un minimum de recherche.

    Code:
    from random import choice
    
    def table(lettre):
        lettre = lettre.upper() # Pour mettre en majuscule la lettre en paramètre
        correspondance = {
    'A': 'AÀÄÂÆ',
    'C': 'CÇ',
    'E': 'EÊÈÉËÆŒ',
    'I': 'IÎÏ',
    'O': 'OÔÖŒ',
    'U': 'UÙÜÛ' 
    }
        
        for cle in correspondance:
            if lettre in correspondance[cle]:
                return cle
        return lettre
    
    def test_lettre(mot, etat, c):
        maj = table(c)
        copie = etat[:]
        longueur = len(mot)
        for i in range(longueur):
            if mot[i] == maj:
                etat[i] = maj
        if copie != etat:
            return True
        return False
    
    def pendu_version1():
        liste = ["python", "couleuvre", "java", "tango"]
        mot = choice(liste).upper()
        etat=["_"] * len(mot)
        print(etat)
        j = 8
        while j >= 0 and etat != list(mot):
            lettre = input("entrez une lettre, suivit d'un saut de ligne : ")
            if not test_lettre(mot, etat, lettre):
                j -= 1
            print(etat)
    
    pendu_version1()

  22. #21
    invite4c80defd

    Re : Algorithmes Python

    nous ne sommes pas forcé de suivre l'énoncé à la lettre (mots du prof)
    Merci pour votre code, je vais , avec ce que j'ai fais essayer de tirer quelque chose de concluant

  23. #22
    invite43901482

    Re : Algorithmes Python

    Alors pourquoi donné un énoncé avec autant de détails?

    Vous êtes en ISN?

  24. #23
    invite4c80defd

    Re : Algorithmes Python

    l'énoncé a été fait par un autre prof. Je suis en cycle préparatoire aux écoles d'ingénieurs (1ere année bien sur) mais nous n'avons pas eu beaucoup d'info au premier semestre, c'est maintenant que l'on commence a réellement en faire (en tp)

  25. #24
    invite4c80defd

    Re : Algorithmes Python

    pour ouvrir un fichier , chercher un mot, c'est bon normalement mais avec ce code, j'ai droit a 12 essais , pourquoi cela ? je ne vois pas pourquoi car la boucle while au bout de 8 tours devrait s'arreter même si le mot n'est pas trouvé ?

  26. #25
    invite43901482

    Re : Algorithmes Python

    À vous de placer votre code, difficile d'intervenir sans...

  27. #26
    invite4c80defd

    Re : Algorithmes Python

    j'ai repris votre code (le focntion test_lettre étant la même que la votre , j'ai juste modifier de deux ou trois petites choses pour la rendre plus simple pour moi)
    code:
    def pendu_version_1():
    f=open(fichier)
    liste=f.readlines()
    mot=randrange(len(liste))
    etat=["_"]*len(mot)

    print(etat)
    j = 8
    while j >= 0 and etat != list(mot):
    lettre = input("entrez une lettre, suivit d'un saut de ligne : ")
    if not test_lettre_2(mot, etat, lettre):
    j=j-1
    print(etat)

  28. #27
    invite4c80defd

    Re : Algorithmes Python

    De plus, je rend compte que la fonction test_lettre ne répond peut etre pas à la question. j'ai demandé a quelqu'un de me doner un exemple , le prof lui ayant expliquer la chose:

    voici un exemple d'execution :

    mot = "DÉSŒUVRER"
    etat = [ "D", "_", "_", "_", "_", "V", "R", "_" , "R" ]
    if test_lettre(mot, etat, "e"):
    print("Bravo !")
    else:
    print("Dommage...")
    print("mot :", " ".join(etat))
    devra afficher

    Bravo !
    mot : D É _ Œ _ V R E R

  29. #28
    invite43901482

    Re : Algorithmes Python

    c'est pas trop mal, mais le problème est que readlines va vous renvoyer une liste de chaînes de caractères avec un '\n' au bout, ce qui est embêtant.
    Pour virer les '\n' on va utiliser la méthode strip('\n')

    utiliser with open au lieu d'open, ça vous permet de ne pas oublier le close.

    Code:
    from random import choice
    
    def table(lettre):
        lettre = lettre.upper() # Pour mettre en majuscule la lettre en paramètre
        correspondance = {
    'A': 'AÀÄÂÆ',
    'C': 'CÇ',
    'E': 'EÊÈÉËÆŒ',
    'I': 'IÎÏ',
    'O': 'OÔÖŒ',
    'U': 'UÙÜÛ' 
    }
        
        for cle in correspondance:
            if lettre in correspondance[cle]:
                return cle
        return lettre
    
    def test_lettre(mot, etat, c):
        maj = table(c)
        copie = etat[:]
        longueur = len(mot)
        for i in range(longueur):
            if mot[i] == maj:
                etat[i] = maj
        if copie != etat:
            return True
        return False
    
    def pendu_version1(fichier):
        liste = []
        with open(fichier, 'r') as f:
            for ligne in f.readlines():
                liste.append(ligne.strip('\n'))
        mot = choice(liste).upper()
        etat=["_"] * len(mot)
        print(etat)
        j = 8
        while j >= 0 and etat != list(mot):
            lettre = input("entrez une lettre, suivit d'un saut de ligne : ")
            if not test_lettre(mot, etat, lettre):
                j -= 1
            print(etat)
    
    pendu_version1("mon_fichier.txt")

  30. #29
    invite43901482

    Re : Algorithmes Python

    Il fait exactement la même chose, ce qui prouve que vous ne comprenez pas ce qu'on fait, c'est juste un affichage différent.

    En outre le fait de placer des accents semblent pas logique, mais bon... pourquoi pas?

    Sinon pour avoir le mot non inclus dans une liste

    Code:
    while j >= 0 and etat != list(mot):
            lettre = input("entrez une lettre, suivit d'un saut de ligne : ")
            if not test_lettre(mot, etat, lettre):
                j -= 1
            print(''.join(etat))

  31. #30
    invite4c80defd

    Re : Algorithmes Python

    vous devez avoir rasion, je mélange tout. Seulemtn, quand on essaie test_lettre, au résultat, n'a t'on pas , si l'on rentre Î, I à la sortie, dans ce cas là, la variante n'est pas prise en compte, si ?

    merci de votre aide

Page 1 sur 2 1 DernièreDernière

Discussions similaires

  1. Algorithmes
    Par inviteb2e2543b dans le forum Mathématiques du collège et du lycée
    Réponses: 5
    Dernier message: 03/02/2013, 14h14
  2. Tournois d’algorithmes
    Par invitefd5c905b dans le forum Programmation et langages, Algorithmique
    Réponses: 6
    Dernier message: 09/01/2013, 12h46
  3. algorithmes
    Par invite4a863132 dans le forum Programmation et langages, Algorithmique
    Réponses: 2
    Dernier message: 23/01/2012, 10h52
  4. Algorithmes
    Par invite40c2a12f dans le forum Mathématiques du collège et du lycée
    Réponses: 2
    Dernier message: 15/11/2011, 19h18
  5. Algorithmes
    Par invited3379a2d dans le forum Mathématiques du supérieur
    Réponses: 4
    Dernier message: 30/08/2010, 19h20