Tentamen *:58/ID100V Programmering i C Exempel 3



Relevanta dokument
Skriv i mån av plats dina lösningar direkt i tentamen. Skriv ditt kodnummer längst upp på varje blad.

Agenda. Arrayer deklaration, åtkomst Makron Flerdimensionella arrayer Initiering Strängar Funktioner och arrayer. Övningar nu och då

Johan Karlsson Datavetenskap för teknisk kemi, 10p, moment 1 Datavetenskap Umeå Universitet. Tentamen

Funktionspekare, inledning: funktionsanropsmekanismen. Anrop via pekare

Strängar. Strängar (forts.)

Övning från förra gången: readword

Lösningar till uppgifterna sätts ut på kurssidan på nätet i dag kl Omtentamen i Programmering C, Fri, Kväll,

Poster ( structar ) Postdeklarationer

TDIU01 - Programmering i C++, grundkurs

SP:PROG3 HT12 Tenta

Pekare och arrayer. Indexering och avreferering

Lösningar till uppgifterna sätts ut på kurssidan på nätet i dag kl Tentamen i Programmering C, Fri, Kväll,

Tentamen i Programmering grundkurs och Programmering C

#include <stdio.h> #include <string.h>

Länkade listor kan ingå som en del av språket, dock ej i C Länkade listor är ett alternativ till:

HI1024, Programmering, grundkurs, 8hp KTH STH TENTAMEN. HI1024:TEN2 - Praktisk tentamen Tid: Fredagen den 21 oktober 2011,

KTH STH TENTAMEN. HI1024:TEN2 - Praktisk tentamen Tid: 8-13, den 18 februari 2012

Abstrakta datastrukturer

Tentamen i Programmering grundkurs och Programmering C

Programmering, grundkurs, 8.0 hp HI1024, HI1900 etc., Tentamen TEN1. Måndagen den 10 januari 2011,

tentaplugg.nu av studenter för studenter

Programmeringsteknik för Ingenjörer VT06. Föreläsning 10

Tentamen DE12, IMIT12, SYST12, ITEK11 (även öppen för övriga)

Tentamen *:85/2I4123 C

Tentamen i. för D1 m fl, även distanskursen. lördag 26 februari 2011

Tentamen i Programmering grundkurs och Programmering C

Tentamen i. för D1 m fl, även distanskursen. lördag 19 januari 2013

GU / Chalmers Campus Lindholmen Tentamen Programutveckling LEU 482 / TIG167

Föreläsning 4. Kö Implementerad med array Implementerad med länkad lista Djup kontra bredd Bredden först mha kö

Tentamen i Programmering grundkurs och Programmering C

Tentamen i Programmering grundkurs och Programmering C

Programmeringsteknik med C och Matlab

Föreläsning 11. Strängar

Lösningar till uppgifterna sätts ut på kurssidan och på WebCT (Gamla Tentor) i dag kl 19. Tentamen i Programmering C, 5p, Distans, övriga,

*Pekarvärden *Pekarvariabler & *

Inlämningsuppgift 1, Digsim

Tentamen i. Programmering i språket C

BINÄRA TRÄD. (X = pekarvärdet NULL): struct int_bt_node *pivot, *ny; X X X 12 X X 12 X X -3 X X

OBJEKTORIENTERAD PROGRAMVARUUTVECKLING. Övningstentamen 1

Lösningar till tentauppgifterna sätts ut på kurssidan på nätet idag kl 19. Omtentamen i Programmering C, 5p, fristående, kväll,

Tentamen i Programmering grundkurs och Programmering C

Programmera i C Varför programmera i C när det finns språk som Simula och Pascal??

HI1024 Programmering, grundkurs TEN

n Detta för att kunna koncentrera oss på n Tal: number? n Symboler: symbol? n Strängar: string? n Tecken: char? n Boolskt: boolean?

Uppgifter till praktiska tentan, del A. (7 / 27)

Programmering i C, 7,5 hp

Tentamen i Programmering

(Lösningsförslag finns sist i denna fil.)

C++ Funktioner 1. int summa( int a, int b) //funktionshuvud { return a+b; //funktionskropp } Värmdö Gymnasium Programmering B ++ Datainstitutionen

Tentamen i. Programmering i språket C

DAT043 Objektorienterad Programmering

Lämna in en ifylld kursvärdering tillsammans med tentan! Lösningar till uppgifterna sätts ut på kurssidan på nätet i dag kl

Tentamen i. för D1 m fl, även distanskursen. lördag 28 maj 2011

Exempel ( )

Lösningar till uppgifterna sätts ut på kurssidan på nätet i dag kl 13. Omtentamen i Programmering C, 5p, A1, D1, PA1, Fri,

Lösningar till uppgifterna sätts ut på kurssidan på nätet idag kl Omtentamen i Programmering C, 5p, A1, D1, E1, Fri, Pr1, Te/Ek1,

LÖSNINGSFÖRSLAG TILL Tentamen i objektorienterad programmering i C++ I

2 Pekare och dynamiska variabler.

Föreläsning 12. struct

Tentamen i Grundläggande programmering STS, åk 1 lördag

En kort text om programmering i C.

BMI = (vikt i kg) / (längd i m) 2. Lösningsförslag

Grundläggande programmering med C# 7,5 högskolepoäng

Tentamen ges för: Tentamensdatum: Tid:

Det finns många flaggor till g++,

Den som bara har en hammare tror att alla problem är spikar

Föreläsning 6: Introduktion av listor

Fortsä'ning Pekare. Ulf Assarsson. Originalslides av Viktor Kämpe

Föreläsning 5. Träd Binära träd Binärt sökträd som ADT Implementering av binärt sökträd Travestera binärt sökträd Sökning Insättning/borttagning

Övning 3 i 2D1324. Strukturering h filer deklaration vs definition Debuggning gdb Preprocessorn #define assert(s) FILE LINE Länkning

Tecken & Strängar. Kapitel 7

Föreläsning 9. struct

Grundläggande C-programmering del 2 Pekare och Arrayer. Ulf Assarsson

Vad har vi lärt oss så här långt Vad är en sträng? Strängkonstanter. Att skriva ut och läsa in strängar. Att arbeta med strängar.

PROGRAMMERING-JAVA TENTAMINA

Kurskod D0010E Datum Skrivtid 5tim

TDDC74 Lab 04 Muterbara strukturer, omgivningar

HI1024 Programmering, grundkurs TEN

TENTAMEN I DATAVETENSKAP

Programmeringsteknik med C och Matlab

HI1024, Programmering, grundkurs, 8hp KTH STH TENTAMEN. HI1024:TEN1 - Teoretisk tentamen Tid: Torsdagen den 20 oktober 2011,

Datatyper och kontrollstrukturer. Skansholm: Kapitel 2) De åtta primitiva typerna. Typ Innehåll Defaultvärde Storlek

Grundläggande C-programmering del 2 Pekare och Arrayer. Ulf Assarsson

Tentamen i Objektorienterad Programmering 5p, Au, D, Fri, Pr,

tentamensdags och lab 3

TDDC74 Programmering: Abstraktion och modellering Tentamen, lördag 29 augusti 2015, kl 8 12

Laboration 3 HI1024, Programmering, grundkurs, 8.0 hp

Tentamen, EDAA10 Programmering i Java

TENTAMEN I PROGRAMMERING. På tentamen ges graderade betyg:. 3:a 24 poäng, 4:a 36 poäng och 5:a 48 poäng

Grundkurs i programmering, 6 hp (725G61) Dugga 2 tillfälle 2

Kompilatorer och interpretatorer

Operativsystem ID1200/06 (ID2200/06 6hp) Tentamen :00-18:00

Det finns en referensbok (Java) hos vakten som du får gå fram och läsa men inte ta tillbaka till bänken.

Lösningar till tentauppgifterna sätts ut på kurssidan på nätet idag kl

Programmering i C++ EDA623 Objektorienterad programutveckling. EDA623 (Föreläsning 5) HT / 33

Högskolan Dalarna sid 1 av 7 DI-institutionen Hans-Edy Mårtensson Sten Sundin

Föreläsning 13. In- och utmatning

TDDC74 Programmering: Abstraktion och modellering Tentamen, onsdag 19 oktober 2016, kl 14 18

Tentamen i. för D1 m fl, även distanskursen. fredag 13 januari 2012

Innehåll. Introduktion till objektorientering. OOP (objektorienterad programmering) Objekt, instanser, klasser

Transkript:

DSV Tentamen *:58/ID100V Sid 1(5) Tentamen *:58/ID100V Programmering i C Exempel 3 Denna tentamen består av fyra uppgifter som tillsammans kan de ge maximalt 22 poäng. För godkänt resultat krävs minst 14 poäng, för VG krävs minst 18 poäng. För KTH-studenter tillämpas A/B/C/D/E/F-skalan enligt betygskriterier på kursens webbsida. Observera: - skriv tydligt, oläsbar lösning medför 0 poäng - börja varje uppgift på nytt blad - skriv endast på ena sidan av pappret - skriv namn på varje inlämnat blad - redovisa eventuella antaganden (som givetvis inte får strida mot uppgiftstexten) - tänk på att det kan passa dig bättre att lösa uppgifterna i annan ordning Tillåtna hjälpmedel: - valfria medhavda böcker om programmering i C - medhavt häfte med kopior av föreläsningsbilder LYCKA TILL!

DSV Tentamen *:58/ID100V Sid 2 Uppgift 1 (Sammanlagt 6 poäng) Denna uppgift består av tre deluppgifter som vardera ger två poäng. Varje uppgift består av en liten C-programsnutt behäftat med ett fel samt en beskrivning av programsnuttens felaktiga beteende. Din uppgift är att I) ange vad felet är och II) ange hur felet skall rättas. Obs! att du för att få poängen skall rätta just detta fel, en omskrivning av programmet med andra konstruktioner duger inte. Obs! vidare att det i vissa fall kan krävas små ändringar på flera ställen i programsnutten för att rätta ett fel. Samtliga fel är av "klassisk" karaktär, som det varnats för i undervisningen och/eller i litteraturen. Det är inte fråga om syntaxfel, utan om felaktigheter som gör att programmet inte beter sig som det skall eller får exekveringsavbrott. a) Följande funktion är tänkt att kopiera en fil till en annan: #include <stdio.h> void copyfile(file *inf, FILE *outf){ char c; while ((c=getc(inf))!=eof) putc(c, outf); Funktionen har testats på flera system, på vissa går den in i en oändlig loop, på andra slutar den för tidigt vid kopiering av binärfiler. b) I följande program verkar det vara något fel på funktionen gevarden(). Funktionen skall fylla posten den får som argument med värden som den också får som argument, men den verkar inte åstadkomma någon förändring typedef struct _post{ char *namn; int data; Post; void gevarden(post p, char *n, int d){ p.namn=n; p.data=d; int main(void){ Post pst; gevarden(pst, "Jozef", 53); printf("%s %d\n", pst.namn, pst.data); return 0; Deluppgift c) på nästa sida!

DSV Tentamen *:58/ID100V Sid 3 c) Funktionen getstr() nedan skall användas för inläsning av strängar från stdin. Satserna i funktionen följer ett välkänt mönster och är inte felaktiga. Funktionen verkar fungera i mycket små testprogram, men vid användning i lite mer komplexa program verkar den inlästa strängen blir förstörd på något sätt. #include <stdio.h> #include <string.h> char *getstr(int max){ char buff[100]; char *cpek; fgets(buff, max, stdin); if (cpek=strchr(buff, '\n')) *cpek='\0'; else while(getchar()!='\n') ; return buff; Uppgift 2 (Variabla argumentlistor - 2 poäng) Skriv funktionen char *strconc(char *dest,...); som kan konkatenera ett godtyckligt antal strängar som den får som argument. Det sista argumentvärdet vid ett anrop till strconc skall vara NULL för att markera att argumenlistan är slut. Strängarna skall konkateneras i utrymmet dest. Det är anroparens ansvar att se till att dest kan rymma alla dessa konkatenerade strängar. strconc skall returnera dest. Exempel på anrop: strconc(buff, "Detta ", "var ", "lätt", NULL); Efter detta anrop skall buff innehålla strängen "Detta var lätt". Uppgift 3 (Otypat minne - 2 poäng) Skriv funktionen void *memmem(void *ptr1, void *ptr2, size_t n1, size_t n2); Denna funktion skall fungera på godtyckliga minnesareor på samma sätt som funktionen strstr() fungerar på strängar: den skall gå igenom arean som pekas ut av ptr1 och är n1 bytes stor och den skall söka där efter en byteföljd som är lika med den byteföljd som finns i arean som pekas ut av ptr2 och är n2 bytes stor. memmem() skall returnera en pekare till den första påträffade förekomsten av denna byteföljd, eller NULL om ingen sådan förekomst påträffas.

DSV Tentamen *:58/ID100V Sid 4 Uppgift 4 (Generella moduler, dynamiska arrayer, funktionspekare - 12 poäng) Denna uppgift handlar om att skriva (delar av) en återanvändbar modul som skall definiera datastrukturen Arrayset för representation av mängder av element av godtyckliga typer, samt visa vad en tillämpning behöver göra för att kunna använda modulen. Till skillnad från inlämningsuppgift 3 skall denna datastruktur kunna hantera godtyckliga data. Detta innebär att den bör implementeras med pekare till de data som stoppas in i mängden. En mängd är ju en datastruktur där det inte förekommer dubletter. T.ex. ska funktionen add() nedan inte förändra mängden om det i mängden redan finns ett element som är lika med det nya element som tillämpningen försöker addera. Men eftersom modulen ska kunna hantera element av godtyckliga typer så är det upp till tillämpningen att bestämma vad lika med betyder för dess objekt. Internt ska Arrayset (som själva namnet visar) vara implementerad som en omallokerbar array av pekare till tillämpningsobjekt. Du behöver inte ta hänsyn till några effektivitetsaspekter. a) Skriv modulen arrayset.c. Modulen beskrivs av nedanstående ofullständiga headerfil arrayset.h, där argumenten till funktionerna initset() och removeset() saknas - du ska själv bestämma vilka de ska vara. #ifndef ARRAYSET #define ARRAYSET typedef struct arrstruct *Arrayset; Arrayset initset(???????????); int addset(arrayset s, void *new); void removeset(arrayset s,???????????); #endif initset() ska skapa, initiera och returnera en Arrayset addset() ska stoppa in elementet new i Arrayset:et s om det inte redan finns ett element som är lika med new i s. Returnerar 1 vid lyckad operation, 0 annars. removeset() ska ta bort från Arrayset:et s alla element som uppfyller något villkor som tillämpningen anger. Du måste alltså komma på ett sätt för en tillämpning att ange ett villkor så att removeset() kan testa om elementen uppfyller villkoret. Du måste också se till att man kan förhindra att minnesläckage uppstår vid denna operation. Titta gärna på uppgift b) när du bestämmer hur argumenten till removeset ()ska se ut. Uppgift b) finns på nästa sida!

DSV Tentamen *:58/ID100V Sid 5 b) Antag en tillämpning där man hanterar namn mha följande struct: typedef struct name{ char *firstname; char *lastname; Name; Objekt av denna typ skapas med följande funktion: Name *makename(char *fn, char *ln){ Name *tmp = malloc(sizeof(name)); tmp->firstname = malloc(strlen(fn)+1); strcpy(tmp->firstname, fn); tmp->lastname = malloc(strlen(ln)+1); strcpy(tmp->lastname, ln); return tmp; /* makename */ Två Name-objekt är lika om resp. firstname och lastname i båda har samma strängvärde. Komplettera följande program med vad som behövs för att det ska kunna använda Arrayset på sina namn : #include arrayset.h int main(void){ Arrayset namn = initset(???????????); addset(namn, makename("john", "grisham")); addset(namn, makename("ken", "follet")); addset(namn, makename("mike", "palmer")); addset(namn, makename("james", "follet")); addset(namn, makename("mike", "ridpath")); removeset(namn,???? /* de som heter "john" i förnamn */); removeset(namn,???? /* de som heter "mike" i förnamn */); return 0;