Programmering grundkurs och Programmering C
för D1 m fl, även distanskursen
torsdag 21 augusti 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 40.
För godkänt betyg (3 respektive G) krävs 20 poäng. |
Resultat och lösningar: | Meddelas via e-post eller på kursens hemsida, http://basen.oru.se/kurser/c/2013-2014-p2/, senast torsdag 11 september 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 + 2 * 3
b) 1 - 2 - 3
c) 1 + 2 / 3
x = 1; y = 2; z = 3; for (x = 0; x < 1000; ++x) y = z; x = 1; while (x < 3) { x = x + 1; z = x; }
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 ÅÄÖ, eller att fönstret med programkörningen försvinner när programmet avslutas. |
ge "xbrxhxm" som resultat.replace_char("abraham", 'a', 'x')
ska ge "ABC.bcdd" som resultat. 'A' och 'a' räknas alltså som olika tecken.replace_char("ABCabcdd", 'a', '.')
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. |
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. |
a) (2p) strlen
b) (3p) gets
c) (1p) getchar
I ett program som ska kunna spela luffarschack behöver man hålla reda på spelplanen, och kunna skriva ut den. Ett sätt att lagra spelplanen är som en array av tecken, där tecknen 'x' och 'o' betyder kryss och ringar, och tecknet '.' betyder tom ruta.
a) (2p) Gör de definitioner som behövs för att lagra spelplanen. Gör planen ordentligt stor, till exempel 50x50 rutor.
b) (5p) Skriv en C-funktion som skriver ut spelplanen! Bara den del av planen som används ska skrivas ut.
Exempel: Om hela planen är 20x50 rutor, och bara innehåller fyra markeringar i mitten, vill man inte att den ska skrivas ut så här:
Skriv i stället bara ut den intressanta biten i mitten:.................................................. .................................................. .................................................. .................................................. .................................................. .................................................. .................................................. ......................xx.......................... .......................o.......................... ........................o......................... .................................................. .................................................. .................................................. .................................................. .................................................. .................................................. .................................................. .................................................. .................................................. ..................................................
xx. .o. ..o
Skriv ett fullständigt C-program som låter användaren mata in två heltal, och som sen öppnar och läser binärfilen, och slutligen skriver ut hur många tal som låg i intervallet mellan (och inklusive) de två inmatade talen.
Antag att filen "datafil.bin" innehåller följande heltal:
Då kan programkörningen till exempel se ut så här, med användarens inmatning understruken:3 5 20 12 24 -7 12 8 0 34 -14
Den enda felkontroll du behöver göra är att kontrollera att filen gick att öppna, och annars skriva ut ett felmeddelande och avsluta programmet.Skriv nedre gränsen (ett heltal): 11 Skriv övre gränsen (ett heltal): 20 Filen innehöll 3 tal mellan 11 och 20.
Skriv ett fullständigt C-program som läser textfilen, och som sen skriver ut orden i omvänd ordning. Med ett "ord" menar vi en följd av icke-blanka tecken, som omges av blanka tecken, eller av filens början eller slut. (Det betyder att du kan använda fscanf med argumentet "%s" för att läsa orden!)
Inga ord är längre än 15 bokstäver. Det finns högst 100 ord i filen. Programmet behöver inte bry sig om att dela upp utskriften i rader.
Den enda felkontroll du behöver göra är att kontrollera att filen gick att öppna, och annars skriva ut ett felmeddelande och avsluta programmet.
Exempel: Om filen innehåller texten:
kan det ge utskriften:Visst gör det ont när kroppar brister, men inte stoppar det Arnold inte!
inte! Arnold det stoppar inte men brister, kroppar när ont det gör Visst
Man ska först mata in maxpoängen på de olika frågorna, och avsluta med noll. Alla maxpoängen är heltal. Därefter ska programmet slumpa fram poängen på varje enskild uppgift. Poängen på en uppgift kan variera från noll till maxpoängen på uppgiften. Det är bara hela poäng, inga decimaler. Dessutom ska programmet skriva ut summan av de framslumpade poängen. Här är ett exempel på hur en programkörning skulle kunna se ut, med användarens inmatning understruken:
Tentan kan inte ha mer än tjugo uppgifter.Ange poängen på uppgifterna. Avsluta med talet noll. 1 2 3 3 3 6 7 5 5 5 0 0 0 2 3 0 5 1 4 3 5 Summa: 23
Tips: Använd anropet rand() för att få ett stort, slumpmässigt heltal. Innan man kan använda den funktionen, bör slumptalsgeneratorn initieras, till exempel med anropet srand(time(NULL));