Problème type de variable - langage C

Résolu/Fermé
anthony - 17 févr. 2010 à 19:22
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 - 18 févr. 2010 à 08:23
Bonjour,
voici un code qui marche très bien malgré le faite que le programme n'est pas terminé:
#include <stdio.h>
int main(void)
{
    int somme, cinq_cent, deux_cent, cent, billet50, billet20,billet10, cinq, deux, un, centime50, centime20, centime10, centime5, centime2, centime1, reste;

    puts("Entrez une somme");
    scanf("%d", &somme);

    cinq_cent = somme / 500; /* partage(division) la somme en billet de 500 */
    reste = somme % 500; /* prend le reste du partage de la somme des billet de 500 */
    deux_cent = reste / 200; /* le reste en le partage en billet de 200 */
    reste = reste % 200; /* prend le reste du partage de la somme des billet de 200 */
    cent = reste / 100; /* idem que le 1er calcul */
    reste = reste % 100; /* idem que le 2 eme calcul */
    billet50 = reste / 50;
    reste = reste % 50;
    billet20 = reste / 20;
    reste = reste % 20;
    billet10 = reste / 10;
    reste = reste % 10;
    cinq = reste / 5;
    reste = reste % 5;
    deux = reste / 2;


    printf("la somme est de %d :", somme);
    printf("\n%d billet(s) de 500 \n%d billet(s) de 200 \n%d billet(s) de 100 \n%d billet(s) de 50 \n%d billet(s) de 20 \n%d billet(s) de 10\
    \n%d piece(s) de 5 \n%d piece(s) de 2", cinq_cent, deux_cent, cent, billet50, billet20, billet10, cinq, deux );

    return 0;
}


mais le programme a des variables de centimes donc le type float serait le plus approprié, mais quand je met le type float voici ce qui se passe:
#include <stdio.h>
int main(void)
{
    float somme, cinq_cent, deux_cent, cent, billet50, billet20,billet10, cinq, deux, un, centime50, centime20, centime10, centime5, centime2, centime1, reste;

    puts("Entrez une somme");
    scanf("%f", &somme);

    cinq_cent = somme / 500; /* partage(division) la somme en billet de 500 */
    reste = somme % 500; /* prend le reste du partage de la somme des billet de 500 */
    deux_cent = reste / 200; /* le reste en le partage en billet de 200 */
    reste = reste % 200; /* prend le reste du partage de la somme des billet de 200 */
    cent = reste / 100; /* idem que le 1er calcul */
    reste = reste % 100; /* idem que le 2 eme calcul */
    billet50 = reste / 50;
    reste = reste % 50;
    billet20 = reste / 20;
    reste = reste % 20;
    billet10 = reste / 10;
    reste = reste % 10;
    cinq = reste / 5;
    reste = reste % 5;
    deux = reste / 2;


    printf("la somme est de %f :", somme);
    printf("\n%.2f billet(s) de 500 \n%.2f billet(s) de 200 \n%.2f billet(s) de 100 \n%.2f billet(s) de 50 \n%.2f billet(s) de 20 \n%.2f billet(s) de 10\
    \n%.2f piece(s) de 5 \n%.2f piece(s) de 2", cinq_cent, deux_cent, cent, billet50, billet20, billet10, cinq, deux );

    return 0;
}


et voici les erreur:
C:\Users\Anthony\Documents\test\main.c||In function `main':|
C:\Users\Anthony\Documents\test\main.c|10|error: invalid operands to binary %|
C:\Users\Anthony\Documents\test\main.c|12|error: invalid operands to binary %|
C:\Users\Anthony\Documents\test\main.c|14|error: invalid operands to binary %|
C:\Users\Anthony\Documents\test\main.c|16|error: invalid operands to binary %|
C:\Users\Anthony\Documents\test\main.c|18|error: invalid operands to binary %|
C:\Users\Anthony\Documents\test\main.c|20|error: invalid operands to binary %|
C:\Users\Anthony\Documents\test\main.c|22|error: invalid operands to binary %|
C:\Users\Anthony\Documents\test\main.c|4|warning: unused variable `un'|
C:\Users\Anthony\Documents\test\main.c|4|warning: unused variable `centime50'|
C:\Users\Anthony\Documents\test\main.c|4|warning: unused variable `centime20'|
C:\Users\Anthony\Documents\test\main.c|4|warning: unused variable `centime10'|
C:\Users\Anthony\Documents\test\main.c|4|warning: unused variable `centime5'|
C:\Users\Anthony\Documents\test\main.c|4|warning: unused variable `centime2'|
C:\Users\Anthony\Documents\test\main.c|4|warning: unused variable `centime1'|
||=== Build finished: 7 errors, 7 warnings ===|


j'ai essayé de caster mais sa n'a fait que de baisser le nombre d'erreur:

#include <stdio.h>
int main(void)
{
    float somme, cinq_cent, deux_cent, cent, billet50, billet20,billet10, cinq, deux, un, centime50, centime20, centime10, centime5, centime2, centime1, reste;

    puts("Entrez une somme");
    scanf("%f", &somme);

    cinq_cent = (int)somme / 500; /* partage(division) la somme en billet de 500 */
    reste = (int)somme % 500; /* prend le reste du partage de la somme des billet de 500 */
    deux_cent = (int)reste / 200; /* le reste en le partage en billet de 200 */
    reste = (int)reste % 200; /* prend le reste du partage de la somme des billet de 200 */
    cent = (int)reste / 100; /* idem que le 1er calcul */
    reste = (int)reste % 100; /* idem que le 2 eme calcul */
    billet50 = (int)reste / 50;
    reste = (int)reste % 50;
    billet20 = (int)reste / 20;
    reste = (int)reste % 20;
    billet10 = (int)reste / 10;
    reste = (int)reste % 10;
    cinq = (int)reste / 5;
    reste = (int)reste % 5;
    deux = (int)reste / 2;
    reste = (int)reste % 2;
    un = (int)reste;
    centime50 = reste / 0.50;
    reste = (int)reste % 0.50;
    centime20 = (int)reste / 0.20;
    reste = (int)reste % 0.20;
    centime10 = (int)reste / 0.10;
    reste = (int)reste % 0.10;
    centime5 = (int)reste / 0.05;
    reste = (int)reste % 0.05;
    centime2 = (int)reste / 0.02;
    reste = (int)reste % 0.02;
    centime1 = (int)reste / 0.01;



    printf("la somme est de %f :", somme);
    printf("\n%.2f billet(s) de 500 \n%.2f billet(s) de 200 \n%.2f billet(s) de 100 \n%.2f billet(s) de 50 \n%.2f billet(s) de 20 \n%.2f billet(s) de 10\
    \n%.2f piece(s) de 5 \n%.2f piece(s) de 2 \n%.2f piece(s) de 1 \n%.2f piece(s) de 50 centime(s) \n%.2f piece(s) de 20 centime(s)\
    \n%.2f piece(s) de 10 centime(s) \n%.2f piece(s) de 5 centime(s) \n%.2f piece(s) de 2 centime(s) \n%.2f piece(s) de 1 centime(s)", cinq_cent, deux_cent, cent, billet50, billet20, billet10, cinq, deux, un, centime50, centime20, centime10, centime5, centime2, centime1);

    return 0;
}


erreur:
C:\Users\Anthony\Documents\test\main.c||In function `main':|
C:\Users\Anthony\Documents\test\main.c|27|error: invalid operands to binary %|
C:\Users\Anthony\Documents\test\main.c|29|error: invalid operands to binary %|
C:\Users\Anthony\Documents\test\main.c|31|error: invalid operands to binary %|
C:\Users\Anthony\Documents\test\main.c|33|error: invalid operands to binary %|
C:\Users\Anthony\Documents\test\main.c|35|error: invalid operands to binary %|
||=== Build finished: 5 errors, 0 warnings ===|
A voir également:

3 réponses

Quel language ?
0
le langage C
0
Pacorabanix Messages postés 3248 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 661
17 févr. 2010 à 21:12
le "modulo" ne fonctionne que sur les entiers (c'est donc la cause de ce message d'erreur).

(De plus, en général, en informatique il vaut mieux éviter de travailler avec des flottants (à cause des erreurs d'arrondi et du ralentissement des calculs : environ 4 fois plus lents).)

voici les solutions possibles :

1) Tu comptes tout en centimes ! Ainsi tu n'auras que des nombres entiers.
2) Dans ton cas, les erreurs d'arrondis ne devraient pas poser trop de problèmes.
Alors tu peux quand même garder des floats, et utiliser la fonction fmod() ou modf() je ne sais plus (qui fait le modulo sur des flottants) de la bilio math.h
0
ah et ben voila mon nouveau code et voici ce que sa m'affiche :
#include <stdio.h>
int main(void)
{
    float somme, cinq_cent, deux_cent, cent, billet50, billet20,billet10, cinq, deux, un, centime50, centime20, centime10, centime5, centime2, centime1, reste;

    puts("Entrez une somme");
    scanf("%d", &somme);

    cinq_cent = somme / 500; /* partage(division) la somme en billet de 500 */
    reste = fmod(somme, 500); /* prend le reste du partage de la somme des billet de 500 */
    deux_cent = reste / 200; /* le reste en le partage en billet de 200 */
    reste = fmod(reste, 200); /* prend le reste du partage de la somme des billet de 200 */
    cent = reste / 100; /* idem que le 1er calcul */
    reste = fmod(reste, 100); /* idem que le 2 eme calcul */
    billet50 = reste / 50;
    reste = fmod(reste, 50);
    billet20 = reste / 20;
    reste = fmod(reste, 20);
    billet10 = reste / 10;
    reste = fmod(reste, 10);
    cinq = reste / 5;
    reste = fmod(reste, 5);
    deux = reste / 2;
    reste = fmod(reste, 2);
    un = reste;
    centime50 = reste / 0.50;
    reste = (reste, 0.50);
    centime20 = fmod(reste, 0.20);
    reste = fmod(reste, 0.20);
    centime10 = reste / 0.10;
    reste = fmod(reste, 0.10);
    centime5 = reste / 0.05;
    reste = fmod(reste, 0.05);
    centime2 = reste / 0.02;
    reste = fmod(reste, 0.02);
    centime1 = reste / 0.01;



    printf("la somme est de %d :", somme);
    printf("\n%.2f billet(s) de 500 \n%.2f billet(s) de 200 \n%.2f billet(s) de 100 \n%.2f billet(s) de 50 \n%.2f billet(s) de 20 \n%.2f billet(s) de 10\
    \n%.2f piece(s) de 5 \n%.2f piece(s) de 2 \n%.2f piece(s) de 1 \n%.2f piece(s) de 50 centime(s) \n%.2f piece(s) de 20 centime(s)\
    \n%d piece(s) de 10 centime(s) \n%.2f piece(s) de 5 centime(s) \n%.2f piece(s) de 2 centime(s) \n%.2f piece(s) de 1 centime(s)", cinq_cent, deux_cent, cent, billet50, billet20, billet10, cinq, deux, un, centime50, centime20, centime10, centime5, centime2, centime1);

    return 0;
}


résultat:
Entrez une somme
252
la somme est de 0 :
0.50 billet(s) de 500
1.26 billet(s) de 200
0.52 billet(s) de 100
1.04 billet(s) de 50
0.10 billet(s) de 20
0.20 billet(s) de 10
0.40 piece(s) de 5
1.00 piece(s) de 2
0.00 piece(s) de 1
0.00 piece(s) de 50 centime(s)
0.10 piece(s) de 20 centime(s)
0 piece(s) de 10 centime(s)
0.00 piece(s) de 5 centime(s)
0.00 piece(s) de 2 centime(s)
0.00 piece(s) de 1 centime(s)
Process returned 0 (0x0)   execution time : 2.214 s
Press any key to continue.


je ne comprends pas ce résultat
0
anthony > anthony
17 févr. 2010 à 22:49
en faite si, je viens de le comprendre, mais en faite je viens de remarquer qu'il y a une partit (les euro) ou il y a des reste entier et une autre partit (les centimes) ou en est obliger de diviser pas des nombre décimale
0
Pacorabanix Messages postés 3248 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 661 > anthony
18 févr. 2010 à 00:51
il faut revoir ton algorithme en fonction de ce que font modf() et fmod(). Tu ne peux pas utiliser la division comme avec les nombres entiers (comme dans ton premier prog), car avant c'était une division entière (avec reste, comme quand on pose à l'école) là avec tes float ça devient une vraie division.
0
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
18 févr. 2010 à 08:23
Il est clair que la meilleur solution est de travailler avec des centimes et de ne faire la convertion en euros (en float) que pour l'affichage. ça simplifiera le tout.
0