Programmering grundkurs och Programmering C
för D1 m fl, även distanskursen
onsdag 4 juni 2014
Gäller som tentamen för:
DT1029 Datateknik A, Programmering grundkurs, provkod 0100
DT1030 Datateknik A, Tillämpad datavetenskap, provkod 0410
DT1006 Datateknik A, Programmering C, distans, provkod 0100
Hjälpmedel: | Inga hjälpmedel. |
Poängkrav: |
Maximal poäng är 35.
För godkänt betyg (3 respektive G) krävs 17 poäng. |
Resultat och lösningar: | Meddelas via e-post eller på kursens hemsida, http://basen.oru.se/kurser/c/2013-2014-p2/, senast onsdag 25 juni 2014. |
Återlämning av tentor: | Efter att resultatet meddelats kan tentorna hämtas på universitetets centrala tentamensutlämning. |
Examinator och jourhavande: | Thomas Padron-McCarthy, telefon 070-73 47 013. (Läraren är utomlands och går kanske inte att nå via telefon.) |
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 |
int rand(void); void srand(unsigned int seed); void *malloc(size_t size); void *realloc(void *ptr, size_t size); void free(void *ptr); void exit(int status); void qsort(void *base, size_t nmemb, size_t size, int(*compar)(const void *, const void *));
FILE *fopen(const char *path, const char *mode); int fclose(FILE *stream); int getc(FILE *stream); int getchar(void); int ungetc(int c, FILE *stream); char *fgets(char *s, int size, FILE *stream); char *gets(char *s); int putc(int c, FILE *stream); int printf(const char *format, ...); int fprintf(FILE *stream, const char *format, ...); int sprintf(char *str, const char *format, ...); int snprintf(char *str, size_t size, const char *format, ...); int scanf(const char *format, ...); int fscanf(FILE *stream, const char *format, ...); int sscanf(const char *str, const char *format, ...); size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream); size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
size_t strlen(const char *s); char *strcpy(char *dest, const char *src); char *strncpy(char *dest, const char *src, size_t n); int strcmp(const char *s1, const char *s2); int strncmp(const char *s1, const char *s2, size_t n); char *strcat(char *dest, const char *src); char *strncat(char *dest, const char *src, size_t n); char *strstr(const char *haystack, const char *needle); void *memmove(void *dest, const void *src, size_t n);
int isalnum(int c); int isalpha(int c); int isblank(int c); int isdigit(int c); int islower(int c); int isprint(int c); int ispunct(int c); int isspace(int c); int isupper(int c);
double sqrt(double x); double pow(double x, double y);
a) 1 + 1 * 1
b) 1 + 1 / 1
c) (1 * 1) / 1
x = 1.1; y = 2.2; z = 3.3; t = x + y; while ( x < t) { x = x + 1; } if (x < t) z = z + 1; else z = z - 1;
Skriv ett komplett C-program (med #include och allt) som läser in en längd angiven i tum, och skriver ut den, men nu angiven i centimeter.
I den här och alla andra uppgifter på tentan gäller:
Normalt är felhantering en stor del av ett program. Vad ska till exempel hända om användaren skriver Kalle när hon egentligen borde mata in ett tal? Här behövs dock ingen felhantering, om så inte särskilt efterfrågas i uppgiften. |
I den här och alla andra uppgifter på tentan gäller:
Man kan strunta i detaljer som bara behövs just när man utvecklar konsolprogram i Visual Studio, som konstiga teckenkoder för ÅÄÖ, och att fönstret med programkörningen försvinner när programmet avslutas. |
Skriv ett komplett C-program (med #include och allt) som läser in kroppsvikten, och talar om hur många tabletter man får ta per dag.
Det finns ett fel i den. Vad är felet, och vad gör funktionen egentligen?/* Sorterar heltalsarrayen "a" med längden "length" i stigande ordning */ void sort_array(int a[], int length) { int sorted, in_rest, smallest_in_rest, temp; for (sorted = 0; sorted < length - 1; ++sorted) { smallest_in_rest = sorted; for (in_rest = sorted + 1; in_rest < length; ++in_rest) { if (a[in_rest] > a[smallest_in_rest]) { smallest_in_rest = in_rest; } } temp = a[sorted]; a[sorted] = a[smallest_in_rest]; a[smallest_in_rest] = temp; } } /* sort_array */
I den här och alla andra uppgifter på tentan gäller:
Om du behöver använda något från en tidigare uppgift eller deluppgift, till exempel utnyttja en datatyp eller 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. |
Tätorter | ||||||
---|---|---|---|---|---|---|
Kod | Namn | Kommun | Folkmängd | |||
336 | Stockholm | Stockholms kommun | 1372565 | |||
6188 | Örebro | Örebro kommun | 107038 | |||
6076 | Odensbacken | Örebro kommun | 1374 | |||
6164 | Åbytorp | Kumla kommun | 755 | |||
.... | .... | .... | .... |
Varje tätort har en unik kod i form av ett heltal, ett (inte nödvändigtvis unikt) namn, den ligger i en viss kommun, och den har en folkmängd. Det längsta namnet är 35 tecken långt
a) (2p)
Skapa datatypen struct Tatort, som ska användas för att lagra data om en tätort enligt ovan.
b) (1p)
Definiera en variabel som har datatypen struct Tatort, och initiera den med data om Odensbacken enligt exemplet ovan.
c) (2p)
Vi vill kunna visa data om tätorter på skärmen. Skriv därför funktionen visa_tatort, som tar en tätort (eller en pekare till en tätort, om du hellre vill det) som parameter, och skriver ut tätortens uppgifter, med lämpliga ledtexter, på standardutmatningen.
d) (3p)
Skriv funktionen las_tatort, som läser in data om en tätort. Funktionen ska skriva ut lämpliga ledtexter på standardutmatningen, läsa in data från standardinmatningen (som normalt är kopplad till tangentbordet), och på lämpligt sätt returnera den inlästa tätortens data till den anropande funktionen.
I den här och alla andra uppgifter på tentan gäller:
Normalt ska man aldrig använda funktionen gets, utan i stället till exempel fgets. Här kan du dock använda gets. |
e) (2p)
Skriv en main-funktion som har två variabler av typen struct Tatort, som läser in data om två tätorter till dessa variabler med hjälp av funktionen las_tatort, och som slutligen använder visa_tatort för att skriva ut data om den av tätorterna som har det längsta namnet.
Vad ger vart och ett av försöken för resultat?
a)
int rad = 0, kolumn = 0; while (rad < 5) { while (kolumn < 10) { printf("*"); ++kolumn; } printf("\n"); ++rad; }
b)
int rad, kolumn; for (rad = 0; rad <= 5; ++rad) { for (kolumn = 0; kolumn <= 10; ++kolumn) { printf("*"); } printf("\n"); }
c)
int rad, kolumn; for (kolumn = 1; kolumn <= 5; ++kolumn) { for (rad = 1; rad <= 10; ++rad) { printf("*"); } printf("\n"); }
Om någon fil inte går att öppna, ska ett felmeddelande skrivas ut och programmet ska avslutas.
Här behövs ingen felhantering.