Les sous programmes Classe : 4ème Sciences et Math. ***** Proposé par : Bassem Amor. Matière : informatique. Année scolaire : 2021-2022. Étude de cas : On se propose d’écrire un programme permettant de : Lire un entier n (5≤n≤20). Remplir un tableau T par n entiers ∈[10,100] . Lire un entier e. Afficher la position de e dans T si e existe dans T et -1 sinon. Afficher T. Exemple : T: -1 8 20 0 6 0 1 2 3 4 e=20 → Le programme affiche 2. e=-3 → le programme affiche -1 Décomposition modulaire 1- Définition : Une approche qui consiste à décomposer un problème initialement complexe en sous problèmes abordables, puis associer à chaque sous problème un sous-programme qui le résout. 2- Notions de bases. a- Programme appelant/appelé : sp1 : un sous-programme appelé. Le programme principal est un programme appelant : appel les sous programmes. sp3 : un sous-programme appelé par rapport au programme principal et appelant par rapport au sousprogramme sp3_1 b- Les sous programmes en algorithmique sont : Les fonctions : ensemble d’instructions, appliquée sur des arguments passés en paramètre (appelé paramètres formels), qui renvoie un seul résultat (entier,réel,booléen,caractère,chaine de caractères) au programme appelant. Les procédures : ensemble d’instructions, appliquées sur des arguments passés en paramètre (appelé paramètres formels), qui renvoie zéros ou plusieurs résultats au programme appelant. Prog.appelant "appel" "résultat" "appel" "résultat" Procédure Prog.appelant "utilisateur" Procédure renvoie un résultat au prog. appelant Procédure "résultat" "utilisateur" Procédure renvoie zéros résultat au prog. appelant 3- Avantage de l’analyse modulaire : Simplifier la résolution du problème. Réutilisation des sous programmes. Faciliter la maintenance et la détection de bugs. Le développement du code des modules peut être attribué à des personnes différentes, qui effectuent leurs tests unitaires indépendamment. 4- Syntaxe Fonction : Déclaration au niveau algorithme : Fonction nom_fonction(pf1 :type1,pf2 :type2,…..,pfn:typen):type_résultat Début (module avec return) Traitement Retourner(résultat) Niveau python Fin Appel : objet← nom_fonction(pe1,pe2,…..,pen) Procédure : Déclaration au niveau algorithme : Procédure nom_ procédure (pf1 :type1,pf2 :type2,…..,pfn:typen) (module sans return) Début Traitement Fin Niveau python Appel : nom_ procédure(pe1,pe2,…..,pen) le mode de passage : Si le mode de passage est par référence (par adresse), on ajoutera le symbole @ avant le nom du paramètre. (module avec return) Bonnes pratiques analyse modulaire Si le programme appelé retourne au programme appelant : un seul résultat de type entier,réel,chaine,booléen Un tableau à une dimension/à deux dimensions Zéro résultat (le programme appelé affiche le résultat) Choix en algorithme fonction procédure procédure Plusieurs résultats de type (chaine,entier,réel,booléen,tableau) procédure Choix en python exemples En algorithme Module avec return Module sans return Module sans return Module avec return En python Fonction lecture(p,q :entier) :entier début Répeter Écrire("n=") Lire(n) Appel: Jusqu’à(p<n<q) a←lecture(3,6) Retourner(n) fin b←lecture(1,7) def lecture(p,q) : ok= False While ok== False: n=int(input("n=")) ok=p<n<q Appel: return (n) a=lecture(3,6) Procedure remplir(@T :Tab;n :entier) Début Pour i de 0 à n-1 faire Écrire("T[",i,"]=") Appel: Lire(T[i]) remplir(T,n) Fin pour Fin remplir(V,7) def remplir(T,n) : for i in range(n): T[i]=int(input("T["+str(i)+ "]=")) Procedure affiche(T :Tab;n :entier) Début Appel: Pour i de 0 à n-1 faire Écrire(T[i]) affiche(T,n) Fin pour affiche(V,7) fin Procedure permute(@x,@y :entier) Début i←x Appel: x←y y←i permute(a,b) fin def affiche(T,n) : for i in range(n): print(T[i]) b=lecture(1,7) Appel: remplir(T,n) remplir(V,7) Appel: affiche(T,n) affiche(V,7) def permute(x,y) : x,y=y,x return (x,y) Appel: (a,b)=permute(a,b) Remarque : l’équivalent en python de tout sous-programme (procédure ou fonction) qui retourne un ou plusieurs résultats au programme appelant, peut être un module avec return qui contient les paramètres résultat. 5- Le mot-clé "global" en python : En utilisant global, nous n’allons pas créer de nouvelle version de la variable localement à l'intérieur du module, mais d'utiliser plutôt la variable qui porte ce nom "en dehors", dans ce qui s'appelle l'environnement "global". Une solution pour l’activité (Analyse modulaire) : Programme principal calcul Procédure fonction lecture(p,q) Remplir(t,n) lecture(p,q) fonction Recherche(t,n,e) Procédure Afficher(t,n) Algorithme du programme principal : Algorithme calcul Début Tableau de déclaration de nouveaux types (T.D.N.T) : Type Tab=tableau de 20 entiers Appel du sous programme n←lecture(5,20) remplir(t,n) Tableau de déclaration des objets globaux (T.D.O.G): ecrire("e=") objet n t s e lecture remplir recherche afficher lire(e) s←recherche(t,n,e) ecrire(s) afficher(t,n) fin type Entier Tab Entier Entier Fonction Procédure Fonction procédure Remarque: variable locale : Algorithme de la fonction lecture Fonction lecture (p,q :entier) :entier Début Définie à l'intérieur d'un sous programme. Inaccessible depuis l'extérieur du sous programme. Détruite après l'exécution du sous programme. variable globale : Répéter Ecrire ("taper un entier entre", p,"et", q) Lire(x) Jusqu’à (p≤x≤q) Retourner(x) fin Définie à l'extérieur du sous programme. Contenu visible depuis l'intérieur du sous programme. Lorsqu'une variable locale et une variable globale porte le même nom, à l'intérieur d'une fonction, c'est la variable locale qui est prioritaire. Paramètres formels Les paramètres au niveau de l’entête du sousprogramme. Tableau de déclaration des objets locaux (T.D.O.L): objet x type Entier Par exemple : p et q. Paramètres effectifs : Les paramètres au niveau de l’appel du sousprogramme. Algorithme de la procédure remplir Procédure remplir (@ v :tab ; r : entier) Tableau de déclaration des objets locaux (T.D.O.L): Début objet i Pour i de 0 à r-1 faire type Entier v[i]←lecture(10,100) Fin pour Mode de passage des paramètres : fin Par référence ou par adresse : Algorithme de la fonction recherche Lorsque les modifications faites par le sousprogramme sur le paramètre formel sont appliquées sur le paramètre effectif. Fonction recherche (v :tab ;r,x :entier) :entier Début NB : Il est précédé par @ au niveau de l’entête. i←0 Par valeur : trouve←faux Tantque ((trouve=faux) et (i<r)) faire Si (v[i]=x) alors Lorsque les modifications faites par le sousprogramme sur le paramètre formel ne sont pas appliquées sur le paramètre effectif. trouve←vrai sinon Tableau de déclaration i←i+1 finsi fin tantque si (trouve=faux) alors des objets locaux (T.D.O.L): objet i y trouve type Entier entier booléen y←-1 sinon y←i finsi Retourner(y) fin Algorithme de la procedure afficher Procédure afficher (v :tab ; r : entier) des objets locaux (T.D.O.L): Début Pour i de 0 à r-1 faire Ecrire(v[i]) Fin pour fin Tableau de déclaration objet i type Entier Equivalent en python : import numpy as np #------------------ #------------------ def lecture(p,q): def afficher(v,r): ok=False while(ok==False): for i in range(r): print(v[i]) x=int(input("entier entre "+str(p)+" et "+str(q))) #------------------ ok=(p<=x<=q): n=lecture(5,20) return x t=np.array([0]*n,dtype='int') #------------------ remplir(t,n) def remplir(v,r): e=int(input('e= ')) for i in range(r): v[i]=lecture(10,100) #-----------------def recherche(v,r,x): i=0 trouve=False while((trouve==False) and (i<r)): if(v[i]==x): trouve=True else: i=i+1 if(trouve==False): y=-1 else: y=i return y s=recherche(t,n,e) print(s) afficher(t,n)