logo Homepage
+  NewbieContest
|-+  Programmation» Langages compilés» [C] problème de calcules
Username:
Password:
Pages: [1] 2
  Imprimer  
Auteur Fil de discussion: [C] problème de calcules  (Lu 11189 fois)
Beat
Profil challenge

Classement : 34947/55017

Néophyte
*
Hors ligne Hors ligne
Messages: 5


Voir le profil
« le: 24 Novembre 2006 à 18:30:06 »

salut à tous , jais fait un petit programme en C comme TP, il permet de faire des calculs :
addition multiplication soustraction et division, bref des truc basiques. mais le problème c'est que lors de la compilation il ya des erreures, notamen pour "Case"

voila donc le code :

Code:

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

int main(int argc, char *argv[])
{
  printf(" ---------------------\n");
  printf("| .-=FIRST PROGRAM v1.0=-. |\n");
  printf(" ---------------------\n\n\n");
  printf("Please select your choice :   ");
  char choice;
  scanf("%ld", &choice);
 
  printf("\n\n1- Addition\n2- Multiplication\n3- Subtraction\n4- Division\n\n\n");
 
  switch(choice)
  {
  case 1:
       float chiffre1, chiffre2;
       printf("Enter the first number :  ");
       scanf("%lf", &chiffre1);
       printf("\nEnter the second number :  ");
       scanf("%lf", &chiffre2);
       
       float resultat = chiffre1 + chiffre2;
       printf("\nResult of %lf + %lf  is  =  %lf", chiffre1, chiffre2, resultat);
       break;
  case 2:
       float chiffre3, chiffre4;
       printf("Enter the first number :  ");
       scanf("%lf", &chiffre3);
       printf("\nEnter the second number :  ");
       scanf("%lf", &chiffre4);
       
       float resultat2 = chiffre3 * chiffre4;
       printf("\nResult of %lf + %lf  is  =  %lf", chiffre3, chiffre4, resultat2);
       break;
  case 3:
       float chiffre5, chiffre6;
       printf("Enter the first number :  ");
       scanf("%lf", &chiffre5);
       printf("\nEnter the second number :  ");
       scanf("%lf", &chiffre6);
       
       float resultat3 = chiffre5 - chiffre6;
       printf("\nResult of %lf + %lf  is  =  %lf", chiffre5, chiffre6, resultat3);
       break;
  case 4:
       float chiffre7, chiffre8;
       printf("Enter the first number :  ");
       scanf("%lf", &chiffre7);
       printf("\nEnter the second number :  ");
       scanf("%lf", &chiffre8);
       
       float resultat4 = chiffre7 / chiffre8;
       printf("\nResult of %lf + %lf  is  =  %lf", chiffre7, chiffre8, resultat4);
       break;
       }
 
        system("PAUSE");  
       
        printf("\n\n\nThis was  :  FIRST PROGRAM v1.0  by t0Xic.h\n\n\n");
        system("PAUSE");
       
  return 0;
}


vous auriez des idées ?
-----------------------------------------------------------------------------------------------------
PS :J'utilise Dev C++
Voila le log de compilation

Code:

Compilateur: Default compiler
Exécution de  g++.exe...
g++.exe "D:\Documents and Settings\M\Bureau\C\Projet 1\Source\FIRST PROGRAM v1.0.cpp" -o "D:\Documents and Settings\M\Bureau\C\Projet 1\Source\FIRST PROGRAM v1.0.exe"    -I"C:\Dev-Cpp\lib\gcc\mingw32\3.4.2\include"  -I"C:\Dev-Cpp\include\c++\3.4.2\backward"  -I"C:\Dev-Cpp\include\c++\3.4.2\mingw32"  -I"C:\Dev-Cpp\include\c++\3.4.2"  -I"C:\Dev-Cpp\include"   -L"C:\Dev-Cpp\lib"
D:\Documents and Settings\M\Bureau\C\Projet 1\Source\FIRST PROGRAM v1.0.cpp: In function `int main(int, char**)':
D:\Documents and Settings\M\Bureau\C\Projet 1\Source\FIRST PROGRAM v1.0.cpp:34: error: jump to case label
D:\Documents and Settings\M\Bureau\C\Projet 1\Source\FIRST PROGRAM v1.0.cpp:31: error:   crosses initialization of `float resultat'
D:\Documents and Settings\M\Bureau\C\Projet 1\Source\FIRST PROGRAM v1.0.cpp:44: error: jump to case label
D:\Documents and Settings\M\Bureau\C\Projet 1\Source\FIRST PROGRAM v1.0.cpp:41: error:   crosses initialization of `float resultat2'
D:\Documents and Settings\M\Bureau\C\Projet 1\Source\FIRST PROGRAM v1.0.cpp:31: error:   crosses initialization of `float resultat'

D:\Documents and Settings\M\Bureau\C\Projet 1\Source\FIRST PROGRAM v1.0.cpp:54: error: jump to case label
D:\Documents and Settings\M\Bureau\C\Projet 1\Source\FIRST PROGRAM v1.0.cpp:51: error:   crosses initialization of `float resultat3'
D:\Documents and Settings\M\Bureau\C\Projet 1\Source\FIRST PROGRAM v1.0.cpp:41: error:   crosses initialization of `float resultat2'
D:\Documents and Settings\M\Bureau\C\Projet 1\Source\FIRST PROGRAM v1.0.cpp:31: error:   crosses initialization of `float resultat'

Exécution terminée



le problème ne **orthographe !** pas que de case apparament mais bon...


merci d'avance
Journalisée
Leptis

Profil challenge

Classement : 154/55017

Membre Junior
**
Hors ligne Hors ligne
Messages: 84


Voir le profil
« #1 le: 24 Novembre 2006 à 18:46:56 »

Les variables ne doivent pas être initialisé dans les conditions du moins dans ce cas !!!  (c'est moins embigue maintenant )
De plus sa ne sert a rien de crer toute ces variables, cré un tableau.
Voila ce que sa pourrai donner avec les switch + une fonction.

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

int text(float nombre[],int signe)
{
       printf("Enter the first number :  ");
       scanf("%f", &nombre[1]);
       printf("\nEnter the second number :  ");
       scanf("%f", &nombre[2]);
       switch(signe)
  {
       case 1:
            nombre[0] = nombre[1] + nombre[2];
            printf("\nResult of %f + %f  is  =  %f", nombre[1], nombre[2], nombre[0]);
            return 0;
       
       case 2:
            nombre[0] = nombre[1] * nombre[2];
            printf("\nResult of %f * %f  is  =  %f", nombre[1], nombre[2], nombre[0]);
            return 0;
           
       case 3:
            nombre[0] = nombre[1] - nombre[2];
            printf("\nResult of %f - %f  is  =  %f", nombre[1], nombre[2], nombre[0]);
            return 0;
           
       case 4:
            if(nombre[2]==0)
            {
             printf("division par 0 impossible");
             return 0;
             }          
             nombre[0] = nombre[1] / nombre[2];
             printf("\nResult of %f / %f  is  =  %f", nombre[1], nombre[2], nombre[0]);
             return 0;
  }
}

int main(int argc, char *argv[])
{
  int choice = 0;
  float nombre[]={0,0,0};
 
  do{
  system("cls");
  printf(" --------------------------\n");
  printf("| .-=FIRST PROGRAM v1.0=-. |\n");
  printf(" --------------------------\n\n\n");
  printf("Please select your choice :   ");
 
  printf("\n\n1- Addition\n2- Multiplication\n3- Soustraction\n4- Division\n\n\n");
  scanf("%d", &choice);
  }while ((choice != 1) && (choice != 2) && (choice != 3) && (choice != 4 ));
 
   text(nombre,choice);
   printf("\n\n\nIt was  :  FIRST PROGRAM v1.0  by t0Xic.h, remake a little bit by Leptis ^^\n\n\n");
   getch();
       
  return 0;
}
Journalisée
Beat
Profil challenge

Classement : 34947/55017

Néophyte
*
Hors ligne Hors ligne
Messages: 5


Voir le profil
« #2 le: 24 Novembre 2006 à 19:08:38 »

il semble ne plus y avoir des bugs lors de la compil mais les calculs ne sont vraiment , mais alors vraimen pas juste du tout

                    exemple :   1+1 =  12543214000000.2223354

je crois que les variables ne sont pas correctement initialisées ou que les valeures ne sont pas correctement affectée (memoire)

vous en pensez quoi ???

merci quand même
Journalisée
s3th
Relecteur

Profil challenge

Classement : 421/55017

Membre Héroïque
*
Hors ligne Hors ligne
Messages: 645


Voir le profil WWW
« #3 le: 24 Novembre 2006 à 19:46:50 »

je ne sais pas si ca a une influence les espaces et les virgules dans la definition des variables.

,chiffre1, chiffre2 ,chiffre3, chiffre4,chiffre5, chiffre6,chiffre7
Journalisée

..\m/..  Tout n'est qu'illusion ..\m/..

http://backtrack-fr.net/

3NJ0Y et non pas enjoy comme certaine tapz
_o_
Relecteur

Profil challenge

Classement : 43/55017

Membre Héroïque
*
Hors ligne Hors ligne
Messages: 1258


Voir le profil
« #4 le: 24 Novembre 2006 à 19:56:14 »

Citation de: Beat
je crois que les variables ne sont pas correctement initialisées ou que les valeures ne sont pas correctement affectée (memoire)
En C, l'initialisation des variables est à la charge du programmeur. Une excellente habitude est de systématiquement affecter une valeur par défaut à une variable lors de sa déclaration :
Code:
int plop = 0;
char chaine[25] = "";
FILE *in = NULL;
Sinon, je signale que dans le code, là, on voit pleins de trucs bancals :
- le scanf  met un entier dans un caractère.
- le switch se fait sur un caractère, mais la comparaison par case se fait sur un entier (la conséquence de ces deux trucs là, c'est que ça peut compiler, mais ça va clairement pas donner les résultats espérés).
Note sur les deux points précédents : un bon compilo (je connais pas le tien) a toujours des paramètres permettant de compiler en affichant tous les avertissements. C'est toujours  une bonne habitude de l'utiliser, un avertissement à la compil indique au mieux que l'on ne fait pas les choses comme c'est prévu, au pire qu'il y a un gros bug.
- y'a possibilité de réaliser une division par zéro, car le cas n'est pas testé.
- les affichages donnent toujours une addition, quelque soit l'opération réalisée.
- selon les compilos (et les normes qu'ils suivent), on peut ne pas avoir le droit de déclarer des variables au milieu d'un bloc (les float result seraient à déplacer).
- essayez tous (c'est pas la première fois que je le vois) d'éviter de faire des appels à system(), surtout si c'est pour appeler un utilitaire clairement disponible sur une seule plateforme. Le truc n'est donc pas portable.


Citation de: Leptis
une variable ne dois jamais etre initialisé dans une condition !!!!!
Première nouvelle. Les variables doivent être déclarées au début d'un bloc. Ce bloc peut aussi bien être dans un case, un if, ou n'importe quelle structure de contrôle. Au contraire, d'ailleurs, c'est une excellente idée de limiter la portée d'une variable en la déclarant dans le seul bloc où elle a un sens, ça évite plein de bugs idiots et chiants à trouver.
Journalisée

Les épreuves de hack de NC sont trop faciles ? Et pourtant ! Bienvenue dans la vraie vie : http://thedailywtf.com/Articles/So-You-Hacked-Our-Site!.aspx
Leptis

Profil challenge

Classement : 154/55017

Membre Junior
**
Hors ligne Hors ligne
Messages: 84


Voir le profil
« #5 le: 24 Novembre 2006 à 20:15:22 »

Citation
Première nouvelle. Les variables doivent être déclarées au début d'un bloc. Ce bloc peut aussi bien être dans un case, un if, ou n'importe quelle structure de contrôle. Au contraire, d'ailleurs, c'est une excellente idée de limiter la portée d'une variable en la déclarant dans le seul bloc où elle a un sens, ça évite pleins de bugs idiots et chiant à trouver.
Je parlait dans ce cas si, il est inutile de déclarer tous ces float puisque au final seulement seul 3 varibles servent dans chaques cas (à initialiser avant le switch (condition)).
Journalisée
Beat
Profil challenge

Classement : 34947/55017

Néophyte
*
Hors ligne Hors ligne
Messages: 5


Voir le profil
« #6 le: 24 Novembre 2006 à 20:32:23 »

merci à tous  
je crois qu'il n' y a plus de quoi chômer là ...
Journalisée
neoflo
Profil challenge

Classement : 8163/55017

Membre Complet
***
Hors ligne Hors ligne
Messages: 171


Voir le profil WWW
« #7 le: 24 Novembre 2006 à 21:24:37 »

Citation de: _o_
Une excellente habitude est de systématiquement affecter une valeur par défaut à une variable lors de sa déclaration
Pourtant, la plupart des programmeurs C sont d'accord sur le fait de séparer déclaration et affectation.


Je dis au passage que :

Code:
float chiffre1, chiffre2;
       printf("Enter the first number :  ");
       scanf("%lf", &chiffre1);
       printf("\nEnter the second number :  ");
       scanf("%lf", &chiffre2);
       
       float resultat = chiffre1 + chiffre2;
       printf("\nResult of %lf + %lf  is  =  %lf", chiffre1, chiffre2, resultat);
       break;
Tu as toujours une forme similiaire pour chaque cas de ton switch. Tu devrais penser à utiliser une fonction pour plus de clareté
Journalisée

zours

Profil challenge

Classement : 555/55017

Membre Héroïque
*****
Hors ligne Hors ligne
Messages: 811


Voir le profil
« #8 le: 24 Novembre 2006 à 21:57:02 »

Citation de: neoflo
Pourtant, la plupart des programmeurs C sont d'accord sur le fait de séparer déclaration et affectation.
C'est pas que pour le C, d'ailleurs. Pour la plupart des langages, on conseille de déclarer les variables en début de bloc, proprement, et sans initialisation, avec si nécessaire du commentaire pour en expliquer l'utilité. Le "dictionnaire de données", quoi.

Par contre, on conseille aussi de les initialiser juste après si possible, ou d'y faire très attention par la suite.
Journalisée
Gardel

Profil challenge

Classement : 676/55017

Membre Héroïque
*****
Hors ligne Hors ligne
Messages: 1012


Voir le profil
« #9 le: 25 Novembre 2006 à 00:07:54 »

Qu'est-ce que ça apporte de plus de déclarer une variable sans lui affecter de valeur directement ?
Journalisée

Selon le postulat que les filles, c'est du temps accordé et de l'argent dépensé : Filles = Temps . Argent
Et comme chacun le sait, "le temps c'est de l'argent", donc : Temps = Argent
Par conséquent : Filles = Argent . Argent
Et parce que, "l'argent est la racine du mal" : Argent = sqrt(Mal)
On en déduit que : Filles = sqrt(Mal).sqrt(Mal)
Force est de constater que : Filles = Mal
neoflo
Profil challenge

Classement : 8163/55017

Membre Complet
***
Hors ligne Hors ligne
Messages: 171


Voir le profil WWW
« #10 le: 25 Novembre 2006 à 00:53:37 »

Citation de: Gob
Qu'est-ce que ça apporte de plus de déclarer une variable sans lui affecter de valeur directement ?
Je vais essayer de te donner des éléments de réponses pour le langage C.

Pour des raisons historiques, on a défini pas mal de compilateur où les blocs d'instructions étaient découpés en : déclaration | liste d'instruction. La grammaire de ce type de langage est beaucoup plus simple à écrire. C'est une habitude que certains ont pris

De même, dans les notations algorithmiques classiques qui font intervenir des déclarations, on déclare déjà tout avant sans les initialiser à l'instar des langages décrites par le type de grammaire que j'ai donné avant.

Avant la norme C89 (même C99 pour certains cas), le fait de devoir placer les déclarations en début de bloc était une contrainte du langage. C'est vraiment que maintenant, c'est plutôt devenu une contrainte méthodologique car ça peut permettre de gagner en lisibilité.

Lorsque le nombre de déclaration est assez importante, cela rend plus lisible les commentaires liés à l'utilisation d'une variable particulière.

Cela dit, certains types de variables nécessite de les initialiser dès la déclaration, notamment les variables static (elles sont déclarés et initialisé une seule fois dans toute l'exécution du programme).




Ensuite, je ne parle pas des initialisations en cascade du type :

int i,j,k;

C'est aussi à éviter car certaines erreurs arrivent fréquemment, notamment avec des déclarations du type :

Code:
FILE* f1, f2;
Et oui, c'est une feinte, f2 n'est pas de type FILE* mais du type FILE.
Journalisée

Nebelmann

Profil challenge

Classement : 470/55017

Membre Héroïque
*****
Hors ligne Hors ligne
Messages: 1357


Voir le profil
« #11 le: 25 Novembre 2006 à 09:32:36 »

Citation
C'est aussi à éviter car certaines erreurs arrivent fréquemment, notamment avec des déclarations du type :

Code:
FILE* f1, f2;

Et oui, c'est une feinte, f2 n'est pas de type FILE* mais du type FILE.
suffit d'écrire :
Code:
FILE *f1, f2;
et il n'y a plus aucune ambiguïté...
Journalisée

-- Nebelmann -- Registered linux user #429186
«Si les lecteurs étaient des compilateurs, les posteurs feraient peut-être davantage attention à ce qu'ils écrivent...»
neoflo
Profil challenge

Classement : 8163/55017

Membre Complet
***
Hors ligne Hors ligne
Messages: 171


Voir le profil WWW
« #12 le: 25 Novembre 2006 à 10:56:11 »

Citation de: Nebelmann
FILE *f1, f2;
et il n'y a plus aucune ambiguïté...
Heu, tu as recopié la même chose que moi

Ah si, tu as déplacé l'* sur le f1... Enfin, c'est bof comme changement.
Journalisée

Nebelmann

Profil challenge

Classement : 470/55017

Membre Héroïque
*****
Hors ligne Hors ligne
Messages: 1357


Voir le profil
« #13 le: 25 Novembre 2006 à 10:57:27 »

Pas du tout, j'a collé l'étoile à f1 pour enlever le piège : le pointeur n'est plus considéré sur FILE mais sur f1 !
Journalisée

-- Nebelmann -- Registered linux user #429186
«Si les lecteurs étaient des compilateurs, les posteurs feraient peut-être davantage attention à ce qu'ils écrivent...»
neoflo
Profil challenge

Classement : 8163/55017

Membre Complet
***
Hors ligne Hors ligne
Messages: 171


Voir le profil WWW
« #14 le: 25 Novembre 2006 à 11:01:16 »

Citation de: Nebelmann
Pas du tout, j'a collé l'étoile à f1 pour enlever le piège : le pointeur n'est plus considéré sur FILE mais sur f1 !
Je sais très bien que l'exemple que je vais donner ne devrait pas arriver. Mais on sait jamais, si on reprend une bibliothèque fait ce type d'erreur (ça peut arriver pour des amateurs), ça fout tout en l'air :

Code:
#define Fichier FILE*

Fichier a,b;
a et b ne sont plus du même type.


EDIT : j'ai déjà vu des mini bibliothèques de fonctions fait pas des scientifiques pas forcement très bon programmeur... Ca ne respecte pas forcement trop le codage habituel en C


EDIT2 : Enfin, je dis ça (pour la séparation initialisations/déclarations), mais ça m'arrive de le faire
Journalisée

Pages: [1] 2
  Imprimer  
 
Aller à: