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








Tentamen i

Programmering C

för D1 m fl, även distanskursen

måndag 28 maj 2007 kl 08:00 - 13:00 i L001









Hjälpmedel: Inga hjälpmedel.
Poängkrav: Maximal poäng är 40.
För godkänt betyg (3 respektive G) krävs 20 poäng.
Resultat och lösningar: Meddelas på distanskursens hemsida, http://basen.oru.se/kurser/c/2006-2007-p34-distans/, senast fredag 8 juni 2007.
Visning och frågestund: Fredag 8 juni 2007 kl 12:00-12:30 i mitt rum (T2220).
Efter visningen kan tentorna hämtas på expeditionen. 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) 3 * 4 - 5 - 6

b) 3 * 4 - 5 % 6

Uppgift 2 (1 p)

i är en heltalsvariabel. Ange värdet på i då följande kod har körts.

i = 3;
while (i < 10) {
    if (i > 7)
        i = i * 2;
    else
        i = i + 2;
}

Uppgift 3 (1 p)

Ett dataspel innehåller rymdskepp, och varje rymdskepp har de här egenskaperna:

Vi behöver en posttyp (med C-terminologi en struct) som kan användas för att lagra data om ett rymdskepp. Definiera posttypen. Den ska heta struct Rymdskepp.

Uppgift 4 (1 p)

Definiera en variabel av typen struct Rymdskepp och initiera den med data om rymdskepp nummer 17, som körs av spelaren Thomas, som befinner sig i punkten med koordinaterna x = 0, y = 0, och som har maxfarten 10.

Uppgift 5 (2 p)

Skriv en funktion som heter visa_rymdskepp, som skriver ut ett rymdskepp (som i uppgift 3) på skärmen. Funktionen tar rymdskeppsposten som parameter, och skriver ut den, med lämpliga ledtexter så man ser vad som är vad.

Uppgift 6 (2 p)

Skriv en funktion som heter las_rymdskepp, och som läser in data om ett rymdskepp. Funktionen ska skriva ut lämpliga ledtexter på standardutmatningen, och läsa in data från standardinmatningen (som normalt är kopplad till tangentbordet).

Uppgift 7 (2 p)

Skriv en funktion som heter krock, som tar data om två rymdskepp som argument, i form av två stycken struct Rymdskepp. Om rymdskeppen befinner sig på samma position i rymden ska funktionen returnera ett sant värde. Annars ska den returnera ett falskt värde.

Uppgift 8 (2 p)

Skriv en main-funktion som har två lokala variabler av typen struct Rymdskepp, och som läser in data om två rymdskepp till dessa variabler med hjälp av funktionen las_rymdskepp. Avslutningsvis ska den anropa funktionen krock för att avgöra om rymdskeppen har krockat, och skriva ut ett meddelande om ifall de hade det eller inte.

I den här och alla andra uppgifter på tentan gäller: Om du ska anropa en funktion från en tidigare uppgift, 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 9 (3 p)

Skriv en funktion som heter hinner, som tar data om ett rymdskepp samt en postion som argument, och som avgör om rymdskeppet hinner fram till den positionen i den här spelrundan.

Jämför rymdskeppets aktuella position med den angivna punkten, och beräkna hur långt det är mellan dem. Om avståndet är mindre än eller lika med rymdskeppets maxfart, hinner skeppet fram, och funktionen ska returnera ett sant värde. Annars hinner skeppet inte fram, och funktionen ska returnera ett falskt värde.

Tips: Avståndet a mellan två punkter (x = x1, y = y1) och (x = x2, y = y2) ges av formeln

En formel: a = ...

Uppgift 10 (5 p)

Textfilen namn.txt innehåller ett stort antal rader med namn på personer:
Olle
Lotta
Sten
Olle
...
Varje namn består av ett enda ord utan mellanslag, och kan vara högst tio bokstäver långt. Som synes kan samma namn förekomma flera gånger.

Programmet ska fråga användaren efter ett namn, och sen berätta hur många gånger det namnet förekommer i filen.

Uppgift 11 (5 p)

Skriv ett program som slumpar fram 1000 tärningskast mellan 1 och 6, och lagrar dem i en array. Sen ska programmet berätta hur många förekomster av varje utfall som det blev. Exempel på utmatning:
Antal 1: 159
Antal 2: 175
Antal 3: 162
Antal 4: 177
Antal 5: 153
Antal 6: 174
Ledtråd: Funktionen rand ger ett slumpmässigt heltal, och funktionen srand initierar slumpsekvensen.

Uppgift 12 (5 p)

Skriv ett C-program som först läser in data om två rymdskepp, med hjälp av funktionen las_rymdskepp, och sen sparar det snabbaste av dem på en fil. Välj själv om det ska vara en text- eller binärfil. Tala om vilket du valde.

Glöm inte att tala om vilket du valde!

Uppgift 13 (5 p)

Skriv ett C-program som läser in data om rymdskepp (högst hundra stycken) från användaren, med hjälp av funktionen las_rymdskepp. Sen ska programmet tala om hur många krockar som inträffat.

Välj själv hur användaren ska avsluta inmatningen, dvs hur man anger att man inte vill mata in fler rymdskepp, och beskriv vilket sätt du valde.

Ledtråd: Man måste jämföra varje rymskepp med vart och ett av de andra rymdskeppen, gärna med hjälp av funktionen krock, för att avgöra om de krockat. Det betyder att man måste spara alla de inlästa rymdskeppen, till exempel i en array, och sen gå igenom dem.

Glöm inte att beskriva hur inmatningen avslutas!

Uppgift 14 (5 p)

Skriv ett program som läser in personnummer på formen ÅÅMMDD-SSSS, med ett personnummer per rad, upprepat tills användaren ger en tom rad.

Därefter ska programmet ange i vilken månad som de flesta av de inmatade personerna fyller år.

Exempel på hur en programkörning skulle kunna se ut:

Ange ett personnummer (avsluta med tom rad): 631211-1658
Ange ett personnummer (avsluta med tom rad): 451019-2270
Ange ett personnummer (avsluta med tom rad): 811214-3360
Ange ett personnummer (avsluta med tom rad): 821001-6720
Ange ett personnummer (avsluta med tom rad): 851001-2273
Ange ett personnummer (avsluta med tom rad): 
Flest personer var födda i månad nummer 10.