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-05-09 Tid: 09:00 13:00 Hjälpmedel: Inga hjälpmedel. Totalt antal poäng på tentamen: 45 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 torsdag den 5 juni 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-05-09 sida 2 (av 18) Uppgift 1 (16 p) Ge korta men tydliga svar på följande frågor: a) Ange minst fem primitiva datatyper. (1p) b) Är följande programsats korrekt? (Motivera ditt svar, 1p) int long = 5; c) Vilken typ har nedanstående uttryck? (4-5) >= (5-4). (1p) c) Skriv en typdefinition för en sammansatt strukturtyp (av värdetyp) med namnet Kurs som representerar en högskolekurs. Posten skall innehålla kursens namn (sträng), namnet på kursansvarig lärare (sträng), antal studenter (heltal) och tentamenstillfällen i form av en vektor. Vektorn skall initieras med plats för 3 datum, vilka representeras av den inbyggda datumtypen i C#. (2p)
Högskolan i Borås 2014-05-09 sida 3 (av 18) d) Rita en bild över hur minnet ser ut efter att var och en av nedanstående deklarationer gjorts: (2p) a) char[]chars = a, b, c, d ; b) double[]new double[5]; a) b) e) Skriv koden som gör följande: Öppnar en fil med namnet MyName.txt, skriver en rad (se layout nedan) till filen MyName.txt och avslutar med att stänga filen. (3p) Layout textfil:
Högskolan i Borås 2014-05-09 sida 4 (av 18) f) Du skall försöka beskriva en algoritm som låter en datoranvändare skriva in en mängd tal och när användaren skriver in talet 0 beräknas medelvärdet av de inmatade talen. Slutligen skriver programmet ut medelvärdet om det är över 0 (dvs positivt) medan det skriver ut värdet 0 om medelvärdet är under 0 (dvs negativt). Observera att för att kunna beräkna medelvärdet måste både summan av talen och antalet tal vara kända. Nedan får du lite hjälp av en tidigare programmerare som tagit fram en pseudokod för algoritmen. Din uppgift är att göra om pseudokoden till ett flödesdiagram. (4p) Deklarera en variabel tal och initiera den till 0 Deklarera en variabel summa och initiera den till 0 Deklarera en variabel antal och initiera den till 0 Deklarera en variabel resultat och initiera den till 0 Låt användaren mata in ett värde i variabeln tal SÅ LÄNGE SOM värdet i variabeln tal är skiljt från 0 Addera värdet av talet till värdet i summa Öka värdet på variabeln antal med 1 Läs in ett nytt värde i variabeln tal DÄREFTER Dividera summa med antal och skriv in resultatet i variabeln resultat OM variabeln resultat är större än noll Skriv ut resultat ANNARS Skriv ut värdet 0
Högskolan i Borås 2014-05-09 sida 5 (av 18) g) I ett program skrivet i C# finns ett antal hästar. En del hästar råkar vara arbetshästar. Skriv början på klassen Arbetshäst och visa att den ärver från klassen Häst. (2p)
Högskolan i Borås 2014-05-09 sida 6 (av 18) Uppgift 2 (9 p) Metoden SorteraPåAntalSlag skall följa nedanstående flödesdiagram: På nästa sida finns den kod som den förre programmeraren snickrade ihop utifrån ovanstående flödesdiagram, men som innehåller ett antal felaktigheter, dels syntaktiska som kan resultera i kompileringsfel, dels sådana koddelar som inte överensstämmer med flödesschemat. a) Din uppgift är att markera dessa felaktigheter i koden på ett sådant sätt att det framgår exakt och tydligt vad nästa programmerare skall korrigera. (6p) Ringa in de felaktiga koddelarna och numrera ställena. Skriv sedan i rutan under koden motivering/förklaring till respektive fel. Markerade fel utan korrekt motivering/förklaring ger inga poäng.
Högskolan i Borås 2014-05-09 sida 7 (av 18) public static Spelare SorteraPåAntalSlag(Spelare [] spelare); for (int i = 0; i < spelare.length - 1; i++) int minsta = i; for (int j = 0; j < spelare.length; j++) if (spelare[minsta] > spelare[j]) minsta = j; if (i < minsta) Spelare tmp = spelare[minsta]; spelare[minsta] = spelare[i]; spelare[i] = tmp; return spelare; a) b) b) Utifrån den angivna beskrivningen finns det också några logiska fel i flödesdiagrammet och således också i programmet samt saker som kan resultera i körfel/exekveringsfel. Ange och motivera dessa i rutan här nedan för. Dessa behöver inte markeras i koden ovanför. (3p)
Högskolan i Borås 2014-05-09 sida 8 (av 18) Uppgift 3 (4 p) Utskrift av anställda Skriv metoden SkrivUtAnställda så att den skriver ut anställningsnummer, namn och timlön för samtliga anställda på skärmen, se layout nedan. Rubriken måste skrivas ut för full poäng. Du behöver inte tänka på någon speciell formatering av kolumnerna det räcker med att använda tabulatortecknet (\t) för att skapa kolumnerna (även om detta inte blir så snyggt i verkligheten). public class Anställd public int anställningsnummer; // Anställningsnummer public float timlön; // Den anställdes timlön public string namn; // Den anställdes namn public static void SkrivUtAnställda(Anställd[] a)
Högskolan i Borås 2014-05-09 sida 9 (av 18) Uppgift 4 (4 p) Redogör för binärsökning. Vad är det och hur går det till? Du behöver inte skriva någon kod men rita en figur samt en sorterad lista med minst åtta poster att söka i, som visar hur algoritmen fungerar.
Högskolan i Borås 2014-05-09 sida 10 (av 18) Uppgift 5 (5 p) I ett program ska man lägga till en post i en vektor. Den nya posten ska placeras sist. Bygg på metoden ExpandArray nedan så att detta sker, och se till att returnera vad som nu ska returneras. public static skivinfo[] ExpandArray(skivInfo[] gammalskivvektor, skivinfo skivan)
Högskolan i Borås 2014-05-09 sida 11 (av 18) Uppgift 6 (7 p) Här nedan ser du ett fullständigt program, som räknar ut något och spottar ur sig en del siffror. Programmet bygger på en algoritm som vi INTE har gått igenom. Tyvärr har programmeraren varit mycket slarvig med både kommentarer och namngivning. Din uppgift består i att 1) kommentera koden och att 2) skriva ned vad utskriften från programmet blir. using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Fofibobononacoccoci class Program static int p = 1; static void Main(string[] args) int f = 1; int g = 42; Metod1(f, g); Console.ReadLine(); static void Metod1(int a, int b) int c = 0; while (c < b) int e = Metod2(c, a); a = c; c = e; static int Metod2(int x, int y) int z = x + y; Console.WriteLine(z * p); p = -p; return z;
Högskolan i Borås 2014-05-09 sida 12 (av 18) Här är tentamensuppgifterna slut.
Högskolan i Borås 2014-05-09 sida 13 (av 18) 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-05-09 sida 14 (av 18) Ö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-05-09 sida 15 (av 18) 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-05-09 sida 16 (av 18) Sammanställning av flödesdiagram
Högskolan i Borås 2014-05-09 sida 17 (av 18)
Högskolan i Borås 2014-05-09 sida 18 (av 18)