Permalänk

Hjälp med kod - Python

Hej.

Jag sitter med min sista uppgift i programmering 1-kursen där man ska simulera en buss som kan ta emot 25 stycken passagerare och även räkna ut ålder på alla samt total ålder. Jag har kommit så långt att min meny och alla metoder funkar och jag trodde såklart att jag var färdig. Tills jag insåg att jag inte har fixat så att det säger stopp när det faktiskt är fullt. Jag är helt nybörjare och har verkligen kämpat med hela kursen men det verkar aldrig som att polletten vill trilla ner.

Mitt problem nu är att jag inte kan få det att funka när programmet ska meddela när "bussen" är full. Det är alltså under min metod där jag ska lägga till passagerare det inte funkar för mig. Programmet talar om för mig att number_of_passengers inte är definierat medan det i min hjärna är det eftersom jag har det högst upp, alltså number_of_passengers = 0. Om någon kan ta sig tid och förklara för mig så skulle jag vara evigt tacksam för just nu är jag bara frustrerad på mig själv.

Ignorera kommentarerna på slutet, det är från kodskalet vi ska använda oss av.

import replit class Buss: passengers = [] number_of_passengers = 0 def run(self): while True: replit.clear() print("Välkommen till Buss-simulatorn") print("================================") print("1: Lägg till en ny passagerare") print("2: Visa ålder på samtliga passagerare") print("3: Beräkna totala åldern på alla passagerare") print("4: Avsluta programmet\n") x = int(input("Var god och välj ett nummer från menyn: ")) if x == 1: add_passenger(self.passengers) elif x == 2: print_bus(self.passengers) elif x == 3: calc_total_age(self.passengers) elif x == 4: replit.clear() print("Du har valt att avsluta programmet") input("Tryck Enter för att avsluta.") replit.clear() break else: replit.clear() print("Du gjorde inte ett giltigt val.\nGå tillbaka till menyn för att göra ett nytt val.") input("Tryck Enter för att gå tillbaka till menyn") print("Programmet har avslutats.") # Här ska menyn ligga för att göra saker # Vi rekommenderar switch och case här # Dessutom visar jag hur man anropar metoderna nedan via menyn # Börja nu med att köra koden för att se att det fungerar innan ni sätter igång med menyn. # Bygg sedan steg-för-steg och testkör koden. # Metoder för betyget E def add_passenger(passengers): while True: replit.clear() if len.number_of_passengers >=25: print("Bussen är tyvärr full.") input("Tryck Enter för att gå tillbaka till menyn.") break else: passenger_age = int(input("Hur gammal är passageraren du vill lägga till?: ")) print(passenger_age) passengers.append(passenger_age) # Lägg till passagerare. Här skriver man då in ålder men eventuell annan information. # Om bussen är full kan inte någon passagerare stiga på def print_bus(passengers): replit.clear() print("Samtliga passagerares ålder är:") print(*passengers, sep = ", ") input("Tryck Enter för att gå tillbaka till menyn") def calc_total_age(passengers): replit.clear() total_age = sum(passengers) print("Den totala åldern på alla passagerare är " + str(total_age) + " år") input("Tryck Enter för att gå tillbaka till menyn") class Program: def __init__(self, *args): # Skapar ett objekt av klassen Buss som heter minbuss # Denna del av koden kan upplevas väldigt förvirrande. # Men i sådana fall är det bara att "skriva av". minbuss = Buss() minbuss.run() input("Press Enter to continue . . . ") # Nedanstående kod är kryptisk. Om ni vill kan ni behålla de raderna. # Följande kod aktiveras när denna python fil körs if __name__ == "__main__": # skapa en instans (kopia) av klassen Program my_program = Program()

Permalänk
Medlem

tänk på indenteringen, dina add_passanger funktioenr ligger inte i klassen som variabeln number_of_passengers ligger i

Visa signatur

CPU: Ryzen 9 3900x Noctua NH-D14 MOBO: TUF Gaming X570-PLUS GPU: GTX 980 RAM: 32 GB 3200 MHz Chassi: R4 PSU: Corsair AX860 Hörlurar: SteelSeries 840 Mus: Logitech G502 Lightspeed V.v. nämn eller citera mig för att få svar.

Permalänk
Inaktiv

Du har skrivit

len.number_of_passengers

Klura ut vad du har gjort fel.

number_of_passengers är en klassvariabel, som är en int.
len() är en funktion som returnerar längden på variabler som är arrays.
du har en array som heter passengers, som är en klassvariabel den med.

Permalänk

Tack för svar. Jag testade lägga till den här koden under metoden nu vilket verkar fungera:

def add_passenger(passengers): replit.clear() if len(passengers) > 25: print("Bussen är tyvärr full.") input("Tryck Enter för att gå tillbaka till menyn.") passenger_age = int(input("Hur gammal är passageraren du vill lägga till?: ")) print(passenger_age) passengers.append(passenger_age)

Problemet nu (vilket i och för sig är mer ett problem för att jag vill att det ska se snyggt ut) är att när jag får meddelande om att bussen är full och jag ska trycka Enter för att återgå till menyn så hamnar jag istället på "Hur gammal är passageraren du vill lägga till" och först när jag skriver i ett nummer där hamnar jag ute i menyn igen.

Permalänk
Skrivet av Haptic:

tänk på indenteringen, dina add_passanger funktioenr ligger inte i klassen som variabeln number_of_passengers ligger i

Ligger inte båda i class Buss?

Permalänk
Medlem
Skrivet av Chirre_86:

Problemet nu (vilket i och för sig är mer ett problem för att jag vill att det ska se snyggt ut) är att när jag får meddelande om att bussen är full och jag ska trycka Enter för att återgå till menyn så hamnar jag istället på "Hur gammal är passageraren du vill lägga till" och först när jag skriver i ett nummer där hamnar jag ute i menyn igen.

Det är nog ett lite större problem än så, du kommer att lägga till en passagerare även om bussen är full. Använd if-else, alternativt return. Förut hade du en break som hoppade ut ur en while, det fungerar också, om du gör det rätt.

Permalänk
Skrivet av KAD:

Det är nog ett lite större problem än så, du kommer att lägga till en passagerare även om bussen är full. Använd if-else, alternativt return. Förut hade du en break som hoppade ut ur en while, det fungerar också, om du gör det rätt.

Men åh, jag blir så jäkla matt, jag som trodde jag kunde skicka in det nu. Tack för svar iallafall, ska läsa lite om det och se om jag kommer på hur jag ska göra.

Permalänk
Skrivet av KAD:

Det är nog ett lite större problem än så, du kommer att lägga till en passagerare även om bussen är full. Använd if-else, alternativt return. Förut hade du en break som hoppade ut ur en while, det fungerar också, om du gör det rätt.

Tror att jag löste det nu:

def add_passenger(passengers): replit.clear() try: passenger_age = int(input("Hur gammal är passageraren du vill lägga till?: ")) if len(passengers) <= 25: print(passenger_age) passengers.append(passenger_age) else: print("Bussen är tyvärr full.") input("Tryck Enter för att gå tillbaka till menyn.") except: replit.clear() print("Ingen giltig ålder, ange ålder i heltal.") input("Tryck Enter för att testa igen.")

Permalänk
Medlem

Du kan fortfarande få in en 26:e passagerare på bussen.
Tiita på följande del av din kod (mina kommentarer)

if len(passengers) <= 25: // Om antalet är 25 eller färre ... passengers.append(passenger_age) // Lägg till en

Hint: Motsatsen till x >= 25 är x < 25, inte x <= 25

För övrigt så är det snyggare att kolla om bussen är full innan man ber om ålder. (Tänk dig att du skall beställa en biobiljett online. När du valt föreställning, så får du fylla i dina personuppgifter, kortuppgifter etc., och först efter det så meddelas att föreställningen är slutsåld. Självklart skall det meddelas redan när du väljer föreställning.)

Alltså:
Om menyvalet = "lägg till en passagerare"
Kolla om antalet passagerare på bussen är lägre än antalet platser på bussen
Om det är det, fråga om ålder + lägg till passageraren i listan
Annars, meddela att det är fullt och återvänd till menyn

Nu gör du följande:
Om menyvalet = "lägg till en passagerare"
Fråga om ålder
Kolla om antalet passagerare på bussen är lägre än antalet platser på bussen
Om det är det, lägg till passageraren i listan
Annars, meddela att det är fullt och återvänd till menyn

Permalänk
Skrivet av PeCe:

Du kan fortfarande få in en 26:e passagerare på bussen.
Tiita på följande del av din kod (mina kommentarer)

if len(passengers) <= 25: // Om antalet är 25 eller färre ... passengers.append(passenger_age) // Lägg till en

Hint: Motsatsen till x >= 25 är x < 25, inte x <= 25

För övrigt så är det snyggare att kolla om bussen är full innan man ber om ålder. (Tänk dig att du skall beställa en biobiljett online. När du valt föreställning, så får du fylla i dina personuppgifter, kortuppgifter etc., och först efter det så meddelas att föreställningen är slutsåld. Självklart skall det meddelas redan när du väljer föreställning.)

Alltså:
Om menyvalet = "lägg till en passagerare"
Kolla om antalet passagerare på bussen är lägre än antalet platser på bussen
Om det är det, fråga om ålder + lägg till passageraren i listan
Annars, meddela att det är fullt och återvänd till menyn

Nu gör du följande:
Om menyvalet = "lägg till en passagerare"
Fråga om ålder
Kolla om antalet passagerare på bussen är lägre än antalet platser på bussen
Om det är det, lägg till passageraren i listan
Annars, meddela att det är fullt och återvänd till menyn

Tack PeCe, uppskattar att du är inne och petar. Vad tror du om det här. Det verkar fungera, men som det visat sig några gånger innan så missar jag ju massa saker.

def add_passenger(passengers): replit.clear() try: if len(passengers) > 25: print("Bussen är tyvärr full") input("Tryck Enter för att gå tillbaka till menyn.") else: passenger_age = int(input("Det finns lediga platser på bussen, hur gammal är passageraren du vill lägga till?: ")) if len(passengers) <= 25: print(passenger_age) passengers.append(passenger_age) except: replit.clear() print("Ingen giltig ålder, ange ålder i heltal.") input("Tryck Enter för att testa igen.")

Permalänk
Medlem

Du behöver inte både if len(passengers) > 25 och if len(passengers) <= 25 eftersom de är varandras motsatser (är den ena sann är den andra falsk).

Try bör användas så "lokalt" som möjligt. Det som kan gå fel är när du försöker göra ett heltal av inmatningen, d.v.s. int(input()). Det är alltså den raden du skall köra try på.
Except behandlar sedan vad som skall göras om det går fel.
Else behandlar det som skall göras om det inte går fel.
Finally behandlar det som skall göras oavsett om det gått rätt eller fel.

Du bör alltså kolla om det finns plats på bussen först. Om det finns det, då och endast då, skall du ha ett try-(except-else-finally-)block. D.v.s. try-blocket bör hamna inuti if/else-satsen, i den gren där du kollar om inmatningen kan konverteras till en int.

Vad jag menar är ngt i stil med

if len(passengers) < 25: try ... except ... else print ("Bussen är full")

-------------------

För att säkerställa att en inmatning består av ett heltal så brukar jag använda kod liknande denna:

while True: try: my_int = int(input("Ange ett heltal: ")) except: print("Det är inte ett heltal.") else: print("Det är ett heltal.") break

while-loopen gör att ett heltal efterfrågas om och om igen ända tills ett heltal faktiskt erhålls.