IUP 2 Octobre 99

Correction TP INFORMATIQUE N° 2

Aujourd'hui vous allez essayer de vous débrouiller seuls. Je vous fournirai au fur et à mesure des corrections. Mais vous pouvez toujours me poser des questions en cas de problème.

  1. Ecrire un programme demandant deux nombres entiers (par scanf), puis qui calcule leur somme et l'affiche. (programme très simple)
    #include <stdio.h>
    void main(void)
     {
     float n1,n2,res;
     printf("premier nombre ?");
     scanf("%f",&n1);
     printf("second nombre ?");
     scanf("%f",&n2);
     res=n1+n2;
     printf("le résultat vaut %f\n",res);
     }
  2. Améliorer le programme pour qu'il sache traiter les 4 opérations . On demandera le premier nombre, puis le signe opératoire que l'on stockera dans une variable de type char, puis on demandera le second nombre.
  3. #include <stdio.h>
    void main(void)
     {
     float n1,n2,res;
     char signe;
     printf("premier nombre ?");
     scanf("%f",&n1);
     printf("signe opératoire ?");
     fflush(stdin); /* vide la mémoire du clavier, qui contient le caractère 
                      "Entrée" que vous avez appuyé après la saisie de n1 */
     signe=getche(); /* évite de valider par entrée */
     printf("second nombre ?");
     scanf("%f",&n2);
     if(signe=='+')res=n1+n2;
     else if(signe=='-')res=n1-n2;
     else if(signe=='*')res=n1*n2;
     else if(signe=='/')res=n1/n2;
     else printf("signe non conforme\n");
    switch (signe)
     {
     case '+':res=n1+n2;break;
     case '-':res=n1-n2;break;
     case '*':res=n1*n2;break;
     case '/':res=n1/n2;break;
     default: printf("non conforme\n");
     }
     printf("le résultat vaut %f\n",res);
     }
    
    
  4. On veut maintenant faire une suite d'opérations : par exemple on veut entrer 5 * 3 (le programme affiche 15) puis + 2 (le programme affiche 17), etc jusqu'à ce qu'on donne le signe opératoire = qui termine le programme
  5. #include <stdio.h>
    void main(void)
     {
     float n2,res;
     char signe;
     printf("premier nombre ?");
     scanf("%f",&res);
     do
      {
      printf("signe opératoire ?");
      fflush(stdin); 
      signe=getche(); 
      if(signe!='=')
       {
       printf("prochain nombre ?");
       scanf("%f",&n2);
       if(signe=='+')res+=n2;
       else if(signe=='-')res-=n2;
       else if(signe=='*')res*=n2;
       else if(signe=='/')res/=n2;
       else printf("signe non conforme\n"); 
       printf("résultat intermédiaire : %f\n",res);
      }
     }
     while(signe!='=');
     printf("le résultat vaut %f\n",res);
     }
    
  6. Les plus inspirés d'entre vous peuvent tenter de rajouter des parenthèses, mais c'est plus compliqué. Si vous vous limitez à un seul niveau de parenthèses (pas d'imbrications) il suffit de prévoir une variable supplémentaire pour stocker le résultat intermédiaire.
#include <stdio.h>
// je suis obligé de protoyper au moins la fonction calculer
char lire_un_signe(void);
float lire_un_nb(void);
float calculer(void);

char lire_un_signe(void)
 {
  //lit un signe, qui devrait être +, -, *, /, (, ) ou =
  char s;
  do scanf("%c",&s); while (s<=' ');  //on élimine les blancs et return
  return(s);
 }

float lire_un_nb(void)
 {
 float n;
 int nb;
 char c;
 nb=scanf("%f",&n);
 if(nb==0) //on n'a pas pu lire ça ne peut être que ( ou une erreur
  {
  c=lire_un_signe();  //c vaut '(' sauf si erreur dans l'équation
  if(c!='(')printf("erreur dans vos parenthèses !!!\n");
  n=calculer();    //on calcule jusqu'à la prochaine )
  }
 return(n);
}

float calculer(void)
{
 float res,n2;
 char signe;
 res=lire_un_nb();
 do
  {
  signe=lire_un_signe();
  if(signe=='+'||signe=='*'||signe=='-'||signe=='/')
   {
   n2=lire_un_nb();
   if(signe=='+')res+=n2;
   else if(signe=='-')res-=n2;
   else if(signe=='*')res*=n2;
   else if(signe=='/')res/=n2;
   }
  }
 while(signe!='='&&signe!=')');
 return(res);
}

void main(void)
 {
 float res;
 printf("entrez votre équation, terminée par = (sur une ou plusieurs 
                          lignes)\n");
 printf("vous pouvez utiliser des parenthèses (bien appairées) et des 
                          nombres signés\n");
 printf("exemple : (2*(-1))+(-1*-3)*(1/(4*0.5))+1)  (doit donner 1.5)\n?");
 res=calculer();
 printf("le résultat vaut %f\n",res);
}

retour au sommaire des travaux pratiques d'informatique.


P. TRAU, ULP-IPST, 115/12/99