Calculer 2 char,et retourner le res en char

Fermé
toto - 20 nov. 2008 à 17:41
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 22 nov. 2008 à 11:42
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

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
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 lundi 21 janvier 2008 Statut Membre Dernière intervention 6 mars 2012 131
20 nov. 2008 à 20:06
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
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 samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 840
20 nov. 2008 à 21:18
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 lundi 21 janvier 2008 Statut Membre Dernière intervention 6 mars 2012 131
20 nov. 2008 à 22:13
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 samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 840
20 nov. 2008 à 22:18
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 lundi 21 janvier 2008 Statut Membre Dernière intervention 6 mars 2012 131 > fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022
20 nov. 2008 à 22:30
En effet, je ne connaissais pas, merci,
0
Merci a tous ! je vais essayer ça !
0
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 jeudi 1 novembre 2007 Statut Membre Dernière intervention 16 août 2010 436
21 nov. 2008 à 17:42
tu peux utiliser sprintf
char resul[255];
sprintf(resul,"%d",resultat);
printf("%s",resul);
0
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 jeudi 1 novembre 2007 Statut Membre Dernière intervention 16 août 2010 436
21 nov. 2008 à 17:54
ben... tu remplaces le printf par
return resul;
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 840
21 nov. 2008 à 18:17
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
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 samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 840
21 nov. 2008 à 23:46
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 jeudi 1 novembre 2007 Statut Membre Dernière intervention 16 août 2010 436
22 nov. 2008 à 01:14
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
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
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 samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 840
22 nov. 2008 à 11:42
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