Cours Informatique 2
Cours Informatique 2
Emergentes
Informatique 2
- Electronique Embarquée et Systèmes Intelligents
1
Plan du cours
1. Introduction
2. Les tableaux
3. Les fonctions
4. Les pointeurs
5. Les chaînes de caractères
6. Les structures
2
Chapitre 1
Introduction
3
Langages informatiques
4
Langages haut niveau
5
Compilateurs C
6
Rappel : Composantes d’un programme C
7
Rappel : Les variables
⚫ Les variables servent à stocker les valeurs des données
utilisées pendant l’exécution d’un programme
• un nom (Identificateur)
• un type (entier, réel, …)
int i, j,k;
float x, y ;
double z=1.5; // déclaration et initialisation
char c=`A`;
8
Rappel : printf () et Scanf ()
⚫ La fonction printf est utilisée pour afficher à l’écran du texte, des valeurs
de variables ou des résultats d’expressions.
9
Spécificateurs de format
%c char caractère
10
Rappel : L’instruction if…else
⚫ Syntaxe : If (expression)
bloc-instruction1
else
bloc-instruction2
11
Rappel : while et do .. while
while (condition) do
{ {
instructions instructions
} } while (condition);
12
Rappel : La boucle for
13
Chapitre 2
Les tableaux
14
Tableaux
⚫ Un tableau est une variable structurée composée d’un nombre de variables
simples de même type désignées par un seul identificateur
15
Déclaration des tableaux
⚫ La déclaration d'un tableau à une dimension s'effectue en précisant le type de
ses éléments et sa dimension (le nombre de ses éléments) :
type <nom_tableau> [dim]
Exemple: int T[10] ;
16
Accès aux composantes d’un tableau
⚫ On traite les tableaux élément par élément de façon répétitive en utilisant des
boucles
♦ La dimension d’un tableau:
La dimension d’un tableau (son nombre d’éléments) ne peut être qu’une constante
ou une expression constante.
Exemple : #define N 50
.....
int t[N] ;
17
Tableaux : saisie et affichage
⚫ Saisie des éléments d’un tableau T d’entiers de taille n :
for(i=0;i<n;i++)
{ printf ("Entrez l'élément %d \n ",i + 1);
scanf(" %d" , &T[i]);
}
for(i=0;i<n;i++)
printf (" %d \t",T[i]);
18
Tableaux : exemple
⚫ Calcul du nombre d'étudiants ayant une note supérieure à 10 :
main ( )
{ float notes[30];
int nbre,i;
for(i=0;i<30;i++)
{ printf ("Entrez notes[%d] \n ",i);
scanf(" %f" , ¬es[i]);
}
nbre=0;
for (i=0; i<30; i++)
if (notes[i]>10) nbre+=1;
printf (" le nombre de notes > à 10 est égal à : %d", nbre);
}
19
Tableaux à deux dimensions (Matrices)
On peut définir un tableau à 2 dimensions de la façon suivante:
En langage C
type <ident> [nlig] [ncol]
Exemple:
float note[10][3] ;
- matrice à 10 lignes et 3 colonnes
- le premier élément de la matrice est note[0][0] et le dernier est note[9][2]
20
Initialisation à la déclaration d’une Matrice
⚫ L’initialisation lors de la déclaration se fait en indiquant la liste des valeurs
respectives entre accolades ligne par ligne
2 1 4 3 5 7 2 4 9 … … … 8 6 1
21
Matrices : saisie et affichage
⚫ Saisie des éléments d’une matrice d’entiers A[n][m] :
for(i=0;i<n;i++){
for(j=0;j<m;j++)
{ printf ("Entrez la valeur de A[%d][%d] \n ",i,j);
scanf(" %d" , &A[i][j]);
}}
for(i=0;i<n;i++){
{ for(j=0;j<m;j++)
printf (" %d \t",A[i][j]);
printf("\n");
}}
22
Tableaux : exemple
Ecrire un programme qui construit et affiche une matrice carrée unitaire U de dimension
N. Une matrice unitaire est une matrice, telle que :
1 𝑠𝑖 𝑖 = 𝑗
Uij = ቊ
0 𝑠𝑖 𝑖 ≠ 𝑗
23
Représentation d’un tableau en mémoire
⚫ La déclaration d’un tableau provoque la réservation automatique par le
compilateur d’une zone contiguë de la mémoire.
⚫ La mémoire est une succession de cases mémoires. Chaque case est une suite
de 8 bits (1 octet), identifiée par un numéro appelé adresse.
(on peut voir la mémoire comme une armoire constituée de tiroirs numérotés. Un numéro de tiroir
correspond à une adresse)
⚫ Les adresses sont souvent exprimées en hexadécimal pour une écriture plus
compacte et proche de la représentation binaire de l’adresse. Le nombre de bits
d’adressage dépend des machines.
24
Représentation d’un tableau à une
dimension en mémoire
⚫ En C, le nom d'un tableau est le représentant de l'adresse du
premier élément du tableau (pour un tableau T: T=&T[0] )
1E05
T➔1E06 100
26
Chapitre 3
Les fonctions
27
Enoncé d’un problème
Analyse
Données résultats
Formulation de l’Algorithme
28
Fonctions
⚫ Certains problèmes conduisent à des programmes longs, difficiles à écrire et à
comprendre. On les découpe en des parties appelées sous-programmes ou modules
⚫ Les modules sont des groupes d'instructions qui fournissent une solution à des parties
bien définies d'un problème plus complexe. Ils ont plusieurs intérêts :
29
Fonctions
⚫ On définit une fonction en dehors de la fonction principale main ( ) par :
30
Fonctions : exemples
⚫ Une fonction qui calcule la somme de ⚫ Une fonction qui renvoie un
deux entiers x et y : entier saisi au clavier
Int Somme (int x, int y ) int RenvoieEntier( void )
{
{
int n;
return (x+y); printf (" Entrez n \n");
} scanf (" %d ", &n);
return n;
⚫ Une fonction qui affiche la somme de }
⚫ Une fonction qui affiche les
deux réels x et y : éléments d’un tableau d’entiers
void AfficheSom(double x, double y) void AfficheTab(int T[ ], int n)
{ { int i;
printf (" %lf", x+y ); for(i=0;i<n;i++) printf
} (" %d \t", T[i]);
}
31
Fonctions
Une fonction est donc définie par :
❑ Son Nom
❑ Ses Arguments Formels
❑ Le type de la fonction (type de l'argument
retourné par la fonction)
❑ Son corps
Si on ne précise pas de type a une fonction, par défaut le type du résultat retourné est un entier
2) Les fonctions qui retournent quelque chose possèdent un type. Pour cela, il faut
utiliser l'instruction return
33
Appel d’une fonction
⚫ L‘appel d'une fonction se fait par simple écriture de son nom avec la liste des
paramètres. L'appel de la fonction se fait dans la fonctin main().
⚫ nom_fonction (para1,…, paraN)
⚫ Lors de l'appel d'une fonction, les paramètres sont appelés paramètres effectifs :
ils contiennent les valeurs pour effectuer le traitement. Lors de la définition, les
paramètres sont appelés paramètres formels.
34
Appel d’une fonction
Donnez le résultat de l’exécution du programme ci-dessous.
#include <stdio.h>
main() {
int a=5;
carre(a);
}
35
Appel d’une fonction
Donnez le résultat de l’exécution du programme ci-dessous.
36
Déclaration des fonctions
⚫ Il est nécessaire pour le compilateur de connaître la définition d'une
fonction au moment où elle est appelée. Si une fonction est définie après
son premier appel (en particulier si elle définie après main ), elle doit être
déclarée auparavant.
La définition d'une fonction peut être effectué avant ou après celle de la fonction main.
❖ Définition Avant : la déclaration de la fonction est facultative.
❖ Définition Après : la déclaration de la fonction est obligatoire.
38
Déclaration des fonctions : Le Prototypage
Déclarer le prototype
#include <stdio.h>
void direBonjour();
main() {
direBonjour(); Appel de la fonction
}
printf("Bonjour !\n");
} Définir la fonction
39
Variables locales et globales
⚫ On peut manipuler 2 types de variables dans un programme C : des
variables locales et des variables globales. Elles se distinguent par ce
qu'on appelle leur portée (leur "espace de visibilité", leur "durée de vie")
➢ Variables globales
❖ Les variables globales sont des variables qui peuvent être partagées par plusieurs
fonctions (main entre autres).
❖ Une variable globale sera connue de toutes les fonctions qui seront compilées par la
suite au sein du même programme source.
40
Variables locales et globales
➢ Variables locales
❖ Les variables locales sont définies au sein d’une fonction (main entre autres).
❖ Ces variables sont dites locales à la fonction dans laquelle elles sont déclarées.
❖ Les variables locales ne sont connues qu’à l’intérieur de la fonction où elles sont
déclarées.
41
Exemple
42
Exemple
i=3 et k=1
i=4 et k=1
i=5 et k=5
43
Exemple
44
Chapitre 4
Les pointeurs
45
Pointeurs : définition
Une variable peut être représentée par une case de la mémoire, qui
contient la valeur d’une donnée et identifiée par une adresse...
int a=2;
a
……. …….
2
Mémoire centrale
46
Pointeurs : définition
⚫ Un pointeur est une variable spéciale qui peut contenir l’adresse d’une
autre variable. .
.
.
a 0xC2
• Le nom d’une variable permet d'accéder directement 2
à sa valeur (adressage direct).
47
Pointeurs : définition
Accès au contenu d'une variable
Pointeur
48
Déclaration d’un pointeur
⚫ En C, chaque pointeur est limité à un type de donnée (même si la valeur d’un
pointeur, qui est une adresse, est toujours un entier).
49
Opérateurs de manipulation des pointeurs
⚫ Lors du travail avec des pointeurs, nous utilisons :
• un opérateur 'adresse de': & pour obtenir l'adresse d'une variable
• un opérateur 'contenu de': * pour accéder au contenu d'une adresse
int a, *P;
P =&a;
« P pointe sur a »
a = 1;
*P = 2;
50
Opérateurs de manipulation des pointeurs
⚫ Exemple2 : float a, *p;
p=&a;
printf("Entrez une valeur : \n");
scanf("%f ",p); //supposons qu’on saisit la valeur 1.5
printf("Adresse de a= %x, contenu de a= %f\n" , p,*p);
*p+=0.5;
printf ("a= %f\n" , a); //affiche a=2.0
51
Initialisation d’un pointeur
⚫ A la déclaration d’un pointeur p, on ne sait pas sur quel zone mémoire il pointe.
Ceci peut générer des problèmes :
• int *p;
*p = 10; //provoque un problème mémoire car le pointeur p n’a pas été initialisé
52
Pointeurs : exercice
main()
{ int A = 1, B = 2, C = 3, *P1, *P2;
P1=&A;
P2=&C;
*P1=(*P2)++;
P1=P2;
P2=&B;
*P1-=*P2;
++*P2;
*P1*=*P2;
A=++*P2**P1;
P1=&A;
}
Donnez les valeurs de A, B,C,P1 et P2 après chaque instruction
53
main() {
int A = 1, B = 2, C = 3; int *P1, *P2; // Déclaration de deux pointeurs
54
Donnez les valeurs de A, B,C,P1 et P2 après chaque instruction
Initialisation 1 2 3 - - - -
P1 = &A; 1 2 3 1 - &A -
55
Exemple
⚫ Écrire un programme qui déclare un entier x, un pointeur p, puis :
⚫ Affecte à p l’adresse de x.
⚫ Change la valeur de x à travers le pointeur.
⚫ Affiche la nouvelle valeur de x.
56
Pointeurs et tableaux
⚫ En C, le nom d'un tableau est le représentant de l'adresse du premier élément du
tableau (pour un tableau T: T=&T[0] ) Avec le formalisme pointeur, on peut dire que T
est un pointeur constant sur le premier élément du tableau.
58
Pointeurs : saisie et affichage d’un
tableau
main() {
int T[100], *pt;
int i, n;
do { // Saisie de la taille du tableau
printf("Entrez n (0 < n ≤ 100) : ");
scanf("%d", &n);
} while(n <= 0 || n > 100);
main() main()
{ {
int T[5] = {-3, 4, 0, -7, 3}; int T[5] = {-3, 4, 0, -7, 3};
int A[5]; int A[5];
int I,J; int I,J;
for (J=0, I=0 ; I<5 ; I++) for (J=0,I=0 ; I<5 ; I++)
if (T[I]>0) if (*(T+I)>0)
{ {
A[J] = T[I]; *(A+J) = *(T+I);
J++; J++;
} }
} }
60
Pointeurs et tableaux à deux dimensions
⚫ Le nom d'un tableau A à deux dimensions est un pointeur constant sur le
premier élément du tableau càd A[0][0].
61
Pointeurs : saisie et affichage d’une
matrice
#define N 3
#define M 3
main( ) {
int i, j, A[N][M], *pt;
pt=&A[0][0];
for(i=0;i<N;i++)
for(j=0;j<M;j++)
{ printf ("Entrez A[%d][%d]\n ",i,j );
scanf(" %d" , pt+i*M+j); // &A[i][j]===pt+i*M+j
}
for(i=0;i<N;i++)
{ for(j=0;j<M;j++)
printf (" %d \t",*(pt+i*M+j)); //*(pt+i*M+j))====A[i][j]
printf ("\n");
}
}
62
Pointeurs et tableaux : remarques
En C, on peut définir :
⚫ Un tableau de pointeurs :
Ex : int *T[10]; //déclaration d’un tableau de 10 pointeurs d’entiers
⚫ Un pointeur de tableaux :
Ex : int (*pt)[20]; //déclaration d’un pointeur sur des tableaux de 20
éléments
⚫ Un pointeur de pointeurs :
Ex : int **pt; //déclaration d’un pointeur pt qui pointe sur des pointeurs
d’entiers
63
Allocation dynamique de mémoire
La déclaration d’un tableau définit un tableau "statique": il possède un
nombre figé d’emplacements.
64
La fonction malloc
⚫ La fonction malloc de la bibliothèque <stdlib> permet de localiser et de
réserver de la mémoire, sa syntaxe est : malloc(N)
⚫ Cette fonction retourne un pointeur de type char * pointant vers le
premier octet d’une zone mémoire libre de N octets ou le pointeur
NULL s’il n’y a pas assez de mémoire libre à allouer.
65
La fonction malloc
Utilisation des fonctions de la bibliothèque <stdlib.h>
malloc ( N):
66
La fonction malloc et free
⚫ Si on veut réserver de la mémoire pour des données qui ne sont pas de type
char, il faut convertir le type de la sortie de la fonction malloc à l’aide d’un
cast.
⚫ Si on n'a plus besoin d'un bloc de mémoire réservé par malloc, alors on
peut le libérer à l'aide de la fonction free , dont la synatxe est :
free(pointeur);
67
malloc et free : exemple
68
Fonctions et pointeur: Paramètres d'une fonction
⚫ Les paramètres servent à échanger des informations entre la fonction
appelante et la fonction appelée. Ils peuvent recevoir des données et
stocker des résultats
69
Exemple
Par valeur Par Adresse
#include <stdio.h>
#include <stdio.h>
void changer(int x) {
void changer(int *x) {
x = 10; // modifie la copie
*x = 10; // modifie la valeur à
}
l'adresse envoyée
}
int main() {
int a = 5;
int main() {
changer(a);
int a = 5;
printf("a = %d\n", a); // a reste 5
changer(&a);
return 0;
printf("a = %d\n", a); // a devient 10
}
return 0;
}
70
Transmission des paramètres en C
⚫ La transmission des paramètres en C se fait toujours par valeur
⚫ Pour effectuer une transmission par adresse en C, on déclare le paramètre
formel de type pointeur et lors d'un appel de la fonction, on envoie
l'adresse et non la valeur du paramètre effectif
71
Exemple
Par valeur Par Adresse
#include <stdio.h>
#include <stdio.h>
void permuter(int a, int b) {
void permuter(int *a, int *b) {
int temp = a;
int temp = *a;
a = b;
*a = *b;
b = temp;
*b = temp;
printf("Dans la fonction : a = %d, b = %d\n", a, b);
}
}
int main() {
main() {
int x = 5, y = 10;
int x = 5, y = 10;
permuter(&x, &y);
permuter(x, y);
// Changé
// Pas changé
printf("Après permutation : x = %d, y = %d\n", x, y);
printf("Dans le main : x = %d, y = %d\n", x, y);
}
}
72
Exemple
73
Chapitre 5
74
Chaînes de caractères
⚫ Il n'existe pas de type spécial chaîne ou string en C. Une chaîne de
caractères est traitée comme un tableau de caractères
75
Déclaration
⚫ Syntaxe : char <NomVariable> [<Longueur>]; //tableau de caractères
76
Initialisation
⚫ On peut initialiser une chaîne de caractères à la définition :
77
Fonctions de la bibliothèque <stdio.h>
⚫ printf( ) : permet d’afficher une chaîne de caractères en utilisant le
spécificateur de format %s.
78
Fonctions de la bibliothèque <stdio.h>
⚫ scanf( ) : permet de saisir une chaîne de caractères en utilisant le
spécificateur de format %s.
79
Traitement des chaînes de caractères
⚫ Le langage C dispose d’un ensemble de bibliothèques qui contiennent des
fonctions spéciales pour le traitement de chaînes de caractères
• La bibliothèque <stdio.h>
• La bibliothèque <string.h>
• La bibliothèque <stdlib.h>
80
Fonctions de la bibliothèque <string.h>
⚫ strlen(ch): fournit la longueur de la chaîne sans compter le '\0' final
Exemple : char s[ ]= " Test";
printf(“%d”,strlen(s)); //affiche 4
⚫ strcat(ch1, ch2) : ajoute ch2 à la fin de ch1. Le caractère ‘\0’ de ch1 est
écrasé par le 1er caractère de ch2
81
Fonctions de la bibliothèque <string.h>
⚫ strcmp(ch1, ch2): compare ch1 et ch2 lexicographiquement et
retourne une valeur : - nul si ch1 et ch2 sont identiques
- négative si ch1 précède ch2
- positive si ch1 suit ch2
82
Chapitre 6
Les structures
83
Introduction
84
Introduction
85
Déclaration
#include <stdio.h>
struct nom_structure
{ Déclaration de base du
modèle formel de la
type1 nom_champs1; structure avec le mot clé
type2 nom_champs2; struct et non la variable.
type3 nom_champs3, nom_champs4;
};
86
Déclaration: Déclaration avec une variable
Exemple de structure de données décrivant un livre par son titre, son auteur, son
éditeur, son nombre de pages, son année d’édition et son prix.
Forme 1:
Définition de la structure par l'identificateur de la variable
struct LIVRE Déclaration du type de la structure du Nom
{ LIVRE
char titre[80];
char auteur[40]; Déclaration d’une variable de type structure
char editeur[40]; de nom LIVRE
int nombre_pages;
int annee_edition; La variable livre1: comporte plusieurs membres
double prix; (sous variables)
87
Déclaration: Déclaration simple (sans
variable)
Forme 2:
Déclaration de la structure en lui donnant un nom, puis on déclare les variables
88
Déclaration: Déclaration simple (sans
variable)
Exemple de structure permettant de représenter des points à l’aide de leur
nom et de leurs coordonnées x et y.
struct Tpt
{
char nom;
int x;
int y;
};
struct Tpt M;
struct Tpt N;
89
Déclaration: typedef
LIVRE livre1;
Cela permet d'éviter d'écrire le mot struct à chaque utilisation
90
Utilisation d'une structure
91
Utilisation d'une structure
typedef struct {
char titre[30];
char auteur[30];
int pages;
} LIVRE;
main() {
92
Utilisation d'une structure
#include <stdio.h>
#include <string.h>
typedef struct {
char titre[30];
char auteur[30];
int pages;
} LIVRE;
int main() {
LIVRE livre1;
strcpy([Link], "Mohamed");
strcpy([Link], "Morocco"); [Link] = 50;
93
Tableaux de structures
Étant donné que le mot clé struct définit un type, il est tout à fait possible de créer
des tableaux contenant des structures du même type.
94
Tableaux de structures
95
Tableaux de structures
96
Tableaux de structures
Exemple: la structure LIVRE
97