Vous êtes sur la page 1sur 38

Universit A-MIRA

ALGORITHME
EXERCICES
TINSALHI Faouzi

2Anne

Sommaire :

1 exercices simples..1 2 exercice en utilisant les structures IALORSSINON et SELONQUE.2 3 exercices en utilisant les structures TANT QUE et REPETERJUSQU'A et POUR10 4 exercices sur les Tableaux..17 5 Exercices gnraux sur les actions paramtres19 6 Entits : types structurs22 7 Tableaux tris et dcoupages fonctionnels..26 8 Les Chanes..29 9 Les fichiers...33

1 exercices simples

Exercice 1 : Ecrire un algorithme dune action qui change deux variables A et B Action : Echange Var : A, B, C : rels Dbut : Ecrire ( Saisissez deux variables ) Lire (A, B) C <= A A <= B B <= C Ecrire ( les valeurs de , A, et de , B, ont t changes ) Fin

Exercice 2 : Ecrire une fonction qui donne les carr dun rel Fonction : carr (x :rel) :rel Var : x_au_carr Dbut x_au_carr <= x*x retourner x_au_carr fin Remarques : Dans une fonction, la seule variable qui est dfinie est celle du rsultat, les autres sont dfinies dans la fonction mre, et apparaissent ici en temps quentres. Dans une fonction, ne pas oublier de retourner le rsultat.

2 exercice en utilisant les structures SIALORSSINON et SELONQUE

Exercice 3 : Ecrire une action qui fournit les flicitations ou lajournement dun lve suivant sa note en utilisant Si-alors-sinon. Action : Jury Var : note : rel Dbut : lire (note) Si note <10 alors crire ( ajourn ) Sinon crire ( reu ) Fin

Exercice 4 : Ecrire un programme qui donne la valeur absolue de 2 rels : Action : Valeur_absolue Var : a, b : rels Dbut : Ecrire ( saisissez 2 rels ) Lire (A, B) Ecrire les valeurs absolues de A et de B sont : ) Si A<0 alors crire (-A) Sinon crire (A) Ecrire ( et ) Si B<0 alors crire (-A) Sinon crire (A) Fin Remarque : on peut aller plus vite en crant une fonction valeur absolue et en faisant appel cette fonction dans une action : Fonction : valAbs (x :rel) :rel Var : absx : rel Dbut : si x <0 alors absx <= -x Sinon absx <= x Retourner absx Fin Et Action : Valeur_absolue2 Var : A, B rels Dbut : Ecrire ( saisissez 2 rels ) Lire (A, B)

Ecrire ( les valeurs de A et B sont : , valAbs(A), et , valAbs(B))

Ecrire 5 : Faire un programme qui donne le volume dun cylindre en faisant appel une fonction aire dun cercle. Fonction : aire_cercle (rayon :rel) :rel Var : Aire : rel Const : PI=3.14 Dbut : Aire <= PI*rayon*rayon Retourner (Aire) Fin Fonction : volume_cercle (hauteur, rayon :rels) :rel Var : volume : rel Dbut : Volume <=aire_cercle (rayon)*hauteur Retourner volume Fin

Exercice 6 : Ecrire un algorithme permettant de rsoudre une quation du premier degr Action : premierdegre Var : a, b, x rels Dbut : Ecrire ( saisissez les valeurs a et b de lquation ax+b=0 : ) Lire (a, b) Si a = 0 alors crire ( pas de solution ) Sinon crire ( la solution est x= , -b/a) Fin

Exercice 7 : Ecrire un algorithme permettant de rsoudre une quation du second degr en utilisant des si alors.. Action : seconddegr Var : a, b, c, delta Dbut : Ecrire ( saisissez les valeurs a, b et c de lquation ax+bx+c=0 : ) Lire (a, b, c) Si a=0 alors crire ( quation du premier degr ) Sinon delta<=b-4*a*c Dbut Si delta>0 alors crire ( les solutions de lquation sont , sqrt(delta))/(2*a), et , (-b+sqrt(delta))/(2*a)) Sinon Dbut Si d=0 alors crire ( -b/(2a)) Sinon crire ( pas de solutions relles )

(-b-

Fin Fin Fin Ecrire le mme algorithme avec des selon-que : Action : seconddegr Var : a, b, c, delta Dbut : Ecrire (saisissez les valeurs de a, b et c de lquation ax+bx+c) Lire (a, b, c) Si a=0 alors crire ( rsoudre permier degr ) Sinon dbut Delta <= b-4*a*c Selon que Delta > 0 : crire ((-b-sqrt(delta))/(2*a), (-b+sqrt(delta))/(2*a)) Delta = 0 : crire (( -b/(2a)) Sinon crire ( pas de solution relle ) Fin selon Fin

Exercice 8 Ecrire un algorithme qui donne la dure de vol en heure minute connaissant lheure de dpart et lheure darrive. 1) on considre que le dpart et larrive ont lieu mme jour 2) idem mais sans faire les conversions en minutes 3) on suppose que la dure de vol est infrieure 24 heures mais que larrive peut avoir lieu le lendemain.

1) Action : DureVol1 Var : h1, h2, m1, m2, hr, mr : entiers Dbut : Ecrire ( entrer horaire de dpart et darrive ) Lire (h1, m1, h2, m2) mr <= [h2*60+m2] [h1*60+m1] hr <= mr/60 mr <= mr%60 Ecrire ( dure de vol : , hr, mr) Fin Remarque : lopration % (modulo) permet de calculer le reste de la division entire. 2) Action : DureVol2 Var : h1, h2, hr, m1, m2, mr : entiers Dbut : Ecrire ( entrer horaire de dpart et darrive ) Lire (h1, m1, h2, m2) Si m2>m1 alors hr <= h2-h1 et mr <= m2-m1

Ecrire (hr, mr) Sinon hr <= h2-h1-1 et mr <= m2+60-m1 Ecrire (hr, mr) Fin

3) Action : DureVol3 Var : h1, h2, m1, m2, hr, mr : entiers Dbut : Ecrire ( entrer horaire de dpart et darrive ) Lire (h1, m1, h2, m2) Si h2>h1 alors Si m2>m1 alors hr <= h2-h1 et mr <= m2-m1 Ecrire (hr, mr) Sinon hr <= h2-h1-1 et mr <= m2+60-m1 Ecrire (hr, mr) Sinon Si m2>m1 alors hr <= h2-h1+24 et mr <= m2-m1 Ecrire (hr, mr) Sinon hr <= h2-h1+24-1 et mr <= m2+60-m1 Ecrire (hr, mr) Fin

Exercice 9 1) Ecrire une fonction max3 qui retourne le maximum de trois entiers 2) Ecrire une fonction min3 qui retourne le minimum de trois entiers 3) Ecrire une fonction max2 qui retourne le maximum de deux entiers 4) Ecrire une fonction max3 qui retourne le maximum de trois entiers en faisant appel max2

1) Fonction : max3(a, b, c : entier) : entier : Var : max3 : entier Dbut : Si a>b alors Si a>c alors max3 <= a Sinon max3 <= c Sinon Si c>b alors max3 <= c Sinon max3 <= b Retourner (max3) Fin 2)

Fonction : min3(a, b, c : entier ) : entier : Var min3 : entier Dbut Retourner (max3(-a, -b, -c)) Fin 3) Fonction : max2 (a, b : entier) : entier Var : max2 : entier Dbut : Si a<b alors max2 <= b Sinon max2 <= a Retourner (max2) Fin 4) Fonction : max3 (a, b, c : entier) : entier : Var : max3 : entier Dbut : max3 <= max2 [max2 (a, b), c) Retourner (max3) Fin

Exercice 10 Ecrire avec des Si Alors Sinon une action permettant la saisie dune note n (0n20) et qui affiche la mention (n16 : TB, n14 : B, n12 : AB, n10 : Passable, n10 : Ajourn) Action : Mention Var Note : rel Dbut : Ecrire ( saisissez une note ) Lire (Note) Si Note16 alors crire ( TB ) Sinon Si Note14 alors crire ( B ) Sinon Si Note12 alors crire ( AB ) Sinon Si Note10 alors crire ( Passable ) Sinon crire ( ajourn ) Fin Alternative : crire le mme programme avec des Selon Que : Action : Note Var : Note : rel Selon que Note 16 crire ( TB ) Note 14 crire ( B ) Note 12 crire ( AB ) Note 10 crire ( Passable ) Sinon crire ( ajourn ) 6

Exercice 11 Soit lalgorithme suivant : Action : Permis_voiture Var : permis, voiture : boolen Dbut : Ecrire ( avez-vous le permis ? (0/1) ) Lire (permis) Ecrire ( avez vous une voiture ? (0/1) ) Lire (voiture) Si non permis ou voiture alors Si voiture alors crire ( conduisez moi la gare ) Sinon crire ( jai une voiture pas chre ) Sinon Si voiture alors crire ( vous tes hors la loi ) Sinon crire ( vive le vlo ) fin

1) 2) 3) 4)

Ecrire larbre des conditionnelles Corriger les tests pour que tous les cas soient couvert de manire cohrente Faites correspondre les actions et les tests correctement Si possible, crire cet algorithme avec des selon que. permis Vive le vlo voiture Ni permis ni voiture Conduisez moi la Voiture pas chre gare Hors la loi Vive le vlo

Permis et voiture gare

Conduisez moi la Voiture pas chre gare

En clair, selon lalgorithme propos : si lon a le permis et la voiture on peut amener quelquun la gare ; si lon a que le permis on dit vive le vlo, si lon na que la voiture on conduit aussi la gare, enfin si lon a ni permis ni voiture alors on achte une voiture pas chre. Le cas hors la loi nest pas voqu et les correspondance sont inexactes. Il faut videmment avoir : - permis et voiture : conduire la gare - permis : jai une voiture pas chre - voiture : vous tes hors la loi - ni voiture, ni permis : vive le vlo Correction de lalgorithme propos : Action : Permis_voiture Var : permis, voiture : boolen Dbut : Ecrire ( avez-vous le permis ? (0/1) ) Lire (permis) Ecrire ( avez vous une voiture ? (0/1) ) Lire (voiture) Si permis ou voiture alors Si voiture alors crire ( conduisez moi la gare ) Sinon crire ( jai une voiture pas chre )

Sinon Si voiture alors crire ( vous tes hors la loi ) Sinon crire ( vive le vlo )

On peut effectivement crire cet algorithme avec des selon-que : Action : permis_voiture Var : permis voiture : rel Dbut : Ecrire ( avez-vous le permis ? (0/1) ) Lire (permis) Ecrire ( avez vous une voiture ? (0/1) ) Lire (voiture) Selon que : Permis et voiture : crire ( conduisez moi la gare ) Permis et non voiture : crire ( jai une voiture pas chre ) Non permis et voiture : ( vous tes hors la loi ) Non permis et non voiture : ( vive le vlo ) Fin

Exercice 12 Ecrire un programme calculatrice permettant la saisie de deux entiers et une opration boolen- ( +, - , / , x ) et affichant le rsultat. Donner avant cela les spcifications, la solution en langage naturel, les structures de donnes. Spcifications : Donnes : 2 oprandes et un oprateur Rsultat : rsultat de lopration choisie Solution en langage naturel : Saisie des donnes, envisager tous les cas : +, - , x, /. Attention la division par zro qui est impossible Structure de donnes : 2 oprandes : des entiers Un oprateur boolen : +, -, * , / Algorithme : Action : calcul Var : a, b : rel op : boolen Dbut Ecrire ( saisissez le premier entier ) Lire (a) Ecrire ( saisissez loprateur ) Lire (op) Ecrire ( saisissez la deuxime variable ) Lire (b) Selon que : Op = + : Ecrire (a+b) Op = * : Ecrire (a*b) Op = / : Si b= 0 alors crire ( division impossible ) Sinon crire (a/b)

Op = - : Ecrire (a-b) Fin selon Fin

3 exercices en utilisant les structures rptitives TANT QUE et REPETERJUSQU'A et POUR

Exercice 13 Ecrire le programme qui affiche la somme dune suite dentiers saisie par lutilisateur se terminant par zro. Exemple : lutilisateur entre 1, puis 5, puis 2, puis 0 : affiche : 8 1) donner les spcifications 2) donner la solution en langage naturel 3) indiquer les structures de donnes 4) faites lalgorithme Spcifications : - donnes : suite de nombre entiers se terminant par zro - rsultat : la somme de ces entiers Solution en langage naturel : tant que lentier saisi nest pas zro, lajouter la somme partielle et saisir lentier suivant. Structure de donnes : - entier : entier courant (saisi) - entier : somme partielle Algorithme : Action : Somme Suite Var : a, s : entiers Dbut s<=0 dinitialiser!!! Lire (a) Tant que a0 faire Dbut s<=s+a Lire (a) Fin Ecrire (s) Fin

Attention : dans une structure tant que ne pas oublier

Exercice 14 Ecrire un algorithme qui affiche la moyenne dune suite dentiers se terminant par zro (le zro nentrant pas en compte dans la moyenne : il est juste la pour indiquer la fin de saisie) 1) donner les spcifications 2) donner la solution en langage naturel 3) indiquer les structures de donnes 4) faites lalgorithme

10

Spcification : - donnes : suite dentier se terminant par zro - rsultat : la moyenne de ces entiers (zro exclu) Solution en langage naturel : Tant que lentier saisi diffrent de 0 alors ajouter lentier aux entiers prcdents et faire la moyenne (cest dire diviser par le nombre dentiers Structures de donnes : - entier : entier saisi - entier : rsultat moyenne Algorithme : Action : Moyenne Var : n, moy, s : entiers Dbut : moy<=0 s<=0 Lire (n) Tant que n0 faire Dbut Moy <= moy*s+n)/(s+1) s<=s+1 lire (n) fin Ecrire (moy) Fin

Exercice 15 Ecrire un algorithme permettant la saisie dune suite dentiers se terminant par zro et vrifier si cette suite contient deux entiers conscutifs gaux en utilisant les structures tant que. 1) donner les spcifications 2) donner la solution en langage naturel 3) indiquer les structures de donnes 4) faites lalgorithme Spcifications : - donnes : suite dentier se terminant par zro - rsultat : vrai si deux entiers conscutifs, faux sinon. Solution en langage naturel : comparer lentier courant et le prcdent. Et tant que ils sont diffrents, on continu la lecture et tant que lentier courant est diffrent de zro. Structures de donnes : - entier : nombre courant - entier : nombre prcdent Algorithme : Action : Entiers conscutifs

11

Var : nc, np : entier {on dsignera par nc le nombre courant et np le nombre prcdent} Dbut Lire (nc) np<=nc-1 {pour tre sur que le nombre courant ne sera pas le mme que le nombre prcdent ds le dpart on affecte la valeur nc-1 au nombre prcdent. On aurait tout aussi bien pu lui donner la valeur zro) Tant que nc0 et np nc faire Dbut np<=nc lire (nc) fin Si nc0 alors crire ( oui ) Sinon crire ( non ) Fin

Refaire le mme algorithme en utilisant une structure rpter jusqu' Action : Entiers conscutifs Var : nc, np : entiers Dbut Lire (nc) Si nc 0 alors Rpter Dbut np <= nc lire (nc) jusqu' (nc=np ou nc=0) Si nc=0 alors crire ( oui ) Sinon crire ( non ) Fin

Exercice 16 Ecrire un algorithme qui affiche le maximum dune suite se terminant par zro 1) donner les spcifications 2) donner la solution en langage naturel 3) indiquer les structures de donnes 4) faites lalgorithme Spcifications : - donnes : une suite dentiers se terminant par zro - rsultat : un entier : le maximum de cette suite Solution en langage naturel : comparer lentier courant avec le maximum et tant que nc<max on continue, sinon on affiche la rsultat et on continue, et tant que nc 0 Structures de donnes - n : entier courant (saisi) - max : entier max de la suite

12

Algorithme : Action : max suite Var : n, max : entiers Dbut Lire (n) Max<=n Tant que n 0 faire Dbut Lire (n) Si max<n alors max<=n Fin Ecrire (max) Fin

Exercice 17 Ecrire un programme mettant en uvre le jeu suivant : Le premier utilisateur saisi un entier que le second doit deviner. Pour cela, il a le droit autant de tentatives quil souhaite. A chaque chec, le programme lui indique si lentier cherch est plus grand ou plus petit que sa proposition. Un score indiquant le nombre de coups jous est mis jour et affich lorsque lentier est trouv. 1) donner les spcifications 2) donner la solution en langage naturel 3) indiquer les structures de donnes 4) faites lalgorithme Spcifications : - donnes : nombre entier - rsultat : nombre de tentatives Solution en langage naturel : saisir un nombre entier par le premier joueur. Tant que le joueur 2 nsaisie, dire si n est > ou < nombre cherch, incrmenter de 1 et continuer. Quand le rsultat est trouv, afficher le nombre de tentatives. Structures de donnes : - a : nombre saisi par lutilisateur 1 - n : nombre saisi par lutilisateur 2 - t : tentatives Algorithme : Action : devinette Var : a, n, t : entiers Dbut : Lire (a) Lire (n) t=0 Tant que an faire Dbut Si n>a alors crire ( nombre cherch plus petit ) Sinon crire ( nombre cherch plus grand )

13

t<=t+1 lire (n) fin crire (t+1) fin

Exercice 18 Ecrire un algorithme permettant de calculer le PGCD de deux nombres en utilisant lastuce suivante : soustraite le plus petit des deux entiers du plus grand jusqu' ce quils soient gaux Ecrire le mme programme en utilisant lalgorithme dEuclide : dune part en utilisant uniquement les structures TANT QUE, dautre part en utilisant uniquement les structures REPETER JUSQU'A. Action : PGCD Var : a, b entiers Lire (a, b) Dbut a = ValAbs (a) b = ValAbs (b) Rpter Selon que a>b a<=a-b a<b b<=b-a jusqua a=b crire (a) Fin

Mme programme avec Euclide et des TANT QUE : Action : PGCD Var : a, b, r entiers Lire (a, b) r<=a%b tant que r0 faire dbut a<=b b<=r r<=a%b fin crire (b) fin Mme programme avec Euclide et des REPETER JUSQU'A : Action : PGCD Var : a, b, r entiers Lire (a, b) Rpter r<=a%b a<=b b<=r

14

jusqu' r=0 crire (b) fin

Exercice 19 Ecrire avec la commande POUR un algorithme qui permet de faire la somme dune suite de nombre entre par lutilisateur. Faire la mme chose en comptant par pas de 1. Action :somme_nombre Var : k, nb, n, somme : entier Dbut : Somme <= 0 Ecrire ( combien voulez-vous entrer de nombres ? ) Lire (nb) Pour k de 1 nb faire Dbut Lire (n) Somme<=somme + n Fin Ecrire (somme) Fin Mme programme par pas de 1 : Action : somme_entier Var : k, nb, n, somme : entiers Dbut : Somme<=0 Ecrire ( combien voulez-vous entrer de nombres ? Lire (nb) Pour k de nb 1 par pas de 1 faire Dbut Lire (n) Somme<=somme + n Fin Ecrire (somme) Fin

Exercice 20 Traduire le POUR de lalgorithme suivant en REPETER JUSQU'A : Action : bidon Var : k, nb : entiers Dbut Lire (nb) Pour k de 1 nb faire Ecrire (k) Fin Action : Bidon

15

Var : k, nb : entier Dbut Lire (nb) K<=1 Si nb>0 alors Rpter crire (k) K<=k+1 Jusqu k>nb Fin

Exercice 21 Ecrire une fonction qui fait la somme des entiers compris dans un intervalle. Fonction : intervalle (a, b ; entiers) : entier Var : k, somme : entier Dbut Somme <= 0 Pour k de a b faire Somme<=somme + k Retourner (somme) Fin

Exercice 22 Ecrire une fonction multiplication de a et b par addition successives. Fonction : multiplication (a, b : entiers) : entier Var : k, produit : entiers Dbut produit<=0 Pour k de 1 a faire Produit<=produit + b Retourner (produit) Fin

16

4 exercices sur les Tableaux

Exercice 23 Ecrire une action qui permette la saisie dun tableau croissant : si T[k]<T[k+1] on enregistre, si T[k]>T[k+1] on redemande la saisie dun nombre plus grand Const : MAX=100 Ttype : Ttab=tableau [max]dentier Action : saisie_tableau_croissant Var : tab : Ttab, i : entier Dbut Lire (Tab[0]) Pour i de 1 MAX-1 faire Rpter lire (tab[i]) jusqu' tab[i] tab[i-1] Fin

Exercice 24 Ecrire une fonction retournant le maximum dun tableau de taille n. Faire le mme algorithme mais qui ne retourne que lindice de la case du tableau contenant le maximum du tableau. Fonction : maximum (tab : Tableau dentier n :entier) : entier Var : max, i : entiers Dbut Max <= tab[0] Pour i de 1 n-1 faire Si tab[i]>max alors max<=tab[i] Retourner (max) Fin

Fonction : maximum (tab : Tableau dentier n :entier) : entier Var : indice, i, max : entiers Dbut Max<=tab[0] Indice <=0 Pour i de 1 n-1 faire Si tab[i]>max alors max<=tab[i] indice<=i Retourner (indice)

17

Fin

18

5 Exercices gnraux sur les actions paramtres

Exercice 25 Ecrire une fonction Afficher qui affiche a lcran le contenu dun tableau. Ecrire aussi laction principale qui permettra de comprendre comment fonctionne cette fonction afficher.

{Ne pas oublier dindiquer les paramtres du tableau !} Const : MAX : entier=100 Type : Ttab : Tableau [MAX] dentier Fonction Afficher (tab : tableau dentiers, n entiers) Var : i entier Dbut : Pour i de 0 n-1 Ecrire (tab[i], ) Fin Action principale Var t1 t2 : Ttab Dbut T1[0]<=1 T1[1]<=3 T2[0]<=4 T2[1]<=5 T2[2]<=7 Afficher (T1, 2) Afficher (T2, 3) Fin Rsultat lcran : 13 457

Exercice 26 Ecrire une fonction qui permet la saisie dun tableau. Faite aussi laction principale qui permettra daccder a cette fonction saisie mais aussi dafficher dans un second temps le rsultat Fonction : saisie (Stab : tableau dentiers, N :entier) Var : i entier Dbut : Pour i de 0 n-1 faire

19

Lire (tab[i]) Fin Action principale Var : tabl : Ttab Dbut Saisie (toto, 10) Afficher (toto, 10) Fin Ou afficher est la fonction de lexercice 1.

Exercice 27 Ecrire une fonction qui calcule le nombre dinversion dun tableau de taille n (cest dire i<j et tab[i]>tab[j] pour tout i et j.) Fonction inversion (tab : tableau dentiers, N entier) Var : j, C, i entiers Dbut C<=0 Pour i de 0 n-2 faire Dbut Pour j de i+1 n-1 faire Si tab[i]>tab[j] alors C<=C+1 Fin Retourner ( C ) Fin

Exercice 28 Ecrire une action qui affiche les n premiers lments de la suite dfinie par u0=1 et un+1=somme de k=0 jusqu' n de (uk*un-k) Aide : stocker les lments dans un tableau toto avec toto[0]=1. Puis on utilise une boucle imbrique pour calculer toto[n+1]=somme k=0 k=n de toto[k]*toto[n-k]. Action Suite (E : d :entier) Var : toto : Ttab, i, k : entiers Dbut : Toto[0]<=1 Pour I de 1 d-1 faire Toto[i]<=0 Pour k de 0 n-1 faire Toto[i]<=toto[i]+toto[k]+toto[i-1-k] Afficher (toto, d) Fin

Exercice 29 Voyons maintenant quelques exercices rudimentaires de changements dans un tableau

20

Ecrire une action permettant de remplacer toutes les occurrences de x par y dans un tableau de taille n. Ecrire un algorithme qui change les valeurs des cases i et j dans un tableau. Ecrire un programme qui inverse un tableau. (exemple : 1 5 6 7 3 devient 3 7 6 5 1) Action : Remplacer (E : x : entier, E : y : entier, ES tab : tableau dentiers, E : n : entier) Var : i :entier Dbut Pour i de 0 n-1 faire Si tab[i]=x alors tab[i]<=y Fin

Action : Echanger (E : i : entier, E : j : entier, ES : tab : tableau dentier, E : n :entier) Var : temp Dbut Si i<n ET j<n alors Temp<=tab[i] Tab[I]<=tab[j] Tab[j]<=temp Fin

Action : inverser (ES : tab : tableau dentiers, E : n : entier) Var : i :entier Dbut Pour i de 0 n/2 1 faire Echanger (i, n-1-in tab, n) {ou Echanger est la deuxime action de cet exercice} Fin

21

6 Entits : types structurs

Explications 1 : Les types structurs sont : - les tableaux (voir les exercices prcdents) - les entits (ou lon regroupe plusieurs types sous un mme objet) Exemple : Etudiant (nom, groupe, note) Type : Etd : entit ( Nom : chane de caractre ; Groupe : caractre ; Note : entier ; ); Pour faire appel ce type dentit on fera dans la fonction : Var : Tetd toto ; Toto.nom=alex Toto.groupe=A Toto.note=15 Ecrire ( ltudiant , toto.nom, du groupe , toto.groupe, a eu , toto.note)

Exercice 30 Proposer une entit de donnes pour stocker un point dans le plan Type : Tpoint=Entit ( abs : entier ; ord : entier ; )

Exercice 31 Ecrire les en-ttes des fonctions/actions suivantes : - saisie dun point - affichage dun point - calcul de la distance entre deux points - projection dun point sur laxe des abscisses Ecrire ensuite les algorithmes de ces fonctions. Faire une action principale qui demande la saisie de deux points, calcule la distance entre ces deux points et affiche les rsultats. Action SaisieTpoint (S : P : Tpoint) {Tpoint a t dfini lexercice 30} Dbut Lire (P.abs) Lire (P.ord) 22

Fin Action AfficherTpoint (E : P : Tpoint) Dbut Ecrire ( ( , P.abs, ; , P.ord, ) ) Fin Fonction distance (P : Tpoint ; Q : Tpoint) : rel Var : dist : rel Dbut Dist<=sqrt[(P.abs-Q.abs) + (P.ord-Q.ord)] Retourner (dist) Fin Action ProjectionX (ES : P : Tpoint) Dbut P.ord<=0 Fin Action Principale Var : P, Q : Tpoint Dist : rel Dbut SaisieTpoint(P) SaisieTpoint(Q) Dist<=distance(P, Q) Ecrire ( la distance entre ,AfficherTpoint(P), et , AfficherTpoint(Q), est , dist) Fin

Explications 2: Nous ne rentrerons pas ici le tableau comme nous lavons fait prcdemment : Nous utiliserons les entits. Ainsi la dclaration se fera de la manire suivante : Const MAX=100 Type : TtabVar=entit ( Tab : tab[MAX] dentier Taille : entier ) Ainsi, dans une fonction, on aura : TtabVar : toto Toto.tab[15]<=1 {pour entrer une valeur de tableau} Toto.taille++ {On augmente la taille du tableau au fur et a mesure Avantage de cette nouvelle manire dentrer un tableau : on peu avoir un tableau de taille variable.

Exercice 32 Ecrire un algorithme qui permet de rentrer les donnes dun tableau de type TtabVar et dont on connat la taille.

23

Ecrire ensuite un algorithme qui permet de rentrer les donnes dun tableau de type TtabVar et ou lon ne connat pas la taille. Action saisieTtabVar (S : tabvar : TtabVar, E : n : entier) Var : i : entier Dbut Pour i de 0 n-1 faire Lire (tabvar.tab[i]) Tabvar.taille<=n Fin Action saisieTtabVar (S tabvar : TtabVar) Var : rponse : chane de caractre Dbut Tabvar.taille<=0 Rpter Ecrire ( voulez-vous entrer un entier ? ) Lire (rponse) Si rponse non alors Lire (tabvar.tab[tabvar.taille]) Tabvar.taille++ Jusqu (rponse= non ou tabvar.taille=MAX) Fin

Exercice 33 Ecrire un algorithme qui permet de rentrer un tableau de taille variable de Tpoint (voir exercice 30 et 31). Pour cela, il faudra au pralable crer un nouveau type dentit. Const MAX=100 Type TtabVarPt=entit (tab : tableau[MAX] de Tpoint, taille : entier) Action : SaisieTtabVarTpoint (S : tabvarPt : TtabVarTpoint) Var : rponse : chane de caractre Dbut Tabvar.taille<=0 Rpter Ecrire ( voulez-vous entrer un entier ? ) Lire (rponse) Si rponse non alors Lire (tabvarpt.tab[tabvarpt.taille].abs) Lire (tabvarpt.tab[tabvarpt.taille].ord) Tabvarpt++ Jusqu (rponse= non ou tabvar.taille=MAX)

Exercice 34 Ecrire un algorithme qui dtermine le point ( ( !) cest dire son indice)le plus au nord et le point le plus a louest dans un tableau de Tpoint.

24

Faire ensuite une action principale qui demande la saisie dun tableau de Tpoint lutilisateur (voir exercice 33) et affiche llment le plus au nord et llment le plus louest. Action NordOuest (E : tvp : TtabVarPt, S : nord : entier, S : ouest : entier) Var : i : entier Dbut Nord<=0 Ouest<=0 Pour i de 0 tpv.taille-1 faire Si tvp.taille[i].abs<tvp.tab[ouest].abs) alors ouest<=i Si tvp.taille[i].ord<tvp.tab[ouest].ord) alors nord<=i Fin Action Principale Var toto : TtabVarPt ; n, o : entiers Dbut Saisie TtabVarTpoint (toto) NordOuest (toto, n, o) Ecrire ( llment le plus au nord est , AfficherTpoint(toto.tab[n]) {ou AfficherTpoint est la fonction de lexercice 31} Ecrire( llment le plus louest est , AfficherTpoint(toto.tab[o]) Fin

Exercice 35 Ecrire un algorithme qui dtermine la distance maximale entre deux points dun tableau de Tpoint Action DistMax (E : tvp : TtabVarPt) Var : i, j : entiers ; Dmax, dist : reels Dbut Dmax<=0 Pour i de 0 tvp.taille-2 faire Pour j de i+1 tvp.taille-1 faire Dist<=distance(tvp.tab[i] ; tvp.tab[j]) Si dist>Dmax alors Dmax<=dist Ecrire ( la distance maximale entre deux points du tableau est , Dmax) Fin

25

7 Tableaux tris et dcoupages fonctionnels

Exercice 36 Le but de lexercice est de crer une action de saisie de tableau, qui trie, au fur et mesure des entres, les valeurs par ordre croissant dans le tableau. Exemple : Soit le tableau suivant : 0 1 2 3 2 5 7 9 Comment insrer 6 dans le tableau tri (en supposant quil ny a pas de doublon dans le tableau) ? - je cherche la bonne position (ici : la case dindice 2) - dcalage droite si ncessaire : 0 1 2 3 4 2 5 7 7 9 - Insertion de llment 0 1 2 3 4 2 5 6 7 9 On a donc ici le dcoupage fonctionnel : On va donc crer une fonction IndiceEltSup qui cherche la bonne position, une action Insrer qui inclue le nombre entr dans la bonne case du tableau, et une action DcalageDroite qui dcale comme dans lexemple toutes les cases dun rang vers la droite si ncessaire. Const MAX=100 Type TtabVar = entit (tab : tableau[MAX] dentiers, taille : entier) Fonction IndiceEltSup (tvt : TtabVar, entier, n : entier) : entier Var : i : entier Dbut Tant que (itvt.taille ET tvt.tab[i]<n) i<=i+1 retourner (i) Fin Action DcalageDroite (ES : tvt : TtabVar, E : i : entier) Var : j : entier Dbut Pour j de tvt.taille 1 i par pas de 1 faire Tvt.tab[j+1]<=tvt.tab[j] Tvt.taille++ Fin Action Insrer (ES : tvt : TtabVar, E : i : entier, E : i : entier)

26

Dbut DcalageDroite (tvt, i) Tvt.tab[i]<=i Fin Action SaisieTri (S : tvt : TtabVar) Var : rep : chane, nb : entier, i : entier Dbut Tvt.taille<=0 Rpter Ecrire (Rentrer encore un entier ?) Lire (rep) Si rep non alors Lire (nb) I<=IndiceEltSup(tvt, nb) Si non(i<tvt.taille ET tvt.tab[i]=nb) Insrer (tvt, i, nb) Jusqu rep= non ou tvt.taille=MAX Fin

Exercice 37 Faire un algorithme qui fait une recherche dichotomique dans un tableau tri. On pourra utiliser les fonctions de lexercice prcdent. Nous allons crer une action qui dfinie la zone de recherche, puis laction RechercheDicho qui oprera la recherche dichotomique dans lintervalle dfinie par la zone de recherche. Action ZoneRecherche (E : tvt : TtabVar, E : n : entier, ES : Binf : entier, ES : Bsup : entier) Var : milieu : entier Dbut Milieu <= (Binf + Bsup)/2 Si tvt.tab[milieu]=n alors Dbut Binf<=milieu Bsup<=milieu Fin Sinon Si tvt.tab[milieu]>n alors Bsup<=milieu 1 Sinon Binf<=milieu+1 Fin Fonction RechercheDicho (E : tvt : TtabVar, E : n : entier) Var : Binf, Bsup : entiers Dbut Binf<=0 Bsup<=tvt.taille 1 Tant que Bsup>Binf faire ZoneRecherche (tvt, n, Binf, Bsup) Si Bsup=Binf alors

27

Retourner (Binf) Sinon retourner ( -1)

Exercice 38 Faire un algorithme qui supprime une valeur dans un tableau tri. On pourra utiliser des fonctions des deux exercices prcdents. Le but est dutiliser la recherche dichotomique de lexercice prcdent pour trouver dans le tableau lindice de la valeur que lon veut supprimer puis faire un dcalage gauche pour remettre en place les valeurs (sans quil y ait de vide dans une case du tableau) Action Supprimer (ES : tvt : TtabVar, E : n : entier) Var : i : entier Dbut i<=RechercheDicho(tvt, n) Si i -1 alors DecalageGauche (tvt, i) Fin Action DecalageGauche (Es : tvt : TtabVar, E : i : entier) Var : j: entier Dbut Pour j de i+1 tvt.taille 1 faire Tvt.tab[j 1] <= tvt.tab[j] Tvt.taille <= tvt.taille 1 Fin

28

8 Les Chanes

On va maintenant faire des exercices sur les chanes de caractres. En pratique on pourra dfinir une chane de caractres de deux manires : Const MAX entier = 100 Type Tchaine = entit ( tab : tableau[MAX] de caractres Longueur : entier) Ou bien : Const MAX entier = 100 Type Tchaine = tableau [MAX] de caractres {Avec la sentinelle END}

Exercice 39 Faire un algorithme qui dtermine la longueur dune chane de caractres. Faire ensuite de deux manires diffrentes, une fonction qui permet de copier la chane dune source dans une chane destination. Fonction Longueur (chaine : Tchaine) : entier Var i : entier Dbut i0 Tant que chaine[ i ] != END faire i i+1 Retourner (i) Fin

Fonction de copie : premire mthode : Fonction Copier (E : src : Tchaine, S : dest : Tchaine) Var i, Lsrc : entier Dbut LsrcLongueur(src) Pour i de 0 Lsrc faire dest[ i ]src [ i ] Fin Fonction de copie : deuxime mthode : plus optimise : Fonction CopieOptimise (E : src : Tchaine, S : dest : Tchaine) Var i : entier Dbut i0 tant que src[ i ] != END faire dest [ i ] src [ i ] i i+1 29

dest [ i ] src [ i] {pour copier en fin de fichier la sentinelle} Fin

Exercice 40 Faire une fonction de concatnation (ajoute la fin de la premire chane de caractres le contenu de la deuxime chane de caractres.) Faire une fonction de Comparaison qui compare deux chanes de caractres suivant lordre lexicographique. Faire une fonction qui efface une partie de la chane en spcifiant une longueur deffacement et un indice partir duquel il faut effacer. Action Concatnation (ES : src1 : Tchaine, E : src2 : Tchaine) Var i, Lsrc1 : entiers Dbut i0 LsrcLongueur (src1) Tant que src2 [ i ] != END Src1[ Lsrc1+i] src2[ i ] ii+1 src1[Lsrc1+i]src2[ i ] Fin

Pour faire la fonction comparer, il faut dabord crer une fonction qui compare les caractres : Fonction ComparerChar (char a, char b) Dbut Si a<b retourner (-1) Si a=b retourner (0) Si a>b retourner (1) Fin On peut maintenant faire la fonction de comparaison de chanes de caractres qui utilisera la fonction ComparerChar : Fonction Comparer (E : src1 : Tchaine, E : src2 : Tchaine) Var i, L1, L2, cmp : entiers Dbut L1Longueur (src1) L2Longueur (src2) I0 Tant que (i<L1 ET i<L2 ET ComparerChar (src1[ i ], src2[ i ])=0) faire ii+1 Si i=L1 ou i=L2 alors Si i<L1 alors cmp1 Sinon Si i<L2 alors cmp -1 Sinon cmp0 Sinon cmpComparerChar(src1[ i ], src2 [ i ]) Retourner (cmp) Fin

30

Fonction Effacer (ES : src : Tchaine, E : indice : entier, E : lg : entier) Var i, Lsrc : entiers Dbut LsrcLongueur (src) Pour i de indice+lg Lsrc faire Src[i-lg]src[ i ] Fin

Exercice 41 Ecrire len-tte dune action multi dcalage droite qui dcale droite les lments dune chane partir dun certain indice et insre des cases vides la place. (des actions de multi dcalage ont dj t vue avec les tableaux, on ne demande pas den refaire une ici, ce rfrer aux exercices sur les tableaux) Faire une action dinsertion. On pourra pour cela utiliser au paravent la fonction multi dcalage droite prcdente. Faire une action de remplacement dune partie dune chane de caractres par une autre chane de caractres dont la longueur nest pas forcment la mme. On pourra utiliser des fonctions des exercices 39 et 40. Faire une fonction Extraire qui prend une partie de chane de caractres partir dun certain indice et la met dans une chane destination. Faire une fonction de recherche qui recherche une chane dans une chane de caractre et retourne un indice si partir de cette case on a la chane cherche. Sinon, elle retourne 1. Faire une action qui changent toutes les occurrences dune chane dans une chane de caractres par une autre chane tampon. Action MultidcalageDroite (ES : src : Tchaine, E : indice : entier, E : lg : entier) Action Insrer (ES : src : Tchaine, E : indice : entier, E : motif : Tchaine) Var i, Lsrc, Lmotif : entier Dbut LmotifLongueur(motif) MultidcalageDroite (src, indice, Lmotif) Pour i de 0 Lmotif-1 faire src[indice+i]motif[ i ] Fin Action Remplacer (ES : src : Tchaine, E indice : entier, E lg : entier, E : motif : Tchaine) Dbut Effacer (src, indice, lg) Insrer (src, indice, motif) Fin Fonction Recherche (src : Tchaine, motif : Tchaine, Binf : entier) Var : i, Lsrc, Lmotif : entiers Tampon : Tchaine Dbut LsrcLongueur (src)

31

LmotifLongueur(motif) iBinf Extraire (src, i, Lmotif, tampon) Tant que (i<Lsrc Lmotif ET Comparer (tampon, motif)0) faire ii+1 Extraire (src, i, Lmotif, tampon) Si non(i=Lsrc Lmotif) alors retourner (i) Sinon retourner (1) Fin Action RemplacarToutesChaines (ES : src : Tchaine, E : ancien : Tchaine, E : nouveau : Tchaine) Var i , Lancien, Lnouveau, indice :entiers Dbut i0 LancienLongueur (ancien) LnouveauLongueur (nouveau) Indice Recherche(src, ancien, i) Tant que indice -1 faire Remplacer (src, indice, Lancien, nouveau) iindice+Lnouveau indiceRecherche(src, ancien, i) Fin

32

9 Les fichiers

Rappelons tout dabord comment on manipule les fichiers en ASD. On ne manipule que les identificateurs de fichiers. On ne se soucie donc pas des fichiers sources. Pour ouvrir un fichier : OuvrirFichier (IdFic, ModeOuverture) Avec ModeOuverture = lecture ou criture ou rajout. Pour fermer un fichier FermerFichier (IdFic) Pour lire un fichier LireFichier (IdFic, lment) cela correspond Lire(n) cin>>n Pour crire un fichier EcrireFichier (IdFic, lment) cela correspond Ecrire(n) cout<<n

Exercice 42 Faire lalgorithme dune action qui lit un fichier dentiers et affiche tous les entiers de ce fichiers qui sont pairs. Ecrire une action qui lit un fichier dentiers et met dans un autre fichier dentiers les valeurs paires. Faire une fonction qui recherche un entier x dans un fichier dentiers et retourne vrai si x est dans le fichier. Action EntierPairs (E : Fic : fichier dentiers) Var n : entier Dbut OuvrirFichier (Fic, lecture) Si EtatFichier (Fic) = succs alors LireFichier (Fic, n) Tant que (EtatFichier (Fic) FdF) faire {ou FdF signifie Fin de Fichier} Si n%2=0 alors Ecrire(n) LireFichier(n) FermerFichier (Fic) Sinon Ecrire ( Erreur, impossible douvrir le fichier en lecture ) Fin Action EntiersPairsFichier (E : f1 : fichier dentiers, ES : f2 : fichier dentiers) Var n : entier Dbut OuvrirFichier (f1, lecture) 33

Si EtatFichier (f1) = succs alors OuvrirFichier (f2, criture) Si EtatFichier (f2) = succs alors LireFichier (f1, n) Tant que EtatFichier(f1)FdF faire Si n%2=0 alors EcrireFichier(f2, n) LireFichier (f1, n) FermerFichier(f2) Sinon crire ( Erreur en criture ) FermerFichier (f1) Sinon crire ( Erreur en lecture ) Fin

Fonction Recherche (x : entier, f : fichier dentiers) : boolen Var bool rep false Dbut OuvrirFichier (f, lecture) Si EtatFichier(f)=succs alors LireFichier(f, n) Tant que (EtatFichier(f) FdF ET nx) faire LireFichier(f, n) Si n=x alors rep true FermerFichier (f) Sinon Ecrire ( Erreur en lecture ) Fin

Exercice 43 Faire une action de fusion de deux fichiers dentiers. Le fichier de sortie doit tre tri. Action Fusion ( E : f1 : fichier dentiers, E : f2 : fichier dentiers, S : f3 : fichier dentiers) Var : f3 : fichier dentiers Dbut OuvrirFichier (f1, lecture) Si EtatFichier (f1)=succs alors OuvrirFichier (f2, lecture) Si EtatFichier (f2)=succs alors OuvrirFichier (f3, criture) Si EtatFichier (f3)=succs alors LireFichier (f1, n1) LireFichier (f2, n2) Tant que (EtatFichier(f1) FdF ET EtatFichier(f2)FdF) faire Si n1<n2 alors EcrireFichier (f3, n1) LireFichier (f1, n1) Sinon EcrireFichier (f3, n2) LireFichier (f2, n2) Si EtatFichier (f1) FdF alors

34

Rpter EcrireFichier (f3, n1) LireFichier(f1, n1) Jusqu' EtatFichier(f1)=FdF Si EtatFichier (f2) FdF alors Rpter EcrireFichier (f3, n2) LireFichier (f2, n2) Jusqu' EtatFichier (f2) = FdF FermerFichier (f3) Sinon crire ( Erreur en criture sur le fichier destination ) FermerFichier (f2) Sinon crire ( Erreur de lecture sur le fichier f2 ) FermerFichier (f1) Sinon crire ( Erreur en lecture sur le fichier f1 ) Fin

Exercice 44 Soit le type suivant : Type : Tetd = entit ( Nom : chane Numro : tudiant Notes : tableau [5] dentiers Moyenne : entier) On suppose que la fonction de saisie Fonction SaisieEtd () : Tetd Permettant de saisir un tableau de Tetd existe. On pourra donc sen servir Ecrire une fonction qui permet de saisir un groupe dtudiant dans un fichier. Ecrire une fonction qui permet de calculer la moyenne gnrale dun groupe dtudiant.

Action SaisieGroupe (E : nb : entier, S : Fic : fichier de Tetd) Var : etd : Tetd i : entier Dbut OuvrirFichier (fic, criture) Si EtatFichier (fic)=succs alors Pour i de 1 nb faire EtdSaisieEtd( ) EcrireFichier (fic, etd) FermerFichier (fic) Sinon crire ( Erreur ) Fin Fonction Moyenne (fic : fichier de Tetd ) : rel Var : Som : rel Dbut Som0 nb 0 OuvrirFichier (fic, lecture)

35

Si EtatFichier (fic)=succs alors LireFichier (fic, etd) Tant que EtatFichier (fic)FdF) faire nbnb+1 SomSom + etd.moyenne LireFichier(fic, etd) Retourner (Som/nb) FermerFichier (fic) Sinon crire ( Erreur ) Fin

36

Vous aimerez peut-être aussi