Académique Documents
Professionnel Documents
Culture Documents
programmation 2
LGI – Semestre 2
Département informatique
UFR des Sciences et technologies
Université de Thiès
Overview
1. PRÉSENTATION DU COURS
3. POINTEURS
4. SOUS PROGRAMMES
5. RECURSIVITE
6. ALGORITHMES DE TRI
7. FICHIERS
3. POINTEURS
4. SOUS PROGRAMMES
5. RECURSIVITE
6. ALGORITHMES DE TRI
7. FICHIERS
1. Le cours
2. Les objectifs
3. Les Prérequis
4. Les références
– encore difficile ?
tests
– le jeu de tests doit être « suffisant »
– ne pas oublier les cas particuliers, …
Décrire le cheminement
? Décrire le cheminement à
permettant d’arriver à la emprunter pour arriver à votre
solution d’un problème décrit habitation telle que décrit par
par un énoncé votre adresse
• 1862 - 1943
• Liste des 23 problèmes de
Hilbert (1900)
• Problème numéro 10 :
« Trouver un algorithme déterminant si une
équation diophantienne à des solutions »
Équation diophantienne
• Une équation diophantienne, en
mathématiques, est une équation dont les
coefficients sont des nombres entiers et dont
les solutions recherchées sont également
entières. Le terme est aussi utilisé pour les
équations à coefficients rationnels. Les
questions de cette nature entrent dans une
branche des mathématiques appelée
arithmétique.
Pr. Mouhamadou THIAM Maître de
18
conférences en informatique
Équation diophantienne
• Carl Friedrich Gauss, un mathématicien du
XIXe siècle, disait : « Leur charme particulier
vient de la simplicité des énoncés jointe à la
difficulté des preuves »
• Identité de Bézout : a x + b y = c
• Théorème de Wilson : (x -1)! + 1 = y x
• Triplet pythagoricien : x2 + y2 = z2
• Last Fermat theorem (n=4) : x4 + y4 = z4
Pr. Mouhamadou THIAM Maître de
19
conférences en informatique
Exemple de problème
Le voyageur de commerce
10 b
a-b-e-c-d-a 50km
a
10
20 40 10
10 d
10
10
c
12
10
e
Pr. Mouhamadou THIAM Maître de
20
conférences en informatique
Algorithmique (1)
3. POINTEURS
4. SOUS PROGRAMMES
5. RECURSIVITE
6. ALGORITHMES DE TRI
7. FICHIERS
2. Tableaux
3. Chaîne
4. Structures
5. Compléments
Pr. Mouhamadou THIAM Maître de
29
conférences en informatique
Introduction
• A partir des types de base
– caractère,
– entier,
– Réel
• créer de nouveaux types, appelés types
composés,
• permettre de représenter des ensembles de
données organisés.
• type
nom_type = {constante1, constante2, …, constanteN }
• Syntaxe
enum nom_type {constante1, constante2, …, constanteN};
• Exemples:
• Exemple précédent
– lundi = 0; mardi = 1;...
Pr. Mouhamadou THIAM Maître de
41
conférences en informatique
Compréhension (suite)
• Instruction
– jour = mardi;
• Équivalente à l'instruction
– jour = 1;
• Initialisation explicite du 1er élément de la liste
avec valeur entière ≠ de zéro autorisée
– Exemple : enum mois { Janvier = 1, Février, Mars =
10,...., Décembre };
• Exemple:
– enum jour {Lundi=1, Mardi, Mercredi=5, Jeudi,
Vendredi, Samedi, Dimanche};
Structure de donnée:
• tableau a 2 dimension
Algorithmes:
• surtout I.A.
• Déclarer 12 variables
– moy (n1+n2+…+n12)/12
– Nom : salaire
– Taille (nombre d’éléments) : 6
• Remarques
– « case contenant une valeur » doit faire penser à celle de
variable
– éléments d'un tableau correspondent à des emplacements
contiguës en mémoire
Variable
nom_tableau : tableau [N] de type
Où
– nom_tableau est l’identificateur du tableau
– N est la taille du tableau et doit être une constante
entière et positive.
– type est le type des éléments du tableau
• variable
– salaire : tableau[6] de réel
– nom_clients: tableau [20] de caractere
– notes : tableau[8] d’entier
• Syntaxe
– type nom_tableau [ N ];
• Exemple
– int tab[10] ; //déclare une variable tableau de 10
entiers appelée tab
– Réservation emplacement mémoire stocker 10
entiers
– tab[0] désigne le premier élément du tableau tab
– tab[9] désigne le dernier élément du tableau tab
Som = 0;
for (int i=0; i<4; i++ )
Som = Som + Note[i];
Moy = Som / 4;
printf("la moyenne est = %f", Moy);
return 0;
• Tableaux à 2 dimensions
Valeurs repérées par deux coordonnées
• Déclaration
Damier : tableau[8][8] d’entier
– Réservation de 64 entiers (8x8)
– Damier (i, j)Damier (i-1, j-1), Damier (i-1, j+1),
Damier (i+1, j-1) et Damier (i+1, j+1)
• Déclaration
– Plusieurs indices pour désigner un élément
– Paire de crochets et taille pour chaque dimension
• Exemple
variable
nom_tableau: tableau[N1][N2] de type
• Exemple
– strcpy affectation
• strcpy(ch, ''hello'') ; // ch=“hello”;
• ch="hello "
• strcat concaténation de deux chaînes
– strcat (ch, ''world''); //ch = ''hello world’’
• strncat concaténation de deux chaînes
– ch="hello "
– strncat (ch, ''world'’, lgmax); //ch = ''hello wo’’ si
lgmax = 2
Variable
d : date // d est une variable de type date
z : complexe// z est une variable de type complexe
int main()
{
couleur c ; // c est une variable de type couleur
…
}
Pr. Mouhamadou THIAM Maître de
106
conférences en informatique
Exemple 2
struct complexe
{
double reelle;
double imaginaire;
};
• Exemple :
typedef int tab[10]; // tab est un "type" tableau
de 10 entiers
tab T; // T est une variable tableau de 10 entiers
Pr. Mouhamadou THIAM Maître de
108
conférences en informatique
Opérateur sizeof
• Argument
– type ou
– nom de variable
• Retour
– taille (en octets) de l’espace mémoire nécessaire
pour stocker une valeur de ce type.
– int i = sizeof(int); /* i vaut 4 */
• z =x=y?a:b
– Est évaluée comme
• z = x = ( y ? a : b)
3. POINTEURS
4. SOUS PROGRAMMES
5. RECURSIVITE
6. ALGORITHMES DE TRI
7. FICHIERS
« ... Les pointeurs étaient mis dans le même sac que l'instruction
goto comme une excellente technique de formuler des
programmes incompréhensibles. Ceci est certainement vrai si les
pointeurs sont employés négligemment, et on peut facilement
créer des pointeurs qui pointent 'n'importe où'. Avec une certaine
discipline, les pointeurs peuvent aussi être utilisés pour
programmer de façon claire et simple. C'est précisément cet
aspect que nous voulons faire ressortir dans la suite. ... »
• Opérateurs de base
– Adresse de : &
– Contenu de : *
• Déclaration:
– L'instruction <Type> * <nom_pointeur>
• Déclare un pointeur nom_pointeur
• Reçoit des adresses de variables de type <Type>
• Exemple : int * P;
int* a;
a
– Exemple :
• int N;
• printf("Entrez un nombre entier : ");
• scanf("%d", &N);
– Y = *P+1 Y=X+1;
– *P = *P+10 X=X+10;
– ++*P ++X
– (*P)++ X++ (parenthèses obligatoires)
• Exemple: int * p; p = 0;
a *a
free(a); a = NULL;
a *a
Désallocation dynamique
• a = (int*)realloc(4*sizeof(int));
3. POINTEURS
4. SOUS PROGRAMMES
5. RECURSIVITE
6. ALGORITHMES DE TRI
7. FICHIERS
Pr. Mouhamadou THIAM Maître de
147
conférences en informatique
Chapitre 4
SOUS PROGRAMMES
Algorithme A
A1: Lecture de M
A2: Lecture de N
A3: Affecter à O le résultat de M*N
A4: Tester si O est l’identité
A5: Affichage du message adéquat
Fin A
• Fonctions
– Paramètres
– Type retourné
• Procédures
– Paramètres
– Appel par variable
– Appel par valeur
s[i]=*(s+j); // s[i]=s[j]
s[j]=x;
return s;
}
return m;
}
• Idée :
– On lit le tableau T
– On fait appel à une procédure qui trie T
– On parcourt ensuite les éléments du premier jusqu’au
dernier
• Il ne faut par contre pas que le tableau soit trié
définitivement
• La procédure doit donc travailler sur une « copie »
non pas sur le tableau lui même
Algorithme ex
Variable T: Tableau[5] d’entiers
Début
Saisir(T)
Trier(T)
Fin
3. POINTEURS
4. SOUS PROGRAMMES
5. RECURSIVITE
6. ALGORITHMES DE TRI
7. FICHIERS
Pr. Mouhamadou THIAM Maître de
197
conférences en informatique
Chapitre 5
RECURSIVITE
• Qualité d'écriture
• Terminaison
• Validité
• Complétude
• Performance
• Exemple de la somme(a, b)
• Récursivité
De l’art d’écrire des programmes qui résolvent des
problèmes que l’on ne sait pas résoudre soi-même !
– Définition récursive. Une définition récursive est
une définition dans laquelle intervient ce que l’on
veut définir.
– Algorithme récursif. Un algorithme est dit récursif
lorsqu’il est défini en fonction de lui-même.
Paradigme « diviser pour régner »
• Principe et dangers de la récursivité
– Principe et intérêt : ce sont les mêmes que ceux de la
démonstration par récurrence en mathématiques. On doit
avoir :
– un certain nombre de cas dont la résolution est connue, ces «
cas simples » formeront les cas d’arrêt de la récursion ;
– un moyen de se ramener d’un cas « compliqué » à un cas « plus
simple ».
– La récursivité permet d’écrire des algorithmes concis et
élégants.
Paradigme « diviser pour régner »
• Difficultés :
– la définition peut être dénuée de sens :
• Algorithme A(n)
• renvoyer A(n)
• Risquer
– grande occupation de la mémoire
– longs temps d’exécution
Pr. Mouhamadou THIAM Maître de
213
conférences en informatique
Limites
• Écrire des algorithmes concis et élégants
• Risquer
– grande occupation de la mémoire
– longs temps d’exécution
Pr. Mouhamadou THIAM Maître de
214
conférences en informatique
Récursivité : exemple 2
Algorithme somme(a,b:entiers): entier
// a et b étant 2 entiers >=0
// calcul suivant le principe : a+b=a+(b-1)+1
Debut
si b = 0 alors retourner a
sinon
tmp somme(a,b-1) //appel récursif
retouner tmp +1
// on pouvait ecrire "retourner 1 + somme (a,b-1)"
//c'était pareil, on aurait le même résultat
finsi
fin
Pr. Mouhamadou THIAM Maître de
215
conférences en informatique
TYPES DE RÉCURSIVITÉ
Fonction PAIR (n : entier) : booléen Fonction IMPAIR (n : entier) : booléen
Début Début
Si (n = = 0) alors Si (n = = 0) alors
retourner vrai retourner faux
sinon sinon
retourner IMPAIR (n-1 retourner PAIR (n-1)
FinSi FinSi
FinFonction FinFonction
3. POINTEURS
4. SOUS PROGRAMMES
5. RECURSIVITE
6. ALGORITHMES DE TRI
7. FICHIERS
Pr. Mouhamadou THIAM Maître de
224
conférences en informatique
Chapitre 6
ALGORITHMES DE TRI
45 3 19 7 4
imin = 1
3 45 19 7 4
3 4 19 7 45 imin = 4
imin = 3
3 4 7 19 45
3 45 19 7 4 3 19 45 7 i=24
3 19 45 7 4 3 19 45 45 4
i=3
tmp=7
3 19 19 45 4 3 7 19 45 4
3 7 19 45 4 3 7 19 45 45
i=4
3 7 19 19 45 3 4 7 19 45
45 3
19 7 4 45 34 < 719 j4
4 7
45 3
19 4 7 45 34 < 194 J3
19 7
i0
45 3
4 19 7 4<3 j2
45 3
4 19 7 3 45
3 < 454 j1
19 7
3
45 4 19 7 3 45
7 < 194 j47 19
3 45
4 7 19 7<4 j3 i1
3
45 4 7 19 3 44 < 45
45 j2
7 19
3
4 45 7 19 19 < 7 j4
i2
3
4 45 7 19 3 47 < 457 j3
45 19
3 4
7 45 19 3 419 <457 j4
19 i3
45
triFusion(tab,milieu+1,fin)
fusionner(tab,deb,milieu,fin)
FinSi
FinProcédure
fusionner
temp 3 4 7
k2 j4 i1
temp 3 4 7
k3 19 j > f i1
245temp tab 3 4 7
k4 19 cp45 THIAM
Pr. Mouhamadou i2 Maître de
conférences en informatique
Fonctionnement
• Récursivement
– Tableau divisé en 2 sous-tableaux
– Algorithme appliqué à chaque sous-tableau
– Fusion des sous-tableaux ordonnés
pp = 1 45 33 < 45
19 i1
4 7
pp = 2 45 319<4519 i2
4 7
piv=45, pp=0
pp = 3 45 34 < 45
19 i3
4 7
pp = 4 45 37 < 45
19 i4
4 7
7 3 19 4 45
7 3 19
FinSi 4
pp = 1 7 33 < 74 19
i1
3. POINTEURS
4. SOUS PROGRAMMES
5. RECURSIVITE
6. ALGORITHMES DE TRI
7. FICHIERS
• Manipuler fichier
– définir un pointeur
– pointeur fournit l'adresse d'une cellule donnée
• Déclaration
– FILE *fichier; /*majuscules obligatoires FILE*/
– déclaration fichier AVANT celle des autres variables
MODE DESCRIPTION
"r" ou "rt" lecture seule
"w" ou "wt" écriture seule (destruction de l'ancienne version si elle existe)
"w+" ou "wt+" lecture/écriture (destruction ancienne version si elle existe)
lecture/écriture d'un fichier existant (mise à jour), pas de création
"r+" ou "rt+"
d'une nouvelle version
"a+" ou "at+" lectire/écriture d'un fichier existant (mise à jour), pas de création
d'une nouvelle version, le pointeur est positionné à la fin du fichier.
MODE DESCRIPTION
"rb" lecture seule
"wb" écriture seule (destruction de l'ancienne version si elle existe)
"wb+" lecture/écriture (destruction ancienne version si elle existe)
lecture/écriture d'un fichier existant (mise à jour), pas de création
"rb+"
d'une nouvelle version
"ab+" lecture/écriture d'un fichier existant (mise à jour), pas de création
d'une nouvelle version, le pointeur est positionné à la fin du fichier.
if(fichier==NULL){
printf("fichier non ouvert\n");
}
else{
/* suite du programme */
/* parmi lequel lecture des valeurs dans le fichier */
}
• Destruction
– Prototype : int remove(char *nom)
– Retourne 0 si réussi
• Renommage:
– Prototype : int rename (char* anciennom, char
*nouveaunom)
– Retourne 0 si réussi
Pr. Mouhamadou THIAM Maître de
275
conférences en informatique
Erreurs à gérer
• fopen
– retourne le pointeur NULL si erreur
– Exemple : impossibilité d'ouvrir le fichier
• fgets
– retourne le pointeur NULL en cas d'erreur ou si la
fin du fichier est atteinte.
• feof (FILE *fichier)
– retourne 0 tant que la fin du fichier n'est pas
atteinte.
Pr. Mouhamadou THIAM Maître de
276
conférences en informatique