IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Calculatrice Scientifique en C


Sujet :

C

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 66
    Par défaut Calculatrice Scientifique en C
    Bonjour tout le monde,

    Je travaille sur l'écriture d'une calculatrice simple fonctionnant de la manière suivante :

    - Je déclare PI comme une constante
    - Je souhaite que les 4 opérations élémentaire sur entier soit dans unique fichier source et que les 4 opération élémentaire sur flottant soit dans un autre fichier source
    - enfin les 2 opération racine carré et puissance seront toute deux dans un autre fichier source

    Mon problème se situe au niveau des opération sur entier et sur flottant car je n'arrive pas à trouver une méthode me permettant de tester l'entrée clavier pour savoir de quel type de donnée il s'agit.

    Voici mon avancement actuel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    // programme d'une calculatrice scientifique
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    //#include <int_op.h>
    //#include <float_op.h>
    //#include <others_op.h>
     
    #define PI 3.1415
     
    void typtest(int,float,char *);
    long nb =0;
     
    int main(void)
    {
     
    long op,nb1 = 0,nb2 = 0,resultat = 0;
    int i = 0; float x = 0; char pi[3];
    	printf("Calculatrice Scientifique\n\n\r");
    	printf("Choisissez l'operation a effectuer:\n\n");
    		printf("1.Addition:\n");
    		printf("2.Soustraction:\n");
    		printf("3.Multiplication:\n");
    		printf("4.Division:\n");
    		printf("5.racine carre de :\n");
    		printf("6.Puissance :\n");
    		scanf("%ld",&op);
     
    		switch(op)
    		{
    		case 1:
    			printf("Entrez le premier nombre:\n\r");
    			printf("Pour  PI(= 3.1415) taper : pi \n\r");
    			scanf("%d%f%*s",&i,&x,&pi);
    			typtest(i,x,pi);
     
    			printf("Entrez le deuxieme nombre:\n\r");
    			printf("Pour  PI(=3.1415) taper : 2\n\r");
    			scanf("%d%f%*s",&i,&x,&pi);
    			typtest(i,x,pi);
     
    				break;
    		case 2:
    			printf("Entrez le premier nombre:\n\r");
    			scanf("%ld",&nb1);
    			printf("Entrez le deuxieme nombre:\n\r");
    			scanf("%ld",&nb2);
     
    			resultat = nb1 - nb2;
    			printf("%ld - %ld = %ld \n\r",nb1,nb2,resultat);
    				break;
    		case 3:
    			printf("Entrez le premier nombre:\n\r");
    			scanf("%ld",&nb1);
    			printf("Entrez le deuxieme nombre:\n\r");
    			scanf("%ld",&nb2);
     
    			resultat = nb1 * nb2;
    			printf("%ld * %ld = %ld \n\r",nb1,nb2,resultat);
    				break;
    		case 4:
    			printf("Entrez le premier nombre:\n\r");
    			scanf("%ld",&nb1);
    			printf("Entrez le deuxieme nombre:\n\r");
    			scanf("%ld",&nb2);
     
    			resultat = nb1 / nb2;
    			printf("%ld / %ld = %ld \n\r",nb1,nb2,resultat);
    				break;
    		}
    		return 0;
    }
     
    void typtest(int a, float b,char *c)
    {	
     
     	if(a !=0 ){
    	 	printf("nombre entier : %d\n",a);
    	 	return(nb = a);
    	 	}
     
    	else if(b != 0){
    	 	printf("nombre flottant : %f\n",b);
    	 	return (nb = b);
    	 	}
     
    	else if(c != 0){
    		printf("pi(3.1415)");
    		nb = 3.1415;
    		return (nb = 3.1415);
    		}
     
    }
    A la compilation j'ai 5 warning :

    calc_scientifique.c: In function ‘main’:
    calc_scientifique.c:35: warning: too many arguments for format
    calc_scientifique.c:40: warning: too many arguments for format
    calc_scientifique.c: In function ‘typtest’:
    calc_scientifique.c:80: warning: ‘return’ with a value, in function returning void
    calc_scientifique.c:85: warning: ‘return’ with a value, in function returning void
    calc_scientifique.c:91: warning: ‘return’ with a value, in function returning void


    Pourriez vous me guidez sur une piste éventuel ?
    Merci
    Cordialement.

  2. #2
    Membre émérite
    Avatar de Pouet_forever
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    671
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 671
    Par défaut
    Il faut voir ce que tu as mis dans tes scanf. Le formateur %s sert à récupérer une chaîne de caractères, mais l'étoile sert à sauter le formateur qui suit.
    Par exemple, ce code ne récupèrera que le 1er et le 3ème nombre saisi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #include <stdio.h>
    #include <stdlib.h>
     
    int main(void) {
      int a, b;
      scanf("%d%*d%d", &a, &b);
      printf("%d %d", a, b);
      return EXIT_SUCCESS;
    }

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 66
    Par défaut
    Je pensait récupérer la chaine de caractère "pi" taper sur le clavier, en claire ce que je souhaite réaliser c'est :

    1) tester la saisie pour savoir de quel type de donnée il s'agit
    2) ouvrir le fichier source correspondant à l'opération a effectuer
    3) effectuer l'opération et l'afficher

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 840
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par makia42 Voir le message
    2) ouvrir le fichier source correspondant à l'opération a effectuer
    Quel fichier source ? De quoi tu parles ? Qu'est donc sensé contenir ce fichier si je choisis "1 - Addition" ???
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 66
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Quel fichier source ? De quoi tu parles ? Qu'est donc sensé contenir ce fichier si je choisis "1 - Addition" ???
    Salut,

    Je parle du fichier qui contiendra les opérations en fonction du type de donnée( entier ou flottant) comme j'ai précisé dans mon premier post , je veux en faite réaliser plusieurs fichier ".h" pour les opérations.

    Si tu choisis 1 et que la donnée est un entier par exemple , le fichier "int_op.h" contiendra les opérations sur des entier simples.

    Si tu choisis 1 et que tu rentre une valeur décimale alors le fichier "flot_op.h" se chargera d'effectuer l'opération car il contient les opérations sur flottant.

    Voila, j’espère me faire comprendre ^^?

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    euh... tu ne vas pas tout recompiler à chaque fois que tu veux changer de type de données ?

    Il te suffit de faire des fonctions, les unes pour gérer les entiers, les autres pour gérer les nombres à virgule.

  7. #7
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Pour moi, une ligne à taper par l'utilisateur serait par exemple
    2+3 [Enter]
    6/5 [Enter] (résultat 1 parce que 6 est un entier)
    6.0/5 [Enter] (résultat 1.2 parce que 6 est un flottant)
    Donc, première étape détecter l'opérateur,
    deuxième étape, isoler les 2 opérandes et détecter si ce sont des entiers ou des flottants, pi ou PI étant un cas particulier à traiter
    troisième étape effectuer l'opération,
    quatrième étape retourner et afficher le résultat.
    Je pense que quand tout ceci aura été bien décrit, la traduction en C viendra toute seule.

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 66
    Par défaut
    Citation Envoyé par jeroman Voir le message
    euh... tu ne vas pas tout recompiler à chaque fois que tu veux changer de type de données ?

    Il te suffit de faire des fonctions, les unes pour gérer les entiers, les autres pour gérer les nombres à virgule.
    En effet je ne vais pas tout recompiler mais utiliser la compilation séparée sous linux (makefile).

    Bonjour,
    Pour moi, une ligne à taper par l'utilisateur serait par exemple
    2+3 [Enter]
    6/5 [Enter] (résultat 1 parce que 6 est un entier)
    6.0/5 [Enter] (résultat 1.2 parce que 6 est un flottant)
    Donc, première étape détecter l'opérateur,
    deuxième étape, isoler les 2 opérandes et détecter si ce sont des entiers ou des flottants, pi ou PI étant un cas particulier à traiter
    troisième étape effectuer l'opération,
    quatrième étape retourner et afficher le résultat.
    Je pense que quand tout ceci aura été bien décrit, la traduction en C viendra toute seule.
    Ta solution me semble être la seule en ce qui concerne lé détection des deux opérandes mais pour ce qui de la première étape je ne pensais pas procéder comme toi mais plutot proposer un choix d'opérateur puis en fonction du choix lire dans tel ou tel fichier opérateur !

    Est-ce forcément une mauvaise idée?

    Encore une petite question pour ce qui est de la détéction je n'ai qu'a récupérer la saisie sous forme de string que je découpe en fonction du caractère '.' , si j'ai bien compris?

    Merci encore pour toutes vos réponses !

  9. #9
    Invité
    Invité(e)
    Par défaut
    En effet je ne vais pas tout recompiler mais utiliser la compilation séparée sous linux (makefile).
    Ca c'est une mauvaise idée. Quand on fait un programme, dans la limite des hypothèses, on envisage tous les cas. Au bous du compte, il n'y a qu'un seul exécutable.

    Est-ce forcément une mauvaise idée?
    OUI et OUI.
    Imaginez que sur votre calculette, vous deviez taper d'abord la touche correspondant à l'opération que vous voulez faire, puis le premier opérande puis le second.

    Le principe pour ce genre de chose est de lire la ligne complète. Puis de la décoder avec la fonction sscanf(const char *tampon, const char *format, adresse, ...);
    La fonction sscanf est très puissante. De plus il est généralement conseillé de l'utiliser après la lecture de la ligne, plutôt que d'utiliser scanf() en lisant le fichier input.
    Le chois entre int et flottant fait-il partie des hypothèses, sinon, il n'y a pas lieu de faire la distinction. Toutes les calculettes donneront 6/5=1.2

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 66
    Par défaut
    Citation Envoyé par Pierre Dolez Voir le message
    Ca c'est une mauvaise idée. Quand on fait un programme, dans la limite des hypothèses, on envisage tous les cas. Au bous du compte, il n'y a qu'un seul exécutable.

    OUI et OUI.
    Imaginez que sur votre calculette, vous deviez taper d'abord la touche correspondant à l'opération que vous voulez faire, puis le premier opérande puis le second.

    Le principe pour ce genre de chose est de lire la ligne complète. Puis de la décoder avec la fonction sscanf(const char *tampon, const char *format, adresse, ...);
    La fonction sscanf est très puissante. De plus il est généralement conseillé de l'utiliser après la lecture de la ligne, plutôt que d'utiliser scanf() en lisant le fichier input.
    Le chois entre int et flottant fait-il partie des hypothèses, sinon, il n'y a pas lieu de faire la distinction. Toutes les calculettes donneront 6/5=1.2
    Effectivement c'est plus logique d'avoir à entrer la ligne complète ^^(même si ce n'est pas simple pour le programmeur débutant que je suis), je vais réfléchir à l’algorithme pour le traitement de la ligne et je posterais au fur et à mesure de mon avancement pour demander de l'aide si besoin est !

    Merci encore

  11. #11
    Membre averti
    Inscrit en
    Décembre 2006
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 37
    Par défaut
    lex/yacc

  12. #12
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 487
    Par défaut
    Citation Envoyé par Pierre Dolez Voir le message
    Imaginez que sur votre calculette, vous deviez taper d'abord la touche correspondant à l'opération que vous voulez faire, puis le premier opérande puis le second.
    Ça s'appelle la notation polonaise et, oui, beaucoup de calculateurs utilisent cette méthode, à commencer par les HP48.

    Cela dit, il y a effectivement des chances pour que ce ne soit pas ce qu'il veut.

    Citation Envoyé par themus Voir le message
    lex/yacc
    Ça aurait mérité d'être développé plus avant mais, en effet, c'est la solution qui vient le plus vite à l'esprit. La réalisation d'une calculatrice 4 opérations est en quelque sorte le « Hello World » des T.P. de Lex & Yacc.

  13. #13
    Expert confirmé
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 539
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 539
    Par défaut
    Citation Envoyé par makia42 Voir le message
    printf("pi(3.1415)");
    nb = 3.1415;
    return (nb = 3.1415);
    nb retournera toujours 3.1415 !!!
    tu affectes cette valeur une ligne avant !
    Il suffit de déclarer return (nb);


    En plus c'est une erreur ; si tu veux retourner un résultat soit vrai soit faux selon un test il faut déclarer return ( a==b)
    Comme c'est déclaré ici tu affectes 3.14 à nb ce qui est toujours vrai

  14. #14
    Invité
    Invité(e)
    Par défaut
    Ça s'appelle la notation polonaise et, oui, beaucoup de calculateurs utilisent cette méthode, à commencer par les HP48.
    La notation polonaise inverse dispose de 4 registres, noté X,Y,Z,T.
    Lorsque l'opérateur veut faire une opération il tape et entre le premier opérande, puis le second. Les registres X et Y sont renseignés. Le choix d'une opération efféctue cette opération entre les registres X et Y. Le résultat est mis en X. Ce type de machine ne dispose pas de touche "=" mais dispose de deux touches supplémentaires, un touche "échange" qui échange X et Y, et un touche "flèche en bas" qui effectue une permutation circulaire sur les 4 registres.
    Je suppose que si je lui en avais parlé, on m'aurait répondu "Ne complique pas les choses".
    Toutes les calculatrices HP que je connais utilisent cette logique (HP21, HP41 entre autres)
    Par contre, lorsqu'il s'agit de fonction avec un seul paramètre, par exemple sin, dans la logique d'une calculatrice avec un ordinateur, je préfèrerait que l'opérateur ait à taper sin(25) plutôt que 25 puis sin.
    Comme il s'agit d'une calculatrice scientifique, le problème se posera.

  15. #15
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 66
    Par défaut
    Salut et merci pour toute vos réponse,

    @ Mat.M: Je te remercie pour ta remarque , meme si je pense abandonée l'idée d'une fonction typetest();

    @ Obsidian: J'ai jeter un rapide coup d'oeil à "Lex/Yacc", je n'en ai jamais entendu parler et effectivement sa semble intérréssant !
    C'est un sorte de langage lexical qui traduit le code C ?

    @Pierre Dolez : effectivement je ne cherche pas à utiliser la notation polonaise dont je n'avais d'ailleurs jamais entendu parler xD !Merci pour l'info.

  16. #16
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 840
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par makia42 Voir le message
    @ Obsidian: J'ai jeter un rapide coup d'oeil à "Lex/Yacc", je n'en ai jamais entendu parler et effectivement sa semble intérréssant !
    C'est un sorte de langage lexical qui traduit le code C ?
    C'est peut-être un peu au delà de ce tp. lex est un outil qui te permet de transformer un algo d'analyse lexical en code C. Bien entendu, faut écrire l'algo d'analyse dans un méta langage que lex peut comprendre.
    yacc est un autre outil sur le même principe qui te permet de transformer une grammaire en code C. Tu décris ta grammaire, style
    un opérateur c'est: un signe
    un opérande c'est: un nombre
    ou: un nombre suivi d'un opérateur suivi d'un nombre
    etc etc et ça te converti tout ça en code C.
    Les deux outils combinés peuvent créér un compilateur

    Citation Envoyé par makia42 Voir le message
    @Pierre Dolez : effectivement je ne cherche pas à utiliser la notation polonaise dont je n'avais d'ailleurs jamais entendu parler xD !Merci pour l'info.
    Ca évite de s'embêter à gérer les priorités => 2 + 3 * 4 s'écrira 2 3 4 * +
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  17. #17
    Membre averti
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 23
    Par défaut levé de voile sur le mystere
    En fait deja six ans , mais les protagonistes n avaient pas compris que makia comme xzolot ou hybernatus etait sorti des glaces suite a un rechauffement climatique .... En effet il envisage simplement de faire tourner son C en mode interpreté genre bastoc comme en basica dans lesquel selon les aiguillages tel ou tel fichier est interpreté ... Je ne pense pas qu une dll ai germée dans son esprit. Voila j ai travaillé en geriatrie et quelques fois ca arrive se genre de plans . Screen 13 256 couleur vga. a plus

Discussions similaires

  1. [info] La "Calculext": une calculatrice scientifique extensible
    Par tyrtamos dans le forum Général Python
    Réponses: 2
    Dernier message: 06/02/2008, 12h23
  2. une calculatrice scientifique
    Par bassemb dans le forum C#
    Réponses: 6
    Dernier message: 11/12/2007, 09h05
  3. Réalisation d'une calculatrice scientifique
    Par diden138 dans le forum Pascal
    Réponses: 7
    Dernier message: 22/05/2006, 11h45
  4. [TP] Calculatrice scientifique
    Par cherif31 dans le forum Turbo Pascal
    Réponses: 7
    Dernier message: 17/04/2006, 21h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo