Örebro universitet
Institutionen för teknik
Thomas Padron-McCarthy (Thomas.Padron-McCarthy@tech.oru.se)

Tentamen i

Programmering grundkurs och Programmering C

för D1 m fl, även distanskursen

lördag 19 januari 2008 kl 8:00 - 13:00

Gäller som tentamen för:
DT1016 Datateknik A, Programmering grundkurs, provkod 0100
DT1007 Datateknik A, Tillämpad datavetenskap, provkod 0410
DT1006 Datateknik A, Programmering C, distans, provkod 0100
PRG045 Programmering C, provkod 0110 (och 0100, och 0101)
TDD121 Tillämpad datavetenskap A, provkod 0700 (och 0400)
TDP118 Programmering C, distans, provkod 0110 (och 0100)


Hjälpmedel: Inga hjälpmedel.
Poängkrav: Maximal poäng är 40.
För godkänt betyg (3 respektive G) krävs 23 poäng.
För den som följt campuskursen hösten 2007 ger varje i tid inlämnad inlämningsuppgift med deadline en extra poäng. Den som inte gått campuskursen hösten 2007, får dessa (tre) extrapoäng ändå.
Resultat och lösningar: Meddelas på kursens hemsida, http://www.aass.oru.se/~tpy/c/2007-2008-p2/, senast lördag 9 februari 2008.
Visning och frågestund: Måndag 11 februari 2008 kl 12:00-12:30 i mitt rum (T2220).
Efter visningen kan tentorna hämtas på institutionen. Man kan också få sin rättade tenta hemskickad.
Examinator och jourhavande: Thomas Padron-McCarthy, telefon 070-73 47 013.





LYCKA TILL!

Prioritet och associativitet hos operatorerna i C

De viktigaste operatorerna:

Prioritet Kategori Operator Associativitet
Högsta Unära postfixoperatorer (), [], ->, ., ++, -- vänster
  Unära prefixoperatorer !, ++, --, +, -, *, &, sizeof, (typ) höger
  Multiplikation mm *, /, % vänster
  Addition mm +, - vänster
  Jämförelser <, <=, >=, > vänster
  Likhetsjämförelser ==, != vänster
  Logiskt OCH && vänster
  Logiskt ELLER || vänster
Lägsta Tilldelning =, +=, -=, *=, /=, %= höger

Uppgift 1 (1 p)

Vilka värden har följande uttryck?

a) 1 / 2 + 3 + 4

b) 1 + 2 % 3 + 4

c) 1 % 2 * 3 + 4

Uppgift 2 (1 p)

a, b och c är heltalsvariabler. Ange värdet på a, b och c då följande kod har körts.

a = 1;
b = 1;
c = 10;
while (a < c) {
    if (a % 2 == 0)
        a++;
    else
        c--;
    b++;
}

Uppgift 3 (1 p)

a och b är heltalsvariabler. Skriv de kodrader som behövs för att byta plats på innehållet i dessa två variabler.

Uppgift 4 (4 p)

a) (2p) Skriv en funktion, f, som beräknar följande uttryck.

En formel: z = ...

Funktionen ska ta de tre flyttalen x, y och z som argument, och returnera uttryckets värde.

b) (2p) Skriv en main-funktion som läser in värden på x, y och z, beräknar uttryckets värde genom att anropa funktionen ovan, och sen skriver ut detta värde.

I den här och alla andra uppgifter på tentan gäller: Om du ska anropa en funktion från en tidigare uppgift eller deluppgift, behöver du inte skriva koden för den funktionen på nytt. Du får också anropa funktionen även om du inte gjort uppgiften där man skulle skriva den.

Uppgift 5 (4 p)

Ett ånglok. Fotograf: Frederik Tellerup. Licens: Creative Commons.
Figur 1: Ett tåg.

Vi ska skriva ett tågspel, där man tävlar med tåg på järnvägen. Tågspelet innehåller följande tre typer av saker:

Vi behöver en posttyp (med C-terminologi struct) för var och en av dessa saker.

a) (1p) Definiera posttypen som ska användas för att lagra data om ett lok. Den ska heta struct Lok.

b) (1p) Definiera posttypen som ska användas för att lagra data om ett vagn. Den ska heta struct Vagn.

c) (2p) Definiera posttypen som ska användas för att lagra data om ett tåg. Den ska heta struct Tag. Tips: Denna posttyp ska innehålla tre fält, nämligen ett lok, en array av 100 vagnar, och en heltalsvariabel som anger hur många av dessa vagnar som vi verkligen använder.

Uppgift 6 (1 p)

Definiera en variabel av typen struct Lok och initiera den med data om lok nummer 100, som väger 110 ton.

Uppgift 7 (4 p)

Vi vill kunna visa lok-, vagn-och tågposternas innehåll på skärmen.

a) (1p) Skriv en funktion som heter visa_lok, som skriver ut ett lok (som i uppgift 4) på skärmen. Funktionen ska ta lokposten som parameter. Exempel på hur en utskrift kan se ut:

Lok nummer 100, som väger 110 ton.

b) (1p) Skriv en funktion som heter visa_vagn, som skriver ut en vagn på skärmen. Funktionen ska ta vagnposten som parameter. Exempel på hur en utskrift kan se ut:

En vagn som själv väger 4 ton, och har 10 ton last.

c) (2p) Skriv en funktion som heter visa_tag, som skriver ut ett helt tåg på skärmen. Funktionen ska ta tågposten som parameter. Den ska anropa funktionerna visa_lok och visa_vagn. Exempel på hur en utskrift kan se ut:

Här börjar tåget.
Lok nummer 100, som väger 110 ton.
En vagn som själv väger 4 ton, och har 10 ton last.
En vagn som själv väger 4 ton, och har 20 ton last.
En vagn som själv väger 5 ton, och har 3 ton last.
Här slutar tåget.

Uppgift 8 (1 p)

Skriv en funktion som heter vagnvikt, som räknar ut totalvikten för en vagn genom att addera tomvikten och vikten på lasten. Funktionen ska ta vagnposten som parameter.

Uppgift 9 (2 p)

Skriv en funktion som heter tagvikt, som räknar ut totalvikten för ett helt tåg genom att summera lokets och alla vagnarnas vikter. Funktionen ska ta tågposten som parameter. Den ska anropa funktionen vagnvikt.

Uppgift 10 (3 p)

Skriv en funktion som heter spara_tag, som sparar alla data om ett tåg på en textfil.

Uppgift 11 (4 p)

Skriv en funktion som heter las_tag, som läser in alla data om ett tåg från en textfil, som skrivits med funktionen spara_tag i uppgiften ovan.

Uppgift 12 (4 p)

Skriv en main-funktion som först initierar en tåg-post med lämpliga data för ett tåg med ett lok och några vagnar, och sen sparar tågpostens innehåll på en fil med funktionen spara_tag. Därefter ska den läsa in samma data till en ny tågpost med funktionen las_tag, och avslutningsvis ska den skriva ut den tågposten med funktionen visa_tag.

Uppgift 13 (5 p)

Skriv ett C-program som läser in två rader med text, och sen skriver ut den längsta av dem baklänges. Om båda raderna är lika långa, spelar det ingen roll vilken av dem som skrivs ut. Vi kommer aldrig att mata in längre rader än 80 tecken.

Uppgift 14 (5 p)

Uppgift 1 på den här tentan innehåller några uttryck med talen 1, 2, 3 och 4 (i den ordningen), samt tre operatorer. Skriv ett C-program som skriver ut alla sådana uttryck. De olika operatorer man får använda är +, -, *, / och %.

Eftersom vi ska stoppa in tre operatorer, och för varje operator har fem olika att välja på, blir det 5*5*5, dvs 125, olika uttryck.

Exempel på uttryck som ska skrivas ut:

1 + 2 + 3 + 4
1 % 2 + 3 * 4

Exempel på uttryck som inte ska skrivas ut:

1 + 2 + (3 + 4)
1 + 2 + 3 + 3
1 + 2 + 3 ^ 4
1 + 2 + 3
1 + 2 + 4 + 3

Notera att uttrycken alltså bara ska skrivas ut, som text. De ska inte beräknas.