Calculer 2 char,et retourner le res en char

toto -  
fiddy Messages postés 11069 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
A voir également:

16 réponses

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
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
cchristian Messages postés 921 Date d'inscription   Statut Membre Dernière intervention   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
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
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
cchristian Messages postés 921 Date d'inscription   Statut Membre Dernière intervention   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
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
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
cchristian Messages postés 921 Date d'inscription   Statut Membre Dernière intervention   131 > fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention  
 
En effet, je ne connaissais pas, merci,
0
toto
 
Merci a tous ! je vais essayer ça !
0
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
mype Messages postés 2435 Date d'inscription   Statut Membre Dernière intervention   437
 
tu peux utiliser sprintf
char resul[255];
sprintf(resul,"%d",resultat);
printf("%s",resul);
0
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
mype Messages postés 2435 Date d'inscription   Statut Membre Dernière intervention   437
 
ben... tu remplaces le printf par
return resul;
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
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
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
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
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
mype Messages postés 2435 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
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
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
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
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