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 :

Basic calculator [Débutant(e)]


Sujet :

C

  1. #1
    Membre averti
    Inscrit en
    Juin 2007
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 21
    Par défaut Basic calculator
    salut à tous
    J'ai fait ce petit programme qui s'appelle Basic calculator et je souhaiterais avoir votre avis le code source, et d'éventuelle suggestions pour fixer les bugs.
    merci d'avance
    url : http://beat.byethost13.com/unix/linux.html
    Au fait je suis Beat

    Edit de Gruik : je poste ici, il est pas gros
    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
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    #include<stdio.h>
     
    /*
    *Name : calculator.c
     * Vertion : 0.1
     * Author : Beat
     * 14-sep-2007
     * Description : This application is a basic calculator.
     * 		 It has another interesting feature : print multiplication table accordin to user input.
     * 		 Operators used to perform operations are :
     * 		 + addition
     * 		 - subtraction
     * 		 * multiplication
     *		 / division
     *
     *		 Type -help to see how program works.
     *
     *
     */
     
    int calculate(void);
    int help(void);
    int table(void);
     
    int main()
    {	
    	printf("\t\t\t   -------------------   \n");
    	printf("\t\t\t  |  Basic Calculator |  \n");
    	printf("\t\t\t   -------------------   \n");
    	printf("\t\t\t    | Coded by Beat |    \n");
    	printf("\t\t\t     ---------------     \n");
    	printf("\t\t\t         Usage :         \n");
    	printf("\t\t\t         -------       \n\n");
    	printf("\th --help            ->  shows how program works\n\tt --table           ->  prints multiplication table of a number\n\tc --calculate       ->  switch to basic calculating\n\tq --quit            ->  To exit program\n\n\n");
     
    	char choice;
    	printf("Menu >");
    	while(choice != 'q')
    	{
     
    		scanf("%c", &choice);
     
     
    		if(choice == 'h')		
    		{	 help();} 
    		else if(choice == 't')
    		{	 table();}
    		else if(choice == 'c')
    		{	 calculate();}
    		else
    		{	printf("Menu >");}
     
     
     
    	}
     
    	printf("\n\n\n\t\t\tBye ------------------>See you soon !\n\n\n");	
     
     
     
    return 0;
    }
     
    int calculate(void)
    {	
    	double i = 0, j = 0;
    	char operator;
    	printf("Calculator >");
    	scanf("%lf %c %lf", &i, &operator, &j);
     
    	switch(operator)
    	{	
    		case '+': printf("Result is -> %lf\n", i+j);
    			  break;
    		case '-': printf("Result is -> %lf\n", i-j);
    			  break;
    		case '*': printf("Result is -> %lf\n", i*j);
    			  break;
    		case '/': printf("Result is -> %lf\n", i/j);
    			  break;
    		default : printf("Bad syntax ! type h for more information");
    	}
    return 0;
    }
     
     
    int table(void)
    {	
    	int i = 0, j = 1, k;
     
    	printf("Multiplication Table >");
    	scanf("%d", &i);
    	while(j<11)
    	{	
    		k = j*i;
    		printf("%d x %d = %d\n", j, i, k);
    		j++;
    	}
    return 0;
    }
     
    int help()
    {	printf("\t\t\t\t\t\t| help |\n");
    	printf("\t\t\t\tBasic calculator is, as it's name tells,\n\t\t\t\ta program alowing to do some basic calculations\n\n\n");
    	printf("\t-c : This command switchs to calculate mode. type 1st number <space> operator <space> 2nd number.\n              Existing operators : +  *  /  - for addition, multiplication, division and substraction.\n\n");
    	printf("\t-t : Shows multiplication table of an number. Just type the number and press Enter.\n\n");
     
    return 0;
    }

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Par défaut
    Tu ne contrôles pas la valeur de retour de scanf. Par définition, l'utilisateur peut faire n'importe quoi et s'il peut faire n'importe quoi ton programme aussi.
    Tu trouveras de l'aide sur scanf ici http://xrenault.developpez.com/tutoriels/c/scanf/.

    Autrement, tu peux utiliser fgets et analyser la chaîne récupérée.
    http://c.developpez.com/faq/c/?page=...EEN_gets_fgets

    Tu trouveras beaucoup de discussions sur le sujet dans le forum.
    Autrement, je n'aime pas les lignes qui font un kilomètre de long.

  3. #3
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    Salut,

    • choice n'est pas initialisé
    • tu peux utiliser la structure switch pour tester des cas dont la valeur est une constante entiere (c'est le cas pour des constantes caracteres comme 'h', 't'...)
    • int help() n'est pas un prototype correct
    • j'aurais plutot utilisé un for qu'un while pour la table de multiplication
    • je n'aime pas trop ton style de bloc d'instruction tout sur une ligne, il est plus courant de voir ceci
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      {
         code();
         code();
      }

  4. #4
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    En complement des remarques qui ont deja ete faites:
    * les affichages du type printf("Menu >"); n'etant pas termine par un \n, l'affichage peut ne pas etre fait immediatement. Rajoutes un fflush(stdout).
    *En plus de tester le retour de scanf comme l'indique aoyou, il est imperatif de vider le tampon d'entree pour ne pas pertube les saisies suivantes (sujet maintes fois aborde sur le forum, fait une recherche sur fclean).

  5. #5
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par gl Voir le message
    *En plus de tester le retour de scanf comme l'indique aoyou, il est imperatif de vider le tampon d'entree pour ne pas pertube les saisies suivantes (sujet maintes fois aborde sur le forum, fait une recherche sur fclean).
    ... quand c'est nécessaire...

  6. #6
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    ... quand c'est nécessaire...
    Certes, ça me semblait suffisamment évident pour le sous entendre. Mais c'est effectivement préférable de le préciser.

  7. #7
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par gl Voir le message
    Certes, ça me semblait suffisamment évident pour le sous entendre. Mais c'est effectivement préférable de le préciser.
    Surtout que les conditions qui déterminent la nécessité de vider le flux ne sont pas triviales.

  8. #8
    Membre averti
    Inscrit en
    Juin 2007
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 21
    Par défaut
    salut.
    merci à tous.
    dans la fonction calculate() est ce que je peux utiliser fgets en sachant que la fonction reçois un char dans le permier paramètre alors que i et j sont double ?

  9. #9
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par e-medi Voir le message
    dans la fonction calculate() est ce que je peux utiliser fgets en sachant que la fonction reçois un char dans le permier paramètre alors que i et j sont double ?
    fgets() sert à faire la saisie de base (ligne de texte). Ensuite, après nettoyage correct (fclean(), voir le forum pour les détails) on convertit le texte en valeur numérique avec la fonction qui va bien (strtol(), par exemple).

  10. #10
    Membre expérimenté
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Par défaut
    Bonjour,

    Si vous le souhaitez, je peux ouvrir un nouveau post.

    Je suis débutant en C et vue que j'ai trouvé ce fichier était assez intéressant pour apprendre le langage, je l'ai copié/collé afin de le compiler et l'exécuter mais j'ai directement rencontré des problèmes.

    Le premier est que le mot "operator" semble un mot réservé.

    Il apparaît en bleu dans mon code.

    Je l'ai donc transformé en operation et de 19 erreurs, je suis passé à 2 erreurs (voir plus bas).

    Je me demande si le mot "operator" n'est pas un mot réservé de C++...

    Je travaille avec Visual Studio 6 qui crée des fichiers cpp.

    Est-ce le bon outil pour créer des fichier C ? pourquoi met il operator comme mot réservé ?

    Voici les deux erreurs au cas où vous pourriez m'aider :

    Linking...
    LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol _WinMain@16
    Debug/Calculatrice.exe : fatal error LNK1120: 1 unresolved externals
    Error executing link.exe.

    Calculatrice.exe - 2 error(s), 0 warning(s)
    Merci d'avance pour votre aide.

    beegees

  11. #11
    Membre averti
    Inscrit en
    Juin 2007
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 21
    Par défaut
    moi j'ai codé ce programme en C pas en C++ je crois que c'est pour cela.
    J'utilise gcc car je suis mnt sous linux. mais quand je suis sou windows j'utilise code::blocks

  12. #12
    Membre averti
    Inscrit en
    Juin 2007
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 21
    Par défaut
    Citation Envoyé par e-medi Voir le message
    moi j'ai codé ce programme en C pas en C++ je crois que c'est pour cela.
    J'utilise gcc car je suis mnt sous linux. mais quand je suis sou windows j'utilise code::blocks
    Linking...
    LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol _WinMain@16
    Debug/Calculatrice.exe : fatal error LNK1120: 1 unresolved externals
    Error executing link.exe.

    Calculatrice.exe - 2 error(s), 0 warning(s)
    apparament il manquerais un bibliothèque au linker
    Essai toujour avec l'extention .c...

  13. #13
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par beegees Voir le message
    Je suis débutant en C et vue que j'ai trouvé ce fichier était assez intéressant pour apprendre le langage,
    Je suppose que tu parles de ceci : http://beat.byethost13.com/unix/linux.html

    Bah, s'agissant d'un langage aussi complexe et subtil que le C, il vaut mieux éviter d'y aller au hasard et utiliser un bon livre ou un bon tutoriel. Il y'a des références sur ce site et sur le mien.
    je l'ai copié/collé afin de le compiler et l'exécuter mais j'ai directement rencontré des problèmes.

    Le premier est que le mot "operator" semble un mot réservé.
    Bah, non, pas en C. Evidemment si tu compiles du C en C++, il va se passer n'importe quoi. Ce sont des langages différents. Vérifie donc que tu compiles bien en C. Pour commencer, l'extension du fichier doit être .c et non .C ni .cpp.

    Ce code compile sans erreurs en C.

    Au fait, le projet doit être évidemment de type console et non GUI...

  14. #14
    Membre expérimenté
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Par défaut
    Merci pour tes réponses.

    Avec Dev-C++, ça fonctionne, pas avec VS 6.

    Compile fonctionne mais build ne fonctionne pas, voici d'ailleurs le message d'erreur : (voir attaché)

    Merci encore pour l'aide.

    beegees

  15. #15
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par beegees Voir le message
    Avec Dev-C++, ça fonctionne, pas avec VS 6.

    Compile fonctionne mais build ne fonctionne pas, voici d'ailleurs le message d'erreur : (voir attaché)
    Désolé, je connais très mal VC++6 (VS6).

    http://www.developpez.net/forums/forumdisplay.php?f=29

  16. #16
    Membre expérimenté
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Par défaut
    Bonjour Emmanuel,

    Merci pour ta réponse.

    Je pense que je vais essayer de trouver un tuto qui explique comment utiliser visual studio 6.

    Mais je pense qu'on a pas l'occasion de choisir un fichier .c, juste .cpp

    Mais je peux me tromper

    Je te tiens au courrant.

    @+

    beegees

  17. #17
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par beegees Voir le message
    Je pense que je vais essayer de trouver un tuto qui explique comment utiliser visual studio 6.

    Mais je pense qu'on a pas l'occasion de choisir un fichier .c, juste .cpp
    Je suis certain du contraire, mais je n'ai pas utilisé VC++6 depuis 10 ans (mais c'était pour faire du C, c'est sûr)...

  18. #18
    Membre expérimenté
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Par défaut
    OK merci pour la bonne piste Emmanuel.

    J'ai trouvé la réponse ici

    Merci pour tout.

    beegees

  19. #19
    Membre averti
    Inscrit en
    Juin 2007
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 21
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Ensuite, après nettoyage correct (fclean(), voir le forum pour les détails) on convertit le texte en valeur numérique avec la fonction qui va bien (strtol(), par exemple).
    je ne vois pas ce que vous voulez dire... je suis sensé enter une valeure numerique, dans la fonction calculate pas du texte que je convertirais en chiffres

  20. #20
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par e-medi Voir le message
    je ne vois pas ce que vous voulez dire... je suis sensé enter une valeure numerique, dans la fonction calculate pas du texte que je convertirais en chiffres
    Peu importe le moyen, ce qui compte, c'est le résultat. Il y a différentes façon d'y arriver, je propose une méthode relativement simple, éprouvée et à l'épreuve des balles.
    • saisir une ligne de texte.
    • nettoyer le texte saisi et/ou le flux entrant.
    • convertir le texte saisie en valeur numérique.

Discussions similaires

  1. [Débutant] Calcul des valeurs des TextBox en Visual basic 2010
    Par stracoma dans le forum VB.NET
    Réponses: 2
    Dernier message: 14/09/2014, 21h52
  2. anomalie de calcul basic
    Par DNB91 dans le forum Excel
    Réponses: 3
    Dernier message: 27/04/2012, 09h16
  3. Calcul percentile et centile avec Visual Basic 6.0
    Par moirs555 dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 22/08/2011, 14h24
  4. [OpenOffice][Tableur] [Tableur] + [BASIC] Bouton sur Feuille de calcul
    Par Totanne dans le forum OpenOffice & LibreOffice
    Réponses: 1
    Dernier message: 29/10/2010, 10h01
  5. Calcul Astronomique en visual basic
    Par Emanuel Boivin dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 17/03/2009, 23h56

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