Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 31/03/2007, à 01:21

soucous

calculatrice de grands nombres en C

bonjour a tous!

voila je me lance. Je veux realiser un programme capable d'afficher le resultat de l'evaluation d'une expression arithmetique composee d'entiers de taille infinie exprimes dans un base quelconque
Ce programme traite les operateurs suivant : +, - , *, /, %. mais aussi les parentheses en gerant les priorites et les erreurs de syntaxte.

quelques exemples pour fixer le tout:

soucous@zombie$ ./exe
soucous@zombie$ ./exe "2-4" 0123456789 "()+-*/%" 3
-2$
soucous@zombie$ ./exe "--++-4(3)" 0123456789 "()+-*/%" 9
error$
soucous@zombie$ ./exe "--++-4*3" 0123456789 "()+-*/%" 9
-12
soucous@zombie$ ./exe "-(9-(3*22))" 0123456789 "()+-*/%" 11
57
soucous@zombie$ ./exe "-(9-(3*22)" 0123456789 "()+-*/%" 10
error$
soucous@zombie$ ./exe "-(@-(;*\!@))" ~^@\!;i&[] "()+-*/%" 12
^^$

quelques eclaircissements ne feront pas de mal

--->0123456789 : represente la base(peut etre n'importe quelle base dec, oct,bin hexa, ou
meme ^%$$#$ ou encore @!$#$~)

--->()*-+/% : sont les differents operateurs.

--->le dernier element : represente le nombre de caracteres dans l'expression a evaluer
exple: soucous@zombie$ ./exe "2-4" 0123456789 "()+-*/%" 3
on a 2-4 qui representent 3 caracteres.


Si quelqu'un a une idee je suis preneur.
Merci.

Hors ligne

#2 Le 31/03/2007, à 01:55

best_friend_fr

Re : calculatrice de grands nombres en C

Salut

En gros, il y a 2 facons de faire une calculatrice:
1) la calculatrice RPN, très simple. Elle consiste en une notation suffixe (l'opérateur vient après les opérande). Ainsi, ici, au lieu de mettre 2-4, tu mets 2 4 -
Cette notation permet de s'affranchir des parenthèses (tu parce qu'elle gère intrinsèquement les priorités), et se réalise en implémentant une pile. Lorsqu'on trouve un nombre, on le met sur la pile, lorsqu'on trouve un opérateur, on prend les 2 éléments du dessus de la pile, on applique l'opérateur, et on met le résultat sur la pile.

2) la calculatrice classique est beaucoup plus compliquée à faire, pour la simple raison qu'elle est ambigue. Que vaut par exemple
5-3-2 ? est-ce 0=(5-3)-2 ou 4=5-(3-2). Et surtout, pour la théorie, elle ne se met pas sous la forme d'une grammaire linéaire droite ou gauche.
Autrement dit, tu auras besoin d'outils plus poussés tels que l'analyse lexicale et syntaxique, pour construire l'arbre de ton opération. Des outils tels que Lex et Yacc peuvent t'aider, ou dans ce cas pas trop compliqué, ca peut se faire à la main. Faire une analyse lexicale et syntaxique te vérifiera du meme coup la syntaxe

Ensuite, ce que je ne comprends pas:
- ce qu'est la base ^%$$#$ (trois fois le meme signe pour 3 chiffres différents?)
- Autant je concois que tu puisse entrer les différents chiffres (puisqu'on peut noter le 0 ^ si ca nous chante), mais pour les opérateurs, que signifierait par exemple
./calc "2-4" 0123456789 "()-+/*%" 3

Autres points:
- Je te conseille de mettre tabase entre ", surtout si tu y mets des symboles exotiques
- le dernier chiffre est inutile, puisque une chaine de caractères se termine par le caractère \0.
- Il va aussi falloir réfléchir à comment tu fais tes opérations sur les strings... Une solution consisterait à representer les entiers en base 2^32, dans une liste, et à faire les opération avec ca. Mais c'est pas évident (surtout la division)

Bon courage

Dernière modification par best_friend_fr (Le 31/03/2007, à 01:57)


sudo apt-get replace langage_sms by grammaire orthographe ponctuation
La documentation est avant tout faite pour ceux qui posent les questions, et non ceux qui y répondent
Best_friend_fr

Hors ligne

#3 Le 31/03/2007, à 11:32

soucous

Re : calculatrice de grands nombres en C

"En gros, il y a 2 facons de faire une calculatrice:
1) la calculatrice RPN, très simple. Elle consiste en une notation suffixe (l'opérateur vient après les opérande). Ainsi, ici, au lieu de mettre 2-4, tu mets 2 4 -
Cette notation permet de s'affranchir des parenthèses (tu parce qu'elle gère intrinsèquement les priorités), et se réalise en implémentant une pile. Lorsqu'on trouve un nombre, on le met sur la pile, lorsqu'on trouve un opérateur, on prend les 2 éléments du dessus de la pile, on applique l'opérateur, et on met le résultat sur la pile."

--> oui mais seulement elle doit etre executee de la maniere dont c'est indique sans en changer un iota..


"Ensuite, ce que je ne comprends pas:
- ce qu'est la base ^%$$#$ (trois fois le meme signe pour 3 chiffres différents?)
- Autant je concois que tu puisse entrer les différents chiffres (puisqu'on peut noter le 0 ^ si ca nous chante),"

--> c vrai la j'avais mal recopie desole c'etait plutot quelque chose du genre ~^@\!;i &[]

"mais pour les opérateurs, que signifierait par exemple
./calc "2-4" 0123456789 "()-+/*%" 3"

--> 2-4 :represente l'expression a evaluer
--> 0123456789 : represente la base vers laquelle le resulta sera traduit
--> ()-+*% : ce sont les differents operateurs qui peuvent etre utiliser dans l'expression.
-->notes: ces operateurs,( (), -, +, *, /) il faut le noter au passage, figureront toujours dans la ligne de
-->commande si expression il y'a lieu. Je te renvoi au premier exple ou tu ne les verra pas puisqu' on
-->a pas dans ce cas, specifier l'expresion a evaluer

"Autres points:
- Je te conseille de mettre tabase entre ", surtout si tu y mets des symboles exotiques"

-->j'aurai bien aime mais...En fait je t'ai pas tout dit: c'est un autre programme qui se chargera de corriger.
-->il effectuera les test de la sorte donc s'il y'a un iota de change c'est foutu !!!


---> Assez parler je crois que le mieux c'est que je poste le sujet.
Tiens, le voici !!!




SUJET
---------
   

Il s'agit d'écrire un programme capable d'afficher le résultat de l'évaluation d'une expression
   

arithmetique composée d'entiers de taille infinie exprimés dans une base quelconque.


   

Ce programme traite les opérateurs suivant: "+-*/%", ainsi que les parenthèses. '(' ')'.


   

Il géra les priorités et les erreurs de syntaxe. L'ensemble des opérations est fait sur des entiers : 3/4*4=0.



DÉTAILS TECHNIQUES:
   

- Un "main.c" et un "compute.h" sont donnés dans la partie annexe.
   

Il vous reste à coder la fonction evalexpr.
   

- En cas d'erreur de syntaxe, le programme affiche la chaîne de caractères définie par la macro SYNTAXE_ERROR_MSG
   

qui se trouve dans compute.h.
   

- Vous ne pouvez utiliser que les fonctions : putchar, malloc, free
   
- Il devra y avoir un Makefile avec les règles suivantes:

    clean
       

    : elle devra effacer l'exécutable et les .o.

    all
       

    : crée l'exécutable.

- L'exécutable doit s'appeller : 'digital' et se trouver dans le répertoire principal.

Exemple :

(user@host h)echo  | ./digital   
(user@host h)echo "3+6" | ./digital 0123456789 "()+-*/%" 3

(user@host h)echo "--++-6(12)" | ./digital 0123456789 "()+-*/%" 10
syntax error
(user@host h)echo "--++-6*12" | ./digital 0123456789 "()+-*/%" 9 | cat -e
-72$
(user@host h)echo "-(12-(4*32))" | ./digital 0123456789 "()+-*/%" 12 | cat -e
116$
(user@host h)
(user@host h)echo "-(12-(4*32)"  | ./digital 0123456789 "()+-*/%" 11 | cat -e
syntax error
(user@host h)
(user@host h)echo "-( @-(;*\!@))"  | ./digital "~^@\!;i &[]" "()+-*/%" 13 | cat -e
^^ $
(user@host h)echo "-(12*(13+15/5*(6/(12+14%(30%5+(10*25)-46)+16)-20)/43)*20)*(-(12-98*42)*(16+63-50/3))"  | ./digital "0123456789" "()+-*/%" 85 | cat -e
-744629760

(user@host h)

ANNEXES :

(user@host h)cat main.c
/*
** main.c for compute .
*/

#include "compute.h"

static void     check_base(char *base);
static void     check_ops(char *ops);
static char     *get_expr(unsigned size);

int             main(int ac,char **av)
{
  char          *expr;
  unsigned int  size;

  if

Hors ligne

#4 Le 31/03/2007, à 12:04

JoelS

Re : calculatrice de grands nombres en C

Je ne sais pas ce que tu peut faire, mais ça http://gmplib.org/#WHAT ça peut t'aider éventuellement.

Hors ligne

#5 Le 31/03/2007, à 12:43

Watchwolf

Re : calculatrice de grands nombres en C

Utilise un arbre big_smile

Hors ligne

#6 Le 31/03/2007, à 12:53

best_friend_fr

Re : calculatrice de grands nombres en C

Salut

Je pense que le plus simple est l'analyse lexicale et syntaxique. C'est fait pour ca.

Je ne comprends toujours pas l'intéret des opérateurs, puisque tu mets toujours la meme chaine...

ensuite, tu vois bien que

(user@host h)echo "-( @-(;*\!@))"  | ./digital "~^@\!;i &[]" "()+-*/%" 13 | cat -e

il met des guillemets autour des symboles ce qui est logique, sinon, bash interprète les symboles.


sudo apt-get replace langage_sms by grammaire orthographe ponctuation
La documentation est avant tout faite pour ceux qui posent les questions, et non ceux qui y répondent
Best_friend_fr

Hors ligne

#7 Le 31/03/2007, à 14:25

soucous

Re : calculatrice de grands nombres en C

A mon avis le resultat doit tenir sur un char * ce qui nous permettrait de passer outre les limitation de taille int, double ou autre. cela permettrait de faire les calculs sur des nombres enormes exple pour nbr1 :

7381783781737173109381038183098198390189380919031830981098301803
1313183871737193719893898090902924729408490809284098029840280802
2446829429849249020840820984092809840928094809289048208409820984
2429482974987298749827897298748927487829797487287428789798787484
3333333333333333333333333333335566666666666666666677689990986242
2425808537153810138084045415804671805408148174681640271806425045
1649150412504875746106471608576056760656014780606506165618656165
5458751785451745877167841246724612786476874681624876287468764726
1547865187467814961046871284264782678462764768264662746872648726

et pareil pour nbr2

Hors ligne

#8 Le 31/03/2007, à 14:51

best_friend_fr

Re : calculatrice de grands nombres en C

Ben oui, c'est sur
mais ca veut dire que tu redéfinis tous tes opérateurs pour des chaines... et c'est pas forcément évident


sudo apt-get replace langage_sms by grammaire orthographe ponctuation
La documentation est avant tout faite pour ceux qui posent les questions, et non ceux qui y répondent
Best_friend_fr

Hors ligne

#9 Le 02/04/2007, à 22:41

soucous

Re : calculatrice de grands nombres en C

salut
j'aimerais faire des calculs (addition, multiplication, division, soustraction) dans l'expression a evaluer (par exemple "3+6" ou "-(12-(4*32))" ) en partant du code ascii de chaque caractere numerique.
Seulement voila je ne sais pas par quelle methode arriver a le faire puisque cette expression constitue un char * dans lequel on a une serie de caracteres differents.
Quelqu'un peut-il m'aider?

Hors ligne

#10 Le 02/04/2007, à 22:44

best_friend_fr

Re : calculatrice de grands nombres en C

étant donné que tes caractères peuvent valoir n'importe quoi, je vois mal comment tu peux faire autrement qu'une boucle pour associer chaque symboleà sa valeur.


sudo apt-get replace langage_sms by grammaire orthographe ponctuation
La documentation est avant tout faite pour ceux qui posent les questions, et non ceux qui y répondent
Best_friend_fr

Hors ligne

#11 Le 02/04/2007, à 23:46

soucous

Re : calculatrice de grands nombres en C

salut Best_friend_fr
j'avous que je ne vois pas trop comment utiliser cette boucle.
pourrais - tu eclaircir un peu avec 1 petit exemple?

Hors ligne

#12 Le 02/04/2007, à 23:49

best_friend_fr

Re : calculatrice de grands nombres en C

Quand tu utilises cet exemple

echo "-( @-(;*\!@))"  | ./digital "~^@\!;i &[]" "()+-*/%" 13 | cat -e
il faut que pour chaque élément de "-( @-(;*\!@))" tu regarde la valeur trouvée dans ~^@\!;i &[]"


sudo apt-get replace langage_sms by grammaire orthographe ponctuation
La documentation est avant tout faite pour ceux qui posent les questions, et non ceux qui y répondent
Best_friend_fr

Hors ligne

#13 Le 03/04/2007, à 00:20

soucous

Re : calculatrice de grands nombres en C

merci.
je vais réfléchir à cela et te recontacter.

Hors ligne

#14 Le 03/04/2007, à 07:35

sullivanveres

Re : calculatrice de grands nombres en C

dis moi soucous tu ne voudrais pas entrer a epitech par hazard ?
le nom de cette jolie chose est bistromatique ;-)

ps : ou epita ....

Dernière modification par sullivanveres (Le 03/04/2007, à 07:38)


man 42...

Hors ligne

#15 Le 03/04/2007, à 09:46

soucous

Re : calculatrice de grands nombres en C

t'as tout vu sullivanveres. j'essai de trouver un peu d'aide pou resoudre ce mystere

Hors ligne

#16 Le 03/04/2007, à 10:15

soucous

Re : calculatrice de grands nombres en C

tiens !
sullivanveres toi qui a sûrement eu à subir ce supplice
tu peux certainement m'être d'une grande aide.

Hors ligne

#17 Le 03/04/2007, à 10:36

sullivanveres

Re : calculatrice de grands nombres en C

bah ecoute commence par parser tes parentheses essaie de les supprimer, ensuite tu cree un parseur pour tes operateurs, tu les met dans l'ordre de priorite et puis voilou... bon courage !!

Sinon, pti indice tu peux rechercher, pour mettre ta suite d'operation en notation polonaise inversee.. (pti google feras l'affaire...)

ps : plus serieusement, n'essaies pas de faire les projets en avance... cay mal, amuse toi a faire autre chose, car en realite, on va te noter sur ta capacite a faire un projet dans le temps qu'on te donne, donc si tu sais deja par coeur comment on fait ca ne srt plus a rien, et puis la bistromatique par exemple, est un projet en groupe...So as u like..

Dernière modification par sullivanveres (Le 03/04/2007, à 10:45)


man 42...

Hors ligne

#18 Le 05/04/2007, à 11:23

soucous

Re : calculatrice de grands nombres en C

en fait sullivanveres, mon intention n'était pas de parcoeuriser tout cela.
Bon je t'explique:

en fait j'aimerais entrer à Epitech l'année prochaine et je me suis mis dans
la tête de faire des recherches afin d'appréhender au mieux ma future probable
école.Et là justement je suis tombé sur cet exercice.

Vu que j'avais quelques notions en programmation C je me suis lancer là dessus
pour essayer de résoudre cet exercice qui me semblait intéressant(chose qu'aurait à priori fait tout mordu de programmation j'imagine).

Bon d'un autre coté tu es un ancien de là bas et certainement tu sais de quoi tu
parles...
Voilà je vais être sage et suivre ton conseil.

Toutefois merci à tous, et un
grand merci à best_friend_fr pour ces mails.
Salut.

Hors ligne