
Programmering av ett trafiksystem: Förbättring av koden

Uppgradera för mer innehåll
Sant eller falskt? När programmen startas har bussen prioritet.
Vanliga trafikljus slår om mellan rött, gult och grönt med jämna mellanrum, oavsett om det kommer ett fordon eller inte. Men det här är ett smart trafikljus! Det kan nämligen reagera på en signal från en buss som vill få grönt ljus. Men trafikljuset behöver lite förbättringar. Det är rött ända till att bussen begär grönt ljus och det använder aldrig sitt gula ljus.
Nu ska vi fixa till dessa förbättringar. Vi börjar med den pseudokod som vi skrev i en annan film. Om knapp A trycks ner sänder bussen en signal i radiogrupp “ett”. Meddelandet är “ett” och betyder “Jag vill ha grönt”. Nu, trafikljusets pseudokod.
I det programmet startade vi med att ställa in radiogrupp till “ett”. Variabeln “prio” håller koll på om bussen har prioritet eller inte. Till att börja med har bussen inte det, så “prio” är “falskt”. Om meddelandet “ett” tas emot blir “prio” “sant” och bussen får grönt ljus. Nu tittar vi på koden som sköter färgväxlingarna för trafikljuset.
Loopen körs hela tiden så länge villkoret är sant. Om “prio” är “falskt” tänds rött ljus. Annars släcks rött och grönt börjar lysa. Efter tre sekunder släcks grönt, “prio” blir “falskt”, vi går tillbaka till början av loopen igen och rött ljus lyser. Förbättringen vi vill göra nu, är att tala om när det ska bli gult ljus.
Mellan rött och grönt vill vi att det ska bli gult. Och samma sak mellan grönt och rött. Vi lägger till: Släck rött och tänd gult och släck grönt och tänd gult. Vi testar koden. Oj, det är för snabbt.
Vi behöver tala om hur länge det ska lysa rött innan det blir gult, och hur länge det ska lysa gult, innan det blir grönt. Lägg till: Paus tre sekunder efter att vi tänt rött, här och paus en sekund efter varje gång vi tänt gult, på båda dessa två ställen… Och här skriver vi: Släck gult, tänd grönt. Och lägg också till: Släck gult innan “prio = falskt”. Nu har vi gjort en förbättring: det gula ljuset lyser när vi vill. Men det är fortfarande så att trafikljuset bara blir grönt när busschauffören trycker på knappen.
Det beror på att vi lagt den kod som kontrollerar grönt ljus, i en annars-sats, vilket betyder att det bara händer när något inte är sant. Det är bättre att tala om att det alltid ska hända. Så vi tar bort annars-raden, och då lyser gult och grönt alltid när vi vill att de ska göra det: varje gång loopen körs. Vi testar vår andra förbättring. Här kommer bussen.
Busschauffören trycker på knappen. “Prio” blir direkt “sant”. Men inget ändras. Varför inte? Det lyser rött och sen gult ändå! Vad hände?
Oj, vi var här i pseudokoden, när knappen trycktes ned och det testade inte om “prio” var “sant” förrän loopen startade om igen. Så bussen fick vänta som vanligt vid rött ljus. Pauserna i koden ställde till oväntade problem. Vi behöver få koden att testa om “prio” är “sant” oftare. När vi har programmerat “paus”, står koden stilla: den lyssnar inte.
Den kollar bara om “prio” är “sant” just precis i om-raden. För att få trafikljuset att lyssna oftare, behöver vi fler om-satser. Låt oss minska fördröjningen till en sekund genom att splitta upp pauserna så här: Nu kan koden hoppa till grönt från flera olika ställen i koden. Men vi vill vara säkra att bara ett ljus lyser i taget. Om “prio” är “sant” här, och vi hoppar över den här raden, så släcks inte rött.
Vi vill att bara grönt ska lysa för bussen, så vi måste tala om för koden att släcka rött och gult här… Vi testar igen. Här kommer bussen som är försenad, knapp A trycks ned och trafikljuset slår snabbt om till grönt. Nu har trafikljuset blivit ännu smartare! Kanske du kan komma på ännu fler förbättringar!