Javaprogrammerare se hit- behöver lite hjälp!

Permalänk
Medlem

Javaprogrammerare se hit- behöver lite hjälp!

Hej!

Jag har en uppgift i programmering där jag ska få fram växeln i antalet hundralappar, femtiolappar, tjugor, tior och femmor. Detta ska skrivas ut på skärmen. Jag har fastnat rejält nu och kommer inte vidare.

Finns det någon vänlig själ som har lust att förklara för mig hur jag ska tänka?

Skickar med den kod jag gjort:

import java.util.*;

public class Betalning{
public static void main (String []arg){
Scanner sc = new Scanner (System.in);
int pris, betalning, tillbaka, vaxel, hundra;

System.out.print(" Vad blir priset på varorna? " );
pris = sc.nextInt();
System.out.print(" Hur mycket pengar fick du? ");
betalning = sc.nextInt();

System.out.println(" Kunden ska betala " + pris );
System.out.println (" Kunden gav " + betalning);
vaxel = betalning - pris ;
System.out.println(" Kunden ska ha " + vaxel + "kr tillbaka");

if (vaxel >=100){
vaxel = vaxel/100;
vaxel=vaxel%100;}

System.out.println ("100 :" + vaxel);

while (vaxel < 99){
vaxel = vaxel/50;
vaxel = vaxel%50 ;}

System.out.println("50 :" + vaxel);

Tacksam för hjälp!

Permalänk
Medlem

Har du använt arrays?

En flexibel lösning är att hålla alla valörer i en array – störst först – som du sedan stegar igenom. För varje värde v i arrayen så gör du ekvationen: [kvarAttBetala / v] = n och kapar decimaldelen. Dvs, om det är 368 kr kvar att betala så delar du 368 med den högsta valören (100) och får sålunda n=3 (som i tre hundralappar).

Därefter multiplicerar du n med valören och drar ifrån det som är kvar att betala enligt [kvarAttBetala = kvarAttBetala - (n * valören)].
Det tjusiga är att du helt enkelt kan lägga till en större valör (500) eller en mindre (1) och ändå få rätt resultat utan att ändra något annat i koden.

Exempel på utmatning från min testkod (där jag lagt med 500 och 1 som valörer):

Varans pris: 1 kr Betalat: 1000 kr Tillbaka: 999.0 kr 500 x 1 100 x 4 50 x 1 20 x 2 5 x 1 1 x 4 Klart!

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem

Tack för hjälpen men jag har inte kommit till arrayer än
Jag vet att det blir väldigt mycket längre att göra som jag gör men jag är nybörjare.
Om jag fortsätter på sättet jag gjort vad är det som blir fel i mitt tänk?

Permalänk
Medlem

if (vaxel >=100) //Varför en if? om det är mindre än hundra borde det ju bli 0? { vaxel = vaxel/100; //Du tar reda på hur många hundralappar som går i växeln, vilket är bra... men varför sparar du det i vaxel? vaxel=vaxel%100; //Nu försöker du ta reda på hur mycket som inte kunde bli hundra lappar, // men problemet är att du har sparat antal hundralappar i vaxel... inte själva vaxeln }

Summan av kardemumman.. arbeta inte med input variabler... gör en kopia av dem om du ska arbeta med det... vaxel borde alltså vara en konstant...

Visa signatur

citera!

Permalänk
Medlem

Jag vill ju ta reda på hur mycket som inte är hundra och spara det i resten som sedan ska testa hur många femtiolappar, tjugor, tior, femkronor och enkronor det blir. Förstår inte riktigt vad jag gör för fel och tycker att tänket är komplicerat.

Permalänk
Medlem

Vad menas med att växel borde vara en konstant? Kan jag köra bara while-satser?

Permalänk
Medlem

Läraren vill nog visa finurligheterna med Mod (%)
Så här kan du tex göra. Skrivet i pseudokod. Översätta till Java får du göra själv
växel = betalt - pris
If växel >= 100 Then
hundringar = (växel - växel Mod 100) / 100
växel = växel - hundringar * 100
End If
If växel >= 50 Then
femtilappar = (växel - växel Mod 50) / 50
växel = växel - femtilappar * 50
End If
osv...

Permalänk
Medlem
Skrivet av nadja:

Jag vill ju ta reda på hur mycket som inte är hundra och spara det i resten som sedan ska testa hur många femtiolappar, tjugor, tior, femkronor och enkronor det blir. Förstår inte riktigt vad jag gör för fel och tycker att tänket är komplicerat.

Låt oss säga att du får en växel på 475 kronor.

if (vaxel >=100) //Blir sann då vaxel är 475 kronor { vaxel = vaxel/100; //vaxel får nu värdet 4 (475/100=4) vaxel=vaxel%100; // vaxel tilldelas värdet 4, (4%100=4) } System.out.println ("100 :" + vaxel); while (vaxel < 99) //Blir sann då vaxel är 4 { vaxel = vaxel/50; // 4/50 blir 0, vaxel tilldelas 0 vaxel = vaxel%50 ; // 0%50=0, vaxel tilldelas 0 } System.out.println("50 :" + vaxel);

Du använder vaxel till allt, du borde spara antalet hundralappar i variabeln "hundra" o.s.v.
Sedan ska du inte arbeta med inputvariabler... utan vaxel ska ha samma värde genom hela programmet.
EDIT: förtydligande:
Vaxel skall alltid vara din vaxel, inte antalet hundra lappar, eller vad som blev över, utan vaxel är ju vaxel, inget annat

Visa signatur

citera!

Permalänk
Medlem

if (vaxel >=100){
hundringar = (vaxel - vaxel % 100) / 100;
vaxel = vaxel - hundringar * 100;}

System.out.println ("100 :" + vaxel);

När jag kör denna med 200 kr som kunden ska få tillbaka så visar den 100: 0 fast det ska bli 2 st hundralappar? Vill verkligen förstå detta men det känns trögt just nu. Tack till alla som försöker hjälpa...

Permalänk
Medlem

System.out.println ("100 :" + hundringar);

Permalänk
Medlem

Provade med att skriva hundringar där men då står det att den inte är initierad.

if (vaxel >=100){
hundringar = (vaxel - vaxel % 100) / 100;
vaxel = vaxel - hundringar * 100;}

System.out.println ("100 :" + hundringar);

Permalänk
Medlem

if (vaxel >=100){ //sann då vaxel är 200 hundringar = (vaxel - vaxel % 100) / 100; // (200 - 200%100) / 100 = (200 - 0) / 100 = 2 vaxel = vaxel - hundringar * 100;} // 200 - 2 * 100 = 200 - 200 = 0 System.out.println ("100 :" + vaxel);

Visa signatur

citera!

Permalänk
Medlem

[QUOTE="Dosshell;10545212"][code]
if (vaxel >=100){ //sann då vaxel är 200
hundringar = (vaxel - vaxel % 100) / 100; // (200 - 200%100) / 100 = (200 - 0) / 100 = 2
vaxel = vaxel - hundringar * 100;} // 200 - 2 * 100 = 200 - 200 = 0

System.out.println ("100 :" + vaxel);

Ok. Om jag förstår det rätt borde jag anropa hundringar istället för växel, för att få fram hur många hundringar? Som det är nu så får jag alltså fram vad som återstår av växeln?
När jag nu anropar hundringar så står det att den inte är initierad?

Tack för din förklaring!

Permalänk
Medlem
Skrivet av nadja:

Provade med att skriva hundringar där men då står det att den inte är initierad.

if (vaxel >=100){
hundringar = (vaxel - vaxel % 100) / 100;
vaxel = vaxel - hundringar * 100;}

System.out.println ("100 :" + hundringar);

du har ju "int hundra" ... använd den

EDIT:
deklarera:

int var;

initiera:

var = 2;

man kan även göra detta på en rad:

int var = 2;

Visa signatur

citera!

Permalänk
Medlem

Ja i ditt program heter variablen hundra allså får du skriva
f (vaxel >=100){
hundra = (vaxel - vaxel % 100) / 100;
vaxel = vaxel - hundra * 100;}

System.out.println ("100 :" + hundra);

Så som jag tänkt i pseudokoden ovan är att återstående växel som ska delas upp i 100, 50 o 20 lappar ligger i variablen växel

Permalänk
Medlem
Skrivet av Dosshell:

du har ju "int hundra" ... använd den

import java.util.*;

public class Betalning{
public static void main (String []arg){
Scanner sc = new Scanner (System.in);
int pris, betalning, tillbaka, vaxel, hundringar;

System.out.print(" Vad blir priset på varorna? " );
pris = sc.nextInt();
System.out.print(" Hur mycket pengar fick du? ");
betalning = sc.nextInt();

System.out.println(" Kunden ska betala " + pris );
System.out.println (" Kunden gav " + betalning);
vaxel = betalning - pris ;
System.out.println(" Kunden ska ha " + vaxel + "kr tillbaka");

if (vaxel >=100){
hundringar = (vaxel - vaxel % 100) / 100;
vaxel = vaxel - hundringar * 100;}

System.out.println ("100 :" + hundringar);

den heter hundringar nu men den raden blir markerad i koden och det står att den kanske inte är initierad?

Permalänk
Medlem

Spara och starta om din IDE och posta din kod inom [code] taggar
EDIT:
Alla dina "programvägar" ger inte hundringar ett värde.

Visa signatur

citera!

Permalänk
Medlem

Initiera den till 0 då efter du har deklarerat den
hundringar = 0;

Permalänk
Medlem

[QUOTE="Dosshell;10545249"]Spara och starta om din IDE och posta din kod inom [code] taggar[/QUO

Tack men då jag är helt grön så förstår jag inte " inom[code] taggar

Permalänk
Medlem
Skrivet av patrix:

Initiera den till 0 då efter du har deklarerat den
hundringar = 0;

Ok. vad innebär det att jag ger hundra ett värde? Vad är det jag gör då egentligen? Vill så gärna förstå.
Nu verkar det fungera iaf.
Ska jag göra samma sak med 50, 20, 10, 5 och enkronor oxå?

Permalänk
Medlem

Om du inte förstår tilldelning av värden till variabler bör du prata med din lärare om detta.

Visa signatur

citera!

Permalänk
Medlem

Kommer inte ihåg om följande funkar i java, annars kan det vara en idé.

int pris, betalning, tillbaka, vaxel, hundringar = 0;

annars

int pris, betalning, tillbaka, vaxel, hundringar; pris = betalning = tillbaka = vaxel = hundringar = 0;

Så bråkas det inte vid utskrift, då du inte har utskriften i ditt if block.

Annars typ:

if (vaxel >=100) { hundringar = (vaxel - vaxel % 100) / 100; vaxel = vaxel - hundringar * 100; System.out.println ("100 :" + hundringar); }

notera flyttningen av måsparantesen, vilket garanterar att du har en värde på hundringar när du gör utskriften. Läs upp på "Scope" eller vad det nu kan tänkas heta på svenska.

Permalänk
Medlem

Tack så mycket för hjälpen alla ni. Nu verkar det fungera iaf men jag skulle gärna förstå varför man måste initiera ett värde till "hundringar" Varför räcker det inte bara med en dekaration?

Tack tack och ha en fin dag!

Permalänk
Medlem
Skrivet av nadja:

Ok. vad innebär det att jag ger hundra ett värde? Vad är det jag gör då egentligen? Vill så gärna förstå.
Nu verkar det fungera iaf.
Ska jag göra samma sak med 50, 20, 10, 5 och enkronor oxå?

Initiera innebär att man ger en variabel ett värde. När man deklarerat variablen så har den inget värde alls. Den är undefined. Försöker man då använda den med tex printf så blir det error

Tänk på att när du klurar med programmering så är Google din vän, och det finns en del på svenska om du inte är haj på engelska. Jag sökte tex på java deklarera variabler och hittade detta Java - Anteckningar - Variabler. Där står förkarat hur intitering funkar.

Ja, fortsätt med 50 och 20 lappar. I algoritmen jag skrev ovan så innehåller växel det pengar som är kvar att dela upp. Det är kanske tydligare om den heter vaxelkvar eller nåt

Lycka till!

Permalänk
Medlem
Skrivet av Xergon:

Kommer inte ihåg om följande funkar i java, annars kan det vara en idé.

int pris, betalning, tillbaka, vaxel, hundringar = 0;

annars

int pris, betalning, tillbaka, vaxel, hundringar; pris = betalning = tillbaka = vaxel = hundringar = 0;

Så bråkas det inte vid utskrift, då du inte har utskriften i ditt if block.

Annars typ:

if (vaxel >=100) { hundringar = (vaxel - vaxel % 100) / 100; vaxel = vaxel - hundringar * 100; System.out.println ("100 :" + hundringar); }

notera flyttningen av måsparantesen

Tack för hjälpen och viljan att förklara. Nu verkar det ha löst sig

Permalänk
Medlem
Skrivet av patrix:

Initiera innebär att man ger en variabel ett värde. När man deklarerat variablen så har den inget värde alls. Den är undefined. Försöker man då använda den med tex printf så blir det error

Tänk på att när du klurar med programmering så är Google din vän, och det finns en del på svenska om du inte är haj på engelska. Jag sökte tex på java deklarera variabler och hittade detta Java - Anteckningar - Variabler. Där står förkarat hur intitering funkar.

Ja, fortsätt med 50 och 20 lappar. I algoritmen jag skrev ovan så innehåller växel det pengar som är kvar att dela upp. Det är kanske tydligare om den heter vaxelkvar eller nåt

Lycka till!

Tack för dina bra svar och bra förklaringar!

Permalänk
Medlem
Skrivet av nadja:

hundringar = (vaxel - vaxel % 100) / 100;

Jag undrar varför så många skriver såhär (det fetmarkerade)? Den operationen gör ingenting förutom att göra uttrycket svårare att förstå (samt råkar vara riktigt slö, även om det är oviktigt i sammanhanget) :
hundringar = vaxel / 100;
Jag antar att det är en copy-paste som gått igenom hela vägen :).

Visa signatur

g++

Permalänk
Medlem
Skrivet av nadja:
Skrivet av Dosshell:

Spara och starta om din IDE och posta din kod inom [code] taggar

Tack men då jag är helt grön så förstår jag inte " inom[code] taggar

Först och främst, med [code]-taggar menar han att du i ditt inlägg ska lägga [code]blablabla[/ code] runt din kod. Detta gör koden mer lättläst. Dock utan mellanslg mellan / och code i sluttaggen.

Ännu ett svar till varför du även måste initera din variabel i följande exempel:

if (vaxel >=100) { hundringar = (vaxel - vaxel % 100) / 100; vaxel = vaxel - hundringar * 100; } System.out.println ("100 :" + hundringar);

När programmet skriver att hundringar kanske inte är initierad, betyder det att när du skriver ut värdet i System.out.println ("100 :" + hundringar); så kan det hända att hundringar inte har ett värde. Varför? Jo, eftersom hundringar endast får ett värde inom din if-sats. Ifall din if-sats inte körs så får hundringar aldrig något värde och kan således inte skrivas ut. Genom att skriva hundringar = 0 tidigare i programmet så försäkrar du dig om att hundringar har ett värde vare sig if-satsen körs eller ej.

Den andra lösningen som skrevs tidigare var att stoppa System.out.println-raden innanför if-satsen. Då skrivs ju hundringar bara ut ifall if-satsen körs, och då har det säkert ett värde.

Permalänk
Medlem
Skrivet av Rhino:

Jag undrar varför så många skriver såhär (det fetmarkerade)? Den operationen gör ingenting förutom att göra uttrycket svårare att förstå (samt råkar vara riktigt slö, även om det är oviktigt i sammanhanget) :
hundringar = vaxel / 100;
Jag antar att det är en copy-paste som gått igenom hela vägen :).

Jag det var nog min förtjänst.

växel - växel % 100 tar bort resten. Men om hundringar är delkarerad som en integer så behövs det inte, eftersom resten, eller decimaldelen, ändå försvinner vid divisionen.

Permalänk
Medlem
Skrivet av Xergon:

Kommer inte ihåg om följande funkar i java, annars kan det vara en idé.

pris = betalning = tillbaka = vaxel = hundringar = 0;

Jag gjorde så i ett av mina program och kunde inte förstå vad felet var när jag felsökte. Det blir ju så att all värden blir lika med varandra även om du ändrar någon av dem. Ökar du t ex hundringar till 2 så kommer pris också bli 2, betalning likaså, etc.

Även om det är frestande att spara plats genom att skriva som ovan vet jag av erfarenhet att det inte går, det kommer märkas senare i programmet