HI1024 Programmering, grundkurs TEN2 2016-01-09 KTH STH Haninge 8.15-13.00 Tillåtna hjälpmedel: En A4 handskriven på ena sidan med egna anteckningar Kursboken C PROGRAMMING A Modern Approach K. N. King helt utan anteckningar Tomma papper och penna. Logga in med tentamenskontot ni får av skrivvakten. Det kommer att ta tid att logga in ha tålamod! Logga inte ut förrän ni är klara med hela tentan. Svaren på uppgifterna ska vara program bestående av en fil som kallas uppg1.c, uppg2.c, uppg3.c och uppg4.c. Dessa ska sparas direkt under H:. Även om ni inte löser hela uppgiften så kan ni få delpoäng men ni måste se till att koden kompilerar och kan köras. Både output och koden bedöms och det är viktigt att denna är välskriven och uppfyller uppgiftens instruktioner. Välj bra variabelnamn och struktur men lägg inte så stor vikt vid kommentarer. Kom ihåg ert tentamenskonto. Resultaten kommer att presenteras kopplade till dessa. Lycka till Betygsgränser (Max 18p): 8p - Fx, 9p E, 11p D, 12p C, 14p B, 16p A Examinator: Nicklas Brandefelt C99 Vill du kunna använda C99 i Code::Blocks måste du göra följande: Settings Compiler Other options Lägg till: -std=c99 i fönstret och tryck OK
1. Kasta tärning (4p) Du ska här skriva ett program som låter användaren kasta valfritt antal sexsidiga tärningar och sedan får veta både vad varje kast blev och vad den totala summan blev. Försök att få körningen att se ut enligt nedan. Input från användaren är i fetstil. Hur manga tarningar vill du kasta?5 Du fick: 3, 5, 4, 2, 6, Summan blev 20 Avslutar
2. Andragradspolynom (6p) I den här uppgiften ska vi skriva hjälpfunktioner som gör olika saker med ett andragradspolynom representerat med en struct: struct pol2{ float a, b, c;//ax^2+bx+c }; typedef struct pol2 Pol2; Använd inga globala variabler. a) Skriv ett huvudprogram som skapar ett polynom, 2x 2 x + 4, med hjälp av structen ovan och skriver ut detta till skärmen genom att anropa en funktion (som du skriver). Funktionen skall endast ta ett polynom som in-parameter och klara att skriva ut godtyckligt polynom. Den skall absolut inte läsa in något från användaren. I utskriften ska du avrunda koefficienterna till tre decimaler. Utskriften bör i detta fall bli: (1p) b) Skriv en funktion som tar ett polynom och en float som in-parametrar och returnerar polynomets värde om man sätter x lika med decimaltalet som skickats in. Funktionen skall inte läsa in något från användaren och inte skriva ut något. Anropa funktionen efter utskriften med polynomet ovan och värdet 3. Skriv ut resultatet i main med tre decimaler. Utskriften bör nu bli: 19.000 (1p) c) Skriv en funktion som tar en pekare till ett polynom som in-parameter. Den skall sedan derivera polynomet. Funktionen skall inte returnera något och inte läsa in något från användaren och inte skriva ut något utan endast ändra polynomet den fått en pekare till så att det blir derivatan av polynomet. Kom ihåg att derivatan av ax 2 + bx + c blir 2ax + b. Anropa funktionen med polynomet ovan efter de tidigare utskrifterna och skriv sedan ut polynomet igen. Utskriften bör nu bli: 19.000 (0.000)x^2 + (4.000)x + (-1.000) (2p)
d) Skriv en funktion som tar ett polynom som in-parameter och beräknar polynomets reella nollställen, dvs de värden på x som gör att polynomets värde blir 0. Förutom ett polynom skall funktionen ta 2 pekare till floats som parametrar. I dessa ska den lagra resultatet. Om p2 är ett polynom bör ett anrop från main kunna se ut så här: if(roots(p2,&r1,&r2)) printf("polynomet har rotterna: %.3f, %.3f\n",r1,r2); Saknas nollställen skall funktionen returnera 0. Finns det ett nollställe skall både r1 och r2 få nollställets värde. Skapa nu ett nytt polynom, 3x 2 + 3x 6, och anropa din funktion med koden ovan. Utskriften bör nu bli: 19.000 (0.000)x^2 + (4.000)x + (-1.000) Polynomet har rotterna: 1.000, -2.000 Kom ihåg att en andragradare x 2 + px + q = 0 har lösningarna: p x 2 p 4 2 q 2 p där q 0 annars saknas rella lösningar. 4 (2p)
3. Mönsterigenkänning (4p) Skriv en funktion som hittar ett mönster i en sträng. Den ska då t.ex. hitta mönstret kla i strängen nicklas. Om den hittar mönstret ska den returnera sant (dvs 1) och annars falskt (dvs 0). Funktionen får inte använda några biblioteksfunktioner (t.ex får du inte använda strstr). För full poäng använd funktioner och arrayer på ett bra sätt. Använd inga globala variabler. Om du tycker uppgiften är svår kan du lösa den för mönster som är exakt tre tecken långa och kan då få 1 eller 2 poäng beroende på lösning. Skriv också main nedan så att du kan testa din funktion. Glöm inte att testa den för olika fall. int main(){ char s[] = "nicklas"; char pattern[]="lasa"; if(patternfinder(s,pattern)) printf("hittade monster!"); else printf("hittade ej monster"); return 0; } Körning: Hittade ej monster
4. Taltriangel (4p) I denna uppgift ska du skriva en funktion som börjar överst i en taltriangel och letar sig ner genom att i varje steg välja att gå åt höger eller vänster. Den ska då alltid välja det håll som ger den högsta siffran. Vid lika siffra ska den välja vänster. Funktionen ska skriva ut vilken väg den valt genom att ange v för vänster och h för höger. Funktionen ska också returnera summan av alla tal den passerat. Du ska anropa funktionen från huvudprogrammet med triangeln till höger och också i huvudprogrammet skriva ut summan. Funktionen ska klara en triangel av godtycklig höjd mindre än 11. För triangeln till höger bör utskriften bli: 5 2 7 9 1 0 6 3 4 7 h, v, h, 17 Du väljer själv format för triangeln men det måste klara olika stora trianglar. Tipset är att använda en 2D array. Bäst är nog också att man när man anropar funktionen skickar med både triangeln och triangelns höjd. Om det behövs skriv en kommentar så att jag förstår hur jag ska anropa funktionen med en annan triangel med en annan höjd. Du ska i programmet använda funktioner och arrayer på ett bra sätt och inte använda några globala variabler.