1. Formaterar en fil med ålder och namn så dessa hamnar i omvänd ordning i tabellformat på en ny fil. "ws" skippar blanktecken före namnet (getline läser oformaterat så den skippar inte inledande blanksteg, medan cin >> name bara skulle läsa förnman, inte hela raden. "setw(30)" ordnar namnen i kolumn. Namnet kommer alltit uppta minst 30 teckenpositioner (blanksteg används för fyllnad om inte "setfill" ändrat det). 2. Loopen avbryter om en ålder skall läsas men bokstäver (inte siffror) påträffas i filen (flaggan fail sätts) eller om filen är slut (flaggan eof sätts). 3. "left" skulle behövas för att vänsterjustera namnet och om namnet är längre än 30 tecken saboteras tabellen. 4. Rad för rad: *c = 3; // z sätts till 3 eftersom c pekar till z c = &b; // c sätts att peka på y (eftersom b refererar till y) a = c; // x sätts att peka på samma som c (d.v.s. y) eftersom // a refererar till x och c innehåller adressen till y *c = 2; // y tilldelas värdet 2 *c = 1; // y tilldelas värdet 1 Svar på frågan: a är en referens till x som pekar på y b är en referens till y c är en pekare till y 5. *x == 1 eftersom x pekar på y enligt föregående svar y == 1 enligt föregående svar z == 3 enligt första raden i föregående svar Det som skrivs ut är summan, d.v.s. 5 6. Uppgiften höjd till 2 poäng. Kommenterad kod: List_Node* one = new List_Node; // OK List_Node* two = one->next; // Varning: one->next oinitierad! one->value = 6; // OK delete one; // OK, allokerad dynamiskt på första raden. two->next = new List_Node; // FEL: "two" innehåller en ogiltig // adress från rad två, piloperatorn // är endast giltig på giltiga adresser // ger i bästa fall segmentation fault // i sämsta fall skrivs andra variabler // (som råkar ligga på adressen som "two" // anger) över delete one->next; // FEL: "one" innehåller en ogiltig (avallokerad) adress Svar: Se fel och varningar ovan. (2p) 7. En nod (8 bytes) på rad 4 allokeras, men avallokeras aldrig. (1.5p) 8. En nod (8 bytes) på rad 5 avallokeras, men allokeras aldrig. (1.5p) (Kanske avsåg programmeraren att rad 5 skulle göra "delete two->next"?) 9. Kodstil med mera har övertagit nummer 9. (4p) En kommentar skall berätta programmerarens avsikt med koden om det inte är direkt uppenbart. Den skall även dokumentera varför lösningen är gjord på detta sätt, speciellt om lösningen är krånglig eller svårläst. (Hur en kommentar INTE skall se ut är inte direkt relevant, frågan gäller hur den SKALL vara.) Hela syfte eller hela uppgiften skall vara tydligt genom att endast läsa namnet. Namnet bör vara kort och koncist utan att bryta mot föregående punkt. Kodformatering skall framhäva kodens struktur och underlätta framtida modifieringar. Läsbarhet och ändringsbarhet. (Se Code Complete kap. 31-32, förberedelse till seminarie 1.) 10. I detta fall skall ett ord associeras med ett antal. Då är map en lämplig container som ger precis denna möjlighet. En map tillåter enkel indexering för att komma åt antalet för ett ord. För att undvika att andra ord än de givna räknas måste en sökning i map ske för att se om aktuellt ord skall räknas. En map är effektiv för sådan sökning. (Sökning genom att endast indexera map fungerar inte eftersom indexeringen även sätter in sökt nyckel om den inte fanns.) Det går även att motivera andra val om en sämre algoritm använts. 11. Cat, Lion och Dragon måste vara subklasser till Animal och animal måste ha en publik virtuell funktion speak(). Vidare måste vektorn lagra pekare till Animal och adressen till de olika variablerna stoppas in (istället för hela ojektet). (Slutligen bör sista raden vara "v.at(2)" och inte list.at(2).) 12. Antar vi pratar om fortsättning på fråga 11, d.v.s. sista relaterat till sista raden koden. Denna hämtar index 2 som innehåller adressen till variabeln "a" (pushad sist). Vid anrop till medlemsfunktion kommer "this" i medlemsfunktionen referera till variablen funktionen anropades "på", d.v.s. "a" (av typ Lion) i detta fall. 13. Konstruktor: En funktion som anropas automatiskt när en variabel av klasstyp skapas. Syfter är att initiera alla medlemmar av klassinstansen som just skapats. En konstruktor skapas genom att skriva en funktion med samma namn som klassen, men utan returvärde. Konstruktorn kan ta valfritt antal parametrer som då måste anges då en instans skapas. Anges inga parametrer blir det en så kallad default-konstruktor. En publik default-konstruktor skapas automatiska av kompilatorn endast om ingen annan konstruktor finns. Den gör ingenting. Destruktor: En funktion som anropas automatiskt när en variabel av klasstyp upphör att existera (blocked den deklarerats i upphör eller delete anropas på instansen). Syfter är att rensa upp efter klassinstansen som just skall upphöra existera. Framförallt används den till att avallokera allt minne instansen allokerat för att undvika minnesläckor. En destruktor skapas genom att skriva en funktion med samma namn som klassen, men utan returvärde och med prefixet ~. Destruktorn kan inte ta några parametrar. En publik destruktor skapas automatiska av kompilatorn endast om ingen annan destruktor finns. Den gör ingenting. Djup kopiering: Vid tilldelning i C/C++ kopieras en variabels värde till en annan variabel (A = B;). Då variabeln B är en pekare är innehållet i B en adress som alltså kopieras. Detta får till följd att två pekarvariabler (A och B) kommer innehålla SAMMA adress och alltså peka på samma minne. Detta är inte bra eftersom ändring i minnet den ena pekar ut även ändrar in (samma) minne den andra pekar ut. Normalt förväntar vi oss att ändring via en variabel inte påverkar andra variabler. För att lösa detta räcker det inte att kopiera adressen i B, utan det som måste kopieras är innehållet i minnet som pekas ut av B. Adressen till minnet som innehåller kopian lagras sedan i A. Detta skall fungera rekursivt om minnet som kopieras råkar innehålla flera pekare (beror på datatyp, vanligt i länkade listor och träd). A kommer alltså inte vara en kopia av B, men det A pekar ut kommer vara en kopia på det B pekar ut. Djup kopiering sker aldrig automatiskt, utan är något programmeraren själv måste ordna, t.ex. genom att implementera kopieringskonstruktor och tilldelningsoperator för en klass. I övrigt hänvisas till förberedelse för seminarier och kursbok.