FÖRSLAG TILL LÖSNING AV Tentamen i Objektorienterad programmering C++ I 2002-03-18 Betygsgränser: 3 14 poäng 4 20 poäng 5 27 poäng Maxpoäng: Hjälpmedel: 32 poäng Bilagd ASCII-tabell Lycka till Per Ekeroot
Per Ekeroot 2 Uppgift 1 a) Beräkna följande uttryck med hänsyn till de regler som gäller i C++: 13 / 0.5 10 * 8 / 9 + 23 % 4 8 / 9 * 10 Svar: 21 ( = 26-80/9 + 3-0 *10 = 26 8 + 3 0 = 21 ) (9p) b) Utgå från följande deklarationer: float tal1, tal2; bool ok; Skriv ett kodavsnitt som innehåller en loop vars kropp utförs minst en gång och som upprepas så länge tal1 är större eller lika med tal2 och ok är sann. Förslag till lösning: do //Kod t.ex cout << tal1 << " " << tal2 << endl; tal2 += 2.75; while(tal1 >= tal2 && ok); c) Vilka värden antar variablerna ok1, ok2 resp. ok3 efter att följande satser utförts? int i=3, j=1, k=4, m=5 bool ok1 = j >= i k == m; bool ok2 = k + m < j 3 - j >= k; bool ok3 = m <= 5 && k < m; Svar ok1 = false, ok2 = false, ok3 = true d) Vad utför följande funktion? char getchar(string s) char ch = 'A'; if (s.length() > 4) ch = s[4]; return ch; Svar: Om strängen s är längre än 4 tecken returneras det femte tecknet annars returneras tecknet A. e) Deklarera en pekare till ett flyttal och allokera plats för flyttalet på heapen. Lägg sedan in värdet 2.75 på den allokerade platsen. Lösningsförslag: float *flyttal = new float; *flyttal = 2.75;
Per Ekeroot 3 Uppgift 2 Trädhöjd (4p) Man kan approximera ett träd med en kon där trädets topp är konens spets och trädets bas vid marken är konens bas. Med denna approximation skall du nu göra ett program som beräknar höjden av ett träd (d.v.s. höjden av en kon) med hjälp av trädbasens (konbasens) omkrets enligt formler nedan. Basomkretsen Tvärsnittsradie? 2?? Trädhöjden? Tvärsnittsradien? Höjdfaktorn Tvärsnittsradie Här är höjdfaktorn en konstant med värdet 100. Den gör att trädhöjden beräknas i meter om inmatningen av omkretsen sker i meter. Programmet skall uppfylla följande kriterier:?? Pi (3.14) och höjdfaktorn (100) skall deklareras som konstanter i början av programmet.?? Inmatning av basomkretsen skall ske från tangentbordet i enheten meter.?? Trädhöjden skall beräknas och skrivas ut på skärmen. Formatera utskriften så att 3 decimaler visas. Lösningsförslag: // Förslag till lösning på upg 2 // Tentamen 2002-03-18 // Per Ekeroot 2002-03-25 #include <iostream> #include <conio> #include <iomanip> using namespace std; int main() const int HOJDFAKTOR = 100; const float PI = 3.14; float radie = 0, omkrets = 0, hojd = 0; clrscr(); cout << "Mata in trädets omkrets vid dess bas: "; cin >> omkrets; radie = omkrets / (2 * PI); hojd = radie * HOJDFAKTOR; cout << fixed << setprecision(3); cout << "Trädets höjd = " << hojd; getch(); return 0;
Per Ekeroot 4 Uppgift 3 (4p) Vad skrivs ut av följande programavsnitt? a) Skriv på ett rutat papper med ett tecken i varje ruta. Markera bildskärmens övre vänstra hörn. while(row>=1) col=1; while(col<=6) if(row%2==0) cout << setw(2) << right << ">"; else cout << setw(2)<< left << "<"; ++col; --row; cout << endl; b) int tal1=12, tal2=7, *ptal1, *ptal2; ptal1 = &tal1; ptal2 = &tal2; *ptal1 = 2 * *ptal2; *ptal2 = - *ptal2; cout << tal1 << : << tal2; Svar: Frågan var inte fullständig. Följande rad saknades i deluppgift a): int col, row = 5; Med denna rad inlagd som första rad i programmet under a) blir utskriften:
Per Ekeroot 5 Uppgift 4 Skriv en funktion som kontrollerar om ett postnummer har rätt format. Ett postnummer skrivs: 831 55, dvs. enbart med siffror och ett mellanslag mellan tredje och fjärde siffran. Vi bortser från hur postnumret skrivs om man skickar post från utlandet. Kravspecifikation: Funktionens indata ska vara en sträng som innehåller postnumret. Funktionen ska returnera true om postnumret har rätt format annars returneras false. Dessutom ska funktionen returnera en meddelandesträng (se nedan) Postnumrets format ges av ### ##, där # är en siffra. Observera mellanslaget mellan tredje och fjärde siffran. Funktionen ska utföra följande kontroller: o postnumrets längd ska var 6 tecken. o postnumret ska innehålla ett mellanslag efter tredje tecknet. o postnumret ska innehålla enbart siffror förutom mellanslaget Meddelandesträngen ska ges följande innehåll beroende på utfallet av ovanstående kontroller: o Korrekt postnummer om postnumret har rätt format. o Felaktigt postnummer, plus en eller flera av följande strängar fel längd om längden inte är lika med 6 tecken. fel avdelare om mellanslaget saknas i position fyra. felaktig siffra om något annat tecken än en siffra angivits i någon av sifferpositionerna. (6p) Förslag till lösning: bool kollapostnr(const string postnr, string &errormessage) bool postnrok = true; errormessage = ""; // Kolla att postnumrets längd är 6 if(postnr.length()!= 6 ) errormessage += ", fel längd"; postnrok = false; // Kolla att avdelaren är ett mellanslag if( postnr[3]!= ' ') errormessage += ", fel avdelare"; postnrok = false; // Forts på nästa sida
Per Ekeroot 6 // Kolla så att platserna för siffror innehåller siffror bool digitsok = true; for(unsigned int i=0; i<postnr.length(); i++) if( postnr[i]<48 postnr[i]>57 ) digitsok = false; if(i==2) i++; if(!digitsok) errormessage += ", felaktiga tecken för siffrorna"; postnrok = false; // Redigera felmeddelandet, skicka funktionens returvärde if(postnrok) errormessage = "Korrekt postnummer"; else errormessage = "Felaktigt postnummer" + errormessage; return postnrok;
Per Ekeroot 7 Uppgift 5 (9p) Du har fått i uppdrag att skriva ett program som gör beräkningar och presenterar statistik på data från mätningar som har gjorts av bilars hastighet. Under en tidsperiod mäter man hastigheten för de bilar som passerar mätplatsen, t.ex. en skola. Det instrument som används för hastighetsmätningen skriver mätningarna på en pappersremsa. Man vill sedan sammanställa mätningarna i form av medelhastighet, antalet fortkörare etc. Det är din uppgift att skriva ett program i vilket man kan mata in, beräkna, skriva ut och spara data enligt specifikationen nedan. Kravspecifikation: Hastighet mäts i km/timme med 1 decimals noggrannhet. Inmatningar som ska göras till programmet: o antal mätvärden. o hastigheterna. o gällande hastighetsgräns. Följande beräkningar ska göras: o medelhastighet o antal bilar som kört fortare än hastighetsgränsen Skriv en funktion för: o inmatning av mätvärden till vektorn. o beräkning av medelhastighet o beräkning av antalet fortkörare o utskrift av statistik. Statistiken ska bestå av: antal mätvärden medelhastighet antal fortkörare o att spara mätvärdena på en textfil Skriv ett huvudprogram med följande programstruktur o Skriv en rubrik o Användaren av programmet matar från tangentbordet in antalet mätvärden och gällande hastighetsgräns. o Skapa en dynamisk vektor med plats för alla mätvärden. o Låt användaren mata in mätvärdena till vektorn. o Skriv ut resultaten från mätningarna (de beräknade värdena) o Spara mätvärdena på en textfil efter att användaren matat in ett filnamn. Förslag till lösning: se nästa sida!
Per Ekeroot 8 // hastigheter.cpp // Per Ekeroot 2002-03-12 #include <iostream> #include <fstream> #include <conio> #include <iomanip> #include <string> using namespace std; // Funktionsprototyper void velocityinput(float v[], int num); float avevelocity(const float v[], int num); int numoverlimit(const float v[], int num, float limit); void showstat(const float v[], int num, float limit); void savevelocityonfile(const float v[], int num, string filename); // Huvudprogram int main() cout << "Beräkning av statisk för bilars hastighet" << endl << endl; cout << "Ange antal mätvärden : " ; int nr; cin >> nr; cout << "Ange hastighetsbegränsning: " ; float velocitylimit; cin >> velocitylimit; // Skapa en vektor dynamiskt float *velocity = new float[nr]; // Mata in hastigheter velocityinput(velocity,nr); // Skriv resultat av mätningarna showstat(velocity,nr,velocitylimit); // Spara data på fil cout << endl << "Ange filnamn för fil att spara mätningarna på: "; string filen; cin >> filen; savevelocityonfile(velocity, nr, filen); return 0; // ----- Mata in hastigheter ---------------------------------------------------
Per Ekeroot 9 void velocityinput(float v[], int num) cout << endl << "Mata in hastigheter i [km/h]." << endl; for(int i=0; i<num; i++) cout << "Hastighet nr " << i+1 << ": " ; cin >> v[i]; cin.get(); // ------ Beräkna medelhastighet ----------------------------------------------- float avevelocity(const float v[], int num) float sum =0; for(int i=0; i<num; i++) sum += v[i]; return sum / num; // ----- Beräkna antal fortkörare ---------------------------------------------- int numoverlimit(const float v[], int num, float limit) int numover =0; for(int i=0; i<num; i++) if( v[i] > limit) numover++; return numover; // ----- Skriv ut resultatet av mätningarna ------------------------------------ void showstat(const float v[], int num, float limit) cout << endl << endl << fixed << setprecision(1); cout << "Statistik för hastighetsmätning" << endl << endl; cout << "Antal mätningar : " << num << endl; cout << "Hastighetsgräns : " << limit << endl; cout << "Medelhastighet [km/h]: " << avevelocity(v,num) << endl; cout << "Antal fortkörare : " << numoverlimit(v, num, limit) <<endl<<endl; // ----- Spara mätningarna på fil ---------------------------------------------- void savevelocityonfile(const float v[], int num, string filename) fstream f(filename.c_str(),ios::out); if(f.is_open()); for(int i=0; i<num; i++) f << v[i] << endl; f.close();