Cours SMA3
Cours SMA3
1
Table de matières
1-Introduction
2-Notions de base
2
1-Introduction
3
1-Introduction
Langage informatique
4
1-Introduction
5
1-Introduction
C est un langage :
Universel : permet aussi bien la programmation système que la programmation
de divers applications (scientifique, de gestion,…)
Prés de la machine : offre des opérateurs qui sont très proches de ceux du
langage machine…
Très rapide: Aucun contrôle de débordement n'est effectué, ce qui apporte une
plus grande vitesse.
6
2-Notions de base
7
2-Notions de base
#include <stdio.h>
void main( )
{
printf("Bonjour tout le monde \n");
}
8
2-Notions de base
Lecture des
données
Affichage des
résultats
Remarque:
On parle parfois pour un programme donné d'application ou de
logiciel.
9
2-Notions de base
11
2-Notions de base
12
2-Notions de base
Remarque:
Chaque ligne se termine par un point-virgule.
13
2-Notions de base
2.3. Structure d'un programme C
Commentaire
14
2-Notions de base
2.3. Structure d'un programme C
Commentaire
/***********************************/
/* ce programme vous affiche Bonjour */
/***********************************/
/*fichier d’entête pour utiliser la fonction printf*/
#include <stdio.h>
int main() /* la fonction principale main */
{
printf(‘‘Bonjour’’); // afficher Bonjour
Return 0;
}
15
3. Types de base, Opérateurs et expression
16
3. Types de base, opérateurs et expression
3.1. Constantes
17
3. Types de base, opérateurs et expression
3.1. Constantes
Définition d'une constante
Syntaxe:
#define <identificateur> <valeur>
Exemple
18
3. Types de base, opérateurs et expression
3.2. Variables
19
3. Types de base, opérateurs et expression
3.2. Variables
Syntaxe:
<type> <identificateur 1>,..,<identificateur n> ;
Exemple
20
3. Types de base, opérateurs et expression
3.2. Variables
Le type
Détermine la taille de la variable et les opérations pouvant être effectuées
L'identificateur
C'est le nom affecté à la variable, le nombre de caractères peut être limité,
cela dépend du compilateur utilisé.
L’identificateur d’une variable doit toujours être écrit de la même façon :
Mon_Identificateur ≠ mon_identificateur ≠ MON_IDENTIFICATEUR.
Les seuls caractères autorisés pour les noms (identificateur) de variables
sont :
lettres NON accentuées ;
chiffres (sauf au début du nom) ;
caractères souligné « _ ».
21
3. Types de base, opérateurs et expression
3.2. Variables
En TURBO C
22
3. Types de base, opérateurs et expression
3.2. Variables
23
3. Types de base, opérateurs et expression
3.2. Variables
Exemple
float rayon; /*Déclaration de réel*/
int i,j; /*Déclaration d’entier*/
char t; /*Déclaration de caractère*/
Double pi; /*Déclaration de réel double*/
Void main()
{
i=2;
j=3;
t=‘A’;
pi=3.14159;
}
24
3. Types de base, opérateurs et expression
3.2. Variables
Initialisation des variables
25
3. Types de base, opérateurs et expression
3.3. Opérateurs standards
Les opérateurs régissent toutes les opérations ou transformations sur les valeurs de
variables.
L'opérateur d'affectation
C'est l'opérateur le plus utilisé. Il permet de modifier la valeur d'une variable.
L’affectation est toujours effectuée de la droite vers la gauche
Le programme commence par évaluer la valeur de l'expression puis l'affecte avec le
signe = à la variable par son identificateur.
Syntaxe:
<identificateur> = <expression> ;
Exemple
int main ( )
{
int V ;
V = 5;
return 0 ;
} 26
3. Types de base, opérateurs et expression
3.3. Opérateurs standards
Les opérateurs arithmétiques.
27
3. Types de base, opérateurs et expression
3.3. Opérateurs standards
Les opérateurs relationnels
Sont utilisés pour les structures conditionnelles, de choix et itératives,.
Ils permettent de comparer une variable par rapport à une autre variable ou une
valeur ou une expression.
Le résultat ne peut être que VRAI ou FAUX, on parle de valeur booléenne.
•FAUX correspond à 0.
•VRAI correspond à toute valeur différente de 0.
28
3. Types de base, opérateurs et expression
3.3. Opérateurs standards
Les opérateurs logiques.
29
3. Types de base, opérateurs et expression
3.3. Opérateurs standards
L'opérateur de conversion de type.
30
3. Types de base, opérateurs et expression
3.3. Opérateurs standards
La priorité des opérateurs.
31
4. Lire & Ecrire des données
32
4. Lire & Ecrire des données
4.1. Ecriture formatée de données : printf()
La fonction d’affichage printf() permet d'afficher des messages et/ou des valeurs de
variables sous différents formats.
Syntaxe:
printf (<"Format">,identificateur1, ....,identificateur n);
Le format
indique comment vont être affiché les valeurs des variables. Il est composé de texte et
de codes d'affichage suivant le type de variable.
Exemple
Code d’affichage identificateur
format
33
4. Lire & Ecrire des données
4.1. Ecriture formatée de données : printf()
Codes d'affichage:
Important
Au début d'un programme utilisant les fonctions d'affichage et de saisie il est nécessaire d'écrire
#include <stdio.h>, car toutes les fonctions sont déclarées dans ce fichier d'en-tête.
34
4. Lire & Ecrire des données
4.1. Ecriture formatée de données : printf()
Exemple:
#include <stdio.h>
void main( )
{
int a,b,c;
a=1;
b=2;
c=3;
printf (" La valeur de a est %d , celle de b est %d , et celle de c est %d" , a , b , c );
}
Le programme affiche:
35
4. Lire & Ecrire des données
4.1. Ecriture formatée de données : printf()
On peut aussi mettre des codes de contrôles:
Exemple
#include <stdio.h>
void main()
{
printf("Salut je suis:\n\t étudiant à la faculté des sciences de Tétouan \n\t\t A bientôt");
}
36
4. Lire & Ecrire des données
4.1. Ecriture formatée de données : printf()
Le programme affiche :
Salut je suis
étudiant à la faculté des sciences de Tétouan
A bientôt
37
4. Lire & Ecrire des données
4.2. Lecture formatée de données : scanf()
Comme printf elle est composée d'un format et des identificateurs de variables à
saisir.
Syntaxe:
scanf(<"Format">,&identificateur1, ...., &identificateurn);
38
4. Lire & Ecrire des données
4.2. Lecture formatée de données : scanf()
Remarque
Le symbole & est obligatoire devant les identificateurs car scanf attend des
adresses et non des valeurs, sauf devant un identificateur de chaîne de caractères.
Les codes d'affichage pour printf deviennent les codes d'entrée pour scanf.
39
4. Lire & Ecrire des données
4.2. Lecture formatée de données : scanf()
Exemple:
Saisie de plusieurs variables.
#include <stdio.h>
Float a, b,c, det; /*déclaration des variables réelles*/
void main( )
{
printf ("Donne les valeurs de a,b et c ?"); /* Affichage de "Donne les valeurs de
a,b et c ?" */
scanf("%f %f %f",&a,&b,&c); /* Saisie de a,b,c */
det=(b*b)-(4*a*c); /* Calcul du déterminant */
printf("\n\n"); /* Deux sauts de ligne */
printf("Le déterminant = %f",det); /* Affichage du déterminant */
}
40
4. Lire & Ecrire des données
4.3. Ecriture d’un caractère : putchar()
Syntaxe:
putchar(identificateur1);
41
4. Lire & Ecrire des données
4.3. Ecriture d’un caractère : putchar()
#include <stdio.h>
char car1,car2,car3;
void main( )
{
car1=‘S';
car2= ‘M';
car3= ‘A';
putchar(car1); /* Affichage du caractère 1 -> donne un S */
putchar(car2); /* Affichage du caractère 2 -> donne un M */
putchar(‘I'); /* Affichage du caractère P */
putchar('\n'); /* Retour de ligne */
putchar(car1); /* Affichage du caractère 1 -> donne un S */
putchar(car2); /* Affichage du caractère 2 -> donne un M */
putchar(‘car3'); /* Affichage du caractère P */
}
Syntaxe:
identificateur1 = getchar( void );
#include <stdio.h>
char car1;
void main( )
{
43
5. Traitements conditionnels
44
5. Traitements conditionnels
Exemple
ou
45
5. Traitements conditionnels
46
5. Traitements conditionnels
Exemple
ou
47
5. Traitements conditionnels
48
5. Traitements conditionnels
5.3 La structure de choix
Exemple
49
5. Traitements conditionnels
5.3 La structure de choix
ou
50
5. Traitements conditionnels
N'oubliez surtout pas les break ! Si par exemple, nous voulons afficher le nom d'un mois
en fonction de son numéro, on ecrit:
#include<stdio.h>
int numeroMois ;
void main()
{ prinf ("entrez le numero de mois");
scanf("%d",&numeroMois) ;
switch ( numeroMois )
{
case 1 : printf ( "janvier ") ; break ;
case 2 : printf ("fevrier") ; break ;
case 3 : printf ("mars") ; break ;
case 4 : printf ("avril") ; break ;
case 5 : printf ("mai") ; break ;
case 6 : printf (" juin ") ; break ;
case 7 : printf ("juillet") ; break ;
case 8 : printf ("aout") ; break ;
case 9 : printf ("septembre") ; break ;
case 10 : printf ("octobre") ; break ;
case 11 : printf ("novembre") ; break ;
case 12 : printf ("decembre") ; break ;
default : printf ("Je connais pas ce mois . . . ") ;
}
}
51
6. Les structures itératives ou boucles
6.1. Définitions et terminologie
Une structure itérative ou boucle permet d'exécuter plusieurs fois de suite une même
séquence d'instructions. Cette ensemble d'instructions s'appelle le corps de la boucle.
Chaque exécution du corps d'une boucle s'appelle une itération.
Lorsque l'on s'appête à exécuter la première itération, on dit que l'on rentre dans la
boucle, lorsque la dernière itération est terminée, on dit qu'on sort de la boucle. Il existe
trois types de boucle :
While
do ... while
for
52
6. Les structures itératives ou boucles
6.2. La structure <tant que> while
Dans cette structure la condition est testée au début .
53
6. Les structures itératives ou boucles
Exemple
#include<stdio.h>
int i ;
void main()
{
/* boucle while<tant que faire> */
i=0;
while ( i<10 )
{
printf ("i = %d\n ",i) ;
i++ ;
}
}
54
6. Les structures itératives ou boucles
6.3. La structure <FAIRE ... TANT QUE > do ... while.
Dans cette structure la condition est testée à la fin.
55
6. Les structures itératives ou boucles
Exemple
#include <stdio.h>
int i;
void main()
{
i=0;
/* Boucle while <faire tant que> */
do
{
printf("i= %d\n",i);
i++;
}
while(i<10);
}
56
6. Les structures itératives ou boucles
6.4. La structure <POUR ... FAIRE ... JUSQU’A ...> for
Dans cette structure la condition est testée au début. Elle est très intéressante car elle
est composée de trois parties:
L'instruction ou plusieurs instructions d'Initialisation qui sont exécutées une seule fois
au début de la structure.
57
6. Les structures itératives ou boucles
6.4. La structure <POUR ... FAIRE ... JUSQU’A ...> for
58
6. Les structures itératives ou boucles
6.4. La structure <POUR ... FAIRE ... JUSQU’A ...> for
Exemple
#include <stdio.h>
int i;
void main()
{
for(i=0;i<10;i++)
printf("i= %d\n",i);
}
59
Chapitre 7: Les tableaux
60
7. Les tableaux
7.1. Introduction
Les variables, telles que nous les avons vues, ne permettent de stocker qu’une seule
données à la fois.
Tableau
61
7. Les tableaux
7.2. Définition
On appelle tableau une variable composée de données de même type, stockée de
manière contigue en mémoire (les uns à la suite des autres).
Un tableau est une suite des élemente de même taille. Par conséquent, la taille (en octet)
du tableau est:
taille (en octet) du type de donnée*le nombre d’élément
tableau
Exemples:
Char caractere[12]; //Taille en octet: 1 octet*12=12 octets
int entier[10]; //Taille en octet: 2 octets*10=20 octets
<Type> Tableau[Nombre_Elements]={C1,C2,…,Cn};
ou C1,C2,…,Cn sont des constantes dont le nombre ne doit pas dépasser le
Nombre_Elements.
Si la liste de constantes ne contient pas assez de valeurs pour tous les éléments, les
éléments restantes sont initialisées à zero
Exemples:
Char voyelles[6] = {‘a’, ‘e’,’i’, ‘o’, ‘u’, ‘y’};
Int Tableau_entier1[10]= {10,5,9,-2};
Ou encore
65
7. Les tableaux
Tableaux à une dimension (Vecteurs)
Accès aux composantes d’un tableau
Exemples:
Short A[5] = {12,23,34,45,56’}; //A[0]=12;A[1]=23;A[2]=34; //A[3]=45; A[4]=56;
Chaque élément ( TAB[i]) d’un tableau (int TAB[20]) est manipulé comme une simple
variable, on peut:
67
7. Les tableaux
Tableaux à une dimension (Vecteurs)
Remarques
Pour initialiser un (TAB1) par les éléments d’un autre tableau (TAB2):
68
7. Les tableaux
Tableaux à une dimension (Vecteurs)
69
7. Les tableaux
Tableaux à une dimension (Vecteurs)
t Exemples
1. Saisir et afficher des données d’un tableau d’entiers de 20 éléments aux maximum.
2. Rechercher une valeur dans un tableau: Etant donné un tableau et une valeur. rechercer
cette valeur dans le tableau. S’il existe, afficher sa position sinon afficher un message
d’erreur.
70
7. Les tableaux
Tableaux à une dimension (Vecteurs)
t Déclaration et représentation mémoire d’un tableau
En C, la déclaration d’un tableau T induit une réservation automatique d’une zone mémoire
contigue( les cases mémoires sont successives)
Représentation mémoire:
71
7. Les tableaux
Tableaux à plusieurs dimensions
Déclaration
De manière similaire, on peut déclarer un tableau à plusieurs dimensions;
<Type Simple> Nom_du_Tableau [Nbre_El_1]…[Nbre_E_N];
Chaque élément entre crochets désigne le nombre d’éléments dans chaque dimension;
72
7. Les tableaux
int T[3][4];
73
7. Les tableaux
Tableaux à deux dimensions (matrices)
Initialisation à la déclaration et accès aux éléments:
Les valeurs sont affectées ligne par ligne lors de l’initialisation à la déclaration
Accés aux composantes se fait par: Nom_tableau[ligne][colonne].
Exemples
float A[3][2] = { {-1.05 , 61.10} , {86e-5 , 87} , {-12.5} };
-1.05 61.10 -1 10 13 16
A 86e-5 87 +8 -77 0 0
B
-12.5 0 0 0 0 0
11 -14 30 0
74
7. Les tableaux
Tableaux à deux dimensions (matrices)
75
7. Les tableaux
Exemple: Soit T un tableau défini par: char T[3][4]
Répartition des éléments
de T en mémoire
T[0][0]
T[0][1]
T[0][2]
T[0][3]
T[1][0]
T[1][1]
T[1][2]
T[1][3]
T[2][0]
T[2][1]
T[2][2]
T[2][3] 76
7. Les tableaux
Tableaux à deux dimensions (Vecteurs)
Exemples
1. Ecrire un programme qui lit les dimensions M et N d'un tableau T à deux dimensions du
type int (dimensions maximales: 50 lignes et 50 colonnes). Remplir le tableau par des
valeurs entrées au clavier et afficher le tableau ainsi que la somme de tous ses éléments
77
Chapitre 8 : CHAINES DE CARACTERES
78
8. CHAINES DE CARACTERES
79
8. CHAINES DE CARACTERES
Mémorisation
Le nom d'une chaîne est le représentant de l'adresse du
premier caractère de la chaîne. Pour mémoriser une
variable qui doit être capable de contenir un texte de N
caractères, nous avons besoin de N+1 octets en mémoire
TXT
80
8. CHAINES DE CARACTERES
Exemple
char LIEU[25];
int JOUR, MOIS, ANNEE;
printf("Entrez lieu et date de naissance : \n");
scanf("%s %d %d %d", LIEU, &JOUR, &MOIS, &ANNEE);
81
8. CHAINES DE CARACTERES
Exemple
char LIEU[25];
printf("Entrez lieu de naissance : \n");
gets(LIEU);
82
8. CHAINES DE CARACTERES
Exemple
char LIEU[25];
int JOUR, MOIS, ANNEE;
printf("Entrez lieu et date de naissance : \n");
scanf("%s %d %d %d", LIEU, &JOUR, &MOIS, &ANNEE);
printf ("%s %d %d %d", LIEU, JOUR, MOIS, ANNEE);
83
8. CHAINES DE CARACTERES
Exemple
char TEXTE[] = "Voici une première ligne.";
puts(TEXTE);
puts("Voici une deuxième ligne.");
84
8. CHAINES DE CARACTERES
Exemple
"ABC" < "BCA" car 'A'<'B'
"ABC" < "B" car 'A'<'B'
"Abc" < "abc" car 'A'<'a'
"ab" < "abcdZ" car " " < "cd
85
8. CHAINES DE CARACTERES
strcmp retourne:
1. un nombre positif si chaine 2 précède chaine 1 dans
l’ordre alphabétique
2. Un nombre négatif si chaine 1 précède chaine 2 dans
l’ordre alphabétique
3. Zéro si chaine 1 est identique à chaine 2
86
8. CHAINES DE CARACTERES
87
8. CHAINES DE CARACTERES
Exercice 1
Exercice 2
88
8. CHAINES DE CARACTERES
Exercice 3
89
Chapitre 9 : POINTEURS
90
9. Les pointeurs
Exemple:
int i =35;
int * p = &i;
92
9. Les pointeurs
93
9. Les pointeurs
int a;
int *pa,*pi;
pa = &a; //pa prend comme valeur l’adresse de a, donc pa pointe sur a
pi = pa; //pi et pa pointe sur la même adresse ( &a)
94
9. Les pointeurs
Exemple1
int i =8;
int *pi;
pi = &i;
printf(" le contenu du pointeur est %d: \n",*p);
*pi = 19;
printf(" le nouveau contenu du pointeur est %d: \n",*p);
95
9. Les pointeurs
Exemple1
int i = 35, j;
int *p, *q;
p = &i; //*p = 35
j = *p; //j = 35
*p = 10; // *p=i=10
i= 20; // i=*p=20
(*p)++; /* est équivalent à i++, donc i=*p= 21 */
q = p; // p et q pointent maintenant ensemble vers la même adresse
i=50 ; // i=*p=*q= 50
96
9. Les pointeurs
Tableaux et pointeurs
97
9. Les pointeurs
Tableaux et pointeurs
Exemple:
int Tab[5] = {20, 2,-10, 3, 6};
*Tab Tab[0] = 20
*(Tab + 4) Tab[4]= 6
Tab +1 &Tab[1]
98
9. Les pointeurs
Tableaux et pointeurs
Exemple:
99
9. Les pointeurs
Tableaux et pointeurs
Remarque:
Le nom d’un tableau est une pointeur constant sur son premier élément donc
l’expression Tab ++ (ou bien Tab = Tab +1) n’est pas autorisé
int tab[10];
int *P;
l'instruction: P = tab; est équivalente à P = &tab[0];
P+i : pointe sur la ième composante du tableau elle est équivalente à &tab[i],
avec i varie de 0 à9 dans l’exemple.
*(P + i) : est le contenu du ième élément du tableau tab c'est-à-dire tab[i].
100
9. Les pointeurs
Tableaux et pointeurs
Exemple2:
101
9. Les pointeurs
Tableaux et pointeurs
Exemple2:
102
9. Les pointeurs
Pointeurs et chaînes de caractères
‘p’ prend comme valeur l’adresse du début de la chaîne "Hello world" non pas la
chaîne.
103
9. Les pointeurs
Pointeurs et chaînes de caractères
104
9. Les pointeurs
Pointeurs et chaînes de caractères
105
9. Les pointeurs
Tableau de pointeurs
Exemple:
double *A[4]; /* un tableau de 4 pointeurs sur des réels du type double dont les
adresses et les valeurs ne sont pas encore définies*/
106
9. Les pointeurs
Tableau de pointeurs
107
9. Les pointeurs
Tableau de pointeurs
Exemple
109
9. Les pointeurs
Allocation dynamique de la mémoire
111
9. Les pointeurs
Réallocation dynamique de la mémoire
112
9. Les pointeurs
Réallocation dynamique de la mémoire
Exemple:
int N, *Tab;
printf("donner N: \n");
scanf("%d",&N);
Tab = (int *) malloc(N*sizeof(int));
if(Tab !=Null) // faire des traitements
Tab = (int *) realloc(Tab, 20*sizeof(int));
if(tab != NULL) // Utilisation de l'espace mémoire ré-alloué
else // Echec de la ré-allocation mémoire
113
9. Les pointeurs
Libération de la mémoire allouée
Pour libérer un espace mémoire déjà alloué par la fonction malloc, on utilise la
fonction free dont le prototype est le suivant :
void free(void *pointeur);
elle prend en paramètre un pointeur sur l'espace mémoire à libérer
114
9. Les pointeurs
Libération de la mémoire allouée
Exemple:
main( )
{
int nombre_elements;
scanf(“%d”,&nombre_elements);
int *tab = (int *)malloc(nombre_elements*sizeof(int));
if(tab != NULL) {
int i;
for(i=0 ; i<nombre_elements ; i ++)
scanf(“%d”, (tab+i));
for(i=0; i<nombre_elements ; i++)
printf("%d\n", *(tab+i));
free(tab);
}
else printf("Echec de l'allocation mémoire\n");
}
115
9. Les pointeurs
Intérêts des pointeurs
116
9. Les pointeurs
Intérêts des pointeurs
117
8. Les fonctions et procédures
La programmation modulaire
Un programme écrit d'un seul tenant est difficile à comprendre dès qu'il dépasse une ou
deux pages.
118
8. Les fonctions et procédures
Définition
Une fonction ou procédure ou encore sous programme est une suite d'instructions
élémentaires, mais vue du programme principal main().
Une fonction peut appeler une autre fonction. Le nom donné à une fonction doit être
représentatif de la fonction réalisée (exemple : perimetre_cercle pour une procédure
calculant le périmètre d'un cercle).
119
8. Les fonctions et procédures
Définition
Le programme principal main() et les fonctions ont besoin de se communiquer des valeurs.
Lors d'un appel d'une procédure les valeurs passées sont les paramètres d'entrée et à la fin
d'une fonction les paramètres renvoyés sont les paramètres de sortie.
120
8. Les fonctions et procédures
Les procédures
Une procédure est un ensemble d'instructions portant un nom. Pour définir une procédure,
on utilise la syntaxe:
Void nomprocedure ()
{
/*
Instructions
*/
}
Une procédure est une nouvelle instruction, il suffit pour l'exécuter d'utiliser son nom. Par
exemple, pour exécuter une procédure appelée pr, il suffit d‘écrire pr().
121
8. Les fonctions et procédures
Les procédures
Exemples
Le premier programme est écrit sans procédure:
# include <stdio.h>
int main()
{
printf("Bonjour\n");
return 0;
}
122
8. Les fonctions et procédures
Les procédures
Exemples
Et dans le deuxième, le printf est placé dans la procédure afficheBonjour et cette procédure
est appelée depuis le main.
# include <stdio.h>
Void afficheBonjour ()
{
printf("Bonjour\n");
}
int main()
{
afficheBonjour ();
return 0;
}
123
8. Les fonctions et procédures
Les procédures
Variables locales
Une procédure est un bloc d'instructions et est sujette aux mêmes règles que main. Il
estdonc possible de déclarer des variables :
void nomprocedure ( )
{
/*
déclaration de variables
*/
/*
instructions
*/
}
124
8. Les fonctions et procédures
Les procédures
Variables locales
Attention, ces variables ne sont accessibles que dans le corps de la procédure, cela
signifie qu'elle naissent au moment de leur déclaration et qu'elles sont détruites une fois
la dernière instruction de la procédure exécutée. C'est pour cela qu'on les appelle des
variables locales.
125
8. Les fonctions et procédures
Les procédures
Variables locales
Exemple, ce code est illégal :
# include <stdio.h>
void maprocedure ( )
{
Char a=b;
}
int main()
{
Char b = ‘k’;
printf("%c, %c\n",a,b);
return 0;
}
126
8. Les fonctions et procédures
Les procédures
Variables locales
La variable b est déclarée dans la procédure main, et n'est donc visible que dans cette même
procédure. Son utilisation dans maProcedure est donc impossible. De même, la variable a est
déclarée dans maProcedure, elle n'est pas visible dans le main.
# include <stdio.h>
void unAdix ( )
{
int i;
for (i=0;i<=10;i++)
printf(" %d \n ",i);
}
int main()
{
unAdix();
return 0;
} 127