Académique Documents
Professionnel Documents
Culture Documents
• Syntaxe
printf(’’format’’,expr1,expr2,...,exprn);
• En)ers
%d
:
en
décimal
%o
:
en
octale
%x
:
en
hexadécimal
• Réels
%f
:
±ddd.dddddd
6
chiffres
après
‘.’
%e
:
±d.dddddde±ddd
%x.yf
:
y
chiffres
après
‘.’
et
x
chiffres
en
tout
Fonc%on
scanf
• Saisit
les
données
à
par)r
du
clavier
et
les
stocke
aux
adresses
fournies
comme
arguments.
scanf(’’format’’,&v1,&v2,…,&vn) ;
• En)ers
:
%d
• Réels
:
%f
Entrées-‐sor%es
en
C++
• Un
programme
qui
u%lise
les
flux
standard
d'entrée-‐sor%e
doit
comporter
la
direc%ve
#include
<iostream.h>
ou
bien
•
si
vous
u%lisez
un
compilateur
récent
:
#include
<iostream>
using
namespace
std;
Entrées-‐sor%es
en
C++
• Les
flux
d'entrée-‐sor%e
sont
représentés
dans
les
programmes
par
les
deux
variables,
prédéclarées
et
préini%alisées,
suivantes
:
• Chaque
case
est
iden7fiée
par
une
adresse
unique
entre
0
et
N
K
bits
adresse
… 0
… 1
N
emplacements
… 2
.
.
.
.
.
… N-1
Variables
et
mémoire
• Lorsqu’on
déclare
une
variable,
une
associa;on
sera
définie
entre
le
nom
de
ce=e
variable
et
un
emplacement
mémoire
où
seront
stockée
ses
valeurs.
• Quand,
on
u;lise
dans
le
code
une
variable
deux
opéra;ons
seront
effectuées:
1.Recherche
de
l’adresse
qui
correspond
à
la
variable.
2.Placer
ou
retourner
la
valeur
contenue.
Valeur Adresse_k
Adresse_k
Adresse_p
No7on
de
pointeur:
exemple
• Le
pointeur
qui
se
trouve
à
l’adresse
1020
pointe
sur
l’espace
d’adresse
1001
100 1001
1002
• L’adresse
d’un
emplacement
est
donc
liée
au
type
de
la
valeur
qu’il
con;ent,
on
a
ainsi:
– Pointeurs
d’en;er
– Pointeurs
de
caractères
– Pointeurs
de
réels
– Etc.
Pointeurs
et
types
de
variables(2)
Une
variable
simple
occupe
un
ou
plusieurs
cases
mémoires
et
donc
plusieurs
adresses.
1004
1006
1010
1011
1012
1007
1008
1013
1003
1005
1009
1001
?
?
?
1002
1004
1006
1010
1011
1012
1007
1008
1013
1003
1005
1009
1001
1001
1009
1006
14652
‘S’
1465.2098981
1002
1004
1006
1010
1011
1012
1007
1008
1013
1003
1005
1009
1001
si
var
est
une
variable
d’un
certain
type
alors
&var est
son
adresse
type X ;
type* ptr_X ;
ptr_X= &X ; /* affectation de l’adresse
de X à ptr_X */
Ini7alisa7on
à
l’aide
de
l’opérateur
&
• Exemple
void main()
{
/* X contient la valeur 25 */ 1000
int X = 25; X
25
1001
int *ptr_X ; 1002
}
ptr_X
?
1020
Ini7alisa7on
à
l’aide
de
l’opérateur
&
• Exemple
void main()
{
/* X contient la valeur 25 */ 1000
int X = 25; X
25
1001
int *ptr_X ; 1002
ptr_X = &X ;
/* ici ptr_X contient l’adresse de X */ ptr_X
1001
1020
}
Ini7alisa7on
à
l’aide
de
new
• new
:Permet
de
réserver
un
espace
mémoire
de
certaine
taille
et
de
retourner
son
adresse.
• Syntaxe
nom_type *ptr_X ;
• Exemple
void main()
{ 1000
1002
1003
}
ptr_
?
1020
Ini7alisa7on
à
l’aide
de
new
• Exemple
void main()
{
int *ptr_X ; 1000
1001
/* allocation mémoire pour une
variable entière X */ 1002
1003
ptr_X = new int;
}
Indirec7on:
Accès
à
l’espace
pointé
• L’opérateur
d’indirec7on
*
permet
de
délivrer
la
valeur
contenue
dans
l’espace
pointé
par
un
pointeur.
• Si
ptr
est
un
pointeur
de
type
t
alors
*ptr
est
une
variable
de
type
t
qui
con7ent
la
valeur
contenue
dans
l’adresse
ptr
100
1003
*ptr_int
con;ent
la
valeur
100
1003
ptr_int
Indirec7on:
Accès
à
l’espace
pointé
• Syntaxe
nom_type *p;
delete
p;
Arithmé7que
des
pointeurs
Si
ptr
est
un
pointeur
de
type
t
alors
ptr+
i
est
un
un
pointeur
de
même
type
que
ptr
qui
pointe
sur
l’espace
d’adresse
ptr+i*sizeof(t)
• Exemple
:
int
x
,
y;
• Syntaxe
• Peut être
– L’un des types de bases: int, float, char, etc.
– Un pointeur sur l’un des types de bases
• Exemples
void Afficher(...)
int factoriel(...)
float puissance(...)
char* puissance(...)
Liste des paramètres
• Paramètres formels: données nécessaires et
résultats attendus.
–L’identificateur (nom)
–Le type
–La nature : fixe ou variable.
Paramètres fixes
• Un paramètre fixe est invariant par la fonction: la valeur en entrée est
la même qu’en sortie, même s’il est modifié à l’intérieur de la fonction.
• Syntaxe
• Exemple
• Syntaxe
• Exemple
• Variables locales
– Déclarées dans la fonction
– Ne sont pas visibles à l’extérieure
• return
– Renvoie la valeur d’une expression à la fonction appelante.
– Interrompt l’exécution de la fonction appelée.
Emplacements des fonctions
• Avant la fonction main
void fonc1(...)
{
...
}
...
void main()
{
...
}
Fonction
appelante Fonction appelée
Paramètres
effectifs
Suspension de
l’exécution Exécution de la
fonction
Valeur de retour
Reprise de
l’exécution
Retour vers
l’appelant
Appel de fonctions
• Syntaxe
– Appel comme une instruction simple, la valeur de retour(si elle existe) est
ignorée
nom_fonction (paramètres effectifs)
• L’ordre des paramètres effectifs doit être le même que celui des
paramètres formels.
Mémoire
centrale
int f(int x)
x = 20 {
Y=40 x= x+x ;
1. Copier x sur return x ;
la pile }
2. Exécuter la
fonction
x = 20
x= 40
Pile
Exemple 2 : passage par adresse
int x=20;
f2(&x) ;
void f2(int * x)
{
x = 20 *x= *x + *x ;
x = 40 1. Copier &x sur la }
pile
2. Exécuter la
fonction
– La durée de vie:
• Durée pendant laquelle la donnée est conservée en mémoire
• Dépend de la portée
• Exemple
int f(int a, int b)
{
int i,j; i, j existent dans (1), (2) et (3)
………… 1
{ k, l existent dans (2)
int k, l;
……… 2
}
………… 3
}
Variables locales
• Classe d’allocation: définit la portée et la durée de vie d’une variable
– static :
• La variable crée aura une durée de vie égale à celle du programme
#inlude <stdio.h>
void fonct()
{
static int x=0;
int y=0;
printf(“x = %d, y = %d\n”,x++, y++);
}
main()
{
int i ;
for (i=0;i <10; i++)
{
printf(’’ iteration = %d ’’, i)
fonct();
}
}
Variables globales
• Propriétés d’une variable globale:
– Définie à l’extérieur de tous blocs et de toutes fonctions, y compris de
la fonction main
#inlude <stdio.h>
int x=999;
const float PI= 3.14;
void fonct()
{
printf(“x = %d\n”,x);
}
main()
{
printf(“x = %d\n”,x);
fonct();
}
Arguments par défaut
• Une fonction peut recevoir à l’appel un nombre de paramètres
effectifs inférieur à celui des paramètres formels.
• Exemple :
void f(int ,float = 1.0, char = ‘x’);
• Exemple :
void f(int);
void f(float);
void f(int, int);
• En C++, :
void permuter(float& x, float& y)
{
x = x + y;
y = x - y;
x = x - y;
}
Fonction en ligne
• A l’appel d’une fonction en ligne, il n’y a pas lieu à une
rupture de séquence comme c’est le cas pour une fonction
ordinaire.
• Pour plus d’efficacité, le compilateur remplace cet appel par
son corps en mettant les arguments à la place des paramètres
formels.
• En C++, la syntaxe est:
inline void permuter(float& x, float& y)
{
x = x + y;
y = x - y;
x = x - y;
}
– Une
structure
permet
de
construire
un
type
pour
des
données
formées
de
composantes
pouvant
être
hétérogènes.
Ces
composantes
s’appellent
aussi
membres
ou
champs.
• Exemples
:
– type
date
:
jour,
mois,
année.
– type
étudiant
:
nom,
prénom,
CNE,
CIN.
• Syntaxe
nom_variable.nom_champ; /*Variable statique */
nom_variable->nom_champ; /*Variable dynamique */
• Exemple
struct complexe{
double re;
double im;};
complexe z1,*z2;
z2= &z1 ;
z1.im accède à la partie imaginaire de z1
Z2->im accède à la partie imaginaire de z2
Exemple
1
Ainsi,
avec
les
structures
on
peut
définir
un
nouveau
type
qui
regroupe
:
•
Les
différents
champs
de
la
structure,
int
main()
{
complexe
z;
z.ini@aliser(2.5);
//exécuter
la
fonc@on
ini@aliser
…
//
appliquée
à
la
variable
z
}
Structures
améliorées
Dans
ce
cas,
la
fonc@on
ini@aliser
sera
inline
:
Pour
Chaque
appel
le
compilateur
génère
(c-‐à-‐d
recopie)
les
différentes
instruc@ons
de
la
fonc@on.
Si,
on
cherche
un
véritable
appel
de
fonc@on,
on
se
contente
de
déclarer
uniquement
le
prototype
de
la
fonc@on
comme
membre
de
la
structure.
Exemple
3
#include
<iostream.h>
struct
complexe
int
main()
{
{
double
re;
double
im;
complexe
z;
void
ini@aliser(double
r);
void
afficher();
z.ini@aliser(2.5);
};
z.afficher();
void
complexe::ini@aliser(double
r){
re
=
r;
im=0.0;
return
0;
}
void
complexe::afficher(){
}
cout
<<
re
<<"
"<<
im;
}
Exemple
3
struct
complexe
{
…
//
ini@aliser
fonc@on
d’accès
void
ini@aliser(double
r);
//declarée
membre
de
la
structure
…
};
//void
la
fonc@on
ne
retourne
rien.
//complexe
elle
porte
sur
la
//
structure
nommée
complexe.
//::
opérateur
de
résolu@on
portée
void
complexe::ini@aliser(double
r){
re
=
r;
im=0.0;
//de
la
structure.
}
//ini@aliser(double
r)ceae
fonc@on
//a
un
double
comme
argument.
Classes
et
Objets
z
est,
alors,
composé
de
2
champs
(re
et
im)et
u@lisable
par
deux
fonc@ons
d’accès
(ini@aliser
et
afficher).
Ce
qui
revient
a
remplacé
le
mot
réservé
struct
par
le
mot
class
.
Exemple
4
class
complexe
{
double
re;
double
im;
classe
:
aspect
sta@que,
descrip@f
et
unique
void
ini@aliser(double
r);
void
afficher();
};
…
int
main()
{
complexe
z1,z2;
…
return
0;
objet:
aspect
dynamique,
existen@el
et
mul@ple
}
Exemple
4
#include
<iostream.h>
int
main()
class
complexe
{
{
complexe
z;
double
re;
double
im;
void
ini@aliser(double
r);
z.ini@aliser(2.5);
void
afficher();
z.afficher();
};
void
complexe::ini@aliser(double
r){
return
0;
re
=
r;
im=0.0;
}
}
void
complexe::afficher(){
/*ces
fonc@ons
ne
sont
cout
<<
re
<<"
"<<
im;
plus
accessible
dans
}
la
fonc@on
main*/
Classes
et
Objets
les
membres
de
la
classe
sont
privées
c-‐à-‐d
que
l’écriture
de
z.re=1.5;
ou
z.afficher();
n’est
pas
possible
en
dehors
de
la
classe.
Ces
membres
ne
sont
accessibles
que
depuis
les
méthodes
de
la
classes.
On
ne
peut
y
accéder
aux
membres
privés
d’une
classe
que
par
l’intermédiaire
d’une
de
ses
méthodes
publiques.
Exemple
5
#include
<iostream.h>
class
complexe
int
main()
{
{
double
re;
double
im;
complexe
z;
public:
void
ini@aliser(double
r);
z.ini@aliser(2.5);
void
afficher();
z.afficher();
};
void
complexe::ini@aliser(double
r){
return
0;
re
=
r;
im=0.0;
}
}
void
complexe::afficher(){
cout
<<
re
<<"
"<<
im;
}
Exemple
6
#include
<iostream.h>
class
complexe
int
main()
{double
re;
{
double
im;
complexe
z1,z2;
public:
z1.ini@aliser(1.5);
void
ini@aliser(double
r);
z2.ini@aliser(3.5);
void
afficher();
void
addi@onner(complexe&
z);
z1.afficher();
};
z1.addi@onner(z2);
void
complexe::ini@aliser(double
r)
z1.afficher();
{re
=
r;
im=0.0;}
void
complexe::afficher(){cout
<<
re
<<"
"<<im;}
return
0;
}
void
complexe::addi@onner(complexe&
z)
{re
+=
z.re;
im+=z.im;}
Envoi
de
message
‘‘envoyer
un
message’’
consiste
à
appliquer
la
méthode
associée
à
la
classe
de
l’objet
des@nataire.
class
complexe
{…
void
addi@onner(complexe&
z);
};
void
complexe::addi@onner(complexe&
z)
{re
+=
z.re;
im
+=
z.im;}
int
main()
{
complexe
z1,z2;
z1 : destinataire le receveur du message
z1.addi@onner(z2);
additionner : message
z2 : argument
…
Au lieu de : additionner(z1, z2);
return
0;
}
Accès
à
ses
propres
membres
Dans
une
méthode,
l’objet
à
travers
lequel
on
appelle
est
désigné
implicitement
:
void
complexe::addi@onner(complexe&
z){
re
+=
z.re;
im+=z.im;
}
int
main()
{
complexe
z1(2.5,
1.5);
complexe
z2
(3.5);
complexe
z3;
int
main()
{
complexe
z;
delete
z1,z2,z3;
return
0;
}
Exemple
11
int
main()
{
complexe
z[
];
z=new
complexe[4];
for(int
i=0;i<4;i++)
cout
<<
z[
i];
delete
[
]z;
return
0;
}
Relations entre classes
• La relation de composition:
• Etudier à travers l’exemple de la relation
entre la classe matrice et la classe
vecteur.
• La relation d’héritage:
• Etudier par le biais de la relation qui lie la
classe polynôme et la classe vecteur.
Université Ibn Tofaïl A.U. :2012/2013
Faculté des sciences SMA-Semestre 5
Kénitra Durée : 1 h 30 mn
Examen
Programmation en C++
1°) Définir une classe Complexe pour représenter des nombres complexes muni d’un
constructeur (un seul) pour initialiser un nombre complexe: Un nombre complexe peut
être initialisé à partir des valeurs de sa partie réelle et de sa partie imaginaire. Il peut
aussi être initialisé à partir d’un réel qui correspond donc à sa partie réelle, sa partie
imaginaire étant nulle. Enfin, en l’absence d’information, le nombre complexe est
initialisé à zéro.
2°) Ajouter à cette classe deux méthodes pour additionner deux nombres complexes :
la première appelée additionner consiste à ajouter un complexe à un complexe existant.
La seconde appelée somme consiste à créer et à retourner un nouveau complexe étant
la somme de deux complexes.
3°) Ajouter à la classe Complexe (définie à la question 1) deux méthodes une nommée
conj retournant le conjugué du nombre complexe et l’autre nommé mod retournant le
module du nombre complexe.
4°) Ajouter à la classe Complexe (définie à la question 1) une méthode appelée afficher
qui accède à re et im sans les modifier en affichant leurs valeurs sous la forme re + i m
(si re et im sont non nuls) ou re (si im est nul) ou bien 0 (si re=im=0).
1°) Définir une classe Complexe pour représenter des nombres complexes, munie d’un
constructeur (un seul) pour initialiser un nombre complexe: Un nombre complexe peut
être initialisé à partir des valeurs de sa partie réelle et de sa partie imaginaire. Il peut
aussi être initialisé à partir d’un réel qui correspond donc à sa partie réelle, sa partie
imaginaire étant nulle. Enfin, en l’absence d’information, le nombre complexe est
initialisé à zéro.
2°) Ajouter à cette classe deux méthodes pour additionner deux nombres complexes :
la première appelée additionner consiste à ajouter un complexe à un complexe existant.
La seconde appelée somme consiste à créer et à retourner un nouveau complexe étant
la somme de deux complexes.
3°) Ajouter à la classe Complexe (définie à la question 1) trois méthodes une nommée
conj retournant le conjugué du nombre complexe, la deuxième nommé mod retournant
le module du nombre complexe et la dernière nommée arg retournant son argument.
4°) Ajouter à la classe Complexe (définie à la question 1) deux méthodes une appelée
afficherCartesienne qui accède à re et im sans les modifier en affichant leurs valeurs
sous la forme re + i m (si re et im sont non nuls) ou re (si im est nul) ou bien 0 (si
re=im=0) et l’autre appelée afficherPolaire qui affiche le complexe sous sa forme
polaire ( ||z|| exp(i*α) où ||z|| son module et α son argument).
1/2
N.B : Quand c’est nécessaire vous pouvez utiliser les fonctions mathématiques
prédéfinies, dans la bibliothèque <math.h>, suivantes :
2/2
Université Ibn Tofaïl A.U. :2012/2013
Faculté des sciences SMP-Semestre 5
Kénitra Durée : 1 h 30 mn
Examen
Programmation
A°) Un point est définit par un couple de nombres réels x et y, qui détermine ses
coordonnées dans le plan. Considérons pour représenter ce point en ‘‘C++’’ la structure
suivante :
struct Point{
float x ; // le membre x représente l’abscisse du point
float y ; // le membre y représente l’ordonné du point
};
1°) Donner les corps des fonctions suivantes :
void placer(Point & p, float abs, float ord) qui change les valeurs de x et y du point p par
void afficher(Point p) qui affiche les valeurs de x et y du point p sous la forme (…,…)
2°) Réécrire les deux fonctions lorsqu’elles sont définies à l’intérieure de la structure :
struct Point {
float x; float y;
void placer(float abs, float ord){…}
void afficher(){…}
};
B°) Un segment est définit par deux points qui déterminent ses extrémités.
Considérons pour représenter ce segment la structure suivante :
struct Segment {
Point p1; //le membre p1 représente la première extrémité du segment
Point p2; //le membre p2 représente la deuxième extrémité du segment
};
Donner les corps des fonctions suivantes :
1°) void definir(Segment & s, Point ext1, Point ext2) qui initialise le segment s par
1/2
2°) float longueur(Segment s) qui calcule et retourne la distance qui sépare les
3°) void deplacer(Segment& s, float dx, float dy) qui permet de translater le
segment s ou 0 sinon.
6°) int seCouper(Segment s1, segment s2) qui retourne 1 si les deux segment s1
et s2 se coupent ou 0 sinon.
int aligner(Segment s1, segment s2) qui retourne 1 si les deux segment s1 et
N.B :
* Quand c’est nécessaire vous pouvez utiliser la fonction mathématique
prédéfinie, dans la bibliothèque <math.h>, suivante :
float sqrt(float t) ; // retourne la racine carré de t
** L’utilisation des classes à la place des structures est également permise, mais
dans ce cas les prototypes des fonctions précédentes, devenant des méthodes, doivent
être modifiés.
2/2
Université Ibn Tofaïl A.U. :2013/2014
Faculté des sciences SMA-Semestre 5
Kénitra Durée : 1 h 30 mn
Examen
Programmation en C++
2°) Soit B une matrice carrée n*n tridiagonale représentée par la figure suivante :
b 11 b 12
b 21 b 22 b 23
b 32 b 33 b 34
b n,n-1 b nn
Cette matrice peut être rangée dans un tableau linéaire T, comme l’indiquent les
flèches, soit : T[1]= b 11 , T[2]= b 12 , T[3]= b 21 , T[4]= b 22 , …
a°) Quelle est la taille optimale du tableau T.
b°) Etablir l’expression qui donne i en fonction de j et k telle que : T[i]=B[j][k] .
3°) Un vecteur peut être définit avec un entier représentant sa dimension et un tableau
dynamique de réels contenant ses éléments.
Définir une classe Vecteur pour représenter des vecteurs, muni d’un constructeur pour
initialiser sa dimension et pour allouer l’espace mémoire nécessaire au tableau.
Ajouter à cette classe une méthode pour additionner deux vecteurs : elle consiste à
créer et à retourner un nouveau vecteur étant la somme des deux (vecteurs).
4°) Une matrice peut être définit avec deux entiers représentant les nombres de lignes
et de colonnes et un tableau dynamique de vecteurs contenant ses éléments.
Définir une classe Matrice pour représenter des matrices, muni d’un constructeur
pour initialiser son nombre de lignes et celui de colonnes et allouer l’espace mémoire
nécessaire.
Ajouter à cette classe une méthode pour additionner deux matrices : elle consiste à
créer et à retourner une nouvelle matrice étant la somme des deux (matrices).
1/1
Université Ibn Tofaïl A.U. :2013/2014
Faculté des sciences SMA-Semestre 5
Kénitra Durée : 1 h 30 mn
Examen de rattrapage
Programmation en C++
1°) Un monôme est définit par un réel désignant son coefficient et un entier désignant sa puissance.
Écrire une classe représentant des monômes munie :
d’un constructeur (un seul) pour initialiser un monôme: Un monôme peut être initialisé à partir des
valeurs de son coefficient et de sa puissance. Il peut aussi être initialisé à partir d’un réel qui correspond
donc à son coefficient, sa puissance étant nulle. Enfin, en l’absence d’information, le monôme est
initialisé à zéro.
d’une méthode somme qui consiste à additionner un monôme à un monôme existant et qui renvoie un
message signalant l’impossibilité s’ils ne sont pas du même degré.
d’une méthode nommée coefficient qui retourne le coefficient du monôme et une deuxième nommée
puissance qui retourne sa puissance.
d’une méthode d’affichage.
2°) Un polynôme peut être définit par un entier désignant son degré et un tableau dynamique contenant
ses coefficients.
3
Exemple : P(X)= 1.5 + 3.5 X
3 L’attribut degré
L’objet polynôme P
1.5 0 0 3.5
L’attribut tableau des coefficients
Écrire une classe représentant des polynômes munie :
d’un constructeur.
d’une méthode ajouter qui reçoit un monôme en entrée et l’ajoute au polynôme existant.
d’une méthode somme qui reçoit un polynôme en entrée et l’additionne au polynôme existant.
d’une méthode d’affichage.
3°) Écrire un programme qui utilise la classe polynôme pour afficher la somme des deux polynômes
2 3
suivants : P(X)= 1 + 3 X et Q(X)= 0.5 + X+ 5 X
4°) Un polynôme peut être définit par un tableau dynamique d’objets monômes.
2 3
Exemple : P(X)= 0.5 + 1.5 X+ 2.5 X + 3.5 X
Écrire, alors, une classe représentant des polynômes munie d’un constructeur, d’une méthode somme qui
reçoit un monôme en entrée et l’additionne au polynôme existant et d’une méthode d’affichage.