Grundläggande programmering med C# 7,5 högskolepoäng Provmoment: TEN1 Ladokkod: NGC011 Tentamen ges för: Omtentamen DE13, IMIT13 och SYST13 samt öppen för alla (Ifylles av student) (Ifylles av student) Tentamensdatum: 2014-08-18 Tid: 09:00 13:00 Hjälpmedel: Inga hjälpmedel. Totalt antal poäng på tentamen: 46 poäng För att få respektive betyg krävs: Preliminärt: G >= 23 poäng, VG >= 34 poäng Allmänna anvisningar: OBS!! Den som skriver en tentamen måste visa att han/hon behärskar problemområdet. Många gånger är det möjligt att exemplifiera och illustrera. I dessa fall är det oftast det bästa sättet - ibland även det enda sättet - och kan i högsta grad påverka poängsättningen vid bedömningen av svaret. Om du tycker att uppgifterna i tentamenstexten är ofullständiga skall du göra egna antaganden för de uppgifter som du saknar. OBS! Redovisa dina egna antaganden. Skriv in dina lösningar direkt i tentamenshäftet. Om du behöver mer utrymme än vad som finns i häftet måste du tydligt ange på tilläggsbladen vilken uppgift de tillhör. Skriv namn och personnummer på varje inlämnat blad. Skriv tydligt på endast en sida av pappersarket. Påbörja nytt blad för varje ny uppgift. Lämna uppgifterna i nummerordning. Markera (på omslagsbladet) vilka uppgifter du lämnat lösning på Svårlästa lösningar kan inte bedömas! Glöm inte att läsa frågorna mycket noga! Rättningstiden är normalt tjugo arbetsdagar, det vill säga resultatet kommer att anslås senast fredag den 12 september 2014 Viktigt! Glöm inte att skriva namn och personnummer på alla blad du lämnar in. Lycka till! Ansvarig lärare: Anna Palmquist och Petter Dessne Telefonnummer: 0734-612003
Högskolan i Borås 2014-08-18 sida 2 (av 17) Uppgift 1 (14 p) Ge korta men tydliga svar på följande frågor: a) Givet följande output: One Two Three Använd en sträng och en escapesekvens för att visa hur metoden WriteLine( ) producerar resultatet ovan. (2p) b) Vilket värde kommer variabel sum att ha efter följande satser? (2 p) int sum = 0; for (int i = 0; i <= 3; i++) for (int j = 5; j > 2*i; j--) sum = sum + (j + i); c) Ange en korrekt metodsignatur för en metod som tar två heltals argument a och b, samt som returnerar ett decimaltal. Metoden skall kunna nås överallt, samt inte vara låst till objekt. (2p) d) Visa hur man deklarera en 4X5 två dimensionell heltals vektor. (2p)
Högskolan i Borås 2014-08-18 sida 3 (av 17) e) Om följande gäller: a = false, b = false och c = false Är då nedanstående uttryck sant eller falskt? (1p) if (a && b == c) f) Skriv koden för att skriva ut de 10 första ojämna (1, 3 ) talen? (3 p) g) Fyll i nedanstående de saknade orden som alla har med objektorientering att göra. (Termerna är hämtade från föreläsningen i objektorientering.) Ser du inte med en gång vad det ska vara så gissa! (2p) En är en ritning eller en mall som beskriver objekten. Ett innehåller variabler och metoder. attribut och metoder är enbart möjliga att använda inom klassen där de är deklarerade Klassen Ko är en av klassen Däggdjur
Högskolan i Borås 2014-08-18 sida 4 (av 17) Uppgift 2 (8 p) I källkoden nedan har ett antal fel smugit sig in. Din uppgift är att ringa in de felaktiga koddelarna och numrera ställena. Skriv sedan i den heldragna rutan på nästa sida motivering/förklaring till respektive fel. Markerade fel utan korrekt motivering/förklaring ger inga poäng. using System; namespace T110321_2 class Program class Bil public int antaldörrar; public string modell; public string färg; public void Bil(int d, string m, string f) antaldörrar = d; modell = m; färg = f; static void Main(string[] args) int antaldörrar, grundpris, pris; string modell, färg; Bil[] verkstad = new Bil[1000]; for (int i = 0; i <= verkstad.length; i++) Console.Write("Ange antal dörrar: "); antaldörrar = (Console.ReadLine(); Console.Write("Ange modell: "); modell = Console.ReadLine(); Console.Write("Ange färg: "); färg = Console.ReadLine(); verkstad[i]= new Bil(modell, antaldörrar, färg); for (int i = 0; i <= verkstad.length; i++) if (verkstad[i].modell == "Saab") pris = grundpris + 1000; else if (verkstad[i].modell == "Volvo") pris = grundpris + 998.50; else pris = grundpris;
Högskolan i Borås 2014-08-18 sida 5 (av 17) Motiveringar/förklaringar till felen i koden på föregående sida:
Högskolan i Borås 2014-08-18 sida 6 (av 17) Uppgift 3 (8 p) Inläsning från fil Din uppgift är att skriva koden till metoden Ladda som skall läsa in innehållet från filen biografmätningar.txt till vektorn biografmätningar. Koden skriver du in i den heldragna rutan på nästa sida. Inläsningen från filen skall ske i överensstämmelse med hur utskriften skett i metoden Spara (se kod nedan). Vid inläsningen skapar du således en BiografMätning-post per rad, varefter den, när posten initierats korrekt, skall läggas till vektorn biografmätningar via metoden LäggTillBiografMätning. Förtydligande, du skall inte skriva koden till metoden LäggTillBiografMätning, däremot skall metoden anropas från metoden Ladda. public static void Spara() StreamWriter utfil = new StreamWriter("biografMätningar.txt"); for (int i = 0; i < biografmätningar.length; i++) BiografMätning m = biografmätningar[i]; int antaldagar = AntalDagar(m.år, m.månad); utfil.write("0\t1\t2\t3\t", m.biograf, m.år, m.månad); utfil.writeline(); utfil.close(); Den sammansatta typen BiografMätning: public struct BiografMätning public string biograf; public int år; public int månad; Ett klipp ur textfilen biografmätningar.txt:
Högskolan i Borås 2014-08-18 sida 7 (av 17) public static void Ladda()
Högskolan i Borås 2014-08-18 sida 8 (av 17) Uppgift 4 (4 p) Redogör för exchange sort. Vad är det och hur går det till? Du behöver inte skriva någon kod men rita en figur där en osorterad lista med minst fyra poster sorteras. Skriv också en förklaring på några meningar.
Högskolan i Borås 2014-08-18 sida 9 (av 17) Uppgift 5 (5 p) I ett program vill man kunna kolla om ett visst namn finns i en lista. Sökmetoden anropas enligt nedan. I metoden ska man kunna skriva ut ett meddelande om namnet finns med eller ej. Början på programmet ser du alltså här. Din uppgift är att skriva metoden Sök som ger utskrift enligt bilden. using System; namespace ProgramX class Program static void Main(string[] args) string[] words = "Cecilia", "Patrik", "Anna", "Petter", "Anders", "Shirin", "Carina", "Peter", "Björn", "Ulf", "Håkan" ; Sök(words, "Anders"); Sök(words, "Jonas");
Högskolan i Borås 2014-08-18 sida 10 (av 17) Uppgift 6 (7 p) Här nedan ser du ett fullständigt program som gör något med vektorn words. Tyvärr har programmeraren varit mycket slarvig med både kommentarer och namngivning och därför är det upp till dig att förstå vad koden gör. Din uppgift består i att 1) kommentera koden på avsedda ställen (avsluta meningarna som börjar med Den här metoden eller liknande) och att 2) skriva ned vad utskriften från programmet blir. using System; namespace ProgramX class Program static void Main(string[] args) string[] words = "Cecilia", "Patrik", "Anna", "Petter", "Anders", "Shirin", "Carina", "Peter", "Björn", "Ulf", "Håkan" ; Metod2(words); Console.WriteLine(); words = Metod1(words); //Den här raden... Metod2(words); Console.ReadLine(); //Den här raden gör så att... //Den här metoden... // // static string[] Metod1(string[] arr) string[] nyarr = new string[arr.length]; int j = 0; string temp = ""; for (int i = 0; i < arr.length; i++) if (arr[i].compareto(temp) == 1) //De här raderna... nyarr[j] = arr[i]; j++; temp = arr[i]; return nyarr; //Den här metoden... // // static void Metod2(string[] arr) for (int i = 0; i < arr.length; i++) if (arr[i]!= null) Console.Write(arr[i] + " "); //Den här raden...
Högskolan i Borås 2014-08-18 sida 11 (av 17) Här är tentamensuppgifterna slut.
Högskolan i Borås 2014-08-18 sida 12 (av 17) C# - sammanfattning av vanliga begrepp och uttryck Klasser Det här är en klass. En klass är en representation av ett ting, som exempelvis en Person. Eftersom allt i C# är byggt runt klasser innebär en klass att man skapar en ny datatyp. class Person För att använda en klass måste man ofta instansiera den till ett objekt, class Person Person p1 = new Person(); Person p2 = new Person(); Om en metod i C# returnerar ett värde ändrar man från void till datatypen som returneras, class Person string name; public string Talk() return "Hello, my name is " + name; Person p1 = new Person(); string tmp = p1.talk() Console.WriteLine(tmp); // "Hello, my name is " Konstruktorer En konstruktor är en instansmetod som har samma namn som klassen, den körs automatiskt varje gång när klassen instansieras till ett nytt objekt och markeras inte med void trots att den inte returnerar något värde. Konstruktorn används vanligen bara för att initiera objekt. Om ingen konstruktor finns skriven skapar systemet en tom konstruktor markerad med public som inte tar några argument. class Person string name; public Person(string name) public string Talk() return "Hello, my name is " + name; Person p1 = new Person(); // FEL, det finns ingen parameterlös konstruktor Person p2 = new Person("Leonard"); Console.WriteLine(p2.Talk()); // "Hello, my name is "
Högskolan i Borås 2014-08-18 sida 13 (av 17) Överlagrade metoder En metod får förekomma flera gånger med samma namn så länge de tar olika antal argument och/eller argument med olika datatyper, sådana metoder kallas överlagrade. Eftersom överlagrade metoder ofta gör snarlika saker är det vanligt att de anropar varandra. class Person string name; public Person(string name) this.name = name; public string Talk() return Talk("..."); public string Talk(string text) return name + " says: " + text; Person p1 = new Person("Leonard"); Console.WriteLine(p1.Talk()); // "Leonard says:..." Console.WriteLine(p1.Talk("Hello")); // "Leonard says: hello" Klassmetoder De gångerna det inte är logiskt att jobba med objekt kan man använda ordet static för att markera att något inte är en instansmetod eller instansvariabel/egenskap. En klass kan vara helt statisk, som exempelvis Math eller Console vilka det inte går att instantiera till objekt alls, eller delvis, som String som innehåller både instansdata som Length och statiska metoder som IsNullOrEmpty som tar en sträng som argument och returnerar sant eller falskt beroende på om strängen är tom eller inte. string s = "hello"; if (! String.IsNullOrEmpty(s)) Console.WriteLine("strängen är inte null eller tom"); Det går (naturligtvis) inte att anropa en instansegenskap/variabel/metod från en klassmetod eller via klassnotation och det finns inuti en statisk metod heller ingen objektreferens till this. string s1 = "hello"; string s2 = "world!"; Console.WriteLine(s1.Length); // 5 Console.WriteLine(s2.Length); // 6 Console.WriteLine(String.Length); // Kompilatorfel I C# är det inte möjligt att via en instans av klassen anropa en statisk metod i densamma (i vissa andra programspråk är det här okej): string s = "hello"; if (s.isnullorempty(s)) // Kompilatorfel! Console.WriteLine("strängen är null eller tom");
Högskolan i Borås 2014-08-18 sida 14 (av 17) Sammanfattningsvis Sammanfattningsvis ser en översikt med de vanligaste begreppen i en klass ut såhär, class Person // Klassnamn public string Name get; set; // Egenskap public Person(string name) // Konstruktor this.name = name; public string Talk() // Instansmetod return Name + " is speechless!"; public string Talk(string s) // Överlagrad instansmetod return String.Format("0 says \"1\"", Name, s); public static bool Compare(Person p1, Person p2) // Klassmetod if (p1.name == p2.name) return true; return false; Person leo = new Person("Leonard"); // Ny instans av klassen Person floyd = new Person("Floyd"); if (Person.Compare(leo, floyd)) Console.WriteLine("Personerna har samma namn"); else Console.WriteLine("Personerna har inte samma namn"); Console.WriteLine(leo.Talk()); Console.WriteLine(leo.Talk("hello")); Personerna har inte samma namn Leonard is speechless! Leonard says "hello"
Högskolan i Borås 2014-08-18 sida 15 (av 17) Sammanställning av flödesdiagram
Högskolan i Borås 2014-08-18 sida 16 (av 17)
Högskolan i Borås 2014-08-18 sida 17 (av 17)