Fonctions et procédures

Question 1

Donnez des exemples d'expressions qui ne sont pas affectables.

Parmi les morceaux de Python suivant, lesquels sont des expressions, des expressions affectables ou des instructions ?

t[n]     t[-1]     t[n+1]     t[n]+1
t(n)     t(n+1)     t(f[n+1])     t[f(n)+1]
x=y     x==y     x=3     3=x
import math     math.sqrt     return 0     print(t)

Question 2

Les déclarations suivantes sont elles des fonctions ou des procédures ?

Précisez ce que font ces définitions quand on les utilise.

def f(v):
    return [-v[1],v[0]]

def g(v):
    print("le vecteur est", v)

def h(v):
    g(f(v))

def i(v,b):
    if (b):
        return f(v)
    else:
        g(v)

Question 3

Que font ces définitions ? Quelles sont les différences ?

def milieu_majuscules(phrase):
    m = len(phrase)//2
    phrase[m] = phrase[m].upper()

def milieu_majuscules_bis(phrase):
    m = len(phrase)//2
    p = phrase[:]
    p[m] = p[m].upper()
    return p

Question 4

Considérez la définition suivante :

def une_etape(u, n=1, debug=False):
    if u < 0:
        print("Erreur : u ne devrait pas être négatif...")
        return
    if u%2 == 0:
        if debug:
            print("  - à l'étape", n, ": valeur paire, on divise par 2")
        u = u // 2
    else:
        if debug:
            print("  - à l'étape", n, ": valeur impaire, on multiplie par 3 et on ajoute 1")
        u = 3*u + 1
    if debug:
        print("    on trouve u(", n+1, ")  = ", u)
    return (u,n+1)

Évaluez à la main les expressions suivantes et précisez la valeur de l'expression et les affichages produits :

S'agit-il d'une procédure ou d'une fonction ?

Fonctions sur les listes

Dans cet exercice on utilise des points et des vecteurs du plan. Les deux notions sont confondues et représentées par leurs coordonnées dans une liste de taille deux.

Question 1

Écrivez les fonctions suivantes:

  1. une fonction "mul_scal(l, vecteur)" multipliant un vecteur du plan (représenté comme une liste de nombres flottants) par un réel (un flottant),
  2. une fonction "add_vec(vecteur1, vecteur2)" ajoutant deux vecteurs du plan,
  3. une fonction "sub_vec(vecteur1, vecteur2)" soustrayant deux vecteurs du plan (qui calcul aussi le vecteur qui relie deux points),
  4. une fonction "distance(vecteur1, vecteur2)" calculant la distance entre deux points du plan (rappelez vous du théorème de Pythagore !),
  5. une procédure "affiche(vecteur)" (devinez ce qu'elle doit faire) utilisée pour le déboggage.
  6. une fonction "rotation(alpha, vecteur)" qui calcule le vecteur obtenu par rotation de "vecteur" autour de son origine, d'angle "alpha".

Rappel : les coordonnées du vecteur (x,y) après rotation d'angle α sont cos(α) x - sin(α) y et sin(α) x + cos(α) y.

Question 2

Écrivez une fonction "polygone(un_sommet, nb_cotes, centre=[0,0])" prenant en argument les coordonnées d'un sommet et le nombre de cotés du polygone. Le troisième argument est le centre du polygone produit et pourra être ignoré dans un premier temps.

La fonction devra renvoyer la liste des coordonnées des sommets du polygone régulier correspondant.

Indication : vous aurez probablement besoin des fonctions suivantes : "from math import sqrt, sin, cos, pi".

Question 3

Écrivez une procédure "test_polygone(polygone)" qui vérifie qu'un polygone (donné par la liste de ses sommets) est bien réguliers. Cette procédure pourra par exemple afficher la longueur du plus petit et du plus grand coté du polygone et la différence entre ces deux longueurs. D'après vous, que remarquera-t-on si on évalue "test_polygone(polygone(un_sommet, nb_cote))".

Remarque : tester la longueur des cotés ne suffit pas. Pourquoi ?

Question 4

Pour construire un polygone à 2n cotés, on peut se passer des fonctions sin et cos, on peut prendre le milieu de chaque coté, et projeter ce point sur le cercle. Écrire une fonction "polygone_2_puissance(n)" qui produit un tel polygone, centré en l'origine et de rayon 1. (On considérera que n > 2).

Question 5

Écrivez une fonction "perimetre(sommets)" calculant le périmètre d'un polygone. Appliquer cette fonction au polygone produit par polygone_2_puissance(n). Que se passe-t-il si n est grand ?

Question 6

Était-il indispensable de calculer tous les sommets du polygone ?

En déduire une fonction "approx_pi(n)" qui calcule le nombre pi (plus n est grand plus le résultat est proche de pi).

Question 7

Faites une procédure "test_approx_pi(N)" affichant pour n allant de 2 à N, "approx_pi(n)" et "pi - approx(n)" en utilisant la valeur de pi que python connaît.

Question 8 (chez vous)

Programmez toutes ces fonctions et testez les.