Lecture

Résolu
Bonjour,

Voilà pour un exercice de cours, je dois réussir à trouver l'opération à faire à partir d'un calcul en chaîne de caractères. Ex: quand j'écris 7/2 - 3/5 , le programme doit reconnaître le signe - et me sortir le résultat : 29/10

2 réponses

Résumé de la discussion

Le défi central consiste à lire une expression mathématique sous forme de chaîne de caractères, comme 3/2+4/2, et à en déduire le résultat en fractions, idéalement simplifié. Plusieurs contributions promeuvent des approches variées: concevoir un parseur qui identifie numérateur, dénominateur et opérateur, effectue les opérations arithmétiques et simplifie la fraction via le PGCD. Des échanges abordent aussi la gestion du buffer, la distinction entre char et chaîne, et des détails pratiques comme l’utilisation de scanf et l’emploi des pointeurs pour lire et traiter l’expression en une étape.

Bobot (l’IA à votre service)
  1. Contributeur
    Bonjour,

    Oui, tu as posé l'énoncé. Maintenant, faudrait que tu nous fasses part de ta réflexion ? Ou que tu nous dises ce que tu ne comprends pas ou ne parviens pas à faire ? N'hésite pas à nous montrer ce que tu as commencé à faire et dis-nous où tu bloques.

    Petite réflexion au passage : l'exemple vient de l'énoncé où de toi ? Ca sera nécessairement des fractions ? Cela peut-être d'autres signes ?

    Cdlt,
    0
    1. int main(){

      int num1;
      int den1;
      int num2;
      int den2;
      char frac;

      printf("Bienvenue\n");

      printf("veuillez entrer la premiere fraction :\n");
      scanf("%d%c%d", &num1,&frac,&den1);

      printf("veuillez entrer la deuxieme fraction :\n");
      scanf("%d%c%d", &num2,&frac,&den2);

      /*Variables*/
      int numero = 0;
      int x;
      int y;

      /*Menu de séléction*/

      printf("|****************************|\n");
      printf("|************Menu************|\n");
      printf("|****************************|\n");

      printf("\n");

      printf("1: Additionner les fractions\n");
      printf("2: Soustraire les fractions\n");
      printf("3: Multiplier les fractions\n");
      printf("4: Diviser les fractions\n");
      printf("\n");
      printf("Veuillez saisir l operation souhaitee :");
      scanf("%d",&numero);

      while (numero > 4 || numero < 1){
      printf("\nErreur\nEntrer un numero parmis les choix du menu : ");
      scanf("%d",&numero);
      }

      printf("\n");

      /*code*/

      int div;
      if (numero ==1){
      x=(num1*den2)+(den1*num2);
      y=(den2*den1);
      for (div = 2; div <=x && div <=y; div++){
      while((x % div == 0) && (y %div == 0)){
      x = x/div;
      y = y/div;
      }
      }
      printf("resultat: %d/%d", x,y);
      }else{
      if (numero ==2){
      x=(num1*den2)-(den1*num2);
      y=(den2*den1);
      for (div = 2; div <=x && div <=y; div++){
      while((x % div == 0) && (y %div == 0)){
      x = x/div;
      y = y/div;
      }
      }
      printf("resultat: %d/%d", x,y);
      }else{
      if (numero ==3){
      x=(num1*num2);
      y=(den1*den2);
      for (div = 2; div <=x && div <=y; div++){
      while((x % div == 0) && (y %div == 0)){
      x = x/div;
      y = y/div;
      }
      }
      printf("resultat: %d/%d", x,y);
      }else{
      if (numero ==4){
      x=(num1*den2);
      y=(num2*den1);
      for (div = 2; div <=x && div <=y; div++){
      while((x % div == 0) && (y %div == 0)){
      x = x/div;
      y = y/div;
      }
      }
      printf("resultat: %d/%d", x,y);
      }
      }
      }

      }
      system("PAUSE");
      return 0;
      }
      0
      1. voila fiddy, ca c'est le code que j'ai pour l'instant.

        un code simple qui demande à l'utilisateur d'entrer la première fraction puis la deuxième et de choisir l'opération à faire, de plus ca me donne le résultat simplifié

        Mais ce que je veux moi, c'est que j'entre en une fois le calcul (ex: 3/2+4/2) et le programme doit pouvoir lire cette chaine de caractères et me donner le résultat que ce soit addition, soustraction, multiplication ou division
        0
      2. Contributeur
        Bien compliqué ce code et peu lisible. Je te conseille l'utilisation de fonctions : multiplication(), division(), addition(), soustraction() acceptant chacun les 4 nombres (2 numérateurs et 2 dénominateurs) et 1 couple numérateur/dénominateur pour le résultat que tu passes en pointeur.

        Du coup, cela peut donner :

        #include...
        
        void addition(int ...) {
             ...
        }
        ...
        
        int main(void) {
             int num1, denum1;
             int num2, denum2;
             int num3, denum3;
             char op;
             int ret;
        
             ret=scanf("%d/%d%c%d/%d",&num1, &denum1,&op, ...);
             if (ret == 5) {
                   switch(op) {
                       case '+':
                            addition(num1, ..., &num3, &denum3);
                            break;
                       case '-':
                             ...
                        ...
                  }
             }
                  printf("=%d/%d\n", ...);
             return 0;
        }
        

        A noter qu'il ne faut pas d'espaces dans la saisie sinon cela ne fonctionnera pas.

        Merci la prochaine fois d'utiliser la balise "<code c>".
        Exemple d'utilisation :
        <"code c">
        ici tu mets ton code
        <"/code">
        (à mettre sans les guillemets)
        Cdlt,
        0
      3. salut fiddy, j'ai essayer comme tu me l'a expliqué mais j'ai des erreurs.

        Pourrais-tu jeter un coup d'oeil ?
        0
      4. void addition(int den1,int den2,int num1,int num2,int y,int x ) {

        x=(num1*den2)+(den1*num2);
        y=(den2*den1);

        for (div = 2; div <=x && div <=y; div++){
        while((x % div == 0) && (y %div == 0)){
        x = x/div;
        y = y/div;
        }
        }
        }

        void soustraction(int den1,int den2,int num1,int num2,int y,int x ) {

        x=(num1*den2)-(den1*num2);
        y=(den2*den1);

        for (div = 2; div <=x && div <=y; div++){
        while((x % div == 0) && (y %div == 0)){
        x = x/div;
        y = y/div;
        }
        }
        }

        void multiplication(int den1,int den2,int num1,int num2,int y,int x ) {

        x=(num1*num2);
        y=(den1*den2);

        for (div = 2; div <=x && div <=y; div++){
        while((x % div == 0) && (y %div == 0)){
        x = x/div;
        y = y/div;
        }
        }
        }

        void division(int den1,int den2,int num1,int num2,int y,int x ) {

        x=(num1*den2);
        y=(num2*den1);

        for (div = 2; div <=x && div <=y; div++){
        while((x % div == 0) && (y %div == 0)){
        x = x/div;
        y = y/div;
        }
        }
        }

        int main(void) {
        int num1, den1;
        int num2, den2;
        int num3, den3;
        char op;
        int ret;
        int x, y;

        printf("Veuillez entrer votre calcul: \n");
        ret=scanf("%d/%d%c%d/%d",&num1, &den1,&op,&num2, &den2);
        if (ret == 5) {
        switch(op) {
        case '+':
        addition();
        break;
        case '-':
        soustraction(num1, den1,op, num2, den2);
        break;
        case '*':
        multiplication(num1, den1,op, num2, den2);
        break;
        case '/':
        division(num1, den1,op, num2, den2);
        break;
        }

        }
        printf("=%d/%d\n",x,y);
        return 0;
        }
        0
      5. Contributeur
        Heureusement que j'ai précisé :
        "Merci la prochaine fois d'utiliser la balise "<code c>".
        Exemple d'utilisation :
        <"code c">
        ici tu mets ton code
        <"/code">
        (à mettre sans les guillemets)"...

        void addition(int den1,int den2,int num1,int num2,int y,int x ) {
        Tu as oublié de mettre les pointeurs (relis mon post).
        Même remarque pour le)s autres fonctions.

        Je te conseille également de faire une fonction pour la simplification de la fraction. Ca sera plus lisible et facilitera la maintenance (ça t'évitera de récrire ce bloc dans toutes les fonctions...).
        0