Permalänk
Medlem

[Java] Ge sedlar värde.

Hallå. Sitter och skriver lite koder på fritiden, dock har jag stött på problem. Pluggar Java Programmering A och har fastnat på en uppgift som jag inte fattar hur jag ska kunna få det som dom vill.

Lite kort om uppgiften: Man ska göra ett program som fungerar liknande som en bankomat, frågar hur mycket personen vill ta ut osv. Sen ska programmet kunna omvandla säg ex; 1300kr så att det blir 2st Femhundralappar och 3st Hundralappar och skriva ut det. Om man vill ta ut 2700 ska den kunna räkna ut att det är 5st Femhundralappar och 2st Hundralappar.

ex: System.out.println("Tack för ditt uttag, du tog ut 1300kr (2st Femhundralappar och 3st Hundralappar.");

Koden sofar.

package uttag2; import sdb.Sdb; public class Uttag2 { private static class LoginInfo { public String password; private String user; } private static boolean login(LoginInfo info) { System.out.println("Uppgift 1:3"); System.out.println("Hej. Säkerhetskod?"); info.password = Sdb.in.next().toUpperCase(); int x = 0; while (x < 30) { System.out.print('.'); Sdb.sleep(0.1); ++x; } System.out.println(); if (info.password.equals("1234")) { return true; } { return false; } } public static void main(String[] args) { Sdb.createConsole(); LoginInfo info = new LoginInfo(); boolean loginOk; loginOk = login(info); if (loginOk) { System.out.println("Hej och välkommen. Hur mycket pengar vill du ta ut?"); int x = Sdb.in.nextInt(); System.out.println("Varsegod och välkommen åter"); } else { System.out.println("Försöker du blåsa banken på pengar?"+ " Hitta koden för att få tillgång till pengarna"); } } } }

Någon som förstår? För jag har då kört fast totalt xD

Tack på förhand.

Permalänk
Medlem

Du kan väl bara dividera med t ex 500 (i fallet med 500-sedlar) och avrunda nedåt för att få ut hur många sedlar som behövs ta ut. Sen kan du använda (saldot_före_uttag % 500) för att få ut hur mycket pengar som blir kvar. Sen bara upprepa för varje sedel

Visa signatur

Desktop: Intel i5-22500k @ 3.30GHz, Gigabyte GTX 560Ti 1GB, 8GB Corsair @ 1600MHz, Windows 7 Pro and Arch Linux
Laptop: Macbook Pro 13" (early 2011) w/ Mac OS X 10.8 Mountain Lion

Permalänk
Medlem

Det du behöver är modulo (mod) operatorn. % i Java som redan påpekats:)

Här är den engelska wikin
http://en.wikipedia.org/wiki/Modulo_operation

Permalänk
Medlem

Gjorde ett liknande i Programmering A, en automat som räknar ut växeln i slutet, växeln i det här fallet blir istället summan man försöker ta ut.

Alla valörer:

int valuta[] = new int[8]; valuta[0] = 1; valuta[1] = 5; valuta[2] = 10; valuta[3] = 20; valuta[4] = 50; valuta[5] = 100; valuta[6] = 500; valuta[7] = 1000;

Koden:

String vaxel = (""); int antal = 0; for (int i = valuta.length-1; i >= 0; i--) { //loop för att kolla vilken valör som går att ge, räknar från högst upp(1000-lapp) och ner for (int j = 0; j != 1;) { //loop för att kolla om valören kan ges flera gånger(t ex två 100-lappar om det är 200kr växel) if (inmatadCash >= valuta[i]) { //kollar om det finns tillräckligt mycket växel för att kunna ge denna valör inmatadCash = (inmatadCash - valuta[i]); antal = antal + 1; //antal av specifik valör } else { if (antal != 0) { //om ingen av en viss valör har getts ut(antal=0) så behöver den inte skrivas till vaxel = (vaxel + antal + "st " + valuta[i] + "-krona/lapp | "); //skriver antal och vilken valör } j = 1; //avslutar loopen antal = 0; //nollställer antal eftersom den ska börja räkna på nästa valör } } } System.out.println("Växel: " + vaxel); //skriver ut växeln

inmatadCash är summan som ska tas ut.

Såhär kan resultatet se ut: Växel: 1st 20-krona/lapp | 1st 5-krona/lapp

Permalänk
Skrivet av leons:

Lite kort om uppgiften: Man ska göra ett program som fungerar liknande som en bankomat, frågar hur mycket personen vill ta ut osv. Sen ska programmet kunna omvandla säg ex; 1300kr så att det blir 2st Femhundralappar och 3st Hundralappar och skriva ut det. Om man vill ta ut 2700 ska den kunna räkna ut att det är 5st Femhundralappar och 2st Hundralappar.

Jag hade löst uppgifen så här:

Obs, interfacet är inte nödvändigt.

Public interface pengar{ public String toString(); } Public abstract class money implements pengar{ private int ore //öre public money(int ore){ this.ore=ore; } public abstract String ToString(); } Public class ore extends money{ public ore(int ore) super(); } public String ToString(){ return ore +"ore" } } Public class kr extends money{ public ore(int ore) super(); } public String ToString(){ return ore/10 +"kr"; } } Public class hundralappar extends money{ public ore(int ore) super(); } public String ToString(){ return"ore%1000 + "hundralappar; } } Public class hundralappar extends money{ public ore(int ore) super(); } public String ToString(){ return"ore%5000 + "femhundralappar; } } Public static void main(String[] args){ Scanner scan = new Scanner(System.in); System.out.println("ange kod") String s = scan.next(); if(login(info)){ //omissions (skriv in vad du vill här) }else{ //omissions } }

Permalänk
Medlem
Skrivet av Complicated:

Jag hade löst uppgifen så här:

Obs, interfacet är inte nödvändigt.

Och därför borde inte folk lära sig mekaniken för OO utan att skaffa sig förståelse för de så mycket viktigare design-valen.. Visst är det sött med arv, men vad försöker du uppnå här egentligen?

Visa signatur

"Some poor, phoneless fool is probably sitting next to a waterfall somewhere, totally unaware of how angry and scared he's supposed to be." - Duncan Trussell

Permalänk
Skrivet av gibbon_:

Och därför borde inte folk lära sig mekaniken för OO utan att skaffa sig förståelse för de så mycket viktigare design-valen.. Visst är det sött med arv, men vad försöker du uppnå här egentligen?

Jag försöker uppfylla TS krav. Se citatet nedan.

Citat:

"Sen ska programmet kunna omvandla säg ex; 1300kr så att det blir 2st Femhundralappar och 3st Hundralappar och skriva ut det. Om man vill ta ut 2700 ska den kunna räkna ut att det är 5st Femhundralappar och 2st Hundralappar"

Jag använde mig av template method för att eliminera duplicerad kod.

Interfacet är inte en del av "Template method", det var mest som "backup" om han vill införa en valuta som inte ärver från money.

Permalänk
Medlem
Skrivet av Simplified:

Jag försöker uppfylla TS krav. Se citatet nedan.

Jag använde mig av template method för att eliminera duplicerad kod.

Interfacet är inte en del av "Template method", det var mest som "backup" om han vill införa en valuta som inte ärver från money.

Koden åstadkommer ingenting, fungerar inte och har ingen verklig effekt utöver att ge varje klass en toString-metod. Ditt interface pengar är överflödigt eftersom alla klasser ärver av Object som har toString definierad. Visserligen skriver du att det är onödigt men varför har du då med det?

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Skrivet av Teknocide:

Koden åstadkommer ingenting, fungerar inte och har ingen verklig effekt utöver att ge varje klass en toString-metod.

Jag har inte tänkt att skriva hela koden för TS.

Det som jag har gjort är ett skelett för kravet om att systemet ska kunna skriva ut hundralappar/femhundralappar/kr etc.

Permalänk
Skrivet av Teknocide:

Ditt interface pengar är överflödigt eftersom alla klasser ärver av Object som har toString definierad. Visserligen skriver du att det är onödigt men varför har du då med det?

Se citatet nedan.

Skrivet av Simplified:

Interfacet är inte en del av "Template method", det var mest som "backup" om han vill införa en valuta som inte ärver från money.

Permalänk
Medlem

Varför inte bara använda modulu för att först räkna ut hur många femhundringar det ska ges, sedan ta resterande summan och kör modulu för hundringar etc? tills du kommer till enkronor, så skriver du ut v'rdena som du förståss har sparat i variabler och tada!

Permalänk
Medlem
Skrivet av gibbon_:

Och därför borde inte folk lära sig mekaniken för OO utan att skaffa sig förståelse för de så mycket viktigare design-valen.. Visst är det sött med arv, men vad försöker du uppnå här egentligen?

Måste hålla med, rent spontant hade jag nog gjort någon form av Valör Enum istället för en samling skumma och onödiga subklasser
Skall finnas en bra anledning till att man ska använda arv, här känns det inte alls nödvändigt iaf.
Yeye TS behöver inte mer än "använd modulo" till svar egentligen så, resten borde man klara av

Visa signatur

Spelrigg: 800D| i7 3930K@4,7 GHz - Custom WC | 32 GB Kingston HyperX Beast | 7970 GHz X-Edition |1x30 Dell U3011, 2x27" | Sennheiser HD650 | Xonar Essence STX |
Laptop: G74SX 17,3" 120 Hz 3D |
Server: Phenom II X4 955BE | Corsair XMS3 8 GB | 16 HDDs, 27 TB |
HTPCs: ASUS EEE Box 1.8 Ghz | Blu-Ray | OCZ Vertex 2 60 GB | 4 GB RAM |

Permalänk
Medlem

Låter komplicerat Är nybörjare på hela Java delen. Tror jag kom på ett sätt nu, den omvandlar 2100 till 4st femhundralappar. men i hundralappar blir det 21st.

System.out.println("Tack för ditt uttag, du tog ut "+x);
System.out.println("Det blev " +x/500+ " femhundralappar");
System.out.println("och " +x/100+ " hundralappar");

Går det göra något utav det?

Permalänk
Medlem

"ta bort" femhundralapparna innan du "matar ut" hundralappar ?:P om du fattar

Visa signatur

Spelrigg: 800D| i7 3930K@4,7 GHz - Custom WC | 32 GB Kingston HyperX Beast | 7970 GHz X-Edition |1x30 Dell U3011, 2x27" | Sennheiser HD650 | Xonar Essence STX |
Laptop: G74SX 17,3" 120 Hz 3D |
Server: Phenom II X4 955BE | Corsair XMS3 8 GB | 16 HDDs, 27 TB |
HTPCs: ASUS EEE Box 1.8 Ghz | Blu-Ray | OCZ Vertex 2 60 GB | 4 GB RAM |

Permalänk
Skrivet av leons:

Låter komplicerat Är nybörjare på hela Java delen. Tror jag kom på ett sätt nu, den omvandlar 2100 till 4st femhundralappar. men i hundralappar blir det 21st.

System.out.println("Tack för ditt uttag, du tog ut "+x);
System.out.println("Det blev " +x/500+ " femhundralappar");
System.out.println("och " +x/100+ " hundralappar");

Går det göra något utav det?

Du ska använda % inte /.

System.out.println("Tack för ditt uttag, du tog ut "+x);
System.out.println("Det blev " +x%500+ " femhundralappar");
System.out.println("och " +x%100+ " hundralappar");

Permalänk
Medlem
Skrivet av Simplified:

Du ska använda % inte /.

System.out.println("Tack för ditt uttag, du tog ut "+x);
System.out.println("Det blev " +x%500+ " femhundralappar");
System.out.println("och " +x%100+ " hundralappar");

Det skulle innebära att man får 1 femhundralapp och 6 hundralappar när man tar ut 600 kronor. Den banken har jag gärna mina pengar på
edit: 100 femhundralappar blir det ju faktiskt. Ännu bättre!

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem
Skrivet av Teknocide:

Det skulle innebära att man får 1 femhundralapp och 6 hundralappar när man tar ut 600 kronor. Den banken har jag gärna mina pengar på

Inte ens det, du får 100 femhundralappar men tyvärr inga hundralappar.

Tänk först, koda sen. Ett litet motto jag tycker om att följa.

Visa signatur

"Some poor, phoneless fool is probably sitting next to a waterfall somewhere, totally unaware of how angry and scared he's supposed to be." - Duncan Trussell

Permalänk
Medlem
Skrivet av gibbon_:

Inte ens det, du får 100 femhundralappar men tyvärr inga hundralappar.

Tänk först, koda sen. Ett litet motto jag tycker om att följa.

Haha ja, jag börjar bli skumögd. Tyckte det såg ut som ett /

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Skrivet av Teknocide:

Det skulle innebära att man får 1 femhundralapp och 6 hundralappar när man tar ut 600 kronor. Den banken har jag gärna mina pengar på
edit: 100 femhundralappar blir det ju faktiskt. Ännu bättre!

System.out.println("Tack för ditt uttag, du tog ut "+x);
System.out.println("Det blev " +x/500+ " femhundralappar");
int y = x%500;
System.out.println("och " +y/100+ " hundralappar");

Pinsamt... :s

Permalänk

Till TS:

Genom att använda "/" (division) får du ut antalet hela gånger något går, t.ex ger 2100/500 = 4 vid heltalsberäkningar.

Gör du sedan "%" - modulo får du ut resten vid division med något, t.ex ger 2100%500 = 100. (Jag vet att modulo inte innebär resten vid division, men här fungerar det på samma sätt.)

Alltså:

methodName(int money){ System.out.println(money/500 + "500-lappar"); //hur många 500-lappar int moneyLeft = money%500; //ta bort 500-lappar System.out.println(moneyLeft/100 + "100-lappar"); //hur många 100-lappar moneyLeft = moneyLeft%100; //ta bort 100-lappar System.out.println(moneyLeft/50 + "50-lappar"); moneyLeft = moneyLeft%50; System.out.println(money/20 + "20-lappar"); moneyLeft = moneyLeft%20; System.out.println(money/10 + "10-mynt"); moneyLeft = moneyLeft%10; System.out.println(money/5 + "5-mynt"); moneyLeft = moneyLeft%5; System.out.println(money/1 + "1-mynt"); }

Det är ju iofs hela lösningen. Men men.
Sen funderade jag lite på din "......."-utskrift.
int x = 0;
while (x < 30) {
System.out.print('.');
Sdb.sleep(0.1);
++x;
}

Borde man inte använda for-loop här när man vet hur många gånger den ska köras?
for(int i = 0; i < 30; i++){
System.out.print('.');
Sdb.sleep(0.1);
}

sleep(int ms) - tar millisekunder som argument (i formatet "long" - som är heltal). 30 x 0,1ms = 3ms. Du skriver alltså ut 30 punkter på 3ms. Låt det ta lite längre tid för större effekt.

Visa signatur

Phanteks P600S Grå - Ryzen 9 3900X - Phanteks PH-TC14PE Black - ASUS ROG Strix X570-F Gaming - G.Skill Trident Z Neo 32GB (2x16GB) 3600MHz CL16 - HD7970 - Seasonic Focus+ 650W Platinum

Permalänk
Medlem

Sedlarvariabel

Hej,

Kan man sätta flera värden i samma variabel?

Tex om jag vill samla alla sedlar på samma ställe så jag kan använda tex variabeln Sedlar för att köra igenom dem, funkar det?

Permalänk
Medlem
Skrivet av emfos:

Hej,

Kan man sätta flera värden i samma variabel?

Tex om jag vill samla alla sedlar på samma ställe så jag kan använda tex variabeln Sedlar för att köra igenom dem, funkar det?

Ja, det ska inte vara några problem.