HI1024 Programmering, grundkurs TEN2 2014-03-13 KTH STH Haninge 13.15-18.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 Examinator: Nicklas Brandefelt Rättande lärare: Nicklas Brandefelt, Fredrik Bergholm Instruktion för dig som vill använda debugger: Välj windowsknappen och Alla Program (All programs) menyn. Scrolla ned tills du hittar Program Haninge och välj: Program Haninge>Utveckling>Gcc Environment. Man får då upp kommandotolken med rätt sökvägar (i kommandotolken använder man dir för att lista en katalog och cd för att byta katalog). Man kan nu använda gcc och gdb. Kom ihåg att inte använda codeblocks för kompilering om ni vill använda gdb. Exempel: gcc g foo.c -o foo2 gdb foo2.exe foo2
Generella rättningsnormer: Mycket dåliga variabelnamn ger -1p totalt på provet vid andra tillfället Inga eller dåliga kommentarer ger -0p på provet Dålig struktur ger avdrag varje gång Generellt gäller: -1p per avvikelse, minst -1p om koden ej kompilerar U3 Om man löst frågan om antal exemplariskt (bla flera chanser att ge rätt input) men slumpat fram tal som kan återkomma och där inte alla är med kan man få 1p Har man inte löst a korrekt kan man fortfarande få poäng för b U4 Har man fått till inläsning och presentation av spelplan och använt funktioner och arrayer på ett bra sätt kan man få 1p Betygsgränser Max 18 A 16 B 14 C 12 D 11 E 9 Fx 8
1. Densitet (4p) Med hjälp av densiteten för ett ämne kan man om man vet massan beräkna volymen eller om man vet volymen beräkna massan. Med hjälp av densiteten för bly, = 11300 kg/m 3, ska du skriva ett program som ger användaren möjlighet att göra just detta. Först får användaren välja mellan att beräkna volymen, massan eller att avsluta. Väljer användaren massan får användaren ange volymen och sedan presenteras den beräknade massan. Väljer användaren att beräkna volymen får denne ange massan och den beräknade volymen presenteras. Programmet upprepar sedan första frågan till dess att användaren väljer att avsluta. Använd flyttal för att representera alla värden. Skriv ut svaren med två decimaler. Försök att få utskrifterna att likna exemplet så mycket som möjligt (fetstil är inmatningar). (1) Berakna massan (2) Berakna volymen (3) Avsluta 1 Ange volymen (m3): 0.2 Blyets massa blir 2260.00 kg. (1) Berakna massan (2) Berakna volymen (3) Avsluta 2 Ange massan (kg): 11000 Blyets volym blir 0.97 m3. (1) Berakna massan (2) Berakna volymen (3) Avsluta 3 Avslutar Formel för densitet: m V
2. struct (4p) I den här uppgiften ska vi representera ett andragradspolynom, ax 2 +bx+c, med en struct: struct polynom{ float a,b,c; }; typedef struct polynom Polynom; Vi ska nu skriva fyra funktioner som hjälper oss att göra saker med dessa polynom. De tre sista ska inte skriva ut något eller läsa in något utan är rena interna hjälpfunktioner. Längst ner hittar du en main som anropar alla funktioner. Denna ska fungera med dina funktioner. För full poäng ändra inget i denna. Om du bara löser en del uppgifter kan du behöva lägga till i main och kommentera bort funktionsanrop för att det ska kompilera. Ändra dock inte funktionsanropen. Lägg inte till några globala variabler i programmet. a) Skriv en funktion skrivut( ) som tar ett Polynom som in-parameter och skriver ut det till standard ut. Ex: 3x 2-2x-1 skrivs ut som 3.000000x2 + -2.000000x + -1.000000 b) Skriv en funktion skapapolynom( ) som utifrån in-parametrarna skapar ett Polynom och returnerar detta. c) Skriv en funktion addera( ) som tar två polynom som input och adderar dessa enligt matematikens regler och returnerar resultatet. Ex: 4x 2 +2x+1 + 8x 2-3x+12 = 12x 2-1x+13 d) Skriv en funktion multiplicera( ) som man kan använda för att multiplicera ett polynom med en konstant. Funktionen ska då förändra det polynom man anropar med. Funktionen ska inte returnera något utan returtypen ska vara void. Ex. skickar man in polynomet 4x 2 +2x-1 och heltalet 3 ska polynomet efter funktionsanropet vara 12x 2 +6x-3 int main(){ Polynom p1,p2,p3; p1 = skapapolynom(-8,0,1); //skapar polynomet -8x 2 +1 p2 = skapapolynom(1,2,-3); //skapar polynomet x 2 +2x-3 p3 = addera(p1,p2); //adderar p1 och p2 och returnerar resultatet multiplicera(&p3,2); //förändrar p3 så att alla p3 s koefficienter blir multiplicerade med 3 skrivut(p3); //skriver ut p3 enligt ovan return 0; }
3. a) Slumpa ordningsföljd av tal (4p) I denna uppgift får användaren välja det högsta heltal som ordningen skall slumpas fram för. Väljer användaren 10 ska programmet slumpa fram en ordning för talen 1 till och med 10. Om användaren anger ett heltal mindre än 1 eller större än 10000 ska denne få instruktionen att man valt fel och en ny chans att göra en inmatning. Programmet skall använda arrayer och funktioner på ett bra sätt men inga globala variabler. Försök att få programmets utskrift att efterlikna nedanstående (fetstil är inmatningar). Vilket ar det hogsta heltal du vill ha med? (1-10000) 12000 Du maste valja mellan 1 och 10000! Vilket ar det hogsta heltal du vill ha med? (1-10000) 7 3, 5, 2, 7, 1, 4, 6, b) Längsta ordningsföljden (2p) Lägg nu till att programmet beräknar den längsta följden av tal som ligger i rätt ordning. Det vill säga att talen kommer i stigande ordning. I ordningsföljden 11, 7, 3, 8, 9, 15, 5, 13, 10, 1, 12, 2, 6, 14, 4 är svaret 4 eftersom 3, 8, 9, 15 är i korrekt ordningsföljd. Vilket ar det hogsta heltal du vill ha med? (1-10000) 15 11, 7, 3, 8, 9, 15, 5, 13, 10, 1, 12, 2, 6, 14, 4, Langsta foljden ar 4
4. 3 i rad (4p) Skriv ett program som låter två spelare turas om att spela tre i rad. I detta spel turas spelarna om att sätta ut kryss eller ring på ett 3*3-bräde till dess att någon fått tre i rad eller till dess att brädet är fullt. Spelet ska skriva ut spelplanen efter varje drag. Om någon spelare vinner ska spelet utropa denne som vinnare och avsluta. Om ingen vunnit när brädet är fullt ska den utropa oavgjort och avsluta. Programmet ska använda arrayer och funktioner på ett bra sätt men inte använda globala variabler. Om du vill kan du välja att markera en tom ruta med 0, ett kryss med 1 och en ring med 2 när du skriver ut brädet. Förslag på hur en körning skulle kunna se ut: Spelare 1 Ange kolumn:3 0 0 1 Ange rad:2 Ange kolumn:2 0 0 1 0 2 0 Spelare 1 Ange kolumn:2 0 1 1 0 2 0 Ange kolumn:2 Ange kolumn:1 2 1 1 0 2 0 Spelare 1 Ange rad:2 Ange kolumn:3 2 1 1 0 2 1 Ange rad:3 Ange kolumn:3 2 1 1 0 2 1 0 0 2 har vunnit