Ö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 22 november 2008 kl 08: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 20 poäng.
Resultat och lösningar: Meddelas via e-post eller på campuskursens hemsida, http://www.aass.oru.se/~tpy/c/2008-2009-p2/, senast lördag 13 december 2008.
Återlämning av tentor: Efter att resultatet meddelats 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.0 / 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.

    b = 1;
    a = 5;
    while (a > b) {
        b = b + 2;
        --a;
        c = a * b;
    }

Uppgift 3 (2 p)

Skriv en funktion som heter max3, som tar tre heltal som argument, och som returnerar det största av dessa tre tal.

Uppgift 4 (4 p)

a) (2p) Skriv en funktion som heter bytplats, som byter plats på innehållet i två heltalsvariabler.

b) (1p) Variablerna filip och fredrik är heltalsvariabler. Skriv ett anrop till funktionen bytplats, som gör att variablernas innehåll byter plats.

c) (1p) Bör man verkligen kalla variabler för filip och fredrik? Ge exmepel på en situation där det kan vara motiverat att kalla ett par variabler så.

Uppgift 5 (4 p)

Vi vill kunna beräkna följande uttryck:

En formel

Skriv därför ett komplett C-program som först läser in värden på x och y, beräknar uttrycket, och till sist skriver ut uttryckets värde. Beräkningarna ska ske med flyttal.

Om deluttrycket x-y är noll, eller om hela deluttrycket under roten är mindre än noll, går uttrycket inte att beräkna. I så fall ska programmet inte försöka beräkna uttrycket, utan det ska i stället skriva ut ett informativt och rättvisande felmeddelande om saken.

Scenario till de följande uppgifterna

En penna som man kan skriva på tavlan med
Fig. 1: En penna som man kan skriva på tavlan med.

Universitetslärare skriver ganska mycket på tavlan. Ibland ligger det tavelpennor i klassrummet när man kommer dit, och ibland har läraren med sig egna pennor. För att spara pengar ska Örebro universitet nu strukturera upp användningen av pennor, och vi ska förstås göra ett C-program för att hålla reda på pennorna.

Uppgift 6 (2 p)

Skapa en posttyp som heter struct Penna, och som innehåller data om en penna.

Varje penna ska ha ett unikt nummer, som är ett heltal, och som också skrivs på en etikett på pennan. Dessutom har varje penna ett modellnamn, till exmepel Artline 517, och en färg, till exmepel svart. Pennan har också en vikt mätt i gram, och ett antal föreläsningar som den (hittills) använts på. Vikten är ett flyttal, och antalet föreläsningar är ett heltal.

Definiera posttypen struct Penna.

Skapa också ett alias med hjälp av typedef, som bara heter Penna.

Uppgift 7 (1 p)

Definiera en variabel av typen Penna och initiera den med data om penna nummer 2096, som är av modellen Edding 360. Den pennan är röd, den väger 103,16 gram, och den har använts på fyra föreläsningar.

I den här och alla andra uppgifter på tentan gäller: Om du ska använda något från en tidigare uppgift eller deluppgift, till exmepel anropa en funktion som skrevs i den tidigare uppgiften, så behöver du inte skriva samma kod igen. Du får också göra uppgiften även om du inte gjort den tidigare uppgiften.

Uppgift 8 (2 p)

Vi vill kunna visa pennposternas innehåll på skärmen. Skriv en funktion som heter visa_penna, som skriver ut en penna. Funktionen ska ta pennposten som parameter. Exmepel på hur en utskrift skulle kunna se ut:
Nummer: 2096
Modell: Edding 360
Färg: röd
Vikt: 103.16 gram
Antal föreläsningar: 4

Uppgift 9 (3 p)

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

Du får själv välja hur funktionshuvudet ska se ut. Här är några förslag:

struct Penna las_penna()
Penna las_penna()
void las_penna(struct Penna *p)
void las_penna(Penna *p)

Uppgift 10 (2 p)

Skriv en main-funktion som har två lokala variabler av penntypen från uppgifterna ovan, och som läser in data om två pennor till dessa variabler med hjälp av funktionen las_penna. Avslutningsvis ska den använda funktionen visa_penna för att skriva ut den tyngsta av de två pennorna.

Uppgift 11 (3 p)

Skriv en annan main-funktion, som innehåller en array ("fält") av tio pennposter, och som läser in tio pennor med las_penna och lagrar i den arrayen. Sedan ska den fråga användaren efter numret på en penna, och skriva ut alla data om den pennan med hjälp av funktionen visa_penna.

Uppgift 12 (5 p)

Skriv ännu en main-funktion, som upprepat läser in en penna med hjälp av funktionen las_penna, ända tills vi matar in en penna med nummer 0. Därefter ska programmet skriva ut:
1) den sammanlagda vikten av alla pennorna
2) den tyngsta pennan (med hjälp av funktionen visa_penna), och
3) den penna som varit med på flest föreläsningar (också med hjälp av funktionen visa_penna).

Om det finns flera pennor som är lika tunga som den tyngsta, spelar det ingen roll vilken av dessa som man skriver ut. Samma sak med den eller de pennor som varit med på flest föreläsningar.

Uppgift 13 (6 p)

En textfil som heter pennor.txt innehåller data om universitetets alla pennor. Det finns flera tusen pennor. Varje uppgift står på en egen rad, så en penna tar upp fem rader. Här är ett exmepel på hur en fil med två pennor kan se ut:

2096
Edding 360
röd
103.16
4
2014
Artline 517
svart
48.1
17

Nu vill vi sortera ut alla pennor som använts på mer än tio föreläsningar. Skriv ett C-program som läser filen pennor.txt, och som (på standardutmatningen) skriver ut numren på de pennor som använts på mer än tio föreläsningar. Programmet ska dessutom skapa en ny textfil, kallad ny-pennor.txt, som innehåller de pennor som använts på högst tio föreläsningar.

Tanken är alltså att man ska kasta de pennor vars nummer skrivs ut på standardutmatningen, och att den nya textfilen ska innehålla de pennor som vi sen har kvar.

Med exmepelfilen ovan ska programmet skriva ut nummer 2014, och filen ny-pennor.txt ska innehålla data om penna nummer 2096.

Uppgift 14 (4 p)

Läraren skriver ibland lite för snabbt på sitt tangentbord, och gör ofta fel på ordet exempel så att det blir exmepel i stället. Skriv därför en C-funktion som går igenom en sträng och ersätter alla förekomster av teckenföljden exmepel med exempel.