Accueil > > > UNE CALCULATRICE TRAITANT LES CARACTÈRES....
UNE CALCULATRICE TRAITANT LES CARACTÈRES....
Information sur la source
Description
C'est une calculatrice que j'ai récuperer de chez wrox, un livre nommé visual c++, de monsieur Horton Ivor, et je m'en suis servit pour traiter des opération mathématique simple. La fonction traite les parenthèses, ça aide ^^. Je n'ai pas touché au char... je ne les ai pas traduit en TCHAR, mais elle fonctionne quand meme. ;)
Source
- // maDLL.cpp : définit les fonctions exportées pour l'application DLL.
- //
-
- #include "stdafx.h"
-
- // Programme créant une calculatrice
- //#include <iostream> // Pour le flot entré sortie
- #include <cstdlib> // Pour la fonction exit()
- #include <cctype> // Pour la fonction isdigit()
- using namespace std;
-
- const int MAX = 255;
-
- void eatspace(char * str);
- double expr(char* str); // fonction évaluant une expression arithmétique
- double term(char* str, int& index); // Fonction extrayant la valeur d'un terme
- double number(char* str, int& index); // fonction reconnaissant un nombre dans une chaine
- char* extract(char* str, int& index); // Fonction extrayant une sous-chaine entre parenthèse
-
- extern "C" __declspec(dllexport) double __stdcall calcul(char* buffer)
- {
- // char* buffer = {0}; //Zone de stockage de l'expression
- //strcpy_s(buffer,sizeof(texte),texte);
- for(;;)
- {
- eatspace(buffer);
- if(!buffer[0])
- return 0;
- return expr(buffer);
- }
- }
-
- char* extract(char* str, int& index)
- {
- char buffer[MAX]; // Espace temporaire pour une sous chaine
- char* pstr = 0; // Pointeur désignant la nouvelle chaine à retourner
- int numL = 0; // Nombre de parenthèse gauche
- int bufindex = index; // Enregistre la valeur de début de l'index
- do
- {
- buffer[index - bufindex] = *(str + index);
- switch(buffer[index - bufindex])
- {
- case ')':
- if(numL == 0)
- {
- buffer[index - bufindex] = '\0'; // Remplacd ')' par '\0'
- ++index;
- pstr = new char[index - bufindex];
- if(!pstr)
- {
- //cout << "Erreur d'allocation de mémoire,"
- // << " programme terminé.";
- exit(1);
- }
- strcpy_s(pstr,sizeof(buffer), buffer); // Copy la sous chaine dans la nouvelle mémoire..
- return pstr;
- }
- else
- numL--;
- break;
-
- case '(': numL ++;break; // Augmente le nombre de ( à égaliser
- }
- } while(*(str + index++) != '\0'); // Boucle - ne pas dépasser la fin de la chaine
-
- exit(1);
- return pstr;
- }
-
- void eatspace(char * str)
- {// cout << "\nentrée de eatspace\n";
-
- int j = 0; // index source de la chaine
- int i = 0; // index cible de la chaine
-
-
- while((*(str + i) = *(str + j++)) != '\0')
-
- if(*(str + i) != ' ')
- i++;
- // cout << "\nsorti de eatspace\n";
-
- return;
- }
-
-
- //fonction reconnaissant un nombre dans une chaine
- // ou une expression entre parenthèse
- double number(char* str, int& index)
- {
- double value = 0.0; // Stock la valeur résultante
- //cout << "\nentrée de number\n";
- if(*(str + index) == '(') // Début des parenthèse
- {
- char* psubstr = 0; // Pointeur de sous chaine
- psubstr = extract(str, ++index); // Extrait la sous-chaine entre parenthèse
- value = expr(psubstr); // Extrait la valeur de la sous chaine
- delete[] psubstr; // Nettoie le tas
- return value;
- }
- // Récupération de la partie entière du nombre
- while(isdigit(*(str + index))) //
- value = 10 * value + (*(str + index++) - 48);
-
- if((*(str + index) != '.')&&(*(str + index) != ','))
- return value;
-
- double factor = 1.0;
-
- // Récupération de la partie décimal du nombre
- while(isdigit(*(str + (++index))))
- {
- factor *= 0.1;
- value = value + (*(str +index) - 48)*factor;
- }
-
- return value;
-
- }
-
- // Fonction extrayant la valeur d'un terme
- double term(char* str, int& index)
- { //cout << "\nentré dans term\n";
- double value = 0.0; // Cumul du résultat
-
- value = number(str, index); //Extrai du 1er nombre du term
-
- // Itération tant que l'opérateur n'est pas aproprié
- while((*(str + index) == '*') || (*(str + index) == '/'))
- {
- if(*(str + index) == '*')
- value *= number(str, ++index);
-
- if(*(str + index) == '/')
- value /= number(str, ++index);
- }
- //cout << "\nsortie dans term\n";
- return value;
- }
-
- //fonction évaluant une expression arithmétique
- double expr(char* str)
- { //cout << "\nentré dans expr\n";
- double value = 0.0; // Stocke le résultat ici
- int index = 0; // Suit l'emplacement du caractère courant
- value = term(str, index); // Extrait le premier terme
-
- for(;;) // boucle infini
- {
- switch(*(str + index++)) // choisie l'opération à partir du caractère courant
- {
- case '\0': return value;
- case '+' : value += term(str, index); break;//
- case '-' : value -= term(str, index); break;//
- default :
- exit(1);
- }
- }
- // cout << "\nsorti de expression\n";
- }
// maDLL.cpp : définit les fonctions exportées pour l'application DLL.
//
#include "stdafx.h"
// Programme créant une calculatrice
//#include <iostream> // Pour le flot entré sortie
#include <cstdlib> // Pour la fonction exit()
#include <cctype> // Pour la fonction isdigit()
using namespace std;
const int MAX = 255;
void eatspace(char * str);
double expr(char* str); // fonction évaluant une expression arithmétique
double term(char* str, int& index); // Fonction extrayant la valeur d'un terme
double number(char* str, int& index); // fonction reconnaissant un nombre dans une chaine
char* extract(char* str, int& index); // Fonction extrayant une sous-chaine entre parenthèse
extern "C" __declspec(dllexport) double __stdcall calcul(char* buffer)
{
// char* buffer = {0}; //Zone de stockage de l'expression
//strcpy_s(buffer,sizeof(texte),texte);
for(;;)
{
eatspace(buffer);
if(!buffer[0])
return 0;
return expr(buffer);
}
}
char* extract(char* str, int& index)
{
char buffer[MAX]; // Espace temporaire pour une sous chaine
char* pstr = 0; // Pointeur désignant la nouvelle chaine à retourner
int numL = 0; // Nombre de parenthèse gauche
int bufindex = index; // Enregistre la valeur de début de l'index
do
{
buffer[index - bufindex] = *(str + index);
switch(buffer[index - bufindex])
{
case ')':
if(numL == 0)
{
buffer[index - bufindex] = '\0'; // Remplacd ')' par '\0'
++index;
pstr = new char[index - bufindex];
if(!pstr)
{
//cout << "Erreur d'allocation de mémoire,"
// << " programme terminé.";
exit(1);
}
strcpy_s(pstr,sizeof(buffer), buffer); // Copy la sous chaine dans la nouvelle mémoire..
return pstr;
}
else
numL--;
break;
case '(': numL ++;break; // Augmente le nombre de ( à égaliser
}
} while(*(str + index++) != '\0'); // Boucle - ne pas dépasser la fin de la chaine
exit(1);
return pstr;
}
void eatspace(char * str)
{// cout << "\nentrée de eatspace\n";
int j = 0; // index source de la chaine
int i = 0; // index cible de la chaine
while((*(str + i) = *(str + j++)) != '\0')
if(*(str + i) != ' ')
i++;
// cout << "\nsorti de eatspace\n";
return;
}
//fonction reconnaissant un nombre dans une chaine
// ou une expression entre parenthèse
double number(char* str, int& index)
{
double value = 0.0; // Stock la valeur résultante
//cout << "\nentrée de number\n";
if(*(str + index) == '(') // Début des parenthèse
{
char* psubstr = 0; // Pointeur de sous chaine
psubstr = extract(str, ++index); // Extrait la sous-chaine entre parenthèse
value = expr(psubstr); // Extrait la valeur de la sous chaine
delete[] psubstr; // Nettoie le tas
return value;
}
// Récupération de la partie entière du nombre
while(isdigit(*(str + index))) //
value = 10 * value + (*(str + index++) - 48);
if((*(str + index) != '.')&&(*(str + index) != ','))
return value;
double factor = 1.0;
// Récupération de la partie décimal du nombre
while(isdigit(*(str + (++index))))
{
factor *= 0.1;
value = value + (*(str +index) - 48)*factor;
}
return value;
}
// Fonction extrayant la valeur d'un terme
double term(char* str, int& index)
{ //cout << "\nentré dans term\n";
double value = 0.0; // Cumul du résultat
value = number(str, index); //Extrai du 1er nombre du term
// Itération tant que l'opérateur n'est pas aproprié
while((*(str + index) == '*') || (*(str + index) == '/'))
{
if(*(str + index) == '*')
value *= number(str, ++index);
if(*(str + index) == '/')
value /= number(str, ++index);
}
//cout << "\nsortie dans term\n";
return value;
}
//fonction évaluant une expression arithmétique
double expr(char* str)
{ //cout << "\nentré dans expr\n";
double value = 0.0; // Stocke le résultat ici
int index = 0; // Suit l'emplacement du caractère courant
value = term(str, index); // Extrait le premier terme
for(;;) // boucle infini
{
switch(*(str + index++)) // choisie l'opération à partir du caractère courant
{
case '\0': return value;
case '+' : value += term(str, index); break;//
case '-' : value -= term(str, index); break;//
default :
exit(1);
}
}
// cout << "\nsorti de expression\n";
}
Sources du même auteur
Sources de la même categorie
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
Calculatrice ms visual c++ [ par Fino ]
Bonjour,quelqu'un aurait-il le source d'une calculatrice faite avec ms visual c++ comme la calc.exe de ms dans windows.si oui pouvez m'en envoyer un e
Probleme d affichage [ par Scythale ]
Lorsque j'execute ce programme voici ce que dit mon compilateur(borland C++): you have accidentely use the old dummy version of OwlMain.Je n'arrive pa
calculatrice en c++ TRES URGENT!!! [ par zouz ]
Il faut que je réalise une calculatrice en programmation.Le fonctionnement est comparable à une calculatrice de poche tel que nous avons l'habitude d'
Une calculatrice en C++ sous windows [ par Juan-Marco ]
Bonjour à tousVoila mon premier post sur ce forums Je connais bien les boucles, les variables et les structures. Je connais un peut moins les classes.
calculatrice pour debutant en C [ par kwuy ]
j'ai ecrit une version de ma calculatrice mais je voudrais en faire une avec ligne de commande du genre : 12 + 5 - 4 *9 etc et avoir le resultatcommen
Calculatrice Win32 Borland OWL C++ 5.x [ par bobby03 ]
J'ai ajouté une barre menu, mais je suis incapable d'activer mon MessageBox À propos. Ça ajoute même une erreur sur le code existant qui fonctionne tr
Calculatrice Inverse Polonaise [ par vpieplu ]
J'ai un probleme. Je n'arrive pas a coder la calculatrice ... Je ne sais qu'elle commande mettre dans les fonctions + - * / Sin Inv Cos C'est super UR
calculatrice en C [ par a20syl92 ]
20sylsylnet@netcourrier.comBonjour,J'aimerais réaliser, en langage C, un logiciel capable d'évaluer des expressions arithmétiques, en respectant les p
Calculatrice (postfixé) : pb a l'execution [ par filipuce ]
Bonjourvoila g fé une petite calculatrice (+,-,*,/ avec parentheses)sous linux pas de probleme, compilation et execution.mais en retouranant sous wind
Une calculatrice en C... [ par vegetalain ]
bonjour.voila, je débute en C++ et c un vrai cauchemar... j'ai pris sur le net une source de calculatrice. y'a des fichier ".c" et ".h" et aussi des f
|
Derniers Blogs
IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc REACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITERREACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITER par Groc
Une mauvaise utilisation de rx lors de l'écriture d'une couche d'accès à des services peut conduire à des cas embarassants avec des erreurs mal gérées, des appels qui ne partent lorsqu'ils le devraient, et même des résultats incorrects . le tout nuis...
Cliquez pour lire la suite de l'article par Groc SHAREPOINT BLOG SITE, PROBLèME D'ARCHIVESSHAREPOINT BLOG SITE, PROBLèME D'ARCHIVES par junarnoalg
Dernièrement, nous avons migré le site
myTIC
vers un nouveau serveur SharePoint 2010. Dans les contenus que nous vouloins récupérer, nous avions un certain nombre de blogs.
Nous avons utilisé les commandes Power...
Cliquez pour lire la suite de l'article par junarnoalg
Forum
MATRICE TEMPLATEMATRICE TEMPLATE par hjr2610
Cliquez pour lire la suite par hjr2610 RE : SAC A DOS RE : SAC A DOS par hadjkaddour
Cliquez pour lire la suite par hadjkaddour
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|