Avatar billede aan Nybegynder
08. september 2000 - 20:23 Der er 6 kommentarer og
3 løsninger

Kasseapparat/vekselmaskine

Hi there,
jeg behøver nogle logiske begreber.
Eks.
en vare skal indtastes, pris 100,-kr. Herefter skal køberen indstaste et beløb som han/hun vil betale med. Hvis du kun har en 500,-seddel, skal den give rigtigt tilbage. Starte med seddellerne, derefter med mønter.
Jeg ved ikke hvordan jeg bryder isen. Et lille hint vil være tiltrængt.

Please advice me!

Kind


Avatar billede sjensen Nybegynder
08. september 2000 - 20:57 #1
Definer først alle de enkelte pengeenheds typer med en værdi. F.eks. en tusindekroneseddel = 1000.0, en femhundredekroneseddel = 500.0 o.s.v. samt mønterne en femkrone = 5.0, en enkrone = 1.0 en 50øre = 0.50 og en femogtyveøre som 0.25.

Herefter skal du lave beregningen af prisen og betalingsbeløbet, og resten skal du loope igennem for at checke om det er større end den højeste enhed og for hver gang opdatere antallet af enheder og nedskrive restsummen:

konstanter:
s1000 = 1000.0
s500  = 500.0
s100  = 100.0
m20  = 20.0
m10  = 10.0
m5    = 5.0
m2    = 2.0
m1    = 1.0
m050  = 0.5
m025  = 0.25

restsum = tilbagebetaling

ant1000 = 0
ant500 = 0
ant100 = 0
ant50 = 0
ant20 = 0
ant10 = 0
ant5 = 0
ant2 = 0
ant1 = 0
ant050 = 0
ant025 = 0

while restsum > s1000 do
  ant1000 = ant1000 +1 
  restsum = restsum - 1000
wend
while restsum > s500 do
  ant500 = ant500 +1 
  restsum = restsum - 500
wend

o.s.v. intil du har testet

while restsum > m025 do
  ant025 = ant025 +1 
  restsum = restsum - 0.25
wend

Derefter vil antallet af sedler og mønter der skal tilbageleveres kunne vises med:

hvis ant1000 > 1000 så vis ant1000
o.s.v.

Kan du se fidusen ?
Avatar billede sjensen Nybegynder
08. september 2000 - 20:59 #2
Når jeg nu ser på det kan jeg godt se at det ikke er nødvendigt med konstanterne s1000, s500 o.s.v.

Du kan bruge værdien direkte i while loopet:

while restsum >= 1000
  ant1000 = ant1000 + 1
  restsum = restsum - 1000
wend

og selvfølgeligt skal du i while loopet huske at teste både på større end OG ligmed. Det kunne jo være et lige beløb ;-)
Avatar billede driis Nybegynder
09. september 2000 - 02:46 #3
Alle de While...Wend løkker er da unødvendige;

A1000=Int(Restsum/1000)
Restsum=Restsum-(A1000*1000)
A500=Int(Restsum/500)
Restsum=Restsum-(A500*500)
... osv. osv. indtil du når til ...
A25øre=restsum-(A50øre*.50)

Då er A1000 lig antal tusindkronesedler og så fremdeles...
Avatar billede aan Nybegynder
09. september 2000 - 15:19 #4
Sjensen>>

Noget jeg ikke forstår:

Hvis du bruger int, så kan der vel ikke være et beløb der hedder 6,25? int er jo hele tal. (Min C++ er ikke særlig stor) Jeg prøver at lave prg.

Vil det være bedre hvis jeg laver det som class?
Hvor fremgår dine variable erklæringer?

Avatar billede driis Nybegynder
09. september 2000 - 15:53 #5
aan>> Mon ikke den kommentar med INT var henvendt til mig? Dét eksempel var også lavet lidt for hurtigt - og jeg kan i øvrigt kun programmere VB, ikke C++. Det slog mig bare, at det var temmelig mange While...Wend løkker, sjensen bruger for at regne det ud.

Problemet med min kode, er, at den altid runder ned; dvs. hvis du har et beløb på 6,47 kr., så runder den ned til 6,25 kr. Hvis du lige løser det, så skulle det virke.
Avatar billede sjensen Nybegynder
10. september 2000 - 10:44 #6
aan, driis har ret i at det var ham der brugte Int og ikke mig. Int er et heltal og kan drfor ikke bruges til decimaltal. Derfor tror jeg heller ikke på driis\'s løsning. Du vil kun kunne arbejde med hele kr. i det forslag.

Det med om du skal lave en class kan jeg ikke rigtigt gennemskue. Principielt er det jo blot en funktion der returnerer et antal værdier og som sådan kan det blot være en lille del af den samlede kode.

Og med hensyn til variabel erklæringer: Jeg har ikke taget stilling til den del og heller ikke den korrekte syntax. I dit spørgsmål bad du jo om ideer til at komme igang og ikke om et færdigt program, så de forskellige var-erklæringer skal du selvfølgeligt sætte ind der hvor du har brug for dem. Hvis det er i en funktion, så i starten af den. Typen af antal felterne kan bare være Int da de jo altid vil have hele antal. F.eks. 3x100 kr. sedler, 2x20 kr. mønter o.s.v.

Restsum skal selvfølgeligt være af samme type som feltet \"tilbagebetaling\" (float/real/double eller hvad du bruger for decimaltal)
Avatar billede soepro Nybegynder
11. september 2000 - 11:43 #7
Hvad med:

void displayChange(float Amont)
{
  const int maxDollars = 10, maxCents = 2;
  int Dollars[maxDollars] = { 1000, 500, 200, 100, 50, 20, 10, 5, 2, 1 };
  int Cents[maxCents] = { 50, 25 };
  int Ints, Decs, Quant;
  int smallCoin = 25;
 
  // Start med at opsplitte beløbet i heltal og decimaler aht. evt. afrundingsfejl
  // i float kalkulationer. (FINDES !!!) Afrund derefter decimaler til mindste
  // gangbare møntstørrelse.
  Ints  = (int)Amount;
  Decs = (int)((Amount - Ints) * 100);
  if (Decs > 0)
    Decs = ((Decs + smallCoin - 1) / smallCoin) * smallCoin;

  // Løb alle seddel/mønt størrelser igennem og udskriv resultatet.
  for (idx = 0; Ints > 0 && idx < maxDollars; idx++)
  {
      Quant = Ints / Dollars[idx];
      if (Quant > 0)
      {
        printf(\"%d x %d seddel/mønt.\\n\", Quant, Dollars[idx]);
        Ints -= Quant * Dollars[idx];
      };
  };
  for (idx = 0; Decs > 0 && idx < maxCents; idx++)
  {
      Quant = Decs / Cents[idx];
      if (Quant > 0)
      {
        printf(\"%d x %d mønt.\\n\", Quant, Cents[idx]);
        Decs -= Quant * Cents[idx];
      };
  };
} // DisplayAmount
Avatar billede soepro Nybegynder
11. september 2000 - 11:49 #8
OOops - ovenstående laver OPrunding af decimaler, den skulle se sådan ud til afrunding:

Decs = ((int)(Decs + (smallCoin +1) / 2) / smallCoin) * smallCoin;

Herved bliver 88-99/0-12 øre til 0,00 & 13-37 øre til 0,25 & 38 til 62 øre til 0,50 og endelig 63-87 øre til 0,75.
Avatar billede aan Nybegynder
12. september 2000 - 12:31 #9
Nu spiller det!!

Jeg vil sige tak til alle!

Kind

Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester