La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

Algorithmes et structures de données avancées 6ème cours Patrick Reuter

Présentations similaires


Présentation au sujet: "Algorithmes et structures de données avancées 6ème cours Patrick Reuter"— Transcription de la présentation:

1 Algorithmes et structures de données avancées 6ème cours Patrick Reuter http://www.labri.fr/~preuter

2 Ingrédients dalgorithmes Affectation (ex. mois := 6, jours[1] := 31) Condition/Comparaison (ex. mois <= 12) Appel de fonction (ex. writeln(mois)) Structure de contrôle –Branchements conditionnels (multiples) (si.. Alors.. Sinon) –Boucles (tant que..faire, pour.. faire) Bloc dinstructions (begin.. end)

3 Aujourd'hui TYPES: –tableau 1D –tableau 2D –types énumérés –enregistrements –pointeurs PORTEE : –variables globales –variables locales APPEL DE FONCTIONS –appel par valeur –appel par référence

4 Déclaration de variables Comme dans un livre de recettes Ingrédients(pour 8-10 personnes) : - 1 kg de couscous roulé - 1 kg de mouton - 1 poignée de pois chiches - 2 oignons secs - 3-4 tomates fraîches ou 1 cuillère. à soupe de concentré de tomate - 3-4 pommes de terre - 3-4 navets - 3-4 carottes - 3-4 courgettes - 1 tranche de courge - 4 cuillères à soupe d'huile - 1/2 cuillère à café de cannelle - 1 pincée de poivre noir - 1/2 cuillère à soupe de piment rouge doux ou de paprika - 1/2 cuillère à soupe de ras-el-hanout - 1 piment rouge sec - 100 g de beurre ou 3 cuillères à soupe d'huile - sel Préparation : La veille, mettez les pois chiches dans un bol d'eau. Le jour même, roulez le couscous. Si vous utilisez du couscous roulé et séché, rincez-le à l'eau froide, égouttez-le et laissez- le gonfler pendant 30 mn. Coupez la viande en morceaux. Pelez les oignons et coupez-en 1 en morceaux. Lavez et passez les tomates à la moulinette. Mettez la viande dans une marmite et ajoutez les morceaux d'oignon, les tomates ou le concentré de tomate dilué dans 1 verre d'eau, l'huile, le poivre, le piment, la cannelle et du sel. Faites revenir …..

5 Déclaration de variables var compteur : integer; var diviseur : single; var c : byte; var precision : double; var nom : string; var masculin : boolean; var jours : array[1..12] of byte; diviseur := 1.1; { Affectation } compteur : = 1; Nom := Gerhard; Nombre entier Nombre à virgule flottante Nombre à virgule flottante avec double précision Chaîne de caractères Tableau TYPE

6 Déclaration de variables Types prédéfinis –Integer, boolean, single, … Types que lon peut définir soi-même type t_tableau = array[1..12] of byte; var jours : t_tableau; au lieu de var jours : array[1..12] of byte;

7 Organisation de la mémoire type t_tableau = array[1..12] of byte; var jours : t_tableau; {12 octets} #0 jours[1] #2000... #536.870.910 #536.870.911... jours[index] #(2000+index-1) jours[3] #2002 jours[12] #2011... Occupe de la place successive dans la mémoire jours[2] #2001 31 28 31

8 Tableau 2D

9 Motivation type t_champ =(vide, blanc, noir); type t_ligne = array[1..8] of t_champ; type t_damier = array[1..8] of t_ligne; var damier : t_damier; var i,j : integer; Pour initialiser un damier vide : POUR i = 1 à 8 faire POUR j = 1 à 8 faire damier[i][j] := vide; FIN POUR

10 Enregistrements

11 Déclaration de variables Type enregistrement ( structure hétérogène) type t_enregistrement = RECORD nom_de_variable_1:type1; nom_de_variable_2:type2;... nom_de_variable_n:typen; END; var dossier : t_enregistrement; -structure hétérogène, les éléments peuvent être dun type différent -occupe de la place successive dans la mémoire -« random access » = l accès aux différents éléments se fait à coût égal

12 Type enregistrement ( structure hétérogène) Exemple Déclaration du type type t_date = RECORD an:integer; mois:byte; jour:byte; END; Déclaration dune variable var aujourdhui : t_date; Affectation aujourdhui.jour = 17; aujourdhui.mois = 10; aujourdhui.an = 2006;

13 Enregistrements Motivation (à ne pas faire !) type t_couleur = (rouge, vert, jaune); var joueurnom : array[1..n] of string; var joueurscore : array[1..n] of integer; var joueurcouleur : array[1..n] of t_couleur; joueurnom[1] := " Martin; joueurscore[1] := 0; joueurcouleur[1] := rouge; joueurnom[2] := " Romain; joueurscore[2] := 0; joueurcouleur[2] := vert; …

14 Enregistrements Motivation (à faire !) type t_couleur = (rouge, vert, jaune); type t_joueur = RECORD nom : string; score : integer; couleur : t_couleur; END; var joueur : array[1..n] of t_joueur; joueur[1].nom := " Martin; joueur[1].score := 0; joueur[1].couleur := rouge; joueur[2].nom := " Romain; joueur[2].score := 0; joueur[2].couleur := vert; …

15 type t_date = RECORD an:integer; mois:byte; jour:byte; END; var aujourdhui : t_date; aujourdhui.an #4000... #536.870.910 #536.870.911... aujourdhui.an; #4002... aujourdhui.an; #4001 214 7 0 17 #0 Occupe de la place successive dans la mémoire aujourdhui.an; #4003 aujourdhui.mois; #4004 aujourdhui.jour; #4005 0 10

16 Type tableaux denregistrements Déclaration du type enregistrement : type t_chanson = RECORD titre:string[100]; artiste:string[100]; album:string[100]; longueur:integer; date:t_date; END; Déclaration du type tableau type t_tableau_chansons = array[1..n] of t_chanson; Déclaration dune variable de ce type var collection : t_tableau_chansons; Affectation collection[1].title = Riders on the storm; collection[1].artiste = The Doors;... collection[n].title = Talkin Blues;...

17 Type tableaux denregistrements Exercice type t_chanson = RECORD titre:string[100]; artiste:string[100]; album:string[100]; longueur:integer; date:t_date; END; type t_tableau_chansons = array[1..n] of t_chanson; var collection : t_tableau_chansons; Trouver lartiste dune chanson donnée kaya i := 1; tant que i<=n i := i + 1; fin tant que

18 Type tableaux denregistrements Exercice type t_chanson = RECORD titre:string[100]; artiste:string[100]; album:string[100]; longueur:integer; date:t_date; END; type t_tableau_chansons = array[1..n] of t_chanson; var collection : t_tableau_chansons; Trouver lartiste dune chanson donnée kaya i := 1; tant que i<=n si collection[i].title = kaya alors afficher collection[i].artiste; i := i + 1; fin tant que

19 Type tableaux denregistrements Exercice type t_chanson = RECORD titre:string[100]; artiste:string[100]; album:string[100]; longueur:integer; date:t_date; END; type t_tableau_chansons = array[1..n] of t_chanson; var collection : t_tableau_chansons; Trouver lartiste dune chanson donnée kaya trouve := FAUX; i := 1; tant que (i<=n ET trouve = FAUX) si collection[i].title = kaya alors afficher collection[i].artiste; trouve := VRAI; i := i + 1; fin tant que

20 NOUVEAU : Addressage mémoire

21

22

23 Adresse dune variable Stocké dans 4 Octets (32 bit), comme ça on peut adresser 2 32 octets = 4 294 967 296 octes = 4 GO Limite bientôt atteint

24 Organisation de la mémoire var a : byte; ( 1 octet (byte) ) #0 #1 #2 #3 a #4 #5... #536.870.910 #536.870.911 #1.000...

25 Organisation de la mémoire var a : byte; a := 97; #0 #1 #2 #3 a #4 #5... #536.870.910 #536.870.911 #1.000... 97

26 Organisation de la mémoire var a : byte; a := 97; #0 #1 #2 #3 a #4 #5... #536.870.910 #536.870.911 #1.000... 97 Comment connaître ladresse de a ? Addr(a)

27 Organisation de la mémoire var a : byte; a := 97; p_a := Addr(a);{ Sauvegarder ladresse } #0 #1 #2 #3 a #4 #5... #536.870.910 #536.870.911 #1.000... 97 Comment connaître ladresse de a ? Addr(a)

28 var a : byte; var p_a : ^byte; {4 octets, lire : pointeur vers a} a := 97; p_a := Addr(a);{ Sauvegarder ladresse } #0 #1 #2 #3 #4 a #5... #536.870.910 #536.870.911 p_a #1.000 0 97 Comment connaître ladresse de a ? Addr(a) p_a #1.001 p_a #1.002 p_a #1.003 5 0 0 « p_a pointe vers a »

29 var a : byte; var p_a : pointer to byte; {4 octets, lire : pointeur vers a} a := 97; p_a := Addr(a);{ Sauvegarder ladresse } { p_a est 4, p_a^ est 97) p_a^ := 10;{ Déréférencement } { p_a est 4, p_a^ est 10) #0 #1 #2 #3 p_a^a #4 #5... #536.870.910 #536.870.911 p_a #1.000 0 10 Comment connaître ladresse de a ? Addr(a) p_a #1.001 p_a #1.002 p_a #1.003 4 0 0

30 var a : byte; var p_a : ^byte; {4 octets, lire : pointeur vers a} a := 97; p_a := Addr(a);{ Sauvegarder ladresse } p_a^ := 10;{ affectation par déréférencement } a := 10;{ affectation }

31 var a : byte; var p_a : ^byte; {4 octets, lire : pointeur vers a} a := 97; p_a := Addr(a);{ Sauvegarder ladresse } p_a^ := 10;{ affectation par déréférencement } a := 10;{ affectation } Cest équivalent !!

32 Définitions Déclaration dun pointeur vers un byte var p_a: ^byte; Déréférencement dun pointeur : p_a^ Connaître ladresse dune variable a Addr(a); {ou bien } @a;

33 Fonctions

34 type t_tableau = array[1..n] of integer; var tab : t_tableau; function dedans(quoi : integer, n : integer) : integer; var position : integer; var i : integer; début position := 0; i := 1; tant que (i<=n) faire si (quoi = tab[i]) alors position := i; fin si i := i + 1; fin tant que result := position; fin

35 type t_tableau = array[1..n] of integer; var tab : t_tableau; function dedans(quoi : integer, n : integer) : integer; var position : integer; var i : integer; début position := 0; i := 1; tant que (i<=n) faire si (quoi = tab[i]) alors position := i; fin si i := i + 1; fin tant que result := position; fin En-tête de la fonction

36 type t_tableau = array[1..n] of integer; var tab : t_tableau; function dedans(quoi : integer, n : integer) : integer; var position : integer; var i : integer; début position := 0; i := 1; tant que (i<=n) faire si (quoi = tab[i]) alors position := i; fin si i := i + 1; fin tant que result := position; fin Corps de la fonction

37 type t_tableau = array[1..n] of integer; var tab : t_tableau; function dedans(quoi : integer, n : integer) : integer; var position : integer; var i : integer; début position := 0; i := 1; tant que (i<=n) faire si (quoi = tab[i]) alors position :=i; fin si i := i + 1; fin tant que result := position; fin Paramètres de la fonction (arguments)

38 type t_tableau = array[1..n] of integer; var tab : t_tableau; function dedans(quoi : integer, n : integer) : integer; var position : integer; var i : integer; début position := 0; i := 1; tant que (i<=n) faire si (quoi = tab[i]) alors position := i; fin si i := i + 1; fin tant que result := position; fin Type de retour de la fonction Valeur de retour de la fonction

39 La portée :

40 program portee; var i : byte; function somme(n : byte) : byte; var i : byte; begin result := 0; for i := 1 to n do begin result := result + i; end; begin i:=3; WriteLn(somme(5)); WriteLn('i : ', i); readln; end.

41 program portee; var i : byte; function somme(n : byte) : byte; var i : byte; begin result := 0; for i := 1 to n do begin result := result + i; end; begin i:=3; WriteLn(somme(5)); WriteLn('i : ', i); readln; end.... #0 i #100

42 program portee; var i : byte; function somme(n : byte) : byte; var i : byte; begin result := 0; for i := 1 to n do begin result := result + i; end; begin i:=3; WriteLn(somme(5)); WriteLn('i : ', i); readln; end.... 3 #0 i #100 n #200 i #201 5

43 program portee; var i : byte; function somme(n : byte) : byte; var i : byte; begin result := 0; for i := 1 to n do begin result := result + i; end; begin i:=3; WriteLn(somme(5)); WriteLn('i : ', i); readln; end.... 3 #0 i #100 n #200 i #201 5

44 program portee; var i : byte; function somme(n : byte) : byte; var i : byte; begin result := 0; for i := 1 to n do begin result := result + i; end; begin i:=3; WriteLn(somme(5)); WriteLn('i : ', i); readln; end.... 3 #0 i #100 n #200 i #201 1 5

45 program portee; var i : byte; { Variable globale } function somme(n : byte) : byte; var i : byte; { Variable locale } begin result := 0; for i := 1 to n do begin result := result + i; end; begin i:=3; WriteLn(somme(5)); WriteLn('i : ', i); readln; end.

46 program portee; var i : byte; { Variable globale } function somme(n : byte) : byte; var i : byte; { Variable locale } begin result := 0; for i := 1 to n do begin result := result + i; end; begin i:=3; WriteLn(somme(5)); WriteLn('i : ', i); readln; end.

47 Appel des fonctions Appel par valeur Appel par référence

48 var a : byte; procedure ajouter (parametre : byte) début WriteLn(parametre, parametre); parametre := parametre + 2; WriteLn(parametre, parametre); fin début a := 4; WriteLn(a, a); ajouter(a); WriteLn(a, a); fin Appel par valeur

49 var a : byte; procedure ajouter (parametre : byte) début WriteLn(parametre, parametre); parametre := parametre + 2; WriteLn(parametre, parametre); fin début a := 4; WriteLn(a, a); ajouter(a); WriteLn(a, a); fin Appel par valeur #0 a #200 #201 #202 #536.870.910 #536.870.911 #203 #220 #221... #222 #223... 4

50 var a : byte; procedure ajouter (parametre : byte) début WriteLn(parametre, parametre); parametre := parametre + 2; WriteLn(parametre, parametre); fin début a := 4; WriteLn(a, a); ajouter(a); WriteLn(a, a); fin #0 a #200 #201 #202 #536.870.910 #536.870.911 #203 parametre #220 #221... #222 #223... 4 4 Appel par valeur

51 #0 a #200 #201 #202 #536.870.910 #536.870.911 #203 parametre #220 #221... #222 #223... 6 4 Appel par valeur var a : byte; procedure ajouter (parametre : byte) début WriteLn(parametre, parametre); parametre := parametre + 2; WriteLn(parametre, parametre); fin début a := 4; WriteLn(a, a); ajouter(a); WriteLn(a, a); fin

52 #0 a #200 #201 #202 #536.870.910 #536.870.911 #203 #220 #221... #222 #223... 4 Appel par valeur var a : byte; procedure ajouter (parametre : byte) début WriteLn(parametre, parametre); parametre := parametre + 2; WriteLn(parametre, parametre); fin début a := 4; WriteLn(a, a); ajouter(a); WriteLn(a, a); fin

53 #0 #200 #201 #202 #536.870.910 #536.870.911 #203 #220 #221... #222 #223... Appel par valeur var a : byte; procedure ajouter (parametre : byte) début WriteLn(parametre, parametre); parametre := parametre + 2; WriteLn(parametre, parametre); fin début a := 4; WriteLn(a, a); ajouter(a); WriteLn(a, a); fin 4

54 Appel par référence var a : byte; type t_p_a = ^byte; procedure ajouter (parametre : t_p_a) begin WriteLn('parametre^', parametre^); parametre^ := parametre^ + 2; WriteLn('parametre^', parametre^); end; début a := 4; WriteLn('a', a); ajouter(Addr(a)); WriteLn('a', a); fin

55 var a : byte; type t_p_a = ^byte; procedure ajouter (parametre : t_p_a) begin WriteLn('parametre^', parametre^); parametre^ := parametre^ + 2; WriteLn('parametre^', parametre^); end; début a := 4; WriteLn('a', a); ajouter(Addr(a)); WriteLn('a', a); fin Appel par référence Parametre est un pointeur Appel par référence

56 #0 a #200 #201 #202 #536.870.910 #536.870.911 #203... 4 Appel par référence var a : byte; type t_p_a = ^byte; procedure ajouter (parametre : t_p_a); begin WriteLn('parametre^', parametre^); parametre^ := parametre^ + 2; WriteLn('parametre^', parametre^); end; début a := 4; WriteLn('a', a); ajouter(Addr(a)); WriteLn('a', a); fin

57 var a : byte; type t_p_a = ^byte; procedure ajouter (parametre : t_p_a); begin WriteLn('parametre^', parametre^); parametre^ := parametre^ + 2; WriteLn('parametre^', parametre^); end; début a := 4; WriteLn('a', a); ajouter(Addr(a)); WriteLn('a', a); fin #0 a #200 #201 #202 #536.870.910 #536.870.911 #203 parametre #240 parametre #241... parametre #242 parametre #243... 4 200 0 0 0 Appel par référence

58 #0 a #200 #201 #202 #536.870.910 #536.870.911 #203 parametre #240 parametre #241... parametre #242 parametre #243... 6 200 0 0 0 Appel par référence var a : byte; type t_p_a = ^byte; procedure ajouter (parametre : t_p_a); begin WriteLn('parametre^', parametre^); parametre^ := parametre^ + 2; WriteLn('parametre^', parametre^); end; début a := 4; WriteLn('a', a); ajouter(Addr(a)); WriteLn('a', a); fin

59 #0 a #200 #201 #202 #536.870.910 #536.870.911 #203 #240 #241... #242 #243... 6 Appel par référence var a : byte; type t_p_a = ^byte; procedure ajouter (parametre : t_p_a); begin WriteLn('parametre^', parametre^); parametre^ := parametre^ + 2; WriteLn('parametre^', parametre^); end; début a := 4; WriteLn('a', a); ajouter(Addr(a)); WriteLn('a', a); fin

60 Appel par référence (2) var a : byte; procedure ajouter (var parametre : byte) début WriteLn(parametre, parametre); parametre := parametre + 2; WriteLn(parametre, parametre); fin début a := 4; WriteLn(a, a); ajouter(a); WriteLn(a, a); fin Une autre façon dappeler une fonction par référence qui est moins explicite


Télécharger ppt "Algorithmes et structures de données avancées 6ème cours Patrick Reuter"

Présentations similaires


Annonces Google