Göm menyn

961G24 Programmering i text-baserad miljö

Laboration 2

Laboration 2 - Bygga Hus

Introduktion

Du skall bygga ett hus på Gotland och du behöver veta hur många stenar som du behöver beställa. Om det bara var ett hus och du visste exakt hur det skulle se ut så vore det en smal sak att bara räkna ut med penna och papper exakt hur många stenar som behövs. Tyvärr är det inte bara upp till dig vilka som blir de exakta dimensionerna på huset, så du behöver något som är flexibelt, något som snabbt räknar ut problemet när du väl vet dimensionerna - ett program! Det går upp för dig att några av de delar som du vill räkna ut återkommer i andra delar av beräkningarna, det är alltså rimligt att du på något sätt delar upp ditt program så att delar kan återanvändas. Vi har därför lagt upp denna laboration i steg. Till en början får du göra ett par grundläggande delar, t.ex. räkna ut hur många stenar som behövs för husets väggar och den trappa som behövs på husets sida, innan vi går på slutdelen som handlar om att räkna ut hela byggnaden.

Syfte och Mål

Efter avklarad laboration skall du kunna dela upp din lösning i lämpliga underprogram (funktioner). Du skall veta hur man skickar data till funktioner via parametrar och hur man skickar något tillbaka, med returvärden.

Generella fakta

  • Vi anser att alla stenarna är kubiska, och det är inte direkt relevant att veta dimensionen på dem. Vi räknar allt i hela stenar.
  • Troligtvis kommer man ofta få ett par stenar över eftersom man vill ha fönster och dörrar till sitt hus. Vi förenklar dock och låtsas som att det inte kommer finnas några fönster eller dörrar.

Del A - Menysystem

Börja med att skapa ett litet program där användaren får välja vilken funktionalitet i programmet som skall testas. I slutänden skall programmet kunna göra följande fyra saker:

  1. Programmet skall kunna räkna ut hur många stenar som går åt för att bygga rektangulära inhägnader. (Mer om detta i del B).
  2. Programmet skall kunna räkna ut hur många stenar som år åt för att bygga "triangulära" trappor. (Mer om detta i del C).
  3. Programmet skall kunna räkna ut hur många stenar som går åt för att bygga hela huset. (Mer om detta i del D).
  4. Programmet skall gå att avsluta.

När man väljer alternativ 1 så skall användaren få mata in höjd, bredd och djup. För alternativ 2 behöver man bara mata in en höjd. För alternativ 3 behövs höjd, bredd och djup. All inmatning är hela tal och du kan utgå ifrån att användaren matar in korrekt. Själva beräkningarna för antalet stenar kan du utelämna för tillfället och fokusera på att menyn blir snygg. Varje gång en vald funktionalitet har utförts så skall man komma tillbaka till menyn så att man kan välja igen, tills användaren väljer att avsluta förstås.

Körexempel:

Välkommen till husbyggarprogrammet!

Vilken funktionalitet vill du använda?
1. Bygga rektangulär inhägnad
2. Bygga triangulär trappa
3. Bygga hus
4. Avsluta
Gör ditt val: 1

Mata in höjd: 5
Mata in bredd: 4
Mata in djup: 7
Antal byggstenar som behövs: detta gör vi i del B!

Vilken funktionalitet vill du använda?
1. Bygga rektangulär inhägnad
2. Bygga triangulär trappa
3. Bygga hus
4. Avsluta
Gör ditt val: 2

Mata in höjd: 3
Antal byggstenar som behövs: detta gör vi i del C!

Vilken funktionalitet vill du använda?
1. Bygga rektangulär inhägnad
2. Bygga triangulär trappa
3. Bygga hus
4. Avsluta
Gör ditt val: 4

Hej då!

TIPS: Du behöver inte göra denna meny som en separat funktion, utan du kan lägga detta i "huvudprogrammet". Tänk på att strukturera programmet så att så det som är gemensamt för de olika delarna ligger utanför if-satserna och det som varierar ligger inuti.

Del B - Bygga rektangulär inhägnad

Du skall nu lägga till en funktion som anropas från huvudprogrammet när användaren väljer alternativ 1 i menyn. Gör en funktion som tar höjd, bredd och djup som parametrar (tre heltal), och som returnerar hur många stenar som behövs för att bygga inhägnaden. Bilderna och körexemplen nedan visar på hur detta skall se ut och fungera:

mur_10x14x3 En inhägnad av storlek djup=14, bredd=10, höjd=3. Totalt antal stenar: 132. Det gröna under muren antar vi är det gröna gotlandsgräset.

Fördelen med att göra detta till en separat funktion är att man t.ex. kan återanvända den delen av programmet för att beräkna stenåtgången för de diverse inhägnader som kommer behövas i framtiden (för djurhållning, mur mot grannen, o.s.v.).

Resultatet från funktionen returneras och skall skrivas ut i menyn. (Inte i funktionen!)

Körexempel:

Välkommen till husbyggarprogrammet!

Vilken funktionalitet vill du använda?
1. Bygga rektangulär inhägnad
2. Bygga triangulär trappa
3. Bygga hus
4. Avsluta
Gör ditt val: 1

Mata in höjd: 3
Mata in bredd: 10
Mata in djup: 14
Antal byggstenar som behövs: 132

Vilken funktionalitet vill du använda?
1. Bygga rektangulär inhägnad
2. Bygga triangulär trappa
3. Bygga hus
4. Avsluta
Gör ditt val: 1

Mata in höjd: 1
Mata in bredd: 5
Mata in djup: 6
Antal byggstenar som behövs: 18

mur_5x6x1
En mindre inhägnad, djup=6, bredd=5, höjd=1.

Del C - Bygga triangulär trappa

"Triangulär" kanske egentligen inte är rätt ord. Snarare är denna trappa en halv pyramid. I denna del skall du skriva den funktion som anropas då användaren väljer alternativ 2 i menyn. Till skillnad från inhägnaden så beror trappans utseende endast på den önskade höjden, alltså skall endast ett heltal skickas till din nya funktion. Funktionen skall räkna ut det totala antal stenar som finns i trappan och returnera detta till huvudprogrammet. Du får givetvis göra lämpliga hjälpfunktioner som den nya funktionen kan ta hjälp av för att lösa sitt problem, om du vill. Vi rekommenderar att du gör en hjälpfunktion som skapar ett "lager" i trappan, och returnerar detta lagers höjd och bredd. Bilderna nedan illustrerar hur trappan skall se ut. Observera att trappan är fylld, d.v.s. det är stenar under de som ligger ovanpå. En intressant sak som man ser är ju att en trappa av höjd 3 ÄR en trappa av höjd 2 plus ett större lager längst ner.

Höjd 3 Höjd 2
stairs3 stairs2
Höjd 1
stairs1

Fördelen med att ha detta som en separat funktion är att det finns flera ställen där vi kanske vill ha en "trappa". Dels behövs det en vid huset när man bygger det, annars kommer man ju inte upp på muren! Men det behövs också ett tak till huset, vilket skall byggas med precis samma modell (mer om detta i nästa del).

Resultatet av funktionen skall (precis som i del B) returneras från funktionen och skrivas ut i menyn. (Inte i funktionen!)

OBS: Det är inte meningen, att du i denna uppgift, skall komma på en formel för antal stenar i trappan givet höjden. Gör istället så att du räknar ut hur många stenar som behövs för "lager" 1, 2, 3 ... i trappan. Använd sedan en lämplig loop för att sumera antal stenar som behövs för varje lager. Du skall inte använda rekursion.

Körexempel:

Välkommen till husbyggarprogrammet!

Vilken funktionalitet vill du använda?
1. Bygga rektangulär inhägnad
2. Bygga triangulär trappa
3. Bygga hus
4. Avsluta
Gör ditt val: 2

Mata in höjd: 3
Antal byggstenar som behövs: 22

Vilken funktionalitet vill du använda?
1. Bygga rektangulär inhägnad
2. Bygga triangulär trappa
3. Bygga hus
4. Avsluta
Gör ditt val: 2

Mata in höjd: 10
Antal byggstenar som behövs: 715

Nedan kommer en liten tabell med exempel som du kan testa ditt program med.

Höjd Antal Stenar
1 1
2 7
3 22
4 50
5 95
24 9500

Del D - Bygga hus

I denna del skall du lägga till den funktion som anropas då användaren väljer alternativ 3 i menyn. Funktionen skall beräkna hur många stenar som behövs för ett helt hus av de inmatade dimensionerna (djup, bredd, höjd).

Ett helt hus består av följande delar:

  • En rektangulär inhägnad
  • Ett golv av stenar som täcker inhägnadens bottenarea (vi tänker att golvet ligger inuti inhägnaden, inte under den.)
  • En trappa brevid huset som är lika hög som inhägnaden.
  • Ett tak ovanpå inhägnaden, samma modell som trappan.

Funktionen skall summera ihop antal stenar som behövs för dessa fyra delar och returnera det till huvudprogrammet där det skrivs ut. Tänk på att det är viktigt att åternyttja de tidigare funktionerna (genom att anropa dem, INTE genom att klistra in koden.)

Tänk på att trappan (den vi vill ha som tak) måste vara tillräckligt stor (ha en tillräckligt hög höjd) för att kunna täcka inhägnaden. Ofta kommer det antagligen inte passa perfekt, men vi vill då hellre att trappan hänger ut lite över inhägnadens kant, istället för att taket är för litet så att det regnar in. För att hitta en tak-trappa av lämplig storlek kommer din funktion antagligen att behöva testa sig fram lite, tills den hittar en som har en tillräckligt stor bas. Om du har en funktion som räknar ut ett lager i trappan, kan denna vara praktisk här. Speciellt behöver man tänka på att tak-trappan eventuellt kan roteras 90 grader för att täcka bättre.

Körexempel: (Se även bilderna nedan)

Välkommen till husbyggarprogrammet!

Vilken funktionalitet vill du använda?
1. Bygga rektangulär inhägnad
2. Bygga triangulär trappa
3. Bygga hus
4. Avsluta
Gör ditt val: 3

Mata in höjd: 3
Mata in bredd: 7
Mata in djup: 4
Antal byggstenar som behövs: 136

Vilken funktionalitet vill du använda?
1. Bygga rektangulär inhägnad
2. Bygga triangulär trappa
3. Bygga hus
4. Avsluta
Gör ditt val: 3

Mata in höjd: 5
Mata in bredd: 10
Mata in djup: 18
Antal byggstenar som behövs: 1198

house3x7x4

OBS: Tänk på att golvet inte syns i dessa två bilder! För bilden ovan har huset 2 x 5 = 10 stenar golv. För bilden under har huset 8 x 16 = 128 stenar golv.

house5x10x18

I följande tabell kommer lite fler exempel där du kan se hur vi har räknat och som du kan testa ditt program med.

Höjd Bredd Djup Inhägnad Golv Trappa (sidan) Trappa (tak) Totalt
3 3 3 24 1 22 22 69
3 7 4 54 10 22 50 136
5 10 18 260 128 95 715 1198
10 10 10 360 64 715 715 1854
20 10 5 520 24 5530 161 6235

Att Tänka På

Som tidigare utlovat så innebär denna uppdelade lösning att vi kan återanvända dessa funktioner om och om igen. Vi kan nyttja dem för att beräkna stenåtgången för många olika typer av hus, trappor och murar! Om vi hade gjort ett enda program som löser hela problemet som vi hade från början så hade vi inte kunnat åternyttjat så mycket kod. Dessutom är det bra mycket enklare att felsöka och utöka ett program som är uppdelat i funktioner!

village


Sidansvarig: Pontus Haglund
Senast uppdaterad: 2020-09-10