Räkna ut antal dagar till en viss lön Java..

Permalänk
Medlem

Räkna ut antal dagar till en viss lön Java..

Ska med hjälp av en loop försöka mig på att räkna ut hur många dagar det tar innan man bli miljonär. Första dagen tjänar man 1 öre, andra dagen 2 öre, tredje dagen 4 öre osv. Lönen fördubblas alltså för varje dag.

Antal dagar och lönen under respektive dag ska sen visas i en textarea när jag trycker på en knapp.
Jag har gjort ett enkelt GUI med en textarea och en knapp. Men sen kommer jag inte längre. Ska alltså lägga ActionPreformed på knappen och där skriva koden men kör helt enkelt fast.

Har påbörjat en for loop men kanske inte ens är en sån man ska använda? Någon som kan hjälpa mig med detta? Det jag funderar över är alltså, hur ska koden "i knappen" se ut? Vilken typ av loop och uträkning är enklast att använda?

Permalänk
Hedersmedlem

Är du ute efter tips eller exakta svar?

1) Lagra summan som ett float (eller motsvarande, jag kodar inte i Java), samt dagens nummer som en int
2) Kör en while-loop, typ: while (pengar < 1000000)
3) I loopen skriver du först ut dagens nummer samt summan i textarean, och dubblar sedan värdet.
4) När loopen avslutas kan du skriva till eventuell extratext i textarean.

Vill man bara räkna ut hur många dagar det tar så går det väldigt snabbt med miniräknare, dock.
log2(100 000 000 öre)
Edit: Fel. Insåg nu att frågan var när det sammanlagt blivit >1M kr, inte efter hur många dagar lönen är >1M.

Visa signatur

Asus ROG STRIX B550-F / Ryzen 5800X3D / 48 GB 3200 MHz CL14 / Asus TUF 3080 OC / WD SN850 1 TB, Kingston NV1 2 TB + NAS / Corsair RM650x V3 / Acer XB271HU (1440p165) / LG C1 55"
Mobil: Moto G200

Permalänk
Medlem
Skrivet av Thomas:

Är du ute efter tips eller exakta svar?

1) Lagra summan som ett float (eller motsvarande, jag kodar inte i Java), samt dagens nummer som en int
2) Kör en while-loop, typ: while (pengar < 1000000)
3) I loopen skriver du först ut dagens nummer samt summan i textarean, och dubblar sedan värdet.
4) När loopen avslutas kan du skriva till eventuell extratext i textarean.

Vill man bara räkna ut hur många dagar det tar så går det väldigt snabbt med miniräknare, dock.
log2(100 000 000 öre)

Detta hjälpte mig tyvärr inte alls. Vet inte ens hur man lagrar som float. Har aldrig använd mig av detta förut.

Permalänk
Hedersmedlem

Jag kan inte varken testa koden eller hjälpa till med mera Java-specifika saker, men nåt i den här stilen:

int dag = 1; float pengar = 0.01; while (pengar < 1000000) { // Uppdatera textarea med dag + pengar pengar *= 2; // Eller pengar = pengar * 2; dag++; // Eller dag = dag +1; }

Visa signatur

Asus ROG STRIX B550-F / Ryzen 5800X3D / 48 GB 3200 MHz CL14 / Asus TUF 3080 OC / WD SN850 1 TB, Kingston NV1 2 TB + NAS / Corsair RM650x V3 / Acer XB271HU (1440p165) / LG C1 55"
Mobil: Moto G200

Permalänk
Medlem

Vet inte om det här kan hjälpa, det är dock i php:

$day=1; $goal=100000000; for($money=1;$money<$goal;$day++){ $money*=2; } echo $day;

Visa signatur

i7 920 | 12GB DDR3 | GTX 480 | GA-X58A-UD7 | 160GB SSD X25-M G2 | 1TB F3 HD103SJ | W7 64-bit | Mac Mini
Webb: bluekitestudios.com

Permalänk
Hedersmedlem
Skrivet av radera:

Detta hjälpte mig tyvärr inte alls. Vet inte ens hur man lagrar som float. Har aldrig använd mig av detta förut.

private float pengar = 0,01;

Permalänk
Medlem

Nu har jag kommit såhär långt men det stämmer ju inte alls.

jTextArea1.setText(null);
jTextArea1.append("Lön ökar per dag:");

int dag = 1;
double lön = 0.01;

while (lön < 1000000)
{
jTextArea1.append(String.valueOf(lön) + "\t");
lön = lön * 2;
++dag;

}

Permalänk
Hedersmedlem

Hm, vad stämmer inte? Den sista dagen skrivs inte ut, men i övrigt ser det rätt ut. Samma algoritm funkar i python (upp till dag 27: 671088.64 kr).
Lite omtänk bör lösa sista dagen:

while (1) { jTextArea1.append(String.valueOf(lön) + "\t"); lön = lön * 2; ++dag; if (lön > 1000000) break; }

EDIT: Ett grundläggande fel i det här är att det här visar lönens utveckling dock. Dag två har man ju egentligen 1 + 2 öre, dag tre 1 + 2 + 4 osv. Det går förstås att lösa med en till float som ökas med lönevärdet varje gång i loopen.

Visa signatur

Asus ROG STRIX B550-F / Ryzen 5800X3D / 48 GB 3200 MHz CL14 / Asus TUF 3080 OC / WD SN850 1 TB, Kingston NV1 2 TB + NAS / Corsair RM650x V3 / Acer XB271HU (1440p165) / LG C1 55"
Mobil: Moto G200

Permalänk

Om jag har fattat rätt så vill du ha vilken dag du fått ihop en miljon. inte den dag som du tjänar en miljon,vilket ni räknar ut

Permalänk
Medlem
Skrivet av NineLives:

Om jag har fattat rätt så vill du ha vilken dag du fått ihop en miljon. inte den dag som du tjänar en miljon,vilket ni räknar ut

Precis, hur många dagar det tar innan man tjänar en miljon. Lönen fördubblas varje dag med start på 1 öre första dagen, nästa dag 2 öre, nästa 4 osv.

Det är det jag inte får ihop. Jag vill alltså visa hur många dagar det tar innan man når en miljon och även vad jag tjänar varje dag. Sen vill jag även visa detta i två "spalter/kolumner" i en textarea.

Ungefär såhär:

Dag: Lön:
1 0.01
2 0.02
3 0.04

osv...om ni förstår hu jag menar?

Permalänk
Hedersmedlem
Skrivet av NineLives:

Om jag har fattat rätt så vill du ha vilken dag du fått ihop en miljon. inte den dag som du tjänar en miljon,vilket ni räknar ut

Ja, jag la till det i slutet i mitt förra inlägg minuten efter att jag postade.

Rent kodmässigt så blir det alltså att lägga till

float summa = 0;

före loopen, och

summa += lon;

inuti loopen.

Visa signatur

Asus ROG STRIX B550-F / Ryzen 5800X3D / 48 GB 3200 MHz CL14 / Asus TUF 3080 OC / WD SN850 1 TB, Kingston NV1 2 TB + NAS / Corsair RM650x V3 / Acer XB271HU (1440p165) / LG C1 55"
Mobil: Moto G200

Permalänk
Medlem

Nu blev det mycket för en nybörjare som mig. Koden ser ut som nedan:

int dag = 1;
double lön = 0.01;

while (lön <= 1000000)
{
jTextArea1.append(String.valueOf(dag) + "\n");
++dag;

jTextArea1.append(String.valueOf(lön) + "\n");
lön = lön * 2;
}

Har försökt att skapa lön som float men får röd understrykning då. Jag vill alltså se hur många dagar det tar innan man når upp till en miljon kronor. Lönen fördubblas varje dag med start på 1 öre, nästa dag 2, nästa dag 4, nästa dag 8 osv.

Detta vill jag visa i en textarea i två "spaler/kolumner". Alternativt rad för rad likt Dag: 1 Lön: 0.01 öre

Permalänk
Hedersmedlem

Prova detta:

int dag = 1; double lön = 0.01; double summa = 0; while (summa <= 1000000) { summa += lön; jTextArea1.append("Dag " + String.valueOf(dag) + ":\t"); ++dag; jTextArea1.append(String.valueOf(summa) + " kr\n"); lön = lön * 2; }

Visa signatur

Asus ROG STRIX B550-F / Ryzen 5800X3D / 48 GB 3200 MHz CL14 / Asus TUF 3080 OC / WD SN850 1 TB, Kingston NV1 2 TB + NAS / Corsair RM650x V3 / Acer XB271HU (1440p165) / LG C1 55"
Mobil: Moto G200

Permalänk
Medlem
Skrivet av radera:

Ska med hjälp av en loop försöka mig på att räkna ut hur många dagar det tar innan man bli miljonär. Första dagen tjänar man 1 öre, andra dagen 2 öre, tredje dagen 4 öre osv. Lönen fördubblas alltså för varje dag.

Antal dagar och lönen under respektive dag ska sen visas i en textarea när jag trycker på en knapp.
Jag har gjort ett enkelt GUI med en textarea och en knapp. Men sen kommer jag inte längre. Ska alltså lägga ActionPreformed på knappen och där skriva koden men kör helt enkelt fast.

Har påbörjat en for loop men kanske inte ens är en sån man ska använda? Någon som kan hjälpa mig med detta? Det jag funderar över är alltså, hur ska koden "i knappen" se ut? Vilken typ av loop och uträkning är enklast att använda?

Det där ska du kunna göra mycket effektivare genom att använda formeln för en geometrisk summa, men det förstör kanske tanken med den här övningen, att använda loopar.

Permalänk
Medlem
Skrivet av Thomas:

Prova detta:

int dag = 1; double lön = 0.01; double summa = 0; while (summa <= 1000000) { summa += lön; jTextArea1.append("Dag " + String.valueOf(dag) + ":\t"); ++dag; jTextArea1.append(String.valueOf(summa) + " kr\n"); lön = lön * 2; }

Tack, prövade men då blev det väldigt konstiga dagslöner. Får fortsätta försöka, får nog kläm på det snart.

Permalänk
Medlem

Ganska fult, men blir nog enklast för dig att förstå om man gör såhär Enkel men ändå effektiv kod, testade och funkar bra Bara fråga om du undrar något

package dagochlön;

import javax.swing.JOptionPane;

public class Main {

public static void main(String[] args) {

double lön = 0.005; //sätt din utgångslön till 0.005 kr, du gångar det med 2 redan första dagen så du börjar på 0.01 kr

int dag = 1; //börja på gad 1

String tabell = ""; //skapa en tom text att lagra dina värden i

while (lön <= 1000000) { //rulla på tills du är över eller på exakt en miljon
tabell = tabell + dag + " "; //lägg in vilken dag det är i tabellen
lön = lön * 2; //gånga dagens lön med 2
tabell = tabell + lön + "\n"; //lägg till vilken lön du har denna dag
dag++; //öka på dagen med 1
}

JOptionPane.showMessageDialog(null, tabell); //skriv ut tabellen du skapat i en textruta
System.exit(0); //avsluta hela härligheten snyggt

}
}

Visa signatur

CPU: Core i5 4690K | GPU: MSI GeForce GTX 970 Gaming | Mammabräda: Asus Maximus VII Ranger | Minnen: Corsair Vengeance 8 gb (2x4) 1600 Mhz | Kylare: Be Quiet! Pure Rock Slim | PSU: Evga SuperNova G2 750W | Chassi: NZXT H440 Red/Black

Permalänk
Medlem

Vet att det är en programmeringsuppgift men kan inte riktigt låta bli....
låt t arbetsdagen.
lönen för t=1 är 1, lönen för t=2 är 2, lönen för t=3 är 4 osv. allmänt lönen l(t) = 2^(t-1)
vill vi sedan summera för att ta reda på hur många pengar vi har så finner vi att p(t) = sum( l(x), x=1..t) vilket inte är något annat än: p(t) = 2^t - 1
(enheten på pengar är ören)

p(t) = 100000000 ören = 2^t - 1 ==> ln2(100000001) = t ==> t = 26.57 dagar måste såklart avrundas till då 27 dagar och lönen då kommer att vara 1 342 177,27 kronor

Visa signatur

weeeee

Permalänk
Medlem

Nu har jag fått lite bättre koll på hur det fungerar. Men då kommer nästa problem. För nästa knapp vill jag vid knapptryckning visa texten man skriver in i jtextfield1 de antal ggr som man skriver in i jtextfield 2 i textarea1. Detta med en do...while loop.

Alltså, text i fält1 de angivna ggr i fält 2 ska visas så många ggr i en textarea. Men nu verkar det inte fungera att använda sig av:

jTextArea1.append(String.valueOf(jTextField2) + "\n");

Permalänk
Hedersmedlem

Texten till det här inläggest skrev jag igår så det handlar inte om din andra uppgift (det med jtextfield2):

Visserligen är det ett väldigt simpelt exempel det här men för mig svider det lite att man lagrar valuta i en flyttalsvariabel som många exempel ovan (float och double).
Om vi är säkra på att exemplet bara ska användas för 1 miljon så kör jag hellre på en int och omvandlar till kronor vid utskrift

class salary { public static void main (String[] args) { int dag = 0; int förmögenhet = 0; // I ören while (förmögenhet < 100000000) { System.out.println("Förmögenhet: \t " + (förmögenhet += Math.pow (2, dag))/100.0 + " \tLön :\t " + Math.pow(2, dag)/100.0 + " \t Dag:" + ++dag); } } }

Slängde ihop ett litet konsolprogram.
Jag är lite ful och utnyttjar strängkonkatineringens (+) associativitet. Man får alltså inte samma resultat om man skulle börja utskriften med dagens nummer.
Jag lagrar inte dagslönen eftersom den kan räknas ut varje gång istället. Dividerar med en double (100.0) också för att visa värdet i kronor istället för öre. Men det värdet används inte i vidare beräkningar och ingen kumulativ effekt av flyttalsfel.

Visa signatur

Forumregler | Feedbackforumet | Något som behöver modereras? Tryck på Anmäl inlägget och ge en anledning, någon moderator kommer granska inlägget och göra (egen) bedömning
"Fate. Protects fools, little children and ships named Enterprise." - Riker - ST:TNG

Permalänk
Medlem

Tack för svar ovan, tror jag har fått lite bättre koll på det nu, men som sagt problemet har övergått till annan knapp. Alltså actionpreformed är jag i för en knapp.

Vill ta text från textfält1 och skriva ut den i textarea det antal ggr som textfält2 säger. Input i textfält1 är ett namn och i textfält 2 är det antal ggr som man vill namnet ska skrivas ut.

Jag får inte riktigt det att fungera med att det som står i respektive textfält ska "bli" namn och antal...

jTextArea1.setText(null);
jTextArea1.append("Visar ditt namn antal ggr du valt:\n");

int räknare = 0;
int namn;
int antal;

do
{
jTextField1.setText(String.valueOf(jTextField1)+ "\n");

jTextField2.setText(String.valueOf(jTextField2)+"\n");

jTextArea1.append(String.valueOf(namn * antal) + "\n");

++räknare;

} while (räknare < 100 );

Permalänk
Hedersmedlem

Det är mer passande att använda en for-loop när man vet hur många gånger man vill att en loop ska gå.

Permalänk
Medlem
Skrivet av Shimonu:

Det är mer passande att använda en for-loop när man vet hur många gånger man vill att en loop ska gå.

Ja, fast meningen är att jag ska använda mig utav en do...while loop för att visa input i textfält1 antal ggr i textarea som skrivs i textfält 2. Att jag lagt räknare < 100 kan lika gärna vara räknare > 0.

Permalänk
Medlem
Skrivet av NineLives:

Om jag har fattat rätt så vill du ha vilken dag du fått ihop en miljon. inte den dag som du tjänar en miljon,vilket ni räknar ut

Det är ju samma sak bara att ta minus en dag...

Dagen innan du tjänar över summa x kommer du alltid ha tjänat summa x totalt - n där n är minsta värdet.

Alla dagar innan tillsammans måste nämligen bli 1 öre mindre än vad du tjänar dag x.

t.ex.

DAG 5 har du = 1+2+4+8+16 = 31 öre.
DAG 6 tjänar du 32 öre.

DAG 6 har du = 1+2+4+8+16+32 = 63 öre
DAG 7 tjänar du 64 öre.

Detta gäller även för en miljon. Tjänar du över en miljon på säg dag 28 har du tjänat in sammanlagt ett öre mindre alla dagar fram till och med dag 27.

Mattekunskap > Kodkunskap.

Permalänk
Medlem

Förstår inte varför du ska använda dig av en do/while, mycket enklare med en for-sats. Gjort det väldigt luftig och lite förenklad för att du ska förstå den bra

package skrivutnamn;

import javax.swing.JOptionPane;

public class Main {

public static void main(String[] args) {

String s = JOptionPane.showInputDialog("Vilket namn vill du ska visas?");

String t = JOptionPane.showInputDialog("Hur många gånger vill du att namnet ska visas?");

int x = Integer.parseInt(t); //Omvandla "texten" hur många gånger du vill visa namnet till en siffra man kan räkna med

String u = ""; //Skapa en tom text att lagra namnen i

for (int i = 1; i <= x; i++) //Lagra namnen i den tomma taxten, det kommer upprepas så många gånger du skrev in innan
{
u = u + s + "\n";
}

JOptionPane.showMessageDialog(null, u); //Skriv ut din text

System.exit(0); //Avsluta snyggt

}
}

Visa signatur

CPU: Core i5 4690K | GPU: MSI GeForce GTX 970 Gaming | Mammabräda: Asus Maximus VII Ranger | Minnen: Corsair Vengeance 8 gb (2x4) 1600 Mhz | Kylare: Be Quiet! Pure Rock Slim | PSU: Evga SuperNova G2 750W | Chassi: NZXT H440 Red/Black

Permalänk
Medlem
Skrivet av folmeroN:

Förstår inte varför du ska använda dig av en do/while, mycket enklare med en for-sats. Gjort det väldigt luftig och lite förenklad för att du ska förstå den bra

package skrivutnamn;

import javax.swing.JOptionPane;

public class Main {

public static void main(String[] args) {

String s = JOptionPane.showInputDialog("Vilket namn vill du ska visas?");

String t = JOptionPane.showInputDialog("Hur många gånger vill du att namnet ska visas?");

int x = Integer.parseInt(t); //Omvandla "texten" hur många gånger du vill visa namnet till en siffra man kan räkna med

String u = ""; //Skapa en tom text att lagra namnen i

for (int i = 1; i <= x; i++) //Lagra namnen i den tomma taxten, det kommer upprepas så många gånger du skrev in innan
{
u = u + s + "\n";
}

JOptionPane.showMessageDialog(null, u); //Skriv ut din text

System.exit(0); //Avsluta snyggt

}
}

För att övningen går ut på att lära sig använda do..while. Jag har alltså skapat ett enkelt GUI med en ny jFrameForm som består av textfält1, textfält2, textarea1 och en knapp.

I knappens actionpreformed har jag denna kod:

private void jTextField2ActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:
}

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
// TODO add your handling code here:

jTextField1.setText(null);
jTextField2.setText(null);
jTextArea1.setText(null);
jTextArea1.append("Visar ditt namn antal ggr du valt:\n");

int räknare = 0;
int namn;
int antal;

do
{
jTextField1.setText(String.valueOf(jTextField1));

jTextField2.setText(String.valueOf(jTextField2));

jTextArea1.append(String.valueOf(namn * antal) + "\n");

++räknare;

} while (räknare > 0 );

}

Jag vill alltså visa texten i textfält1 i textarean det antal ggr som skrivs in i textfäl2. Men jag får inte ihop koden för hur jag ska få textfäl1 = namn och textfäl2 = antal och sedan visa detta i textarean.

Permalänk
Medlem
Skrivet av Ixos:

Det är ju samma sak bara att ta minus en dag...

Dagen innan du tjänar över summa x kommer du alltid ha tjänat summa x totalt - n där n är minsta värdet.

Alla dagar innan tillsammans måste nämligen bli 1 öre mindre än vad du tjänar dag x.

t.ex.

DAG 5 har du = 1+2+4+8+16 = 31 öre.
DAG 6 tjänar du 32 öre.

DAG 6 har du = 1+2+4+8+16+32 = 63 öre
DAG 7 tjänar du 64 öre.

Detta gäller även för en miljon. Tjänar du över en miljon på säg dag 28 har du tjänat in sammanlagt ett öre mindre alla dagar fram till och med dag 27.

Mattekunskap > Kodkunskap.

Det där hade du kunnat få fram med formeln för en geometrisk summa

Permalänk
Medlem

Meningen är att jag ska använda mig utav en do...while loop för att ta emot input (ett namn) från textfält1 och visa det antal ggr i textarea som skrivs i textfält 2 (ett nummer).

Har gjort ett simpelt GUI, två textfält, en textarea och en knapp. Nu är problemet, "i knappen" actionpreformed ska alltså en do..while loop in som gör det ovan nämnda.

Permalänk
Medlem
Skrivet av Thomas:

Edit: Fel. Insåg nu att frågan var när det sammanlagt blivit >1M kr, inte efter hur många dagar lönen är >1M.

Det är ju inte helt fel, svaret blir dagen innan lönen är 1Mkr.

Visa signatur

I'm Winston Wolfe. I solve problems.

Permalänk
Hedersmedlem
Skrivet av radera:

För att övningen går ut på att lära sig använda do..while. Jag har alltså skapat ett enkelt GUI med en ny jFrameForm som består av textfält1, textfält2, textarea1 och en knapp.

I knappens actionpreformed har jag denna kod:

kod...

Jag vill alltså visa texten i textfält1 i textarean det antal ggr som skrivs in i textfäl2. Men jag får inte ihop koden för hur jag ska få textfäl1 = namn och textfäl2 = antal och sedan visa detta i textarean.

Men den här koden är jättekonstig för mig. Du har ett villkor där du vill köra loopen så länge räknaren är positiv och allt du gör med räknaren i loopen är att öka räknaren och du har ingenstans i loopen där du har ett villkor som avbryter med ett break. Du använder do-while på fel sätt.

Är det ett krav i uppgiften att använda do-while?