Permalänk
Medlem
Skrivet av mc68000:

Utskriften för full buss borde fungera nu (för mig om jag ändrar 25 till 2). Men för "Välkommen" så behöver du tänka till lite extra. Vad händer om du gör fyra pil ned och avslutar programmet direkt. Får du inte Välkommen då? Det indikerar att "bus.run" (som skriver ut) är felplacerad. Det innebär i sin tur att "bus = Bus()" är felplacerad. Du bör flytta upp dessa två rader till ovanför "while".

Vad är kravet för inlämningsuppgiften? Att uppvisa ett fungerande scenario, eller måste det vara strikt objektorientering?
Objekt: Då skall du använda ett deriverat objekt bus/self överallt, samt kod publicerad 19:58 där klassen tillhandahåller funktionerna.
Procedur: Nu använder du "Bus" statiskt överallt enligt kod publicerad 02:45 där funktionerna är utanför klassdefinitionen.
I princip använder du bara det deriverade objektet "bus" för att skriva ut "Välkommen". Dina passagerarer lagras statiskt i klassen "Bus".
Hoppas det sista inte ställer till det för dig om det börjar bli dags för inlämning redan i veckan?

Detta är kraven för E i slutprojektet:

I objektet minbuss ska det finns en vektor som håller reda på 25 stycken passagerare. Varje element i
vektorn är en ålder.
Observera att det ska vara just en vektor och inte en lista.
I sodacrate ska det finnas en switch-case meny där alternativen kopplas till olika metoder. Dessa
metoder är:
1. Lägga till en passagerare
2. Skriv ut bussen, eller rättare sagt – skriv ut alla åldrar på passagerare.
3. Beräkna den totala åldern av alla passagerare.
4. Avsluta programmet
Under metoden Run() ska alltså kod skrivas som
skriver ut text som välkomnar användaren och
därefter får en lista över vilka saker man kan göra.
Detta val bör ju läggas i en loop så inte programmet
stänger ner efter att man valt något.
Man kan själv välja hur stor vektorn ska vara.
Man ska inte kunna stoppa in fler passagerare än vad
som får plats.
Är bussen full ska man få meddelande om detta och passageraren kan inte stiga på.

jag uppfattar det som att det viktiga är att få koden att köra, hur uppfattar du det? Uppgiften är rätt otydlig då dem skriver olika i dem olika dokumenten, i ett dokument har dem skrivit 25 element och här att man kan välja själv.

Detta är krav som står i ett annat dokument:

Funktionella krav
✓ Programmet ska kunna lagra passagerare i en vektor och där dessa passagerare lagras som
heltal (ålder)
✓ Passagerare ska struktureras som en klass med värden och metoder.
✓ Passagerare har en metod som körs när programmet exekveras och där denna metod styr en
meny.
✓ Via menyn ska användaren kunna lägga till en passagerare
✓ Via menyn ska användaren kunna skriva ut alla värden i vektorn
✓ Via menyn ska användaren kunna avsluta programmet
Icke-funktionella krav
✓ Koden är konsekvent och kommenterad på ett enkelt sätt
✓ Programmet ska gå att exekvera och koden är robust
✓ Programmet ska upplevas rimligt att interagera med
✓ Programmet ska inte ha överdrivet enkelt för att krascha

ber om ursäkt för långt inlägg, men hur uppfattar du det ?

jag får inte "välkommen" någonstans och heller inte "bussen är full"
Inlämning imorgon natt.. fastande så länge på add_passenger att jag knappt har tid att ändra något annat känns det som.
men tänker att om jag anropar "bus" som jag nu lagt innan "while" borde ju välkommen komma fram, men det gör den inte..

Permalänk
Medlem

tillagd text

borde jag indentera alla def så dem tillhör klassen kanske ?

Traceback (most recent call last):
File "main.py", line 11, in <module>
Bus.run()
TypeError: Bus.run() missing 1 required positional argument: 'self'

vad betyder denna fel koden? att använda "self" har bara ställt till det för mig

lägger jag till "self" i anropet så skriver den ut felet såhär:
Traceback (most recent call last):
File "main.py", line 11, in <module>
Bus.self.run()
AttributeError: type object 'Bus' has no attribute 'self'

Permalänk
Medlem
Skrivet av Python14:

borde jag indentera alla def så dem tillhör klassen kanske ?

Traceback (most recent call last):
File "main.py", line 11, in <module>
Bus.run()
TypeError: Bus.run() missing 1 required positional argument: 'self'

vad betyder denna fel koden? att använda "self" har bara ställt till det för mig

lägger jag till "self" i anropet så skriver den ut felet såhär:
Traceback (most recent call last):
File "main.py", line 11, in <module>
Bus.self.run()
AttributeError: type object 'Bus' has no attribute 'self'

Det ser ut som att du försöker anropa en instansmetod direkt på klassen Bus. Skapa en instans av klassen och anropa metoden på den istället. Du har gjort det i tidigare exempel.

Permalänk
Medlem

jag får inte rätt på dessa två print satser trots all er hjälp. min hjärna är inte på plats (nybliven mamma sen två månader)
inlämning imorgon och jag har en kod som inte är klar, kommer tyvärr inte bli godkänd om inte dessa två rader blir rätt.
vill tacka er för all er hjälp, ni har gett mig lite mer kött på benen iaf men tyvärr va jag inte tillräcklig för att lösa det.
Tack igen allihopa för ert engagemang

Permalänk
Medlem

1. Hm, objekt minbus: som vi kallar "bus". Vi skall altså använda ett objekt snarare än att lagra statiskt i klassen som nu. Lite jobbigt.
2. OK, en vector använder vi, så det är klart.
3. Hm, vi skall använda en switch-case snare än if-elif.
4. Hm, "Välkommen" skall altså skrivas varje gång menyn presenteras. Då bör du lägga in menypresentationen i "Run". Gör det som en loop (0-3) och skriv ut "<---" när menuselected == loopvärdet. (Du har ju menuOptions färdig för detta redan.) Eftersom bus.run() skall exekveras flera gånger så skall denna rad finnas efter while. Skapandet av objektet "bus = Bus()" skall vara före while-satsen.

1. Förklarar jag sist.
2. Är redan fixat. men vi måste senare (se 1) ändra från Bus.add_passenger() till bus.add_passenger(). I denna punkt får du också ta ställning till om du skall fråga efter åldern före du kallar add_passenger (och då skicka med åldern som ett argument) eller om du skall fråga efter åldern inne i add_passenger. Jag skulle välja det första.
3. Börja lite smått och byt ut alla if-elif i "if menuSelected ==" och ersätt det med switch/case (eller match/case som det heteer i python) enligt uppgiftskraven. Denna transformation bör vara relativt enkel då google visar bra exempel. (Spar en kopia av vad du har utifall...)

# Se även Lutop inlägg 01:46, men kopiera inte. # Skriv själv så att dina tankar är med din skapandeprocess hela tiden. match argument: case 0: return "zero" case 1: return "one" case 2: return "two" case default: return "something"

4. Utöka Bus.run() så att den även skriver ut menyn. Då slipper du repetera menyutskriften lika många gånger som du har alternativ.

for x in range(4): # 0...3 separator = " " # Tre mellanslag if x == 2: separator = " * " # https://blog.enterprisedna.co/python-print-without-newline-ea... print(x, menuOptions[x], sep=separator) # x i print kanske förvirrar, någon kanske tror att man kan skriva in en siffra. # Byt ut mot "" i så fall så får du en stjärna framför valt alternativ.

1. Nu blir det jobbigt, se till att 2-4 fungerar bra först. Om du har problem med utskrifter, lägg in en print("hej") på rad ett samt en a=input("hopp") så att inte skärmen (hej) rensas. Ser du dessa utskrifter, om inte så kanske du rensar skärmen för aggressivt, för du ser väl meny-utskrifterna, väl?
Du ska i princip föra över logiken i 02:45 (eller ditt just nu fungerande program) till koden som används i 19:58.
Just nu använder du Bus.add_passenger() där du lagrar en ny passagerare statiskt i klassen. Du bör som du nämner skifta in procedurerna i klassdefinitinen. Men när du gör det så måste du förstå "self".

MaxPass = 25 # Kör 2 medans du testar! # Bus.add_passenger() # En ny passagerare lagras statiskt i klassen. # Du kan bara ha en bus i rörelse om du gör på detta vis. def add_passenger(): if len(Bus.passenger) == MaxPass: print("Bussen är full") else: age = input("Skriv in din ålder: ") Bus.passenger.append(int(age)) # Metoderna indenterad in i klass-definitionen # bus4 = Bus() # Skapar en unik buss, du kan ha flera bussar i farten. # age = input("Skriv in din ålder: ") # bus4.add_passenger(age) def add_passenger(self, age): if len(self.passenger) == MaxPass: print("Bussen är full") else: self.passenger.append(int(age))

Förklaring: "age" först, är något som passageraren har, så håll metoden enkel, ge den åldern redan när vi vill addera passgeraren. Sen är det ju även en definitionsfråga om du skall göra int() i metoden, eller när du kallar metoden. Det senare är väl egentligen renare.
Å så "this", som är en "dold" parameter. Den hänvisar tillbaka till vem som kallar metoden. bus.add_passenger(5); this är altså referensen till "bus"! Eftersom bus är en unik buss, så får vi inte hårdkoda någonting utan vi använder "this" till att peka på vem som anropar metoden.
Detta är otroligt viktigt att förstå, så gnugga in förståelsen hur och när du skall använda "this" och vad som händer om du inte gör det.(svårt)

Jobba lite med detta och presentara det du får fram i code-taggar. Jag kör detta i linux så jag fick skriva egen clear och pil-upp/ner kod. Vad jag förstår efter att ha läst om replit så kör du i någon slags web-miljö? Well, ödsla inte tid på mina funderingar nu. Go for it!

Permalänk
Medlem

Wow asså tack vare din kommentar nu mc68000 har jag fått en fungerande kod.. jag väntar på rättning
Vill bara säga tack x1000000 till dig, fallerar jag i kursen nu är det iaf inte på koden, jo kanske att jag glömde skriva kommentarer i den men va så oerhört lättad att jag testkörde ett par gånger sen bara snabbt skicka jag den haha
Jag vågade mig dock inte på allt du skrev att ändra och testa så hoppas att denna tråden inte försvinner eftersom jag väldigt gärna fortsätter på koden efter kursen för att få ännu mer kött på benen till framtiden,
Tusen tack igen!!

Permalänk
Medlem

Tja, alltså.. Du och flera andra har ju fört denna tråd framåt. Jag har själv aldrig skrivit en rad python, vilket märktes i mitt första inlägg i tråden. Efter detta har jag hackat i två färdiga python-program. Men språket är lite sekundärt, tänket hur ett program skall utformas kommer med erfarenhet. För mig är programmering lite som att måla (vilket jag inte kan alls). Viktigt är också att läsa om vilka stödfunktioner som finns (t.ex. systemanrop och bibliotek) som kan vara av värde för den uppgift som skall lösas. Jag brukade plöja systemmanualen en gång per år för att leta efter sådant som jag inte ännu använt och hacka några testprogram under en vecka. Då blir tröskeln inte så hög den dag en funktion skall användas skarpt, samt att du får ett hum på vad som är rimligt och möjligt. Nivån sätter du själv.

Jodå, din tacksamhet kommer att ligga kvar så länge redaktionen sköter backup-rutinerna
Lycka till framöver. Deadlines är ofta förekommande i programmeringsvärlden, du känner dig bäst själv hur du hanterar dem.