Académique Documents
Professionnel Documents
Culture Documents
Contenu du cours
• Introduction
• Les variables
• Lecture/Ecriture
• Les structures de contrôle : conditionnelles & itératives
• Les tableaux
• Les références et les pointeurs
• Les fonctions et les procédures, La récursivité
• Les tris
• La programmation modulaire
Algorithmique & programmation C++ : LPRT : S1, 2
M. OULD BECHIR
1
29/01/2013
Déroulement du cours
• Volume horaire 26 séances(CM, TD et TP)
• Cours sous forme de présentation ppt distribuée en fin
de chaque séance
• TD/TP sous les stations de travail (DEV C++)
• Samedi (10h-12h) & Mardi (10h-12h)
• 2 CC (6ème semaine, 9ème semaine) sans les documents
• 1 Examen final, sans les documents
• NF=2/5 CC + 3/5 EF + PB
• Respect des horaires et attitude correcte
Introduction
I. Définitions Définition #1 : une suite d’instructions,
qui une fois exécutée correctement
conduit à un résultat
2
29/01/2013
Introduction
II. Objectifs
Objectif #1 : Obtenir de la machine
qu’elle fasse un travail à notre
place
Introduction
III. Exemples
Exemple#1 : Notice
d’utilisation d’un téléphone
portable
3
29/01/2013
Introduction
IV. Problématique
#1 : Modélisation : peut-on
modéliser le problème
Introduction
IV. Ce qu’il faut pour faire un bon algo
Condition#1 : Intuition
Expliciter et
Condition#2 : Méthodologie formaliser son
raisonnement
Condition#3 : Rigueur
4
29/01/2013
Introduction
V. Etapes de réalisation d’un algo
Etape#1 : Description des données
Introduction
VI. Un premier algo
Problème : calculer l’aire d’un rectangle
5
29/01/2013
6
29/01/2013
Programation Compilation
- 1958: Algol
- 1960 à 1970: CPL BCPL B
- 1970: C, le langage le plus utilisé
Bjarne Stroustrup
- 1983: C++
Algorithmique & programmation C++ : LPRT : S1, 14
M. OULD BECHIR
7
29/01/2013
.
BAS NIVEAU .
.
000111001
100110100
011100101
101001011 ASSEMBLEUR
Algorithmique & programmation C++ : LPRT : S1, 15
M. OULD BECHIR
- Répandu: documentation…
- Rapidité: jeux, militaires, finances…
- Portable: de machine à machine
- Bibliothèques
- Multi-paradigme: POO
8
29/01/2013
ETAPES:
1) Faire l'algo
2) Ecrire le code à l'aide d'un éditeur de texte (Bloc Notes, Notepad…) et l’enregistrer
au format .cpp dans un répertoire portant votre nom
3) Compiler le code à l'aide de Dev C++
4) Lancer la console et exécuter le .exe
#include <iostream>
using namespace std;
int main ()
{
cout<<"Hello world";
}
Algorithmique & programmation C++ : LPRT : S1, 17
M. OULD BECHIR
#include <iostream> /* inclure la bibliothèque iostream “Input Output Stream” qui contient les
fonctions cout et cin*/
using namespace std; // espaces de nom standard, par défaut
} // fin du programme
9
29/01/2013
Les variables
Notion de variable et de type
Notion#1 : un symbole, parfois indexé,
représentant une quantité inconnue
appartenant à un ensemble
Les variables
Les constantes
Une variable de valeur fixe, sa valeur ne sera pas modifiée par le programme:
Constante : pi3,14
On les place avant les variables
L’affectation
Définition: fonction permettant d’affecter à la variable de gauche la valeur de
la variable de droite
Exemple : pi3,14
NomMohamed
BénéficePrix_Vente-Prix_Achat
10
29/01/2013
Les variables
Structures de données élémentaires
Les variables
Les opérateurs
Arithmétique:
+ (addition)
- (soustraction)
X (multiplication)
/ (division)
%(modulo): reste de la division
Logiques:
ET (&&)
OU (||)
INVERSE ( !) LOGIQUE(complément)
Comparaison : >, <, >=, <=, == (test d’égalité), != (différent de)
Algorithmique & programmation C++ : LPRT : S1, 22
M. OULD BECHIR
11
29/01/2013
Les variables
La portée d’une variable
La portée d’un identificateur est la partie du programme dans laquelle
l’identificateur peut être utilisé sans provoquer de conflit (erreur de
compilation)
Variable locale : par rapport à une portion de programme
Variable globale : par rapport à tout le programme
Visibilité : incluse dans la portée (là où elle visible)
Exemple :
{
int i=3 ;
{
int i=5 ;
cout << i ; // affiche 5
}
cout << i ; // affiche 3
}
Les deux variables ont des portées différentes !
Algorithmique & programmation C++ : LPRT : S1, 23
M. OULD BECHIR
Lecture/Ecriture
Lecture : la machine va lire quelque chose en entrée
12
29/01/2013
Lecture/Ecriture
Exemple:
Lecture/Ecriture
Programme qui calcul l’aire d’un rectangle
#include <iostream>
using namespace std;
int main ()
{
float lo;
float la;
float sr;
cout<<"Longueur:?"<<endl;
cin>>lo;
cout<<"Largeur:?"<<endl;
cin>>la;
sr=lo*la;
cout<<"La surface est:"<<sr<<"\n";
}
Algorithmique & programmation C++ : LPRT : S1, 26
M. OULD BECHIR
13
29/01/2013
Lecture/Ecriture
Programme qui calcul l’aire d’un cercle
#include <iostream>
using namespace std;
int main ()
{
const float pi=3.14;
float r;
float sr;
cout<<“Rayon:?"<<endl;
cin>>r;
sr=pi*r*r;
cout<<"La surface est:"<<sr<<"\n";
}
Algorithmique & programmation C++ : LPRT : S1, 27
M. OULD BECHIR
Exemples:
Cas#1 : Si la moyenne est supérieure à 10, afficher Admis, sinon afficher redoublant
Variable : moyenne : réel
début
Afficher(‘Entrez la moyenne :’)
Lire(‘moyenne’)
Si moyenne>=10
Alors Afficher(‘Admis’)
Sinon Afficher(‘Redoublant’)
FSI
Fin 28
14
29/01/2013
Si moyenne>=10
Afficher(‘Passable’)
Fsi
Sinon Afficher(‘Insuffisant’)
Fsi
15
29/01/2013
16
29/01/2013
int main()
{
int choix;
float a,b,s,p,d;
cout<<"Faites votre choix:?"<<endl;
cout<<"1: Addition"<<endl;
cout<<"2: Multiplication"<<endl;
cout<<"3: Division"<<endl;
cout<<"4: Sortir"<<endl;
cin>>choix;
Algorithmique & programmation C++ : LPRT : S1,
M. OULD BECHIR
17
29/01/2013
18
29/01/2013
- Comme Tant que mais l’instruction est au moins réalisée une fois
- La condition est vérifiée après l’exécution, elle porte sur le résultat du traitement
-Typique pour les saisies avec vérification
19
29/01/2013
Répéter
Afficher(‘Entrez votre mot de passe :’)
Lire(‘mot de passe’)
Tant que mot de passe !=’mdp’
Afficher(‘Votre mot de passe est incorrect’)
20
29/01/2013
EXPLICITEMENT
While(i<=10 ){affiche(i);i=i+1;}
Algorithmique & programmation C++ : LPRT : S1,
M. OULD BECHIR
Nombre
d’itérations
connu
NON
Traitement
exécuté au OUI
moins une
fois
OUI NON
21
29/01/2013
Compléments:
-Continue : provoque (dans une instruction do, for, ou while) l’arrêt de l’itération courante
et le passage au début de l’itération suivante.
-Break : provoque l’arrêt de la première instruction do, for, switch ou while englobant
int main()
{
int compteur=0;
const int limit=10;
while(compteur<=limit)
{
cout << compteur << endl;
compteur=compteur+1;
}
return 0;
}
Algorithmique & programmation C++ : LPRT : S1,
M. OULD BECHIR
22
29/01/2013
int main()
{
int compteur(0);
int limit=10;
do
{
cout << compteur << endl;
compteur=compteur+1;
}
while(compteur<=limit);
return 0;
} Algorithmique & programmation C++ : LPRT : S1,
M. OULD BECHIR
int main()
{
int compteur(0);
return 0;
}
Algorithmique & programmation C++ : LPRT : S1,
M. OULD BECHIR
23
29/01/2013
TD’s
1) Dessiner un rectangle
2) Factorielle
3) Multiplication Egyptienne
4) PGCD
5) Triangle de Pascal
TD’s
1) Dessiner un rectangle #include <iostream>
using namespace std;
int main()
{
int largeur, hauteur;
cout << "Largeur du rectangle : ";
cin >> largeur;
cout << "Hauteur du rectangle : ";
cin >> hauteur;
for(int ligne(0); ligne < hauteur; ligne++)
{
for(int colonne(0); colonne < largeur; colonne++)
{
cout << "*";
}
cout << endl;
}
return 0;
}
24
29/01/2013
TD’s
2) Factorielle #include <iostream>
using namespace std;
int main()
{
int resultat = 1;
int n;
cout<<"Entrez n:"<<endl;
cin>>n;
TD’s
3) Multiplication Egyptienne
Début
Tant que a >= 1 faire
Si a est impair alors
On accumule b dans une somme qui sera le résultat
Fin Si
a devient ⌊a/2⌋⌋
b devient b × 2
Fin tant que
Fin
25
29/01/2013
TD’s
3) Multiplication Egyptienne
Parité de a a b
1 13 5
0 6 10
1 3 20
1 1 40
=5+20+40=65
TD’s #include<iostream>
using namespace std;
3) Multiplication Egyptienne int main()
{
int a;
int b;
int res=0;
cout<<"Entrez a:"<<endl;
cin>>a;
cout<<"Entrez b:"<<endl;
cin>>b;
while(a>=1)
{
if(a%2==1) {
res=res+b;
}
a=a/2;
b=2*b;
}
cout<<"La multiplication vaut:"<<res;
return 0;
}
Algorithmique & programmation C++ : LPRT : S1,
M. OULD BECHIR
26
29/01/2013
TD’s
4) PGCD
TD’s
4) PGCD
a b a-b
78 26 =78-26=52
52 26 26
26 26 0
27
29/01/2013
TD’s
5)Triangle de PASCAL
0 1 2 3 4… (K)
0 1
1 1 1
2 1 2 1
3 1 3 3 1
4 1 4 6 4 1
.
.
(n)
Algorithmique & programmation C++ : LPRT : S1,
M. OULD BECHIR
28
29/01/2013
TD’s
5)Triangle de PASCAL
n! n!(n − k + 1)
C nk = =
k!(n − k )! k (k − 1)!(n − k + 1)(n − k )!
( n − k + 1) k −1
C nk = Cn
k
TD’s
#include<iostream>
5)Triangle de PASCAL
using namespace std;
int main()
{
int n, i, j, x;
cout<<"Entrez le nombre de lignes que vous voulez afficher:"<<endl;
cin>>n;
for(i=0;i<=n-1;i++)
{
x=1;
cout<<x<<" ";
for(j=1;j<=i;j++)
{
x=x*(i-j+1)/j;
cout<<x<<" ";
}
cout<<"\n";
}
}
Algorithmique & programmation C++ : LPRT : S1,
M. OULD BECHIR
29
29/01/2013
return 0;
}
Les tableaux
Tableau statique 1D
30
29/01/2013
Les tableaux
Les tableaux
Initialiser un tableau
int Notes[4]={2,3,4,1} //Notes[0]=2, Notes[1]=3, Notes[2]=4, Notes[3]=1
int Notes[4]={2,3} // Notes[0]=2, Notes[1]=3, Notes[2]=0, Notes[3]=0
int Notes[4]={0} // Notes[0]=0, Notes[1]=0, Notes[2]=0, Notes[3]=0
int Notes[4]={1} // Notes[0]=1, Notes[1]=0, Notes[2]=0, Notes[3]=0
31
29/01/2013
Les tableaux TD
Exemple: calcul d’une moyenne de notes
#include <iostream>
using namespace std;
int main()
{
int nombreNotes=1; // Initialisation de la taille du tableau
double notes[nombreNotes];
double somme(0);
double moyenne(0);
Les tableaux
Tableau dynamique 1D
Tableau dont la taille peut varier
Tableau dynamique/remplissage
Affectation
32
29/01/2013
Les tableaux
Connaitre la taille :
Notes.Size()
Les tableaux TD
int main()
{
vector<double> notes; //Un tableau vide
notes.push_back(12.5); //On ajoute des cases avec les notes
notes.push_back(19.5);
notes.push_back(6);
notes.push_back(12);
double moyenne(0);
for(int i(0); i<notes.size(); ++i) //On utilise notes.size() pour la limite de notre boucle
{
moyenne += notes[i]; //On additionne toutes les notes
}
moyenne /= notes.size(); //On utilise à nouveau notes.size() pour obtenir le nombre de notes
cout << "Votre moyenne est : " << moyenne << endl;
Algorithmique & programmation C++ : LPRT : S1, 66
} M. OULD BECHIR
33
29/01/2013
Les tableaux
Tableau multidimensionnel ND
Tableau de tableaux 2D
00 01 02 03 04
10 11 12 13 14
20 21 22 23 24
30 31 32 33 34
Tableau de tableaux ND
Les tableaux TD
int main()
{
for(int y = 0; y < 3; y++)
{
}
cin.ignore();
cin.get();
return EXIT_SUCCESS;
} Programmation évènementielle & réseau :
68
LPRT : S4, M. OULD BECHIR
34
29/01/2013
Les tableaux
La Classe STRING
Déclaration : #include<string>
String nom(“Mohamed”) ;
Les tableaux TD
int main()
{
string s1,s2,s3;
string str=“Exemple d’utilisation de substr.“;
size_t pos;
cout << "Tapez une chaine de caractères : "; getline (cin, s1);
cout << "Tapez une chaine de caractères : "; getline (cin, s2);
s3=s1+s2;
cout << "Voici la concatenation des 2 chaines :" << endl; // Affichera un espace entre les deux chaines
cout << s3 << endl;
int taille=s1.size(); // Pour connaitre la taille de la chaine
cout << "La chaine comporte :"<<taille<<"caractères";
s3=str.substr(5,10);
cout<<s3;
pos = str.find("utilisation"); //renvoie la position de utilisation dans le texte
String str3 = str.substr (pos); // affiche le texte à partir de utilisation jusqu'à la fin
Programmation évènementielle & réseau :
70
LPRT : S4, M. OULD BECHIR
35
29/01/2013
Les tableaux TD
TD’s #include<iostream>
Int table[5]; using namespace std;
Vector<int> tab(5); int main() //remplissage sans boucle
{
Tab.size(); int tableau[8]= {10, 4, 5, 2, 1, 7, 10, 3};
}
EXERCICES:
1) Remplissage/Lecture d’un tableau
2) Recherche du min dans un tableau
3) Recherche du max dans un tableau
4) Recherche d'une valeur dans un tableau
5) Triangularisation de Gauss (A faire en plus)
Les tableaux TD
36
29/01/2013
Les tableaux TD
Les tableaux TD
37
29/01/2013
Les tableaux TD
int main()
{
int t[N],i,val;
bool trouve;
for(i=0;i<N;i++) //Remplissage du tableau
{cout<<"Entrez l'élément"<<" "<<i+1<<endl;
cin>>t[i];}
cout<<"Entrez la valeur à rechercher : ";//Saisie de l'entier à rechercher
cin>>val;
trouve=false;
i=0;
while(!trouve && i<N){
if(t[i]==val)
trouve=true;
else i++;}
if(trouve) cout<<"La valeur se trouve dans le tableau"<<endl;
else cout<<"La valeur ne se trouve pas dans le tableau"<<endl;
return 0;
} Algorithmique & programmation C++ : LPRT : S1, 75
M. OULD BECHIR
Mémoire
2
0x22ff1c
Un pointeur est une variable qui contient l'adresse d'une autre variable
gestion manuelle de la mémoire
Algorithmique & programmation C++ : LPRT : S1, 76
M. OULD BECHIR
38
29/01/2013
double *pointeurA; //Un pointeur qui peut contenir l'adresse d'un nombre a virgule
unsigned int *pointeurB; //Un pointeur qui peut contenir l'adresse d'un nombre entier positif
string *pointeurC; //Un pointeur qui peut contenir l'adresse d'une chaîne de caractères
int const *pointeurD; //Un pointeur qui peut contenir l'adresse d'un nombre entier constant
Mémoire
1 2
6
6
9
39
29/01/2013
Mémoire
1 2
6
6
9
40
29/01/2013
41
29/01/2013
42
29/01/2013
43
29/01/2013
44
29/01/2013
La récursivité
Définition :
Une fonction récursive est une fonction qui s’appelle elle-même.
F(F(x))
Définition :
Chaque fonction récursive doit inclure un bloc d’instructions appelé
« point d’arrêt » qui permet d’arrêter la fonction
Méthodologie :
Pour écrire une fonction récursive, il faut :
-Identifier les cas particuliers
-Identifier la condition d’arrêt de la boucle
-Identifier le cas général (générique)
Algorithmique & programmation C++ : LPRT : S1, 90
M. OULD BECHIR
45
29/01/2013
La récursivité
Exemples
Factorielle: Somme de a et b:
int Fact(int n) // AVEC UNE BOUCLE #include<iostream>
{ using namespace std;
int resultat = 1;
for(int i = 1; i <= n; i++) int somme(int a, int b)
resultat *= i; {
return resultat; if(b==0)
} { return a;
}
int Fact(int n) // AVEC LA RECURSIVITE else return somme(a+1,b-1);
{
}
if(n == 1)
return 1;
else
return (n*Fact(n-1));
}
La récursivité
Exemples
Algorithme du PGCD :
#include<iostream>
using namespace std;
void Echanger(int &i, int &j) //Procédure ECHANGER
{ int main()
int aux; {
aux=i; int a,b;
i=j;
j=aux;
cout<<"Donnez a:"<<endl;
} cin>>a;
cout<<"Donnez b:"<<endl;
int pgcd(int &a, int &b) //pgcd récursif cin>>b;
{
int d=0; int r=pgcd(a,b);
while (a!=b) cout<<"le PGCD est:"<<r<<endl;
{
if(a<b)
}
{ Echanger(a, b); }
d=a-b;
a=d;
pgcd(a,b);
}
return a; } Algorithmique & programmation C++ : LPRT : S1, 92
M. OULD BECHIR
46
29/01/2013
Les tris
Tri à bulles
Principe:
Sélectionner le minimum du tableau en parcourant le tableau de la fin au début et
en échangeant tout couple d'éléments consécutifs non ordonnés.
Algo.:
Les tris
Tri à bulles
Exemple
T={12, 10, 5, 3}
{12, 10, 5, 3}
i=0
{12, 10, 3, 55}
j=3 Complexité: Nombre d'itérations (moyenne et pire des cas)
{12, 3, ,10, 5}
j=2 n-1
47
29/01/2013
Les tris
Tri à bulles #include<iostream>
using namespace std;
Programme int main()
{
Les tris
Tri par sélection
Principe
Commencer par échanger chaque deux éléments successifs en les ordonnant et en
effectuant n passage.
Algo.:
48
29/01/2013
Les tris
Tri par sélection
Exemple
Les tris
Tri par sélection #include <iostream>
Using namespace std;
Programme int main()
{
temp = tabl[j];
tabl[j] = tabl[j+1];
tabl[j+1] = temp;
}
while(longueur--)
49
29/01/2013
Les tris
Tri par minimums successifs
Principe
Pour une place donnée, on sélectionne l'élément qui doit y être positionné.
De ce fait, si on parcourt la tableau de gauche à droite, on positionne à chaque fois
le plus petit élément qui se trouve dans le sous tableau droit
Algo.: Algo.:
Int indicemin(int T[], int rang, int nbelements) Void TriMinSuccessif(int T[], int nbelements)
variables: int i, int indiceRecherche variables: int i, int indiceRecherche
{ indiceRecherche=rang { indiceRecherche=rang
Pour i=rang+1 à nbelements Pour i=1 à nbelements-1
si T[i]<T[indiceRecherche] alors si( i!=indiceRecherche) alors
indiceRecherche=i Permuter(T[i],T[indice])
Fsi Fsi
Fpour Fpour
Retourner indiceRecherche }
}
Les tris
void Echanger(int &i, int &j) //Procédure ECHANGER
Tri par minimums successifs {
int aux;
Programme aux=i;
i=j;
j=aux;
}
int FIndiceRecherche(int T[], int nbelements, int rang) // Recherche de l'indice du Min
{
int IndiceRecherche=rang;
for(int i=rang+1;i<nbelements;i++)
int main() {
{ if(T[i]<T[IndiceRecherche]){
int tabl[] = {10, 4, 5, 2, 1, 7, 10, 3}; IndiceRecherche=i;
int longueur = sizeof(tabl) / sizeof(int); }
}
TriMinSuccessif(tabl,longueur); return IndiceRecherche;
for(int k=0;k<=7;k++) //Affichage }
cout<< tabl[k] << endl;
} void TriMinSuccessif(int T[],int nbelements) // Tri successif
{
int i,indice;
for(i=0;i<nbelements;i++)
{
indice=FIndiceRecherche(T,nbelements,i);
if(i!=indice){
Echanger(T[i],T[indice]);
}
Algorithmique
} & programmation C++ : LPRT : S1, 100
} M. OULD BECHIR
50
29/01/2013
Les tris
Tri rapide (pivot): récursif
Principe
• Choisir un élément du tableau appelé pivot,
• Ordonner les éléments du tableau par rapport au pivot
• Appeler récursivement le tri sur les parties du tableau à gauche et à droite du pivot.
Algo.:
Variables : int i, int j, int pivot, tableau T
Procédure TriRapide(int T[]; int gauche; int droite)
Début
i=gauche;
j=droite;
pivot=T[(i+j)/2];
Répéter tant que T[i]<pivot faire i=i+1 Fin tq
tant que T[j]>pivot faire j=j-1 Fin tq
si(i<=j) alors echanger(T[i],T[j])
i=i+1;
j=j-1;
Fsi
jusqu'à ce que i>j
si(gauche<j) alors TriRapide(T, gauche, j) Fsi
si(i<droite) alors TriRapide(T, i, droite) Fsi
Fin Algorithmique & programmation C++ : LPRT : S1, 101
M. OULD BECHIR
Les tris
Tri rapide (pivot): récursif
#include<iostream>
Programme using namespace std;
void TriRapide(int T[],int &gauche, int &droite)
{
int i =gauche;
int aux=0;
int main() int j=droite;
{ //int j= (sizeof(T) / sizeof(int))-1;
int tabl[] = {10, 4, 5, 2, 1, 7, 10, 3}; int pivot=T[(i+j)/2];
int gauche=0; do {
int droite= (sizeof(tabl) / sizeof(int))-1; while(T[i]<pivot){i=i+1;}
while(T[j]>pivot) {j=j-1;}
TriRapide(tabl, gauche, droite);
if(i<=j){
for(int k=0;k<=7;k++) //pour le tri croissant aux=T[i];
cout<< tabl[k] << endl; T[i]=T[j];
} T[j]=aux;
i=i+1;
j=j-1;
}
}
while(i<=j);
if(gauche<j){TriRapide(T,gauche,j);}
if(i<droite){TriRapide(T,i,droite);}
}
51
29/01/2013
Algorithmes célèbres!!!
1) Tour de Hanoi
Algorithmes célèbres!!!
2) Recherche dichotomique
Exemple:
Recherche d'un élément dans un tableau trié:
i) On coupe le tableau en deux
ii) On restreint la recherche à la partie ou se trouve l'élément
iii) Et ainsi de suite …
52
29/01/2013
Algorithmes célèbres!!!
3) Algorithme de Fourmis: voyageur du commerce
Algorithmes célèbres!!!
4) Problème d'Einstein:5 Hommes, 5 maisons, 5 fumeurs
On a cinq maisons alignées de couleurs différentes.
Dans chaque maison vit une personne de nationalité différente.
Chaque personne boit une boisson différente.
Chaque personne fume un type de cigarette différent.
Chaque personne élève un animal différent.
Il faut trouver qui élève les poissons.
Indices :
1) L'anglais vit dans la maison rouge
2) Le suédois élève des chiens
3) Le danois boit du thé.
4) La maison verte est juste à gauche de la maison blanche.
5) Le propriétaire de la maison verte boit du café.
6) Le fumeur de Pall Mall élève des oiseaux.
7) Le propriétaire de la maison jaune fume des Dunhills.
8) L'homme qui vit dans la maison du centre boit du lait.
9) Le norvégien vit dans la première maison.
10) L'homme qui fume des Blends vit à côté de celui qui élève des chats.
11) L'homme qui élève des chevaux vit à côté du fumeur de Dunhills.
12) L'homme qui fume des Blue Masters boit de la bière.
13) L'allemand fume des Prince.
14) Le norvégien vit à côté de la maison bleue.
15) L'homme qui fume des Blends a un voisin qui boit de l'eau.
Algorithmique & programmation C++ : LPRT : S1, 106
M. OULD BECHIR
53
29/01/2013
Références bibliographiques
54