UMEÅ UNIVERSITET Datavetenskap Marie Nordström 071207 TENTAMEN MOM1 GRUNDLÄGGANDE PROGRAMMERINGSTEKNIK OCH DATORSYSTEM/GRÄNSSNITT, 7.5HP. (5DV074/5DV075) Datum : 071207 Tid : 3 timmar Hjälpmedel : Allt. Kommunikation med andra personer (direkt eller indirekt) är dock inte tillåten, som t ex via mail, mobiltelefon, gemensamma kataloger etc. Antal uppgifter : 4 Poäng : 32 Provet består av 4 uppgifter: Kryssa för de uppgifter du lämnar in. Dina filer skall vid skrivtidens slut finnas i mappen ~/edu/gpt/mom1071207 Namn och användarnamn(@cs.umu.se) skall finnas som kommentar överst i all källkod. Skriv din dators namn på försättsbladet. Lösningarna skall vara prydliga. Tankegången skall vara lätt att följa. Alla antaganden som inte är uppenbara skall redovisas. OBS! Kontrollera att din dator fungerar innan du börjar. Lycka till! UMEÅ UNIVERSITET 901 87 UMEÅ Tel.: 090-786 77 08 Fax: 090-786 61 26 e-mail: marie@cs.umu.se
Regler för Tentamen moment1 Provet är en del av examinationen och skall alltså ske under tentamensliknande förhållanden. Examinationen är individuell och betygsgrundande. Detta får följande konsekvenser: Man är personligt ansvarig för de lösningar som lämnas in. Om man hittar lösningar eller delar av lösningar på nätet eller i litteraturen bör detta tydligt anges och man är fortfarande skyldig att själv vara fullständigt insatt i den lösning man redovisar och på uppmaning kunna svara för innehåll och funktion i hela eller delar av lösningen. Självklart får man inte söka eller hämta kod från någon av de övriga tentanderna, detta betraktas som fusk och handläggs som sådant. Några riktlinjer för hur lösningarna bedöms: Koden skall följa god programmeringsmetodik, vilket t.ex. innebär konsekvent indenterad och lämpligt kommenterad källkod. Lösningen behöver inte gå att kompilera för att ge poäng, så låt inte troliga syntaxfel ta för mycket tid i anspråk om du känner dig övertygad om att du löst det givna problemet, det räcker därför inte att en lösning fungerar för att ge full poäng, även här måste man på ett rimligt sätt underordna sig kravet på god programmeringsmetodik. 2(6)
Uppgift 1 (6 poäng) På arméns överskottslager har du kommit över en atombomb förhållandevis billigt. För att ta över världen behöver du dock känna till avfyrningskoden, som är en följd av fyra bokstäver i intervallet a-z. Lyckligtvis har du lyckats extrahera funktionen som kontrollerar om koden är korrekt ur missilens processor. Den returnerar sanningsvärdet sant om koden är korrekt och ser ut på följande sätt. int korrekt_kod(char c1, char c2, char c3, char c4) { char a[4]; int i, j; } a[0]=c1; a[1]=c2; a[2]=c3; a[3]=c4; for (i = 0; i<10; i++) { for (j = 0; j<4; j++) { a[j] = a[j] ^ a[(j+(j+i)%3+1)%4] + i; } } return a[0]==101 && a[1]==-116 && a[2]==-41 && a[3]==19; Skriv ett program som tar reda på den korrekta koden genom att testa alla möjliga kombinationer av tecken och anropa korrekt_kod, t ex som korrekt_kod(t1,t2,t3,t4); där t1, t2, t3 och t4 är variabler av typen char. Koden för funktionen korrekt_kod finns i mappen http://www.cs.umu.se/kurser/5dv074/ht07/mom1/kod071207/ Filen som du skapar måste heta codecracker.c och ska läggas i din provkatalog. Tips! Typen char är som vi sagt tidigare egentligen int. Värdena i datatypen har en given ordning (se t.ex. ASCII-tabellen) och är uppräkningsbara. Detta innebär bl.a. att det går alldeles utmärkt att styra for-loopar med variabler och värden av typen char. Alfabetet kan t.ex. skrivas ut så här: char i; for (i='a'; i <= 'Z'; i++) printf("%c",i); printf( \n ); 3(6)
Uppgift 2 (7 poäng) Du ska konstruera ett litet spel, huvudsakligen med hjälp av loopar och val. Spelet heter HiLo och går ut på att användaren ska försöka gissa datorns hemliga tal. Det hemliga talet ligger i intervallet 1..100 och det ska vara slumpmässigt. Läs in gissningar från användaren, berätta om de är för låga eller höga och upprepa detta till dess att användaren gissar rätt. Du måste kontrollera att det tal som användaren ger är en giltig gissning, dvs. att värdet ligger i intervallet 1..100. Räkna och skriv ut antalet (giltiga) gissningar. Exempel på körningar: ---Hemligt tal : 85--- Det hemliga talet ligger mellan 1 och 100 Gissa : 85 Helt korrekt! En gissning = Slump, fusk eller ren bondtur! ---Hemligt tal : 76--- Det hemliga talet ligger mellan 1 och 100 Gissa : 50 För lågt! Gissa : 500 Du kan bara gissa på tal i intervallet 1..100 Gissa : 200 Du kan bara gissa på tal i intervallet 1..100 Gissa : 82 För högt! Gissa : 76 Helt korrekt! Du gissade 3 gånger. Som du ser i exemplen ovan kan det vara bra att skriva ut det hemliga talet medan du testkör. Filen som du skapar måste heta hilo.c och ska läggas i din provkatalog. 4(6)
Uppgift 3 (9 poäng) En kortlek innehåller 13 kort (ess [1], två, tre,..., tio, knekt [11], dam [12], kung [13]) i var och en av fyra färger (klöver, hjärter, ruter och spader). Genom att bestämma någon lämplig numrering av korten kan varje kort identifieras som ett heltal mellan 0 och 51. Bestäm en numrering av korten och skriv funktionerna kortfarg och kortvalor som tar ett korts nummer som argument och returnerar dess färg (som ett heltal 0..3) respektive valör (som ett heltal 1..13). int kortfarg(int kort) int kortvalor(int kort) Skriv också en funktion som givet färgnummer (0..3) och valör (1..13) returnerar kortnumret i den ovan bestämda uppräkningen. int ordningsnummer(int farg, int valor) I vissa kortspel (poker t.ex.) är det intressant att veta om alla korten kommer från samma färg (klöver, hjärter, ruter eller spader). Skriv en funktion som kontrollerar detta. Som parametrar ska den ha listan med kort (int hand[]) och antalet kort i handen (int n). int farg(int hand[], int n) Skriv lämpliga anrop i main som visar att funktionerna fungerar. Du får själv sätta ihop lämpliga testhänder, men du kan inte utgå ifrån att de är sorterade från start. För att kunna kontrollera testerna måste du också på något sätt redovisa din numrering av korten, någon typ av tabellutskrift är lämpligt. Skriv en funktion som gör detta. void skrivuttabell(void) Utskriften bör naturligtvis vara rimligt organiserad så att du inte bara kopierar ut ett antal rader med strängar, t.ex. printf( E 2 3 4 5 6 7 8 9 10 Kn D K ); osv. Om du för övrigt tycker att du har nytta av andra rutiner får du gärna skriva fler än de ovan uppräknade. Filen som du skapar måste heta kortlek.c och ska läggas i din provkatalog. 5(6)
Uppgift 4 (10 poäng) Palindrom är en sträng som blir densamma läst framlänges eller baklänges. Palindrom är t.ex. "Sirap i Paris", "Kajak" och "Anna" men inte Eva eller "Programmeringsteknik". Enklast blir det om man gör lite förarbete innan man börjar jämförelserna. I den här uppgiften nöjer vi oss med att hantera strängar som bara innehåller bokstäverna a-z, A-Z och blanktecken. Då blir det enklare om man först tar bort alla blanktecken, sedan gör om alla bokstäver till stora och därefter jämför, första tecknet med det sista, andra tecknet med det näst sista, osv. Skriv ett program som läser in och kontrollerar om en sträng är ett palindrom. Uppgiften ska lösas med hjälp av funktioner. Skriv därför funktioner för följande uppgifter: ta bort alla blanka ur en sträng konvertera alla bokstäver till versaler (stora bokstäver) i en sträng kontrollera om en sträng är ett palindrom läs in en rad från tangentbordet Programmet skall läsa in en sträng, kontrollera den, meddela om det är ett palindrom eller ej och sedan fråga efter en ny sträng till dess att användaren är nöjd. Ett exempel (med spårutskrifter för att visa vad som händer) Ge en sträng anna Inläst sträng -----anna----- Avblankad sträng -----anna----- Unifierad sträng -----ANNA----- Palindrom Ge en sträng Ni talar bra latin Inläst sträng -----Ni talar bra latin----- Avblankad sträng -----Nitalarbralatin----- Unifierad sträng -----NITALARBRALATIN----- Palindrom Ge en sträng Kul att programmera Inläst sträng -----Kul att programmera----- Avblankad sträng -----Kulattprogrammera----- Unifierad sträng -----KULATTPROGRAMMERA----- First=K Last=A Ej palindrom Tips! I biblioteken som inkluderas med #include <string.h> #include <ctype.h> finns många användbara funktioner. T.ex. så kan man med hjälp av funktionen strlen få fram längden hos en sträng. Filen som du skapar måste heta palindrom.c och ska läggas i din provkatalog. 6(6)