Läsa av pseudokod (loopar mm C#

Permalänk

Läsa av pseudokod (loopar mm C#

Hej!

Vi har fastnat i några pseudokoder vi har i våran prgrammeringsinlämning och undrar om någon kan tänka sig att hjälpa oss med hur kodningen i C# kommer att se ut utefter dessa pseudokoder.

De ser ut såhär:
Klass: Bokning
Metod: RättLåskod

Input parametrar: låskod: string
Returtyp: bool
Pseudokod
Om Period < > Nu ELLER betalt <
> sant
Returnera falskt
SLUT-OM
ANROPA RättLåskod (låskod) i
bokningens Gäst
OM RättLåskod = sant
Returnera sant
SLUT-OM
Returnera falskt

Klass Gäststuga
Metod Boka
Input parametrar
gäst: Gäst
önskatAntal: int
period: Period
rökare: boolean
Returtyp Bokning
Pseudokod
OM önskatAntal < > antalBäddar
RETURNERA null
SLUT-OM
OM rökare < > stugans rökare
RETURNERA null
SLUT-OM
SNURRA för varje Bokning
ANROPA bokning.Period
OM Period = period
RETURNERA null
SLUT-OM
SLUT-SNURRA
(Eftersom ingen bokning
påträffades)
SKAPA ny Bokning
RETURNERA Bokning

Klass Stugby
Metod FinnsLedigStuga
Input parametrar
gäst : Gäst
önskatAntal : int
period : Period
rökare : boolean
Returtyp Bokning
Pseudokod
SNURRA för varje Gäststuga
ANROPA gäststuga.Boka
OM Boka returnerade en
Bokning
RETURNERA Bokning
OM-SLUT
SLUT-SNURRA

Tack på förhand!
Mvh Emilia

Permalänk
Avstängd

Vilka pseudokodsrader är det som ni fastnat på? Skulle rekommendera att ni gör så långt ni kan och sedan presenterar resultatet här så kanske ni kan få lite hjälp i rätt riktning.

Permalänk
Medlem

Har ni börjat någonstans? Vad händer om lite mer avancerad pseudokod tas upp i nästa uppgift och någon annan har gjort denna uppgift åt er?

<> Inte sant = Sant

Denna form av detaljerad pseudokod är ju mer för att se till så man inte har glömt något. Själva funktionaliteten borde redan vara diskuterad och förstådd ur ett verksamhetsperspektiv.

Visa signatur

ηλί, ηλί, λαμά σαβαχθανί!?

Permalänk
99:e percentilen

Oj …

Måste bara säga att jag tyckte den pseudokoden var rätt knepig att få rätsida på, och då har jag skrivit allt från Achtung, die Kurve! och Userscripter till typecheckers och kompilatorer. Har säkert att göra med alla krystade svenska ord och den allmänt svårläsliga formateringen/syntaxen. (Vem skriver < > för "skilt från", till exempel?)

Det råd jag kan ge är att gå igenom koden ord för ord i flera omgångar, och i varje omgång översätta de mest uppenbara uttrycken till motsvarande kod, till exempel så:

Första omgången:

Om Period < > Nu ELLER betalt < > sant Returnera falskt SLUT-OM

if (Period < > Nu ELLER betalt < > sant) Returnera falskt }

Andra omgången:

if (Period < > Nu ELLER betalt < > sant) Returnera falskt }

if (Period < > Nu || betalt < > sant) return false; }

Tredje omgången:

if (Period < > Nu || betalt < > sant) return false; }

if (Period < > Nu || betalt != true) return false; }

Och så vidare.

Som en sidokommentar, eftersom det dök upp: Skriv aldrig kod i stil med x == true eller x != true. Använd istället de ekvivalenta uttrycken x respektive !x. Annars kan du lika gärna skriva x == true == true == true == true; det är också ekvivalent med x, men det är inte bra kod.

Visa signatur

Skrivet med hjälp av Better SweClockers

Permalänk
Medlem
Skrivet av Alling:

...
Som en sidokommentar, eftersom det dök upp: Skriv aldrig kod i stil med x == true eller x != true. Använd istället de ekvivalenta uttrycken x respektive !x. Annars kan du lika gärna skriva x == true == true == true == true; det är också ekvivalent med x, men det är inte bra kod.

Skulle du kunna utveckla varför det inte är bra kod att köra med x == true istället för x? Har alltid haft vanan att skriva ut hela ( x == true/false/flag), främst för läsbarhetens skull

Permalänk
99:e percentilen
Skrivet av Alotiat:

Skulle du kunna utveckla varför det inte är bra kod att köra med x == true istället för x? Har alltid haft vanan att skriva ut hela ( x == true/false/flag), främst för läsbarhetens skull

Ska tillägga att min rekommendation bara (eller åtminstone främst) gäller i statiskt typade språk. Det kan exempelvis vara befogat att skriva x === true (men knappast x == true) i JavaScript.

Om man i ett statiskt typat språk skriver x == true är ju x redan ett booleskt uttryck. Det är ju även x == true, varför man då lika gärna kan skriva (x == true) == true. Och då kan man lika gärna skriva … ja, du ser var man hamnar. En programmerare bör förstå booleska uttryck såpass bra att == true enbart uppfattas som överflödigt brus, och i annat fall lära sig det.

Om du tycker att din kod blir mer läsbar med redundanta == true kanske den egentliga lösningen ligger i bättre namngivning – exempelvis if (userExists) är definitivt läsbart.

Visa signatur

Skrivet med hjälp av Better SweClockers

Permalänk
Avstängd

Apropå "x == true" så bör man, om man nu vill skriva ut det hela, skriva "true == x" istället. Om man skulle missa och i stället skriva "true = x" så får man fel vid kompilering men det motsatta ("x = true") ger inte något felmeddelande... lätt att missa sådant!

[EDIT]: Och det är väl värt att tänka på när det är uttryck som man inte kan skriva på annat sätt, vilket man ju kan med "x == true", som exempelvis "x == 9", kör på "9 == x" så riskerar man inte att göra bort sig

Permalänk
Medlem
Skrivet av Alling:

Oj …

Måste bara säga att jag tyckte den pseudokoden var rätt knepig att få rätsida på, och då har jag skrivit allt från Achtung, die Kurve!

har du skapat achtung die kurve (eller Zatacka som vi kallade det)? lirade det som fan med polarna i grundskolan för typ 13 år sedan

Visa signatur

"Resistance is futile."

- Georg Ohm

Permalänk
99:e percentilen
Skrivet av Selmalagerlöf:

har du skapat achtung die kurve (eller Zatacka som vi kallade det)? lirade det som fan med polarna i grundskolan för typ 13 år sedan

Nej, jag har inte skapat själva spelet. Jag har bara portat det till webbläsaren. Mig veterligen är jag dock ensam om att ha gjort detta med det klassiska originalspelet, det vill säga inte någon tramsig pleb-remake.

Nu är vi dock OT.

Visa signatur

Skrivet med hjälp av Better SweClockers

Permalänk

@videopac:
SNURRA för varje Bokning
ANROPA bokning.Period
OM Period = period
RETURNERA null
SLUT-OM
SLUT-SNURRA
(Eftersom ingen bokning
påträffades)
SKAPA ny Bokning
RETURNERA Bokning

Denna koden har vi fastnat på.. Vi förstår inte vilke slags loop vi ska använda samt hur man ska anropa..
Kan du hjälpa oss med detta?

Permalänk
Avstängd

Lägg upp den kod som ni hittills skrivit så tror jag nog att ni kommer att få hjälp av någon här. Själv är jag ingen fena på C#, har aldrig använt det, utan jobbar med C och C++ för det mesta.

Så, lägg upp kod kombinerat med pseudokoden (som kommentarer) så tror jag nog att någon vänlig själ kommer att ge lite ledtrådar.

Permalänk
Legendarisk

@Emilia_Johanness: Om ni inte redan gör det så vill jag tipsa om att lägga till indrag i pseudokoden som delats ut så att det blir lättare att följa hur den är strukturerad. Sedan finns det i C# (och många andra språk) en looptyp som kallas foreach ("för varje"), den vore rimlig att använda eftersom att ni vill göra något med varje bokning: Wiki, MSDN.

SNURRA för varje Bokning ANROPA bokning.Period OM Period = period RETURNERA null SLUT-OM SLUT-SNURRA (Eftersom ingen bokning påträffades) SKAPA ny Bokning RETURNERA Bokning

Visa signatur

Abstractions all the way down.

Permalänk
Medlem

Håller med @Alling här, herregud vad krystat med svenska, bland den värsta pseudokod jag läst.

Känns som att "läraren" gillar att "koda" i Excel(snurror)

Permalänk
Medlem
Skrivet av Alling:

Ska tillägga att min rekommendation bara (eller åtminstone främst) gäller i statiskt typade språk. Det kan exempelvis vara befogat att skriva x === true (men knappast x == true) i JavaScript.

Om man i ett statiskt typat språk skriver x == true är ju x redan ett booleskt uttryck. Det är ju även x == true, varför man då lika gärna kan skriva (x == true) == true. Och då kan man lika gärna skriva … ja, du ser var man hamnar. En programmerare bör förstå booleska uttryck såpass bra att == true enbart uppfattas som överflödigt brus, och i annat fall lära sig det.

Om du tycker att din kod blir mer läsbar med redundanta == true kanske den egentliga lösningen ligger i bättre namngivning – exempelvis if (userExists) är definitivt läsbart.

Ser inga större problem med att man låter studenter skriva ut hela uttrycket så att de enkare förstår vad if(userExists == true) betyder. Som student kan det lätt bli förvirrande, speciellt om man inte namnger saker och ting övertydligt (som i detta fallet, "om användaren existerar"). I ditt exempel har du x, att då använda x==true är mycket, mycket mer pedagogiskt än att skriva if x.

@Emilia_Johanness
Det tjänar inte mycket till att slänga upp en läxa/uppgift här i en tråd och förvänta er att få den gjord. Försök istället att göra så mycket ni kan själva och be om hjälp på de specifika punkter ni inte förstår.

Visa signatur

| Corsair Crystal 460X | Z390-F | 9700K | ROG Ryujn 360mm | RTX 3080Ti | ROG Thor 850W | Vengeance Pro 3200mhz 16cl 16GB (2x8) | 970 Pro 2TB + 2xWD Black 4TB | ROG SWIFT PG279Q | Arctis 7 Pro Wireless | ROG Scope Deluxe red silent | ROG Chakram |

Permalänk
Hedersmedlem
Skrivet av Mithras:

Ser inga större problem med att man låter studenter skriva ut hela uttrycket så att de enkare förstår vad if(userExists == true) betyder. Som student kan det lätt bli förvirrande, speciellt om man inte namnger saker och ting övertydligt (som i detta fallet, "om användaren existerar"). I ditt exempel har du x, att då använda x==true är mycket, mycket mer pedagogiskt än att skriva if x.

Behöver du skriva x == true är din kod dålig. Variabelnamnet är dåligt. Kan du visa ett fall där en boolesk variabel har ett bra namn men inte blir tydlig med if (BraVariabelnamn)? Kolla, till och med mitt slumpade exempel blev väldigt tydligt.

Om man inte lär ut studenter att sätta bra variabelnamn lär man ut dåligt.

Permalänk
Medlem
Skrivet av Shimonu:

Behöver du skriva x == true är din kod dålig. Variabelnamnet är dåligt. Kan du visa ett fall där en boolesk variabel har ett bra namn men inte blir tydlig med if (BraVariabelnamn)? Kolla, till och med mitt slumpade exempel blev väldigt tydligt.

Om man inte lär ut studenter att sätta bra variabelnamn lär man ut dåligt.

Du behöver inte skriva det, det har jag aldrig påstått.

Nu tog jag variabelnamnet x från tidigare exempel. Som jag skrev innan också (som du strundade i), så även om du har ett bra variabelnamn som userExists, så blir det mycket mer pedagogiskt att skriva == true för att de ska få en grundläggande förståelse för vad som händer.

Det kvittar hur bra variabelnamn du har, du kan ha världens bästa variabelnamn. Det är fortfarande mer pedagogiskt att skriva ut ==true så att en elev/nybörjare ska enklare få en förståelse för vad som faktiskt händer och vad det faktiskt betyder. När sedan eleven/nybörjaren har förstått vad if(x) faktiskt betyder, då kan man gå in på varför det är redundant och börja optimera koden. Det är mycket värre att lära ut if(x) utan någon förståelse för vad det betyder, än att lära ut if(x==true) och sedan arbeta sig mot att förstå hur och varför if(x) fungerar.

Visa signatur

| Corsair Crystal 460X | Z390-F | 9700K | ROG Ryujn 360mm | RTX 3080Ti | ROG Thor 850W | Vengeance Pro 3200mhz 16cl 16GB (2x8) | 970 Pro 2TB + 2xWD Black 4TB | ROG SWIFT PG279Q | Arctis 7 Pro Wireless | ROG Scope Deluxe red silent | ROG Chakram |

Permalänk
Hedersmedlem
Skrivet av Mithras:

Du behöver inte skriva det, det har jag aldrig påstått.

Nu tog jag variabelnamnet x från tidigare exempel. Som jag skrev innan också (som du strundade i), så även om du har ett bra variabelnamn som userExists, så blir det mycket mer pedagogiskt att skriva == true för att de ska få en grundläggande förståelse för vad som händer.

Det kvittar hur bra variabelnamn du har, du kan ha världens bästa variabelnamn. Det är fortfarande mer pedagogiskt att skriva ut ==true så att en elev/nybörjare ska enklare få en förståelse för vad som faktiskt händer och vad det faktiskt betyder. När sedan eleven/nybörjaren har förstått vad if(x) faktiskt betyder, då kan man gå in på varför det är redundant och börja optimera koden. Det är mycket värre att lära ut if(x) utan någon förståelse för vad det betyder, än att lära ut if(x==true) och sedan arbeta sig mot att förstå hur och varför if(x) fungerar.

Jag tror det beror lite på hur det läggs upp. Jag ser inget syfte att if (x == true) bör uppmuntras i inlämningsuppgifter, har man förstått att if (x) är detsamma så är det en mer korrekt lösning i mina ögon. Så länge man inte ser att heltal eller liknande används på samma sätt. if (my_int) till exempel som även kan kompilera men inte nödvändigtvis är vad man söker för funktion. Jag menar annars bör även if ((a < b) == true) också vara pedagogiskt men tror ingen har lärt ut så.

Permalänk
99:e percentilen
Skrivet av Mithras:

Ser inga större problem med att man låter studenter skriva ut hela uttrycket så att de enkare förstår vad if(userExists == true) betyder. Som student kan det lätt bli förvirrande, speciellt om man inte namnger saker och ting övertydligt (som i detta fallet, "om användaren existerar"). I ditt exempel har du x, att då använda x==true är mycket, mycket mer pedagogiskt än att skriva if x.

x i mina exempel är ju bara en placeholder för godtyckligt uttryck; jag menar självklart inte att man ska döpa saker till x hur som helst.

Skrivet av Mithras:

Det kvittar hur bra variabelnamn du har, du kan ha världens bästa variabelnamn.

Det kvittar inte alls. Det är lättare att läsa if (userExists) eller if (isCorrect(answer)) än motsvarande med == true.

Citat:

Det är fortfarande mer pedagogiskt att skriva ut ==true så att en elev/nybörjare ska enklare få en förståelse för vad som faktiskt händer och vad det faktiskt betyder. När sedan eleven/nybörjaren har förstått vad if(x) faktiskt betyder, då kan man gå in på varför det är redundant och börja optimera koden. Det är mycket värre att lära ut if(x) utan någon förståelse för vad det betyder, än att lära ut if(x==true) och sedan arbeta sig mot att förstå hur och varför if(x) fungerar.

Jag håller inte med om att det är mer pedagogiskt. Du har helt rätt i att det är dåligt att lära ut if (x) utan någon förståelse för vad det betyder, men lösningen tycker jag är att ge den förståelsen (uttryck, typer och evaluering) redan från början.

Visa signatur

Skrivet med hjälp av Better SweClockers

Permalänk
Medlem
Skrivet av Alling:

x i mina exempel är ju bara en placeholder för godtyckligt uttryck; jag menar självklart inte att man ska döpa saker till x hur som helst.

Det kvittar inte alls. Det är lättare att läsa if (userExists) eller if (isCorrect(answer)) än motsvarande med == true.

Jag håller inte med om att det är mer pedagogiskt. Du har helt rätt i att det är dåligt att lära ut if (x) utan någon förståelse för vad det betyder, men lösningen tycker jag är att ge den förståelsen (uttryck, typer och evaluering) redan från början.

Nu missförstår du vad jag skrev (jag skrev slarvigt ser jag). Självklart kvittar det inte vilket variabelnamn man har, man måste ha ett bra namn. Meningen skulle vara; det kvittar hur bra variabelnamn du har, det är fortfarande mer pedagogiskt att skriva ut ==true än inte. Iaf. till en början när någon är ny och inte riktigt har greppat det hela än.

Det kanske är lättare för dig att läsa if (userExists) eller if (isCorrect(answer)) utan ==true, men för någon som inte förstår programmering eller precis börjat lära sig den, så blir det definitivt enklare för förståelsen av vad som händer, att ha ==true. Detta behöver jag egentligen inte ens argumentera med dig om, då jag har hur många elever som helst som är levande exempel på detta.

Ja, att ge elever förståelsen görs enklast genom att skriva ut ==true och sedan förklara att if(x) innebär exakt ==true implicit. Kom ihåg att detta handlar alltså om studenter som precis påbörjat sin programmeringsresa.

Visa signatur

| Corsair Crystal 460X | Z390-F | 9700K | ROG Ryujn 360mm | RTX 3080Ti | ROG Thor 850W | Vengeance Pro 3200mhz 16cl 16GB (2x8) | 970 Pro 2TB + 2xWD Black 4TB | ROG SWIFT PG279Q | Arctis 7 Pro Wireless | ROG Scope Deluxe red silent | ROG Chakram |

Permalänk
Medlem
Skrivet av Shimonu:

Jag tror det beror lite på hur det läggs upp. Jag ser inget syfte att if (x == true) bör uppmuntras i inlämningsuppgifter, har man förstått att if (x) är detsamma så är det en mer korrekt lösning i mina ögon. Så länge man inte ser att heltal eller liknande används på samma sätt. if (my_int) till exempel som även kan kompilera men inte nödvändigtvis är vad man söker för funktion. Jag menar annars bör även if ((a < b) == true) också vara pedagogiskt men tror ingen har lärt ut så.

Tills att man har förstått att det är densamma, så bör det skrivas ut. Att börja lära någon direkt att skriva if(x) kommer att ge problem då de inte är införstådda med att det implicit står ==true.

Vidare, attt bara förstå att if(x) och if(x==true) är densamma är inte i mina ögon bra nog. Man måste förstå varför det är densamma.

Det sistnämna har mycket med att göra med min inställning om att man måste veta varför/hur saker fungerar, inte bara hur man använder dem. Vilket också är anledningen till varför jag inte gillar att man lär ut python som första språk, och föredrar att börja med Java/C.

Visa signatur

| Corsair Crystal 460X | Z390-F | 9700K | ROG Ryujn 360mm | RTX 3080Ti | ROG Thor 850W | Vengeance Pro 3200mhz 16cl 16GB (2x8) | 970 Pro 2TB + 2xWD Black 4TB | ROG SWIFT PG279Q | Arctis 7 Pro Wireless | ROG Scope Deluxe red silent | ROG Chakram |

Permalänk
Medlem
Skrivet av Mithras:

Tills att man har förstått att det är densamma, så bör det skrivas ut. Att börja lära någon direkt att skriva if(x) kommer att ge problem då de inte är införstådda med att det implicit står ==true.

Fast ska man vara petig är det inte implicit == true när man skriver if(x), d.v.s. kompilatorn behöver inte lägga till == true för att det ska fungera. x är ett självständigt booleskt uttryck i det fallet som direkt kan evalueras till true eller false. Man ska så klart inte lära ut att använda if(x) utan att förklara hur booleska uttryck fungerar, men det är ju något man egentligen borde ta upp innan man ens börjar med if-satser.

Permalänk
Medlem
Skrivet av perost:

Fast ska man vara petig är det inte implicit == true när man skriver if(x), d.v.s. kompilatorn behöver inte lägga till == true för att det ska fungera. x är ett självständigt booleskt uttryck i det fallet som direkt kan evalueras till true eller false. Man ska så klart inte lära ut att använda if(x) utan att förklara hur booleska uttryck fungerar, men det är ju något man egentligen borde ta upp innan man ens börjar med if-satser.

Sant och sant, men sen är det tyvärr inte alltid så att man får lära ut det man vill i den ordning man vill

Boolska uttryck och hur de faktiskt fungerar lärs sällan ut innan man börjar använda if-uttryck. Återigen brukar man köra på att lära ut hur man använder något (i detta fall if-uttryck) och sedan lär man ut hur det fungerar. Väldigt likt hur man lär ut derivata och integraler (där jag personligen håller med dig, man bör inte heller lära ut varken derivata eller integraler innan man lär sig vad gränser handlar om, men likväl gör vi det ändå). Man lär eleverna att använda både derivata och integraler, men det är inte förrän senare de får lära sig varför derivata faktiskt fungerar och hur.

Visa signatur

| Corsair Crystal 460X | Z390-F | 9700K | ROG Ryujn 360mm | RTX 3080Ti | ROG Thor 850W | Vengeance Pro 3200mhz 16cl 16GB (2x8) | 970 Pro 2TB + 2xWD Black 4TB | ROG SWIFT PG279Q | Arctis 7 Pro Wireless | ROG Scope Deluxe red silent | ROG Chakram |

Permalänk
Medlem
Skrivet av Mithras:

Sant och sant, men sen är det tyvärr inte alltid så att man får lära ut det man vill i den ordning man vill

Jo, det är tyvärr väldigt sant. Man får vara glad om en grundkurs i programmering ens nämner vad en debugger är t.ex.