2008-03-25.kl.14-19 Uppgift 1 (”Betyg 3 uppgift”) Du skall skriva ett program (en funktion), my_plot_figure, som läser in ett antal sekvenser av koordinater från tangentbordet och ritar ut dessa till en gemensam figur. Varje sekvens av koordinater skall plottas var för sig. Ditt program skall läsa en sekvens av koordinater och av dessa bygga upp två vektorer (en Xoch en Y-vektor) som sen skall skickas till den vanliga plot-funktionen enligt följande: plot(X_Vector, Y_Vector, ’-ob’) Detta skall sen upprepas för alla sekvenser av koordinater. Inmatningen av koordinater kommer att göras enligt följande format: [0, 0] [0, 5] [5, 5] [5, 0] [0, 0] [-1, -1] [1, 4] [4, 1] [-1, -1] [1, 1] [4, 4] [-1, -1] [-2, -2] ”Koordinaten” [-1, -1] anger att sekvensen är slut och ingår inte i sekvensen och ”koordinaten” [-2, -2] anger att sista sekvensen är slut, d.v.s. att inmatningen skall avslutas. Ovanstående inmatning skall alltså ge följande vektorer som skall plottas (två i taget): X_Vector = [0, 0, 5, 5, 0] Y_Vector = [0, 5, 5, 0, 0] X_Vector = [1, 4] Y_Vector = [4, 1] X_Vector = [1, 4] Y_Vector = [1, 4] Den figur som blir av detta skall se ut enligt följande: OBS! Det finns en indatasekvens given i filen INDATA_1.TXT som du kan klippa in med hjälp av musen. Denna sekvens är inte samma som ovanstående utan ger en annan bild. Du kan testa den innan du skickar in ditt program för rättning. 2008-03-25.kl.14-19 Uppgift 2 Du skall skriva funktionen my_plot som tar emot två vektorer (en X- och en Y-vektor), vardera innehållande exakt två tal, som ritar ut en ”linje” bestående av ett antal punkter mellan de två ändpunkter som finns angivna med hjälp av de två indatavektorerna. I princip skriver du alltså funktionen som motsvarar plot([X1, X2], [Y1, Y2]), men där linjen ersätts av ett antal separata punkter. Funktionen my_plot skall rita ut så många punkter mellan (X1, Y1) och (X2, Y2) så att avståndet mellan två närliggande punkter är maximalt 0.75 (längdenheter). Givetvis skall även ändpunkterna ritas ut. Din funktion skall rita ut punkterna med hjälp av den enklaste varianten av plot enligt följande (där X och Y motsvarar en enskild punkts x- respektive y-koordinat): plot(X, Y, ’-or’) Det finns ett givet huvudprogram som heter test_my_plot som läser in ett antal koordinater och sen anropar din funktion. Indatat följer följande format: 1 5 5 1 -1 -1 1 1 5 5 -1 -1 -2 -2 Två rader i taget hör ihop och innehåller en x- respektive y-koordinat. Koordinaten [-1, -1] separerar två indatasekvenser (jämför uppgift 1) och [-2, -2] avslutar inmatningen. Första vektorerna som skickas till din funktion enligt ovanstående indata skulle alltså bli [1, 5] respektive [5, 1] och andra vektorparet skulle vara [1, 5] respektive [1, 5]. Figuren som skall genereras av programmet med ovanstående indata skall alltså se ut enligt följande: OBS! Det finns en indatasekvens given i filen INDATA_2.TXT som du kan klippa in med hjälp av musen. Denna sekvens är inte samma som ovanstående utan ger en annan bild. Du kan testa den innan du skickar in ditt program för rättning. TIPS: Det är ok att ha en extra hjälpfunktion som är rekursiv som din my_plot anropar. 2008-03-25.kl.14-19 Uppgift 3 Det finns en given funktion, myrornas_krig, som returnerar en matris innehållande en tv-bild. Denna bild är dock helt förstörd av brus. Din uppgift är att skriva en funktion, fixa_bort_brus, som tar emot denna bild (matris) och sållar fram ursprungsbilden. För att se om du lyckats få fram bilden korrekt skriver du följande instruktioner i MatLab: colormap(gray); imagesc(fixa_bort_brus(myrornas_krig)); Det skall inte bli en stjärnhimmel eller dammkorn på en vit bordsskiva som bild när du kör ovanstående utan en bild som du lätt förstår kan vara den rätta. För att fixa bort bruset skall du först beräkna medianvärdet av alla data som finns i matrisen, som kommer in som parameter till din funktion, och sen ersätta alla värden i matrisen som inte är samma som medianvärdet med ettor. De positioner i matrisen som innehåller medianvärdet skall fyllas med nollor. Medianvärdet är det värde som står i mitten om man ställer upp alla värden på en lång rad i storleksordning. Det är alltså inte medelvärdet vi pratar om. Ett exempel på hur matrisen skulle kunna se ut är följande (OBS! det är inte denna man får ut när man anropar myrornas_krig): [[1, 2, 3]; [2, 1, 2]; [3, 2, 1]] Medianvärdet av alla data i ovanstående matris är 2. D.v.s. resultatet av fixa_bort_brus skulle alltså bli: [[1, 0, 1]; [0, 1, 0]; [1, 0, 1]] Utskriften med hjälp av imagesc av denna matris kommer då att se ut enligt följande: 2008-03-25.kl.14-19 Uppgift 4 Det finns en funktion, four_matrices, som returnerar fyra stycken matriser (som kan vara av olika dimensioner). Dessa matriser innehåller en massa koordinater, men för att få fram dessa måsta man leta i matriserna på ett speciellt sätt. Du skall därför skriva en funktion som skapar en vektor bestående av data ur en sådan matris. Funktionen skall heta get_coordinate_vector och ta emot två parametrar. Den första parametern är en matris innehållande heltal och den andra parametern är ett heltal som anger hur många data som skall plockas ur matrisen. För att få fram de data som skall fylla den vektor som din funktion skapar skall man leta efter två likadana data i matrisen som ligger på samma rad i matrisen. Avståndet mellan dessa två lika data (d.v.s. skillnaden i index i matrisen) anger på vilken position i vektorn detta data skall ligga. Om man hittar två data i matrisen som ligger på samma rad, men med ett avstånd som är längre än det tal som kom in som parameter två till funktionen skall datat inte vara med i vektorn. Två exempel på matriser som skulle kunna komma in till din funktion är: [[1, [1, [2, [2, 2, 3, 2, 6, 3, 5, 4, 5, 4]; 1]; 5]; 6]] [[1, [3, [6, [2, 2, 4, 7, 6, 2, 3, 4, 5, 1, 1, 5, 7, 3]; 5]; 6]; 8]] Antag att man skickar dessa två matriser till funktionen (en åt gången förstås) samt heltalet 3. Detta skulle i de två fallen ge att utdatat från funktionen skulle bli: [2, 6, 1] [2, 3, 1] I det andra fallet skall alltså inte talet 6 komma med i vektorn då avståndet är 4 (d.v.s. större än talet 3 som kom in som andra parameter). OBS! Du skall inte leta i y-led i matrisen utan endast inom en rad när du letar efter lika tal. I annat fall skulle t.ex. talet 1 ligga med avstånd 1 i den första matrisen vilket inte ger ett korrekt utdata från din funktion. OBS! Matrisernas dimensioner kan vara olika. Både vad det gäller de olika matriserna sisnemellan och även i x- respektive y-led. TIPS: Det finns ett givet testprogram som heter test_four_matrices som anropar four_matrices och använder de data som finns i de fyra matriserna för att få fram de vektorer som din funktion returnerar. Resultatet av detta testprogram blir en bild som det går att förstå att den är korrekt när man ser den. Kör detta testprogram innan du skickar in din funktion för rättning. 2008-08-20.kl.14-19 Uppgift 1 (”Betyg 3 uppgift”) Din uppgift är att ta reda på vilka de 28 första fattiga talen i intervallet [1000, 2000]. Du har tillgång till MatLab och kan skriva de funktioner m.m. du anser dig behöva för att lösa uppgiften. Redovisa det program du gjort för att få fram resultatet samt (som en kommentar i programmet) en lista med de 28 fattiga talen som skulle hittas. Definition: Det finns tre typer av tal. Fattiga, rika och perfekta tal. Ett fattigt tal är ett tal där summan av alla dess jämna delare är mindre än talet självt. Ett rikt tal har summan större än talet självt och ett perfekt tal har summan av delarna exakt som talet självt. De delare som räknas är talet 1 samt alla tal mindre än talet självt. Exempel som belyser definitionen ovan.: Talet 6 har delarna 1, 2 och 3. Summan av dessa är 6, d.v.s. talet är perfekt. Talet 16 har delarna 1, 2, 4, 8. Summan av dessa är 15, d.v.s. talet är fattigt. Talet 12 har delarna 1, 2, 3, 4, 6. Summan av dessa är 16, d.v.s. talet är rikt. P.S. Talet 28 är perfekt. D.S. 2008-08-20.kl.14-19 Uppgift 2 Följande definition är given för en matematisk funktion: 3N + 1 f (N) = N -- 2 udda N jämna N Om man tar ett godtyckligt värde, N, och räknar ut vad funktionen ger för resultat och sen använder detta resultat som nytt N-värde för att sen upprepa detta ett flertal gånger har det visat sig att man förr eller senare kommer fram till att man får resultatet 1 från funktionen ovan efter ett antal iterationer. Detta är inte matematiskt bevisat, men man har testat startvärden på N från 1 och upp till ett väldigt stort tal och det verkar vara så att detta stämmer. Din uppgift är att ta fram det minsta N-värde som ger resultatet 1 efter exakt 50 iterationer. Ett exempel som kanske visar lite bättre hur man ser på detta med iterationerna: Startvärde Iterationer ------------------------2 1 3 10 5 16 8 4 2 1 4 2 1 5 16 8 4 2 1 6 3 10 5 16 8 4 2 1 7 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1 Utskriften från ditt program skall bestå av startvärdet (det N som genererar 50 iterationer för att nå talet 1) samt alla värden i de olika iterationerna (utom talet 1 som ligger sist). Från exemplen ovan skulle motsvarande utskrift varit enligt följande om antalet iterationer skulle vara 16 istället för 50 (det råkade vara talet 7 som gav exakt 16 iterationer). 7 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 OBS! Det är ok om talen kommer under varandra istället för på samma rad om ni så vill. 2008-08-20.kl.14-19 Uppgift 3 Du skall skriva en funktion, shift_right, som tar emot en matris som är kvadratisk och returnerar en modifierad variant av denna. Dimensionen på matrisen är dock inte begränsad på något sätt. (det kan alltså vara en 2x2-matris likaväl som en 100x100-matris). Funktionen skall låta första raden i matrisen vara oförändrad. Rad nummer två skall skiftas ett hack åt höger (sista värdet hamnar då först på rad två). Rad nummer tre skall skiftas två hack åt höger (sista två värdena hamnar då på de två första positionerna på rad tre). Rad fyra skiftas tre hack. Etc. Etc. Ett exempel på indata till funktionen skulle kunna vara en matris med följande innehåll: 12 32 65 76 34 43 54 89 23 54 34 87 45 21 21 65 Utdata från funktionen skulle från ovanstående indata bli: 12 21 34 89 34 32 21 87 23 43 65 65 45 54 54 76 2008-08-20.kl.14-19 Uppgift 4 Skriv en funktion, no_of_days, som tar emot ett datum och räknar ut vilket dagnummer på året detta datum har. Du behöver inte ta hand om skottår. Första januari har dagnummer 1 och sista december har dagnummer 365. Datumet som kommer till funktionen består av en vektor med tre heltal motsvarande år, månad och dag (t.ex. [2008 8 20]). För att inte ställa till det för er bjuder vi på antalet dagar som finns i respektive månader. Januari, mars, maj, juli, augusti, oktober och december har 31 dagar. Februari har 28 dagar. Övriga har 30 dagar. Om man använder [2008 8 20] som indata skall man få 232 som resultat (även om det egentligen är 233 eftersom det är skottår i år). Krav: Du får inte skriva ditt program så att det består av 12 ”if”-grenar för att lösa problemet med månadernas dagantal. 2008-12-17.kl.08-13 Uppgift 1 (”Betyg 3 uppgift”) Skriv funktionen create_matrix som tar emot fyra stycken heltal (A, B, C och N) som parametrar och som returnerar en kvadratisk matris av storlek NxN innehållande de övriga tre talen i de tre diagonalerna enligt nedanstående exempel. Det är givet att N alltid måste vara minst 2. Det behöver ni inte kontrollera. Krav: Du får inte använda den inbyggda funktionen diag. Tips: Du får använda dig av de inbyggda funktionerna rot90, fliplr och flipud. Exempel 1: create_matrix(1, 2, 3, 4) ans = 0 0 2 1 0 2 1 3 2 1 3 0 1 3 0 0 Exempel 2: create_matrix(1, 1, 1, 3) ans = 0 1 1 1 1 1 1 1 0 Exempel 3: create_matrix(1, 2, 3, 2) ans = 2 1 1 3 Exempel 4: create_matrix(1, 2, 3, 10) ans = 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 2 1 0 0 0 0 0 0 2 1 3 0 0 0 0 0 2 1 3 0 0 0 0 0 2 1 3 0 0 0 0 0 2 1 3 0 0 0 0 0 2 1 3 0 0 0 0 0 2 1 3 0 0 0 0 0 2 1 3 0 0 0 0 0 0 1 3 0 0 0 0 0 0 0 1 3 0 0 0 0 0 0 0 0 2008-12-17.kl.08-13 Uppgift 2 Barn gillar att få kluriga matteuppgifter. Följande problem är ett sådant. Problemet är tvådelat. 1. Antag att man har ett tal X (större än noll). Dividera det med ett annat tal N. Skriv siffrorna i resultatet i omvänd ordning och multiplicera sedan det nya talet med N. Om resultatet av detta är X (d.v.s. det ursprungliga talet) fortsätt med resterande del av algoritmen. 2. Addera talet N. Skriv siffrorna i resultatet i omvänd ordning och subtrahera sedan det nya talet med N. Om resultatet efter både steg 1 och steg 2 är X kallas talet X för ett N-numetriskt tal. Skriv en funktion som testar om ett tal X är N-numetriskt. Funktionen skall ta emot X och N som parametrar och returnera talet 0 om talet ej är N-numetriskt annars skall talet X returneras från funktionen. Skriv dessutom ett huvudprogram som skriver ut de tre första 29-numetriska talen. Tips: Det är tillåtet att använda inbyggda funktioner i MatLab för denna uppgift. Några som kan vara trevliga är t.ex. num2str och str2num. Det finns fler som kan vara bra att ha, men vi tar inte upp dem som tips. 2008-12-17.kl.08-13 Uppgift 3 Datorn SkyNet har problem med att skicka tillbaka sina terminatorer till början av 1980-talet. Du skall skriva ett program som tar emot ett kommando och sen utför lite olika saker beroende på vilket kommando det var. Inmatningen består av antingen talet 1 samt ett terminatornamn eller något av talen 2 och 3. Talet 1 betyder att man skickar en terminator, med det namn som följer, tillbaka till 1980-talet. Talet 2 betyder att man hämtar tillbaka den senast skickade terminatorn. Talet 3 betyder att den senast skickade termintorn har terminerats utan att den kommer tillbaka. Exempel: Mata in kommando: 1 Mata in terminatornamn: ’T1000’ T1000 har anlänt till tidigt 1980-tal. Mata in kommando: 1 Mata in terminatornamn: ’TX’ TX har anlänt till tidigt 1980-tal. Mata in kommando: 3 TX är terminerad (”will not be back”). Mata in kommando: 1 Mata in terminatornamn: ’TJ’ TJ har anlänt till tidigt 1980-tal. Mata in kommando: 1 Mata in terminatornamn: ’T101’ T101 har anlänt till tidigt 1980-tal. Mata in kommando: 3 T101 är terminerad (”will not be back”). Mata in kommando: 2 TJ har återkommit. Mata in kommando: 3 T1000 är terminerad (”will not be back”). Krav: Funktionen, som löser detta, skall vara rekursiv. Det kan vara en hjälpfunktion som är rekursiv om du hellre vill detta. När den första terminatorn återkommer eller terminerar avslutas programmet. Hoppas att det går bättre för er än för datorn SkyNet. /TJ (The Examinator) 2008-12-17.kl.08-13 Uppgift 4 Du skall skriva en funktion, draw_cards, som tar emot en matris som inparameter. Matrisen innehåller ett antal heltal. 1:orna anger att det är hjärter och alla övriga tal skall ignoreras. Funktionen skall rita upp matrisens innehåll med hjälp av plot. Hjärter skall ritas enligt följande (de streckade linjerna visar hur kortets proportioner samt hur stor plats kortet tar): => OBS! I figuren ovan har vi inte fyllt hela hjärtern. Detta för att ni skall se hur den är uppbyggd. Självklart skall det vara helt ifyllt i ert program. Exempel: draw_cards([ 1 4 1 2 2 4 3 3 3 4 1 2 1 3 0 2 4 1 ]); skall ge som resultat: OBS! De streckade linjerna skall inte finnas med. De är bara till för att du skall se bättre var bilderna skall ritas ut. Tips: Det finns en ”plot”-variant som heter ”fill” som beter sig som plot, men som fyller området med färg. 2008-12-17.kl.14-19 Uppgift 1 (”Betyg 3 uppgift”) Skriv funktionen create_matrix som tar emot fyra stycken heltal (A, B, C och N) som parametrar och som returnerar en kvadratisk matris av storlek NxN innehållande de övriga tre talen i de tre diagonalerna enligt nedanstående exempel. Det är givet att N alltid måste vara minst 2. Det behöver ni inte kontrollera. Krav: Du får inte använda den inbyggda funktionen diag. Tips: Du får använda dig av de inbyggda funktionerna rot90, fliplr och flipud. Tips 2: Det går att skapa en del av matrisen för att sen nyttja det till resten. Exempel 1: create_matrix(1, 2, 3, 4) ans = 1 2 2 1 3 1 1 3 3 1 1 3 1 2 2 1 Exempel 2: create_matrix(1, 2, 3, 3) ans = 1 2 1 3 1 3 1 2 1 Exempel 3: create_matrix(1, 2, 3, 2) ans = 1 1 1 1 Exempel 4: create_matrix(1, 2, 3, 8) ans = 1 2 0 0 0 0 2 1 3 1 2 0 0 2 1 3 0 3 1 2 2 1 3 0 0 0 3 1 1 3 0 0 0 0 3 1 1 3 0 0 0 3 1 2 2 1 3 0 3 1 2 0 0 2 1 3 1 2 0 0 0 0 2 1 2008-12-17.kl.14-19 Uppgift 2 Barn gillar att få kluriga matteuppgifter. Följande problem är ett sådant. Antag att man har två tvåsiffriga tal A och B där A och B inte är samma tal och A är mindre än B. Låt siffrorna i respektive tal byta plats så att man får två nya tal C och D. Om A-B = C-D kallar vi talen A och B för spegeltal. Din uppgift är att ta reda på alla spegeltal som finns och skriv ut dessa så att man ser dem. Exempel: A = 27 och B = 38 ger C = 72 och D = 83 A-B = -11 C-D = -11 A och B är alltså spegeltal. Utskriften bör då, för just detta talpar, endast vara: 27 38 OBS! Ditt program skall skriva ut alla spegeltal samt hur många det var totalt. 2008-12-17.kl.14-19 Uppgift 3 Antag att man har för avsikt att köra så långt som möjligt med hjälp av en jeep som har en tank som rymmer exakt en dunk bensin samt att man på flaket kan ta med ytterligare två dunkar. Det är också givet att man har ett lager med N stycken dunkar från början och att bilens tank är tom. Bilen är väldigt miljövänlig (trots bensindriften) och kan köra 10 mil på en dunk bensin (dunkarna rymmer endast en liter bensin). Den algoritm du skall använda är följande: Till att börja med kan man tänka sig att man fyller tanken med en dunk. Ställer två dunkar på flaket. Kör 10 mil och lastar av en dunk. Fyller i den andra dunken i tanken och kör tillbaka. Detta upprepas tills det att man fått med så många dunkar som möjligt till den nya platsen. OBS! sista vändan behöver man inte ha två dunkar på flaket. Detta upprepas sen så att man flyttar till en ny plats o.s.v. Sista gången är det smart att fylla tanken och ställa två dunkar på flaket och sen kör man tills det att dunkarna är slut. Det kan bli så att man inte kan få med alla dunkar från en plats till nästa, men det är som det är. Du skall inte optimera för att få med dessa. Tanken med denna uppgift är att funktionen du skall skapa skall vara rekursiv. Se det som ett krav. Kalla din funktion för drive_with_jeep och låt denna ta N som indata (parameter). Funktionen skall returnera antalet mil man kunde köra som längst (givet ovanstående algoritm förstås). Körexempel: drive_with_jeep(2) ans = 20 drive_with_jeep(3) ans = 30 drive_with_jeep(6) ans = 40 drive_with_jeep(15) ans = 50 P.S. Det behövs 11438396227482 dunkar för att nå 300 mil? Intressant att veta kanske. D.S. 2008-12-17.kl.14-19 Uppgift 4 Du skall skriva en funktion, draw_cards, som tar emot en matris som inparameter. Matrisen innehåller ett antal heltal. 4:orna anger att det är klöver och alla övriga tal skall ignoreras. Funktionen skall rita upp matrisens innehåll med hjälp av plot. Klöver skall ritas enligt följande (de streckade linjerna visar hur kortets proportioner samt hur stor plats kortet tar): => Ovalerna är lika stora och har höjden = 1.4 * ”en streckad rutas höjd”. Exempel: draw_cards([ 1 4 1 2 2 4 3 3 3 4 1 2 1 3 0 2 4 1 ]); skall ge som resultat: OBS! De streckade linjerna skall inte finnas med. De är bara till för att du skall se bättre var bilderna skall ritas ut. Tips: Det finns en ”plot”-variant som heter ”fill” som beter sig som plot, men som fyller området med färg.