Calculer 2 char,et retourner le res en char

toto -  
fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,
Je sais que ce sujet a du etre traiter, mais je ne trouve pas de solution adapaté a mon probleme. Voila ce que je veux faire :

J'ai 2 caracteres et un operateur, c1 et c2 et op, et si ce sont des entiers (par exemple c1='3' et c2='6'), et par exemple op='*', alors je voudrais calculer c1*c2 et avoir le résultat sous la forme d'un char, et non d'un entier, tel que
char resultat = '18'

J'ai vu beaucoup d'exmples multiples avec atoi ou sscanf, mais je ne trouve pas de solution qui me plaisent, ou en tout cas je n'arrive pas a écrire correctement le code adequate !
C'est pourquoi je me tourne vers vous, si vous pouvez m'aider ...
Cordialement
Tom
Configuration: Windows XP
Firefox 3.0.4

16 réponses

  1. othanga
     
    hello !
    chuis pas fortiche en C et consorts mais ce que tu cherches à faire ne peut l'être qu'avec un sélecteur (switch) sur ton opérateur qui t'oblige à un truc du genre

    selon op
    si '+' : resultat = to_char(to_num(c1) + to_num(c2))
    si '-' : resultat = to_char(to_num(c1) - to_num(c2))
    si '*' : resultat = to_char(to_num(c1) * to_num(c2))
    si '/' : resultat = to_char(to_num(c1) / to_num(c2))
    sinon raise 'opérateur non supporté'
    fin_selon

    l'autre voie aurait été de disposer de macros avec lesquelles tu a la possibilité d'exécuter le code contenu dans une chaine
    => str = "a = c1 " + op + " c2"
    => exec str
    => result = to_char(a)
    manque de bol, ces mécanismes existaient surtout dans les langages interprétés comme palliatif à leurs limitations
    0
  2. toto
     
    ce que je cherche justement c'est le code exacte en C, avec les bonnes fonctions, parsque l'algo je l'ai c'est pas compliqué ... mais j'arrive pas a l'appliquer correctement en C ... si vous pouvez m'aider svp ...
    0
  3. cchristian Messages postés 928 Statut Membre 131
     
    Bonsoir,

    On peut faire un truc comme ça, mais tu es limité à la valeur +127 avec un char.

    char aa = 'A';             // Tels que t'arrivent les caractères ?
    printf ("\n %i\n", aa);
    65
    
    char cc = int (aa) + 62;              // par exemple.
    printf ("\n %i", cc);
    127
    
     cc = int (aa) + 63;
    printf ("\n %i", cc);
    -128                                // A partir de là ça coince ...............
    
    cc = int (aa) + 64;
    printf ("\n %i", cc);
    -127                    
    cc = int (aa) + 65;
    printf ("\n %i", cc);
    -126
    
     cc = int (aa) + 66;
    printf ("................);
    --
    Cordialement.

    Cchristian.
    0
  4. toto
     
    Bonsoir,
    merci de m'aider c'est gentil. ce que je veux reelement faire en gros c'est additioner ou multiplier 2 char qu auraient comme valeur un chiffre,donc par exemple faire ça :
    char nb1 = '3'
    char nb2 = '4'
    char resultat = nb1 * nb2 = '18'

    Comment faire les conversions ?
    merci d'avance !
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
     
    Salut
    Teste :
    #include <stdio.h>
    #include <stdlib.h>
    
    int main(void){
        char *a="6";
        char *b="3";
        char op='*';
        char p[15];
        int res;
        switch(op){
            case '+':res=strtol(a,NULL,10)+strtol(b,NULL,10);break;
            case '-':res=strtol(a,NULL,10)-strtol(b,NULL,10);break;
            case '*':res=strtol(a,NULL,10)*strtol(b,NULL,10);break;
            case '/':res=strtol(a,NULL,10)/strtol(b,NULL,10);break;
        }
    
        sprintf(p,"%d",res);
        printf("%s\n",p);
        return 0;
    }
    

    Il y a peut-être des étourderies, j'ai pas testé ;)
    Cdlt
    0
  7. cchristian Messages postés 928 Statut Membre 131
     
    Bonsoir,

    En effet je n'avais pas compris, j'espère que c'est mieux maintenant :

              char   nb1          =   '3';
              char   nb2          =   '6';
              char   oper         =   '*';
    signed int     pos_nb1    =   -1;
    signed int     pos_nb2    =   -1;
             int      ind_nb      =    0;
    
             char TAB_VAL [10] = {'0','1','2','3','4','5','6','7','8','9' };
    
        pos_nb1                          =  -1                                     ;
        pos_nb2                          =  -1                                     ;
    
        for ( ind_nb  =  0;    ind_nb < 10;   ind_nb++ ) 
           {
            if ( TAB_VAL [ind_nb]       ==     nb1 ) { pos_nb1   =   ind_nb ;}
            if ( TAB_VAL [ind_nb]       ==     nb2 ) { pos_nb2   =   ind_nb  ;}
           }
        if  ( pos_nb1 == -1             ||     pos_nb2 == -1 )
          {  printf ("\n Anomalie valeur(s) incohérentes nb1: %c :   nb2 : %c\n",
                            nb1, nb2)      ;}
        else
          { 
            switch (oper) {
                case '*':   printf ("\n\n Resultat pos_nb1 * pos_nb2 : %i\n",
                                         pos_nb1 * pos_nb2) ; break     ;
                case '+':   printf ("\n\n Resultat pos_nb1 + pos_nb2 : %i\n",
                                       pos_nb1 + pos_nb2) ; break      ;
                case '-':    printf ("\n\n Resultat pos_nb1 - pos_nb2 : %i\n",
                                        pos_nb1 + pos_nb2) ; break      ;
                case '/':   printf ("\n\n Resultat pos_nb1 / pos_nb2 : %i\n",
                                       pos_nb1 / pos_nb2); break     ;
                              }
          }
    
    0
    1. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
       
      Pour convertir un simple char en int, ya plus simple que faire une boucle avec un tableau ;)
      char a='5';
      int nb;
      if (a>='0' && a<='9') nb=a-'0';
      

      0
      1. cchristian Messages postés 928 Statut Membre 131 > fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention  
         
        En effet, je ne connaissais pas, merci,
        0
  8. toto
     
    re bonjour,
    j'ai testé divers fonctions, et sa marche, a part que cela ne me renvoi pas un char ...

    en fait j'ai bien réussi a transformer mes 2 char en int,et aprés calcul, je voudrais par contre retransformer en char mon résultat (qui est un int).
    Merci si vous pouvez m'aider !
    0
  9. mype Messages postés 2459 Date d'inscription   Statut Membre Dernière intervention   437
     
    tu peux utiliser sprintf
    char resul[255];
    sprintf(resul,"%d",resultat);
    printf("%s",resul);
    0
  10. toto
     
    oui mais moi je veux retourner le résultat en fait, pas l'afficher.
    faire un
    return resultat
    mais avec resultat prealablement converti en char.

    Comment faire ?
    merci de m'aider !
    0
  11. mype Messages postés 2459 Date d'inscription   Statut Membre Dernière intervention   437
     
    ben... tu remplaces le printf par
    return resul;
    0
  12. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
     
    C'est trop restrictif. Un char, tu pourras juste mettre un chiffre inférieur à '9'.
    Prends plutôt une chaîne de caractère : "12"+"15"="27". Là tu peux mettre plusieurs chiffres.
    Apparemment t'as pas testé ma fonction plus haute. Je te la redonne, essaie là au moins. Ca répond exactement à ce que tu demandes.

    #include <stdio.h>
    #include <stdlib.h>
    
    int main(void){
        char *a="6";
        char *b="3";
        char op='*';
        char p[15];
        int res;
        switch(op){
            case '+':res=strtol(a,NULL,10)+strtol(b,NULL,10);break;
            case '-':res=strtol(a,NULL,10)-strtol(b,NULL,10);break;
            case '*':res=strtol(a,NULL,10)*strtol(b,NULL,10);break;
            case '/':res=strtol(a,NULL,10)/strtol(b,NULL,10);break;
        }
    
        sprintf(p,"%d",res);
        //p contient le résultat
        printf("%s\n",p);
        return 0;
    }
    
    Cdlt
    

    0
  13. toto
     
    Non parsque moi je veux retourner un char, le resultat, et non l'afficher ... et mype, le return resul ne marche pas, il me dit "return makes integer from pointer without a cast" ...
    0
    1. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
       
      Ce que tu comprends pas, c'est que dans ta question initiale :
      char resultat = '18' C'est impossible en C. Un char, c'est juste un byte. '18' c'est deux bytes.
      Donc, il te faut impérativement passer par un tableau de char.
      0
    2. mype Messages postés 2459 Date d'inscription   Statut Membre Dernière intervention   437
       
      c'est clair fiddy te la bien expliqué il te faut un char *
      ça doit etre parce que dans l'en tete de ta fonction tu as pas mis que tu retourne un char *
      poste ton code
      0
  14. toto
     
    Voila mon code :

    char simplifierArith(char c1,char c2, char op) {
    int resultat;
    char resul[255];
    int nb1,nb2;
    if(c1>='0' && c1<='9')
    nb1=c1-'0';
    if(c2>='0' && c2<='9')
    nb2=c2-'0';

    switch(op) {
    case '+':resultat=nb1+nb2;break;
    case '-':resultat=nb1-nb2;break;
    case '*':resultat=nb1*nb2;break;
    case '/':resultat=nb1/nb2;break;
    case '^':resultat=nb1^nb2;break;
    }
    sprintf(resul,"%d",resultat);
    return resul;
    }

    Voila ... le pb c'est que cette fonction se trouve dans un trés gros programme, et je n epeux retourner q'un char, pas un char * ... donc en gros jsui coincé c'est ça ? mais sa devrait fonctionné si resul n'avait qu'un chiffre non ?
    Merci de m'adier.
    0
  15. toto
     
    Ok en fait c'est bon ça marche si le résultat n'est pas un nombre, donc si resultat<9 ... pour le reste jsui coincé parsque si je change tout mes char en char* dans le programme ça risque de tout faire planter ...
    0
  16. fiddy Messages postés 441 Date d'inscription   Statut Contributeur Dernière intervention   1 847
     
    Salut,
    Tu as mis dans ton code l'opérateur ^, j'espère que tu ne penses pas que c'est l'opérateur puissance ;)
    Sinon oui, en effet tu es bloqué. Le char se code sur un byte. Toutes les opérations que tu dois faire seront sur un byte. Donc, le plus grand chiffre que tu pourras atteindre est '9'.
    Si c'est bien ça que tu veux. L'algorithme est encore plus simple.
    char a='1';
    char op='+';
    char b='2';
    char res;
    switch(op){
       case '+': res= '0'+(a-'0')+(b-'0');break;
       case '-': res= '0'+(a-'0')-(b-'0');break;
       case '*': res= '0'+(a-'0')*(b-'0');break;
       case '/': res= '0'+(a-'0')/(b-'0');break;
    }
    printf("%c\n",res);
    

    Cdlt
    0