Vous êtes sur la page 1sur 18

Algorithmique et Programmation

8h CM, 12h TD, 10h TP

1- Enregistrement

2- Algorithmes de recherche et de tri

3- Complexité algorithmique

4- Fichiers, gestion des erreurs

www.u-picardie.fr/~furst/algo_prog.php

Algorithmique et Programmation 1
Enregistrement

Notions vue en S1 :


- algorithme
- variables
- type de donnée
- instructions, expressions
- conditionnelles, boucles
- tableau
- fonctions

Premier complément : les enregistrements


- facilitent l'écriture des programmes
- permettent de représenter explicitement ce que décrivent les données

Algorithmique et Programmation 2
Énumération

Il est possible (en C et dans de nombreux langages) de définir un type ordonné


en spécifiant explicitement ses valeurs :

enum arc_en_ciel {rouge, orange, jaune, vert, bleu, indigo, magenta,


violet};

arc_en_ciel coul <- bleu;

Remarque : en C, les valeurs des énumérations sont des entiers.

enum arc_en_ciel {rouge=27, orange, jaune=-4, vert, bleu, indigo,


magenta, violet};

enum arc_en_ciel coul1 = violet, coul2 = coul1+2;

printf("%d",(int) coul2); // affiche 3

Algorithmique et Programmation 3
Type de données structuré

Types structurés : une valeur n’est pas atomique mais constituée d’autres
valeurs

Exemple : type tableau, toutes les valeurs sont de même type

entier montableau[300];
pour (i allant de 0 à montableau.longueur pas de 1) faire
montableau[i] <- 0;
finpour
montableau[0] <- 7;

Attention : un type tableau est un type, un tableau est une valeur d’un type
tableau.

En C, on peut déclarer un type tableau avec typedef


typedef int montype[3];
typedef float truc[];

montype toto;
truc tab = {2.3,4.0};

Algorithmique et Programmation 4
Enregistrement

Les enregistrements permettent d’agréger des valeurs de types différents.

On déclare les types enregistrement en précisant leurs champs avec leurs


types et identifiants :

enregistrement Personne
chaine nom, prenom;
entier age;
finenregistrement

Les enregistrements sont déclarés et initialisés comme les tableaux :

Personne p1;
p1.nom <- "Duchmol";
p1.prenom <- "Robert";
p1.age <- 32;
Personne p2 <- {"Tartempion", "Marcel", 54};

Algorithmique et Programmation 5
Enregistrement en C
En C, il faut toujours indiquer avant le nom du type enregistrement qu'il s'agit
d'un type enregistrement, sauf si on utilise le mot-clé typedef.

struct Personne{
char *nom, *prenom;
int age;
};

struct Personne p1;


p1.nom = "Duchmol";
p1.prenom = "Robert";
p1.age = 32;

struct Personne p2 = {"Tartempion", "Marcel", 54};

typedef struct{
char *nom, *prenom;
int numero;
} Etudiant;

Etudiant e;
...

Algorithmique et Programmation 6
Visibilité des champs

Un identifiant de champ n’est visible que dans les enregistrements instances du


type où il est défini.

Un identifiant de champ n’a donc aucun sens s’il n’est pas préfixé par l’identifiant
d’un enregistrement :

enregistrement Personne
chaine nom, prenom;
entier age;
finenregistrement

Personne p;
p.nom <- "Dupuis";
nom <- "Duchemin";
int age <- 34;
p.age <- 32;

enregistrement Etudiant
chaine surnom, numero;
entier numero, age;
finenregistrement

Algorithmique et Programmation 7
Combinaison d'enregistrements

Les champs d’un type enregistrement peuvent être de tout type, y compris
enregistrement.

enum diplome {licence, master, doctorat};

enregistrement Inscription
entier annee; // année dans le diplome
diplome dip;
entier dispense_assiduite;
finenregistrement

enregistrement Etudiant
entier numero;
chaine nom;
Inscription inscrip;
finenregistrement

Algorithmique et Programmation 8
Enregistrement récursif

Il est possible qu’un type enregistrement contienne un champ typé par lui-même.

enregistrement Personne
entier age;
chaine nom;
Personne pere, mere;
finenregistrement

En C, il est nécessaire d’utiliser des pointeurs pour déclarer ce type


d’enregistrement.
struct Personne{
int age;
char *nom;
struct Personne *pere, *mere;
};

struct Personne p1, p2, p3;


...
*p1.pere = p2;
p1.mere = &p3;

Algorithmique et Programmation 9
Enregistrements et tableaux

Il est possible qu’un champ d’un type enregistrement soit de type tableau.

enregistrement Etudiant
entier numero;
chaine nom;
Inscription inscrip;
réel notesSemestre[];
finenregistrement

Attention : en C, un champ de type tableau dont la taille n'est pas fixée doit être
déclaré à la fin de l'enregistrement !

Il est possible de manipuler des tableaux d’enregistrements.

Etudiant tab[200];
tab[0].nom <- "Dupont";
tab[0].notesSemestres[0] <- 14.5 ;
...

Algorithmique et Programmation 10
Tableau multidimensionnel

Un tableau à deux dimensions peut être vu comme un tableau de tableau.

caractère morpion[3][3];
morpion[1][1] <- 'o';
chaine we[2] <- {"samedi","dimanche"};

morpion morpion
'
o
'
'
o
'

we ' ' ' ' ' '


s a m e d i
' ' ' ' ' '
' ' ' ' ' ' ' '
d i m a n c h e
' ' ' ' ' ' ' '

Algorithmique et Programmation 11
Structures de données
Structurer les données facilite l’écriture des programmes et l’échange des données
entre parties des programmes (fonctions).

enregistrement Note
entier n, coef;
finenregistrement
enregistrement Etudiant
entier numero;
chaine nom;
Inscription inscrip;
Note notesSemestre[];
finenregistrement

numero : 2 numero : 3
nom : "Dupont" nom : "Durand"
inscrip : inscrip : ... ... ...
notesSemestre : notesSemestre :

annee : 1 annee : 1
dip : licence dip : licence
dispense_assiduite : 0 dispense_assiduite : 0

n : 14 n : 12 n : 5 n : 18 n :14 n : 12 n : 5 n : 18


coef : coef : coef : coef : coef : coef : coef : coef :
1 2 2 4 1 2 2 4
Algorithmique et Programmation 12
Déclaration de type enregistrement en C

En C, on peut déclarer un type enregistrement et le décrire plus tard :

struct Etudiant; // déclaration incomplète


...
struct Etudiant{ // description du type
int numero;
char *nom;
};

En pratique, ça n’est utile que pour déclarer des types interdépendants.

struct Oeuf;
struct Poule{
Oeuf aPondu;
};
struct Oeuf{
Poule ponduPar;
}

Algorithmique et Programmation 13
Affectation globale d'enregistrement

En langage C, affecter un enregistrement à une variable recopie toutes les valeurs


des champs.

struct Etudiant{
int numero, annee;
char *nom;
};

struct Etudiant e1, e2;


...
e1 = e2; // équivalent à e1.numero = e2.numero;
// e1.annee = e2.annee;
// e1.nom = e2.nom;

Algorithmique et Programmation 14
Valeurs par défaut des champs
Dans de nombreux langages, il est possible de donner des valeurs par défaut
aux champs.

enregistrement Etudiant
entier numero, annee <- 1;
chaine nom;
finenregistrement

En C, c’est impossible, mais on peut définir un enregistrement par défaut.

struct Etudiant{
int numero, annee;
char *nom;
}Etudiant_defaut={0,1,""};

struct Etudiant e = Etudiant_defaut;


e.numero = 23456;
e.nom = "Dupond";

Remarques :
- les valeurs servant à initialiser les champs doivent être des constantes
- il est possible de ne pas donner de nom au type (mais alors on ne peut
plus l’utiliser dans le reste du code)

Algorithmique et Programmation 15
Paramètre de type enregistrement

Les enregistrements peuvent être transmis aux fonctions par valeur ou par
référence :

struct Etudiant{
int numero, annee;
char *nom;
};

// transmission par valeur, l’enregistrement est recopié


int compare(struct Etudiant t1, struct Etudiant t2){
return t1.numero – t2.numero;
}

// transmission par référence


void changeNom(struct Etudiant *t, char *n){
(*t).nom = n; // ou t->nom = n ;
}

Algorithmique et Programmation 16
Valeur de retour de type enregistrement
Les enregistrements peuvent être retournés par les fonctions :
enregistrement Etudiant
entier numero, annee;
chaine nom;
finenregistrement

fonction avec retour Etudiant trouve(Etudiant t[], entier tSize,


chaine n)
entier indice <- -1;
entier i <- 0;
début
tantque (indice=-1 et i<tSize) faire
si (t[i].nom = n) alors
indice <- i;
finsi
i <- i+1;
fintantque
fin

Attention : au cas où on ne trouve pas l’étudiant, que renvoyer ?

Solution bancale : créer un enregistrement avec un champ bidon (par exemple


un numéro négatif) et le renvoyer.

Algorithmique et Programmation 17
Retour de type enregistrement en C

En C, il faut mieux renvoyer un pointeur sur l’enregistrement, et utiliser la valeur NULL

struct Etudiant{
int numero, annee;
char *nom;
};

struct Etudiant* trouve(struct Etudiant t[], int tSize, char *n){


int indice = -1;
int i = 0;
while(indice==-1 && i<tSize){
if(t[i].nom == n) indice = i;
i++;
}
if(indice == -1) return NULL;
else return &t[indice];
}

Algorithmique et Programmation 18

Vous aimerez peut-être aussi