[Débutant ] Créer une calculatrice

rockerguitar Messages postés 6 Date d'inscription jeudi 14 décembre 2006 Statut Membre Dernière intervention 18 décembre 2006 - 14 déc. 2006 à 20:53
Slidi Messages postés 3 Date d'inscription lundi 18 décembre 2006 Statut Membre Dernière intervention 18 décembre 2006 - 18 déc. 2006 à 17:37
Bonsoir à tous !
Je suis nouveau dans le monde de la programmation. J'ai commencé il y a 3 jours. Mon projet est de créer un jeu musical sur la Nintendo Wii, en utilisant la Wiimote. Comme vous le voyez, je suis un amoureux des jeux vidéos ^^
J'ai 15 ans, j'habite à Marseille, et mon prénom, c'est Olivier. Voila.

J'ai voulu créer une calculatrice dans la console Win32, mais il y a une problème, je ne saurait l'expliquer, mais je vous donne mon code, pour que vous puissiez tou de même m'aider :


#include
<stdio.h>



#include






<stdlib.h>

int



main(

int
argc,

char
*argv[]){


long
choixOperation;

printf(


"Operation\n\n"
);printf(


"1. Addition\n"
);printf(


"2. Soustraction\n"
);printf(


"3. Multiplication\n"
);printf(


"4. Division\n"
);printf(


"\nVotre choix ? "
);scanf(


"%ld"
, &choixOperation);

printf(


"\n"
);


switch
(choixOperation){


case
1:printf(


"Addition"
);


break
;


case
2:printf(


"Soustraction"
);


break
;


case
3:printf(


"Multiplication"
);


break
;


case
4:printf(


"Division"
);


break
;


default
:printf(


"C'est pourtant pas dur de choisir entre 1, 2, 3 et 4 non ?"
);


break
;}

printf(


"\n\n"
);


long
resultat 0, nombre1 0, nombre2 = 0;printf(


"Entrez le nombre 1 : "
);scanf(


"%ld"
, &nombre1);printf(


"Entrez le nombre 2 : "
);scanf(


"%ld"
, &nombre2);


// Et on affiche l'addition à l'écran :






if
(choixOperation == 1);{

resultat = nombre1 + nombre2;

printf (


"%ld + %ld = %ld\n"
, nombre1, nombre2, resultat);}


if
(choixOperation == 2);{

resultat = nombre1 - nombre2;

printf (


"%ld - %ld = %ld\n"
, nombre1, nombre2, resultat);}


if
(choixOperation == 3);{

resultat = nombre1 * nombre2;

printf (


"%ld * %ld = %ld\n"
, nombre1, nombre2, resultat);}


if
(choixOperation == 4);{

resultat = nombre1 / nombre2;

printf (


"%ld / %ld = %ld\n"
, nombre1, nombre2, resultat);}

system(


"PAUSE"
);}

Je programme sous Visual C++ 2005 Express. Je tiens à vous dire que ce code comporte tous les points-virgule et guillemets ou autre, simplement, il ne marche pas correctement.
Merci d'avance.

22 réponses

rockerguitar Messages postés 6 Date d'inscription jeudi 14 décembre 2006 Statut Membre Dernière intervention 18 décembre 2006
14 déc. 2006 à 20:59
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
long choixOperation;

printf("Operation\n\n");
printf("1. Addition\n");
printf("2. Soustraction\n");
printf("3. Multiplication\n");
printf("4. Division\n");
printf("\nVotre choix ? ");
scanf("%ld", &choixOperation);

printf("\n");

switch (choixOperation)
{
case 1:
printf("Addition");
break;
case 2:
printf("Soustraction");
break;
case 3:
printf("Multiplication");
break;
case 4:
printf("Division");
break;
default:
printf("C'est pourtant pas dur de choisir entre 1, 2, 3 et 4 non ?");
break;
}

printf("\n\n");

long resultat 0, nombre1 0, nombre2 = 0;

printf("Entrez le nombre 1 : ");
scanf("%ld", &nombre1);
printf("Entrez le nombre 2 : ");
scanf("%ld", &nombre2);

// Et on affiche l'addition à l'écran :

if (choixOperation == 1);
{
resultat = nombre1 + nombre2;
printf ("%ld + %ld = %ld\n", nombre1, nombre2, resultat);
}

if (choixOperation == 2);
{
resultat = nombre1 - nombre2;
printf ("%ld - %ld = %ld\n", nombre1, nombre2, resultat);
}

if (choixOperation == 3);
{
resultat = nombre1 * nombre2;
printf ("%ld * %ld = %ld\n", nombre1, nombre2, resultat);
}

if (choixOperation == 4);
{
resultat = nombre1 / nombre2;
printf ("%ld / %ld = %ld\n", nombre1, nombre2, resultat);
}

system("PAUSE");
}
0
cs_Joky Messages postés 1787 Date d'inscription lundi 22 novembre 2004 Statut Membre Dernière intervention 31 janvier 2009 2
15 déc. 2006 à 07:12
T'as de l'ambition dis donc pour ton Projet :D
Sinon remplace ton long choixOperation par un int choixOperation voir même un short int c'est encore mieux et dans scanf tu lis un entier avec %i

Je pense que %ld attend un double, je suis pas sur...
Voilà bon courage pour la Wii :s
ULARGE_INTEGERJokyQi=QI("Joky"
0
rockerguitar Messages postés 6 Date d'inscription jeudi 14 décembre 2006 Statut Membre Dernière intervention 18 décembre 2006
15 déc. 2006 à 08:53
Merci de ta réponse !
Il reste cependant un problème encore : c'est que, lorsque je lance l'application, je choisis l'opération, là ça marche, je rentre deux nombres à calculer, ça marche aussi, mais après, il me donne le résultat de l'addition, la soustraction, la multiplication et la division des nombres chosis alors que j'ai demandé par exemple une addition (ça marche si je demande les trois autres type d'opération). C'est ça que je ne comprends pas :-(.
Mais merci quand même pour tes encouragements et ta réponse ;-)
0
Ombitious_Developper Messages postés 2333 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 26 juillet 2013 38
15 déc. 2006 à 12:12
Salut:

Tu peux remplacer ton switch par des pointeurs de fonctions.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
turnerom Messages postés 492 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 12 janvier 2012 1
15 déc. 2006 à 14:20
switch attend un int pas un long !!!



  int choixOperation;
    printf("Operation\n\n");
  printf("1. Addition\n");
  printf("2. Soustraction\n");
  printf("3. Multiplication\n");
  printf("4. Division\n");
  printf("\nVotre choix ? ");
  scanf("%d", &choixOperation);

<hr size="2" width="100%" />TuRn3r
0
turnerom Messages postés 492 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 12 janvier 2012 1
15 déc. 2006 à 14:27
Bon allé, c'est bientot NOEL
<hr size="2" width="100%" />

#include <stdio.h>
#include <stdlib.h>

float add(int a, int b)
{
   return (float) a+b;
}

float sub(int a, int b)

{

   return (float) a-b;

}

float mul(int a, int b)

{

   return (float) a*b;

}

float div(int a, int b)

{
   if(b==0)
   {
      fprintf(stderr, "Impossible de diviser par 0");
      return -999;


   return (float) a/b;

}

int main(int argc, char *argv[])
{
  int choixOperation;
  int a, b;
  float rep;
    printf("Operation\n\n");
  printf("1. Addition\n");
  printf("2. Soustraction\n");
  printf("3. Multiplication\n");
  printf("4. Division\n");
  printf("\nVotre choix ? ");
  scanf("%d", &choixOperation);
  
  printf("\n");
 
printf("Saisissez 2 nombres");
scanf("%d %d", &a, &b);

  switch (choixOperation)
  {
    case 1:
       printf("Addition");
       rep=add(a,b);
       break;
    case 2:
       printf("Soustraction");
       rep=sub(a,b);
       break;
    case 3:
       printf("Multiplication");
       rep=mul(a,b);
       break;
    case 4:
       printf("Division");
       rep=div(a,b);
       break;
    default:
       printf("C'est pourtant pas dur de choisir entre 1, 2, 3 et 4 non ?");
       break;
  }
  
  printf("\n\n");

printf("Le resultat est %f", rep);

return 0;
}
 
<hr size="2" width="100%" />TuRn3r
0
turnerom Messages postés 492 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 12 janvier 2012 1
15 déc. 2006 à 14:29
Avec une } apres return -999;
ca devrai marché un poil mieu

<hr size="2" width="100%" />TuRn3r
0
Ombitious_Developper Messages postés 2333 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 26 juillet 2013 38
15 déc. 2006 à 15:37
Salut:

Tu n'a pas compris ce que je voulais dire:

// Tableau de pointeurs de fonctions
float (*ptr) (int, int) [4] = {add, sub, mul, div};







if (choixOperation >= 0 && choixOperation <= 3)
    ptr (a, b);
else
    printf("choix invalide \a\n");
0
turnerom Messages postés 492 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 12 janvier 2012 1
15 déc. 2006 à 16:00
Si j'ai bien compris, mais je trouve juste ma méthode un peu plus simple pour débuter en prog.

M'enfin c'est vrai qu'avant d'attaquer la prog d'un jeu Wii ......

<hr size="2" width="100%" />TuRn3r
0
Ombitious_Developper Messages postés 2333 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 26 juillet 2013 38
15 déc. 2006 à 16:06
Salut:

Il faut toujours voir lointain, sinon on risque de ne pas progresser ami.
0
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
15 déc. 2006 à 16:43
Mais ca sert a rien de passer les vitesses si tu sais pas tourner le volant.
0
rockerguitar Messages postés 6 Date d'inscription jeudi 14 décembre 2006 Statut Membre Dernière intervention 18 décembre 2006
15 déc. 2006 à 18:56
Merci à tous pour vos réponses.
En effet, switch attend un "int" désolé de l'erreur. Merci turnerom ;-).
Cependant, le problème n'est pas réglé : le programme affiche toujours le résultat des 4 opérations, alors qu'on en choisi qu'une
=> j'appuie sur 1 puis Entrée, je met le premier nombre, Entrée, le second nombre, Entrée et là s'affiche les résultats pour l'addition (ce que j'ai choisi), mais aussi la soustraction, la multiplication et la division.
Un calculette multiple quoi ^^.
Oui, mon projet est impressionnant, fou, mais c'est un challenge de le réussir. J'y arriverais ;-) promis.
Merci à tous !

P.S : si quelqu'un pouvait m'expliquer le problème de mon code pour qu'il affiche juste le résultat de l'opération choisie, je le remercierait chaleureusement :D .
0
Ombitious_Developper Messages postés 2333 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 26 juillet 2013 38
15 déc. 2006 à 20:20
Salut:

luthor> Joli métaphore, mais tu dois savoir que la chance sourit aux audacieux.

rockerguitar> As tu oublié de mettre les mots clefs: break?
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
15 déc. 2006 à 22:12
Avant d'utiliser les pointeurs de fonctions, il faut déja bien maitriser les pointeurs, ce qui n'est pas toujours évident pour un débutant. Je pense que c'est aussi bien de s'en tenir à un switch, même si un tableau de fonctions est une bonne idée ici.

Quand au débat entre les int et les long, il n'a pas lieu d'être: on peut mettre ce qu'on veut dans un switch, pourvu que ce soit un type entier (quelque soit sa taille)

Pour le projet sur la Wii, je veux pas être désagréable (juste réaliste), il te faudra encore de nombreuses années de travail avant d'y parvenir

float div(int a, int b)
{
   if(b==0)
   {
      fprintf(stderr, "Impossible de diviser par 0");
      return -999;

   return (float) a/b;
}

Très mauvaise idée de faire ca, tu n'a aucun moyen de savoir si -999 est le code d'erreur ou bien la valeur de la division (car div(-999, 1) retourne aussi -999). Utilise plutot une autre variable qui servira juste à indiquer une erreur

_____________________________________
Un éditeur de ressources gratuit pour Windows
0
Ombitious_Developper Messages postés 2333 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 26 juillet 2013 38
15 déc. 2006 à 22:54
Salut:

Je pense qu'une variable globale servira pour signaler l'erreur.

#define TRUE  1
#define FALSE 0

int g_Erreur = FALSE;

float div (int a, int b) {
    if (b == 0) {
       g_Erreur = TRUE;
       return .0f;
    }
    return (float) a/b;
}
0
Slidi Messages postés 3 Date d'inscription lundi 18 décembre 2006 Statut Membre Dernière intervention 18 décembre 2006
18 déc. 2006 à 13:35
Pour les deux derniers, a/b avec b= 0 est possible, c'est si a=0 que c'est pas possible, on l'apprend en math :P

Sinon pour répondre à rockerguitar, qui a toujours un problème, le problème vient du fait que tu ais écrit plusieurs If à la suite.
Pour régler le problème, il te suffit de rajouter else devant les dernier if. Ca donne ceci:

#include<stdio.h>
#include<stdlib.h>




int main( int argc, char *argv[])
{
    long nombre1 =0, nombre2 =0;
    long resultat =0;
    long choixOperation =0;


    while (choixOperation<1 || choixOperation>4)  //voir mon explication ^^
    {    printf("Operation\n\n" );
    printf("1. Addition\n" );
    printf("2. Soustraction\n" );
    printf("3. Multiplication\n" );
    printf("4. Division\n" );
    printf("\nVotre choix ? " );
    scanf("%ld" , &choixOperation);
    printf("\n" );
    }




    switch (choixOperation)
    {
        case 1:
        printf("Addition" );
        break ;


        case 2:
        printf("Soustraction" );
        break ;


        case 3:
        printf("Multiplication" );
        break ;


        case 4:
        printf("Division" );
        break ;
    }


    printf("\n\nEntrez le nombre 1 :");
    scanf("%ld" , &nombre1);
    printf("Entrez le nombre 2 :");
    scanf("%ld" , &nombre2);




if (choixOperation == 1)   //Le premier en If et ensuite des Else if
{
resultat = nombre1 + nombre2;
printf ("\n\n%ld + %ld = %ld\n" , nombre1, nombre2, resultat);
}
else if (choixOperation == 2)
{
resultat = nombre1 - nombre2;
printf ("\n\n%ld - %ld = %ld\n" , nombre1, nombre2, resultat);
}
else if (choixOperation == 3)
{
resultat = nombre1 * nombre2;
printf ("\n\n%ld * %ld = %ld\n" , nombre1, nombre2, resultat);
}
else if (choixOperation == 4)
{
resultat = nombre1 / nombre2;
printf ("\n\n%ld / %ld = %ld\n" , nombre1, nombre2, resultat);
}


system("PAUSE" );
}

Comme ça plus de problème, alors en haut pour ton menu j'ai mis une boucle pour que tant que l'utilisateur n'entre pas 1,2,3 ou 4 le menu se réaffiche pour luidemander son choix. Tu avais eu un embrillon d'idée avec ta phrase qui disait "C'est pourtant pas compliqué de chois......" mais apres le choix n'était plus proposé et ça passait tout de suite à la demande des nombres.
Enfin j'ai remplacer tes If... If... If... If... par If... Else If... Else If... Else If... et là plus de problème.

Il te reste plus qu'a changer les nombre entier en décimaux pour avoir les divisions justes
0
turnerom Messages postés 492 Date d'inscription samedi 10 juillet 2004 Statut Membre Dernière intervention 12 janvier 2012 1
18 déc. 2006 à 13:57
Que de concentré de co****ie en un seul message.

--> Pour les deux derniers, a/b avec b=0 est possible, c'est si a=0 que c'est pas possible, on l'apprend en math :P

Bon ben révise tes maths alors !!!
0/2 = 0
2/0 = erreur

Quand au if / if ... else, je suis désolé, mais faut m'expliquer comment choixOperation peut égaler 1, 2, 3 et 4 en meme temps !!!!!
Le if else change rien à ce problème la (bien que cela permette d'avoir un code infinitésimalement (joli mot hein !) plus rapide dans certain cas)

rockerguitard, tu peux reposter ton code pour voir ce qui va pas stp ?

<hr size="2" width="100%" />TuRn3r
0
Slidi Messages postés 3 Date d'inscription lundi 18 décembre 2006 Statut Membre Dernière intervention 18 décembre 2006
18 déc. 2006 à 16:40
Oula oué faut que j'aille revoir ce que j'ai dit sur les maths Oo là j'ai abusé xD.

Par contre si tu veux le code de rokerguitard, c'est facile tu va à la 1ère page.

"Quand au if / if ... else, je suis désolé, mais faut m'expliquer comment choixOperation peut égaler 1, 2, 3 et 4 en meme temps !!!!!"

Là je comprends pas, tu t'es peut être embrouillé. J'ai mis if puis else if, donc si c'est =1 alors fais ça, sinon si c'est =2 fais ça, sinon etc... donc il n'y a plus d'égalité en même temps qui avait lieu dans le cas où rokerguitard ne mettait que des If et même là on peut pas parler d'égalité Oo

donc méa culpa pour la division par contre le reste nan :)
0
rockerguitar Messages postés 6 Date d'inscription jeudi 14 décembre 2006 Statut Membre Dernière intervention 18 décembre 2006
18 déc. 2006 à 17:05
0
rockerguitar Messages postés 6 Date d'inscription jeudi 14 décembre 2006 Statut Membre Dernière intervention 18 décembre 2006
18 déc. 2006 à 17:07
Je te remercie Slidi, ton code marche parfaitement, j'avais en effet oublié les else if à mon code.
Sinon, 2/0, bah, on peut pas le faire ;-)
0
Rejoignez-nous