Voici une liste d’exercices pour expérimenter la construction d’algorithmes en se concentrant sur la construction de boucles. Le sujet porte sur la manipulation des chaînes de caractères. À l’instar des listes/tableaux, les chaînes peuvent être parcourues, et peuvent être vues comme une collection de caractères.
Une fois vos algorithmes conçus, il est recommandé de les coder en Python afin de pouvoir les tester. Cependant, si vous ne vous sentez pas encore à l’aise avec Python, vous pouvez simplement les écrire sur une feuille et les tester à la main.
Lors du test de vos algorithmes, essayez de penser à des cas couvrant tous les résultats possibles. Par exemple, si votre algorithme doit retourner true ou false, testez-le avec des entrées qui conduisent aux deux cas.
Contrainte – Il existe de nombreuses façons d’écrire un algorithme pour résoudre un problème, et de nombreuses façons de programmer un algorithme. Dans cette activité pratique, vous n’avez pas le droit d’utiliser le mot-clé break. Réfléchissez également soigneusement à savoir si vous avez besoin d’une boucle bornée (for) ou non bornée (while).
Important
Le but de cette séance est de vous aider à maîtriser des notions importantes en informatique. Un assistant de programmation intelligent tel que GitHub Copilot sera capable de vous fournir une solution à ces exercices uniquement à partir d’un nom de fichier judicieusement choisi.
Pour comprendre et apprendre, vous ne devez pas utiliser ces outils pour l’instant.
Prendre le temps de réfléchir, de concevoir des algorithmes et de les coder vous-même est essentiel pour acquérir les compétences nécessaires.
Contenu de l’activité
Dernière occurrence
Commencez avec le programme suivant :
# The string to manipulates ="IMT Atlantique"print(s)
# Write your codes here# ...
Concevez un algorithme qui détermine la position (entre 0 et la longueur de s moins 1) de la dernière occurrence d’un symbole dans la chaîne s. Le symbole recherché est stocké dans une variable nommée v. L’algorithme affiche la position trouvée ou indique si le symbole n’est pas présent dans s.
À faire
L’algorithme peut être évalué avec les valeurs suivantes :
s = "IMT Atlantique" et v = 'l'
s = "IMT Atlantique" et v = 'z'
s = "I love Computer Science and Algorithms" et v = 'o'
Correction
Cliquez ici pour afficher la correction.
Commencez avec le programme suivant :
# The string to manipulates ="IMT Atlantique"print(s)
# Write your codes here# ...
Concevez un algorithme qui détermine la position (entre 0 et la longueur de s moins 1) de la dernière occurrence d’un symbole dans la chaîne s. Le symbole recherché est stocké dans une variable nommée v. L’algorithme affiche la position trouvée ou indique si le symbole n’est pas présent dans s.
L’algorithme peut être évalué avec les valeurs suivantes :
s = "IMT Atlantique" et v = 'l'
s = "IMT Atlantique" et v = 'z'
s = "I love Computer Science and Algorithms" et v = 'o'
Correction
# The string to manipulates ="IMT Atlantique"print(s)
# The thing to searchv ='t'# Last occurrence of v in sindex = len(s) -1while index >=0and s[index] != v:
index -=1# Print resultif index >=0:
print("Found at index", index)
else:
print("Not found")
# The string to manipulates ="IMT Atlantique"print(s)
# The thing to searchv ='l'# Use string method to find last occurrenceresult = s.rfind(v)
# Print resultif result !=-1:
print("Found at index", result)
else:
print("Not found")
Première occurrence
Reprenez le même code de base que dans l’exercice 1.
Concevez un algorithme qui détermine la position (entre 0 et la longueur de s moins 1) de la première occurrence d’un symbole dans la chaîne s. Le symbole recherché est stocké dans une variable nommée v. L’algorithme affiche la position trouvée ou indique si le symbole n’est pas présent dans s.
À faire
L’algorithme peut être évalué avec les valeurs suivantes :
s = "IMT Atlantique" et v = 'l'
s = "IMT Atlantique" et v = 'z'
s = "I love Computer Science and Algorithms" et v = 'o'
Correction
Cliquez ici pour afficher la correction.
L’algorithme peut être évalué avec les valeurs suivantes :
s = "IMT Atlantique" et v = 'l'
s = "IMT Atlantique" et v = 'z'
s = "I love Computer Science and Algorithms" et v = 'o'
# The string to manipulates ="IMT Atlantique"print(s)
# The thing to searchv ='t'# Initialize variable for the while loopindex =0# Iterate from the start to the endwhile index < len(s) and s[index] != v:
index +=1# Print the resultif index < len(s):
print("Found at index", index)
else:
print("Not found")
# The string to manipulates ="IMT Atlantique"print(s)
# The thing to searchv ='l'# Use string method to find first occurrenceresult = s.find(v)
# Print resultif result !=-1:
print("Found at index", result)
else:
print("Not found")
Préfixe
Reprenez le même code de base que dans l’exercice 1.
Considérant un second tableau de caractères, nommé pref par exemple, déterminez si pref est un préfixe de s. Réfléchissez bien aux différents scénarios possibles liés aux longueurs de s et pref. L’algorithme affiche si pref est un préfixe de s.
À faire
L’algorithme peut être évalué avec les valeurs suivantes :
s = "IMT Atlantique" et pref = "IMT"
s = "IMT Atlantique" et pref = "IMT Atlantique is a great school"
s = "I love Computer Science and Algorithms" et pref = "I love"
Correction
Cliquez ici pour afficher la correction.
L’algorithme peut être évalué avec les valeurs suivantes :
s = "IMT Atlantique" et pref = "IMT"
s = "IMT Atlantique" et pref = "IMT Atlantique is a great school"
s = "I love Computer Science and Algorithms" et pref = "I love"
# The string to manipulates ="IMT Atlantique"print(s)
# The thing to searchpref ="IMT"# Iterate over the string util a different character is foundi =0while i < len(s) and i < len(pref) and s[i] == pref[i]:
i +=1# Print resultif i == len(pref):
print(pref, "is a prefix of", s)
else:
print(pref, "is not a prefix of", s)
# The string to manipulates ="IMT Atlantique"print(s)
# The thing to searchpref ="IMT"# Use string method for thatif s.startswith(pref):
print(pref, "is a prefix of", s)
else:
print(pref, "is not a prefix of", s)
Inverser
Reprenez le même code de base que dans l’exercice 1.
Déterminez un algorithme qui inverse le contenu de la chaîne s.
À faire
L’algorithme peut être évalué avec les valeurs suivantes :
s = "IMT Atlantique"
s = "euqitnaltA TMI"
s = "I love Computer Science and Algorithms"
Correction
Cliquez ici pour afficher la correction.
L’algorithme peut être évalué avec les valeurs suivantes :
s = "IMT Atlantique"
s = "euqitnaltA TMI"
s = "I love Computer Science and Algorithms"
# The string to manipulates ="IMT Atlantique"print(s)
# Loop to append to a new stringresult =""for character in s:
result = character + result
# Print the resultprint("Reversed string:", result)
# The string to manipulates ="IMT Atlantique"print(s)
# Using operator []result = s[::-1]
# Print the resultprint("Reversed string:", result)
Palindrome
Un palindrome est un mot qui peut se lire dans les deux sens, comme par exemple “radar” ou “laval”. Déterminez une première stratégie naïve pour vérifier si une chaîne est un palindrome basée sur l’algorithme d’inversion conçu précédemment.
À faire
L’algorithme peut être évalué avec les valeurs suivantes :
s = "laval"
s = "rennes"
s = "detartrated"
Correction
Cliquez ici pour afficher la correction.
# Initialize variabless ="LAVAL"i =0# Iterate over the stringwhile i < len(s) /2and s[i] == s[len(s) -1- i]:
i +=1# Show result# Show resultif i >= len(s) /2:
print(s, "is a palindrome")
else:
print(s, "is not a palindrome")
# The string to manipulates ="laval"print(s)
# Check if s is a palindromeif s == s[::-1]:
print(s, "is a palindrome")
else:
print(s, "is not a palindrome")
Défi supplémentaire (optionnel)
Un palindrome peut aussi être une phrase, telle que "A man, a plan, a canal: Panama". Adaptez votre algorithme pour ignorer les espaces, les signes de ponctuation et convertir en minuscules avant de vérifier si la chaîne est un palindrome.
À faire
Python fournit des méthodes intégrées pour ces opérations : isalnum(), lower().
Correction
Cliquez ici pour afficher la correction.
# The string to manipulates ="A man, a plan, a canal: Panama"print(s)
# Remove spaces, punctuation marks and convert to lowercasesimplified_s =""for character in s:
if character.isalnum():
simplified_s += character.lower()
# Iterate over the stringi =0while i < len(simplified_s) /2and simplified_s[i] == simplified_s[len(simplified_s) -1- i]:
i +=1# Show resultif i >= len(simplified_s) /2:
print(s, "is a palindrome")
else:
print(s, "is not a palindrome")
# The string to manipulates ="A man, a plan, a canal: Panama"print(s)
# Remove spaces, punctuation marks and convert to lowercasesimplified_s =''.join(character for character in s if character.isalnum()).lower()
# Check if s is a palindromeif simplified_s == simplified_s[::-1]:
print(s, "is a palindrome")
else:
print(s, "is not a palindrome")
Contient
Reprenez le même code de base que dans l’exercice 1.
Considérant un second tableau de caractères, nommé substr par exemple, déterminez si substr est présent dans s. L’algorithme retourne la position de la première occurrence de substr dans s ou -1 s’il n’est pas présent.
À faire
L’algorithme peut être évalué avec les valeurs suivantes :
s = "IMT Atlantique" et substr = "Atlan"
s = "IMT Atlantique" et substr = "Pyhton"
s = "I love Computer Science and Algorithms" et substr = "and"
Correction
Cliquez ici pour afficher la correction.
L’algorithme peut être évalué avec les valeurs suivantes :
s = "IMT Atlantique" et substr = "Atlan"
s = "IMT Atlantique" et substr = "Pyhton"
s = "I love Computer Science and Algorithms" et substr = "and"
# The string to manipulates ="IMT Atlantique"print(s)
# The thing to searchsubstr ="Atlan"defcontains(s, substr):
# Initialize variables index_start =0 index_sub =0 found =False# Outer loop: iterate through each position in the string where the substring could startwhile index_start <= len(s) - len(substr) and index_sub < len(substr):
# Inner loop: check if the substring matches at this position index_sub =0while index_sub < len(substr) and s[index_start + index_sub] == substr[index_sub]:
index_sub +=1 index_start +=1# Print a message if not foundif index_sub >= len(substr):
return index_start -1else:
return-1idx = contains(s, substr)
if idx !=-1:
print("Substring found at index", idx)
else:
print("Substring not found")
# The string to manipulates ="IMT Atlantique"print(s)
# The thing to searchsubstr ="Atlan"# You can directly check with 'in' keywordif substr in s:
print("Substring found at index", s.find(substr))
else:
print("Substring not found")
Pour aller plus loin
Hexadécimal
Considérez une chaîne représentant un nombre en format hexadécimal. Calculez sa valeur décimale.
Pour rappel, un nombre hexadécimal peut contenir les chiffres suivants : 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F. ‘A’ vaut 10, et ainsi de suite. Par exemple :
$$\text{8EA4} = 4 * 16^0 + 10 * 16^1 + 14 * 16^2 +8 * 16 ^3$$
À faire
Une solution intégrée existe en Python (et dans d’autres langages) pour résoudre ce problème, mais essayez de travailler avec des boucles pour vous familiariser avec leur utilisation. On suppose que chaque symbole dans la chaîne à convertir est un chiffre acceptable en format hexadécimal.
Une solution intégrée existe en Python (et dans d’autres langages) pour résoudre ce problème, mais essayez de travailler avec des boucles pour vous familiariser avec leur utilisation. On suppose que chaque symbole dans la chaîne à convertir est un chiffre acceptable en format hexadécimal.
# Initialize variablesto_convert ="8EA4"result =0# Iterate over the stringfor index in range(len(to_convert)):
# Convert to decimal value =Nonematch to_convert[index]:
case'A': value =10case'B': value =11case'C': value =12case'D': value =13case'E': value =14case'F': value =15case _ : value = int(to_convert[index])
# Aggregate to solution power = len(to_convert) - index -1 result +=16** power * value
# Print resultprint("Decimal version of", to_convert, "is", result)
# Value to convertto_convert ="8EA4"# Convert into decimalresult = int(to_convert, 16)
print("Decimal version of", to_convert, "is", result)