Corrigé : le compte est bon

Question 1

Fichier main.py :

chaine_entrée = ""

while chaine_entrée != "sortie":
    chaine_entrée = input("Entre une chaîne de caractères : ")
    caractère_entrée = input("Entre un caractère : ")

    index_caractère = chaine_entrée.find(caractère_entrée)
    print("Premier index du caractère :", index_caractère)

Question 2

fonctions.py

def donne_prochain_indice(chaine, indice):
    possible_suivant = chaine.find(chaine[indice], indice + 1)

    if possible_suivant > -1:
        return possible_suivant
    return None

test_fonctions.py

from fonctions import donne_prochain_indice


def test_donne_prochain_indice():
    assert donne_prochain_indice("bxaaxaaaxax", 4) == 8
    assert donne_prochain_indice("bxaaxaaaxax", 0) == None

main.py

On ajoute à la fin du fichier main.py les lignes suivantes, dans le bloc while :

    if index_caractère == -1:
        print("Il n'apparaît pas")
    elif donne_prochain_indice(chaine_entrée, index_caractère) != None:
        print("Il apparaît plusieurs fois")
    else:
        print("Il apparaît une fois")

Question 3

fonctions.py

def compte_caractère(chaine, indice):
    compte = 0

    while indice != None:
        compte += 1
        indice = donne_prochain_indice(chaine, indice)

    return compte

test_fonctions.py

from fonctions import compte_caractère 


def test_compte_caractère():
    assert compte_caractère("bxaaxaaaxax", 0) == 1
    assert donne_prochain_indice("bxaaxaaaxax", 1) == 4

main.py

On ajoute à la fin du fichier main.py les lignes suivantes, dans le bloc while :

    if index_caractère > -1:
        print("caractère apparaît", compte_caractère(chaine_entrée, index_caractère), "fois.")

Question 4

fonctions.py

def donne_max_doublon(chaine):
    nombre_max = 0

    for i in range(len(chaine)):
        nombre_max = max(nombre_max, compte_caractère(chaine, i))

    return nombre_max

test_fonctions.py

from fonctions import donne_max_doublon


def test_donne_max_doublon():
    assert donne_max_doublon("bxaaxaaaxax") == 6

main.py

On ajoute à la fin du fichier main.py les lignes suivantes, dans le bloc while :

    if index_caractère > -1:
        if index_caractère == donne_max_doublon(chaine_entrée):
            print("c'est le max !")

Fichiers complets

fonctions.py

def donne_prochain_indice(chaine, indice):
    possible_suivant = chaine.find(chaine[indice], indice + 1)

    if possible_suivant > -1:
        return possible_suivant
    return None


def compte_caractère(chaine, indice):
    compte = 0

    while indice != None:
        compte += 1
        indice = donne_prochain_indice(chaine, indice)

    return compte


def donne_max_doublon(chaine):
    nombre_max = 0

    for i in range(len(chaine)):
        nombre_max = max(nombre_max, compte_caractère(chaine, i))

    return nombre_max

test_fonctions.py

from fonctions import compte_caractère, donne_prochain_indice, donne_max_doublon


def test_donne_prochain_indice():
    assert donne_prochain_indice("bxaaxaaaxax", 4) == 8
    assert donne_prochain_indice("bxaaxaaaxax", 0) == None


def test_compte_caractère():
    assert compte_caractère("bxaaxaaaxax", 0) == 1
    assert donne_prochain_indice("bxaaxaaaxax", 1) == 4

def test_donne_max_doublon():
    assert donne_max_doublon("bxaaxaaaxax") == 6

main.py

from fonctions import donne_prochain_indice, compte_caractère, donne_max_doublon

chaine_entrée = ""

while chaine_entrée != "sortie":
    chaine_entrée = input("Entre une chaine de caractères : ")
    caractère_entrée = input("Entre un caractère : ")

    index_caractère = chaine_entrée.find(caractère_entrée)
    print("Premier index du caractère :", index_caractère)

    if index_caractère == -1:
        print("Il n’apparaît pas")
    elif donne_prochain_indice(chaine_entrée, index_caractère) != None:
        print("Il apparaît plusieurs fois")
    else:
        print("Il apparaît une fois")

    if index_caractère > -1:
        print("caractère apparaît", compte_caractère(chaine_entrée, index_caractère), "fois.")

        if index_caractère == donne_max_doublon(chaine_entrée):
            print("c'est le max !")