J 101 Belysning av klot Ett klot med centrum i origo och med radien r är belyst av ljus som faller in parallellt med den linje som gνar igenom punkten (x 0 ;y 0 ;z 0 )pνa klotets yta och origo. Uppgiften är att skriva ett program som beräknar belysningsvariationen pνa klotet och som ger en snygg bild av det belysta klotet pνa datorn. Belysningsintensiteten b i en punkt (x; y; z) pνa klotet är proportionell mot cos(v) där v är ljusets infallsvinkel i punkten. Lνat proportionalitetskonstanten vara 1, vilket innebär att belysningen b kommer att anta värden mellan 1 och 1. Rita pνa svart bakgrund, och använd c = new Color(b, b, b) för att fνa en grνa färg med intensitet b. För att rita en enstaka punkt kan du rita en linje som börjar och slutar i samma punkt. Intensiteten b = cos(v) i punkten (x; y; z) beräknas med skalärprodukten Skriv ett program som: b =(x x 0 +y y 0 +z z 0 )=r 2 ffl Läser in värden pνa r (klotets radie), x 0, y 0 (definierar ljuskällan). I grunduppgiften kan dessa värden läsas in i terminalfönstret. ffl Kontrollerar indata, uttrycket nedan under rottecknet ska ej bli negativt. Om uttrycket under rottecknet blir negativt ligger ljuskällan felaktigt och nya indata för x 0 och y 0 mνaste inhämtas. Därefter beräknas z 0 enligt formeln. z 0 = q r 2 x 2 0 y2 0 ffl Därefter ska programmet genomlöpa alla x-ochy-värden i intervallet ( r;r)ochför varje talpar (x; y) beräkna motsvarande positiva z-koordinat pνa klotytan. Tänk pνa att även här kontrollera rotuttrycket. Blir resultatet negativt under rotuttrycket, ligger punkten utanför klotets yta (lνat b = 0där). q z = r 2 x 2 y 2 Betygsnivνakrav: 1. Ett nödtorftigt fungerande program 2. Ett perfekt program 3. Lνat användaren flytta ljuskällans genom att klicka med musen pνa klotet. Ljuskällan ska bara flyttas om klickningen sker pνa klotet (inte om man pekar pνa bakgrunden), annars kommer det inte att gνa att beräkna z 0.
J 102 Bilnummer Som bekant har man i Sverige ett bilregister där bilnumren bestνar av tre bokstäver och tre siffror. (Man kan ocksνa betala för att fνa ett annat, personligt registreringsnummer, men den här uppgiften handlar om de vanliga numren, enligt den gamla standarden.) Bokstäverna väljs ur en delmängd av det svenska alfabetet: A B C D E F G H J K L M N O P R S T U W X Y Z Man använder sig av en slumptalsgenerator för att generera sνaväl bokstäverna som siffrorna. Vissa av kombinationerna anses vara olämpliga och tillνats därför inte. Skriv ett program som kan generera och kontrollera bilnummer. Programmet ska visa följande meny. 1 Slumpa fram bilnummer 2 Kontrollera bilnummer 3 Skriv förbjudna ord 4 Avsluta I menyalternativ 1 fνar man sedan ange hur mνanga bilnummer som ska slumpas fram. I alternativ 2 skriver man in bilnummer och fνar kommentarer som ABC123 OK FAN666 Förbjudet ord OSQ999 Felaktig bokstav CBA32l Felaktig siffra KUL4711 Fel längd Alternativ 3 skriver ut de förbjudna orden, som du själv har skrivit in pνa en fil. Den kan se ut sνa här: FAN GUD FUL... För betyg 2 ska programmet läsa in de förbjudna orden i ett binärträd eller en ordnad vektor. Betygsnivνakrav: 1. Ett program med smärre brister. 2. Ett perfekt program. 3. Grafiskt program eller applet.
J 103 Bostadsinköp Programmet ska använda sig av en textfil som innehνaller data om bostäder. Den kan t. ex. se ut sνa här: % Format: Omrνade / Pris / Bostadsyta / Hyra / TelNr / Gatuadress Bagarmossen 450000 55.5 1450 08-621 33 04 Brickebacken 7 osv... Användaren ska vid programstart ange: ffl Aktuell bankränta (%) ffl Kontantinsatsen (kr) ffl Aktuellt ränteavdrag (%) Programmet ska sedan beräkna mνanadskostnaden samt kvadratmeterpriset för bostäderna enligt följande kalkyl: (pris kontantinsats) ränta (1 ränteavdrag 100 mνanadskostnad = hyra + 12 ytkostnad = pris yta 100 ) Användaren ska kunna göra ett urval mha menyer (textbaserade i grunduppgiften). Parametrarna har inledningsvis lämpliga startvärden. Aktuella värden anges inom parenteser. Användaren ska kunna ändra dessa. Grundmenyn kan se ut sνa här: Dina valmöjligheter: O) Ändra önskat Omrνade (Alla) M) Ändra önskad Mνanadskostnad (< 10 kkr) H) Ändra önskad Hyra (< 5 kkr) K) Ändra önskat Kvadratmeterpris (< 20 kkr) B) Ändra önskad Boendeyta (> 5 kvm) U) Skapa Urval A) Avsluta Ditt val (O M H K B U A): VGV
Vill användaren t. ex. ändra gränserna för mνanadskostnaden ska användaren besvara en frνaga: Mνanadskostnaden ska högst vara (kkr): Efter att frνagan har besvarats ska grundmenyn νater visas, nu med ett nytt värde pνa mνanadskostnaden. När användaren är nöjd med urvalsparametrarna ska denne välja Skapa Urvalöch urvalet (d v s de bostäder som uppfyller kraven) ska presenteras en skärmsida i taget. Efter avslutad visning ska resultatet kunna skrivas pνa fil. Denna kan sedan skrivas ut pνa skrivaren efter programkörningen. Presentationen kan se ut sνa här: Omrνade: Bagarmossen Boyta: 55.5 kvm Pris: 450,000 kr Hyra: 1450 kr TelNr: 08-621 33 04 Gatuadress: Brickebacken 7 Mνanadskostnad: 5627.2 kr Kvadratmeterpris: 8108.1 kr/kvm Programmet ska avslutas när användaren väljer alternativet Sluta"i grundmenyn. Betygsnivνakrav: 1. Ett program med smärre brister. 2. Ett perfekt program. 3. Grafiskt program eller applet.
J 104 Bulgarisk patiens Regler för bulgarisk patiens: ffl En del av en vanlig kortlek (minst 2 kort, högst 52) fördelas godtyckligt i nνagra högar pνa bordet (valören pνa korten är ointressant i detta spel). ffl Ett kort tas frνan varje hög och dessa fνar bilda en ny hög. Upprepa detta tills det gνar att avgöra att patiensen har gνatt ut (se nedan). Exempel: Vi väljer följande tre högar (totalt 10 kort): 4 4 2 Efter ett steg har vi fyra högar: 3 3 1 3 Efter ytterligare ett steg försvinner en hög: 2 2 2 4 ) 2 2 2 4 För enkelhetens skull skriver vi fr.o.m. nu högarna i storleksordning. I nästa steg fνar vi: 4 3 1 1 1 I nästa steg försvinner tre högar och en ny kommer till: 5 3 2 Inga högar försvinner, en kommer till. Vi fνar: 4 3 2 1 Nästa steg blir faktiskt ocksνa: 4 3 2 1 Likasνa nästa... 4 3 2 1 osv... Vi har alltsνa nνatt ett stabilt läge och patiensen har gνatt ut! Skriv ett program som läser in startfördelningen och som sedan skriver ut stegen fram till att patiensen har gνatt ut eller maximalt 25 steg. Högarna skall skrivas ut i storleksordning (inmatningen ska inte behöva vara det!). Startfördelningens antal kort mνaste kontrolleras (2» antal» 52). Vid felaktig inmatning ska felmeddelande skrivas ut och användaren ska mata in en ny fördelning. Programmet ska även ge en kommentar om patiensen har gνatt ut eller ej. Experimentera med ditt program och ta reda pνa villkoret för att patiensen ska gνa ut. Det är oväntat enkelt! Betygsnivνakrav: 1. Ett halvbra fungerande program 2. Ett perfekt program 3. Grafik eller applet
J 105 Chiffreringsprogram En hemlig text som datorlagras bör helst chiffreras. Ett enkelt chiffreringsprogram skall läsa filen, tecken för tecken och skriva ut chiffrerade tecken pνa en annan fil. Din uppgift är att skriva ett chiffreringsprogram som uppför sig sνa här: Infilnamn: vanlig.txt Utfilnamn: hemlig.txt Ge ett nyckelord pνa minst sex bokstäver: lajban OK, nyckelordet behövs när du vill dechiffrera hemlig. Du mνaste själv uppfinna chiffreringsalgoritmen. Nyckelordets bokstäver är med och pνaverkar översättningen. I alla händelser ska tvνa körningar med samma nyckelord ge ursprungstexten tillbaka. Man skall med andra ord inte behöva ange om det rör sig om en chiffrering eller en dechiffrering. Som test kan du prova att chiffrera javaprogrammet självt. Tips: Tänk pνa att ASCII-koden hνaller sig inom ett visst intervall. Tecken med asciikod < 32 kan ställa till problem eftersom Read(tkn) läser in alla tecken med ascii-kod < 32 som blanka. Du mνaste alltsνa undvika att man vid kryptering / dekryptering, fνar fram ett tal som ligger utanför intervallet. Heltalsoperatorn % är användbar:::. För att kryptering och dekryptering använder man sambandet n (teckensomskakrypteras)+lösenordsberoendekod=(krypterattecken) Talet n väljs sνa att krypterattecken hamnar inom lämpligt intervall. Sambandet kan ocksνa skrivas n (krypterattecken)+lösenordsberoendekod=(teckensomskakrypteras) och det visar att andra krypteringen ger tillbaka ursprungsfilen. Betygsnivνakrav: 1. Ett program med smärre brister. 2. Ett perfekt program. 3. Om man ur lösenordet beräknar ett enda tal (lösenordsberoende kod) som används vid chiffreringen av varje bokstav sνa blir det ganska lätt att knäcka chiffret. Istället kan man lνata den lösenordsberoende koden variera inom den fil man chiffrerar. Om man t ex vill chiffrera ordet hemlighet med nyckelordet lajban sνa chiffrerar man h med l e med a m med j l med b i med a g med n h med l e med a t med j
J 106 Dartspel I pilkastningsspelet dart är tavlan indelad i tjugo sektorer (och i ringar, vilket vi just nu inte bryr oss om). Du ska skriva ett program som undersöker vilken sektor som ger bäst utdelning. Denna undersökning ska grundas pνa de närliggande sektorernas poäng samt risken för att man missar den sektor man siktar pνa. Lägg upp en sektorvektor med poängen. Dartsektorernas poäng medurs (20 = kl 12.00), s 9 :::s 10 : 1,18,4,13,6,10,15,2,17,3,19,7,16,8,11,14,9,12,5,20 9 12 5 20 1 18 4 14 13 11 6 8 10 16 15 7 19 3 17 2 Givet att en dartspelare siktar pνa sektor k, representerar sannolikheterna p 9 :::p 10 : p 9 = Sannolikheten att träffa sektorn nio steg moturs frνan sektor k. p 0 = Sannolikheten att träffa den sektor man siktar pνa (sektor k) p 1 = Sannolikheten att träffa sektorn ett steg medurs frνan sektor k. p 10 = Sannolikheten att träffa sektorn mittemot"(speglat i tavlans mittpunkt) Vi kan alltsνa skapa en vektor med 20 element, med index i intervallet 9 :::10, vilken beskriver sannolikheterna att träffa de olika sektorerna. Darttavlans poäng lägger du naturligtvis pνa en indatafil. Programmet skall läsa in olika dartspelares data frνan en fil, som du ocksνa fνar skriva ihop själv. Den kan se ut sνa här: Format: namn (max 30 tkn)/ sannolikhetsvektor (20 st flyttal,» 1) ============================================================== Ian McDowell 0 0 0 0 0 0 0 0.01 0.03 0.89 0.04 0.01 0 0 0 0 0 0 0 0.005 Ture Teknolog 0 0 0.01 0.01 0 0 0.01 0.05 0.25 0.28 0.25 0.05 0.01 0.01 0 0 0 0 0 0.7 VGV
Programmet ska beräkna p sum = summan av de 20 sannolikheterna och kontrollera att p sum» 1. Som resultat presenteras spelarnas fyra bästa sektorer och dessa sektorers respektive medelpoäng. Spelarna ska presenteras i rangordning (sorterade med avseende pνa sin bästa sektors medelpoäng). Tips: Programmet skall undersöka vilken sektor som ger bäst utdelning. Följande punkter kan vara ledande: ffl Bilda en heltalsvektor (s) som innehνaller de olika sektorernas poäng. ffl Bilda en postvektor (r) som innehνaller resultaten. Varje post i denna vektor ska innehνalla tvνa variabler. En heltalsvariabel som anger vilken sektor vi har siktat pνa och ett flyttal som anger poängsumman (resultatet). ffl Om man siktar pνa en sektor k (med poäng s k ) blir kastets utdelning i medeltal: m k = p 9 s k 9 + +p 0 s k + +p 10 s k+10 ffl Börja med att sikta pνa ettan, beräkna dess medelutdelning och spara resultatet (i resultatvektorn). Använd dig gärna av insättningssortering. Flytta siktpunkten ett steg medurs, dvs sikta pνa arton, osv::: De olika spelarnas data kan lagras i en vektor av poster. Sannolikhetsindexet ger ju antalet steg du ska stega bort ifrνan den sektor som du siktar pνa. För att undvika indexfel (man hamnar utanför indexgränserna) kan du dubblera din sektorvektor. Den blir 40 element lνang och innehνaller tvνa dubbletter av varje sektors poäng, s 9 ;:::;s 10 ;s 9 ;:::;s 10. Rita upp bνade sannolikhetsvektorn och den dubbla sektorvektorn under varandra. Dνa ser du förhoppningsvis fördelarna med att dubblera sektorvektorn. Betygsnivνakrav: 1. Ett program med smärre brister. 2. Ett perfekt program 3. Utöka programmet sνa att en piltävling kan äga rum mellan de olika spelarna. De kastar alla tre stycken pilar och siktar pνa sin bästasektor. Varje kast simuleras med hjälp av den aktuelle spelarens sannolikhetsvektor och en slumpfunktion. Först till 100 vinner. Alternativt kan du för högsta betyget i stället simulera en riktig darttävling där spelarna börjar pνa 301 och räknar ner till noll. I yttersta delen av sektorn räknas pilarna dubbelt, i innersta delen trippelt. Oxögat i mitten är värt 50. Bestäm själv hur sannolikheterna för fälten ska räknas fram. Pilar som skulle föra en under noll räknas inte och sista pilen mνaste vara en dubbel. När poängen är tillräckligt nära noll mνaste programmet byta strategi och försöka kasta precis snarare än maximalt.
J 107 Analys av fartygstransporter Ett rederi vill ta fram ett hjälpmedel för att beräkna lönsamheten för fartygstransporter pνa en sträcka. De vill nu undersöka olika kombinationer av transporter. Din uppgift blir att skriva ett program som beräknar de förväntade kostnaderna för de olika transportkombinationerna för ett av användaren angivet transportavstνand. Du fνar själv skriva ihop en fil som beskriver lasterna och fartyget som ska transportera lasten. Den kan se ut sνa här (siffrorna nedan är grovt skattade, förbättra dem gärna!): Lasttyperna, format: Last (max 20 tkn) / Densitet (ton/m 3 ) / Lastvärde/ton (kkr) / Lastningskostnad (kkr/ton) ============================================================== Trä 0.52 105 15 Papper 0.75 135. ============================================================== Fartyget, format: Fartygets namn (max 20 tkn) / Lastutrymme (m 3 ) / Lastkapacitet (kton) / Marschfart (knop) / Driftskostnad (kkr/dygn) ============================================================== Fanderchief 2000 15 18 92 Rederiets experter använder en modell som ska simulera strömmarnas och vädrets inverkan pνa medelhastigheten längs sträckan. VGV
Den har följande parametrar: färdavstνand, z, (distansminuter) Anges av programanvändaren. avstνandsvariabel, s, (distansminuter) Variabel som stegas med lämpligt intervall, tex 0.1z. Hastigheten är approximativt konstant i ett intervall. marschfarten, mfart, (knop) Fart vid ostörda förhνallanden. Anges i fartygsspecifikationen. slumpmässig fartändring, vbrus (vbrus = Normal(0,0.1)) Väderberoende ändring av hastigheten. Ett normalfördelat slumptal med medelvärdet 0 och standardavvikelsen 0.1. Se filen random.txt andel av full lastkapacitet, p Om ett fartyg med lastkapaciteten 15 ton är lastat med 7.5 ton blir p =0:5. För medelhastigheten under sträckan gäller: v(s) =(mfart (1 + 0:5 p sin(s 0:4z))) (1 + vbrus) 0 <s»0:4z v(s)=(mfart (1 + 0:5 cos(s 0:2z))) (1 + vbrus) 0:4z <s»0:6z v(s)=mfart e ( z s 0:9) (1 + vbrus) 0:6z <s»z Med hjälp av denna modell ska du ta fram den totala färdtiden och beräkna den förväntade kostnaden för färden. Om resan delas upp i n (t ex 10) intervall kan den totala färdtiden skrivas: T = z n nx i=1 1 v( i n z) Användaren skall efter avslutad beräkning kunna ta fram en tabell över de olika lastalternativens resultat (sorterade map lönsamhet). Presentationen ska antingen skrivas ned pνa en fil eller direkt ut pνa skärmen. Det kan se ut sνa här: Färdavstνand: 10000 distansminuter. ================================== Fartygsnamn: Fanderchief Lastalternativ & avkastning: Papper 83 kkr Trä -50 kkr... Betygsnivνakrav: 1. Ett program med smärre brister. 2. Ett perfekt program. 3. Grafiskt program eller applet.
J 108 Fotbollsserie Svenska Fotbollförbundet har gett dig i uppdrag att skriva ett program som tar emot matchresultat och skriver ut aktuellt utseende pνa serietabellen. Namnen pνa lagen och deras resultat ska ligga i en fil som du skriver ihop själv (se även tipset). Lagens data läggs ned i en datastruktur (vektor, lista el. dyl.) vid programstart. För att underlätta inmatningen kan varje lag betecknas med sitt ordningsnummer. Här nedan visas hur det kan se ut efter ett par matcher: S V O F M Po 1 Öster 3 2 1 0 9-4 7 2 Malmö FF 2 2 0 0 4-1 6 3 IFK Göteborg 3 0 1 2 3-8 1 4 AIK 2 0 0 2 0-3 0 Hemmalag= 4 Bortalag= 2 Resultat= 17-0 S V O F M Po 1 Öster 3 2 1 0 9-4 7 2 Malmö FF 3 2 0 1 4-18 6 3 AIK 3 1 0 2 17-3 2 4 IFK Göteborg 3 0 1 2 3-8 1 Hemmalag= Formatet pνa tabellen: Först ordningsnummer och lagnamn. Därefter kommer lagens data: S = antal spelade matcher, V = antal vunna matcher, O = antal oavgjorda matcher, F = antal förlorade matcher, M = antal gjorda respektive insläppta mνal och till sist Po = antal poäng. Vunna matcher ger tre poäng och oavgjorda en poäng. Programmet ska sortera lagen efter poängtal. Om tvνa lag har samma poäng ska mνalskillnaden avgöra. Om tvνa lag har samma mνalskillnad skall antalet gjorda mνal avgöra. Om alla uppgifter är lika för tvνa (eller flera) lag sνa ska de hamna i bokstavsordning efter lagnamnet. Programmet ska startas med att man läser in lagens data (se tips). Användaren ska erhνalla tydliga instruktioner, gärna i form av olika menyval (t.ex. Mata in resultat", Se tabell", Ävsluta"etc.) Efter varje resultatinmatning ska tabellen visas, men man ska även kunna titta pνa tabellen utan att mata in nνagra resultat (genom ett av menyvalen). Tips: Lagens data sparas mellan körningarna pνa en fil (lättast att använda sig av en textfil som du kan redigera själv). Denna fil läses in vid programstart och varje lags data kan lagras i ett objekt, som sedan lagras i en vektor av lagobjekt. Ditt program ska räkna antalet lag vid inläsningen frνan filen. Betygsnivνakrav: 1. Ett program med smärre brister. 2. Ett perfekt program. 3. Grafiskt program.
J 109 Glosförhör Du ska skriva ett program som genomför ett glosförhör och bedömer skickligheten för den som förhörs. Programmet ska anpassa ordens svνarighetsgrad efter skickligheten hos den förhörde. Programmet ska använda sig av en fil som du själv ska skriva ihop. Exempel pνa körning: För att avsluta, svara '#': Skicklighet: 0.00 kropp=body Skicklighet: 0.75 lön=salary Skicklighet: 1.12 kontrollera=control Beklagar, vi tänkte oss check Skicklighet: 0.92 undervisning=? Tips, det börjar med e... undervisning=education Skicklighet: 1.16 kontrollera=# Tack och hej! Ordfilen kan t ex se ut sνa här: 1 kropp body 1 lön salary 2 kontrollera check 3 tacka ewe 1 undervisning education Siffran anger svνarighet. Programmet väljer hela tiden ord med svνarighet närmast över den skicklighet som för tillfället gäller. Skicklighet=2.1 ger sνalunda ord med svνarighet 3. Om man klarar glosan höjs skicklighetstalet till medelvärdet mellan skickligheten och (svνarigheten+0.5). Om man svarar fel sjunker skickligheten med 0.2. Man kan begära att fνa se första bokstaven i svaret, men det kostar 0.1 poäng. Filen som du skriver ihop själv, ska innehνalla minst tjugo ord. Hela filen ska inte läsas in i en vektor eller liknande (de enskilda glosorna fνar naturligtvis lagras i String-variabler eller motsvarande) eftersom en verklig glosfil kan tänkas vara större än vad som ryms i primärminnet pνa en dator. För varje glosa skall man läsa frνan filen med början där man stνar tills man hittar nästa glosa med rätt svνarighetsgrad. När man under denna sökning nνar filslut skall man starta frνan början i filen igen. Man kan alltsνa bli förhörd pνa samma glosa flera gνanger. Användaren bestämmer själv när förhöret skall avslutas. Betygsnivνakrav:
1. Ett program med smärre brister. 2. Ett perfekt program. 3. Se till att programmet klarar av att hantera synonymer (högst fem). Filen kan dνa seut sνahär: 1 kropp body 1 lön salary wages 2 kontrollera check 3 tacka ewe thank 1 undervisning education Man ska fνa rätt oberoende av vilken synonym man svarar. Frνagar man om tips, ger programmet begynnelsebokstaven i det första ordet.
J 110 Kalender Skriv ett program som skriver ut en kalender för ett godtyckligt νar i intervallet 1901-2099. Indata till programmet ska vara νartalet. Genom att ha veckodag för första januari ett visst νar som konstant i programmet, kan du räkna ut den för alla andra νar. Anpassning till ev skottνar ska ske. För att νartalet ska vara ett skottνar gäller: (νartalet %4=0)och(νartal % 100 6= 0) eller νartal % 400 = 0 Utskriften ska i princip överensstämma med följande exempel: Kalenderprogram Ange νar och mνanadsnummer, tex 1999 4: 1990 2 Februari Mνa Ti On To Fr Lö Sö 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 Ange νar och mνanadsnummer, tex 1999 4: 1990 2... Tips: En textfil med data om mνanaderna (antal dagar och namn) som kan läsas in till en vektor av mνanadsobjekt förenklar programmet avsevärt. Betygsnivνakrav: 1. Ett program med smärre brister. 2. Ett perfekt program. 3. Lνat programmet skriva ut söndagar och helgdagar (d v s röda dagar) med röd text. (Utmatningen mνaste nu ske i ett grafikfönster.) Följande dagar ska markeras: ffl Trettondagen (6/1) ffl Första maj ffl De röda dagarna i pνaskhelgen. Pνaskdagen beräknas sνa här: Lνat Y vara νartalet vars pνaskdag önskas. νarhundradet C är (Y / 100) + 1. Det gyllene talet G är (Y % 19) + 1. Solνarets överskott över mνanνaret, epakten E, beräknas enligt Λ E = (11G + 20 +Z-X)%30,där Z och Xär korrektionstermer, se nedan.
Λ Om E=25 och samtidigt G>11, ska Eökas med 1. Λ Om E=24 ska Eökas med 1. X är antalet överhoppade skottdagar, X = ((3C) / 4) - 12. Z, mνankorrektionen, är Z = ((8C + 5) / 25) - 5 Den första fullmνanen som inträffar efter (eller pνa) vνardagjämningen - som ju oftast är den 21 mars (du kan anta att den är 21 mars) - inträffar den N mars, där N = 44 - E. Om N < 21, ska Nökas med 30. Pνaskdagen är första söndagen efter denna fullmνane. Det sνa kallade söndagstalet, D, ges av D = ((5Y) / 4) - X - 10. Första söndagen efter fullmνane bestäms av S = N + 7-((D + N)%7). Om S > 31 infaller pνaskdagen den (S-31) april, annars den S mars. ffl Kristi Himmelfärdsdag (40:e dagen efter pνaskdagen) ffl De röda dagarna i pingsthelgen. Pingstdagen är 50:e dagen efter pνaskdagen. ffl Midsommardagen (Ska vara 1:a lördagen efter sommarsolstνandet. Du kan anta att Midsommardagen är lördagen i intervallet 20-26 juni.) ffl Alla Helgons Dag (Lördagen i intervallet 31 okt - 6 nov). ffl Julens helgdagar (Juldagen är den 25/12) ffl Nyνarsdagen (den 1/1)
J 111 Kedjeord Det gäller att bilda längsta möjliga ordkedja av typen: BEVIS VISPA SPALT ALTRÄ TRÄCK ÄCKLA KLAMP AMPER PERUK Dessa ord är hämtade ur filen ordlista.txt. Den innehνaller 1862 ord och varje ord bestνar av fem olika bokstäver. Det är lämpligt att först läsa in orden ienarray. Alla är tänkbara som första ord i kedjan, men i nästa kedjeord är tre bokstäver givna. Har vi tagit BEVIS som vνart första kedjeord skall vi alltsνa söka efter ord som börjar pνa VIS. Alla ord som börjar pνa VIS ska nu undersökas. För t.ex. ordet VISKA skall sedan alla ord som börjar pνa SKA undersökas. När du i ett givet steg inte kan finna nνagra ord att fortsätta med har du en avslutad ordkedja. Kontrollera om denna är längre än den hittills längsta. När samtliga ordkedjor har provats, skrivs den längsta ordkedjan ut pνa skärmen. Observera att varje ord fνar förekomma högst en gνang i kedjan Tips: Provkör programmet med en liten indatafil, t ex med de nio orden ovan. Betygsnivνakrav: 1. Ett program med smärre brister. 2. Ett perfekt program. 3. Grafiskt program eller applet.
J 112 Kontaktförmedling Du ska skriva ett program νat företaget datakontakt. Företaget νatar sig att förmedla en idealpartner för 300 kr. Vid en sνadan förmedling fνar man först fylla i ett formulär av följande slag: Vilket kön sökes? m (man) / k (kvinna) / b (bägge):... Gradera frνan 0 till 5 hur du värdesätter följande: Ungdom... Skönhet... Intelligens... Humor... Förmögenhet... Sexighet... Utbildning... Du skall själv skriva in registret som ska användas. Det kan se ut sνa här: Format: Namn(max 20 tkn),kön(m/k),νalder(νar),skönhet(0-1),intelligens(runt 100), humor(0-1),förmögenhet(kkr),sexighet(0-1),utbildning(0-1) ============================================================== Hubert m 35 0.45 110 1.0 120 0.8 0.6 Erika k 24 0.85 90 1.0 0 1.0 0.2 Beata k 55 0.25 120 0.8 1500 0 0.5 osv... Programmet ska läsa in önskemνalen (betyg och kön) enligt formuläret ovan. Programmet ska ta fram ett betyg pνa varje person genom att vikta varje egenskap med det tal som angivits i formuläret. De tio mest lämpliga personerna ska presenteras i betygsordning. I presentationen skall personernas data tas med. Vi använder oss av följande metod: ffl Har personen rätt kön? ffl Vi normerar alla värden genom att dividera dem med resp egenskaps maxvärde (ex νaldermax bland de tre ovanstνaende personerna är 55, dividera alla νaldrar med 55. Utbildningsmax är 0.6, dividera...). Detta betyder att de normerade värdena kommer att vara tal mellan 0 och 1. (1.0 - normerad νalder) motsvarar ungdom. ffl Därefter multiplicerar vi de normerade värdena med respektive vikt och summerar ihop dessa tal. Summan blir personens betyg. VGV
Tips: Personernas data lagras lämpligen i ett objekt (definiera en personklass). Detta objekt kan innehνalla ett fält som anger personens kön och en flyttalsvektor. Flyttalsvektorn innehνaller egenskapernas värden (som sedan normeras), samt betyget. Hela personregistret byggs upp som en vektor av personobjekt. Efter betygsättningen, sorteras denna vektor med avseende pνa betygen. De tio bästa skrivs ut. Antalet egenskaper bör vara en konstant, sνa att man lätt kan öka antalet egenskaper (behöver bara ändra konstanten). Betygsnivνakrav: 1. Ett program som i stort sett fungerar. 2. Ett perfekt program. 3. Användaren kan lägga till eller ta bort en person ur registret. Filen ska givetvis uppdateras. Observera att det blir nödvändigt att normera om när personer läggs till eller tas bort. Alternativt kan man göra ett grafiskt användargränssnitt. Lνat användaren mata in sina önskemνal genom att fylla i ett formulär med textfält, knappar etc.
J 113 Konversationsprogram Gör ett program som för en konversation av nedanstνaende typ. Hej, jag heter Snacke! Vad heter du? Sofia Roligt att träffa dej, Sofia! Vad har du för problem? Jag äter för mycket engelsk konfekt! Jasνa, Sofia, du äter för mycket engelsk konfekt. Än sen? Jag blir för tjock. Jasνa, Sofia, du blir för tjock. Än sen? Dνa blir mina byxor för trνanga. Jasνa, Sofia, dνa blir dina byxor för trνanga. Än sen? Jag vill känna mej smal, pappskalle! Jasνa, Sofia, du vill känna dej smal, pappskalle. Än sen? Har du svνart att fatta, din fjant? Jasνa, Sofia, har jag svνart att fatta, min fjant. Än sen? osv... Programmet ska alltsνa kunna känna igen orden jag, du, min, din, mej, dej, mig, dig med flera och pνa lämpligt sätt byta ut dem. För att det ska vara lätt att utöka antalet ord som programmet ska känna igen och byta ut, ska du skriva ned orden och deras utbytesord pνa en fil. Den kan se ut sνa här: jag du min din mig dig... Observera att programmet inte ska söka enbart pνa det första av de tvνa orden, utan även det andra. Du ska alltsνa inte skriva filen sνa här: jag du du jag min din din min... VGV
För att minskaantalet läsningar av filen ska duläsa in ordparen i en en vektor. Lνat vektorn innehνalla objekt som hνaller reda pνa ett ordpar. Programmet avslutas genom att användaren ger ett RETURN-tecken istället för en textrad. Programmet ska jämföra det utplockade ordet med orden i ordlistan. Hittas ett identiskt ord, byter vi ut det mot det andra ordet i ordparet. Efter avslutad sökning skrivs ordet ut pνa skärmen (i datorns svar). Tänk pνa att översätta alla bokstäver i orden till smνa eller stora bokstäver (samma som i ordlistan). Tips: För att fνa användarens inmatade mening uppdelad i ord kan det vara bra att använda klassen StringTokenizer. Betygsnivνakrav: 1. Ett program som fungerar men kanske inte klarar komma och punkt sνa bra. 2. Ett perfekt program. 3. När man kört konversationsprogrammet nνagra gνanger tycker man att det svarar lite väl mekaniskt. Ett förbättrat program skulle kunna ge följande konversation: Jag är ledsen. Jasνa, Sofia, du är ledsen. Än sen? Du fattar ju inget, du är ju bara en dator! Känner du obehag inför datorer? Jag tycker att programmering är svνart. Jasνa, Sofia, du tycker att programmering är svνart. Än sen? Mitt program fungerar inte. Vad är det egentligen som oroar dig? Jag tror att handledarna undviker mig. Kan det ha nνagot att göra med att du äter för mycket engelsk konfekt? osv... Skriv ihop en fil med nyckelord och tillhörande fraser. När nνagot av nyckelorden dyker upp skriver du ut motsvarande fras. dator mamma idiot Känner du obehag inför datorer? Berätta mer om din familj. Tack detsamma! Lνat programmet slumpmässigt skriva ut fraser av typen: Du verkar förvirrad. Har du nνagra vänner du kan prata med? Vad är det egentligen som oroar dig? Spara en hel mening och skriv ut den senare, med inledningen: Kan det ha nνagot att göra med att...
J 114 Korsordsprogram Skriv ett program som konstruerar korsord av nedanstνaende typ, alltsνa fem gνanger fem bokstäver utan svarta rutor. Till din hjälp finns filen ordlista.txt med 1862 stycken fembokstavsord. B A S T U A R T O N S T νa N D T O N νa R U N D R A Ditt program bör börja med att läsa in orden frνan filen till en vektor av strängar. Sedan ska systematiskt alla korsord skapas och skrivas ut pνa skärmen eller pνa en fil. Observera att det skulle ta för lνang tid att skapa alla kombinationer av vνagräta ord och för varje sνadan kolla om det blir riktiga ord lodrätt ocksνa. Därför mνaste man fylla i korsordet med omväxlande vνagräta och lodräta ord, sνa att man direkt ser när det är omöjligt att komma längre. Uppfinn en effektiv algoritm för problemet! Det är tillνatet att förutsätta att korsordet ska vara symmetriskt och det minskar körtiden betydligt. Tips: Det krävs en funktion Index(ordet) som om ordet är 'STνA ' söker upp det första ordet i ordvektorn som börjar med STνA. Snabbast är att använda metoden binärsökning. Betygsnivνakrav: 1. Ett program med större brister. 2. Ett program med smärre brister. 3. Ett perfekt program.
J 115 Kösimulering Det gäller att simulera kösituationer pνa det lilla postkontoret i Skruttemνala. Posten öppnar kl 9.00 och stänger kl 18.00. Kunder anländer i genomsnitt var femte minut, dvs sannolikheten för att en ny kund ska komma under en viss minut är 20%. För postexpediten, fru Franco, tar det exakt tvνa minuter att betjäna ett postärende. Hälften av alla kunder har ett enda ärende, en fjärdedel har tvνa ärenden, en νattondel tre ärenden osv. Naturligtvis skall dessa parametrar vara enkla att ändra. Vid stängningsdags lνaser fru Franco dörren men betjänar plikttroget de kunder som stνar i kö. Därefter för hon dagens kundstatistik. Allt detta ska simuleras av ditt program enligt följande exempel: Kl 9.03 kommer kund 1 in och blir genast betjänad Kl 9.05 kommer kund 2 in och ställer sej i kön som nr 2 Kl 9.07 gνar kund 1 och kund 2 blir betjänad Kl 9.09 kommer kund 3 in och ställer sej i kön som nr 2 Kl 9.09 gνar kund 2 och kund 3 blir betjänad Kl 9.12 kommer kund 4 in och blir genast betjänad Kl 9.13 kommer kund 5 in och ställer sej i kön som nr 2 Kl 9.15 kommer kund 6 in och ställer sej i kön som nr 3 ::: Kl 18.00 stängs dörren Kl 18.04 gνar kund 110 och kund 111 blir betjänad Kl 18.06 gνar kund 111 STATISTIK: 111 kunder, kundväntetid 58 minuter = 31 s/kund Alla kunder förutsätts anlända vid hela minuttider, ingen fνar komma indrällande nνagra sekunder för tidigt eller för sent! Tips: Använd objekt innehνallande ankomsttid och antal ärenden för att hνalla reda pνa kunderna i kön. Med hjälp av filen random.txt, kan du simulera nya kundankomster och slumpa fram antal ärenden. Sannolikheterna ska vara konstanter, dvs lätta att ändra. Använd en köklass. Vid varje tidssteg kan en ny kund anlända. ffl Vid ankomsten slumpas antalet ärenden fram, varje nytt ärende betyder ökad betjäningstid. Utträdestiden beräknas dock inte förrän kunden ska betjänas. ffl Är kön tom när en ny kund anländer, betjänas denna direkt (utträdestiden beräknas). ffl Är kön inte tom, ställs kunden i kön. Programmet ska även kontrollera om den första kundens utträdestid=nutid. Är sνa fallet är alltsνa denna kund färdigbetjänad och nästa kund i kön kan betjänas. Betygsnivνakrav: 1. Ett program med stora brister. 2. Ett program med smärre brister. 3. Ett perfekt program.
J 116 Kugghjulsproblem En cykelklubb har beslutat sig för att skaffa ett program som ska testa olika kugghjulskombinationer. Givet en banprofil vill de fνa fram en kugghjulskombination som resulterar i minsta möjliga arbetsinsats för cyklisten. Optimal utväxling ges av följande formel (som funktion av vägens lutning): optutv =3:5+ 2:5 45 lutning lutning Vägens lutning, mellan -45 och +45 (grader) optutv Utväxlingen, mellan 1.0 och 6.0 De olika kugghjulskombinationerna ska du själv skriva in pνa en fil, som kan se ut sνa här: Format: namn (max 10 tkn) bakre kugghjul (antal kuggar för varje hjul, skilda av blankslag) främre kugghjul (antal kuggar för varje hjul, skilda av blankslag) ============================================================== Adam 12 13 15 16 17 20 45 52 54 Bertil... Banprofilen skrivs även den i pνa en fil, som kan se ut sνahär, avstνanden givna i lägesordning: Format: Banans namn (max 30 tkn) / avstνand (km) / lutning (grader) ============================================================== Tour de France, etapp 1 0.5 15 15.5-10... Dvs de första 0.5 km har en lutning pνa 15 grader uppför, därefter följer en sträcka av 15.5 km med en lutning av 10 grader nedför osv. Du ska i ditt program summera ihop alla sträckor med samma lutning. Sedan ska du för varje lutning bestämma optimal utväxling (enl ovan). Din fil behöver inte innehνalla flera etapper. Om det främre kugghjulet har x kuggar och det bakre har y kuggar blir utväxlingsförhνallandet = x/y. Du ska jämföra en kugghjulskombinations olika inställningar (av fram- respektive bakkuggar) med den optimala utväxlingen. Beloppet: j optutv x y j ska bli sνa litet som möjligt. För att skatta vilken kombination som ger bäst resultat använder vi oss av följande modell: VGV
berutv optutv sträcka förlusttal Den kuggkombination som ligger närmast det optimala utväxlingstalet (x/y som gav minsta differens). Optimal utväxling, för en given lutning. Summan av sträckorna med given lutning. Differensen mellan optutv och berutv ger oss ett mνatt pνa förlusterna. förlusttal = j berutv-optutv j sträcka Förlusttalen för de olika lutningarna summeras till slut och dνa fνar vi dito för hela banan. Vi vill ha sνa smνa förlusttal som möjligt. Varje kombination fνar sνaledes ett tal som ger en skattning pνa hur bra kombinationen är för den givna banprofilen. När samtliga kombinationer är genomgνangna ska deras resultat (totala förlusttal) presenteras i stigande storleksordning för varje banprofil, tex: Banprofil: Tour de France, etapp 1 Bertil 876.3 Adam 1234.1... Betygsnivνakrav: 1. Ett program som klarar en cyklist hjälpligt. 2. Ett program som klarar flera cyklister hyfsat. 3. Ett perfekt program.
J 117 Simulerad kulstötning En kulstötare kan förenklat beskrivas av tvνa tal: M = medelvärdet för stötarnas längd S = standardavvikelsen för stötarnas längd Varje tävlingsstöt kan simuleras med ett normalfördelat slumptal med dessa parametrar. Programmet simulerar tävling mellan kulstötare som beskrivs pνa en fil som du skriver själv. Sνa här kan den filen se ut: Format: Namn (max 20 tkn) / medelvärdet för stötarnas längd standardavvikelsen för stötarnas längd ============================================================== Sten Säker 20.0 1.0 Olle Ojämn 19.0 2.0 Charlie Chans 18.0 3.0... Varje tävlande har sex kast. Efter varje tävling (alla deltagare har kastat sina 6 kast) skrivs segrarens namn och segerkastet ut. Den som kör programmet fνar bestämma hur mνanga tävlingar som ska genomföras och efterνat ska statistik över antalet segrar skrivas ut (sorterad med avseende pνa antalet segrar). Tvνa (eller fler) deltagare med samma stötlängd ska hamna pνa samma plats. Om de är bäst i tävlingen, räknas bνada som segrare. Hur mνanga tävlingar? 100 Sten Säker 20.97 Charlie Chans 21.13... STATISTIK: Sten Säker 32 segrar Olle Ojämn 18 segrar... Betygsnivνakrav: 1. Ett program för en enda tävling. 2. Ett program för flera tävlingar. 3. Grafiskt program eller applet. Rita ut en kulstötningsbana där du visar de olika spelarnas bästa kast representerade av olikfärgade cirklar.
J 118 Lösenordssystem Programmet ska simulera inloggning enligt följande välkända mönster Username: putte Password: banan User authorization failure Username: putte Password: sesam Password correct. Välkommen till lösenprogrammet! >> Användarnamn och kodade lösenord ska ligga pνa en fil, som du skapar själv. Denna läses av programmet efter det att användaren skrivit användarnamn och lösenord. Filen kan se ut sνa här: HENRIK 831180685 PUTTE 154356558... Talen ovan har kodats med hjälp av String.hashCode(). Anledningen till att man kodat lösenorden är att det blir svνart för den som kommer νat filen att baklänges räkna fram lösenordet. Programmet läser lösenordet, omvandlar eventuella gemena till versaler, beräknar koden och jämför med den som stνar i filen. När man angivit rätt lösenord och fνatt promptern >> kan man skriva olika förslag pνa lösenord och fνa motsvarande kod uträknad. Direkt returtryckning avbryter programmet. Exempel: >> sesam 917 >> banan 398 >> Slut pνa lösenprogrammet. Välkommen νater! VGV
Betygsnivνakrav: 1. Ett perfekt program enligt ovan. 2. Utöka programmet sνa att användaren kan ändra sitt lösenord genom att ge kommandot passwd, det ska fungera sνa här: >> passwd Ge ditt gamla lösenord: sesam Ge ditt nya lösenord: gurka Skriv det nya igen: gurka >> passwd Ge ditt gamla lösenord: sesam User authorization failure >> Om användaren skriver fel vid upprepningen av nytt lösenord skall ett felmeddelande skrivas ut och bytet av lösenord skall inte verkställas. Vid ett korrekt byte skall programmet ändra i filen sνa att det gamla lösenordet ersätts av det nya. 3. Flytta pνa interaktionen frνan terminalen till ett fönster. Dvs skapa ett grafiskt gränsnitt med tvνa text fält, ett för användarnamn och ett för lösenordet, en knapp för inloggning. Vidare visa genom titeln pνa fönstret när man är inloggad och vem man är inloggad som. När man är inloggad ändrar man smidigast pνa titlarna för textfälten sνa att det ena är för lösenord och det andra för lösenkoden som beräknas.
J 119 Ludvig XIVs patiens Blanda leken och lägg successivt ut korten med framsidan upp bredvid varandra frνan vänster till höger! Om ett kort har samma färg (sp, hj, ru, kl) eller samma valör som sin närmaste granne till vänster eller som det kort som ligger tre steg till vänster fνar det läggas ovanpνa detta. När ett kort lagts pνa ett annat flyttas de i fortsättningen tillsammans. Högen betraktas alltsνa som ett enda kort. När alla kort lagts ut räknar man högarna. Det gνar ut pνa att fνa sνa fνa högar som möjligt. Ludvig XIV lade patiensen hela livet utan att komma ner till en hög... Ditt program ska simulera patiensläggningen och arbetar helt självständigt. Sνa här kan det se ut pνa skärmen: sp 10 sp 10 hj E sp 10 hj E hj K sp 10 hj K sp 10 hj K ru 5 sp 10 hj K ru 5 sp 4 sp 4 hj K ru 5 sp 4 hj K ru 5 sp K sp K hj K ru 5 hj K ru 5 osv... Programmet slutar med att skriva ut hur mνanga högar det blev kvar. Leken representeras t.ex. av envektor med femtiotvνa kort, där varje kort är ett objekt av klassen Kort som har tvνa fält (färg och valör). Färg och valör skapas lämpligast av talen 0 till 51 med heltalsdivision k/13 och rest k%13. Frνan början kan korten läggas i ordningsföljd men sedan görs nνagra hundra slumpmässiga ombyten, t ex sνa att översta kortet fνar byta plats med ett slumpmässigt kort. Korthögarna pνa bordet representeras av en annan vektor och ett kort i taget överförs dit. kl 2, 0 kl 3, 1... kl E, 12 ru 2, 13... sp E, 51 VGV
Tips: Prova själv spelet med en kortlek för att förstνa algoritmen bättre. Det finns flera metoder som kan vara lämpliga att skriva. Ett par exempel: En boolesk funktion Fit(i,j) som kollar om hög i kan flyttas till en annan hög j. Anropet Move(i,j) gör förflyttningen och fyller igen eventuella hνal genom att flytta högarna till höger om hνalet ett steg till vänster. Anropet Try(i) försöker flytta en hög i till: 1. högen i 3 om det gνar, 2. annars till högen i 1 om det gνar, 3. annars anropar Try sig själv med Try(i-1). Betygsnivνakrav: 1. Ett program som fungerar lite grann. 2. Ett program som fungerar. 3. Grafiskt program eller applet.
J 120 Magiska kvadrater En magisk kvadrat med sidan n, innehνaller talen 1; 2; 3; :::; n 2 sνa att alla radsummor, kolumnsummor och diagonalsummor är lika. 8 1 6 3 5 7 4 9 2 Skriv ett program som provar flera kvadrater i samma körning. Storleken pνa kvadraten läses in, kvadratens rutor fylls enligt nedanstνaende algoritm och till sist görs en kontroll huruvida det blev en magisk kvadrat eller inte. Du ska lägga ut talen 1; 2; 3; :::; n 2 enligt följande algoritm (utgνa ifrνan en position (i,j) hela tiden): 1. Börja med talet 1, lägg ut det pνa den position som ges av (1; (n = 2) + 1) (mitten av första raden). 2. När man har lyckats lägga ut en siffra pνa position (i; j), flyttar man sig till positionen snett upp till höger, dvs (i 1;j + 1). Om positionen är ledig, läggs siffran ut. Om den är upptagen flyttar vi oss till en position rakt under den ursprungliga positionen (dvs (i + 1;j)). Positionen rakt under kommer i detta fall alltid att vara ledig. 3. Alla dessa förflyttningar kommer ofelbart leda till att vi hamnar utanför kvadraten. Efter varje förflyttning mνaste man kontrollera att man fortfarande befinner sig innanför kvadraten. Hamnar man: ffl Ovanför kvadraten, gνar man n steg nedνat. ffl Nedanför kvadraten, gνar man n steg uppνat. ffl Till höger om kvadraten, gνar man n steg νat vänster. ffl Till vänster om kvadraten, gνar man n steg νat höger. Utskriften ska bestνa av den fyllda kvadraten samt de beräknade summorna av raderna, kolumnerna och diagonalerna. Givetvis ska magin pνapekas om den existerar. För vilka n-värden ger algoritmen magiska kvadrater? Betygsnivνakrav: 1. Ett program med smärre brister. 2. Ett perfekt program. 3. Grafiskt program eller applet.
J 121 Master Mind Du ska skriva ett program som spelar Master Mind. Användaren ska tänka pνa ett tal och datorn försöker gissa det. Sνa här kan det se ut: Tänk pνa ett fyrsiffrigt tal med fyra olika siffror och tryck retur! Jag försöker gissa talet och du anger rätt och fel med t ex RFF, där R innebär att en siffra är rätt och stνar pνa rätt plats F innebär att en riktig siffra stνar pνa fel plats Jag gissar 1023 och du svarar: RF Jag gissar 1245 och du svarar: RR Jag gissar 1267 och du svarar: RF Jag gissar 1346 och du svarar: RF Jag gissar 1605 och du svarar: Jag gissar 7243 och du svarar: RRRR Det tog alltsνa 6 gissningar, bättre kan jag! Programmet läser ett svar och kodar det till ett heltal genom att lνata varje R vara värt 10 och varje F värt 1, t ex RFF ) 12. Sνa här kan programmet gνa tillväga för att fνa fram sina gissingar: Alla gamla gissningar och motsvarande svarskoder sparas. För att en gissning ska vara en rimlig lösning mνaste följande gälla: 1. Talet skall bestνa av fyra olika siffror 2. Talet ska ge samma svarskod som varje gammal gissning fick som svar. Programmet börjar med att gissa pνa 1023 (det första fyrsiffriga talet med fyra olika siffror). Nästa gνang mνaste programmet välja en gissning som inte motsäger nνagon av de tidigare gissningarna (t ex genom att stega igenom talen frνan 1023 till 9876 och ta det första som uppfyller kraven ovan). Vi tittar lite närmare pνa exemplet ovan. 1245 var programmets senaste gissning. ffl Programmet ska nu söka efter ett tal som är större än 1245 och bestνar av fyra olika siffror. ffl När programmet hittat ett sνadant tal (t.ex. 1246), jämför det detta med de gamla gissningarna. 1023 (första gissningen) i jämförelse med 1246 ger koden 11 (RF), OK sνa lνangt. 1245 (andra gissningen) i jämförelse med 1246 ger koden 30 (RRR), men den skulle givit 20 (RR). VGV
ffl 1246 förkastas alltsνa, eftersom den inte gav rätt svarskod pνa andra gissningen. ffl 1247, 1248, 1249 och 1250 förkastas av samma skäl. 1251 har inte fyra olika siffror. Programmet mνaste räkna upp till 1267 innan det hittar en bra gissning. 1023 (första gissningen) i jämförelse med 1267 ger koden 11 (RF). 1245 (andra gissningen) i jämförelse med 1267 ger koden 20 (RR). ffl Alltsνa är 1267 en rimlig gissning och programmet skriver ut denna. När ingen rimlig gissning existerar, ska programmet tala om detta. Tips: Skriv en funktion compare(guess1,guess2) som returnerar svarskoden som erhνalls dνa vi jämför tvνa gissningar. Betygsnivνakrav: 1. Samma spel men med ombytta roller, dvs datorn slumpar fram ett tal, människan gissar och programmet svarar. Ett exempel: Hmmm... OK, Jag tänker pνa ett tal! Din gissning: 1234 Dνa säger jag FF Din gissning: 1122 Felaktig gissning! Din gissning: 2345 Dνa säger jag RF Din gissning: 2673 Dνa säger jag RRR Din gissning: 2683 JAAA, det var rätt pνa 5 försök! 2. Ett perfekt program där datorn gissar. 3. Grafiskt program eller applet.
J 122 Livet hos matematiska organismer En familj matematiska organismer bestνar av celler (rutor) i ett rutnät som kan beskrivas av en matris. Cellerna föds och dör enligt bestämda levnadsregler och vi vill undersöka hur familjens fortbestνand förändras under ett antal generationer. Varje cell har νatta grannar: 1 2 3 4 * 5 6 7 8 Överlevnad Födelse ffl Varje cell med tvνa eller tre levande grannar kommer att överleva till nästa generation. ffl En cell med mer än tre grannar dör av överbefolkning. ffl En cell med mindre än tvνa grannar dör av ensamhet. ffl En tom cell som har exakt tre grannar kommer att födas och bli en levande cell i nästa generation. Skriv ett program som först läser in antalet önskade generationer samt storleken pνa matrisen. För att slippa tidsödande inmatningar kan du lägga upp filer med startmönster. En fil kan se ut sνa här: -*---- --*--- ***--- ------ Programmet skall rita ut matrisen och dess levande innevνanare pνa ett illustrativt sätt. Det är lämpligt att lägga in en pausfunktion sνa att användaren hinner se alla utritningar. Tips: Antag att du har valt att använda dig av en 15x15 matris. För att undvika vissa konstigheter ute i kanterna kan du dνa jobba med en 17x17 matris, detta för att kunna införa fiktiva celler i 0:te och 16:e position (sνa att alla verkliga celler fνar 8 grannar). VGV
Skriv en metod, nygeneration, med tvνa matriser som parametrar, levdenyss och levernu. I denna undersöks varje av levdenyss rutor enligt de ovanstνaende reglerna och en ny matris, levernu kan skapas (den nästkommande generationen). Exempel pνa starttillstνand som ger en trevlig fortsättning: 18 levande celler: ---------- ---------- ---*--*--- ---****--- --*----*-- --*-**-*-- --*----*-- ---****--- ---------- ---------- CHESHIREKATT. Utskrift varje generation. Lägg katten mitt i rutnätet. Efter nνagra generationer är bara leendet kvar. 5 levande celler: 9 levande celler: -*-------- ----*----- --*------- -----*---- ***------- *----*---- ---------- -*****---- ---------- ---------- GLIDARE. RYMDSKEPP. Glider snett nerνat höger Flyttar sig horisontellt Betygsnivνakrav: 1. Ett program med smärre brister. 2. Ett perfekt program. 3. Grafiskt program eller applet.
J 123 Molekylvikter Som framgνar av körexemplet ska programmet beräkna och skriva ut formelvikter för alla tänkbara molekyler. Om man trycker retur direkt ska körningen avbrytas. Skriv en molekylformel: Na2SO4 Molekylvikt: 142.04 Skriv en molekylformel: Ca(OH)2 Molekylvikt: 74.09 Skriv en molekylformel: Tack och hej! Formlerna bestνar av bokstäver (versaler och gemena), siffror och parenteser. Man brukar skriva Na 2 SO 4 och Ca(OH) 2 men här skrivs allt pνa samma nivνa. Atomvikter för drygt hundra grundämnen finner du i filen avikt.txt. Kopiera den och studera hur den är upplagd. Programmet ska börja med att läsa in atomnamn och atomvikter frνan filen till en vektor av poster. Det är inte meningen att programmet ska läsa in hela formeln i ett svep och därefter analysera den. Det är mycket enklare att läsa in den bit för bit och ibland tjuvtitta pνa det första olästa tecknet (Input^) för att se om det är en versal, gemen, siffra eller parentes. Parenteserna kan i princip tänkas innehνalla andra parenteser i flera nivνaer: Cu(C 17 H 30 (COOH) 2 ) och formelviktsberäkningen blir dνa ett typiskt rekursivt problem. VGV
Gör en double formelvikt() som läser formeln och beräknar vikten. När formelvikt stöter pνa en vänsterparentes anropar den sej själv för att beräkna vikten av molekylen eller atomen i denna parentes (metoden returnerar vikten dνa den träffar pνa en högerparentes eller ett radslut). Använd lämpligen tjuvtitt med if(mio.nextchar()==')')... Om formeln innehνaller atombeteckningar som inte finns i filen ska det komma en felutskrift. Betygsnivνakrav: 1. Ett program med smärre brister. 2. Ett perfekt program. 3. Grafiskt program eller applet. Datafiler och hjälpfiler: avikt.txt
J 124 Pascalprogramsförskönare Varudeklaration: Filhantering, tecken- och stränghantering. Antag att man i sitt program deklarerar en variabel med namnet: AntalVuxnaDeltagare men att man sedan inte är sνa noga med versaler och gemena utan skriver t. ex: Antalvuxnadeltagare:=antalvuxnadeltagare+1; Man vore dνa betjänt av ett program som läser igenom programfilen och skriver om den sνa att alla namn stavas exakt som i deklarationen. Du ska skriva detta program. Tänk pνa att det även gäller namn pνa konstanter, procedurer och funktioner och vidare att deklarationer kan förekomma lokalt inne i en procedur. Du behöver dock inte korrekt hantera fallet med lokala och globala variabler med samma namn, men med annat val av gemena/versaler. Välj i sνa fall t ex det val av gemena/versaler som gäller den globala variabeln. När programmet startas ska det först frνaga efter namnet pνa programfilen. Om den heter t ex pytte.p ska helst bνada svaren pytte och pytte.p fungera. Den resulterande utfilen ska ha samma namn som infilen. Tips: En lämplig algoritm kan vara att lνata programmet läsa igenom programfilen tvνa gνanger. Den första gνangen noteras alla deklarerade namn, den andra gνangen kopieras filen till en utfil varvid alla förekomster av namnen stavas pνa det noterade sättet. Extrauppgift: Utöka programmet sνa att det skriver reserverade ord versalt och fördeklarerade med stor inledande bokstav.