Programmering Grundkurs (6H2950) Grundläggande Programmering (6A2001) Skrivtid: 8:15-13:15 Datum: Måndagen 2005-03-07 Tentamen består av 7 sidor Hjälpmedel: Förutom dator med installerad Borland C++ 5.02, Utforskaren, Acrobat reader och Notepad (inga andra program), den kurslitteratur som använts under kursen, samt egna anteckningar, programlistningar och böcker. Dock inga egna disketter eller CD-ROM. Under W:\PROV\C finns program- och datafiler som kan komma till användning vid lösandet av uppgifterna. Kopiera över dessa till ditt konto. Till alla uppgifter ska ett program levereras i form av källkod (C eller CPP-fil). Dina bidrag lägger du i en katalog i roten på H:. Katalogen ska ha samma namn som prefixet i din mailadress. Exempelvis för Kalle Kula: HDI02KEKA. Namnen på lösningarna ska ges UPPG1.CPP till UPPG8.CPP. De är endast dessa filer som kommer att bedömas. Samtliga, till problemen hörande datafiler, där bokstäverna Å, Ä, Ö, ingår är lagrade i extended ASCII, vilket innebär att texten återges på rätt sätt då den skrivs ut i DOS-fönstret. Rättningen görs genom att programmen körs ett antal gånger för olika indata. Om resultatet överensstämmer med det förväntade bedöms programmet, som korrekt och ger 2 poäng. Om ett program ej kan kompileras utan fel, är det knappast troligt att det kommer att ge några poäng. I det fall där programmet läser från och eller skriver till en fil, testas programmet oftast med en annan fil än den bifogade. Betygsgränser: 8 10 poäng ger betyg 3, 11 13 poäng ger betyg 4 och 14 16 poäng ger betyg 5. Resultat anslås på programmets anslagstavla i RII. Lycka till! Niclas Hjelm, Håkan Strömberg Hjelm Strömberg 1 KTH Syd Haninge
Uppgift 1 Bestämma π Med hjälp av formeln π = 4 1 4 3 + 4 5 4 7 + 4 9 4 11 + 4 13 kan ett närmevärde till π bestämmas. Du ser säkert hur denna serie fortsätter i all oändlighet. Skriv ett program som frågar efter antalet termer och som bestämmer summan av dessa. Resultatet ska skriva ut med 6 decimaler. Ett körningsexempel: Antal termer? 20 PI blir då 3.091624 Uppgift 2 Åkerlappen xxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxxxxxxxxxxxxx Figuren ovan ska förställa en karta som visar skog (x) och åkermark (o). En position på kartan motsvarar 10 10 m 2. Kartan som finns att läsa in från filen karta.txt inleds med en rad som anger antalet rader den innehåller, ett tal h, 4 h 20. Talet anger alltså egentligen kartans utbredning i nordsydlig riktning 10 h meter. På nästa rad anges antalet kolumner k, 4 k 40. Talet anger kartans utbredning i östvästlig riktning 10 k meter. Därefter följer h rader alla innehållande k tecken (x) eller (o). På kartan finns endast en rektangulär åkerlapp, allt annat är skog. Din uppgift är nu att skriva ett program som bestämmer åkerns längd (utbredning i östvästlig riktning) respektive bredd (utbredning i nordsydlig riktning). Observera att åkern mycket väl kan ligga med en eller flera av sina sidor utefter kartans ytterkanter. Åkerns längd 60 meter Åkerns bredd 40 meter Hjelm Strömberg 2 KTH Syd Haninge
Uppgift 3 Att resa med SAS Addis_Abeba Karlstad Paris Amsterdam Khartum Prag Ankara Köpenhamn Reykjavik Aten Lissabon Rom Barcelona London Sundsvall Bryssel Madrid Teheran Cairo Malmö Visby Frankfurt Moskva Warszawa Geneve New_York Zürich Göteborg Nizza Helsinfors Oslo Figur 1: De platser som trafikerades med flyg från Stockholm Bromma år 1946 På binärfilen flygpriser.dat finns uppgifter om det biljettpris som gällde 1946, både enkel och tur o retur, från Stockholm Bromma till alla de platser som trafikerades vid den tiden. Dessutom finns uppgift om kostnaden för bagageövervikt kr/kg. Posten i binärfilen har följande utseende: struct prispost{ char namn[20]; float enkel; float turoretur; float overvikt; }; Skriv ett program med följande dialog: Destination? Lissabon Enkel (1) Tur och retur (2)? 2 Övervikt (kg)? 10 Biljetten till Lissabon kostar 1375.50 kr Programmet ska alltså fråga efter destinationsort, typ av resa samt hur stor övervikt bagaget har. Därefter ska programmet skriva ut biljettpriset. Hjelm Strömberg 3 KTH Syd Haninge
Uppgift 4 Aktiebolaget C I den här uppgiften ska vi studera programmeringsföretaget AB C och dess anställda under tre år. Varje anställt på företaget, som har en viss omsättning på folk, har ett anställningsnummer, ett tal i intervallet 1000... 2000. Antalet tjänster (anställda) har under de tre år, 2003 2005, vi ska studera varit konstant 10 stycken. Givet tre filer f2003.txt, f2004.txt och f2005.txt. Filen f2003.txt innehåller helt enkelt anställningsnumren på de som var anställda under 2003. De andra två filerna f2004.txt och f2005.txt innehåller information om vilka som slutade under året och vilka de ersattes av. Filerna inleds med ett tal som anger hur många byten n, som gjordes under året. Därefter följer n rader med två nummer på varje. Första numret anger vem som slutade och andra numret vem denne ersattes av. Bytena räknas upp i den ordning de inträffade under året. Skriv ett program som skriver ut anställningsnumren på de 10 personer som just nu är anställda i AB C. Om filerna har följande innehåll f2003.txt f2004.txt f2005.txt ------------------------------------------------------- 1001 5 6 1003 1210 1888 1010 1977 1030 1304 1004 1977 1111 1200 1888 1889 1003 1280 1210 1361 1608 1608 1777 1304 1999 1005 1437 1234 1361 1005 1357 1010 1999 1437 kommer svaret att bli följande 10 personer 1001 1280 1030 1200 1889 1004 1777 1111 1357 1234 Observera att personer kan både börja och sluta under samma år och att det finns anställda som överlevt alla tre åren trots flera omorganisationer. Hjelm Strömberg 4 KTH Syd Haninge
Uppgift 5 Att nå målet Här ska vi göra en vandring i koordinatsystemet som startar i origo, punkten (0, 0). Vandringen består av ett antal steg. Ett steg är en längdenhet i någon av de fyra huvudriktningarna, uppåt (y ökar), nedåt (y minskar), åt vänster (x minskar) eller åt höger (x ökar). På det viset kommer man alltid att vara i en punkt (x, y) med heltalskoordinter. Målet är att nå punkten (20, 20). Stegens riktning väljs slumpmässigt med en bestämd sannolikhet, som ges i procent (heltal) genom denna dialog vid programmets start: Sannolikhet UPPÅT (%)? 30 Sannolikhet NEDÅT (%)? 18 Sannolikhet ÅT VÄSTER (%)? 20 Sannolikheten för ÅT HÖGER kan programmet sedan själv bestämma eftersom summan av alla sannolikheter ska bli 100%. Programmet ska sedan simulera 100000 sådana vandringar. En vandring tar slut om den når det givna målet, vilket är detsamma som en lyckad vandring eller om antalet steg når upp till 200 utan att målet är nått. Som resultat skriver programmet sedan ut hur många procent av vandringarna som var lyckade: 10.69 % av vandringarna var LYCKADE Hjelm Strömberg 5 KTH Syd Haninge
Uppgift 6 Vilka drag är möjliga? Figur 2: I figuren ser vi en situation i bondespelet. Den ene spelaren, den vid draget, för de vita brickorna och den andre de svarta. Vi behöver inte bry oss om vad spelet går ut på utan i stället vilka möjliga drag vit har. Vit, som alltså är vid draget, kan flytta en bricka: A ett steg rakt framåt (uppåt i figuren) om denna ruta är tom. B Han kan också flytta en bricka ett steg diagonalt framåt (snett uppåt i figuren) om denna ruta innehåller en svart bricka vit slår en svart bricka. Skriv ett program som bestämmer hur många möjliga drag vit har, uppdelade på de två kategorierna A och B förklarade i listan ovan. Aktuell ställning läses in från filen stallning.txt. Filen innehåller 5 rader med 5 tal på varje. Talet 1 står för vit bricka, 2 för svart bricka och 0 för tom ruta. Ett körningsexempel: Det finns 2 drag av kategori A Det finns 3 drag av kategori B Hjelm Strömberg 6 KTH Syd Haninge
Uppgift 7 Befolkningstäthet På filen folkmangd.txt finns folkmängden hos 192 av världens länder noterad. På filen storlek.txt finns samma länders storlek i km 2 given. Skriv ett program som bestämmer vilket land i världen som har den högsta befolkningstätheten, antal personer per km 2. Filen folkmangd.txt innehåller 2 192 rader först landets namn, en sträng med < 40 tecken utan mellanslag och på nästa rad ett tal, landets folkmängd. Filen storlek.txt är uppbyggd på samma sätt, först landets namn och på nästa rad dess storlek i km 2. Ett problem är, att även om länderna på de två filerna är desamma, så återfinns de inte i samma ordning. Ett körningsexempel med de givna filerna ger utskriften I Monaco bor folk tätast med 16620 personer/km^2 Uppgift 8 Multiple Choice Läraren testade studenternas kunskaper med hjälp av ett prov utformat med flervalsfrågor. Provet innehöll 10 frågor och det fanns tre svarsalternativ på varje fråga, A, B och C. När studenterna fick tillbaka provet rättat, fick de också facit till de rätta svaren. Men det visade sig vid närmare kontroll att resultat inte stämde för alla studenter. I facit hade insmugit sig ett tryckfel. Ett av svaren där avvek från den korrekta rad av svar, som läraren använt, då han rättade provet. Skriv ett program som tar reda för vilket av de 10 svaren det utdelade facit var felaktigt och vilket det rätta svaret egentligen skulle vara. Filen tenta.txt inleds med en rad som innehåller facit med aktuellt tryckfel. En rad med 10 tecken från A, B, C. På nästa rad finns ett tal n < 30, som anger hur många studenter som deltog. För varje student ges sedan två rader. Först studentens svar, en 10 tecken lång sträng med 10 tecken från A, B, C. På nästa rad hur många rätt studenten hade ett tal 0...10. Ett körningsexempel: Svaret på fråga 5 var felaktigt. Ska vara C Observera alltså att alla studenternas resultat var korrekta. Hjelm Strömberg 7 KTH Syd Haninge