Exercices supplémentaires.

Avant-propos :

Certains élèves sont un peu plus à l'aise avec la programmation et travaillent plus vite que les autres. Ici se trouve une série d'exercices pour les occuper en classe.

Dans un premier temps, le but de ces exercices est de croiser ce qui est enseigné en mathématiques et en NSI.

L'ensemble des fonctions créées doivent être dans un même fichier car des exercices ont besoin des fonctions précédemment écrites.

On pourra par exemple créer le fichier mathematiques.py dans son dossier.

1. Exercice :

Ecrire une fonction enleve_espaces_devant qui prend en paramètre un string texte et qui renvoie un string dépourvu des caractères "espace" placés devant s'il y en a.

Afin d'éclaircir ce qui est demandé, voici des exemples de réponses de la fonction:

>>> enleve_espaces_devant("     coucou")
"coucou"
>>> enleve_espaces_devant("coucou")
"coucou"
>>> enleve_espaces_devant("     cou cou")
"cou cou"
>>> enleve_espaces_devant("     cou cou  ")
"cou cou  "

2. Exercice :

Ecrire une fonction enleve_espaces_a_la_fin qui prend en paramètre un string texte et qui renvoie un string dépourvu des caractères "espace" placés à la fin s'il y en a.

Afin d'éclaircir ce qui est demandé, voici des exemples de réponses de la fonction:

>>> enleve_espaces_a_la_fin("coucou       ")
"coucou"
>>> enleve_espaces_a_la_fin("coucou")
"coucou"
>>> enleve_espaces_a_la_fin("cou cou                    ")
"cou cou"
>>> enleve_espaces_a_la_fin("     cou cou  ")
"     cou cou"

3. Exercice :

Ecrire une fonction nb_occurences(texte,caractere) qui prend en paramètres un string texte et un string caractere composé d'un unique caractère et qui renvoie un integer correspondant au nombre de fois où ce caractère est présent.

Afin d'éclaircir ce qui est demandé, voici des exemples de réponses de la fonction:

>>> nb_occurences("coucou","c")
2
>>> nb_occurences("coucou","h")
0
>>> nb_occurences("coucou.",".")
1
>>> nb_occurences("coucou ça va?"," ")
2

4. Exercice :

Ecrire une fonction est_un_nombre qui prend en paramètre un string nombre et qui renvoie un booléen qui vaut True si ce string représente un nombre réel sans avoir besoin d'effectuer d'opérations (hormis un changement de signe placé devant) et False sinon.

Afin d'éclaircir ce qui est demandé, voici des exemples de réponses de la fonction:

>>> est_un_nombre("32")
True
>>> est_un_nombre("32x")
False
>>> est_un_nombre("32+")
False
>>> est_un_nombre("32-")
False
>>> est_un_nombre("165204652456156416532")
True
>>> est_un_nombre("16520465245q6156416532")
False
>>> est_un_nombre("-32")
True
>>> est_un_nombre("+32")
True
>>> est_un_nombre("--32")
False
>>> est_un_nombre("3-2")
False
>>> est_un_nombre("       32          ")
True
>>> est_un_nombre("       -32          ")
True
>>> est_un_nombre("       - 32          ")
False
>>> est_un_nombre("3-2")
False
>>> est_un_nombre("32.2")
True
>>> est_un_nombre("-3.2")
True
>>> est_un_nombre("-3.2.2")
False
>>> est_un_nombre("-3 .2")
False
>>> est_un_nombre("    -3.2     ")
True
>>> est_un_nombre("-3.2.2")
False
>>> est_un_nombre("3-2")
False
>>> est_un_nombre("- 32")
False
>>> est_un_nombre("   000.0000002    ")
True
>>> est_un_nombre("-.0000002    ")
True

5. Exercice :

Ecrire une fonction conversion_nombres(expression) qui prend en paramètre un string expression qui correspond à un nombre et qui renvoie un integer si c'est possible ou un flottant

On gérera les opérations +, -, *, /, ^.

Afin d'éclaircir ce qui est demandé, voici des exemples de réponses de la fonction:

>>> conversion_nombres("     +32            ")
32
>>> conversion_nombres("32.0")
32
>>> conversion_nombres("32.1")
32.1
>>> conversion_nombres("-00032.00000000000000000000")
-32

6. Exercice :

Ecrire une fonction liste_expression_numerique(expression) qui prend en paramètre un string expression qui correspond à une expression numérique dépourvue de parenthèses et qui renvoie une liste composée des nombres et des opérations qui la composent.

On gérera les opérations +, -, *, /, ^.

Afin d'éclaircir ce qui est demandé, voici des exemples de réponses de la fonction:

>>> liste_expression_numerique("     223    +   4          ")
[223,"+",4]
>>> liste_expression_numerique("-223")
[-223]
>>> liste_expression_numerique("-2.3+45*7")
[-2.3,"+",45,"*",7]
>>> liste_expression_numerique("-45.000-7")
[-45,"-",7]
>>> liste_expression_numerique("2^80+7")
[2,"^",80,"+",7]

7. Exercice :

Ecrire une fonction evaluation_liste_sans_parenthese(liste) qui prend en paramètre une liste composé de nombres, ou de strings correspondant aux opérations et qui renvoie un integer (ou un flottant) qui correspond au résutat du calcul donné dans la liste.

On gérera les opérations +, -, *, /, ^.

L'algorithme procedera ainsi :

  1. On effectuera tous les calculs de puissance en parcourant la liste de la droite vers la gauche.
  2. On calculera tous les produits et quotients en parcourant la liste de la gauche vers la droite.
  3. Enfin, on effectuera les sommes et différences en parcourant la liste de la gauche vers la droite.

Afin d'éclaircir ce qui est demandé, voici des exemples de réponses de la fonction:

>>> evaluation_liste_sans_parenthese([2,"+",3])
5
>>> evaluation_liste_sans_parenthese([2,"^",3,"^",3])
134217728
>>> evaluation_liste_sans_parenthese([2,"-",3,"*",4])
-10

8. Exercice :

Une première satisfaction

Compléter la fonction calculs_expressions_sans_parentheses(expression) qui prend en paramètre un string représentant un calcul numérique sans parenthese et qui évalue le résultat.

def calculs_expressions_sans_parentheses(expression):
    return  .............................................................

Oui, il n'y a bien qu'une seule ligne à l'intérieur de cette fonction.

Afin d'éclaircir ce qui est demandé, voici des exemples de réponses de la fonction:

>>> calculs_expressions_sans_parentheses(" 23 + 5 * 4")
43
>>> calculs_expressions_sans_parentheses(" 23.0 + 5 * 4-2^3")
35

9. Exercice :

Une deuxième dans la foulée

Compléter la fonction calculs_expressions(expression) qui prend en paramètre un string représentant un calcul numérique qui peut avoir des parenthèses et qui évalue le résultat.

def calculs_expressions(expression):
        if .................... :          # Si l'expression comporte un caractère "("
            indice_droit=0
            while expression[indice_droit]!=")":
                indice_droit+=1
            indice_gauche=indice_droit
            while expression[indice_gauche]!="(":
                indice_gauche-=1
            nb=calculs_expressions_sans_parentheses(expression[indice_gauche+1:indice_droit])
            if  expression[indice_gauche-1] in ["+","-","*","/","^"] or indice_gauche==0:
                nouvelle_expression=expression[:indice_gauche]+str(nb)+expression[indice_droit+1:]
            else:  #pour traiter l'ajout d'une multiplication. Par ex 4(2+6)
                nouvelle_expression=expression[:indice_gauche]+"*"+str(nb)+expression[indice_droit+1:]
            
            print(nouvelle_expression)
            return ......................   #on lance calculs_expressions mais avec la nouvelle expression
        else:
            return ..........................    #on lance le calcul sans parenthese

Afin d'éclaircir ce qui est demandé, voici des exemples de réponses de la fonction:

>>> calculs_expressions("3*(2*(4+5))")
3*(2*9)
3*18
54
>>> calculs_expressions("3 + 4.0 *(6 +(2*4-(5/2)+(3/2))) ")
3 + 4.0 *(6 +(2*4-2.5+(3/2))) 
3 + 4.0 *(6 +(2*4-2.5+1.5)) 
3 + 4.0 *(6 +7.0) 
3 + 4.0 *13 
55

10. Exercice :

Ecrire une fonction liste_expression_litterale(expression) qui prend en paramètre un string expression qui correspond à une expression littérale en \(x\) dépourvue de parenthèses et qui renvoie une liste composée des nombres ( y compris \(x\)), des opérations qui la composent.

On gérera les opérations +, -, *, /, ^.

Afin d'éclaircir ce qui est demandé, voici des exemples de réponses de la fonction:

>>> liste_expression_numerique("   -x+5")
[-1,"*","x","+",5]
>>> liste_expression_numerique("12x^2+54x-3.2")
[12,"*","x","^",2,"+",54,"x","-",3.2]

11. Exercice :

Compléter la fonction evaluation_litterale_sans_parentheses(expression,valeur) qui prend en paramètre un string représentant une expression littérale avec \(x\) sans parenthese et qui évalue le résultat en remplaçant \(x\) par valeur.

Ne pourrait-on pas utiliser deux fonctions déjà créées afin de rendre cet exercice facile?

Afin d'éclaircir ce qui est demandé, voici des exemples de réponses de la fonction:

>>> evaluation_litterale_sans_parentheses("-x+2",45)
-43
evaluation_litterale_sans_parentheses("x^2",9)
81
evaluation_litterale_sans_parentheses("32x^3-45x+22+10x-x",3)
778

12. Exercice :

La récompense d'un dur labeur.

Compléter la fonction evaluation_litterale(expression,valeur) qui prend en paramètre un string représentant une expression littérale qui peut avoir des parenthèses et qui évalue le résultat.

def evaluation_litterale(expression,valeur):
        if ............................:          # Si l'expression comporte un caractère "("
            indice_droit=0
            while expression[indice_droit]!=")":
                indice_droit+=1
            indice_gauche=indice_droit
            while expression[indice_gauche]!="(":
                indice_gauche-=1
            nb=evaluation_litterale_sans_parentheses(expression[indice_gauche+1:indice_droit],valeur)
            if  expression[indice_gauche-1] in ["+","-","*","/","^"] or indice_gauche==0:
                nouvelle_expression=expression[:indice_gauche]+str(nb)+expression[indice_droit+1:]
            else:  #pour traiter l'ajout d'une multiplication. Par ex 4(2+6)
                nouvelle_expression=expression[:indice_gauche]+"*"+str(nb)+expression[indice_droit+1:]
            print(nouvelle_expression)
            return ........................................   # on relance evaluation_litterale avec la nouvelle expression 
        else:
            return ..................................................   #on lance le calcul sans parenthese

Afin d'éclaircir ce qui est demandé, voici des exemples de réponses de la fonction:

>>> evaluation_litterale("x(x+2)",5)
x*7
35
>>> evaluation_litterale("4x^5(-2x+2+(x+5))",5)
4x^5(-2x+2+10)
4x^5*2
25000

13. Exercice :

Maintenant que l'on est capable d'évaluer des expressions numériques et littérales, on s'attaque au développement d'expressions littérales de polynômes.

Compléter la fonction produit_litteral(expression) qui prend en paramètre un string représentant un produit ou succession de produits (sans parenthèse, sans somme, sans différence) d'expressions littérales avec \(x\) comme unique variable et qui renvoie un tuple contenant deux éléments : l'exposant de \(x\) et son coefficient.

Afin d'éclaircir ce qui est demandé, voici des exemples de réponses de la fonction:

>>> produit_litteral("x^2*5*2x")   # rappel : x^2*5*2x = 10x^3
(3,10)
>>> produit_litteral("3*8*5")
(0,120)
>>> produit_litteral("3x*8*x^2*5*x*-2")  #oui, logiquement il y a des parenthèses à -2, mais notre programme gère quand même
(4,-240)