Permalänk
Medlem

Behöver hjälp med loop satser!

Hur får jag denna kod att loopa 10 gånger så att den efter den 10e gången skriver ut värdet på a1 och a2.
Uppgiften är att skriva ett program där man skriver in ett antal personer ( jag har valt 10) för att sen skriva ut medelålder på både männen och kvinnorna. Jag har nu suttit i allt för många timmar och försökt förstå hur jag använder for-satsen på rätt sätt men nu börjar jag dra mig i håret och behöver verkligen hjälp!
Tack på förhand!

Länk till strukturdiagram

https://www.google.com/url?sa=i&url=https%3A%2F%2Fwww.pluggak...

for (int i =0;i<10;i++) {
String s = JOptionPane.showInputDialog(null, "Ålder?");
int ålder = Integer.parseInt(s);
int a1 = 0, a2 = 0, g1, g2, m1, m2;

Object[] options = {"Man", "Kvinna"};
int knappNr = JOptionPane.showOptionDialog(null,
"Är du man eller kvinna?",
"kön?",
JOptionPane.YES_NO_CANCEL_OPTION,
JOptionPane.DEFAULT_OPTION,
null,
options,
options[1]);
if (knappNr == 0)
a1 = (a1 + 1);
if (knappNr==1)
a2=(a2+1);

Permalänk
Medlem

Alla variabler deklarerade inne i loopen lever bara tills loopen når slutet av en iteration, sen skapas en ny variabel med samma namn när loopen börjar om igen. Du kan inte heller använda dessa variabler utanför loopen eftersom de endast existerar inne i loopen. Du måste alltså deklarera t.ex. a1 och a2 utanför loopen om du vill summera antalet män och kvinnor.

Permalänk
Medlem

Rekommenderar att du har mer beskrivande namn på dina variabler också än a1 osv typ manAge, womanAge.

Om du känner till listor så kanske du kan ha en lista för varje kön som du lägger åldrarna i så kan du lätt iterera över dem när du har all input och göra dina beräkningar

Permalänk
Medlem

Du nollställer a0 och a1 varje iteration. Du får läsa på lite om "variable scopes" i Java.

Permalänk
Medlem
Skrivet av zavan:

Hur får jag denna kod att loopa 10 gånger så att den efter den 10e gången skriver ut värdet på a1 och a2.
Uppgiften är att skriva ett program där man skriver in ett antal personer ( jag har valt 10) för att sen skriva ut medelålder på både männen och kvinnorna. Jag har nu suttit i allt för många timmar och försökt förstå hur jag använder for-satsen på rätt sätt men nu börjar jag dra mig i håret och behöver verkligen hjälp!
Tack på förhand!

Länk till strukturdiagram

https://www.google.com/url?sa=i&url=https%3A%2F%2Fwww.pluggak...

for (int i =0;i<10;i++) {
String s = JOptionPane.showInputDialog(null, "Ålder?");
int ålder = Integer.parseInt(s);
int a1 = 0, a2 = 0, g1, g2, m1, m2;

Object[] options = {"Man", "Kvinna"};
int knappNr = JOptionPane.showOptionDialog(null,
"Är du man eller kvinna?",
"kön?",
JOptionPane.YES_NO_CANCEL_OPTION,
JOptionPane.DEFAULT_OPTION,
null,
options,
options[1]);
if (knappNr == 0)
a1 = (a1 + 1);
if (knappNr==1)
a2=(a2+1);

Och ett generellt tips är att undvika åäö i variablar ex "int ålder". Kör engelskan. Ger dig fördel ifall någon utomstående ska läsa din kod också.

Permalänk
Medlem

Tack nu har jag kommit vidare från det problemet jag hade men nu har jag ett sista problem och det är att utskriften av medelålder blir fel. Någon som förstår vart problemet ligger?

public class Main {
public static void main(String[] args) {
int man = 0, kvinna = 0, alderMan=0, alderKvinna=0, medelman=0, medelkvinna=0;
for (int i =0;i<10;i++) {
String s = JOptionPane.showInputDialog(null, "Ålder?");
int alder = Integer.parseInt(s);

Object[] options = {"Man", "Kvinna"};
int knappNr = JOptionPane.showOptionDialog(null,
"Är du man eller kvinna?",
"kön?",
JOptionPane.YES_NO_CANCEL_OPTION,
JOptionPane.DEFAULT_OPTION,
null,
options,
options[1]);
if (knappNr == 0)
man = (man + 1);
alderMan=alderMan+alder;

if (knappNr==1)
kvinna=(kvinna+1);
alderKvinna=alderKvinna+alder;

}
medelman= alderMan/man;
medelkvinna=alderKvinna/kvinna;
JOptionPane.showMessageDialog(null,"antal män: " + man +"\nMedelålder: "+medelman);
JOptionPane.showMessageDialog(null,"Antal kvinnor: "+ kvinna + "\nMedelålder: " + medelkvinna);
}
}

Permalänk
Medlem

@zavan: Dina if-satser är fel.

if (...) sats1 sats2

är samma sak som:

if (...) { sats1 } sats2

D.v.s. if-satsen gäller endast efterföljande sats eller block. Ha som vana att alltid använda ett block när du skriver if-satser för att undvika såna fel, d.v.s.:

if (...) { sats1 sats2 }

Permalänk
Medlem

Edit: Såg fel, läs ovanstående

Permalänk
Medlem
Skrivet av perost:

@zavan: Dina if-satser är fel.

if (...) sats1 sats2

är samma sak som:

if (...) { sats1 } sats2

D.v.s. if-satsen gäller endast efterföljande sats eller block. Ha som vana att alltid använda ett block när du skriver if-satser för att undvika såna fel, d.v.s.:

if (...) { sats1 sats2 }

Okej har nu ändrat till detta! och får detta felmeddelande

Exception in thread "main" java.lang.ArithmeticException: / by zero
at com.leosavegard.Main.main(Main.java:36)

if (knappNr == 0) {
man = (man + 1);
alderMan = (alderMan + alder);
}

if (knappNr == 1) {
kvinna = (kvinna + 1);
alderKvinna = (alderKvinna + alder);
}
medelman = alderMan / man;
medelkvinna = alderKvinna / kvinna;
JOptionPane.showMessageDialog(null, "antal män: " + man + "\nMedelålder: " + medelman);
JOptionPane.showMessageDialog(null, "Antal kvinnor: " + kvinna + "\nMedelålder: " + medelkvinna);

Permalänk
Medlem

Du delar på noll om "man" eller "kvinna" är noll

Permalänk
Medlem

jaa! uträkningen hade hoppat in i loopen så behövde lägga den utanför! correct?

Permalänk
Medlem

Här kommer den slutliga koden som funkar!
Vad skulle ni göra för att göra den mer robust och stabil mot fel? Märkte tex att om jag bara skriver in män så kommer programmet inte exekveras då den ger felmeddelandet att jag inte kan dela med 0. Antar att den menar eftersom det är 0 inskriva kvinnor så avbryts programmet. Kom gärna med förslag på hur jag kan göra programmet bättre!
Tack för alla svar!

public class Main {
public static void main(String[] args) {
int man = 0, kvinna = 0, alderMan = 0, alderKvinna = 0, medelMan = 0, medelKvinna = 0;
for (int i = 0; i < 110; i++) {
String s = JOptionPane.showInputDialog(null, "Ålder?");
int alder = Integer.parseInt(s);

Object[] options = {"Man", "Kvinna"};
int knappNr = JOptionPane.showOptionDialog(null,
"Är du man eller kvinna?",
"kön?",
JOptionPane.YES_NO_CANCEL_OPTION,
JOptionPane.DEFAULT_OPTION,
null,
options,
options[1]);

if (knappNr == 0) {
man = (man + 1);
alderMan = (alderMan + alder);
}

if (knappNr == 1) {
kvinna = (kvinna + 1);
alderKvinna = (alderKvinna + alder);
}
}
medelMan = alderMan / man;
medelKvinna = alderKvinna / kvinna;
JOptionPane.showMessageDialog(null, "Antal män: " + man + "\nMedelålder: " + medelman);
JOptionPane.showMessageDialog(null, "Antal kvinnor: " + kvinna + "\nMedelålder: " + medelkvinna);
}
}

Permalänk
Medlem
Skrivet av zavan:

jaa! uträkningen hade hoppat in i loopen så behövde lägga den utanför! correct?

Stämmer bra!

Vid division skulle jag rekommendera att du alltid kontrollerar att nämnaren är större än noll. Annars får du felmeddelandet du nyss såg.

Typ såhär:
int result = denominator <1 ? 0 : nominator/denominator;

eller

int result = 0;
if(denominator>0) {
result = nominator/denominator;
}else{
//Hantera fel, om du vill
}

Permalänk
Medlem

Den lättaste lösningen är väl att ha fler if/else där du kollar efter 0 och säger "Inga kvinnor" eller nått om det inte finns några.

Om du följer mitt förslag från innan med listor så kan du loopa över listorna när du har din input för att beräkna åldrarna, har du inte lagt in några kvinnor säg så kommer listans längd vara 0 så du kan kolla om womenList.isEmpty(), då vet du att du inte har några kvinnor

Permalänk
Medlem
Skrivet av Xenofonus:

Den lättaste lösningen är väl att ha fler if/else där du kollar efter 0 och säger "Inga kvinnor" eller nått om det inte finns några.

Om du följer mitt förslag från innan med listor så kan du loopa över listorna när du har din input för att beräkna åldrarna, har du inte lagt in några kvinnor säg så kommer listans längd vara 0 så du kan kolla om womenList.isEmpty(), då vet du att du inte har några kvinnor

Det där med listor är nog lite överkurs just nu för mig! Men hur skulle dessa if/else satser se ut i mitt fall? har försökt lite men får inte riktigt få det att gå ihop

Permalänk
Medlem
Skrivet av HappySatan:

Stämmer bra!

Vid division skulle jag rekommendera att du alltid kontrollerar att nämnaren är större än noll. Annars får du felmeddelandet du nyss såg.

Typ såhär:
int result = denominator <1 ? 0 : nominator/denominator;

eller

int result = 0;
if(denominator>0) {
result = nominator/denominator;
}else{
//Hantera fel, om du vill
}

Älskar att du rekommenderar den enda trinära operatorn i Java till någon som precis börjat programmera.

Det är nog bättre att hålla sig till det utförliga if-else alternativet för nybörjare.

Permalänk
Medlem
Skrivet av johanandersson:

Älskar att du rekommenderar den enda trinära operatorn i Java till någon som precis börjat programmera.

Det är nog bättre att hålla sig till det utförliga if-else alternativet för nybörjare.

Så långt tänkte jag inte. Men du har helt rätt, när man börjar programmera är det bäst att använda de mest lättlästa alternativen för allt.

Permalänk
Medlem
Skrivet av zavan:

Det där med listor är nog lite överkurs just nu för mig! Men hur skulle dessa if/else satser se ut i mitt fall? har försökt lite men får inte riktigt få det att gå ihop

} if (man > 0) { medelMan = alderMan / man; JOptionPane.showMessageDialog(null, "Antal män: " + man + "\nMedelålder: " + medelman); } if (kvinna > 0) { medelKvinna = alderKvinna / kvinna; JOptionPane.showMessageDialog(null, "Antal kvinnor: " + kvinna + "\nMedelålder: " + medelkvinna); } }

Permalänk
Medlem

Exemplet ovanför är precis hur du skulle göra men som du ser så är det exakt samma logik 2 ggr så du kanske kan skriva en fräsig liten metod som du kan återanvända för just det där?

Vet inte om du har hållit på med det innan men det klarar du garanterat av

Permalänk
Medlem
Skrivet av ToddTheOdd:

} if (man > 0) { medelMan = alderMan / man; JOptionPane.showMessageDialog(null, "Antal män: " + man + "\nMedelålder: " + medelman); } if (kvinna > 0) { medelKvinna = alderKvinna / kvinna; JOptionPane.showMessageDialog(null, "Antal kvinnor: " + kvinna + "\nMedelålder: " + medelkvinna); } }

Tack!!!

Permalänk
Medlem
Skrivet av Xenofonus:

Exemplet ovanför är precis hur du skulle göra men som du ser så är det exakt samma logik 2 ggr så du kanske kan skriva en fräsig liten metod som du kan återanvända för just det där?

Vet inte om du har hållit på med det innan men det klarar du garanterat av

Jodå men det har jag lite koll på!
Det ska jag göra