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))
texte = input()
for pos in range(len(texte)):
if texte[pos] == " ":
print("_", end = "")
else:
print(texte[pos], end = "")
print()