exercice en C (débutant)

petite coupures

Le problème exposé dans ce sujet a été résolu.

bonjour tout le monde. débutant en C je suis les cours proposés ici et je bute sur un exercice ,en sommes pas compliqué mais ou je comprends pas l’erreur de mon code,cet exo est sur une somme d’argent que l’on doit donner en petite coupure de maniere minimale je sais qu’il y a de meilleures methodes pour le coder ,mais pq ca ne marche pas malgré tout??

void coupure( int somme)
{

    int reste;
    int cent,cinquante,vingt,dix,cinq,deux,un = 0;



         for(int i=1;(100*i)<=somme;i++)
        {

            cent++;
        }
         reste=somme-(100*cent);


         for(int j=1;(50*j)<=reste;j++)
        {
            cinquante++;
        }

      reste-=(50*cinquante);




    printf("%d billets de 100\n%d billets de 50\n%d:",cent,cinquante);
}

dans cette fonction je recois la somme rentrée par l’utilisateur,OK ensuite je calcule le maximum de billets de cent délivrable pour la somme ;OK ma variable "reste= somme-(100*cent)" donne le bon resultat. le pb est quand je passe a la deuxieme boucle for ou là j’utile la variable "reste",le resultat est incoherent. il y a une raison ?? merci d’avance.

Bonjour,

Quelle est l’incohérence en question ?

En regardant le code je ne suis pas sûr que toutes tes variables soient correctement initialisées.

Aussi, ton printf présente un %d final qui n’est lié à aucun argument.

Salut,

C’est le genre d’erreur classique que ton compilateur va voir si tu compiles avec les warnings qui vont bien (en l’occurence -Wuninitialized qui fait partie de -Wall et -Wextra). Si je ne m’abuse, c’est ce qui est préconisé par le tuto C.

Au lieu de : int cent,cinquante,vingt,dix,cinq,deux,un = 0;

Préfère : int cent = 0,cinquante = 0,vingt = 0,dix = 0,cinq = 0,deux = 0,un = 0;

Ou un autre truc, du genre :

int cent,cinquante,vingt,dix,cinq,deux,un;
cent,cinquante,vingt,dix,cinq,deux,un = 0;

Moi je ferais un truc comme ça :

void coupure(int somme)
{

    int reste = somme;
    int cent = 0, cinquante = 0, vingt = 0, dix = 0, cinq = 0, deux = 0, un = 0;
    
    while(reste >= 100) {
        for(int i=0;(i*100)<=reste;++i) {
            ++cent;
            reste-=100;
        }
    }
    while(reste >= 50) {
        for(int i=0;(i*50)<=reste;++i) {
            ++cinquante;
            reste-=50;
        }
    }
    while(reste >= 20) {
        for(int i=0;(i*20)<=reste;++i) {
            ++vingt;
            reste-=20;
        }
    }
    
    while(reste >= 1) {
        for(int i=0;(i*1)<=reste;++i) {
            ++un;
            reste-=1;
        }
    }


    printf("%d billets de 100\n%d billets de 50\n%d billets de 20\n%d 'billets' de 1\n:",cent,cinquante,vingt,un);
}

int main()
{
    coupure(554);

    return 0;
}

Résultat :

5 billets de 100
1 billets de 50
0 billets de 20
4 'billets' de 1
+1 -0

Voilà ma version qui utilise des concepts un poil plus avancés (pointeur et fonction) :

#include <stdio.h>

// cette fonction retire valeur_billet autant de fois que possible de *somme
// et retourne le nombre de fois.
int retirer_billets_de_somme(int* somme, int valeur_billet) {
   int nombre_billets = 0;
   
   while (*somme >= valeur_billet) {
      ++nombre_billets;
      *somme -= valeur_billet;
   }
   return nombre_billets;
}

void coupure(int somme) {
    int nombre_billets_cent = retirer_billets_de_somme(&somme, 100);
    int nombre_billets_cinquante = retirer_billets_de_somme(&somme, 50);
    int nombre_billets_vingt = retirer_billets_de_somme(&somme, 20);
    int nombre_billets_un = retirer_billets_de_somme(&somme, 1);

    printf("%d billets de 100\n%d billets de 50\n%d billets de 20\n%d 'billets' de 1\n", nombre_billets_cent, nombre_billets_cinquante, nombre_billets_vingt, nombre_billets_un);
}

int main() {
    coupure(554);
    return 0;
}

Ca permet d’écrire la boucle while une seule fois au lieu de 4 ;)

+1 -0

Voici ma contribution. Je suppose que la caisse dispose d’une infinité de billets:

#include <stdio.h>
void rendreMonaie(int somme) {
    int billets[] = {100, 50, 20, 10, 5, 2};   // J'ai volontairement omis les billets de 1
    int l = sizeof(billets) / sizeof(int);
    for(int i = 0; somme > 0 && i < l; i++) {
        int nombre = somme / billets[i];
        if(nombre > 0) printf("%d billets de %d\n", nombre, billets[i]);
        somme -= nombre * billets[i];
    }
   if(somme > 0) printf("Nous n'avons pas pu rendre la monaie pour %d\n", somme);
}
int main(void) {
    printf("Donnez la somme ");
    int somme;
    scanf("%d", &somme);
    rendreMonaie(somme);
    return 0;
}

Voici un exemple:

Donnez la somme 366
3 billets de 100
1 billets de 50
1 billets de 10
1 billets de 5
Nous n'avons pas pu rendre la monaie pour 1
+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte