Behöver hjälp i Java - växel

Permalänk
Medlem

Behöver hjälp i Java - växel

Hej!

Jag läser en nybörjarkurs i programmering och har ingen tidigare erfarenhet inom detta. Språket är Java. Nu har vi fått en uppgift som lyder:

Skriv ett program som beräknar växeln man får tillbaka efter att man har betalat för sina varor. Vid utskriften anges vilka sedlar och mynt som köparen får. Inmatningen ska vara priset som ska betalas och beloppet köparen har betalat. Programmet ska skriva ut antal 1000-, 500-, 200-, 100-, 50- och 20- sedlar och antal 10-, 5-, 2-, 1- kronor man får som växel.

So far so good, det har jag lyckats med. Men, och det är här mitt problem börjar. Till uppgiften finns även ett extra task:

Extra task: Vi utgår från att 50 öre fortfarande används. Växeln avrundas till närmsta 50 öre. Om antalet öre är < 25 avrundas växeln neråt till 0, om det ligger mellan 25 och 75 avrundas växeln till 50 öre och om det är >75 avrundas växeln upp till en krona.

Jag tror att jag förstår grunderna till hur jag gör rent konkret när jag avrundar, men hur ändrar jag mitt befintliga program så att det funkar med femtioöringar? I mitt ursprungsprogram har jag använt mig av int, men om jag ska få till femtioöringar behöver jag väl använda double? Och då får jag inte till det med antal valörer, då blir alla tal decimaltal och det stämmer ju inte, man kan ju t ex inte få 2,54 hundralappar... Hur gör jag för att det ska bli rätt?

Här är mitt ursprungsprogram utan femtioöringar:

public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);

int tillbaka, växel, tusenLapp, femhundraLapp, tvåhundraLapp, hundraLapp,
femtioLapp, tjugoLapp, tia, femma, tvåKrona, krona;

System.out.print("Hur mycket ska kunden betala? ");
int attBetala = scanner.nextInt();
System.out.print("Hur mycket pengar har kunden gett dig? ");
int kundenBetalat = scanner.nextInt();

växel = kundenBetala - attBetala;
tillbaka = växel;
tusenLapp = tillbaka /1000;
tillbaka = tillbaka % 1000;
femhundraLapp = tillbaka / 500;
tillbaka = tillbaka % 500;
tvåhundraLapp = tillbaka / 200;
tillbaka = tillbaka % 200;
hundraLapp = tillbaka / 100;
tillbaka = tillbaka % 100;
femtioLapp = tillbaka / 50;
tillbaka = tillbaka % 50;
tjugoLapp = tillbaka / 20;
tillbaka = tillbaka % 20;
tia = tillbaka / 10;
tillbaka = tillbaka % 10;
femma = tillbaka / 5;
tillbaka = tillbaka % 5;
tvåKrona = tillbaka / 2;
tillbaka = tillbaka % 2;
krona = tillbaka / 1;

//Här presenteras hur mycket pengar kunden ska ha tillbaka i olika valörer.
System.out.print("Kunden ska ha tillbaka: " + växel + "\nI dessa valörer:" +
"\nTusenlappar: " + tusenLapp + "\nFemhundralappar: " + femhundraLapp +
"\nTvåhundralappar: " + tvåhundraLapp + "\nHundralappar: " + hundraLapp +
"\nFemtiolappar: " + femtioLapp + "\nTjugolappar: " + tjugoLapp +
"\nTior: " + tia + "\nFemmor: " + femma + "\nTvåkronor: " + tvåKrona +
"\nEnkronor: " + krona);

}

}

Permalänk
Medlem

Det finns många sätt att lösa det på, men ett sätt är att räkna med ören istället för kronor. D.v.s. multiplicera vad användaren matar in med hundra och ändra dina beräkningar till att använda ören istället.

Permalänk
Medlem
Skrivet av perost:

Det finns många sätt att lösa det på, men ett sätt är att räkna med ören istället för kronor. D.v.s. multiplicera vad användaren matar in med hundra och ändra dina beräkningar till att använda ören istället.

Tack för snabbt svar! Det är sant, det tänkte jag inte på. Men jag behöver väl ändå använda mig av både int och double och blanda dem, hur gör jag det på bästa sätt? T ex om något kostar 423,67 kr så ska jag först avrunda summan och räkna växel på det, samt ta fram vilka valörer som ska ges i växel, och valörerna går ju endast att ange i heltal.

Permalänk
Medlem

På skoj så tog jag andra stycket av befree43:s text, la till "Java" och klistrade in i ChatGPT. Lite skrämmande hur snabbt ChatGPT löser uppgiften. Sedan fortsatte jag konversationen och klistrade in stycket om Extra task och då fick jag tillbaka en modifiering av koden som vad jag ser verkar rätt.

Jag undrar om detta kommer att bli ett stort problem för studenter som läser enklare programmeringskurser? Kommer alla att använda AI-verktyg för att lösa uppgifterna?

Permalänk
Medlem
Skrivet av befree43:

Tack för snabbt svar! Det är sant, det tänkte jag inte på. Men jag behöver väl ändå använda mig av både int och double och blanda dem, hur gör jag det på bästa sätt? T ex om något kostar 423,67 kr så ska jag först avrunda summan och räkna växel på det, samt ta fram vilka valörer som ska ges i växel, och valörerna går ju endast att ange i heltal.

Ja, du får börja med att läsa in det som ett flyttal om användaren ska mata in det som kronor, men du kan sen göra om det till ören som heltal för att göra det enklare.

Permalänk
Medlem
Skrivet av uvry:

På skoj så tog jag andra stycket av befree43:s text, la till "Java" och klistrade in i ChatGPT. Lite skrämmande hur snabbt ChatGPT löser uppgiften. Sedan fortsatte jag konversationen och klistrade in stycket om Extra task och då fick jag tillbaka en modifiering av koden som vad jag ser verkar rätt.

Jag undrar om detta kommer att bli ett stort problem för studenter som läser enklare programmeringskurser? Kommer alla att använda AI-verktyg för att lösa uppgifterna?

.. för att sen skapa en tråd här på SweC om "varför får jag inget jobb inom programmering?"

Visa signatur

NZXT H510 Flow MSI B450 Tomahawk MAX
AMD Ryzen 5800X3D RX 7900XTX Kingston Fury 64GB
LG C2 42" 4K@120Hz AOC Q27G2U 1440P@144Hz

Permalänk
Medlem
Skrivet av uvry:

På skoj så tog jag andra stycket av befree43:s text, la till "Java" och klistrade in i ChatGPT. Lite skrämmande hur snabbt ChatGPT löser uppgiften. Sedan fortsatte jag konversationen och klistrade in stycket om Extra task och då fick jag tillbaka en modifiering av koden som vad jag ser verkar rätt.

Jag undrar om detta kommer att bli ett stort problem för studenter som läser enklare programmeringskurser? Kommer alla att använda AI-verktyg för att lösa uppgifterna?

Skrivet av Pamudas:

.. för att sen skapa en tråd här på SweC om "varför får jag inget jobb inom programmering?"

Jag är inte ute efter att använda mig av AI för att lösa alla uppgifter, jag vill förstå hur jag ska tänka så att jag lär mig. Tycker att Java är assvårt! Men vill ni göra er lustiga på min bekostnad får det stå för er... Annars får ni gärna komma med tips på hur jag kommer vidare.

Permalänk
Medlem
Skrivet av perost:

Ja, du får börja med att läsa in det som ett flyttal om användaren ska mata in det som kronor, men du kan sen göra om det till ören som heltal för att göra det enklare.

Jag ska testa det, tack! 😀

Permalänk
Skrivet av uvry:

På skoj så tog jag andra stycket av befree43:s text, la till "Java" och klistrade in i ChatGPT. Lite skrämmande hur snabbt ChatGPT löser uppgiften. Sedan fortsatte jag konversationen och klistrade in stycket om Extra task och då fick jag tillbaka en modifiering av koden som vad jag ser verkar rätt.

Jag undrar om detta kommer att bli ett stort problem för studenter som läser enklare programmeringskurser? Kommer alla att använda AI-verktyg för att lösa uppgifterna?

Med andra ord fler framtida konsultuppdrag till mig och alla andra som inte tar den lata vägen!

Att däremot använda ChatGPT för att brainstorma fram lösningsförslag när man väl arbetar tycker jag är lämpligt.

Förstår du inte kod så förstår du ju ändå inte när ChatGPT har gjort fel respektive rätt!

En regel som körs just nu i distansutbildningen jag går är att du måste kommentera mer eller mindre varenda kodrad för att demonstrera att du förstår vad det är du gör/vad det är som händer med koden.

Mvh,
WKL.

Visa signatur

"Den säkraste koden är den som aldrig skrivs"
"Visste du förresten att det är ett mångmiljardbolag?"
"Jag lever inte för att koda utan kodar för att sen kunna leva"

Permalänk
Medlem

Anledningen till att kod som "tusenLapp = tillbaka /1000;" ger rätt svar (=hela tusenlappar) är att det är s.k. heltalsdivision. T.ex. så gäller 2350/1000 = 2 (inte 2,35).

Om du har ett decimaltal (double) så kan du göra om det till ett heltal (int) genom s.k. type casting. Detta görs genom att skriva den önskade typen inom parentes framför varabeln. T.ex.

"helTal = (int)decimalTal;"

Då all information i ett decimaltal (i detta fall decimaldelen) inte ryms i en int så kommer den helt enkelt bortses från, och endast heltalsdelen blir kvar.

2350 / 1000 = 2 // Division heltal
2350,0 / 1000 = 2,35 // Dvivision decimaltal
(int) (2350,0 / 1000) = 2 // Division decimaltal omvandlat till heltal

Ditt problem med att "tusenLapp = tillbaka / 1000" blir ett decimaltal (när "tillbaka" är en double) löses alltså med "tusenLapp = (int) (tillbaka / 1000)". Notera att variabeln "tusenLapp" skall vara en int.

Tips: Ett bättre variabelnamn kan vara "antalTusenlappar" då ett antal indikerar att det rör sig om heltal.

---

En enklare möjlighet:
Eftersom "tillbaka" antingen slutar på .00 eller .50 så kan man inleda med att kolla om det skall ges en femtioöring tillbaka eller ej...resten av beloppet är sedan ett heltal (som i uppgiftens första del).

Permalänk
Medlem
Skrivet av befree43:

Jag är inte ute efter att använda mig av AI för att lösa alla uppgifter, jag vill förstå hur jag ska tänka så att jag lär mig. Tycker att Java är assvårt! Men vill ni göra er lustiga på min bekostnad får det stå för er... Annars får ni gärna komma med tips på hur jag kommer vidare.

Kommentaren var inte det minsta riktat mot dig så lugn nu

Visa signatur

NZXT H510 Flow MSI B450 Tomahawk MAX
AMD Ryzen 5800X3D RX 7900XTX Kingston Fury 64GB
LG C2 42" 4K@120Hz AOC Q27G2U 1440P@144Hz

Permalänk
Medlem
Skrivet av PeCe:

Anledningen till att kod som "tusenLapp = tillbaka /1000;" ger rätt svar (=hela tusenlappar) är att det är s.k. heltalsdivision. T.ex. så gäller 2350/1000 = 2 (inte 2,35).

Om du har ett decimaltal (double) så kan du göra om det till ett heltal (int) genom s.k. type casting. Detta görs genom att skriva den önskade typen inom parentes framför varabeln. T.ex.

"helTal = (int)decimalTal;"

Då all information i ett decimaltal (i detta fall decimaldelen) inte ryms i en int så kommer den helt enkelt bortses från, och endast heltalsdelen blir kvar.

2350 / 1000 = 2 // Division heltal
2350,0 / 1000 = 2,35 // Dvivision decimaltal
(int) (2350,0 / 1000) = 2 // Division decimaltal omvandlat till heltal

Ditt problem med att "tusenLapp = tillbaka / 1000" blir ett decimaltal (när "tillbaka" är en double) löses alltså med "tusenLapp = (int) (tillbaka / 1000)". Notera att variabeln "tusenLapp" skall vara en int.

Tips: Ett bättre variabelnamn kan vara "antalTusenlappar" då ett antal indikerar att det rör sig om heltal.

---

En enklare möjlighet:
Eftersom "tillbaka" antingen slutar på .00 eller .50 så kan man inleda med att kolla om det skall ges en femtioöring tillbaka eller ej...resten av beloppet är sedan ett heltal (som i uppgiftens första del).

Tack så mycket! Jag förstår att jag ska göra om double till int men jag förstår inte riktigt när i flödet jag ska göra det för att det ska bli rätt med antal sedlar och mynt, samtidigt som avrundningen ska stämma.

Permalänk
Medlem
Skrivet av befree43:

Tack så mycket! Jag förstår att jag ska göra om double till int men jag förstår inte riktigt när i flödet jag ska göra det för att det ska bli rätt med antal sedlar och mynt, samtidigt som avrundningen ska stämma.

Sätt Växel och Tillbaka till en double direkt, och sedan lägger du bara till (int) framför respektive uträkning där du använder Tillbaka. Tills du är nere på femtioöringen.

Permalänk
Medlem
Skrivet av first:

Sätt Växel och Tillbaka till en double direkt, och sedan lägger du bara till (int) framför respektive uträkning där du använder Tillbaka. Tills du är nere på femtioöringen.

Du behöver inte hantera femtioöringen annorlunda. Eftersom uträkningen används för att få fram antalet, och ett antal är ett heltal även om det rör sig om ett antal femtioöringar.

antalTusenlappar = (int) (tillbaka / 1000)
tillbaka = tillbaka % 1000
...
antalFemtioöringar = (int) (tillbaka / 0.5)
tillbaka = tillbaka % 0.5