Aller au contenu

Thème 3 : Chaînes de caractères

Une ligne sur deux

Algorithme

Une fois lu le nombre total de lignes, on va lire chacune des lignes, puis tester si son numéro est impair (à l’aide de l’opérateur "modulo") et l’afficher si c’est le cas.

Programme
   nbLignes = int(input())
   for idLigne in range(nbLignes):
      ligne = input()
      if idLigne % 2 == 0:
         print(ligne)

Lire ou ne pas lire, telle est la question

Algorithme

On ne va donc afficher un titre de livre que s’il est plus long que tous les titres qu’on a affichés précédemment, ce qui revient à dire qu’il est plus long que le dernier titre affiché, étant donné que chaque titre est forcément plus long que le précédent.

Il faut donc mémoriser la longueur du plus grand titre affiché et si un nouveau titre est plus long que cette longueur mémorisée, alors on affiche le titre et on met à jour cette longueur.

Cela ressemble donc un peu à un calcul de maximum.

Programme
   nbLivres = int(input())
   longueurPlusLongTitre = 0
   for loop in range(nbLivres):
      titreLivre = input()
      longueurTitre = len(titreLivre)
      if longueurTitre > longueurPlusLongTitre:
         longueurPlusLongTitre = longueurTitre
         print(titreLivre)

Analyse de fréquence

Algorithme

Il est nécessaire de compter le nombre de mots ayant 1 lettre, 2 lettres… 100 lettres. Il faut donc utiliser un tableau, car on ne va pas utiliser 100 variables différentes.

Une fois le tableau initialisé avec uniquement des zéros, il faut lire l’ensemble du texte ligne à ligne et/ou mot à mot, selon le langage utilisé. Ensuite, on va calculer la longueur de chaque mot lu, puis mettre à jour la valeur dans l’histogramme.

À la fin, il faut analyser l’histogramme et dès qu’on trouve une valeur différente de zéro (c’est-à-dire qu’il y avait au moins un mot de cette longueur dans le texte), alors on affiche la longueur, puis le nombre de mots de cette longueur, selon le format donné dans l’énoncé.

Programme
   nbLignes, nbMots = map(int, input().split(" "))
   histogramme = [0] * 101
   for loop in range(nbLignes):
      mots = input().split(" ")
      for idMot in range(nbMots):
         longueur = len(mots[idMot])
         histogramme[longueur] = histogramme[longueur] + 1
   for longueur in range(101):
      if histogramme[longueur] > 0:
         print("{} : {}".format(longueur, histogramme[longueur]))

Écriture en miroir

Algorithme

On utilise une boucle pour lire chaque ligne de texte, l’une après l’autre. Pour chaque ligne, il faut alors afficher les caractères en partant de la fin.

Programme
   nbLignes = int(input())
   for loop in range(nbLignes):
      ligneTexte = input()
      longueur = len(ligneTexte)
      for idCaractere in range(longueur):
         print(ligneTexte [longueur - 1 - idCaractere], end = "")
      print()

La bataille

Algorithme

Si l'on a jamais joué à la bataille il est bon de prendre quelques exemples et de les traiter "à la main". Ils seront utiles ensuite pour tester le programme. Trois exemples au moins sont nécessaires (égalité parfaite, 1 gagne car il possède une meilleure carte, 1 gagne car 2 n'a plus de cartes). Ensuite on peut commencer à penser à la structure du programme. Si on se base sur ce que l'on a fait à la main, on a envie d'écrire :

  Lire les chaines de caractères cartes1 et cartes2
  Tant que le vainqueur est inconnu
     on continue à jouer en comptant les égalités
  Afficher le vainqueur et le nombre d'égalités

Maintenant que l'on a fixé les grandes lignes du code, on peut rentrer dans les détails. Que signifie « le vainqueur est inconnu » ?

Cela correspond au cas où toutes les cartes étaient identiques et que chaque joueur à encore au moins une carte. Et dans ce cas que signifie « on continue à jouer » ?

  On passe à la carte suivante.
  nbCartes1 <- longueur(cartes1)
  nbCartes2 <- longueur(cartes2)
  nbEgalités <- 0
  tour <- 0
  Tant que tour < nbCartes1 ET tour < nbCartes2 ET cartes1[tour] = cartes2[tour]
     nbEgalités <- nbEgalités + 1
     tour <- tour + 1

Un examen plus attentif nous montre que les variables tour et nbEgalités sont identiques. Cette dernière variable est donc inutile. Et le code se simplifie donc en :

  tour <- 0
  Tant que tour < nbCartes1 ET tour < nbCartes2 ET cartes1[tour] = cartes2[tour]
     tour <- tour + 1

Reste à afficher les résultats. Le plus simple est le cas d'égalité parfaite. Si tour = nbCartes1 ET tour = nbCartes2

Si l'on n'est pas dans ce cas c'est que l'un des joueur à gagné. Par exemple, le joueur 1 à gagné quand le joueur 2 n'a plus de cartes ou quand il lui reste une carte et quelle est meilleure que celle de son adversaire. Ce qui se traduit par sinon si tour = nbCartes2 OU (tour < nbCartes1 ET cartes1[tour] < cartes2[tour])

Programme
   main1 = input()
   main2 = input()
   tour = 0
   while tour < len(main1) and tour < len(main2) and main1[tour] == main2[tour]:
      tour = tour + 1
   if tour == len(main1) and tour == len(main2):
      print("=")
   elif tour == len(main2) or (tour < len(main1) and main1[tour] < main2[tour]):
      print(1)
   else:
      print(2)
   print(tour)

Analyse d’une langue

Algorithme

Il suffit de lire les lignes une par une, puis de comparer chacun de leurs caractères à la lettre dont on doit chercher le nombre d’apparitions. Dès qu’on trouve cette lettre dans le texte, on augmente de 1 le compteur nbFois dont on affichera la valeur à la fin.

Programme
   lettre = input()
   nbLignes = int(input())
   nbFois = 0
   for loop in range(nbLignes):
      ligne = input()
      for idLettre in range(len(ligne)):
         if ligne[idLettre] == lettre:
            nbFois = nbFois + 1
   print(nbFois)

Sans espaces

Algorithme

Après avoir lu la ligne de texte, il existe deux variantes pour cet exercice :

  • remplacer les espaces par des '_' dans le texte puis l'afficher,
  • regarder les caractères un par un et les afficher (ou afficher '_' s'il s'agit d'un espace).

Ci-dessous nous vous présentons les deux variantes, n'hésitez pas à les comparer afin de voir celle que vous préférez.

Programme

Avec modification du texte :

   texte = list(input())
   for pos in range(len(texte)):
      if texte[pos] == " ":
         texte[pos] = "_"
   print("".join(texte))
Sans modification du texte :

   texte = input()
   for pos in range(len(texte)):
      if texte[pos] == " ":
         print("_", end = "")
      else:
         print(texte[pos], end = "")
   print()