Algorithme qui place des étoiles entre chaque caractères

Résolu
Bonjour,
Je suis actuellement en train de faire un DM de NSI (numérique et sciences informatiques), mon exercice est le suivant :
Placez des "étoiles " entre chaque caractères.
J'ai un début d'algorithme :
def chaine_etoilee(chaine):
       index = 0
       white index  < len(chaine):
                print(chaine[index] + "*", end="")
                index  = index + 1

Lorsque on rentre un prénom dans la fonction comme Fred, cela nous renvoie : F*r*e*d*, alors que il faudrait : F*r*e*d
Auriez-vous des idées ?
Merci à ceux qui prendront le temps de me répondre !

6 réponses

  1. Modérateur
    Bonjour,

    Pense à utiliser les balises pour la colorisation du texte !

    white 
    tu es sur ?

    Tu devrais tester l'index par rapport à la longueur de la chaine, et dans le cas du dernier caractère, faire le print sans *

    Cdlt
    1
    1. Pardon petite erreur d'écriture concernant le "while", le correcteur a écrit "white"
      Concernant les balises pour la coloration du texte je ne vois pas de quoi tu parles.
      Pour le dernier caractères je ne vois pas trop comment l'écrire sans le "*"...
      Cdlt
      0
  2. Modérateur
    Bonjour
    Il suffit de faire ta boucle sur "nombre de caractères - 1 "

    1
    1. Bonjour,
      J'ai déjà essayé ce que tu me conseilles mais cela m'écrit : F*r*e* au lieu de F*r*e*d si j'ai bien compris ce que tu me dis.
      0
    2. Modérateur
      @ledebutantenpythonlaisse la boucle sur len, mais compare indice à len - 1 pour le dernier caractère

      une boucle for à la place de while t'évite de gérer l'indice

      et pour le code juste là, au dessus de la saisie de ton message l'icone <>^ qui permet de choisir le type du code, python
      0
    3. Modérateur
      @ledebutantenpythonOui, et il ne te reste plus qu'à afficher le dernier caractère une fois la boucle terminée
      chaine[len(chaine)-1]
      


      Il y a d'autres façons de réaliser cet exo.
      Par exemple,
      Tu peux faire un IF dans ta boucle pour savoir si tu es au dernier caractère ou non... et en fonction.. écrire ton * ou pas.

      Sinon tu dois également pouvoir utiliser un SPLIT sur la chaine
      Puis un join
      https://www.w3schools.com/python/ref_string_split.asp
      https://www.w3schools.com/python/ref_string_join.asp
      0
  3. Modérateur
    Alors tu en es où ?

    Moi j'ai 2 solutions, une avec un if dans la boucle, et la seconde, que je préfère, suggérée par jordane45, la boucle sur n-1 caractères et en sortie de boucle traitement du dernier caractère.

    Comme sur ton précédent exercice tu sembles partir d'une bonne logique mais avoir du mal à finaliser. Généralement quand on écrit un programme, on arrive à le faire tourner dans sa tête, on "voit" l'instruction s'exécuter, on traite la boucle, ... Aujourd'hui avec un ordinateur et un écran c'est facile. Tu devrais à chaque pas mettre des print pour voir le contenu de chaque variable, de chaque champ, presque de chaque instruction pour voir la trace complète de l'exécution.
    1
    1. J'ai une solution avec if:
      def chaine_etoilee(chaine):
      indice = 0
      for indice in chaine:
      if indice != len(chaine):
      print(chaîne[indice] + "*", end="")
      indice = indice + 1
      else :
      print(chaine[indice], end="")


      Le problème est qu'il me marque une erreur du type : string indices must be integers, a la ligne :
      print(chaine[indice] +"*", end="")
      
      0
    2. Modérateur
      @ledebutantenpythonje t'avais indiqué que l'interet du for, c'est que c'est lui qui gère l'indice de la boucle. Donc il ne doit être ni initialisé, ni incrémenté

      pour le message d'erreur, comme indiqué plus haut, sur un soucis de ce type, avant la ligne en erreur tu devrais afficher l'indice et tu devrais avoir une surprise sur son contenu

      pour la colorisation du code tu y es presque ;-) à coté de <> il y a une liste, pour selectionner le code : python
      0
    3. Très bien merci, je vais essayer de retravailler ma boucle.
      Sinon est-ce que la solution de jordane45 est elle plus simple ?
      0
    4. Modérateur
      @ledebutantenpythonelle évite un if, donc le code est plus léger, plus élégant. Plus subtile aussi, avec le if à la lecture on voit bien que le dernier caractère doit être traité différemment. Sans, ton cerveau doit faire plus de travail, du reverse engineering
      0
    5. Merci !
      J'ai enfin trouvé la solution, vous me l'aviez donné des le début et je n'avais rien vu...
      Mon programme est donc le suivant :
      def chaine_etoilee(chaine):
           for i in range(len(chaine)-1):
               print(chaine[i] + "*", end ="")
           print(chaine[len(chaine)]-1, end="")

      Pour la colorisation du texte j'avais fais cette manipulation mais je cela n'avais pas marché....
      0
  4. Donc tu voudrais que je fasse (jee pee)

    def chaine_etoilee(chaine):
    indice = 0
    for indice in (len(chaine)-1):
    print("chaine[indice] + "*", end = "")
    indice = indice + 1
    0
  5. Super, merci Jordan 45 je n'avais pas pensé au "if" !
    Mais mon problème est que lorsque j'effectue la commande :print(chaine[indice] + "*",end = ""), il me marque dans la console "string indices must be integers "
    0
    1. Modérateur
      il faut se rappeler qu'une chaine de caractère démarre à l'indice 0, donc pour une chaine de len=4 il faut utiliser, [0,1,2,3]
      0
  6. Oui c'est donc pour cela que j'initialise "indice = 0"
    0
    1. Modérateur
      là tu as toutes les billes, il faut juste que tu les assembles en faisant des tests
      0
    2. Desole mais je n'ai pas compris ce que tu souhaites me dire jee pee
      0
    3. Modérateur
      @ledebutantenpythonJe t'ai tout ecrit..
      Si tu ne sais pas me relire...ça va devenir compliqué
      0