Programmeringsuppgifter 1 Redovisning: Ni demo-kör och förklarar för handledaren några av de program ni gjort. Ni behöver inte hinna allt, redovisa så långt ni kommit. Om ni hinner mer kan ni alltid redovisa igen (före sista redovisningsdatum se nedan). Maxpoäng 14p. Sista datum: Ons 11/11. 1 Teckenvis IO Titta igenom de programexemplen i IO kapitlet i kompendiet innan du börjar (..ännu bättre, läs hemma i lugn och ro). 1. Gör ett program som ersätter ' ' (mellanslag) och '\t' (tab) med tecknet '_ 'repektive '*'. Exempel; Intext: En tab och två mellanslag och en tab till. Uttext: En*tab_och två_mellanslag_och_en*tab_till. Döp programlen (källkoden) till uppg1.1.c eller liknande så att ni direkt kan se vilken uppgift det rör sig om (spara på rätt plats så att ni senare hittar, kolla!). 2. Gör ett program som skriver ut ASCII-tabellen, se Wikipedia. Styrtecknen (ASCII < 32) kan du hoppa över. 3. Skapa ett (mycket enkelt) krypterings program. Programmet bygger på att vi skiftar tecken i ASCII-tabellen. Nedan har man skiftat A till N, B till O, o.s.v, alltså 13 steg i tabellen (bara stora bokstäver visas men samma gäller för små). Order HELLO blir URYYB efter krypteringen se vidare Wikipedia. 1 Produced with Lyx, the open source wordprocessor
Låt programmet läsa tecken för tecken och kryptera den enligt ovan. Användaren skriver in texten och programmet skriver ut den krypterade texten. Vid EOF avslutas programmet (d.v.s. om användaren bara trycker Ctrl d, och inget annat). Vi skall undvika konstanter i koden. Använd ett makro och döp värdet 13 till KEY istället. Använd KEY i koden istället för 13. Exempel på körning;./a.out HELLO (+enter) URYYB Banana (+enter) Onanan (Ctrl d) $ (Program avlutat) Genom att omdirigera kan man kryptera en l. $./a.out < plain.txt > chipher.txt Skapa en enkel textl och skriv något i den. Kör programmet. Titta i utlen, fungerar? 4. Gör ett program som dekrypterar ler som krypterats med föregående program. Testa att kryptera med det förra programmet och dekryptera med detta. 2 Aritmetik och formaterad IO Här behövs operatorer för beräkning samt scanf och printf för att läsa/skriva tal plus eventuellt det vi tidigare använt. 1. Skriv ett program som läser in 3 heltal, beräknar medelvärdet och slutligen skriver ut värdet. Se upp,...vilka fall bör du testa? 2. Skriv ett program som använder formlerna nedan för att beräkna banhöjd och kastlängd, utan luftmotstånd, givet utgångshastighet och kastvinkel (programmet frågar efter hastighet och vinkel). Använd funktioner ur math.h (#include<math.h>). Dessa funktioner kopplas inte automatiskt med, som t.ex funktionerna i stdio.h, utan man måste speciellt ange att detta. Detta görs genom att ge aggan -l och argumentet m då man kompilerar (skriv -lm sist på raden, betyder link math). Sin-funktionen skall ha argumentet i radianer. h = v2 sin 2 α 2 g d = v2 sin 2α g h = kasthöjd i m, d = kastlängd i m, v = hastighet i m/s, g = tyngdacceleration (9.81) i m/sek2, α= kastvinkel i grader. För tester se http://hyperphysics.phyastr.gsu.edu/ hbase/traj.html. Några exempel på värden (ev avrundningsfel kan förekomma) ; 2 Produced with Lyx, the open source wordprocessor
v α h d 1 45 0.0255 0.1020 10 45 2.5510 10.2041 10 60 3.8265 8.8370 3. Skriv ett program som läser in tre tal och därefter skriver ut det största. Igen,...vilka fall skall testas? 4. Skriv ett program som låter användaren summera ett godtyckligt antal positiva heltal (<1000000). När ett negativt tal anges skriver programmet ut summan av alla inmatade tal förutom det sista, därefter avslutas programmet. 3 En räknare Varje version bygger på den föregående. Gör precis så mycket som anges vid varje version spara undan och börja på nästa. 1. Utveckla en enkel kalkylator (som bara kan göra en beräkning i taget, kedjade beräkningar t.ex. 1 + 2 + 3 går inte). Version Specikation 1.0 Fråga efter två heltal, läsa in och addera dessa, skriv ut resultatet som t.ex. 4 + 3 = 7. Programmet av-slutas. 2.0 Lägg till att programmet frågar efter räknesätt (ett tecken +,-,*,/) och därefter två tal. Modiera så att programmet stöder reella tal (oat räcker). Programmet skall visa resultatet på formen; 1.200000 * 2.300000 = 2.760000 (om man valt multiplikation). Se upp med att tömma inströmmen! 3.0 Gör så att man kan utföra era enkla beräkningar i följd (inte kedjade beräkningar). Programmet avslutas med Ctrl c. 3.1 Stämmer designen? Inläsning, bearbetning, utmatning inte blanda beräkning och IO? Bra namn på allt? Kan man ersätta if med else if? Konstanter i koden? Behövs kommentarer? 2p 4 Gissa talet Vi gör en egen version av världens tråkigaste spel; Alltså: Datorn slumpar ett tal och användaren försöker gissa vilket talet är. 3 Produced with Lyx, the open source wordprocessor
Version Specikation 1.0 Datorn slumpar ett tal mellan 1 och 100. Användaren gissar vilket. Om rätt så skrivs Rätt ut annars Fel. Programmet avslutas. 2.0 Lägg till så att användaren kan gissa hur många gånger som helst. Vid rätt gissning avslutas programmet (annars Ctrl c för att stoppa programmet). 2.1 Lägg till så att användaren kan avbryta genom att ange ett negativt tal. 3.0 Lägg till så att programmet säger om det gissade talet var för stort eller för litet. 3.1 Lägg till så att programmet håller reda på antal gissningar. Antalet skrivs ut då programmet avslutas. 3.2 Stämmer designen? Bra namn på allt? Kan man ersätta if med else if? Konstanter i koden? Behövs kommentarer? 5 Ett övningsprogram 1. Utveckla ett övningsprogram för multiplikationstabeller. För slumptal måsta man inkludera time.h. Version Specikation 1.0 Slumpa två heltal mellan 1 och 9. Skriv ut 3 * 5 = (om 3 och 5 slumpades). Läs in svar från användaren. Om rätt svar, skriv ut Rätt annars Fel. Programmet avslutas. 2.0 Gör så att programmet kör godtyckligt antal frågot i följd. Programmet avslutas med Ctrl c 3.0 Gör så att programmet avbryts då användaren svarar -1. 4.0 Lägg till statistik som skrivs ut då programmet avslutas t.ex. Du hade 6 rätt av 8. Hur många variabler behövs? 5.0 Gör så att användaren kan välja tabell 1-9 (bara ett tal slumpas i så fall). Om 0 anges som tabell slumpas båda talen på samma sätt som tidigare. 5.1 Stämmer designen. Bra namn på allt? Konstanter i koden? If eller else if? Stil! 6 Frivilliga uppgifter 6.1 Lättare 1. Gör program som använder enkla formler. Programmen frågar efter indata och beräknar utdata m.h.a. formeln. Några exempel; 2p 2p 4 Produced with Lyx, the open source wordprocessor
a) Area eller volym för olika gurer/kroppar. b) Enkla elektro-formler, U= RI, o.s.v. 2. Gör program som byter ut något tecken i en inström mot något annat. Gör t.ex. så att man kan ange vilket tecken som skall bytas ut (och vad som skall ersätta). 3. Gör program som eliminerar följder av tecken t.ex. era mellanslag ersätt med ett o.s.v. 6.2 Svårare Övning för dig som siktar på högre betyg. Rekommenderas för DAI. 1. Konstruera ett C program som beräknar påskdagen givet ett årtal i intervallet 1900-2099. Använd metoden nedan. Inga felkontroller behövs! Tabellen visar några datum; År Datum för påskdag 2002 31:a mars 2003 20:e april 2004 11:e april Den berömde tyske matematikern C. F. Gauss konstruerade en metod för att räkna ut hur påskdagen infaller olika år (fungerar mellan 1900-2099). Metoden lyder; Beräkna följande (givet årtal): A = årtal mod 19 ( mod = modulo = resten då årtal divideras med 19) B = årtal mod 4 C = årtal mod 7 S = 19 A + 24 D = S mod 30 T = 2 B + 4 C + 6 D + 5 E = T mod 7 datum = 22 + D + E Om datum är mindre än 32 infaller påskdagen på detta datum i mars. Annars sätts datum = D+E-9 och påskdagen inträar då detta datum i april, fast med två undantag. Om datum = 26 förläggs påskdagen den 19 april. Om datum = 25 samtidigt som A = 16 och D = 28 rar vi den 18 april istället. 5 Produced with Lyx, the open source wordprocessor
2. Undersök kommandot nl. Skriv nl i terminalen. Skriv lite text och tryck return, vad händer. Generera EOF. Vad händer? Omdirigera nl att läsa från någon l d.v.s. $ nl < myle. Vad händer? Ibland verkar nl numrera tomma rader ibland inte? Fundera! Skriv en egen version av nl. TIPS: Vi vet inte hur långa raderna är bara att de avslutas med '\n'. 3. Run length encoding (RLE) är en enkel metod att komprimera data. Den fungerar på så sätt att man helt enkelt räknar hur många likadana tecken i följd men har och sedan ersätter följden av tecknen med antalet och ett tecken. Exempel; aaaaaaaaaaaabbbbbbbb qwweeerrrrtttyyu blir 12a8b blir 1q2w3e4r3t2y1u Tips: Använd ungetc. Ni skall inte behöva använda fält (arrayer). 4. Använd gfx-bibioteket (kurssidan) och gör ett program som ritar ut något (modern konst). Biblioteket består av 2-ler, gfx.h och gfx_lib.c (det nns dessutom några demo-program). Läs i lerna hur man använder biblioteket. Använd loopar och slumptal för att få så mycket som möjlig gjort med så lite kod som möjligt. 5. Gör ett litet dataspel (lämplig typ; arkad) m.h.a. gfx biblioteket. IO är lite problemetisk, man får mata in via terminalen, se demo. Om man vill kan man bygga på gfx-biblioteket med händelsehantering se t.ex. http://users.actcom.co.il/~choo/lupg/ tutorials/xlib-programming/ xlib-programming.html 6 Produced with Lyx, the open source wordprocessor