Académique Documents
Professionnel Documents
Culture Documents
Programmation
avancée en C
Dr A. EL ALLAOUI
1
Description du Module
1. Algorithmique et Mise à niveau en
langage C
- Les pointeurs 4. Structure de données élémentaires
- Les fonctions - Piles
- La gestion dynamique de la mémoire - Files
- Les structures - Listes
- Les fichiers - Tables de hachage
- Arbres
2. La récursivité et paradigme « Diviser pour
régner »
8.168.684.336 pages
Comment ça marche ?
Motivation
Structure de donnée:
- tableau a 2 dimension
Algorithmes:
- surtout I.A.
Motivation
Structure de donnée :
File
FIFO
(First In First Out)
Premier entrée, premier sortie
Pile
LIFO
(Last In First Out)
Dernier entrée, premier sortie
Motivation
Structure de donnée :
Graphe
(pour planifier des
Trajets)
Rappel et compléments de
la programmation en
langage C
Dr A. EL ALLAOUI
8
Objectifs
Être capable de bien programmer
9
Qualités attendues d'un
programme
Clarté
Simplicité
Efficacité
Modularité
Extensibilité
10
Introduction au Langage C,C++
Début du programme
Inclusion de la bibliothèque
#include <stdio.h>
contenant la fonction printf
12
Introduction au Langage C
Types de variable
char caractères
int entiers
short [int
[int]] entiers courts
long [int
[int]] entiers longs
float nombres décimaux
double nombres décimaux de
précision
supérieure
long double nombres décimaux
encore plus
précis
unsigned int entier non signé
13
Introduction au Langage C,C++
Déclaration d'une variable
Type nom_de_la_variable [= valeur]
Exemple:
int nb;
float pi = 3.14;
char c = 'a';
long i,j,k;
double r = 6.2879821365;
14
Types de base
4 types de base, les autres types seront dérivés de ceux-ci.
15
TYPE de la valeur de retour
int main(void)
{
void main(void): La fonction main ne prend
/* corps du programme*/
begin aucun paramètre et ne retourne pas de valeur.
déclaration des Cstes et Var ;
instruction1 ; int main(void): La fonction main retourne une
valeur entière à l'aide de l'instruction return (0
instruction2 ; si pas d’erreur).
….
int main(int argc, char *argv[]): On obtient
}
alors des programmes auxquels on peut
end adresser des arguments au moment où on lance
le programme.
Entre accolades "{" et "}" on
mettra la succession d'actions à
réaliser.(Bloc)
16
Structure d'un programme C
#include <stdio.h>
#define DEBUT -10 Directives du préprocesseur :
#define FIN 10 accès avant la compilation
#define MSG "Programme de démonstration\n"
int fonc1(int x);
int fonc2(int x); Déclaration des fonctions
void main()
{ /* début du bloc de la fonction main*/
int i; /* définition des variables locales */
Programme
i=0; principal
fonc1(i) ;
fonc2(i) ;
} /* fin du bloc de la fonction main */
int fonc1(int x) {
return x; Définitions des
}
fonctions
int fonc2(int x) {
return (x * x);
}
17
Indenter = lisibilté #include <Lib1.h>
#include <Lib2.h>
Prenez l'habitude de respecter (au moins au début) les #define X 0;
règles :
int fonc1(int x);
- une accolade est seule sur sa ligne, float fonc2(char a);
- { est alignée sur le caractère de gauche de la ligne
précédente, int main(void)
Inclusion de fichiers
#include <nom-de-fichier> /* répertoire standard */
#include "nom-de-fichier" /* répertoire courant */
19
1er Programme
#include <stdio.h>
#include <conio.h>
int main(void)
{
20
La fonction printf() :
Librairie : stdio.h. #include <stdio.h>
Exemple :
printf("Qu'il est agreable d’utiliser printf "
"en\t C,\nlorsqu'on l'utilise \"proprement\".\n");
22
La fonction scanf() :
Librairie : stdio.h. #include <stdio.h>
Variables : initialisations
Les variables doivent être déclarées avant leur utilisation dans un début de bloc (juste après{),
zone des déclarations:
sscanf sscanf(char *s, char *format, pointer ...); Lit la chaîne d'adresse s.
26
LES DECLARATIONS DE CONSTANTES
27
LES DECLARATIONS DE CONSTANTES
2eme méthode: déclaration d'une variable, dont la valeur sera constante pour tout le programme.
Exemple:
void main() Le compilateur réserve de la
{ place en mémoire (ici 4 octets).
const float PI = 3.14159;
const int JOURS = 5;
float perimetre,rayon = 8.7;
perimetre = 2*rayon*PI;
.... /*ERREUR !*/ On ne peut
JOURS = 3; changer la valeur d’une const.
.... !
}
28
Les opérateurs arithmétiques
Le C propose les opérateurs suivants :
+ addition
- soustraction
* multiplication
/ division
% modulo (reste de la division entière )
7/2 3
7.0/2
7/2.0
7.0/2.0
} 3.5
29
Utiliser des opérateurs arithmétiques
k = i / j;
h = f / g;
h = 5/4 = 1.0000 h = i / j;
}
30
Les opérateurs de comparaison
< plus petit Le type booléen
<= plus petit ou égal n'existe pas. Le
résultat d'une
> plus grand
expression logique
>= plus grand ou égal vaut 1 si elle est
! == égal vraie et 0 sinon.
!= différent
Réciproquement,
Les opérateurs logiques toute valeur non
nulle est considérée !
&& et comme vraie et la
|| ou (non exclusif) valeur nulle
comme fausse.
! non
31
int i;
Exemple
float f;
char c;
i = 7; f = 5.5; c = 'w';
RQ: !expr1 est vrai si expr1 est faux et faux si expr1 est vrai ;
expr1&&expr2 est vrai si les deux expressions expr1 et expr2 sont vraies et
faux sinon. L'expression expr2 n'est évaluée que dans le cas où l'expression
expr1 est vraie ;
#include <stdio.h>
int main(void)
{
équivalent à:
int i, j = 5;
1. j++;
i = ++j;
2. i = j; !
printf("i=%d, j=%d\n", i, j);
j = 5; équivalent à:
i = j++; 1. i = j;
printf("i=%d, j=%d\n", i, j); 2. j++; !
return 0;
} i=6, j=6
i=5, j=6
34
Les Conversions de types
Le langage C permet d'effectuer des opérations de conversion de type.
On utilise pour cela l'opérateur de "cast" ().
#include <stdio.h>
#include <conio.h>
void main()
{
int i=0x1234, j; //1234hex=4660dec Conversion float -> int: 89.67 -> 89
char d,e; Conversion int -> float: 4660 -> 4660.00
float r=89.67,s;
Conversion int -> char: 1234 -> 34
j = (int)r;
s = (float)i; Conversion float -> char: 89.67 -> 89
d = (char)i; Pour sortir frapper une touche
e = (char)r;
printf("Conversion float -> int: %5.2f -> %d\n",r,j);
printf("Conversion int -> float: %d -> %5.2f\n",i,s);
printf("Conversion int -> char: %x -> %x\n",i,d);
printf("Conversion float -> char: %5.2f -> %d\n",r,e);
printf("Pour sortir frapper une touche ");
getch(); // pas getchar
}
35
Les structures de contrôle en C
Alternative: if-else
Choix Multiple: switch-case
Itérations: for, while, do-while
Rupture de Contrôle: break, continue, return
… goto
36
Les structures de contrôle en C
Les décisions - if then else
if (expression booléenne vraie) if (a<b)
{ {
Pas de then en C BLOC 1 D'INSTRUCTIONS min=a;
} }
else else
Le bloc " else " { {
est optionnel. BLOC 2 D'INSTRUCTIONS min=b;
} }
if(32)
printf("ceci sera toujours affiche\n");
if(0)
printf("ceci ne sera jamais affiche\n");
37
Exemples :
if (i < 10) i++;
La variable i ne sera incrémentée que si elle a une valeur inférieure à 10.
int main(void)
{
int i = 0;
return 0;
}
Quand i != de zero
39
if emboîtés
else est associé avec le if le plus proche
int i = 100;
if(i > 0)
if(i > 1000)
printf("i > 1000\n");
else
printf("i is reasonable\n");
i is reasonable
int i = 100;
if(i > 0) {
if(i > 1000)
printf(" i > 1000 \n");
} else
printf("i is negative\n");
40
Opérateur conditionnel ? :
<expr1> ? <expr2> : <expr3>
• Si <expr1> fournit une valeur différente de zéro (Vrai), alors la valeur de
<expr2> est fournie comme résultat
• Si <expr1> fournit la valeur zéro (faux), alors la valeur de <expr3> est
fournie comme résultat
Exemple
La suite d'instructions peut être remplacée par:
MAX = (A > B) ? A : B
if (A>B)
MAX=A;
else int a , b;
MAX=B; a = 10;
printf( "Valeur de b est %d\n",
(a == 1) ? 20: 30 );
printf( "Valeur de b est %d\n",
(a == 10) ? 20: 30 );
41
Les itérations – for
int i,j;
for( init ; test; increment) i=0
{ for (i = 0; i <3; i++) { i=1
/* corps de for */ printf ( "i = %d\n", i); i = 2
} j=5
} j=4
for(j = 5; j > 0; j- -)
printf("j = %d\n", j); j = 3
double angle; j=2
j=1
for(angle = 0.0; angle < 3.14159; angle += 0.2)
printf("sine de %.1lf %.2lf\n",angle, sin(angle));
int i, j, k;
43
Exemple
i=1; Intérieur 1
while(i<5) Intérieur 2
{ Intérieur 3
printf(“Intérieur %d\n",i); Intérieur 4
itération i++; Extérieur 5
}
printf("Extérieur %d\n",i);
int j = 5;
start
tant que, pas jusqu’à ce que! printf("start\n"); end
while(j == 0)
printf("j = %d\n", j--);
printf("end\n");
i=1;
while(i<5);
{ "tant que l'expression est vraie
printf(“Intérieur %d\n",i); attendre".
i++;
}
44
do while = REPETER … tant que
(guarantit l’exécution au moins une fois)
bloc d' do
{
instructions ............; /* bloc d'instructions */
............;
}
46
switch = AU CAS OU ... FAIRE ...
switch(variable de type char ou int) /* au cas où la variable vaut: */
{
case valeur1: ......; /* cette valeur1(étiquette): exécuter ce bloc d'instructions.*/
.......;
break; /* L'instruction d'échappement break;
permet de quitter la boucle ou l'aiguillage le plus proche.
*/
47
Cette instruction est commode pour les "menus":
default; printf("\nCE CHOIX N'EST PAS PREVU "); /* pas de break ici */
}
48
Instructions d'échappement
Pour rompre le déroulement séquentiel d'une suite d'instructions
Break; Continue;
49
Tableaux : Introduction
Déclaration de tableaux
Un tableau (array) est une collection de variables de même type, appelées éléments
On les déclare par un type, un nom et une dimension (CONSTANTE) placée entre [ ]
Le C alloue toujours un tableau dans une zone contigüe de la mémoire
Une fois déclaré, on ne peut redimensionner un tableau
Exemples
int tab[4]; déclare un tableau de 4 valeurs entières tab[0] tab[1] tab[2] tab[3]
!
#define SIZE 10
int a[SIZE]; /* a est un vecteur de 10 entiers */
le compilateur réserve SIZE places en mémoire pour ranger les éléments du tableau.
50
Accès aux éléments d’un tableau
Les éléments sont numérotés de 0 à dim-1 !
Il n’y a pas de vérification de bornes
void main(void) a void main(void)
{ 59 0
{
int a[6];
? 1
int i = 7; int i;
? 2
int A[6] = { 1, 2,3, 5, 7, 11 };
a[0] = 59; 2 3
a[5] = -10; for (i=0;i<6;i++)
a[i/2] = 2; ? 4
printf("%d ", A[i]);
-10 5
a[6] = 0; }
a[-1] = 5;
}
Remarque
Aucune limitation ne pèse sur le nombre d’indices que peut comporter un
tableau. Seules les limitations de taille mémoire liées à un environnement
donné risquent de se faire sentir.
52
Arrangement en mémoire des tableaux à plusieurs
indices
Les éléments d’un tableau sont rangés suivant l’ordre obtenu en faisant varier le
dernier indice en premier.(Pascal utilise le même ordre, Fortran utilise l’ordre
opposé). Ainsi, le tableau t déclaré précédemment verrait ses éléments ordonnés
comme suit :
t[0][0]
t[0][1]
t[0][2]
t[1][0]
t[1][1]
t[1][2]
....
t[4][0]
t[4][1]
t[4][2] 53
Initialisation de tableaux à un indice
La déclaration :
int tab[5] = { 10, 20, 5, 0, 3 } ;
place les valeurs 10, 20, 5, 0 et 3dans chacun des cinq éléments du tableau tab.
Il est possible de ne mentionner dans les accolades que les premières valeurs,
comme dans ces exemples :
int tab[5] = { 10, 20 } ;
int tab[5] = { 10, 20, 5 } ;
Les valeurs manquantes seront, suivant le compilateur, initialisées à zéro
(statique) ou aléatoires (automatique).
De plus, il est possible d’omettre la dimension du tableau, celle-ci étant alors
déterminée par le compilateur par le nombre de valeurs énumérées dans
l’initialisation. Ainsi, la première déclaration de ce paragraphe est équivalente à :
int tab[] = { 10, 20, 5, 0, 3 } ;
54
Initialisation de tableaux à plusieurs indices
Voyez ces deux exemples équivalents (nous avons volontairement choisi des valeurs
consécutives pour qu’il soit plus facile de comparer les deux formulations) :
55
void main()
{
const int N=10;
int t[N],i;
for (i=0;i<N;i++){
printf("Entrez t[%d]=",i);
scanf("%d",&t[i]);
}
}
56
Exercice
Donner un programme en langage C qui permet de trier
6 éléments tapé par clavier (utilisez les tableaux)
57