Kursmaterial för laborationer i IMPA TDDC 68 Sammanställt av Torbjörn Jonsson 2007-02-09
INNEHÅLL Allmänt om C++-laborationerna 1 De olika laborationerna: Lab0: Grundläggande C++ 3 Lab1: Sortering med fält och poster 7 Lab2: Cirkulär länkad lista samt filer 11
Tekniska Högskolan i Linköping Institutionen för Datavetenskap (IDA) Torbjörn Jonsson 2007-02-09 Förberedelser Allmänt om C++-laborationerna Innan varje laborationstillfälle ska tillräckligt förarbete gjorts så att du kan använda tiden på laborationstillfället till inskrivning och provkörning av laborationsuppgiften. Att gå helt oförberedd till en programmeringslaboration är fullständigt meningslöst och resulterar oundvikligen i att man sitter och stirrar blint på ett rörigt program som det aldrig tycks bli någon ordning på! Är man däremot väl förberedd innan laborationen så sparar man garanterat mycket tid, hur tröstlöst förberedelsearbetet än verkar! Det är alltid bra att ha med sig behövliga manualer och någon C++-bok till datorlaborationerna. Redovisning och Examination För samtliga laborationsuppgifter gäller att de ska redovisas enligt instruktioner i kursinformationen. Om det är så att du arbetar på den fria tiden och ingen assistent finns närvarande får du givetvis själv avgöra om det är värt att fortsätta med nästa deluppgift. Det kan ju hända att assistenten har synpunkter som gör att du får göra om delar av nästa uppgift såväl som den deluppgift som inte är riktigt bra. Generella saker är att de laborationer som skall redovisas skriftligt skall lämnas in i så kallade IDAomslag. Dessa omslag finns vid skrivarna (ett ihopvikt A3 med rutor för era data). Vid komplettering skall de tidigare inlämnade versionerna lämnas tillsammans med det nya. Detta för att hanteringen skall gå fortare och på detta sätt får ni tillbaka laborationerna snabbare. Tid För Ada-laborationerna finns ett antal timmar avsatta och du kommer att behöva den tiden till att programmera och skriva in din kod. Det kan också bli nödvändigt att nyttja den fria (obokningsbara) tiden i laborationslokalerna, d.v.s. 21-08 på vardagarna samt helger. Vilka tider som är anslagna till respektive laboration och när det är reservtider står i kursinformationen eller också kan assistenten delge dig detta. Tips Om du vill hitta var i ett program ett fel uppstår kan du använda dig av spårutskrifter. En spårutskrift är en vanlig utskrift av någon text eller kanske några data som visar var du är i programmet (eller skriver ut värden på variabler). Om utskriften inte dyker upp så är det nog så att du inte har fått programmet att komma till den punkt där utskriften står. Sida 1
2007-02-09 Sida 2
Tekniska Högskolan i Linköping Institutionen för Datavetenskap (IDA) Torbjörn Jonsson 2007-02-09 Mål Grundläggande C++ I denna inledande laboration kommer du att öva på de mest grundläggande operationerna. Du ska efter denna laboration ha god insikt i hur cin och cout fungerar hur de grundläggande styrstrukturerna if, for, while m.m. fungerar Uppgift 1 Skriv ett program som läser in ett reellt tal (double) som anger en temperatur i Kelvin och sedan skriver ut motsvarande temperaturvärden i grader Celsius (Kelvin - 273.15) och grader Fahrenheit (1.8 * Kelvin - 459.67). Detta skall upprepas till dess talet 0 matas in. Om ett inmatat värde är mindre än 0 skall en felutskrift göras och ny inmatning begäras. Körexempel: Ge en temperatur i Kelvin: 273.15 273.15 Kelvin motsvarar 0.00 grader Celsius eller 32.00 grader Fahrenheit. Ge en temperatur i Kelvin: -1 Negativa värden ej tillåtna! Ge en temperatur i Kelvin: 373.15 373.15 Kelvin motsvarar 100.00 grader Celsius eller 212.00 grader Fahrenheit. Ge en temperatur i Kelvin: 0 0.00 Kelvin motsvarar -273.15 grader Celsius eller -459.67 grader Fahrenheit. Tack för idag! Utskrivna värden skall ha två decimaler. Det är tillåtet att förutsätta att endast reella värden matas in. Utökad uppgift: Robust inmatning Om man försöker läsa något från en inström som inte kan tolkas som ett värde av den typ som variabeln man skall läsa till är av kommer inströmmen att försättas i ett feltillstånd och frysas. Detta innebär att strömmens läsposition blir kvar på det felaktiga indatat och efterföljande läsförsök misslyckas p.g.a. att felflaggan kommer att leda till omedelbar retur från läsoperationen. Feltillstånd kan upptäckas med strömoperationerna bad(), fail() och good(). Om cin.bad() returnerar true är det riktigt illa och strömmen kan inte användas mer. I annat fall kan feltillståndet hävas, felaktiga indata kan läsas bort och därefter skall strömmen kunna användas igen för läsning. Inför sådan felkontroll i programmet. Sida 3
2007-02-09 Uppgift 2 Skriv ett program som läser text från standardinmatninsströmmen cin och räknar vilka slags tecken som finns i texten. Använd teckenhanteringsfunktioner ur standardbiblioteket. Programmet skall skriva ut resultatet i enlighet med följande exempel. Indata innehöll: 553 alfabetiska tecken 11 siffertecken 228 interpunktionstecken 352 vita tecken 1237 tecken totalt Observera att totala antalet tecken inte behöver vara summan av antalen i de fyra andra kategorierna som räknas separat. Det finns en uppsättning standardfunktioner för allmän teckenhantering. t.ex. isalpha(), isdigit(), m.fl, se <cctype>. Då det gäller bokstavshantering fungerar detta endast säkert för det engelska alfabetet (A-Z). Sida 4
Tekniska Högskolan i Linköping Institutionen för Datavetenskap (IDA) Torbjörn Jonsson 2007-02-09 Mål Sortering med fält och poster I denna laboration kommer vi hantera ett fält (en array) fylld med heltal på lite olika sätt. Vi kommer att behandla endimesionella och även tvådimensionella fält samt fält med poster. Studenten skall efter denna laboration kunna hantera fältstrukturer, iterera över dessa utan risk för referens till element utanför fältet samt kunna hantera poster. Uppgift Uppgifterna som följer kommer att vara varianter på hur man sorterar data beroende på hur dessa lagras. Det spelar inte någon roll vilken sorteringsalgoritm ni använder. OBS! Det är endast tillåtet att i underprogram använda variabler som skickas som parametrar till eller från underprogrammen samt lokala variabler, d.v.s. det är inte tillåtet att använda sig av globala variabler inuti underprogrammen. Används globala variabler fås laborationen i retur utan åtgärd. Krav på programmen: Programmet skall vara välstrukturerat. Använd t.ex. underprogram för att förtydliga de olika delarna. Scenario Du har varit på en bangolfbana med ett antal kompisar. Det finns 18 banor och man får maximalt slå 8 slag per bana (på just denna bangolfbana). Då det var fullt med folk som rörde sig på alla banor har ni spelat banorna i en godtycklig ordning. Det är inte säkert att ni har spelat alla banor och ni kan dessutom ha spelat samma bana flera gånger. För att du skall slippa skriva in data till programmet skall programmet simulera ert spelande på följande sätt. Programmet skall slumpa ut 20 spelade banor samt antalet slag som är gjorda på just dessa banor. Alla dessa data skall lagras i den ordning de slumpas i en datastruktur angiven i respektive deluppgift. Efter detta skall programmet skriva ut de slumpade resultaten, i den ordning de är slumpade, därefter sortera resultaten och till sist skriva ut dem, sorterat, på skärmen. OBS! Sorteringen skall ske i första hand på bannummer och i andra hand på antalet slag på banan. Del A: Du skall lagra resultaten i ett tvådimensionellt fält eller ett fält bestående av fält.. Del B: Du skall lagra resulaten i ett endimensionellt fält bestående av poster. Varje enskild post skall innehålla ett resultat bestående av bannummer och antal slag. Del C: (frivillig) Man kan tänka sig att använda typen vector som finns i C++ för att lösa problemet. Gör detta. Sida 5
2007-02-09 Sida 6
Tekniska Högskolan i Linköping Institutionen för Datavetenskap (IDA) Torbjörn Jonsson 2007-02-09 Mål Cirkulär länkad lista samt filer I denna laboration kommer vi hantera filer samt en dynamisk struktur uppbyggd av pekare och poster (länkad lista). Studenten skall efter denna laboration kunna hantera pekare samt filer. Uppgift På en fil som heter TELEFONNR.TXT finns data över ett antal personer. Denna datamängd skall läsas in och läggas in i en cirkulär länkad lista. Datamängden skall inte stoppas in så att den är sorterad från början utan endast stoppas in allt eftersom den läses in från filen. Man kan tänka sig att alla data stoppas in just där pekaren till listan står för tillfället. Då data är inläst skall hela datamängden skrivas ut på skärmen. Därefter sorteras (utan att bygga upp en ny datastruktur) och slutligen skrivas ut igen (sorterat). Datastrukturen (den cirkulära listan) skall se ut på följande sätt: CL De krav på datastrukturen som finns är att CL endast skall vara en pekare och att de poster som finns i listan endast skall innehålla datat om personen samt en pekare till nästa post. Listan skall skapas dynamiskt (new) och innan progammet avslutas skall allt minne återlämnas (delete). Sida 7
2007-02-09 Sida 8