#include <iostream.h> int main(void) { float debut,somme,solde; int i,nb; cout<<"solde initial ?"; cin>>debut; cout<<"mouvement ?"; cin>>somme; cout<<"nombre de mouvements ?"; cin>>nb; solde=debut; for(i=0;i<nb;i++) solde=solde+somme; cout<<"solde final : "<<solde<<" (au lieu de "<<debut+somme*nb<<")\n"; }
A) boucles (répéter une instruction généralement finie par « ; », ou un bloc de plusieurs instructions entre accolades)
Si l'on connaît le nombre de boucles (ici variable entière nb) :
for (i=0;i<nb;i++) instruction
Sinon, si quoi qu'il arrive il faut faire au moins une fois l'instruction (tant que la condition est vraie) :
do instruction while (condition);
sinon (toujours tant que la condition est vraie, si elle est fausse au début l'instruction n'est même pas faite une seule fois) :
while (condition) do instruction
B) tests
Si la condition est vraie, on fait l'instruction puis on passe à la suite, sinon on passe directement à la suite :
if (condition) instruction
Si la condition est vraie, on fait l'instruction1, sinon l'instruction2. Puis on passe à la suite :
if (condition) instruction1 else instruction 2
Suivant la condition, une seule instruction est effectuée :
if (condition_1) instruction_1 else if (condition_2) instruction_2 //ici condition_1 est nécessairement fausse ... etc ... //ici condition_1 et condition_2 sont fausses else instruction_n //si aucune condition précédente n'est vérifiée
C) les conditions utilisent les comparaisons (<, <=, >, >=, != (différent), == (égal)) et des opérateurs booléens (&& (et), | | (ou), ! (non)). Exemple : if ((x>=0)&&(x<10)) signifie : si x dans [0,10[
Premier exercice (tests) : Un problème physique se modélise par l'équation ax2+bx+c=0. Trouvez toutes les solutions (réelles), quelles que soient les valeurs a,b,c proposées par l'utilisateur. Si, pour la compilation, il faut inclure la librairie mathématique :
g++ prog.cpp -lm -o prog
Second exercice (boucles) : recherche d'une racine positive de ax3+bx2+cx+d=0. Attention, ce n'est pas la bonne méthode, ce problème est uniquement posé pour vous faire travailler les boucles. On cherche d'abord à encadrer la première racine positive (f(x) change de signe) par pas de 1 (si on arrive à 10000 on abandonne). Puis dans un second temps on restreint l'encadrement de moitié jusqu'à ce qu'on ait une précision de 10-3 (dichotomie).
Dernier exercice (boucles et tests) : Le but est d'approfondir les structures de contrôle. Pour cela, l'ordinateur va nous faire jouer au plus ou moins : il va choisir un nombre, nous allons tenter de le découvrir. Pour faire choisir un nombre aléatoire par l'ordinateur, il faut entrer ce programme :
Evidement, trouver la solution en un seul essai est assez peu probable. Il faudrait poser plusieurs fois la question (jusqu'à ce qu'on propose la bonne valeur). Pour nous aider, le programme devra nous dire, à chaque proposition, si notre nombre est trop grand ou trop petit. Prévenez moi quand ça fonctionne !
S'il reste du temps, améliorez ce jeu. Nous comparerons et classerons vos programmes à la fin de la séance ! Ajoutez, dans l'ordre :
A) à la fin du jeu, indiquez le nombre d'essais tentés.
B) En fonction de ce nombre d'essais, donnez une appréciation différente (au moins 3 : bravo / pas mal / pas trop tôt).
C) Vérifiez si les propositions sont cohérentes avec les indications données précédemment (lui signaler qu'il est idiot de proposer 18 alors qu'à la proposition du nombre 25 on lui avait dit qu'il était trop petit).
D) Au cours du jeu, donnez de temps en temps des encouragements (pas toujours dans le même ordre, au hasard mais aussi en fonction de la précision de la proposition).
E) Toute autre amélioration qui vous semble possible, ou amusante.
Pour une version pdf cliquez ici.
1) résolution de ax2 + bx + c dans TOUS les cas
#include <iostream.h> #include <math.h> /* pour sqrt, la racine carrée */ int main (void) { float a,b,c; float delta,r1,r2; cout<<"résolution de ax2 + bx + c \n"; cout<<"entrez la valeur de a : "; cin>>a; cout<<"entrez la valeur de b : "; cin>>b; cout<<"entrez la valeur de c : "; cin>>c; if (a==0) /* sinon diviser par 2*a risque de poser problème */ { if (b!=0) cout<<"une racine simple x="<<-c/b<<"\n"; else if (c==0) cout<<"il y a une infinité de solutions à Ox=0\n"; else cout<<"aucune solution à l'équation "<<c<<"=0\n"; } else { delta=b*b-4*a*c; /* b*b : c'est comme cela qu'on calcule un carré */ if (delta==0) cout<<"une racine double : "<<-b/(2*a)<<"\n"; else if (delta<0) cout<<"aucune racine réelle (mais complexes)\n"; else { r1=(-b-sqrt(delta))/(2*a); r2=(-b+sqrt(delta))/(2*a); cout<<"il y a 2 racines réelles : x1="<<r1<<" et x2="<<r2<<"\n"; } } }
2) recherche d'une racine positive de ax3+bx2+cx+d=0
#include<iostream.h> #include<math.h> #include<stdlib.h> #define f(x) (a*(x)*(x)*(x)+b*(x)*(x)+c*(x)+d) int main(void) { float a, b, c, d,x,f0,gauche,droite,y; cout<<"ax3+bx2+cx+d=0"; cout<<"\nEntrez la valeur de a ?"; cin>>a; cout<<"\nEntrez la valeur de b ?"; cin>>b; cout<<"\nEntrez la valeur de c ?"; cin>>c; cout<<"\nEntrez la valeur de d ?"; cin>>d; f0=f(0); x=1; while(f(x)*f0>0 && x<10000) x+=1; if(x==10000) {cout<<"pas de solution\n"; exit(0);} cout<<"la solution est comprise entre "<<x-1<<" et "<<x<<"\n"; gauche=x-1; droite=x; do { x= (gauche+droite)/2; if ((f0*f(x))<0) droite=x; else gauche=x; } while ((droite-gauche)>0.001) ; cout<<"la solution est comprise entre "<<gauche<<" et "<<droite<<"\n"; }
3) jeu du plus ou moins
#include <iostream.h> #include <stdlib.h> #include <time.h> int main (void) { int nbatrouver,proposition,compteur=0; int min=1,max=100; cout<<"Vous devez deviner un nombre entre "<<min<<" et "<<max<<"\n"; srand(time(NULL)); nbatrouver=(rand()%(max+1))+min; do { compteur++; cout<<"entrez votre proposition :"; cin>>proposition; if(proposition<nbatrouver) if(proposition>min) { cout<<"trop petit\n"; min=proposition; } else cout<<"donnée incohérente\n"; else if(proposition!=nbatrouver) if(proposition<max) { cout<<"trop grand\n"; max=proposition; } else cout<<"donnée incohérente\n"; } while (proposition!=nbatrouver); cout<<"gagné en "<<compteur<<" essais\n"; if (compteur<2)cout<<"tricheur !\n"; else if (compteur<5)cout<<"bravo\n"; else if (compteur<10)cout<<"pas mal\n"; else cout<<"plutôt nul\n"; }
(c) P. TRAU IPST - ULP