2017-03-25 2 views
-2

Pourquoi les réponses aux sections d'addition et de multiplication de ce code sont-elles erronées?Ajout et multiplication Langage C

#include <stdio.h> 
#include <stdlib.h> 

int main() 
{ 
    char x, y, z; 
    printf("Enter the calculation: "); 
    scanf("%c %c %c", &x, &y, &z); 

    int a = (int)x; 
    int b = (int)z; 
} 

Le problème est ici:

if(y == '+'){ 
    printf("The answer is %d", a+b); 
} 

Et ici:

else if(y == '*'){ 
     printf("The answer is %d", a*b); 
    } 
    else{ 
      printf("Use only +, -, /, * signs"); 
    } 
    return 0; 
} 
+2

Quelle est la valeur de 'x' et' z'? Ne sont-ils pas des personnages? Donc, si vous utilisez un débogueur, vous pouvez rapidement trouver la réponse. Apprendre à utiliser un débogueur; Ça vaut la peine! (Autres utilisateurs: laissez-le comprendre pour qu'il apprenne.) –

+0

En général, décrivez ce qui se passe lorsque vous exécutez le programme - quelle est la «mauvaise réponse» qu'il donne? – Svaberg

Répondre

1

Les valeurs de caractères x, y, z sont des caractères ASCII non des chiffres. En ASCII, les chiffres 0 à 9 sont représentés par les caractères '0' à '9' consécutivement. La valeur int du caractère '0' est 48 en décimal, le caractère '1' est 49, et ainsi de suite. Tapez "man ascii" à partir d'une invite linux pour voir la liste complète des caractères ASCII. Donc, pour convertir un '0' en valeur int, soustrayez '0' et vous obtenez 0. Parce que les caractères sont consécutifs dans la table ASCII, cela fonctionne pour les 10 caractères ASCII numériques (ceci est pas d'accident, il a été conçu de cette façon). Notez comme David le fait remarquer: Bien qu'il existe d'autres codages en dehors de l'ASCII, tous les encodages exigent que les caractères numériques soient consécutifs, donc cette mathématique à convertir en entiers fonctionne toujours.

Donc, si vous avez un char c qui est char numérique de « 0 » à « 9 », vous pouvez obtenir la valeur numérique à l'aide

int i = C - '0'; 

Vos valeurs pour un et b tort, vous convertissez la valeur de caractères ASCII à un int en utilisant un plâtre, mais vous devez le convertir en soustrayant la valeur du caractère « 0 »:

#include <stdio.h> 
#include <stdlib.h> 

int main() 
{ 
char x, y, z; 
printf("Enter the calculation: "); 
scanf("%c %c %c", &x, &y, &z); 

// Convert ASCII char to int by subtracting value of char '0' 
int a = x - '0'; 
int b = z - '0'; 

if (y == '+') { 
    printf("The answer is %d", a+b); 
} 
else if(y == '*') { 
    printf("The answer is %d", a*b); 
    } 
else { 
    printf("Use only +, -, /, * signs"); 
    } 
return 0; 
} 

pour convertir des chaînes à ints, nous e la fonction atoi() mentionné dans ce post here:

char *myString = "1234"; 
    int myIntVal = atoi(myString); 

Ceci est un double de https://stackoverflow.com/a/868508/6693299

0

Les valeurs de x et z sont des valeurs entières dépendant de l'implémentation, pas nécessairement des valeurs ASCII. Pourtant, il est requis par la norme que les valeurs de '0' à '9' être en séquence, donc une solution consiste à modifier à:

int a = x - '0'; 
int b = z - '0'; 

Une autre possibilité est d'utiliser la fonction atoi() (ou mieux, la fonction strtol(), qui ajoute la vérification des erreurs capacités) et littéraux composés pour former des chaînes de caractères d'entrée:

int a = atoi((char []){x, '\0'}); 
int b = atoi((char []){z, '\0'}); 
2

tout d'abord comprendre que vous utilisez des variables de caractère pour prendre l'entrée d'utilisateur, puis les typecasting en entier des variables. Cette typecasting aboutira à la valeur du code ASCII du caractère à copier dans ces variables entières. Donc, même si vous entrez l'entrée 3 + 2, x contiendra la valeur 51 (code ASCII) et z contiendra la valeur 50 (code ASCII) et la réponse sera 101, ce qui, selon le code, est correct. Pour les codes ASCII, référez-vous à http://ascii.cl/ Aussi, il semble y avoir une petite erreur dans votre code (cela peut dépendre du compilateur utilisé.) J'utilise Turbo C++ qui m'a donné une erreur pour la déclaration de variable après toute autre opération comme printf dans ce code. Cas).

#include <stdio.h> 
#include <stdlib.h> 



int main() 
{ 
char x, y, z; 
int a; 
int b; 


printf("Enter the calculation: "); 
scanf("%c %c %c", &x, &y, &z); 

a=(int) x; 
b=(int) z; 

if(y == '+'){ 
printf("The answer is %d", a+b); 
    } 
else if(y == '*'){ 
    printf("The answer is %d", a*b); 
    } 
else{ 
    printf("Use only +, -, /, * signs"); 
    } 

return 0; 
} 

Ce code fonctionne correctement. Si vous voulez toujours garder le même code, faites-le simplement.

int a = x - '0'; 

Cela fonctionnera.

+1

La norme n'exige pas que le jeu de caractères d'exécution soit codé en ASCII, et le codage n'est en fait pas toujours ASCII. Mais, les valeurs des caractères de '' 0 '' à '' 9 '' sont nécessaires pour former une séquence continue, de sorte que 'a = x - '0' est un moyen fiable d'obtenir la valeur représentée par' x ', quel que soit le codage utilisé. –