Algorithmes et structures de données 5ème cours Patrick Reuter http://www.labri.fr/~preuter
Ingrédients d’algorithmes 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 d’instructions (begin .. end)
Motivation Structure de données: - tableau à 2 dimensions …
Déclaration de variables 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 ….. 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
Déclaration de variables var compteur : integer; var diviseur : single; var c : char; 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
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
Déclaration de variables Types prédéfinis integer, boolean, single, … Types que l’on peut définir soi-même type t_nombre_entier = integer; var i : t_nombre_entier; { pas vraiment d’intérêt ... } au lieu de var i : integer;
Déclaration de variables Types prédéfinis Integer, boolean, single, … Types que l’on 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;
Déclaration de variables Type tableau : type t_tableau = array[1..MAX] of integer; var factoriel : t_tableau; Factoriel[1] := 1; Factoriel[2] := 2; Factoriel[3] := 6; Factoriel[4] := 24; Factoriel[5] := 120; Factoriel[6] := 720; …
Déclaration de variables Type tableau : type t_tableau = array[1..MAX] of integer; var factoriel : t_tableau; var i, produit : integer; produit := 1; POUR i de 1 à MAX faire produit := i*produit; factoriel[i] := Produit; FIN POUR
Organisation de la mémoire type t_tableau = array[1..MAX] of integer; var factoriel : t_tableau; #536.870.911 #536.870.910 ... factoriel[n] #(2000+4*n-1) n! ... factoriel[2] #2004 2 factoriel[1] #2000 1 factoriel[index] #(2000+4*index-4)
Type tableau à 2 dimensions : var a : array[1..lignes] of array[1..colonnes] of real; Ou bien var a : array[1..lignes, 1..colonnes] of real; type t_ligne = array[1..colonnes] of real; var a : array[1..lignes] of t_ligne; type t_tableau2 = array[1..lignes] of t_ligne; var a : t_tableau2; type t_tableau2 = array[1..lignes, 1..colonnes] of real; type t_tableau2= array[1..lignes] of array[1..colonnes] of real;
Déclaration de variables Type tableau à 2 dimensions type t_ligne = array[1..colonnes] of real; type t_tableau2 = array[1..lignes] of t_ligne; var a : t_tableau2; { Affectation: } a[1][1] := 0; a[1][2] := 0; .. a[1][colonnes] := 0; a[2][1] := 0; a[2][2] := 0; a[lignes][colonnes] := 0;
Déclaration de variables Type tableau à 2 dimensions : type t_ligne = array[1..colonnes] of real; type t_tableau2 = array[1..lignes] of t_ligne; var a : t_tableau2; var i,j : integer; POUR i de 1 à n FAIRE POUR j de 1 à n FAIRE a[i][j] := 0; FIN POUR ²
Déclaration de variables Type tableau à 2 dimensions : type t_ligne = array[1..lignes] of real; type t_tableau2 = array[1..colonnes] of t_ligne; var a : t_tableau2; var i,j : integer; POUR i de 1 à n FAIRE POUR j de 1 à n FAIRE a[i][j] := 0; FIN POUR Complexité ? Remplir une matrice identité ?
Déclaration de variables Type tableau à 2 dimensions : n = lignes = colonnes type t_ligne = array[1..n] of real; type t_tableau2 = array[1..n] of t_ligne; var a : t_tableau2; var i,j : integer;
Déclaration de variables Type tableau à 2 dimensions : n = lignes = colonnes type t_ligne = array[1..n] of real; type t_tableau2 = array[1..n] of t_ligne; var a : t_tableau2; var i,j : integer; POUR i de 1 à n FAIRE POUR j de 1 à n FAIRE SI i=j ALORS a[i][j] := 1; SINON a[i][j] := 0; FIN POUR
Organisation de la mémoire type t_ligne = array[1..3] of byte; type t_tableau2 = array[1..3] of t_ligne; var a : t_tableau2; #536.870.911 #536.870.910 ... a[3][3] #2008 ... ... a[2][2] #2004 Occupe de la place successive dans la mémoire a[2][1] #2003 a[1][3] #2002 a[1][2] #2001 a[1][1] #2000 ... #0 a[i][j] #(2000+(3*(i-1))+ j - 1 )
Organisation de la mémoire type t_ligne = array[1..colonnes] of byte; type t_tableau2 = array[1..lignes] of t_ligne; var a : t_tableau2; a[i][j] #(2000+j+((colonnes-1)*i) -1)
Organisation de la mémoire type t_ligne = array[0..colonnes-1] of byte; type t_tableau2 = array[0..lignes-1] of t_ligne; var a : t_tableau2; a[i][j] #(2000+j+((colonnes)*i) )
Déclaration de variables Des nombres entiers sont souvent utilisés quand un choix parmi un petit nombre d’alternatives est souhaité. Nombre entiers Type de base : byte, integer; var jour : integer; jour := 1; { signifie par exemple lundi } … jour := 3; { signifie par exemple mercredi }
Déclaration de variables Les types énumérés type t_jourdesemaine =(lundi, mardi, mercredi, jeudi, vendredi, samedi, dimanche); var jour : t_jourdesemaine; jour := lundi; … jour := mercredi;
Déclaration de variables Les types énumérés Autres exemples type t_jourdesemaine =(lundi, mardi, mercredi, jeudi, vendredi, samedi, dimanche); type t_couleur =(rouge, vert, bleu, gris); type t_sexe =(masculin, feminin);
Organisation de la mémoire var jour : t_jourdesemaine; #536.870.911 #536.870.910 ... #1.000 ... #5 #4 #3 #2 #1 #0 jour
Déclaration de variables type t_carte =(7,8,9,10,vallee,dame,roi,as); var ma_meilleure_carte : t_carte; var cartes : array[1..8] of t_carte; ma_meilleur_carte := roi; cartes[1] := 10; cartes[2] := dame; cartes[3] := 7; ... cartes[8] := 9;
Motivation Structure de données: - tableau à 2 dimensions … type t_ligne = array[1..8] of byte;
Motivation Structure de données: - tableau à 2 dimensions … type t_ligne = array[1..8] of byte; type t_damier = array[1..8] of t_ligne;
Motivation Structure de données: - tableau à 2 dimensions … type t_ligne = array[1..8] of byte; type t_damier = array[1..8] of t_ligne; var damier : t_damier;
Motivation Imaginons la convention suivante : - 0 pour un champs vide - 1 pour un champs blanc - 2 pour un champs noir type t_ligne = array[1..8] of byte; type t_damier = array[1..8] of t_ligne; var damier : t_damier; Pour initialiser un damier vide :
Motivation Imaginons la convention suivante : - 0 pour un champs vide - 1 pour un champs blanc - 2 pour un champs noir type t_ligne = array[1..8] of byte; 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] := 0; FIN POUR
Motivation Structure de données: - tableau à 2 dimensions … type t_ligne = array[1..8] of byte; type t_damier = array[1..8] of t_ligne; var damier : t_damier;
type t_champ =(vide, blanc, noir); {pour le jeu de dames} Motivation Structure de données: - tableau à 2 dimensions … type t_champ =(vide, blanc, noir); {pour le jeu de dames}
Motivation Structure de données: - tableau à 2 dimensions … 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;
Motivation Pour initialiser un damier vide : 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