Ö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 8 mars 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 poäng.
Resultat och lösningar: Meddelas via e-post eller på kursens hemsida, http://www.aass.oru.se/~tpy/c/2007-2008-p2/, senast lördag 29 mars 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) 8 - 4 - 2 - 1

b) 8 - 4 * 2 - 1

c) 8 / 4 * 2 + 1

Uppgift 2 (1 p)

i, k och n är heltalsvariabler. Ange värdet på i, k och n då följande kod har körts.

i = 0;
k = 1;
n = 5;
while (i < n) {
    if (i > 2)
        i = i + 10;
    else
        i++;
    k++;
}

Uppgift 3 (1 p)

x och y är flyttalsvariabler av typen float. Skriv de kodrader som behövs för att byta plats på innehållet i dessa två variabler.

Uppgift 4 (1 p)

Skriv en funktion som heter max, som tar två heltal som argument, och som returnerar det största av dem.

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ärdena på x, y och R, beräknar uttrycket, och till sist skriver ut uttryckets värde. Beräkningarna ska ske med flyttal.

Om deluttrycket xyR ä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.

Uppgift 6 (1 p)

Den amerikanske presidentkandidaten Barack Sidney McBama ska samla ihop pengar till sin presidentvalskampanj. För att komma ihåg vilka han sen är skyldig gentjänster, måste han hålla reda på alla donationer till kampanjen.

Vi behöver en posttyp (med C-terminologi en struct) som ska beskriva en donation. Posten ska innehålla följande saker:

Definiera posttypen som ska användas för att lagra data om en donation. Den ska heta struct Donation.

Uppgift 7 (1 p)

Definiera en variabel av typen struct Donation och initiera den med data om en donation på 1000 dollar från J. R. Ewing, som bor i Texas.

Uppgift 8 (2 p)

Vi vill kunna visa donationsposternas innehåll på skärmen. Skriv en funktion som heter visa_donation, som skriver ut ett donation (som i uppgifterna ovan) på skärmen. Funktionen ska ta donationsposten som parameter. Exempel på hur en utskrift skulle kunna se ut:
Belopp: 100 dollar
Givare: Caitlin Upton
Stat: South Carolina

Uppgift 9 (2 p)

Skriv en funktion som heter las_donation, och som läser in data om en donation. 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 om du vill att funktionshuvudet ska se ut så här:

struct Donation las_donation()

eller så här:

void las_donation(struct Donation *p)

Uppgift 10 (2 p)

Skriv en main-funktion som har två lokala variabler av typen struct Donation, och som läser in data om två donationer till dessa variabler med hjälp av funktionen las_donation. Avslutningsvis ska den använda funktionen visa_donation för att skriva ut data om båda donationerna.

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 exempel 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 11 (4 p)

Skriv ett C-program som låter användaren mata in donationer, och som sparar dem på en fil. Det ska läsa donationer ända tills användaren avslutar genom att mata in en donation på 0 dollar. Programmet ska anropa funktionen las_donation.

Uppgift 12 (5 p)

Skriv ett C-program som läser filen från uppgiften ovan, och dels talar om den sammanlagda summan av alla donationerna, och dels skriver ut den största donationen, med hjälp av funktionen visa_donation.

Uppgift 13 (4 p)

Skriv ett C-program som läser in två rader med text, och sen skriver ut den längsta av dem. 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 100 tecken (plus radslutstecknet).

Uppgift 14 (5 p)

MacBook Air
Fig. 1. MacBook Air.

Örebro universitet ska köpa MacBook Air till alla studenter. Denna dator är så tunn att det inte får plats någon nätverkskontakt, utan den har bara trådlöst nätverk. Därför behövs fler basstationer för trådlöst nät. För att spara pengar ska man köpa en enda stor basstation. Men var ska den sitta?

En lunchrast, strax efter att de nya datorerna delats ut, går man därför runt och antecknar var alla studenter sitter. Deras positioner noteras som en x- och en y-koordinat, i något koordinatsystem. Den bästa platsen för basstationen hittar man genom att beräkna medelvärdet av alla dessa koordinater. (Summera alla x-koordinater, och dela med antalet. Detta ger x-koordinaten för basstationens placering. Gör sedan samma sak för y-koordinaterna.)

Skriv ett C-program som låter användaren mata in x- och y-koordinater för studenternas positioner. Koordinaterna ska hanteras som flyttal. Inmatningen avslutas genom att användaren anger punkten (0, 0). Därefter ska programmet tala om den sökta placeringen för basstationen.

Uppgift 15 (6 p)

Läraren är både trött och lat, och vill inte rätta tentor. Inte heller vill han räkna samman kursvärderingar. Skriv därför ett program som slumpar fram resultat för kursvärderingen.

Det finns 10 frågor på kursvärderingen, som alla kan besvaras med ett betyg på 1 (dåligt) till 4 (bra). Programmet ska fråga efter antalet inlämnade kursvärderingar. Utmatningen från programmet ska bestå av (det framslumpade) utfallet på de olika frågorna, bestående av antalet av varje betyg (1-4) och medelvärdet.

Exempel på hur utmatningen från programmet skulle kunna se ut:

Ange antalet kursvärderingar: 10
Fråga 1, antal 1:or: 5, antal 2:or: 1, antal 3:or: 1, antal 4:or: 3, medelvärde: 2.20
Fråga 2, antal 1:or: 8, antal 2:or: 1, antal 3:or: 0, antal 4:or: 1, medelvärde: 1.40
Fråga 3, antal 1:or: 7, antal 2:or: 1, antal 3:or: 1, antal 4:or: 1, medelvärde: 1.60
Fråga 4, antal 1:or: 3, antal 2:or: 0, antal 3:or: 5, antal 4:or: 2, medelvärde: 2.60
Fråga 5, antal 1:or: 8, antal 2:or: 1, antal 3:or: 0, antal 4:or: 1, medelvärde: 1.40
Fråga 6, antal 1:or: 0, antal 2:or: 7, antal 3:or: 2, antal 4:or: 1, medelvärde: 2.40
Fråga 7, antal 1:or: 2, antal 2:or: 4, antal 3:or: 0, antal 4:or: 4, medelvärde: 2.60
Fråga 8, antal 1:or: 6, antal 2:or: 1, antal 3:or: 2, antal 4:or: 1, medelvärde: 1.80
Fråga 9, antal 1:or: 9, antal 2:or: 0, antal 3:or: 0, antal 4:or: 1, medelvärde: 1.30
Fråga 10, antal 1:or: 2, antal 2:or: 5, antal 3:or: 1, antal 4:or: 2, medelvärde: 2.30

Summan av antalet 1:or, 2:or, 3:or och 4:or på varje fråga måste stämma med det angivna antalet kursvärderingar, och medelbetyget ska vara rätt.

Använd anropet rand() för att få ett stort, slumpmässigt heltal. Innan man använder den funktionen första gången i programmet, bör slumptalsgeneratorn initieras, till exempel med anropet srand(time(NULL));