LABORATION 4 OBJEKTORIENTERAD PROGRAMMERING I C++ I Vt 2002 Mål: Lära sig: Filhantering Stränghantering Vektorer Funktioner Programstruktur Tid: Läroboken: 6 timmars handledd laborationstid. Beräknad klar vecka 22. Kap 14, (3, 4, 19 (string)) Redovisning : Redovisning sker enskilt eller parvis på ordinarie laborationstid. Vid redovisningen skall ett fungerande program och en layoutmässigt genomarbetad kod kunna visas upp. Genomarbetad kod innebär att indragningar, beskrivande variabelnamn, kommentarer och extra radbrytningar använts för att göra koden lättlast. Funktionsdefinitionerna ska dokumenteras med funktionens namn, uppgift, indata och utdata.
Inledning I laboration 4 kan välja mellan två uppgifter, en mindre omfattande som bygger vidare på laboration 3 kallad Spara namnlista, och en mer omfattande laboration, Game of Life. Spara namnlista Du ska i denna laboration bygga vidare på det program du har gjort i laboration 3. Utöka laboration 3 med funktioner för att: spara namnlistan på en textfil läsa filen med namnlistan till programmet söka efter en person i listan Förslag till utformning av menyn: Namnlista ========= 1. Lägg till namn 2. Skriv namnlista 3. Sök i listan 4. Sortera lista 5. Radera namn 6. Spara 7. Sluta Kravspecifikation När programmet startas ska filen med namnlistan automatiskt läsas in till vektorn som lagrar namnlistan i programmet. Om filen inte finns ska vektorn med namnlistan lämnas tom. Menyvalet Spara ska spara namnlistan (vektorn) på en textfil. Om filen finns ska den skrivas över annars ska den skapas. Då programmet avslutas ska namnlistan sparas automatiskt. Alternativt att användaren får svara ja eller nej om hon vill spara (enbart om innehållet har förändrats). Menyvalet Sök i listan ska låta användaren mata in ett för- och ett efternamn, sedan ska sökning i listan utföras och ett meddelande enligt följande alternativ skrivas: o o Om listan inte innehåller sökt namn ska ett lämpligt meddelande skrivas ut. Om sökt namn finns i listan ska ordningsnummer för det sökta namnet i listan skrivas ut tillsammans med lämpligt meddelande. Skriv en separat funktion som enbart utför sökningen i listan och ha en annan funktion i vilken man gör inmatning av namn, söker i listan med hjälp av sökfunktionen och sedan skriver ut lämpliga meddelanden. På nästa sida har jag kallat funktionen som enbart utför sökningen Sök i listan medan funktionen som tar emot namn, söker och skriver ut meddelande kallas Sök efter en person. Vg vänd! 1
Funktionsspecifikationer: Spara på fil Uppgift: Spara namnlista på en textfil - filnamn. Utdata: - Läs från fil Uppgift: Läser namnlistan från en textfil. Indata: - namnvektorn - filnamn. Utdata: - namnvektorn. - antal lästa namn. Sök efter en person Uppgift: Söker efter en person i namnlistan genom att låta användaren mata in namn, använda en funktion som söker i namnlistan och skriva meddelanden som anger hur sökningen utfallit. Utdata: - Sök i listan Uppgift: Söka efter en person i namnlistan. - sökt namn Utdata - index för sökt namn - om sökningen misslyckas returneras -1. 2
GAME OF LIFE Uppgift Du ska implementera Game of Life, ett klassiskt program som simulerar födelse, liv och död i en tänkt population av levande individer. Programmet introducerades av amerikanen John Conway 1970 och bygger på antagandet att en individ måste ha en lagom dos sällskap för att överleva en längre tid. Ensamhet såväl som överbefolkning leder till undergång. Samhället där individerna lever utgörs av en tvådimensionell vektor (matris) med t.ex. 25 x 25 celler. I varje cell finns det plats för exakt en individ. Som grannar räknas individer som lever i de celler som har någon sida eller hörn gemensamt med den aktuella cellen. De individer som lever i systemet vid ett visst tillfälle utgör en generation. Nästa generation skapas utifrån den aktuella generationen enligt följande regler: Varje individ med färre än två grannar dör av ensamhet Varje individ med fyra eller fler grannar dör av överbefolkning. Varje individ med två eller tre grannar överlever till nästa generation. I varje tom cell med exakt tre grannar föds en ny individ. Det är viktigt att förstå att alla förändringar vid ett generationsskifte sker samtidigt. Det innebär att inga förändringar i ett generationsskifte får påverka skeendet i resten av generationsskiftet. Exempel: Generation nr 1 2 3 alll 3
Stabilt läge Oscillator Samhällets framtid, dvs. antalet möjliga generationer beror av startgenerationen. Tre olika slutscenarier är möjliga: 1. Alla individer är döda. 2. Ett statiskt tillstånd där inga förändringar sker vid ett generationsskifte. 3. Ett cykliskt tillstånd där två eller flera populationer växelvis uppstår. Programmet Programmet ska skapa nya generationer enligt reglerna ovan. Generationerna ska visas i ett rutnät med ett lämpligt stort antal rutor (programmet ska vara skrivet så det är lätt att ändra storleken på rutnätet). Startgenerationen ska antingen slumpas fram (både antal individer och deras placering) eller läsas in från en fil. En räknare för antalet generationer ska alltid synas. Generationsskifte ska ske genom att användaren trycker mellanslag. Möjlighet till avslutning ska alltid finnas. Programmet ska själv känna av tillstånden 1 och 2 i stycket ovan och avbryta skapandet av nya generationer. Möjlighet att spara aktuell generation till fil bör finnas (inte nödvändigt). Implementationen För att rita rutnätet kan du använda ASCII-tecknen 180, 191, 192, 193, 194, 195, 196, 197, 217 och 218. Använd funktionen gototxy() för att placera tecknen i önskad position Alla väl avgränsade deluppgifter i programmet ska motsvaras av en funktion Lägg funktionerna i en eller flera separata filer (UNITs). 4