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





Tentamen i

Programmering C

för PA1 m fl

onsdag 15 mars 2006 kl 8: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å kursens hemsida senast måndag 27 mars 2006.
Visning och frågestund: Onsdag 29 mars 2006 kl 12:00-12:30 i mitt rum (T2220).
Efter visningen kan tentorna hämtas på expeditionen.
Examinator och jourhavande: Thomas Padron-McCarthy, telefon 0707-347013.




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)

Skriv formeln nedan som en tilldelningssats i C.

En formel: z = ...

Uppgift 2 (1 p)

Vilka värden har följande uttryck?

a) 1 + 2 * 3 + 4 % 5

b) 1 + 2 * (3 + 4) % 5

Uppgift 3 (1 p)

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

i = 3;
while (i < 10) {
    if (i < 4 || i == 8)
        i += 3;
    else
        i++;
}

Uppgift 4 (1 p)

Den här datatypen avbildar länder. Varje land har ett namn, ett invånarantal, och en landyta som anges i kvadratkilometer.

struct Land {
   char namn[30 + 1]; // Landets namn ("+1" är för strängavslutningstecknet)
   int befolkning;    // Landets invånarantal
   float landyta;     // Landets landyta (i kvadratkilometer)
};

Definiera en variabel av denna typ och initiera den med namnet Sverige, invånarantalet 9001774 och landytan 410934.

Uppgift 5 (1 p)

x och y är två variabler som kan innehålla heltal:

int x;
int y;

Skriv de programrader som behövs för att byta plats på innehållet i x och y. Om vi till exempel antar att x innehåller 3 och y innehåller 17, så ska x alltså sen innehålla 17 och y ska innehålla 3.

Uppgift 6 (2 p)

Skriv en funktion som heter datum_ok, som tar ett datum i form av ett åttasiffrigt positivt heltal som parameter, och som returnerar värdet 1 om heltalet kan vara ett riktigt datum, och 0 om det inte kan vara det.

De kontroller man ska göra är att månaden är mellan 1 och 12, och att dagen är mellan 1 och 31. (Man behöver inte bry sig om att vissa månader har färre än 31 dagar.) Exempel:

Så här ser funktionshuvudet ut:
int datum_ok(int datumet);

Uppgift 7 (2 p)

Skriv en funktion som heter visa_datum, som skriver ut ett datum på skärmen. Funktionen tar datumet som parameter i form av ett åttasiffrigt positivt heltal. Den ska första anropa datum_ok för att kontrollera om datumet är riktigt, och om det inte är det ska den skriva ut Felaktigt datum. Exempel: Så här ser funktionshuvudet ut:
void visa_datum(int datumet);

Uppgift 8 (2 p)

Skriv en funktion som heter las_datum, som läser in ett datum från användaren i form av dag, månadsnummer och år, och som returnerar det i form av ett åttasiffrigt heltal. Funktionen ska skriva ut lämpliga ledtexter på standardutmatningen, och läsa in data från standardinmatningen (som normalt är kopplad till tangentbordet). Om datumet inte var ett tillåtet datum enligt funktionen datum_ok, ska funktionen fråga efter ett nytt datum, ända tills användaren matar in ett korrekt datum.

Så här ser funktionshuvudet ut:

int las_datum();

Uppgift 9 (2 p)

Skriv en funktion som heter visa_land, och som visar ett lands data (enligt uppgift 4 ovan) på skärmen. Den ska alltså skriva ut landets uppgifter, med lämpliga ledtexter, på standardutmatningen. Så här ser funktionshuvudet ut:

void visa_land(struct Land landet);

Uppgift 10 (2 p)

Skriv en funktion som heter las_land, och som läser in en lands data (enligt uppgift 4 ovan). 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 Land las_land();

eller så här:

void las_land(struct Land* p);

Uppgift 11 (5 p)

Skriv ett program som börjar med att fråga efter dagens datum, och sen läser in det med hjälp av funktionen las_datum. Därefter ska programmet fråga efter hur många datum det ska behandla, och sedan läsa in dem ett efter ett, fortfarande med las_datum, och lagra dem i en vektor.

Programmet ska kunna hantera upp till 10 datum i vektorn, och om användaren anger ett större antal än så, ska programmet avbrytas med ett rättvisande och informativt felmeddelande.

Avslutningsvis ska programmet skriva ut alla datum i vektorn som ligger i framtiden (alltså efter dagens datum). Använd funktionen visa_datum för utskrifterna.

Uppgift 12 (5 p)

Skriv ett spel som fungerar så här: Ledtråd:

Använd anropet rand() för att få ett stort, slumpmässigt heltal. Innan man kan använda den funktionen, måste slumptalsgeneratorn initieras, till exempel med anropet srand(time(NULL));

Uppgift 13 (5 p)

Skriv ett program som läser in länder med hjälp av funktionen las_land, och sparar dem på en binärfil. Filen ska heta lander.dat. Programmet ska läsa länder, och spara dem på binärfilen, ända tills användaren matar in ett land som har noll som både yta och folkmängd. (Det landet ska inte sparas på filen.)

Uppgift 14 (5 p)

Skriv ett program som läser igenom binärfilen lander.dat från uppgiften ovan, och som skriver ut de fyra länder som har: Använd funktionen visa_land för utskrifterna.

Uppgift 15 (5 p)

En pappersmaskin, som används för att tillverka papper, är en stor och komplicerad maskin. För att hålla koll på papperstillverkningen mäter man temperaturer på ett antal ställen inuti maskinen. Temperaturerna sparas på en textfil.

Textfilen heter temperaturer.txt, och varje rad innehåller tre tal: tidpunkt (ett heltal som anger tiden, mätt i sekunder sedan maskinen senast startades), givarnummer (ett heltal som anger platsen som temperaturen kommer från), samt temperaturen (ett reellt tal).

Exempelvis kan en rad se ut så här:

7292 19 98.16

Den raden säger att drygt två timmar från det att maskinen startades så var temperaturen på plats nummer 19 i maskinen 98.16 grader.

Temperaturerna ligger i tidsordning på filen. Det finns 100 olika temperaturmätställen i maskinen, numrerade från 1 till 100.

Skriv ett program som läser textfilen, och som skriver ut medeltemperaturen för vart och ett av de hundra temperaturmätställen. Utmatningen ska bestå av en rad för varje mätställe, med mätställets nummer och dess medeltemperatur.