HØGSKOLEN I SØR-TRØNDELAG Avdeling for informatikk og e-læring - AITeL

Like dokumenter
HØGSKOLEN I SØR-TRØNDELAG Avdeling for informatikk og e-læring - AITeL

HØGSKOLEN I SØR-TRØNDELAG

HØGSKOLEN I SØR-TRØNDELAG

HØGSKOLEN I SØR-TRØNDELAG Avdeling for informatikk og e-læring - AITeL

HØGSKOLEN I SØR-TRØNDELAG Avdeling for informatikk og e-læring - AITeL

HØGSKOLEN I SØR-TRØNDELAG

HØGSKOLEN I SØR-TRØNDELAG

HØGSKOLEN I SØR-TRØNDELAG Avdeling for informatikk og e-læring - AITeL

HØGSKOLEN I SØR-TRØNDELAG Avdeling for informatikk og e-læring - AITeL

K O N T I N U A S J O N S E K S A M E N

HØGSKOLEN I SØR-TRØNDELAG

KONTINUASJONSEKSAMEN

1 ØVING I WINDOWS FRA CHRISTIAN ANDOLO

2. Pekere og referanser.

UNIVERSITETET I OSLO

HØGSKOLEN I SØR-TRØNDELAG Avdeling for informatikk og e-læring - AITeL

Kontinuasjonseksamensoppgave i IMT1082 Objekt-orientert programmering

E K S A M E N. Grunnleggende datakunnskap og programmering 02HIND*, 02HINE*, 02HDMU*, 02HING*, 02HGEOMAA, 02HSIV5

HØGSKOLEN I SØR-TRØNDELAG Avdeling for informatikk og e-læring AITeL

Høgskolen i Gjøvik Institutt for informatikk og medieteknikk E K S A M E N. Grunnleggende programmering

HØGSKOLEN I SØR-TRØNDELAG

HØGSKOLEN I SØR-TRØNDELAG

HØGSKOLEN I SØR-TRØNDELAG Avdeling for informatikk og e-læring - AITeL

Eksamensoppgave i IMT1082 Objekt-orientert programmering

Kontinuasjonseksamensoppgave i IMT1082 Objekt-orientert programmering

Kontinuasjonseksamen

E K S A M E N. Grunnleggende datakunnskap og programmering 98HINDA / 98HINDB / 98HINEA 98HDMUA / 98HDMUB / 98HINGA

Kontinuasjonseksamen

Kontinuasjonseksamen

HØGSKOLEN I SØR-TRØNDELAG Avdeling for informatikk og e-læring - AITeL

Lese fra fil. INF1000 : Forelesning 5. Eksempel. De vanligste lesemetodene. Metoder:

E K S A M E N. Grunnleggende datakunnskap og programmering 99HINDA / 99HINDB / 99HINEA 99HDMUA / 99HDMUB / 99HINGA

Pekere og referanser.

Programmering i C++ Løsningsforslag Eksamen høsten 2005

HØGSKOLEN I SØR-TRØNDELAG Avdeling for informatikk og e-læring - AITeL

E K S A M E N. Grunnleggende programmering 03HBIND*, 03HBINFA, 03HBINE*, 03HBMETEA, 03HBMEMAA, 03HBGEOA

KONTINUASJONSEKSAMEN

HØGSKOLEN I SØR-TRØNDELAG

HØGSKOLEN I SØR-TRØNDELAG Avdeling for informatikk og e-læring - AITeL

HØGSKOLEN I SØR-TRØNDELAG Avdeling for informatikk og e-læring - AITeL

HØGSKOLEN I SØR-TRØNDELAG

Eksamen. Objekt-orientert programmering KLASSE(R): 02HIND* 02HDMU* 02HINE* 02HING* 01HINGA 02HSIV5 02HGEOMAA

HØGSKOLEN I SØR-TRØNDELAG Avdeling for informatikk og e-læring - AITeL

UNIVERSITETET I OSLO

Løsningsforslag ukeoppg. 6: 28. sep - 4. okt (INF Høst 2011)

E K S A M E N 96HINDA / 96HINDE (1 AA / AE)

Kontinuasjonseksamen

1. Grunnleggende C Introduksjon til kurset og til C++ Innhold

Kontinuasjonseksamen

Eksamen. Grunnleggende programmering. EKSAMENSDATO: 6.desember 2016 TID: 16:00 20:00. (kalkulator er ikke tillatt)

Ta inn og ut av 2D-array. Java 6. Liste over ulike verdier i 2D-array. Det ferdige programmet. Vi skal lage et program som illustrerer hvordan man

Eksamen. Objekt-orientert programmering

Forelesningsquiz. Forelesning inf Java 5. Sett dere to (eller tre) sammen og besvar de fire spørsmålene på utdelt ark. Tid: 15 min.

HØGSKOLEN I SØR-TRØNDELAG

Kontinuasjonseksamen

Høgskolen i Gjøvik Institutt for informatikk og medieteknikk E K S A M E N. Grunnleggende programmering

E K S A M E N. Grunnleggende datakunnskap og programmering. EKSAMENSDATO: 7. desember HINDA / 00HINDB / 00HINEA 00HDMUA / 00HDMUB / 00HINGA

Kontinuasjonseksamen

Grunnleggende datakunnskap, programmering og datastrukturer 97HINDA / 97HINDB / 97HDMUA

KONTINUASJONSEKSAMEN

Eksamensoppgave i IMT1082 Objekt-orientert programmering

UNIVERSITETET I OSLO

Høgskolen i Gjøvik Avdeling for informatikk og medieteknikk E K S A M E N. Grunnleggende programmering

E K S A M E N. - Kontroller at alle oppgavearkene er tilstede. - Les hele oppgaveteksten nøye, før du begynner å besvare noe som helst.

HØGSKOLEN I SØR-TRØNDELAG

HØGSKOLEN I SØR-TRØNDELAG

HØGSKOLEN I SØR-TRØNDELAG

KONTINUASJONSEKSAMEN

EKSAMEN 6108/6108N PROGRAMMERING I JAVA Alt trykt og skriftlig materiale.

HØGSKOLEN I SØR-TRØNDELAG Avdeling for informatikk og e-læring - AITeL

Høgskolen i Gjøvik Avdeling for informatikk og medieteknikk. Eksamen. Objekt-orientert programmering

Kontinuasjonseksamen

GJØVIK INGENIØRHØGSKOLE

Kontinuasjonseksamen

HØGSKOLEN I SØR-TRØNDELAG

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

Eksamen. Objekt-orientert programmering. EKSAMENSDATO: 25. mai HINDA / 99HINDB / 99HINEA 99HDMUA / 99HDMUB TID: Høgskolen i Gjøvik

Kontinuasjonseksamensoppgave i IMT1031(F) Grunnleggende programmering

KONTINUASJONSEKSAMEN

Kontinuasjonseksamen

HØGSKOLEN I SØR-TRØNDELAG

HØYSKOLEN I OSLO, AVDELING FOR INGENIØRUTDANNING

Høgskolen i Gjøvik. Eksamen. Objekt-orientert programmering 98HINDA / 98HINDB / 98HINEA 98HDMUA / 98HDMUB

Kontinuasjonseksamen

HØGSKOLEN I SØR-TRØNDELAG Avdeling for informatikk og e-læring - AITeL

static int skrivetidsfrist = 0; // antall overskredet tid når skrive

Kontinuasjonseksamen

INF1000 : Forelesning 5

GJØVIK INGENIØRHØGSKOLE

Oppgave 1. Oppgave 2. Oppgave 3. Prøveeksamen i INF1000. Ole Christian og Arne. 23. november 2004

Høgskolen i Gjøvik Avdeling for informatikk og medieteknikk E K S A M E N. Grunnleggende programmering

Hittil har programmene kommunisert med omverden via tastatur og skjerm Ønskelig at data kan leve fra en kjøring til neste

Prøveeksamen i INF1000. Ole Christian og Arne. 23. november 2004

HØGSKOLEN I SØR-TRØNDELAG

HØGSKOLEN I SØR-TRØNDELAG Avdeling for informatikk og e-læring - AITeL

KONTINUASJONSEKSAMEN

HØGSKOLEN I SØR-TRØNDELAG

HØGSKOLEN I SØR-TRØNDELAG

3 emner i dag! INF1000 Uke 5. Objekter og pekere. null. Litt om objekter, pekere og null Filer og easyio Litt mer om tekster

Transkript:

HØGSKOLEN I SØR-TRØNDELAG Avdeling for informatikk og e-læring - AITeL Kandidatnr: Eksamensdato: 25. mai 2005 Varighet: 4 timer (9:00 13:00) Fagnummer: LO182D Fagnavn: Programmering i C++ Klasse(r): FU Studiepoeng: 6 Faglærer(e): Mildrid Ljosland Hjelpemidler: Alle skriftlige, kalulator Oppgavesettet består av: 3 oppgaver og 4 sider Vedlegg består av: 1 sider Merknad: Oppgaveteksten kan beholdes av studenter som sitter eksamenstiden ut. Lykke til!

Oppgave 1 (20%) Vi har en tekst bestående av mange ord lagret på en fil. Lag et program som teller hvor mange ord det totalt er på filen og hvor mange setninger det er (setningene avsluttes med punktum umiddelbart bak et ord). Navnet på tekstfilen skal leses inn fra bruker, og antall ord og setninger skal skrives ut på skjermen. Hvis fila ikke finnes, skal programmet avsluttes med en feilmelding. Eksempel: Anta at tekstfila ser slik ut: Dette er en test på mitt program. Det har tre setninger. Den siste av dem slutter her. Da skal utskriften fortelle at den består av 17 ord og 3 setninger. Løsning: #include <string> #include <fstream> #include <iostream> using namespace std; int main() string ordene[maks]; string filnavn; cout << "Skriv filnavn: "; cin >> filnavn; ifstream fil; fil.open(filnavn.c_str()); if (!fil) cerr << "Fant ikke filen" << endl; else string ord; int antallord = 0; int antallsetninger = 0; fil >> ord; while (!fil.eof()) // Visual C++: Se neste program antallord++; char siste = ord[ord.length() - 1]; if (siste == '.') antallsetninger++; fil >> ord; cout << "Antall ord: " << antallord; cout << " Antall setninger: " << antallsetninger; cout << endl; fil.close(); return 0; 2

Oppgave 2 (30%) I bedømmelsen av denne oppgaven legges det vekt på at oppgaven er delt opp i fornuftige funksjoner. Derimot legges det ikke vekt på filbehandlinga, så hvis du ikke behersker akkurat det, kan du bruke cin i stedet. Nå skal du bruke tekstfila fra oppgave 1 enda en gang. Denne gangen skal du lagre ordene i en tabell av tekstsstrenger (du kan anta at det ikke er mer enn 1000 ord på fila). a) Fjern alle tegn som ikke er bokstaver (i det engelske alfabetet æ, ø og å kan du betrakte som ikke-bokstaver), og gjøre om alle storbokstaver til småbokstaver. Fjern ord på null bokstaver. Du skal altså stå igjen med en tabell av ord der hvert ord består av bare småbokstaver (a z). b) Sorter tabellen og skriv den ut på skjermen. Fjern så alle ord som finnes mer enn en gang og skriv ut tabellen en gang til. Løsning: #include <string> #include <fstream> #include <iostream> using namespace std; const int maks = 1000; bool erbokstav(char tegn); string rydd(string ord); void skriv(string *tabell, int antall); void sorter(string *tabell, int antall); int fjern(string *tabell, int antall); int main() // Oppgave a string ordene[maks]; string filnavn; cout << "Skriv filnavn: "; cin >> filnavn; ifstream fil; fil.open(filnavn.c_str()); if (!fil) cerr << "Fant ikke filen" << endl; else string ord; int antall = 0; while (!fil.eof()) fil >> ord; // Ved bruk av Visual C++ må lesing skje etter eof-testen // (avvik fra standarden) ord = rydd(ord); if (ord.length() > 0) ordene[antall] = ord; antall++; 3

// Oppgave b sorter(ordene, antall); skriv(ordene, antall); antall = fjern(ordene, antall); skriv(ordene, antall); fil.close(); return 0; // Oppgave a string rydd( string ord) // Inn int nr; string resultat = ""; for (nr=0; nr < ord.length(); nr++) char liten = tolower(ord[nr]); if (erbokstav(liten)) resultat += liten; bool erbokstav( char tegn) // Inn return tegn >= 'a' && tegn <= 'z'; // Oppgave b void sorter( string *tabell, // Inn/ut int antall) // Inn int start; for (start = 0; start < antall; start++) int hittilminst = start; int teller; for (teller = start+1; teller < antall; teller++) if (tabell[teller] < tabell[hittilminst]) hittilminst = teller; string hjelp = tabell[hittilminst]; tabell[hittilminst] = tabell[start]; tabell[start] = hjelp; // sorter int fjern( string *tabell, // Inn/ut int antall) // Inn // Forutsetter at tabellen er sortert // og har minst ett element. int i; int nyttantall = 1; for (i = 1; i <antall; i++) if (tabell[i]!= tabell[i - 1]) tabell[nyttantall] = tabell[i]; nyttantall++; return nyttantall; 4

void skriv( string *tabell, // Inn int antall) // Inn int i; for (i = 0; i < antall; i++) cout << tabell[i] << endl; Oppgave 3 (50%) a) Lag en funksjon som gir ut et tilfeldig double-tall mellom to verdier (min og maks). Bruk biblioteksfunksjonen rand(), men merk at denne gir ut et heltall, mens du skal ha et double-tall. Bruk følgende algoritme: Hvis du har et tall mellom 0 og MAX, kan det omformes til et tall mellom a og b ved å regne ut tall/max * (b a) + a double finntilfeldig( double max, // Inn double min) // Inn double tilf = (double)rand()/rand_max; // mellom 0 og 1 tilf *= (max - min); tilf += min; return tilf; b) Studer klassen Sirkel gitt i vedlegg 1. Vis hva du må skrive for å opprette et Sirkel-objekt som har sentrum i x = 2 og y = 0 og radius 4. Lag så en setning som finner ut om punktet x = 5 og y = 2 ligger inni (eller på randa av) denne sirkelen. Sirkel minsirkel; minsirkel.settsentrum(2,0); minsirkel.settradius(4); bool OK = minsirkel.innenfor(5, 2); c) Lag en funksjon som finner et tilfeldig punkt (x- og y-koordinat) innenfor en sirkel. Sirkelen skal være inn-argument til funksjonen, mens x- og y- koordinatene skal være ut-argumenter. Gjør dette ved å la x-verdien være et tilfeldig tall mellom finnminx() og finnmaxx(), og y-verdien et tilfeldig tall mellom finnminy() og finnmaxy(). Deretter tester du om det tilfeldige punktet virkelig er innenfor sirkelen, hvis ikke, gjentar du prosessen. void finnpunkt( Sirkel sirkel, // Inn double &x, // Ut double &y) // Ut bool ferdig = false; while (!ferdig) double max = sirkel.finnmaxx(); double min = sirkel.finnminx(); 5

x = finntilfeldig(max, min); max = sirkel.finnmaxy(); min = sirkel.finnminy(); y = finntilfeldig(max, min); ferdig = sirkel.innenfor(x, y); d) Lag funksjonen telltreff(). Som inn-argumenter skal den ha to sirkler samt hvor mange ganger løkka beskrevet nedenfor skal utføres. Inni metoden skal den bruke funksjon du laget i c) til å produsere et tilfeldig punkt innenfor den første sirkelen, og sjekke om dette punktet også ligger innenfor den andre sirklen. Dette skal gjentas det antall ganger innargumentet forteller, og resultatet av funksjonen skal være antall ganger det produserte punktet havner innenfor begge sirklene. int telltreff( Sirkel s1, // Inn Sirkel s2, // Inn int antallforsok) // Inn double x; double y; int antall = 0; int i = 0; for (i=0; i < antallforsok; i++) finnpunkt(s1, x, y); if (s2.innenfor(x, y)) antall++; return antall; e) Vi har et sirkelrundt jorde med radius 10 meter og gjerde rundt. I en av gjerdestolpene er en sau bundet i et tau som er 13 meter langt. Vi ønsker å finne ut hvor stor andel av jordet sauen kan beite på. For å finne ut dette, bruker vi følgende tankegang: Vi produserer tilfeldige punkter innenfor den sirkelen jordet beskriver, og sjekker om disse punktene også er innenfor den sirkelen som tauet beskriver. Gjør vi dette mange ganger (for eksempel 10000 ganger), vil andelen av punker som er innenfor begge, være like stor som andelen som sauen kan nå av jordet. Hvis for eksempel 60% av de punketene som er innenfor jordet, også er innenfor sirkelen som tauet danner, betyr det at sauen kan spise på 60% av jordet. Lag et program som finner denne andelen. La den gjerdestolpen sauen er bundet i, ha koordinater x=0, y=0, mens sentrum av jordet finnes i koordinatene x = 10, y = 0. 6

10 meter 13 meter double finntilfeldig(double max, double min); void finnpunkt(sirkel sirkel, double &x, double &y); int telltreff(sirkel s1, Sirkel s2, int antallforsok); int main() double r1 = 10; double r2 = 13; int maxantall = 10000; Sirkel jorde; srand(2); jorde.settradius(r1); jorde.settsentrum(r1, 0); Sirkel tau; tau.settradius(r2); tau.settsentrum(0,0); int antalltreff = telltreff(jorde, tau, maxantall); double andel = (double)antalltreff / maxantall; cout << "Andel som sauen når: " << andel << endl; return 0; 7

Vedlegg 1 class Sirkel public: void settradius(double r); void settsentrum(double x, double y); double finnradius(); double finnminx(); double finnmaxx(); double finnminy(); double finnmaxy(); bool innenfor(double x, double y); // true hvis punktet (x,y) er innenfor (eller på randen av) sirkelen. private: double senterx; double sentery; double radius; ; void Sirkel::settRadius(double r) radius = r; void Sirkel::settSentrum(double x, double y) senterx = x; sentery = y; bool Sirkel::innenfor(double x, double y) double plass = (senterx-x)*(senterx -x) + (sentery-y)*(sentery-y); if (plass <= radius*radius) return true; else return false; double Sirkel::finnRadius() return radius; double Sirkel::finnMinX() return senterx - radius; double Sirkel::finnMaxX() return senterx + radius; double Sirkel::finnMinY() return sentery - radius; double Sirkel::finnMaxY() return sentery + radius; 8