Operatins mathematiqus en C

Résolu/Fermé
Censured_51 Messages postés 304 Date d'inscription vendredi 10 octobre 2008 Statut Membre Dernière intervention 10 mars 2010 - 13 juin 2009 à 17:03
Censured_51 Messages postés 304 Date d'inscription vendredi 10 octobre 2008 Statut Membre Dernière intervention 10 mars 2010 - 19 juin 2009 à 10:36
Bonjour,
J'aimerais savoir ce qu'il cloche ( a la ligne 13 ) :



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

int main(int argc, char *argv[])
{
long age;
printf("Quel age as tu ?\t");
scanf("%ld",&age);
printf("Alors tu as %ld ans !!\n",age);
long resultat = age + 3;
printf("Si j'addtionne ton age avec 3, ca donne : %ld\n", resultat);
int resultat02 = resultat / 7.0;
int resultat0201 = resultat % 7.0;
printf("En divisant le nombre trouve par 7 j'obtiens %lf et si il y a un reste il est egale a %ld", resultat02, resultat0201);
system("PAUSE");

return 0;
}


J'ai du mal avec le modulo =)

10 réponses

Utilisateur anonyme
13 juin 2009 à 17:41
Salut, essaies cela

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

int main(int argc, char *argv[])
{
    long age=0;
    int resultat=0, resultat02=0, resultat0201=0;
    printf("Quel age as tu ?\t");
    scanf("%ld",&age);
    printf("\nAlors tu as %ld ans !!\n",age);
    resultat = age + 3;
    printf("Si j'addtionne ton age avec 3, ca donne : %ld\n", resultat);
    resultat02 = resultat / 7;
    resultat0201 = resultat % 7;
    printf("En divisant le nombre trouve par 7 j'obtiens %lf et si il y a un reste il est egale a %ld\n\n", resultat02, resultat0201);
    system("PAUSE");

return 0;
}


J'ai enlever le ".0" au "7" du modulo. Et j'ai déclaré les variables avants (plus net je trouve, mais tu fais comme tu veut...)


Au fait : Pour le modulo, il existe une autre méthode

La fonction "fmod" de la librairie "math.h"

Syntaxe : fmod(premier_nombre,deuxieme_nombre);

Ton programme avec fmod :


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

int main(int argc, char *argv[])
{
    long age=0;
    int resultat=0, resultat02=0, resultat0201=0;
    printf("Quel age as tu ?\t");
    scanf("%ld",&age);
    printf("\nAlors tu as %ld ans !!\n",age);
    resultat = age + 3;
    printf("Si j'addtionne ton age avec 3, ca donne : %ld\n", resultat);
    resultat02 = resultat / 7;
    resultat0201 = fmod(resultat,7);
    printf("En divisant le nombre trouve par 7 j'obtiens %lf et si il y a un reste il est egale a %ld\n\n", resultat02, resultat0201);
    system("PAUSE");

    return 0;
}


@+
0
poukkid Messages postés 106 Date d'inscription mercredi 20 mai 2009 Statut Membre Dernière intervention 11 avril 2012 11
13 juin 2009 à 17:42
mmm, ca m'étonnerait que modulo accepte un réel.
remplace par
int resultat0201 = resultat % 7;

(j'arrive un peu tard on dirait)
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 836
13 juin 2009 à 17:52
Salut,
Pas de double dans un modulo.
C'est une opération définie pour les entiers. Donc int resultat02 = resultat / 7;

Sinon, tu mélanges un peu les types.

printf("En divisant le nombre trouve par 7 j'obtiens %lf et si il y a un reste il est egale a %ld\n\n", resultat02, resultat0201);
resultat02 est un int et non un double. De plus dans printf, on utilise %f pour afficher un double (et non %lf).
resultat0201 est un int, donc ne l'affiche pas en tant que long int (ld).

Cdlt
0
Censured_51 Messages postés 304 Date d'inscription vendredi 10 octobre 2008 Statut Membre Dernière intervention 10 mars 2010 25
13 juin 2009 à 18:32
Merci a toi fiddy mais avant tout saches que je débutes ; j'ai commencé aujourd'hui...
En tout cas merci de ta réponse et bonne soirée
0
mamiemando Messages postés 33093 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 4 mai 2024 7 751
14 juin 2009 à 02:19
J'ajouterais pour compléter ce que dit fiddy qu'en C les variables sont sensées être déclarées en début de bloc (par exemple au début d'une fonction). Dans ton cas ça marche parce que tu utilises un compilateur C++ sans le savoir (et dans ce cas là autant tirer parti des possibilités du C++, comme par exemple les flux au lieu des printf/scanf).

Idéalement tu devrais contrôler que ton scanf est parvenu à lire avec succès la valeur saisie par l'utilisateur (s'il n'a pas écrit un nombre ou une valeur négative, c'est l'échec).

Dans ton programme tu n'utilises ni argc ni arv donc tu devrais normalement utiliser :
int main(){
  //....
  return 0;
}

Enfin, l'instruction system("PAUSE") est à proscrire. Je me demande toujours qui inculque au débutant cette instruction qui me fait littéralement voir rouge : elle n'est pas portable (comprendre ça ne marche que sous windows) et elle peut être remplacée par un getchar() qui lui est portable !
int main(){
  //....
  getchar();
  return 0;
}

Bonne chance
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 836
14 juin 2009 à 12:52
Salut
Eh non, même en C on peut déclarer des instructions en milieu de code avec la norme C99. Après c'est une question de préférence.
Pour le system ce sont certains IDE sous windows qui le mettent. Mais c'est vrai que le getchar est mieux. Mais dans ce cas faut faire attention a bien vider le buffer clavier.
D'ailleurs en parlant de bonne habitude, je tiens a préciser qu'en C il faut mettre void en arguments pour spécifier que le prototype n'admet pas d'arguments. Sinon la fonction n'est pas correctement définie. En C++ ce n'est pas le cas.
Cdlt
0

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

Posez votre question
mamiemando Messages postés 33093 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 4 mai 2024 7 751
14 juin 2009 à 14:04
Hello fiddy,

Eh non, même en C on peut déclarer des instructions en milieu de code avec la norme C99. Après c'est une question de préférence.

Effectivement ça a changé. Dans le temps on ne pouvait pas.

Pour le system ce sont certains IDE sous windows qui le mettent. Mais c'est vrai que le getchar est mieux. Mais dans ce cas faut faire attention a bien vider le buffer clavier.

Ok (pour les deux points).

D'ailleurs en parlant de bonne habitude, je tiens a préciser qu'en C il faut mettre void en arguments pour spécifier que le prototype n'admet pas d'arguments. Sinon la fonction n'est pas correctement définie.

Personnellement je n'ai jamais eu de problème de ce genre. Ça se produit dans quel cas ?
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 836
14 juin 2009 à 19:53
Personnellement je n'ai jamais eu de problème de ce genre. Ça se produit dans quel cas ?
Ce n'est pas un gros problème en soi, juste une bonne habitude. Par exemple, si tu définis une fonction avec le prototype "void toto(int a)", si tu l'appelles par "toto();", le compilateur va te le signaler puisque le prototype aura été défini. Si par contre tu déclares la fonction par "void toto()", et que tu l'appelles par "toto(5)", le compilateur dira rien. Ce qui s'explique par le fait que le prototype n'est pas clairement défini.
D'où l'intérêt d'utiliser "void toto(void)".
0
mamiemando Messages postés 33093 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 4 mai 2024 7 751
14 juin 2009 à 20:09
Ok je ne savais pas. Apparemment quand ta fonction est déclarée avec ( ) tu peux lui passer un nombre quelconque d'arguments qui seront ignorés. Drôle de choix mais pourquoi pas...
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 836
14 juin 2009 à 20:35
Apparemment quand ta fonction est déclarée avec ( ) tu peux lui passer un nombre quelconque d'arguments qui seront ignorés.
C'est normal car "void toto()" n'est pas qu'une déclaration de toto ne renvoyant pas de variable, mais ce n'est pas un prototype. Pour que le prototype soit donné, il faut spécifier le type de l'argument.

En C, il faut déclarer les fonctions avec leur prototype pour programmer proprement. D'autant plus que l'après C99 mettra normalement un message d'erreur lorsque le prototype ne sera pas donné.
0
mamiemando Messages postés 33093 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 4 mai 2024 7 751
14 juin 2009 à 23:26
Ok... Dommage pour tous les gens qui n'ont pas mis les void :s
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 836
15 juin 2009 à 20:52
T'inquiète, il y aura toujours la possibilité de compiler dans les normes précédentes comme c'est le cas actuellement ;-))).
0
Censured_51 Messages postés 304 Date d'inscription vendredi 10 octobre 2008 Statut Membre Dernière intervention 10 mars 2010 25
19 juin 2009 à 10:36
Merci les gars je pense avoir compris mes erreurs.
0