Calculatrice à reconnaissance de caractères

Soyez le premier à donner votre avis sur cette source.

Vue 4 418 fois - Téléchargée 308 fois

Description

Voici une calculatrice un peu spéciale, elle analyse une expression (par exemple "2+2" dans un tableau et la découpe pour pouvoir la calculer...

Source / Exemple :


#include <stdio.h>
#include <windows.h> // juste pour system()

#define LEN 256

// fonction qui vérifie la présence d'un opérateur dans un tableau
char check_op(char buff[LEN]){
    char op;
    int i, x=0;
    for(i=0; buff[i] != '\0'; i++){
        switch(buff[i]){
            case '+':
                op = '+';
                x++;
                break;
            case '-':
                op = '-';
                x++;
                break;
            case '/':
                op = '/';
                x++;
                break;
            case '*':
                op = '*';
                x++;
                break;
        }
    }
    if(x > 1){
        printf("Expression non valide !\n");
        system("pause");
        exit(1);
    }
    else
        return op;
}

/*
    fonction qui extraie les opérandes d'une expression
    nb : numéro de l'opérande à renvoyer (1 ou 2)
    op : caractère de l'opérateur (+-/*)

  • /
int oper(int nb, char buff[LEN], char op){ int i, x=0; int oper1=0, oper2=0; char tmp1[LEN]; char tmp2[LEN]; memset(tmp2,NULL,sizeof(tmp2)); for(i=0; buff[i] != op; i++){ sprintf(tmp1, "%c", buff[i]); strcat(tmp2, tmp1); } oper1 = atoi(tmp2); //atoi() convertit char en int memset(tmp2,NULL,sizeof(tmp2)); for(i+=1; buff[i] != '\0'; i++){ sprintf(tmp1, "%c", buff[i]); strcat(tmp2, tmp1); } oper2 = atoi(tmp2); memset(tmp2,NULL,sizeof(tmp2)); if(nb == 1) return oper1; if(nb == 2) return oper2; else { system("pause"); exit(1); } } // fonction qui effectue l'opération entre 2 opérandes et 1 opérateur int calcul(int oper1, int oper2, char op){ int result = 0; switch(op){ case '+': result = oper1 + oper2; break; case '-': result = oper1 - oper2; break; case '/': result = oper1 / oper2; break; case '*': result = oper1 * oper2; break; default: printf("Opérateur non valide"); exit(1); } return result; } // fonction principale de gestion des fonctions int main(){ // déclaration des 5 variables utilisées pour découper l'expression char op; int oper1, oper2, result; char expression[LEN]; // on check l'expression printf("Entrez une expression :\n"); scanf("%s", &expression); // on l'analyse printf("Analyse de l'expression : "); op = check_op(expression); oper1 = oper(1, expression, op); oper2 = oper(2, expression, op); // on calcule le résultat et on l'affiche si la syntaxe est ok result = calcul(oper1, oper2, op); printf("Ok !\n"); printf("Resultat : %d\n\n", result); system("pause"); return 0; }

Conclusion :


Pour l'instant, seule 2 opérandes sont gérée et seulement les entiers sont pris en compte.
Désolé pour ces détails, j'ai écris ça en 30 min et ça ne demande qu'à etre amélioré par la suite :)

Codes Sources

A voir également

Ajouter un commentaire Commentaires
Messages postés
1138
Date d'inscription
mardi 10 juin 2003
Statut
Membre
Dernière intervention
25 janvier 2009
3
Effectivement je suis en C
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
/* Define NULL pointer value */

#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
#endif

en fait on avait tous les 2 raison, ca dépend si c'est en c ou en c++...
Messages postés
46
Date d'inscription
mercredi 5 mai 2004
Statut
Membre
Dernière intervention
13 novembre 2004

autant pour moi :)

merci
Messages postés
1138
Date d'inscription
mardi 10 juin 2003
Statut
Membre
Dernière intervention
25 janvier 2009
3
Pour vos gouvernes :
aller cherche a quoi correspond NULL et vous trouverez :
#define NULL ((void *)0)

donc c'est 0 mais caster comme un pointeur, donc ce n'est pas le nombre 0 maos l'adresse 0.

donc NULL est un pointeurs !!!

(>>vecchio56 et presonnellement pour un pointeur je mets toujours NULL, car apres les codes est plus comprehensible, mais ca c'est toi qui voit)
Messages postés
46
Date d'inscription
mercredi 5 mai 2004
Statut
Membre
Dernière intervention
13 novembre 2004

ouais remarque, NULL est un symbole et non un pointeur...
Afficher les 12 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.