IUP2 TP programmation info n2

Solution du dernier exercice du 1er TP :

  #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";
  }

Résumé sur les formes de base des structures de contrôle :

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 :

utilisation de rand et srand

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.


Proposition de solution :

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";
     }


TP3 retour sommaire C++ TP1

(c) P. TRAU IPST - ULP