Nieuws:

Welkom, Gast. Alsjeblieft inloggen of registreren.
Heb je de activerings-mail niet ontvangen?

Auteur Topic: [Opgelost] beginneling aan het vechten met c++  (gelezen 1482 keer)

Offline massimo21

  • Lid
[Opgelost] beginneling aan het vechten met c++
« Gepost op: 2008/11/29, 16:01:31 »
Hallo iedereen,
ik ben nu al een twee-tal weken aan het leren programmeren en heb een programma willen schrijven op c++ die me berekent hoveel brifgeld en muntstukken ik nodig heb om iets met zo weing munten en brieven te betalen,
Het werkt maar als ik bv 150.98 intik ben ik mijn laatste cent kwijt en als ik bv 123.23 intik gaat het tot de laatste cent goed.
het is heel raar want hij moet de zelfde berekening maken voor bijde getallen ik begrijp niet wat ik fout doe.
ik post hier mijn code in de hoop dat iemand me ermee kan helpen

#include <stdio.h>
#include <iostream>
using namespace std;

double geld[]={500, 200, 100, 50, 20, 10, 5, 2, 1, 0.50, 0.20, 0.10, 0.05, 0.02, 0.01};
int i;
double bedrag;
int a;
void antwoord()
{
     if ((geld >= 5) && (a == 1))
     {
     cout<<"je hebt "<<a<<" brief van "<<geld<<" € nodig\n";
     }
     if ((geld >= 5) && (a>1))
     {
     cout<<"je hebt "<<a<<" brieven van "<<geld<<" € nodig\n";
     }
     if ((geld < 5) && (a == 1))
     {
     cout<<"je hebt "<<a<<" muntstuk van "<<geld<<" € nodig\n";
     }
     if ((geld < 5) && (a>1))
     {
     cout<<"je hebt "<<a<<" muntstukken van "<<geld<<" € nodig\n";
     }
}
int main()
{
cout<<"Geef een bedrag in dat je wilt ontleden:\n";
cin>>bedrag;
i = 0;
  for (a=1;bedrag>=geld;a++)
  {
  bedrag = bedrag - geld;
    if (geld>bedrag)
    {
    antwoord();
    }
  }
    while (geld>0.01) //kon ook (i<14) of (bedrag>0.01)
    {
    i++;
  for (a=1;bedrag>=geld;a++)
  {
  bedrag = bedrag - geld;
    if (geld>bedrag)
    {
    antwoord();
}   
}
}
getchar();
return 0;
}



bedankt  :)
« Laatst bewerkt op: 2008/11/29, 17:32:28 door massimo21 »

Re: beginneling aan het vechten met c++
« Reactie #1 Gepost op: 2008/11/29, 16:20:14 »
Ten eerste zie ik niet in waarom je 'a' als global moet declareren. Hetzelfde voor 'bedrag'.
Daarna je programmatje even geherstructureerd in K&R-stijl. Tevens 'double' door 'float' vervangen omdat dit zuiniger is met het geheugen. In professionele 3d-games worden zelfs floats gebruikt, dus zal voor 2 getallen na de komma het zeker wel werken, of niet?

#include <cstdio>
#include <iostream>

using namespace std;

float geld[]={500, 200, 100, 50, 20, 10, 5, 2, 1, 0.50, 0.20, 0.10, 0.05, 0.02, 0.01};

void antwoord(int i, int aantal) {
     if ((geld[i] >= 5) && (aantal == 1)) {
     cout<<"je hebt "<<aantal <<" brief van "<<geld[i]<<" € nodig\n";
     }

     if ((geld[i] >= 5) && (aantal > 1)) {
     cout<<"je hebt "<<aantal <<" brieven van "<<geld[i]<<" € nodig\n";
     }

     if ((geld[i] < 5) && (aantal == 1)) {
     cout<<"je hebt "<<aantal <<" muntstuk van "<<geld[i]<<" € nodig\n";
     }

     if ((geld[i] < 5) && (aantal > 1)) {
     cout<<"je hebt "<<aantal<<" muntstukken van "<<geld[i]<<" € nodig\n";
     }
}
int main() {
    float bedrag;
    cout<<"Geef een bedrag in dat je wilt ontleden:\n";
    cin>>bedrag;

    for (int i = 0; geld[i] >= 0.01; i++) {
        for (int a = 1; bedrag >= geld[i]; a++) {
        bedrag = bedrag - geld[i];
        if (geld[i]>bedrag) {
            antwoord(i,a);
        }
    }

    getchar();
    return 0;
}

Probeer nu nog eens.

- SeySayux
I use a Unix-based system, that means I'll get laid as often as I have to reboot.
LibSylph
SeySayux.net

Offline massimo21

  • Lid
Re: beginneling aan het vechten met c++
« Reactie #2 Gepost op: 2008/11/29, 16:29:54 »
bedankt voor de snelle antwoord maar als je 150.98 ingeef dan mis ik nog steeds 0.01€
ben er zot van aan het worden XD

Offline siegi

  • Lid
Re: beginneling aan het vechten met c++
« Reactie #3 Gepost op: 2008/11/29, 17:10:10 »
Ik denk dat het komt omdat
0.01 niet exact gelijk is aan 0.01 .

kijk even naar dit voorbeeldje
#include <stdio.h>

int main() {
   float f=101.0/10.0;
   double d=101.0/10.0;
   printf("f = %.20f\n", f);
   printf("d = %.20lf\n", d);
   getchar();
   return 0;
}

 Dit programma geeft als het gecompileerd wordt met gcc de volgende uitvoer:
f = 10.10000038146972656200
d = 10.09999999999999964500

 Je ziet dat het getal 10.1 ook moet worden afgerond.
Double is in dit geval veel nauwkeuriger voor niet gehele getallen. Maar blijkbaar nog niet nauwkeurig genoeg.

Ik denk er wel even over na, hoe je het kan oplossen.

@seysayux als je het programma compact wil, waarom zit er dan een  cstdio in? Alleen voor die getchar()? cin.get() doet hetzelfde.
« Laatst bewerkt op: 2008/11/29, 17:14:09 door siegi »

Offline massimo21

  • Lid
Re: beginneling aan het vechten met c++
« Reactie #4 Gepost op: 2008/11/29, 17:31:42 »
Ik heb het gevonden dank zij dat je gemeld hebt dat de getallen niet heel nawkeurig zijn.
ik heb bedrag en geld double gemaakt (werkt spijtig genoeg niet met float)
En ik heb de nawkeurigheid van getallen 0.02 en 0.01 afgerond met f als ik goed heb begrepen doe je da zo.
0.02f
ik was naar een manier aan het zoeken om een foutmelding te geven als je een getal met 3 of meer cijfers na de komma ingeeft vandaar dat ik het per ongeluk heb gevonden.
dus nu ziet mijn code er zo ui en het werkt. ZEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEER HARTELIJK BEDANKT XD

#include <stdio.h>
#include <iostream>
using namespace std;

double geld[]={500, 200, 100, 50, 20, 10, 5, 2, 1, 0.50, 0.20, 0.10, 0.05, 0.02f, 0.01f};
void antwoord(int i, int aantal)
{
     if ((geld >= 5) && (aantal == 1))
     {
     cout<<"je hebt "<<aantal<<" brief van "<<geld<<" € nodig\n";
     }
     if ((geld >= 5) && (aantal>1))
     {
     cout<<"je hebt "<<aantal<<" brieven van "<<geld<<" € nodig\n";
     }
     if ((geld < 5) && (aantal == 1))
     {
     cout<<"je hebt "<<aantal<<" muntstuk van "<<geld<<" € nodig\n";
     }
     if ((geld < 5) && (aantal>1))
     {
     cout<<"je hebt "<<aantal<<" muntstukken van "<<geld<<" € nodig\n";
     }
}
int main()
{
double bedrag;
cout<<"Geef een bedrag in dat je wilt ontleden:\n";
cin>>bedrag;
int i = 0;
  for (int a=1;bedrag>=geld;a++)
  {
  bedrag = bedrag - geld;
    if (geld>bedrag)
    {
    antwoord(i,a);
    }
  }
    for (int i=0;geld>=0.01f;i++) //kon ook (i<14) of (bedrag>0.01)
    {
  for (int a=1;bedrag>=geld;a++)
  {
  bedrag = bedrag - geld;
    if (geld>bedrag)
    {
    antwoord(i,a);
}   
}
}
getchar();
return 0; 
}

Offline siegi

  • Lid
Re: beginneling aan het vechten met c++
« Reactie #5 Gepost op: 2008/11/29, 17:32:32 »
Een vuile oplossing is het volgende. (ik ben ook maar beginner met c++)
bedrag = bedrag - geld[i] + 0.0001;
Edit: je hebt het al blijkbaar :)
« Laatst bewerkt op: 2008/11/29, 17:36:39 door siegi »

Offline massimo21

  • Lid
Re: [Opgelost] beginneling aan het vechten met c++
« Reactie #6 Gepost op: 2008/11/29, 17:37:04 »
bedankt voor jow oplssing nu zijn er dus al 2 oplossingen :)
ik hoopdat er anderen gelijk mij ook mee geholpen kunnen worden.
Leren programmeren is niet gemakkelijk.