Programmation C++ (débutant)/Instructions for, while et do...while
Un livre de Wikibooks.
Le cours du chapitre 4 : le for, while et do...while
La notion de boucles
Dans ce chapitre, nous allons étudier les structures de contrôle permettant d'effectuer des boucles : le for, le while et le do…while. On parle de boucles lorsqu'on répète l'exécution d'une série d'instructions à l'intérieur 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 contrôle qui permet de répéter un certain nombre de fois une partie d'un programme.
Syntaxe :
for( instruction1 ; condition ; instruction2 ) instruction3 ;
Sémantique du for :
- on exécute l’instruction1
- on teste la condition :
- si elle est vraie, on exécute l’instruction3, puis l’instrution2 puis on revient au 2.
- si elle est fausse on passe à l’instruction suivante.
- si elle est vraie, on exécute l’instruction3, puis l’instrution2 puis on revient au 2.
L’instruction3 peut être une suite d'instructions entre accolades.
Exemple 1 : utilisation du for
#include <iostream> using namespace std; 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 :
- L'instruction 1 est : i=0
- L'instruction 2 est : i=i+1
- Le corps du for comporte une seule instruction : cout<<"BONJOUR"<<endl;
- Exécution pas à pas de l’exemple 1
- i vaut 0
- Le test i<10 est vrai ==> on exécute le corps du for avec i=0
- On exécute i=i+1 ==> i vaut 1
- Le test i<10 est vrai ==> on exécute le corps du for avec i=1
- On exécute i=i+1 ==> i vaut 2
- Le test i<10 est vrai ==> on exécute le corps du for avec i=2
- On exécute i=i+1 ==> i vaut 3
- Le test i<10 est vrai ==> on exécute le corps du for avec i=3
- On exécute i=i+1 ==> i vaut 4
- Le test i<10 est vrai ==> on exécute le corps du for avec i=4
- On exécute i=i+1 ==> i vaut 5
- Le test i<10 est vrai ==> on exécute le corps du for avec i=5
- On exécute i=i+1 ==> i vaut 6
- Le test i<10 est vrai ==> on exécute le corps du for avec i=6
- On exécute i=i+1 ==> i vaut 7
- Le test i<10 est vrai ==> on exécute le corps du for avec i=7
- On exécute i=i+1 ==> i vaut 8
- Le test i<10 est vrai ==> on exécute le corps du for avec i=8
- On exécute i=i+1 ==> i vaut 9
- Le test i<10 est vrai ==> on exécute le corps du for avec i=9
- On exécute i=i+1 ==> i vaut 10
- Le test i<10 est faux ==> on sort du for avec i=10
- Résumé de l’exemple 1
- On a exécuté 10 fois le corps du for.
- Le programme affiche donc 10 fois BONJOUR à l’écran.
Exemple 2 : un deuxième exemple de for
#include <iostream> using namespace std; 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 :
- L'instruction 1 est : i=0
- La condition est : i<10
- L'instruction 2 est : i=i+1
- Le corps du for comporte une seule instruction : cout<<"La valeur finale de i est : "<<i<<endl;
- On a exécuté 10 fois le corps du for :
- La première fois avec i valant 0.
- La dernière fois avec i valant 9.
- On quitte le for avec i valant 10.
- Exécution de l’exemple 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> using namespace std; 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
- on va exécuter le corps de la boucle la première fois avec i valant 8, la dernière fois avec i valant 18.
- Lorsqu'on quitte le for, i vaut 19.
- Exécution de l’exemple 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 décroissant
#include <iostream> using namespace std; 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
- Cette fois-ci, à chaque étape on effectue i--, c'est-à-dire on décrémente i de 1.
- On va donc exécuter le corps du for la première fois avec i valant 10, la dernière fois avec i valant 4.
- Lorsqu'on quitte le for, i vaut 3.
- Exécution de l’exemple 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> using namespace std; 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
- Cette fois-ci, à chaque étape, on ajoute 2 à i.
- i va donc valoir successivement 10,12, 14, 16 et 18.
- Lorsque i vaut 20, la condition devient fausse et on quitte la for.
- Exécution de l’exemple 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'arrête jamais
#include <iostream> using namespace std; 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
- La valeur initiale de i est 10.
- A chaque étape, on exécute i++.
- La valeur de i sera toujours plus grande que 3.
- La condition i>3 est toujours vraie ==> le for ne s’arrête jamais.
- Le programmeur voulait certainement écrire i=i-1; au lieu de i++.
- Exécution de l’exemple 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 dépasse 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;
Sémantique du while
- On teste la condition :
- si elle est vraie, on exécute l’instruction puis on recommence au 1).
- si elle est fausse, on passe à l’instruction suivante.
L’instruction peut être une suite d'instructions entre accolades.
Exemple 7 : un exemple de while
#include <iostream> using namespace std; 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
- La variable i est initialisée à 0.
- A chaque étape, à la fin du corps du while, on incrémente i de 1.
- On exécute donc le corps du while la première fois avec i valant 0, la dernière fois avec i valant 9.
- Lorsqu’on sort du while i vaut 10.
- Exécution de l’exemple 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 donnée saisie au clavier
#include <iostream> using namespace std; 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
- On saisit une première fois la valeur de i par un cin.
- Tant que la valeur saisie ne sera pas comprise entre 0 et 20 (bornes incluses), on affiche ERREUR et on redemande une nouvelle valeur.
- La condition « la valeur de i n'est pas comprise entre 0 et 20 » s’écrit ( i<0 || i>20 ).
- Ne pas confondre le ET et le OU logique !
- Exécution de l’exemple 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 lorsqu’on connaît le nombre d’étapes à réaliser. On utilisera un while dans le cas contraire. Dans tous les cas, il faut toujours vérifier si on exécute notre boucle le bon nombre de fois. Il faudra vérifier dans tous les cas que notre boucle n'est pas infinie.
Le do...while
Syntaxe
do { instruction; } while ( condition );
Sémantique du do … while
- on exécute l’instruction.
- 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> using namesapce std; 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; }
Exécution de l’exemple 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
Récapitulatif des structures de contrôle
Le if et le if … else ne permettent pas de répéter un bout de programme.
Le switch est un if …else amélioré et ne permet pas non plus de répéter un bout de programme.
Le for, le while et le do … while permettent de construire des boucles répétitives.
Attention aux boucles infinies !
Utilisation des structures de contrôle
Au delà de ces exemples pédagogiques, la difficulté d'utilisation de ces structures provient de la difficulté à partir d'un problème donné d'imaginer une solution sous forme d'un algorithme puis de trouver les structures de contrôle adaptées pour implémenter cet algorithme. Beaucoup de pratique et de travail sont nécessaires pour mettre en œuvre ce processus mental complexe.
Exercices sur les structures de contrôle
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 vérifier les points techniques suivants :
- La notion de variables et leur déclaration.
- L'utilisation de cin et de cout.
- Le choix d'une structure de contrôle adaptée au problème !
Voici le fichier source :
#include<iostream> using namespace std; 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 vérifier les points techniques suivants :
- Utilisation rudimentaire d'un for.
Voici le fichier source :
#include<iostream> using namespace std; int main() { int i; for (i=8;i<=23;i++) cout<<i<<endl; return 0; }
EXERCICE 3
Même exercice mais en utilisant un while.
Solution
Cet exercice a pour but de vérifier les points techniques suivants :
- Utilisation rudimentaire d'un while.
Voici le fichier source :
#include<iostream> using namespace std; int main() { int i=8; while(i<=23) { cout<<i<<endl; i++; } return 0; }
EXERCICE 4
Ecrire un programme qui demande à l’utilisateur de taper 10 entiers et qui affiche leur somme.
Solution
Cet exercice a pour but de vérifier les points techniques suivants :
- Utilisation d'un for.
- Etude d'un algorithme usuel : calcul d'une somme.
Voici le fichier source :
#include<iostream> using namespace std; 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 à l’utilisateur de taper 10 entiers et qui affiche le plus petit de ces entiers.
Solution
Voici le fichier source :
#include<iostream> using namespace std; 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 vérifier les points techniques suivants :
- Utilisation simple du for.
- Etude d'un algorithme usuel : calcul d'une somme.
- Modélisation d'un problème simple issu des mathématiques.
Voici le fichier source :
#include<iostream> using namespace std; 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) défini par :
u(0)=3
u(n+1)=3.u(n)+4
Solution
Cet exercice a pour but de vérifier les points techniques suivants :
- Utilisation simple du for.
- Etude d'un algorithme usuel : calcul des termes d'une suite récurrente.
- Modélisation d'un problème issu des mathématiques.
Voici le fichier source :
#include<iostream> using namespace std; 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) défini par :
u(0)=1
u(1)=1
u(n+1)=u(n)+u(n-1)
Solution
Cet exercice a pour but de vérifier les points techniques suivants :
- Utilisation simple du for.
- Etude d'un algorithme usuel : calcul d'une suite récurrente.
- Modélisation d'un problème simple issu des mathématiques.
Voici le fichier source :
#include<iostream> using namespace std; 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 à l’utilisateur de taper un entier N entre 0 et 20 bornes incluses et qui affiche N+17. Si on tape une valeur erronée, il faut afficher "erreur" et demander de saisir à nouveau l'entier.
Solution
Cet exercice a pour but de vérifier les points techniques suivants :
- Utilisation simple du while.
- Validation des données saisies par l'utilisateur.
Voici le fichier source :
#include<iostream> using namespace std; 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 opérations 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'opération, on affiche la nouvelle valeur de l'entier puis on réaffiche 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 vérifier les points techniques suivants :
- Utilisation du while.
- Utilisation du switch.
- Gestion d'un programme à l'aide d'un menu.
- Modélisation d'un problème simple sous forme informatique.
Voici le fichier source :
#include<iostream> using namespace std; 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 négative, 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 tapés est égal à 0, on affiche PAS DE MOYENNE.
Solution
Cet exercice a pour but de vérifier 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> using namespace std; 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) défini 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 vérifier les points techniques suivants :
- Utilisation d'un for.
- Etude d'un algorithme usuel : calcul d'une suite récurrente assez difficile.
- Modélisation d'un problème issu des mathématiques.
Voici le fichier source :
#include<iostream> 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 vérifier 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> using namespace std; 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 vérifier les points techniques suivants :
- Utilisation du for.
- Etude d'un algorithme usuel : calcul d'une factorielle.
- Modélisation d'un problème issu des mathématiques.
Voici le fichier source :
#include<iostream> using namespace std; 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 vérifier les points techniques suivants :
- Utilisation d'un while de difficulté moyenne.
- Etude d'un algorithme usuel assez difficile : primarité d'un entier.
- Modélisation d'un problème issu des mathématiques.
Voici le fichier source :
#include<iostream> using namespace std; 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 inférieurs ou égaux à N.
Solution
Cet exercice a pour but de vérifier les points techniques suivants :
- Utilisation des boucles for et while.
- Imbrication de boucles.
- Lire précisément un énoncé.
- Modélisation assez complexe d'un problème issu des mathématiques.
Voici le fichier source :
#include<iostream> using namespace std; 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 inférieurs 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-ième nombre premier.
Solution
Cet exercice a pour but de vérifier les points techniques suivants :
- Utilisation des boucles for et while.
- Imbrication de boucles assez complexe.
- Lire précisément un énoncé.
- Modélisation assez complexe d'un problème issu des mathématiques.
Voici le fichier source :
#include<iostream> using namespace std; 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-ième 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 vérifier les points techniques suivants :
- Utilisation des boucles for.
- Imbrication de boucles assez complexe.
Voici le fichier source :
#include<iostream> using namespace std; 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 vérifier les points techniques suivants :
- Utilisation des boucles for.
- Imbrication de boucles.
- Voici le fichier source :
#include<iostream> using namespace std; 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 considère 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 vérifier les points techniques suivants :
- Utilisation du while.
- Lire précisément un énoncé.
- Modélisation assez complexe d'un problème issu des mathématiques.
Voici le fichier source :
#include<iostream> using namespace std; 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 vérifier les points techniques suivants :
- Utilisation du while et du for.
- Imbrication de boucles.
- Lire précisément un énoncé.
- Modélisation assez complexe d'un problème issu des mathématiques.
Voici le fichier source :
#include<iostream> using namespace std; 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; }
