Enoncé exercice 1
Ecrire un programme C qui définit un nombre magique (un nombre secret), et lit des entiers à l’entrée jusqu’à ce que l’utilisateur trouve ce nombre. En lui indiquant à chaque fois s’il est en dessus ou au-dessous du nombre magique.
Correction exercice 1
Dans tout exercice faisant apparaitre les boucles, la première question qu’il faut se poser c’est quelle boucles doit on choisir parmi les trois, voici donc les cas où chaque une d’entre sera la plus adaptée:
- Boucle for: lorsque le nombre des itérations est connu.
- Boucle while: lorsque le nombre des itérations est inconnu, et la condition de réitération est à vérifier avant l’exécution du bloc des instructions de la boucle.
- Boucle do while: lorsque le nombre des itérations est inconnu, et la condition de réitération doit être vérifiée après l’exécution du bloc des instructions de la boucle.
En revenant maintenant à l’exercice, chaque fois que la proposition de l’utilisateur est lue, on doit la comparer au nombre magique qu’on a défini. Et selon le résultat de cette comparaison on peut soit décider d’arrêter, si l’utilisateur a bien deviné le nombre magique, ou de continuer à lire ses propositions dans le cas contraire. Ce qu’on doit tirer de ça, est que le test se fera après exécution des instructions, c’est à dire après la lecture de la proposition de l’utilisateur, donc on va opter pour la boucle do while.
La démarche peut se résumer à: tant que l’utilisateur n’a pas pu trouver le nombre magique, on continuera à lui demander des propositions, et à chaque fois on lui affiche le message adéquat.
Soit donc a la variable entière contenant la proposition de l’utilisateur, et mag le nombre magique auquel on affecte une valeur arbitraire. La condition de réitération de la boucle do while est alors a!=mag (ligne 13). Ce qui veut dire, tant que la proposition et le nombre magique sont différents, la boucle doit continuer à tourner.
Les instructions de la boucle seront, la lecture de la proposition de l’utilisateur, puis sa comparaison avec le nombre magique pour afficher le bon message (lignes 10-12).
Il est important de ne pas oublier de faire suivre le while par un point-virgule (ligne 13).
Solution exercice 1
#include<stdio.h>
#include<stdlib.h>
int main()
{
int mag,a;
mag=12;
printf("Tentez votre chance:\n");
do{
scanf("%d",&a);
if(a<mag) printf("Pas encore! essayez un nombre plus grand.\n");
if(a>mag) printf("Pas encore! essayez un nombre plus petit.\n");
if(a==mag) printf("Bravo! vous avez trouver le nombre magique.\n");
}while(a!=mag);
system("pause");
return 0;
}
Enoncé exercice 2
Ecrire un programme C qui lit un entier puis détermine s’il est premier ou non.
On rappelle qu’un entier est dit premier s’il a exactement deux diviseurs différents; 1 et lui-même.
Ex: 2, 3, 7, 17, 101 sont tous premiers, et 4, 10, 27 ne le sont pas.
Correction exercice 2
Après la déclaration des variables dont on aura besoin, on passe à la lecture l’entier p sur lequel on va effectuer le test de primalité.
Dès le départ on fait un test pour voir si p est égal à 1 ou à 0, dans ces deux cas on affiche que le nombre n’est pas premier (ligne 8).
Pour le reste des cas (bloc else), c’est-à-dire lorsque p est supérieur ou égal à 2, on va supposer que p est premier en affectant la valeur 1 à la variable pr (ligne 11).
Ensuite on va parcourir les diviseurs possibles de p, à savoir les nombres de 2 jusqu’à p-1, à l’aide du compteur i de la boucle for. A noter que l’utilisation de la boucle for ici vient du fait qu’on connait le nombre des itérations qui est de 2 jusqu’à p-1.
En parcourant ces entiers, si on trouve un nombre i qui divise p, on va conclure que l’hypothèse de primalité présupposée est fausse et on l’indiquera en affectant 0 à la variable pr (ligne 14). On peut à ce stade arrêter la recherche à l’aide de l’instruction break qui permet, une fois exécutée, de sortir de la boucle dont elle est à l’intérieur. Il faut faire attention à ce que l’instruction break vient après l’opération d’affectation, sinon cette dernière n’aura pas lieu (ligne 14).
Une fois sorti de la boucle for, on va faire un test sur la valeur de la variable pr. Si elle est égale à 1 on affiche que le nombre entré est premier (ligne 16). Sinon, on peut déduire qu’on a trouvé un i qui divise p, du coup ce dernier n’est pas premier (ligne 17).
Dans le cas spécial où p est égal à 2, la boucle ne sera pas exécutée, puisque la condition i<p (i et p sont tous les deux égaux à 2) ne sera pas vérifiée. Donc la variable pr va garder la valeur de 1 qui est convenable puisque 2 est un nombre premier.
Solution exercice 2
#include<stdio.h>
#include<stdlib.h>
int main()
{
int p,i,pr;
printf("Donnez un entier:\n");
scanf("%d",&p);
if(p==0 || p==1) printf("%d n'est pas premier.\n",p);
else
{
pr=1;
for(i=2;i<p;i++)
{
if(p%i==0) {pr=0; break; }
}
if(pr==1) printf("%d est premier.\n",p);
else printf("%d n'est pas premier.\n",p);
}
system("pause");
return 0;
}