Vous êtes sur la page 1sur 23

Chapitre 4 : le for, while et do...

while
La notion de boucles
Dans ce chapitre, nous allons tudier les structures de contrle permettant d'effectuer des
boucles : le for, le while et le dowhile. On parle de boucles lorsqu'on rpte l'excution
d'une srie d'instructions l'intrieur d'un programme. La notion de boucle est une des notions
la base de toute l'algorithmique.
Le for
Le for est une structure de contrle qui permet de rpter un certain nombre de fois une partie
d'un programme.
Syntaxe :
for( instruction1 ; condition ; instruction2 )
instruction3 ;
Smantique du for :
1. on excute linstruction1
2. on teste la condition :
o si elle est vraie, on excute linstruction3, puis linstrution2 puis on revient au
2.
o si elle est fausse on passe linstruction suivante.
Linstruction3 peut tre une suite d'instructions entre accolades.
Exemple 1 : utilisation du for
#include <iostream.h>
int main()
{
int i;
for(i=0;i<10;i=i+1)
cout<<"BONJOUR"<<endl;
return 0;
}

Dans ce programme, il y a une boucle de type for :


o L'instruction 1 est : i=0
o L'instruction 2 est : i=i+1
o Le corps du for comporte une seule instruction : cout<<"BONJOUR"<<endl;

Excution pas pas de lexemple 1


o i vaut 0
o Le test i<10 est vrai ==> on excute le corps du for avec i=0
o On excute i=i+1 ==> i vaut 1

o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o
o

Le test i<10 est vrai ==> on excute le corps du for avec i=1
On excute i=i+1 ==> i vaut 2
Le test i<10 est vrai ==> on excute le corps du for avec i=2
On excute i=i+1 ==> i vaut 3
Le test i<10 est vrai ==> on excute le corps du for avec i=3
On excute i=i+1 ==> i vaut 4
Le test i<10 est vrai ==> on excute le corps du for avec i=4
On excute i=i+1 ==> i vaut 5
Le test i<10 est vrai ==> on excute le corps du for avec i=5
On excute i=i+1 ==> i vaut 6
Le test i<10 est vrai ==> on excute le corps du for avec i=6
On excute i=i+1 ==> i vaut 7
Le test i<10 est vrai ==> on excute le corps du for avec i=7
On excute i=i+1 ==> i vaut 8
Le test i<10 est vrai ==> on excute le corps du for avec i=8
On excute i=i+1 ==> i vaut 9
Le test i<10 est vrai ==> on excute le corps du for avec i=9
On excute i=i+1 ==> i vaut 10
Le test i<10 est faux ==> on sort du for avec i=10
Rsum de lexemple 1
o On a excut 10 fois le corps du for.
o Le programme affiche donc 10 fois BONJOUR lcran.

Exemple 2 : un deuxime exemple de for


#include <iostream.h>
int main()
{
int i;
for (i=0; i<10; i=i+1)
cout<<"La valeur de i est : "<<i<<endl;
cout<<"La valeur finale de i est : "<<i<<endl;
return 0;
}

Dans ce programme, il y a une boucle de type for :


o L'instruction 1 est : i=0
o La condition est : i<10
o L'instruction 2 est : i=i+1
o Le corps du for comporte une seule instruction : cout<<"La valeur finale de i
est : "<<i<<endl;
o On a excut 10 fois le corps du for :
o La premire fois avec i valant 0.
o La dernire fois avec i valant 9.
o On quitte le for avec i valant 10.
Excution de lexemple 2

La valeur de i est : 0
La valeur de i est : 1

La valeur de i est : 2
La valeur de i est : 3
La valeur de i est : 4
La valeur de i est : 5
La valeur de i est : 6
La valeur de i est : 7
La valeur de i est : 8
La valeur de i est : 9
La valeur finale de i est : 10
Exemple 3 : encore un exemple de for !
#include <iostream.h>
int main()
{
int i;
for (i=8; i<=18; i++) cout<<"La valeur de i est : "<<i<<endl;
cout<<"La valeur finale de i est : "<<i<<endl;
return 0;
}

On a une boucle de type for


o on va excuter le corps de la boucle la premire fois avec i valant 8, la dernire
fois avec i valant 18.
o Lorsqu'on quitte le for, i vaut 19.

Excution de lexemple 3

La valeur de i est : 8
La valeur de i est : 9
La valeur de i est : 10
La valeur de i est : 11
La valeur de i est : 12
La valeur de i est : 13
La valeur de i est : 14
La valeur de i est : 15
La valeur de i est : 16
La valeur de i est : 17
La valeur de i est : 18
La valeur finale de i est : 19
Exemple 4 : un for dcroissant
#include <iostream.h>
int main()
{
int i;
for(i=10; i>3; i--)

cout<<"La valeur de i est : "<<i<<endl;


cout<<"La valeur finale de i est : "<<i<<endl;
return 0;
}

Explication du for
o Cette fois-ci, chaque tape on effectue i--, c'est--dire on dcrmente i de 1.
o On va donc excuter le corps du for la premire fois avec i valant 10, la
dernire fois avec i valant 4.
o Lorsqu'on quitte le for, i vaut 3.
Excution de lexemple 4

La valeur de i est : 10
La valeur de i est : 9
La valeur de i est : 8
La valeur de i est : 7
La valeur de i est : 6
La valeur de i est : 5
La valeur de i est : 4
La valeur finale de i est : 3
Exemple 5 : un for de 2 en 2
#include <iostream.h>
int main()
{
int i;
for (i=10; i<20; i=i+2)
cout<<"La valeur de i est : "<<i<<endl;
cout<<"La valeur finale de i est : "<<i<<endl;
return 0;
}

Explication du for
o Cette fois-ci, chaque tape, on ajoute 2 i.
o i va donc valoir successivement 10,12, 14, 16 et 18.
o Lorsque i vaut 20, la condition devient fausse et on quitte la for.
Excution de lexemple 5

La valeur de i est : 10
La valeur de i est : 12
La valeur de i est : 14
La valeur de i est : 16
La valeur de i est : 18
La valeur finale de i est : 20

Exemple 6 : un for qui ne s'arrte jamais


#include <iostream.h>
int main()
{
int i;
for (i=10; i>3; i++)
cout<<"La valeur de i est : "<<i<<endl;
cout<<"La valeur finale de i est : "<<i<<endl;
return 0;
}

Explications du for
o La valeur initiale de i est 10.
o A chaque tape, on excute i++.
o La valeur de i sera toujours plus grande que 3.
o La condition i>3 est toujours vraie ==> le for ne sarrte jamais.
o Le programmeur voulait certainement crire i=i-1; au lieu de i++.
Excution de lexemple 6

La valeur de i est : 10
La valeur de i est : 11
La valeur de i est : 12
La valeur de i est : 13
La valeur de i est : 14
...
En fait, le type int tant de taille fixe (16 bits ou 32 bits selon le compilateur) et sign, la
boucle se termine quand la valeur de la variable i dpasse la limite des positifs (+32 767 ou
+2 147 483 647) :
Si le type int utilise 16 bits :
...
La valeur de i est : 32767
La valeur finale de i est : -32768
Si le type int utilise 32 bits :
...
La valeur de i est : 2147483647
La valeur finale de i est : -2147483648
Le while
Syntaxe
while ( condition )

instruction;
Smantique du while
1. On teste la condition :
o si elle est vraie, on excute linstruction puis on recommence au 1).
o si elle est fausse, on passe linstruction suivante.
Linstruction peut tre une suite d'instructions entre accolades.
Exemple 7 : un exemple de while
#include <iostream.h>
int main()
{
int i=0;
while(i<10)
{
cout<<"La valeur de i vaut : "<<i<<endl;
i++;
}
cout<<"La valeur finale de i vaut : "<<i<<endl;
return 0;
}

Explications
o La variable i est initialise 0.
o A chaque tape, la fin du corps du while, on incrmente i de 1.
o On excute donc le corps du while la premire fois avec i valant 0, la dernire
fois avec i valant 9.
o Lorsquon sort du while i vaut 10.
Excution de lexemple 7

La valeur de i est : 0
La valeur de i est : 1
La valeur de i est : 2
La valeur de i est : 3
La valeur de i est : 4
La valeur de i est : 5
La valeur de i est : 6
La valeur de i est : 7
La valeur de i est : 8
La valeur de i est : 9
La valeur finale de i est : 10
Exemple 8 : valider une donne saisie au clavier
#include <iostream.h>

int main()
{
int i;
cout <<"Tapez une valeur entre 0 et 20 bornes incluses : ";
cin>>i;
while (i<0 || i>20)
{
cout <<"ERREUR ! ";
cout <<"Tapez une valeur entre 0 et 20 bornes incluses : ";
cin >> i;
}
return 0;
}

Explications
o On saisit une premire fois la valeur de i par un cin.
o Tant que la valeur saisie ne sera pas comprise entre 0 et 20 (bornes incluses),
on affiche ERREUR et on redemande une nouvelle valeur.
o La condition la valeur de i n'est pas comprise entre 0 et 20 scrit ( i<0 ||
i>20 ).
o Ne pas confondre le ET et le OU logique !

Excution de lexemple 8

Tapez une valeur entre 0 et 20 bornes incluses : 30


ERREUR ! Tapez une valeur entre 0 et 20 bornes incluses : -2
ERREUR ! Tapez une valeur entre 0 et 20 bornes incluses : 10
Conseil
On utilisera le for lorsquon connat le nombre dtapes raliser. On utilisera un while dans
le cas contraire. Dans tous les cas, il faut toujours vrifier si on excute notre boucle le bon
nombre de fois. Il faudra vrifier dans tous les cas que notre boucle n'est pas infinie.
Le do...while
Syntaxe
do {
instruction;
}
while ( condition );
Smantique du do while
1.
2.
3.
4.

on excute linstruction.
on value la condition.
si elle est vraie, on recommence au 1.
si elle est fausse, on passe l'instruction suivante.

Exemple 9 : un exemple de do...while


#include <iostream.h>
int main()
{
int i=0;
do {
cout<<"La valeur de i vaut : "<<i<<endl;
i=i+1;
} while(i<10);
cout<<"La valeur finale de i est "<<i<<endl;
return 0;
}
Excution de lexemple 9
La valeur de i vaut : 0
La valeur de i vaut : 1
La valeur de i vaut : 2
La valeur de i vaut : 3
La valeur de i vaut : 4
La valeur de i vaut : 5
La valeur de i vaut : 6
La valeur de i vaut : 7
La valeur de i vaut : 8
La valeur de i vaut : 9
La valeur finale de i est : 10
Rcapitulatif des structures de contrle
Le if et le if else ne permettent pas de rpter un bout de programme.
Le switch est un if else amlior et ne permet pas non plus de rpter un bout de
programme.
Le for, le while et le do while permettent de construire des boucles rptitives.
Attention aux boucles infinies !
Utilisation des structures de contrle
Au del de ces exemples pdagogiques, la difficult d'utilisation de ces structures provient de
la difficult partir d'un problme donn d'imaginer une solution sous forme d'un algorithme
puis de trouver les structures de contrle adaptes pour implmenter cet algorithme. Beaucoup
de pratique et de travail sont ncessaires pour mettre en uvre ce processus mental complexe.
Exercices sur les structures de contrle
EXERCICE 1
Ecrire un programme qui demande l'utilisateur de taper un entier et qui affiche GAGNE si
l'entier est entre 56 et 78 bornes incluses PERDU sinon.

Solution
Cet exercice a pour but de vrifier les points techniques suivants :

La notion de variables et leur dclaration.


L'utilisation de cin et de cout.
Le choix d'une structure de contrle adapte au problme !

Voici le fichier source :


#include<iostream.h>
int main()
{
int a;
cout<<"Tapez un entier : "; cin>>a;
if ((a>=56)&&(a<=78)) cout<<"GAGNE"<<endl; else cout<<"PERDU"<<endl;
return 0;
}
EXERCICE 2
Ecrire un programme qui affiche tous les entiers de 8 jusqu 23 (bornes incluses) en utilisant
un for.
Solution
Cet exercice a pour but de vrifier les points techniques suivants :

Utilisation rudimentaire d'un for.

Voici le fichier source :


#include<iostream.h>
int main()
{
int i;
for (i=8;i<=23;i++) cout<<i<<endl;
return 0;
}
EXERCICE 3
Mme exercice mais en utilisant un while.
Solution

Cet exercice a pour but de vrifier les points techniques suivants :

Utilisation rudimentaire d'un while.

Voici le fichier source :


#include<iostream.h>
int main()
{
int i=8;
while(i<=23)
{
cout<<i<<endl;
i++;
}
return 0;
}
EXERCICE 4
Ecrire un programme qui demande lutilisateur de taper 10 entiers et qui affiche leur
somme.
Solution
Cet exercice a pour but de vrifier les points techniques suivants :

Utilisation d'un for.


Etude d'un algorithme usuel : calcul d'une somme.

Voici le fichier source :


#include<iostream.h>
int main()
{
int i, s=0, x;
for(i=0; i<10; i++)
{
cout<<"Tapez un entier : "; cin>>x;
s = s + x;
}
cout<<"La somme vaut : "<<s<<endl;
return 0;
}

EXERCICE 5
Ecrire un programme qui demande lutilisateur de taper 10 entiers et qui affiche le plus petit
de ces entiers.
Solution
Voici le fichier source :
#include<iostream.h>
int main()
{
int i, ppt, x;
for(i=0; i<10; i++)
{
cout<<"Tapez un entier : "; cin>>x;
if(i==0) ppt=x; else if(x<ppt) ppt=x;
}
cout<<"Le plus petit vaut : "<< ppt <<endl;
return 0;
}
EXERCICE 6
Ecrire un programme qui demande l'utilisateur de taper un entier N et qui calcule la somme
des cubes de 5^3 N^3.
Solution
Cet exercice a pour but de vrifier les points techniques suivants :

Utilisation simple du for.


Etude d'un algorithme usuel : calcul d'une somme.
Modlisation d'un problme simple issu des mathmatiques.

Voici le fichier source :


#include<iostream.h>
int main()
{
int N,s=0,i;
cout<<"Tapez la valeur de N : "; cin>>N;
for (i=5 ; i<=N ; i++)

s = s + i*i*i;
cout<<"La somme vaut : "<<s<<endl;
return 0;
}
EXERCICE 7
Ecrire un programme qui demande l'utilisateur de taper un entier N et qui calcule u(N)
dfini par :
u(0)=3
u(n+1)=3.u(n)+4
Solution
Cet exercice a pour but de vrifier les points techniques suivants :

Utilisation simple du for.


Etude d'un algorithme usuel : calcul des termes d'une suite rcurrente.
Modlisation d'un problme issu des mathmatiques.

Voici le fichier source :


#include<iostream.h>
int main()
{
int i, u=3, N;
cout<<"Tapez N : "; cin>>N;
for(i=0; i<N; i++)
u=u*3+4;
cout << "u(" << N << ")=" << u << endl;
return 0;
}
EXERCICE 8
Ecrire un programme qui demande l'utilisateur de taper un entier N et qui calcule u(N)
dfini par :
u(0)=1
u(1)=1
u(n+1)=u(n)+u(n-1)
Solution
Cet exercice a pour but de vrifier les points techniques suivants :

Utilisation simple du for.


Etude d'un algorithme usuel : calcul d'une suite rcurrente.
Modlisation d'un problme simple issu des mathmatiques.

Voici le fichier source :


#include<iostream.h>
int main()
{
int i, u=1, v=1, w, N;
cout<<"Tapez N : "; cin>>N;
w = 1;
for (i=2; i<=N; i++)
{
w = u + v;
u = v;
v = w;
}
cout<<"u("<<N<<")="<<w<<endl;
return 0;
}
EXERCICE 9
Ecrire un programme qui demande lutilisateur de taper un entier N entre 0 et 20 bornes
incluses et qui affiche N+17. Si on tape une valeur errone, il faut afficher "erreur" et
demander de saisir nouveau l'entier.
Solution
Cet exercice a pour but de vrifier les points techniques suivants :

Utilisation simple du while.


Validation des donnes saisies par l'utilisateur.

Voici le fichier source :


#include<iostream.h>
int main()
{
int N;
bool ok;

do {
cout<<"Tapez N entre 0 et 20 :"; cin>>N;
ok = (N<=20 && N>=0);
if(!ok)cout<<"ERREUR RECOMMENCEZ"<<endl;
}while(!ok);
N = N + 17;
cout<<"La valeur finale est : "<<N<<endl;
return 0;
}
EXERCICE 10
Ecrire un programme qui permet de faire des oprations sur un entier (valeur initiale 0). Le
programme affiche la valeur de l'entier puis affiche le menu suivant :
1. Ajouter 1
2. Multiplier par 2
3. Soustraire 4
4. Quitter

Le programme demande alors de taper un entier entre 1 et 4. Si l'utilisateur tape une valeur
entre 1 et 3, on effectue l'opration, on affiche la nouvelle valeur de l'entier puis on raffiche
le menu et ainsi de suite jusqu' ce qu'on tape 4. Lorsqu'on tape 4, le programme se termine.
Solution
Cet exercice a pour but de vrifier les points techniques suivants :

Utilisation du while.
Utilisation du switch.
Gestion d'un programme l'aide d'un menu.
Modlisation d'un problme simple sous forme informatique.

Voici le fichier source :


#include<iostream.h>
int main()
{
int x=0,choix;
do {
cout<<"x vaut "<<x<<endl;
cout<<"1 : Ajouter 1"<<endl;
cout<<"2 : Multiplier par 2"<<endl;
cout<<"3 : Soustraire 4"<<endl;
cout<<"4 : Quitter"<<endl;
cout<<"Votre choix : "; cin>>choix;

switch(choix)
{
case 1: x++; break;
case 2: x=x*2; break;
case 3: x=x-4; break;
}
}while(choix!=4);
cout<<"La valeur finale de x vaut : "<<x<<endl;
return 0;
}
EXERCICE 11
Ecrire un programme qui demande l'utilisateur de taper des entiers strictement positifs et qui
affiche leur moyenne. Lorsqu'on tape une valeur ngative, le programme affiche ERREUR et
demande de retaper une valeur. Lorsqu'on tape 0, cela signifie que le dernier entier a t tap.
On affiche alors la moyenne. Si le nombre d'entiers taps est gal 0, on affiche PAS DE
MOYENNE.
Solution
Cet exercice a pour but de vrifier les points techniques suivants :

Utilisation d'un while de difficult moyenne.


Etude d'un algorithme usuel : calcul d'une moyenne.

Voici le fichier source :


#include<iostream.h>
int main()
{
int x, s=0,nb=0;
double moyenne;
do{
cout<<"Tapez un entier :"; cin>>x;
if(x>0){ s=s+x; nb++; }
else if(x<0) cout<<"ERREUR ";
}while(x!=0);
if(nb==0)cout<<"AUCUN ENTIER TAPE "<<endl<<"PAS DE MOYENNE"<<endl;
else {
moyenne = (double)s / nb;
cout<<"La moyenne vaut : "<< moyenne <<endl;
}

return 0;
}
EXERCICE 12
Ecrire un programme qui demande l'utilisateur de taper un entier N et qui calcule u(N)
dfini par :
u(0)=3
u(1)=2
u(n)=n.u(n-1)+(n+1).u(n-2)+n
Solution
Cet exercice a pour but de vrifier les points techniques suivants :

Utilisation d'un for.


Etude d'un algorithme usuel : calcul d'une suite rcurrente assez difficile.
Modlisation d'un problme issu des mathmatiques.

Voici le fichier source :


#include<iostream.h>
int main()
{
int N, u, i=0, v, w;
cout<<"Tapez la valeur de N : "; cin>>N;
u = 3;
v = 2;
if (N==0) w=u;
else if (N==1) w=v;
else for (i=2; i<=N; i++) { w=i*v+(i+1)*u+i; u=v; v=w; }
cout<<"u("<<N<<")="<<w<<endl;
return 0;
}
EXERCICE 13
Ecrire un programme qui demande de saisir 10 entiers et qui affiche le nombre d'occurrences
de la note la plus haute.
Solution
Cet exercice a pour but de vrifier les points techniques suivants :

Utilisation d'un for.

Etude d'un algorithme usuel de difficult moyenne : calcul du nombre d'occurence


d'une valeur.

Voici le fichier source :


#include<iostream.h>
int main()
{
int nb, max, x, i;
for(i=0;i<10;i++)
{
cout<<"Tapez un entier : "; cin>>x;
if(i==0) {max=x; nb=1;}
else if(x==max) nb++;
else if(max<x) {max=x; nb=1;}
}
cout<<"le nombre d'occurences de "<<max<<" est "<<nb<<endl;
return 0;
}
EXERCICE 14
Ecrire un programme qui demande de saisir un entier N et qui affiche N!.
Solution
Cet exercice a pour but de vrifier les points techniques suivants :

Utilisation du for.
Etude d'un algorithme usuel : calcul d'une factorielle.
Modlisation d'un problme issu des mathmatiques.

Voici le fichier source :


#include<iostream.h>
int main()
{
int N, i, f=1;
cout<<"Tapez un entier : "; cin>>N;
for(i=2; i<=N; i++) f=f*i;
cout<<N<<"! vaut "<<f<<endl;
return 0;
}

EXERCICE 15
Ecrire un programme qui demande de saisir un entier et qui indique si cet entier est premier
ou non.
Solution
Cet exercice a pour but de vrifier les points techniques suivants :

Utilisation d'un while de difficult moyenne.


Etude d'un algorithme usuel assez difficile : primarit d'un entier.
Modlisation d'un problme issu des mathmatiques.

Voici le fichier source :


#include<iostream.h>
int main()
{
int n;
bool premier = true;
int d = 2;
cout<<"Veuillez saisir un entier : "; cin>>n;
if (n<=1) premier = false;
else {
while(premier==true && d*d<=n)
if(n%d==0) premier=false; else d=d+1;
}
if(premier) cout<<n<<" est premier"<<endl;
else cout<<n<<" n'est pas premier"<<endl;
return 0;
}
EXERCICE 16
Ecrire un programme qui demande l'utilisateur de saisir un entier N et qui affiche le nombre
de nombres premiers infrieurs ou gaux N.
Solution
Cet exercice a pour but de vrifier les points techniques suivants :

Utilisation des boucles for et while.


Imbrication de boucles.
Lire prcisment un nonc.
Modlisation assez complexe d'un problme issu des mathmatiques.

Voici le fichier source :


#include<iostream.h>
int main()
{
int N, i, nb=0, d;
bool est_premier;
cout<<"Tapez la valeur de N : "; cin>>N;
for(i=2;i<=N;i++)
{
/* ecrire un programme qui teste si i est premier */
est_premier=true;
d=2;
while(est_premier && d*d<=i)
if(i%d==0) est_premier=false; else d++;
if(est_premier==true) nb++;
}
cout<<"Le nombre de nombre premiers infrieurs ou gaux "
<<N<<" est "<<nb<<endl;
return 0;
}
EXERCICE 17
Ecrire un programme qui demande l'utilisateur de saisir un entier N et qui affiche le N-ime
nombre premier.
Solution
Cet exercice a pour but de vrifier les points techniques suivants :

Utilisation des boucles for et while.


Imbrication de boucles assez complexe.
Lire prcisment un nonc.
Modlisation assez complexe d'un problme issu des mathmatiques.

Voici le fichier source :


#include<iostream.h>
int main()
{
int N, i=1, nb=0, d;
bool est_premier;

cout<<"Tapez la valeur de N : "; cin>>N;


while(nb<N)
{
i++;
est_premier=true;
d=2;
while(est_premier && d*d<=i)
if(i%d==0)est_premier=false; else d++;
if(est_premier==true) nb++;
}
cout<<"Le N-ime nombre premier est "<<i<<endl;
return 0;
}
EXERCICE 18
Ecrire un programme qui demande l'utilisateur de saisir un entier N et qui affiche la figure
suivante.
N=1
*
N=2
**
*
N=3
***
**
*
et ainsi de suite
Solution
Cet exercice a pour but de vrifier les points techniques suivants :

Utilisation des boucles for.


Imbrication de boucles assez complexe.

Voici le fichier source :


#include<iostream.h>
int main()
{
int i, j, N;

cout<<"Tapez la valeur de N : "; cin>>N;


for(i=1;i<=N;i++)
{
for(j=1; j<=N+1-i; j++) cout<<"*";
cout<<endl;
}
return 0;
}
EXERCICE 19
Ecrire un programme qui demande l'utilisateur de saisir un entier N et qui affiche la figure
suivante.
N=1
*
N=2
**
*
N=3
***
**
*
et ainsi de suite.
Solution
Cet exercice a pour but de vrifier les points techniques suivants :

Utilisation des boucles for.


Imbrication de boucles.
Voici le fichier source :

#include<iostream.h>
int main()
{
int i, j, N;
cout<<"Tapez la valeur de N : "; cin>>N;
for(i=1; i<=N; i++)
{
for(j=1; j<i; j++) cout<<" ";
for(j=1; j<=N+1-i; j++) cout<<"*";
cout<<endl;
}

return 0;
}
EXERCICE 20
On considre la suite hongroise : u(0)=a (a entier)
si u(n) pair alors u(n+1)=u(n)/2 sinon u(n+1)=3*u(n)+1
Pour toutes les valeurs a, il existe un entier N tel que u(N)=1 (conjecture admise).
a) Ecrire un programme qui demande l'utilisateur de taper a et qui affiche toutes les valeurs
de u(n) de n=1 n=N.
Solution
Cet exercice a pour but de vrifier les points techniques suivants :

Utilisation du while.
Lire prcisment un nonc.
Modlisation assez complexe d'un problme issu des mathmatiques.

Voici le fichier source :


#include<iostream.h>
int main()
{
int a, n, u;
cout<<"Tapez la valeur de a : "; cin>>a;
n = 0;
u = a;
while(u!=1)
{
if(u%2==0) u=u/2; else u=3*u+1;
n++;
cout<<"u("<<n<<")="<<u<<endl;
}
return 0;
}
b) Ecrire un programme qui demande l'utilisateur de taper un entier M puis qui cherche la
valeur de a comprise entre 2 et M qui maximise la valeur de N. On appelle A cette valeur. Le
programme doit afficher la valeur A et la valeur N correspondante.
Solution
Cet exercice a pour but de vrifier les points techniques suivants :

Utilisation du while et du for.

Imbrication de boucles.
Lire prcisment un nonc.
Modlisation assez complexe d'un problme issu des mathmatiques.

Voici le fichier source :


#include<iostream.h>
int main()
{
int a,n,u,M, amax,nmax;
cout<<"Tapez la valeur de M : "; cin>>M;
amax = 2;
nmax = 2;
for(a=3; a<=M; a++)
{
n = 0;
u = a;
while (u!=1)
{
if(u%2==0) u=u/2; else u=3*u+1;
n++;
}
if (n>nmax) { amax=a; nmax=n; }
}
cout<<"La valeur de A est :"<< amax <<endl;
cout<<"La valeur de N correspondante est :"<< nmax <<endl;
return 0;
}