Télécharger la présentation
La présentation est en train de télécharger. S'il vous plaît, attendez
Publié parDenis Philippe Modifié depuis plus de 11 années
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
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
Présentations similaires
© 2024 SlidePlayer.fr Inc.
All rights reserved.