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 (avec fonctions)


Sujet :

C

  1. #1
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 2
    Par défaut Calculatrice (avec fonctions)
    Voici une calculatrice de base (addition, soustraction, mult. et division).

    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
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    #include <stdio.h>
    #include <stdlib.h>
     
    //Fonction pour afficher le menu
    void Menu()
    {
    	printf("		CALCULATRICE\n");
    	printf("		------------\n");
    	printf("		1. Addition\n");
        printf("		2. Soustraction\n");
        printf("		3. Multiplication\n");
        printf("		4. Division\n");
        printf("		5. Quitter\n\n");
    }
     
    //Fonction pour la lecture du choix
    int Choix()
    {
    	int choix;
     
    	printf("Entrez votre choix (1 a 5): ");
    	scanf("%i", &choix);
    	return choix;
    }
     
    //Fonction pour l'opération d'addition
    void Addition()
    {
    	int i, j, nbVal;
    	float valeur, resultat;
    	char choixAutre;
     
    	do
    	{
    		system("cls");
    		printf("		ADDITION\n");
    		printf("		--------\n\n");
    		printf("Entrez le nombre de valeurs a additionner: ");
    		scanf("%i", &nbVal);
     
    		resultat = 0;
    		for(i = 1, j = 1; i <= nbVal; i++, j++)
    		{
    			printf("Valeur %i: ", j);
    			scanf("%f", &valeur);
    			resultat += valeur;
    		}
    		printf("La somme est %.2f\n\n", resultat);
    		printf("Voulez-vous faire une autre operation d'addition? (Y/N)");
    		scanf("%s", &choixAutre);
    	}
    	while(choixAutre == 'Y' || choixAutre == 'y');
    	system("cls");
    }
     
    //Fonction pour l'opération de soustraction
    void Soustraction()
    {
    	float val1, val2, resultat;
    	char choixAutre;
     
    	do
    	{
    		system("cls");
    		printf("	SOUSTRACTION\n");
    		printf("	--------\n\n");
    		printf("Entrez la valeur 1: ");
    		scanf("%f", &val1);
    		printf("Entrez la valeur 2: ");
    		scanf("%f", &val2);
     
    		resultat = 0;
    		resultat = val1 - val2;
    		printf("La soustraction donne %.2f\n\n", resultat);
    		printf("Voulez-vous faire une autre operation de soustraction? (Y/N)");
    		scanf("%s", &choixAutre);
    	}
    	while(choixAutre == 'Y' || choixAutre == 'y');
    	system("cls");
    }
     
    //Fonction pour l'opération de multiplication
    void Multiplication()
    {
    	int i, j, nbVal;
    	float valeur, resultat;
    	char choixAutre;
     
    	do
    	{
    		system("cls");
    		printf("		MULTIPLICATION\n");
    		printf("		--------------\n\n");
    		printf("Entrez le nombre de valeurs a multiplier: ");
    		scanf("%i", &nbVal);
     
    		resultat = 1;
    		for(i = 1, j = 1; i <= nbVal; i++, j++)
    		{
    			printf("Valeur %i: ", j);
    			scanf("%f", &valeur);
    			resultat *= valeur;
    		}
    		printf("La multiplication donne %.2f\n\n", resultat);
    		printf("Voulez-vous faire une autre operation de multiplication? (Y/N)");
    		scanf("%s", &choixAutre);
    	}
    		while(choixAutre == 'Y' || choixAutre == 'y');
    		system("cls");
    }
     
    //Fonction pour l'opération de division
    void Division()
    {
    	float val1, val2, resultat;
    	char choixAutre;
     
    	do
    	{
    		system("cls");
    		printf("	DIVISION\n");
    		printf("	--------\n\n");
    		printf("Entrez la valeur 1 (dividende): ");
    		scanf("%f", &val1);
     
    		do //Do-while pour filtrer le zéro
    		{
    			printf("Entrez la valeur 2: ");
    			scanf("%f", &val2);
    		}
    		while(val2 == 0);
     
    		resultat = 0;
    		resultat = val1 / val2;
    		printf("La division donne %.2f\n\n", resultat);
    		printf("Voulez-vous faire une autre operation de division? (Y/N)");
    		scanf("%s", &choixAutre);
    	}
    	while(choixAutre == 'Y' || choixAutre == 'y');
    	system("cls");
    }
     
    //Fonction pour la sortie du programme
    void Quitter()
    {
    	system("cls");
    	printf("Merci et au revoir!\n\n");
    }
     
    //Fonction principale du programme
    void main()
    {
    	int choixMenu;
    	char choixAutre;
     
    	do
    	{
    		Menu(); //Appel de la fonction Menu()
    		do
    		{
    			choixMenu = Choix(); //Appel de la fonction de Choix()
    		}
    		while(choixMenu < 1 || choixMenu > 5);
     
    		//Addition
    		if(choixMenu == 1)
    		{
    			Addition(); //Appel de la fonction Addition()
    		}
     
    		//Soustraction
    		else if(choixMenu == 2)
    		{
    			Soustraction(); //Appel de la fonction Soustraction()
    		}
     
    		//Multiplication
    		else if(choixMenu == 3)
    		{
    			Multiplication(); //Appel de la fonction Multiplication()
    		}
     
    		//Division
    		else if(choixMenu == 4)
    		{
    			Division(); //Appel de la fonction Division()
    		}
     
    		//Sortie du programme
    		else
    		{
    			Quitter(); //Appel de la fonction Quitter()
    			break;
    		}
    	}
    	while(choixAutre != 'N' || choixAutre != 'n');
    }
    Quand je compile mon programme, il n'y a aucune erreur, mais un problème apparaît lorsqu'à la question "Voulez-vous refaire l'opération X?", et que j'y répond non (N ou n).
    À cette question, lorsqu'on répond non, le programme nous retourne au menu. Il semblerait que mon prog ne peut lire le caractère N ou n dans la variable choixAutre.

    http://img477.imageshack.us/img477/3013/debugpi1.jpg

    Je ne sais pas si mes fonctions de calcul devraient être de type char et retourner un return (pour la variable choixAutre)... Pourtant, ce même programme (sans les fonctions) marchent impeccable.

    Merci de votre temps.

  2. #2
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    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
    void main() // int main(void)  :main renvoie toujours int
    {
    	int choixMenu;
    	char choixAutre;
     
    	do
    	{
    ....
     
    		//Addition
    		if(choixMenu == 1) // utiliser un switch
    		
    ....	}
    	while(choixAutre != 'N' || choixAutre != 'n');
     // Qui a mis une valeur dans choixAutre ? Estce un || ou un && qu'il faut ?}

  3. #3
    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 Fur1ous Voir le message
    Voici une calculatrice de base (addition, soustraction, mult. et division).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    void Addition()
    {
    	char choixAutre;
     
    	do
    	{
    		scanf("%s", &choixAutre);
    Quand je compile mon programme, il n'y a aucune erreur, mais un problème apparaît lorsqu'à la question "Voulez-vous refaire l'opération X?", et que j'y répond non (N ou n).
    Ce code est faux. Avec scanf(), "%s" attend l'adresse du premier élément d'un tableau de char et non l'adresse d'un char tout seul. Il n'y a pas la place de placer une chaine valide : "N\n", c'est à dire {'N', '\n', 0}, soit 3 caractères...

    Le comportement est donc indéterminé (débordement de tableau).

  4. #4
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 2
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Ce code est faux. Avec scanf(), "%s" attend l'adresse du premier élément d'un tableau de char et non l'adresse d'un char tout seul. Il n'y a pas la place de placer une chaine valide : "N\n", c'est à dire {'N', '\n', 0}, soit 3 caractères...

    Le comportement est donc indéterminé (débordement de tableau).
    Merci, ça a fonctionné.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    char Addition()
    {
    	char choixAutre[3] = {0};
     
               do
    	{
    		(Bloc de calculs)
    		printf("La somme est %.2f\n\n", resultat);
    		printf("Voulez-vous faire une autre operation d'addition? (Y/N)");
    		scanf("%s", &choixAutre);
    	}
    	while(choixAutre[0] == 'Y' || choixAutre[0] == 'y');
    PS: si je voulais que ma variable choixAutre ne prendrait qu'un seul caractère, est-ce que j'aurais déclarer ma variable choixAutre comme:

    char choixAutre; - Tout simplement?
    Et pour le scanf, ça aurait été:
    scanf("%c", &choixAutre); ?

  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 Fur1ous Voir le message

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    char Addition()
    {
    	char choixAutre[3] = {0};
     
    		scanf("%s", &choixAutre);
    Attention, le '&' est faux. En effet, comme déjà indiqué, "%s" attend l'adresse d'un char appartenant à un tableau de char, et non l'adresse d'un tableau de 3 char. Or, précisément, le nom d'un tableau est converti en l'adresse du premier élément de ce tableau lorsqu'il est passé à une fonction.

    Le & doit donc êre retiré :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    		scanf("%s", choixAutre);
    Ton compilateur devrait le signaler si il est bien réglé :

    http://emmanuel-delahaye.developpez....tm#cfg_compilo
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    	}
    	while(choixAutre[0] == 'Y' || choixAutre[0] == 'y');
    Oo peut simplifier en forçant le caractère en majuscule ou en minuscule. Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    	}
    	while(tolower(choixAutre[0]) == 'y');
    PS: si je voulais que ma variable choixAutre ne prendrait qu'un seul caractère, est-ce que j'aurais déclarer ma variable choixAutre comme:

    char choixAutre; - Tout simplement?
    Et pour le scanf, ça aurait été:
    scanf("%c", &choixAutre); ?
    Oui, mais il aurait fallu traiter en plus le '\n' qui n'est pas lu par cette instruction, sous peine de voir le programme avoir un comportement erratique.

    L'usage correct de scanf() est complexe :

    http://xrenault.developpez.com/tutoriels/c/scanf/

    Je recommande l'usage exclusif de fgets() pour faire les saisies. Elle doit être suivie d'une fonction de nettoyage, comme fclean(), publiée sur ce forum régulièrement, et des fonctions de conversion requises (saisies de nombres).

    http://emmanuel-delahaye.developpez.com/inputs.htm

    Il est d'usage de se construire ses fonctions de saisies sécurisées sur cette base, et de les placer une bonne fois pour toutes en bibliothèque personnelle.

    http://emmanuel-delahaye.developpez.com/clib.htm

Discussions similaires

  1. Problème avec fonction d'envoie de mail
    Par zyg dans le forum Réseau/Web
    Réponses: 1
    Dernier message: 23/02/2005, 08h48
  2. [Requête] Problème avec fonction "DATE_FORMAT()"
    Par sekiryou dans le forum Requêtes
    Réponses: 4
    Dernier message: 11/01/2005, 21h52
  3. Réponses: 3
    Dernier message: 16/06/2004, 11h26
  4. [langage] problème avec fonction read
    Par domidum54 dans le forum Langage
    Réponses: 2
    Dernier message: 30/03/2004, 20h42
  5. [VStudio 6] pb avec fonctions dans une DLL
    Par MogDeChNord dans le forum MFC
    Réponses: 8
    Dernier message: 08/01/2004, 08h57

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