Grundläggande programmering med C# 7,5 högskolepoäng Provmoment: TEN1 Ladokkod: NGC011 Tentamen ges för: Tentamen DE13, IMIT13 och SYST13 samt öppen för alla (Ifylles av student) (Ifylles av student) Tentamensdatum: 2014-03-28 Tid: 09:00 13:00 Hjälpmedel: Inga hjälpmedel. Totalt antal poäng på tentamen: 44 poäng För att få respektive betyg krävs: Preliminärt: G >= 22 poäng, VG >= 33 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 25 april 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-03-28 sida 2 (av 19) Uppgift 1 (18 p) Ge korta men tydliga svar på följande frågor: a) Är variabelnamnet Sales detsamma som variabelnamnet sales? Ange varför eller varför inte? (1p) b) Om användaren matar in ett tal, varför är det nödvändigt att konvertera värdet som returneras av ReadLine-metoden till en numerisk datatyp? (1 p) c) Skriv en metodsignatur (metoddefinition) för en metod som tar två argument (två decimaltal: rate och time), samt returnerar ett decimaltal. Metoden skall nås överallt, samt inte vara låst till objekt. (2p) d) Deklarera en symetrisk heltalsmatris och dimensionera den till 5 rader och 10 kolumner. (2p)
Högskolan i Borås 2014-03-28 sida 3 (av 19) e) Nedanstående kodrader har blandats ihop och kommer att ge kompileringsfel. (3p) using System; Console.Write( Success\n ); public class Success Console.Write( Success\n ); public static void Main(); Console.Write( Success ); Console.Write( \nsuccess ); När kodraderna ordnas på ett korrekt sätt kommer följande output att skrivas ut på skärmen: Success Success Success Success Din uppgift är att ordna kodraderna, använd rutan nedan.
Högskolan i Borås 2014-03-28 sida 4 (av 19) e) Utgå från följande variabeldeklarationer: int a = 1, b = 2, c = 3; double d = 4.0, e = 3.2, f = 0.07; char[] str = new char[25]; Vilka av följande tilldelningssatser är direkt felaktig C# kod, och ger därför kompileringsfel? Motivera dina svar! (3p) 1. str = d; 2. d = f; 3. d = g; 4. c = a; 5. a = b + c; 6. a + b = c; 7. f = str + 1; 8. a = e; Svara bara på de alternativ du är säker på _ rätt markerade alternativ kvittas mot felaktigt angivna! f) Skriv koden som gör följande: Öppnar en fil med namnet MyName.txt, läser in första raden från filen och visar denna, samt stänger filen. (4p)
Högskolan i Borås 2014-03-28 sida 5 (av 19) g) I ett system har vi klasser med rymdvarelser. Varje rymdvarelse har en art (t.ex. wookie ), ett namn, (t.ex Yoda ) och en ålder (t.ex. 28). Skriv en konstruktor som skapar en ny rymdvarelse. Skriv också en kodrad i en annan klass som med hjälp av konstruktorn skapar rymdvarelsen Jar-Jar Binks, som är en gungan och 53 år. (2 p)
Högskolan i Borås 2014-03-28 sida 6 (av 19) Uppgift 2 (8 p) I källkoden på nästa sida 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å sida 8 motivering till respektive fel. 1 poäng per korrekt motiverat fel. Markerade fel utan korrekt motivering ger inga poäng. Programmet ska beräkna medelvärdet på två tal. Programmets uppgift är att frågar efter dessa uppgifter och därefter beräkna medelvärdet och skriva ut resultatet med hjälp av olika metodnrop. Till er hjälp får ni även ett exempel på hur skärmutskriften kan se ut.
Högskolan i Borås 2014-03-28 sida 7 (av 19) Kod att felsöka: class Program public static void meny() Console.WriteLine("\n\n***** MENY *****"); Console.WriteLine("################"); Console.WriteLine(" 1 beräkna medelvärde"); Console.WriteLine(" 0 AVSLUTA \n"); public static int las_in_alternativ() int svar; Console.WriteLine("\n Ange alternativ: "); svar = Console.ReadLine(); public static double medelvarde() double tal1, tal2; Console.WriteLine(" Ange två tal: "); tal1 = int.parse(console.readline()); tal2 = int.parse(console.readline()); Console.WriteLine(); return (tal1 + tal2) / 2.0; public static void skriv_ut(double tal) for (int i = 1; i <= n; i++) Console.WriteLine(tal); static void Main(string[] args); double tal1, tal2, resultat; int svar = 1; while (svar!= 1); meny(); svar = las_in_alternativ(); Console.Clear( ); if (svar == 1) resultat = medelvarde(tal1, tal2); Console.WriteLine(" Medelvarde : " + resultat); skriv_ut(resultat, 1); Console.WriteLine(); skriv_ut(resultat, 4); Console.WriteLine('HEJ DÅ')
Högskolan i Borås 2014-03-28 sida 8 (av 19) Motiveringar/förklaringar till felen i koden på föregående sida:
Högskolan i Borås 2014-03-28 sida 9 (av 19) Uppgift 3 (4 p) Felhantering med hjälp av try & catch Din uppgift här är att skriva om koden nedan, så att den kan hantera om det uppstår ett fel i samband med heltalsdivisionen på rad 10. 1.using System; 2.namespace IckeFångatUndantagTenVt14 3. 4. class Program 5. 6. static void Main(string[] args) 7. 8. int x = 0; 9. int div = 0; 10. div = 100 / x; 11. 12. Console.WriteLine("Resultatet är 0", div); 13. 14. Console.WriteLine(); 15. Console.WriteLine("Tryck på Enter för att avsluta"); 16. Console.ReadLine(); 17. 18. 19.
Högskolan i Borås 2014-03-28 sida 10 (av 19) Uppgift 4 (4 p) Rätt ofta måste man byta plats på två saker i en vektor eller annan form av lista. Man brukar då använda en algoritm kallad swap. Själva algoritmen har ni använt i era projekt, och det är väl den kanske kortaste algoritm man kan tänka sig. Men hur fungerar den, dvs vad gör en swap-metod ingående? Du behöver inte skriva koden exakt, men visa att du förstår hur den fungerar, gärna genom att rita.
Högskolan i Borås 2014-03-28 sida 11 (av 19) Uppgift 5 (3 p) I ett program finns en klass som heter Hund.cs. En hund har ett antal attribut och ett av dem är brukshund, som är av datatypen boolean. Hunden kan alltså vara antingen brukshund (hund.brukshund ==true) eller sällskapshund (hund.brukshund==false). När man skriver ut en massa data för hunden i konsolfönstret (jfr era visa-metoder) vill man inte att det ska stå True eller False, utan brukshund eller sällskapshund : Hundens namn Hundens ras Status Kalle Foxterrier sällskapshund Champis Bulldog brukshund Hur skriver man lämpligen kod för att få fram ovanstående? Skriv om metoden Hundlistning nedan så att det står brukshund eller sällskapshund i stället för True eller False. for (int i = 0; i < hundar.length; i++) Hundlistning(hundar[i]);... public static void Hundlistning (Hund hund) Console.WriteLine(("0,-20 1,-20 2, -20"), hund.namn, hund.ras, hund.brukshund);
Högskolan i Borås 2014-03-28 sida 12 (av 19) Uppgift 6 (7 p) I nedanstående program används bubblesort för att sortera ett antal hundar i en viss ordning. Olyckligtvis har programmeraren inte skrivit någon kommentar till bubblesort-metoden, så det är upp till dig att ta reda på vad den gör och hur den sorterar. I tabellen under koden (sida 14), skriv hur listans namn ser ut efter varje iteration! Hur utskriften blir i första varvet i for-loopen ser du i tabellrad 1. Obs! Om du inte förstår koden helt och hållet så skriv hur du uppfattar koden och skriv ditt svar därefter för att erhålla åtminstone något poäng. private void BubbleSort() bool unsorted = true; int end = dogs.length - 1; while (unsorted) for (int i = 0; i < dogs.length; i++) Console.Write(dogs[i].name + " "); Console.WriteLine(); unsorted = false; for (int j = 0; j < end; j++) string namea = dogs[j].name; string nameb = dogs[j + 1].name; if (namea.compareto(nameb) < 0) Swap(dogs, j, j + 1); unsorted = true; end--; /// <summary> /// Swaps two elements in an array /// </summary> private void Swap(Dog[] dogs, int a, int b) Dog temp = dogs[a]; dogs[a] = dogs[b]; dogs[b] = temp;
Högskolan i Borås 2014-03-28 sida 13 (av 19) Varv 1 Laban Rufus Angel Mizo Benzo Sniffy Varv 2 Varv 3 (om alls) Varv 4 (om alls) Varv 5 (om alls) Varv 6 (om alls) Varv 7 (om alls) Varv 8 (om alls) Här är tentamensuppgifterna slut.
Högskolan i Borås 2014-03-28 sida 14 (av 19) 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-03-28 sida 15 (av 19) Ö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-03-28 sida 16 (av 19) 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-03-28 sida 17 (av 19) Sammanställning av flödesdiagram
Högskolan i Borås 2014-03-28 sida 18 (av 19)
Högskolan i Borås 2014-03-28 sida 19 (av 19)