Permalänk
Medlem

Hjälp med Java

Halloj.

Jag håller på med en uppgift i Java där jag skriva ett program där användaren först ska ange ett tågs kapacitet (max antal passagerare) samt hur många stationer tåget ska stanna vid. Därefter ges användaren möjlighet att mata in hur många som kliver på tåget, kliver av tåget samt står kvar på perrongen vid varje station. Programmet ska sen tala om ifall inmatningen är möjlig eller inte, alltså att antalet passagerare inte överstiger tågets kapacitet, att ingen passagerare ska kunna kliva av på första stationen samt att ingen ska lämnas kvar på perrongen vid sista stationen. Antalet passagerare kan heller inte vara mindre än 0.

Såhär är uppgiften formulerad:

Skriv ett program för ett visst tåg. Programmet ska fråga efter hur många passagerare som lämnar tåget, hur många som går in i tåget och hur många som får stanna kvar vid en viss station. Programmet ska verifiera om inmatningen är inkonsekvent, dvs programmet ska kontrollera vid varje station att antalet personer i tåget inte är mindre än 0 eller överstiger tågets kapacitet och att ingen passagerare får vänta förgäves nästa tåg. Tåget ska börja och slutföra resan tom, särskilt, passagerare ska inte stanna kvar och vänta på tåget vid den sista stationen.

Jag har lyckats få koden att ta emot alla inmatningar på respektive station men lyckas inte få den att addera inmatningarna.

Om jag exempelvis sätter kapacitet till 5 passagerare och antal stationer till 2, på första stationen anger jag att 3 kliver på, ingen kliver av och ingen stannar så skriver den ut att det är möjligt. På andra stationen så kliver det på ytterligare 3, ingen kliver av och ingen stannar. Nu skriver den fortfarande ut att det är möjligt då den bara verkar ta den senaste inmatningen men i själva verket så är det ju nu 6 personer på ett tåg som har maxkapacitet på 5 och således borde svaret bli att det är omöjligt. Jag får fasiken inte ihop det här. Sen måste jag lägga till att den skriver ut omöjligt om jag anger att någon kliver av på första stationen, kliver på vid sista eller stannar kvar vid sista. Men det blir nästa bekymmer.

Permalänk
Avstängd

Tänk igenom vad du vill göra. Jag tänker mig att du har en variabel som är maxkapaciteten som användaren har skrivit in, låt oss kalla den 'max', sen en som håller antalet nuvarande passagerare, 'current'. Sen vid varje station får du lägga ihop påstigna och dra av de som går av, och kolla ifall detta plus 'current' är över max. Typ 'i' är noll från början minus avstigna plus påstigna sen kollar du att 'i + current <= max'.

Permalänk
Medlem
Skrivet av snajk:

Tänk igenom vad du vill göra. Jag tänker mig att du har en variabel som är maxkapaciteten som användaren har skrivit in, låt oss kalla den 'max', sen en som håller antalet nuvarande passagerare, 'current'. Sen vid varje station får du lägga ihop påstigna och dra av de som går av, och kolla ifall detta plus 'current' är över max. Typ 'i' är noll från början minus avstigna plus påstigna sen kollar du att 'i + current <= max'.

Jo, något sånt har jag också tänkt. Problemet är bara att den inte vill lägga ihop inmatningarna från respektive station utan tar bara upp inmatningen från den senaste stationen.

Permalänk
Avstängd
Skrivet av Tillaeus:

Jo, något sånt har jag också tänkt. Problemet är bara att den inte vill lägga ihop inmatningarna från respektive station utan tar bara upp inmatningen från den senaste stationen.

Ja ok. Men då har du ett logiskt fel någonstans, alltså behöver du klistra in koden för att vi ska kunna hjälpa dig.

Permalänk
Medlem
Skrivet av snajk:

Ja ok. Men då har du ett logiskt fel någonstans, alltså behöver du klistra in koden för att vi ska kunna hjälpa dig.

Såhär ser koden ut, en del av den är med hjälp från läraren så jag antar att jag borde vara på rätt spår iallafall.

package programmering; import java.util.Scanner; public class tåg { public static void main(String[] args) { Scanner scan = new Scanner(System.in); System.out.print("Ange tågets kapacitet: "); int MaxKap = scan.nextInt(); System.out.print("Ange antalet stationer: "); int AntalStn = scan.nextInt(); if (MaxKap >=1 && MaxKap <=100 && AntalStn >=2 && AntalStn <=10) { for (int StnVal = 0; StnVal < AntalStn; StnVal++) { System.out.println("\nStation nr: " + (StnVal +1)); System.out.print("Ange hur många som kliver på tåget: "); int AntalPå = scan.nextInt(); System.out.print("Ange hur många som kliver av tåget: "); int AntalAv = scan.nextInt(); System.out.print("Ange hur många som stannar kvar på perrongen: "); int AntalStannar = scan.nextInt(); if (AntalPå > MaxKap || AntalPå < 0 ){ System.out.println("\nOmöjligt!");} else System.out.println("\nMöjligt!"); if (StnVal +1 == AntalStn && (AntalStannar > 0 || AntalPå > 0)) { } } } } }

Gjort mer lättläst
Permalänk
Avstängd
Skrivet av Tillaeus:

Såhär ser koden ut, en del av den är med hjälp från läraren så jag antar att jag borde vara på rätt spår iallafall.

package programmering; import java.util.Scanner; public class tåg { public static void main(String[] args) { Scanner scan = new Scanner(System.in); System.out.print("Ange tågets kapacitet: "); int MaxKap = scan.nextInt(); System.out.print("Ange antalet stationer: "); int AntalStn = scan.nextInt(); if (MaxKap >=1 && MaxKap <=100 && AntalStn >=2 && AntalStn <=10) { for (int StnVal = 0; StnVal < AntalStn; StnVal++) { System.out.println("\nStation nr: " + (StnVal +1)); System.out.print("Ange hur många som kliver på tåget: "); int AntalPå = scan.nextInt(); System.out.print("Ange hur många som kliver av tåget: "); int AntalAv = scan.nextInt(); System.out.print("Ange hur många som stannar kvar på perrongen: "); int AntalStannar = scan.nextInt(); if (AntalPå > MaxKap || AntalPå < 0 ){ System.out.println("\nOmöjligt!");} else System.out.println("\nMöjligt!"); if (StnVal +1 == AntalStn && (AntalStannar > 0 || AntalPå > 0)) { }}

Du kollar bara om AntalPå är mer än MaxKap (eller mindre än noll), du tar aldrig med befintliga passagerare någonstans, och håller heller inte koll på detta någonstans i koden du klistrat in i alla fall. Om du håller koll på det i exempelvis en variabel 'nuvarande' kan din if se ut typ:

if (AntalPå + nuvarande > MaxKap || AntalPå < 0 )

Men du behöver förstås ta med AntalAv också i kollen. Sen tror jag inte du har tolkat uppgiften riktigt korrekt, antalet som får stanna kvar är väl helt enkelt de som inte får plats av de som ville på, inte att ett antal står kvar på perrongen för att de vill. Dock är det inte så bra formulerat så jag är inte säker.

Permalänk
Medlem
Skrivet av snajk:

Du kollar bara om AntalPå är mer än MaxKap (eller mindre än noll), du tar aldrig med befintliga passagerare någonstans, och håller heller inte koll på detta någonstans i koden du klistrat in i alla fall. Om du håller koll på det i exempelvis en variabel 'nuvarande' kan din if se ut typ:

if (AntalPå + nuvarande > MaxKap || AntalPå < 0 )

Men du behöver förstås ta med AntalAv också i kollen. Sen tror jag inte du har tolkat uppgiften riktigt korrekt, antalet som får stanna kvar är väl helt enkelt de som inte får plats av de som ville på, inte att ett antal står kvar på perrongen för att de vill. Dock är det inte så bra formulerat så jag är inte säker.

Ah, intressant poäng! Men hur ska jag skriva koden för att den ska lägga till AntalPå vid varje station till en variabel Nuvarande?

Såhär står det längre ner i uppgiftens förklaring:

Nästa inmatningar vid varje station består av tre heltal,

lämnar = antal passagerare som lämnar tåget,
går_in = antal passagerare som kommer in i tåget och
stannar = antal passagerare som blir tvungna att stanna kvar på en station.

Permalänk
Avstängd
Skrivet av Tillaeus:

Ah, intressant poäng! Men hur ska jag skriva koden för att den ska lägga till AntalPå vid varje station till en variabel Nuvarande?

Tja, 'befintliga = befintliga + antalPå - antalAv' kanske? Men kolla först att du inte när maxtaket för annars har du ju redan ändrat på din variabel innan du vet om du kommer kunna släppa på någon.

Citat:

Såhär står det längre ner i uppgiftens förklaring:

Nästa inmatningar vid varje station består av tre heltal,

lämnar = antal passagerare som lämnar tåget,
går_in = antal passagerare som kommer in i tåget och
stannar = antal passagerare som blir tvungna att stanna kvar på en station.

Ja precis. Lite otydligt.

Det står ju antal passagerare som blir tvungna att stanna kvar på en station, vilket för mig indikerar att det handlar om de som ville gå på men som inte fick plats. Är det så behöver du spara ett antal stillastående/kvarvarande passagerare för varje station, och jag antar att du sen ska lägga till dessa nästa gång du kommer till stationen, som tillägg i de som användaren säger ska åka med.

Permalänk
Medlem
Skrivet av snajk:

Tja, 'befintliga = befintliga + antalPå - antalAv' kanske? Men kolla först att du inte när maxtaket för annars har du ju redan ändrat på din variabel innan du vet om du kommer kunna släppa på någon.
Ja precis. Lite otydligt.

Detta har jag testat, problemet är att den bara tar inmatningen från den senaste stationen och inte en total baserat på de tidigare stationernas antal passagerare.

Skrivet av snajk:

Det står ju antal passagerare som blir tvungna att stanna kvar på en station, vilket för mig indikerar att det handlar om de som ville gå på men som inte fick plats. Är det så behöver du spara ett antal stillastående/kvarvarande passagerare för varje station, och jag antar att du sen ska lägga till dessa nästa gång du kommer till stationen, som tillägg i de som användaren säger ska åka med.

Just den delen av uppgiften är väldigt oklar, att jag själv ska ange till hur många som blir stående på perrongen är lite märkligt. Men troligen är det för att om jag skulle ange att det står minst en person kvar på perrongen på den sista stationen, då ska programmet skriva ut "Omöjligt" eftersom ingen får lämnas kvar där.

Permalänk
Avstängd

Jag tolkar det typ såhär:

//För att räkna if(!passagerarePåTåget + gårPå - gårAv > maxPass) { passagerarePåTåget = passagerarePåTåget + gårPå - gårAv; } //Ska du hantera de över max som kvarvarande och du har sådana: int overMax = passagerarePåTåget + gårPå - gårAv - maxPass; //Och du har en array med stationerna i ordning, stationsnummer i variabel station, //där värdet är en int som indikerar antalet som står kvar: stationer[station] = overMax; //kanske ska vara stationer[station+1] beroende på hur du börjar och så passagerarePåTåget = maxPass;

Permalänk
Medlem
Skrivet av Tillaeus:

Detta har jag testat, problemet är att den bara tar inmatningen från den senaste stationen och inte en total baserat på de tidigare stationernas antal passagerare.

Om du vill basera beslut på tidigare stationer så måste du spara den information någonstans, t.ex. en variabel som håller reda på hur många passagerare som finns på tåget vid varje givet tillfälle. Just nu sparar du ingen information alls från föregående stationer, så en station glöms bort så fort tåget lämnar stationen så att säga.

Permalänk
Medlem
Skrivet av snajk:

Jag tolkar det typ såhär:

//För att räkna if(!passagerarePåTåget + gårPå - gårAv > maxPass) { passagerarePåTåget = passagerarePåTåget + gårPå - gårAv; } //Ska du hantera de över max som kvarvarande och du har sådana: int overMax = passagerarePåTåget + gårPå - gårAv - maxPass; //Och du har en array med stationerna i ordning, stationsnummer i variabel station, //där värdet är en int som indikerar antalet som står kvar: stationer[station] = overMax; //kanske ska vara stationer[station+1] beroende på hur du börjar och så passagerarePåTåget = maxPass;

Spännande, ska kika!

Skrivet av perost:

Om du vill basera beslut på tidigare stationer så måste du spara den information någonstans, t.ex. en variabel som håller reda på hur många passagerare som finns på tåget vid varje givet tillfälle. Just nu sparar du ingen information alls från föregående stationer, så en station glöms bort så fort tåget lämnar stationen så att säga.

Nej, det har slagit mig också. Men då mina kunskaper är begränsade så fattar jag inte hur jag ska lösa det.