C:\MyTemp\ohj1\ohjdemot\k2012\demot\vastaukset\demo11\PP1\TokaPisin.cs 1 using System; 2 using System.Collections.Generic; 3 using System.

Samankaltaiset tiedostot
ITKP102 Ohjelmointi 1 (6 op)

ITKP102 Ohjelmointi 1 (6 op)

ITKP102 Ohjelmointi 1 (6 op), arvosteluraportti

ITKP102 Ohjelmointi 1 (6 op)

ITKP102 Ohjelmointi 1 (6 op), arvosteluraportti

Ohjelmointi 2 / 2010 Välikoe / 26.3

Listarakenne (ArrayList-luokka)

Ohjelmointi 1 / 2009 syksy Tentti / 18.12

1. Mitä tehdään ensiksi?

ITKP102 Ohjelmointi 1 (6 op)

Metodien tekeminen Javalla

ITKP102 Ohjelmointi 1 Tentti

ITKP102 Ohjelmointi 1 (6 op), arvosteluraportti

Harjoitus Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti:

Mikä yhteyssuhde on?

7. Oliot ja viitteet 7.1

Metodit. Metodien määrittely. Metodin parametrit ja paluuarvo. Metodien suorittaminen eli kutsuminen. Metodien kuormittaminen

4. Luokan testaus ja käyttö olion kautta 4.1

Sisältö. 22. Taulukot. Yleistä. Yleistä

Ohjelmointi 2 / 2008 Välikoe / Pöytätestaa seuraava ohjelma.

Kompositio. Mikä komposition on? Kompositio vs. yhteyssuhde Kompositio Javalla Konstruktorit set-ja get-metodit tostring-metodi Pääohjelma

ITKP102 Ohjelmointi 1 (6 op), arvosteluraportti

Yleistä. Nyt käsitellään vain taulukko (array), joka on saman tyyppisten muuttujien eli alkioiden (element) kokoelma.

Olion elinikä. Olion luominen. Olion tuhoutuminen. Olion tuhoutuminen. Kissa rontti = null; rontti = new Kissa();

Ohjelmointi 2, välikoe

Pong-peli, vaihe Aliohjelmakutsu laskureita varten. 2. Laskurin luominen. Muilla kielillä: English Suomi

1. Miten tehdään peliin toinen maila?

Ohjelmoinnin jatkokurssi, kurssikoe

Ohjelmointitaito (ict1td002, 12 op) Kevät Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen

Ohjelmassa henkilön etunimi ja sukunimi luetaan kahteen muuttujaan seuraavasti:

Ohjelmointi 1 C#, kevät 2014, 2. uusintatentti NIMI:

Sisällys. 7. Oliot ja viitteet. Olion luominen. Olio Java-kielessä

1. Omat operaatiot 1.1

Sisältö. 2. Taulukot. Yleistä. Yleistä

Olio-ohjelmointi Javalla

ITKP102 Ohjelmointi 1 (6 op), arvosteluraportti

Sisällys. 1. Omat operaatiot. Yleistä operaatioista. Yleistä operaatioista

Informaatioteknologian laitos Olio-ohjelmoinnin perusteet / Salo

815338A Ohjelmointikielten periaatteet Harjoitus 2 vastaukset

Luokka Murtoluku uudelleen. Kirjoitetaan luokka Murtoluku uudelleen niin, että murtolukujen sieventäminen on mahdollista.

Pong-peli, vaihe Aliohjelman tekeminen. Muilla kielillä: English Suomi. Tämä on Pong-pelin tutoriaalin osa 3/7. Tämän vaiheen aikana

Taulukoiden käsittely Javalla

Java-kielen perusteet

Pisteytys: Eri kommentointitavat tiedetty: 0,5 pistettä, jos puuttuu niin ei voinut saada täysiä pisteitä.

17. Javan omat luokat 17.1

1. Taustatietoa näppäimistönkuuntelusta

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Taulukot & Periytyminen

Rajapinta (interface)

List-luokan soveltamista. Listaan lisääminen Listan läpikäynti Listasta etsiminen Listan sisällön muuttaminen Listasta poistaminen Listan kopioiminen

ITKP102 Ohjelmointi 1 (6 op), arvosteluraportti

Ohjelmointitaito (ict1td002, 12 op) Kevät Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen

Tietorakenteet. JAVA-OHJELMOINTI Osa 5: Tietorakenteita. Sisällys. Merkkijonot (String) Luokka String. Metodeja (public)

20. Javan omat luokat 20.1

Sisällys. 20. Javan omat luokat. Java API. Pakkaukset. java\lang

JAVA-PERUSTEET. JAVA-OHJELMOINTI 3op A JAVAN PERUSTEET LYHYT KERTAUS JAVAN OMINAISUUKSISTA JAVAN OMINAISUUKSIA. Java vs. C++?

Sisällys. 12. Näppäimistöltä lukeminen. Yleistä. Yleistä

Taulukot. Taulukon määrittely ja käyttö. Taulukko metodin parametrina. Taulukon sisällön kopiointi toiseen taulukkoon. Taulukon lajittelu

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä. Tiedonkätkentä. Aksessorit. 4.2

ITKP102 Ohjelmointi 1 (6 op), arvosteluraportti

1. Kun käyttäjä antaa nollan, niin ei tulosteta enää tuloa 2. Hyväksy käyttäjältä luku vain joltain tietyltä väliltä (esim tai )

Ohjelmointi 1 C#, kevät 2013, 2. tentti

8. Näppäimistöltä lukeminen 8.1

Java kahdessa tunnissa. Jyry Suvilehto

8. Näppäimistöltä lukeminen 8.1

Javan perusteita. Janne Käki

Ohjelmointi 2 / 2011 Välikoe / 25.3

Lista luokan sisällä

Ohjelmoinnin perusteet, kurssikoe

Periytyminen (inheritance)

Luokan sisällä on lista

12. Näppäimistöltä lukeminen 12.1

Operaattoreiden ylikuormitus. Operaattoreiden kuormitus. Operaattoreiden kuormitus. Operaattoreista. Kuormituksesta

Pong-peli, vaihe Koordinaatistosta. Muilla kielillä: English Suomi. Tämä on Pong-pelin tutoriaalin osa 2/7. Tämän vaiheen aikana

Ohjelmoinnin perusteet Y Python

7/20: Paketti kasassa ensimmäistä kertaa

Ohjelmoinnin perusteet Y Python

Ohjelmointi 1 Taulukot ja merkkijonot

Se mistä tilasta aloitetaan, merkitään tyhjästä tulevalla nuolella. Yllä olevassa esimerkissä aloitustila on A.

YHTEYSSUHDE (assosiation)

Java-kielen perusteet

Jypelin käyttöohjeet» Ruutukentän luominen

Tehtävä 1. Tehtävä 2. Arvosteluperusteet Koherentti selitys Koherentti esimerkki

Java-kielen perusteita

Jypelin käyttöohjeet» Miten saan peliin pistelaskurin?

7. Näytölle tulostaminen 7.1

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä ja ulkopuolelta. Attribuuttien arvojen käsittely aksessoreilla. 4.2

ITKP102 Ohjelmointi 1 (6 op), arvosteluraportti

Ohjelmointi 1 C#, kevät 2013,

Luokat ja oliot. Ville Sundberg

815338A Ohjelmointikielten periaatteet Harjoitus 3 vastaukset

14. Poikkeukset 14.1

// Tulostetaan double-tyyppiseen muuttujaan "hinta" tallennettu // kertalipun hinta ja vaihdetaan riviä. System.out.printf("%.1f euros.

Ohjelmoinnin perusteet Y Python

Kääreluokat (oppikirjan luku 9.4) (Wrapper-classes)

Ohjelmoinnin perusteet Y Python

Interaktiivinen tarinankerronta

Ohjelmoinnin perusteet Y Python

TIETORAKENTEET JA ALGORITMIT

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

Metodien tekeminen Javalla

Transkriptio:

C:\MyTemp\ohj1\ohjdemot\k2012\demot\vastaukset\demo11\PP1\TokaPisin.cs 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 7 /// <summary> 8 /// Etsitään toiseksi pisintä sanaa. 9 /// </summary> 10 public class TokaPisin 11 { 12 public static void Main(string[] args) 13 { 14 Console.WriteLine("Anna sanoja"); 15 List<string> sanat = new List<string>(); 16 String syote; 17 while (true) 18 { 19 syote = Console.ReadLine(); 20 if (syote == "") break; 21 sanat.add(syote); 22 } 23 24 String tokapisin = EtsiToiseksiPisin(sanat); 25 } 26 27 /// <summary> 28 /// Palauttaa listan toiseksi pisimmän alkion. 29 /// </summary> 30 /// <param name="sanat">lista sanoja</param> 31 /// <returns>toka pisin</returns> 32 /// <example> 33 /// <pre name="test"> 34 /// List<string> sanat = new List<string>() { "Antti", "Pekka", "Irmeli" }; 35 /// TokaPisin.EtsiToiseksiPisin(sanat) === "Antti"; 36 /// List<string> sanat2 = new List<string>() { "Irmeli", "Pekka", "Antti" }; 37 /// TokaPisin.EtsiToiseksiPisin(sanat2) === "Pekka"; 38 /// </pre> 39 /// </example> 40 public static string EtsiToiseksiPisin(List<string> sanat) 41 { 42 String pisin = sanat[0]; 43 String tokapisin = sanat[1]; 44 for (int i = 1; i < sanat.count; i++) 45 { 46 if (sanat[i].length > pisin.length) 47 { 48 tokapisin = pisin; 49 pisin = sanat[i]; 50 } 51 else if (sanat[i].length > tokapisin.length) 52 tokapisin = sanat[i]; 53 } 54 return tokapisin; 55 } 56 } 57 58 1

C:\MyTemp\ohj1\esimerkit\live\PP11\EkaJaVikaSana\Program.cs 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 /// <summary> 7 /// Etsitään ensimmäinen ja viimeinen sana. 8 /// </summary> 9 public class EkaVika 10 { 11 static void Main(string[] args) 12 { 13 String ekajavika = EkaJaVikaSana("Janne meni kauppaan ja osti maitoa."); 14 } 15 16 /// <summary> 17 /// Palauttaa annetusta merkkijonosta ensimmäisen ja viimeisen sanan, 18 /// väliin välilyönti. 19 /// </summary> 20 /// <param name="jono">jono, josta eka ja vika sana otetaan.</param> 21 /// <returns>eka ja vika sana.</returns> 22 /// <example> 23 /// <pre name="test"> 24 /// EkaVika.EkaJaVikaSana("Janne meni kauppaan ja osti maitoa.") === "Janne maitoa."; 25 /// EkaVika.EkaJaVikaSana("Janne") === "Janne"; 26 /// EkaVika.EkaJaVikaSana("Janne Kalle") === "Janne Kalle"; 27 /// EkaVika.EkaJaVikaSana("") === ""; 28 /// EkaVika.EkaJaVikaSana(" ") === " "; 29 /// EkaVika.EkaJaVikaSana(" ") === " "; 30 /// EkaVika.EkaJaVikaSana(" ") === " "; 31 /// </pre> 32 /// </example> 33 public static string EkaJaVikaSana(String jono) 34 { 35 String[] sanat = jono.split(' '); 36 if (sanat.length > 1) 37 { 38 String ekajavika = sanat[0] + " " + sanat[sanat.length 1]; 39 return ekajavika; 40 } 41 return jono; 42 } 43 } 44 1

C:\MyTemp\ohj1\ohjdemot\k2012\demot\vastaukset\demo11\ToiseksiSuurin\ToiseksiSuurin.cs 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 /// @author Antti Jussi Lakanen 7 /// @version 26.3.2012 8 9 /// <summary> 10 /// Ohjelma etsii ja tulostaa annetun kokonaislukutaulukon toiseksi 11 /// suurimman alkion. 12 /// </summary> 13 public class ToiseksiSuurinLuku 14 { 15 /// <summary> 16 /// Alustetaan taulukot ja tulostetaan halutut alkiot. 17 /// </summary> 18 /// <param name="args"></param> 19 public static void Main(string[] args) 20 { 21 int[] luvut = { 3, 1, 7, 9, 15, 8 }; 22 int luku = ToiseksiSuurin(luvut); 23 Console.Write("Taulukon "); 24 TulostaTaulukko(luvut); 25 Console.Write(" toiseksi suurin luku on " + luku); 26 Console.ReadKey(); 27 } 28 29 30 /// <summary> 31 /// Tulostaa int taulukon. 32 /// </summary> 33 /// <param name="luvut">tulostettava taulukko.</param> 34 public static void TulostaTaulukko(int[] luvut) 35 { 36 foreach (int luku in luvut) 37 Console.Write(luku + " "); 38 } 39 40 41 /// <summary> 42 /// Palauttaa kokonaislukutaulukon toiseksi suurimman alkion. 43 /// Alle 2 mittaisille taulukoille paluuarvo on int.minvalue. 44 /// Taulukon ollessa pituudeltaan 1 palautetaan ainoa alkio. 45 /// </summary> 46 /// <param name="luvut">tutkittava taulukko.</param> 47 /// <returns>toiseksi suurin alkio.</returns> 48 /// @example 49 /// <pre name="test"> 50 /// int[] luvut1 = {}; 51 /// ToiseksiSuurinLuku.ToiseksiSuurin(luvut1) === int.minvalue; 52 /// int[] luvut2 = {4}; 53 /// ToiseksiSuurinLuku.ToiseksiSuurin(luvut2) === int.minvalue; 54 /// int[] luvut3 = {3, 1, 7, 9, 15, 8}; 55 /// ToiseksiSuurinLuku.ToiseksiSuurin(luvut3) === 9; 56 /// int[] luvut4 = {15, 14, 10, 8, 5}; 57 /// ToiseksiSuurinLuku.ToiseksiSuurin(luvut4) === 14; 58 /// int[] luvut5 = {15, 14, 15, 15, 15}; 59 /// ToiseksiSuurinLuku.ToiseksiSuurin(luvut5) === 15; 60 /// </pre> 61 /// @endexample 62 public static int ToiseksiSuurin(int[] luvut) 63 { 64 if (luvut.length < 2) return int.minvalue; 65 int suurin = int.minvalue; 66 int toiseksisuurin = int.minvalue; 67 for (int i = 0; i < luvut.length; i++) 68 { 69 if (luvut[i] > suurin) 70 { 71 toiseksisuurin = suurin; 72 suurin = luvut[i]; 73 } 1

C:\MyTemp\ohj1\ohjdemot\k2012\demot\vastaukset\demo11\ToiseksiSuurin\ToiseksiSuurin.cs 74 else if (luvut[i] > toiseksisuurin) 75 { 76 toiseksisuurin = luvut[i]; 77 } 78 } 79 return toiseksisuurin; 80 } 81 } 2

C:\MyTemp\ohj1\ohjdemot\k2012\demot\vastaukset\demo11\NimenPalat\NimenPalat.cs 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 /// @author Antti Jussi Lakanen 7 /// @version 26.3.2012 8 9 /// <summary> 10 /// Luetaan riveittäin käyttäjän antamaa nimitietoa muodossa 11 /// Ekaetunimi Tokaetunimi Kolmasetunimi Sukunimi 12 /// Sukunimi on aina mukana, etunimiä annetaan vähintään yksi, enintään kolme. 13 /// Syöttö lopetetaan antamalla pelkkä Enter, jolloin ohjelma 14 /// tulostaa nimet aakkostettuna muodossa 15 /// Sukunimi E.T.K. 16 /// </summary> 17 public class NimenPalat 18 { 19 /// <summary> 20 /// Luodaan lista tietorakenne, johon nimia tallennetaan. 21 /// Pyydetaan sitten kayttajan syotteet ja lopuksi tulostetaan 22 /// tulokset. 23 /// </summary> 24 /// <param name="args"></param> 25 public static void Main(string[] args) 26 { 27 Console.WriteLine("Anna nimiä muodossa Etunimet Sukunimi\nYksi nimi rivilleen, pelkkä Enter lopettaa."); 28 List<String> nimet = new List<string>(); 29 while (true) 30 { 31 Console.Write("> "); 32 String syote = Console.ReadLine(); 33 if (syote == "") break; 34 String muokattunimi = MuutaNimi(syote, 3); 35 nimet.add(muokattunimi.tostring()); 36 } 37 38 nimet.sort(); // Jarjestetaan lista sukunimen ensimmaisen kirjaimen mukaan 39 40 Console.WriteLine("Annoit nimet:"); 41 foreach (String nimi in nimet) 42 { 43 Console.WriteLine(nimi); 44 } 45 Console.ReadKey(); 46 } 47 48 49 /// <summary> 50 /// Muutetaan nimi niin, että sukunimi tulee alkuun ja etunimistä on vain alkukirjaimet ja. 51 /// </summary> 52 /// <param name="nimi">muutettava nimi</param> 53 /// <param name="etunimiaenintaan">kuinka monta etunimeä enintään sallitaan.</param> 54 /// <returns>nimi muodossa sukunimi e.t.</returns> 55 /// <example> 56 /// <pre name="test"> 57 /// NimenPalat.MuutaNimi("", 3) === ""; 58 /// NimenPalat.MuutaNimi("Kaarle", 3) === "Kaarle"; 59 /// NimenPalat.MuutaNimi("Kaarle Kustaa Korkki", 3) === "Korkki K.K."; 60 /// NimenPalat.MuutaNimi("Seppo Pentti Ville Kinnunen", 3) === "Kinnunen S.P.V."; 61 /// NimenPalat.MuutaNimi("Åke Aarnio", 3) === "Aarnio Å."; 62 /// NimenPalat.MuutaNimi(" Åke Aarnio ", 3) === "Aarnio Å."; 63 /// NimenPalat.MuutaNimi("Ulla Maija Wikholm Seppänen", 3) === "Wikholm Seppänen U."; 64 /// </pre> 65 /// </example> 66 public static String MuutaNimi(String syote, int etunimiaenintaan) 67 { 68 string[] osat = syote.split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); 69 int n = osat.length; 70 if (n == 0) return ""; 71 if (n == 1) return osat[0]; // muuten tulee turha välilyönti 72 StringBuilder muokattunimi = new StringBuilder(); 1

C:\MyTemp\ohj1\ohjdemot\k2012\demot\vastaukset\demo11\NimenPalat\NimenPalat.cs 73 muokattunimi.append(osat[osat.length 1] + " "); 74 for (int i = 0; i < Math.Min(etunimiaEnintaan, osat.length 1); i++) // Etunimiä ei saa olla määräänsä enempää 75 { 76 muokattunimi.append(osat[i][0] + "."); 77 } 78 return muokattunimi.tostring(); 79 } 80 } 2

C:\MyTemp\ohj1\ohjdemot\k2012\demot\vastaukset\demo11\t4.txt 26. maaliskuuta 2012 8:04 Aliohjelmakutsu =============== Olkoon meillä vaikkapa ohjelmakoodi: StringBuilder jono = new StringBuilder("Matti istuu penkillä."); String vokaalit = "aeiouyåäö"; String kolmeekaavokaalia = SiirraKirjaimet(jono,vokaalit,1+2); ja aliohjelman esittely public static String SiirraKirjaimet(StringBuilder jono, String siirrettavat, int maara) Aliohjelmakutsussa SiirraKirjaimet(jono,vokaalit,1+2); ohjelman suoritus siirtyy aliohjelman SiirraKirjaimet sisälle. Kuitenkin ennen siirtymistä lasketaan kunkin parametrina olevan lausekkeen arvot loppuun saakka. Osa lausekkeista voi olla valmiita sellaisenaan, kuten esimerkissä jono ja vokaalit. Lausekkeen 1+2 arvo lasketaan. Kutsua varten lausekkeiden arvot sijoitetaan aliohjelman vastinmuuttujiin, siis tässä tapauksessa aliohjelman jono = pääohjelman jono siirrettavat = vokaalit maara = 3 On huomattava, että oliomuuttujien tapauksessa (esimerkissä tyypit StringBuilder ja String) sijoitetaan _viite_ siihen olioon, johon pääohjelmankin vastaava viite (esim. vokaalit) osoittaa. Ei siis luoda uutta oliota. Kuitenkin jos kutsussa olisi ollut SiirraKirjaimet(jono,vokaalit+"k",1+2); olisi lausekkeesta vokaalit+"k" syntynyt uusi olio ja tämän olion viite olisi viety aliohjelman siirrettavat muuttujan arvoksi. Tämä tilapäinen olio muuttuisi roskaksi kun aliohjelmasta palataan (ellei aliohjelman sisällä ole jotakin, mistä jää pysyvämpi viite parametrina vietyyn oliooon). -1-

C:\MyTemp\ohj1\ohjdemot\k2012\demot\vastaukset\demo11\t4.txt 26. maaliskuuta 2012 8:04 Kun sijoitukset on tehty, lähdetään suorittamaan aliohjelmaa. Suorituksen loppuessa tai return lauseen tullessa vastaan, aliohjelmasta palataan siihen kohti, josta sitä kutsuttiin. Jos aliohjelman tyyppinä on muuta kuin void, tulee aliohjelman paluuarvo kutsuneeseen ohjelman osaan ja siitä se otetaan jatkokäyttöön. Esimerkin tapauksessa muuttuja kolmeekaavokaalia saa aliohjelman palauttaman arvon. Tässä tapauksessa arvona on aliohjelman (oletettavasti) luoman olion viite, nyt siis merkkijonoon, johon poistettavat merkit on kopioitu. Esimerkin maara ja jono muuttujien välillä on sellainen ratkaiseva ero, että vaikka aliohjelman sisällä sijoitettaisiin maara muuttujaan, niin vaikutus ei näy kutsuvaan ohjelman osaan. Jos aliohjelmassa tehdään jokin muutos jono muuttujan sisältöön (ei siis luoda uutta oliota), niin silloin yhteisen viitteen takia myös kutsuneen ohjelmanosan vastaava olio (siis se sama yhteinen olio) on muuttunut. Sen sijaan jos aliohjelmassa tehtäisiin jono = new StringBuilder("kissa"); niin tämä on uusi olio, josta kutsunut ohjelmanosa ei saa tietää mitään. Tämä vastaisi täysin sijoitusta maara = 7; mikä ei tietenkään voisi muuttaa lasekkeen 2+1 arvoa mitenkään. C#:ssa aliohjelmien parametrien välitys on siis arvopohjaista ja viitteet ovat arvoja. Toki viitteitä pitkin voidaan muuttaa olioiden sisältöä. Jotkin luokat ovat arvopohjaisia (imnmutable), mikä tarkoittaa sitä, että vaikka olioita käsitelläänkin, niin silti niiden sisältöä ei voi muuttaa. Esimerkin tapauksessa C#:n String luokka on tällainen. Eli vokaalit olion sisältö on ennen ja jälkeen aliohjelman kutsun täsmälleen samanlainen, tehtiin aliohjelmassa mitä tahansa. -2-

C:\MyTemp\ohj1\ohjdemot\k2012\demot\vastaukset\demo11\PoistaKirjaimia\PoistaKirjain.cs 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 /// @author Antti Jussi Lakanen 7 /// @version 26.3.2012 8 9 /// <summary> 10 /// Ohjelmassa poistetaan merkkeja merkkijonosta. 11 /// </summary> 12 public class PoistaKirjain 13 { 14 /// <summary> 15 /// Esimerkkeja. Tulostetaan tulokset. 16 /// </summary> 17 /// <param name="args">ei kaytossa.</param> 18 public static void Main(string[] args) 19 { 20 StringBuilder jono = new StringBuilder("putos ku talonmies liukkaalta katolta"); 21 Poista(jono, 't'); 22 Console.WriteLine(jono.ToString()); 23 Poista(jono, 'k'); 24 Console.WriteLine(jono.ToString()); 25 Poista(jono, 'a'); 26 Console.WriteLine(jono.ToString()); 27 Poista(jono, 'l'); 28 Console.WriteLine(jono.ToString()); 29 Poista(jono, 's'); 30 Console.WriteLine(jono.ToString()); 31 Poista(jono, 'x'); 32 Console.WriteLine(jono.ToString()); 33 Poista(jono, ' '); 34 Console.WriteLine(jono.ToString()); 35 Console.ReadKey(); 36 } 37 38 39 /// <summary> 40 /// Aliohjelma poistaa merkkijonosta kaikki 41 /// annetun merkin esiintymat. 42 /// </summary> 43 /// <param name="jono">merkkijono, josta merkkeja poistetaan.</param> 44 /// <param name="poistettava">poistettava merkki.</param> 45 /// <returns>montako poistettavaa merkkia loytyi/poistettiin.</returns> 46 /// @example 47 /// <pre name="test"> 48 /// StringBuilder jono = new StringBuilder("kissa istuu puussa"); // alustetaan jono 49 /// PoistaKirjain.Poista(jono, ' ') === 2; jono.tostring() === "kissaistuupuussa"; 50 /// PoistaKirjain.Poista(jono, 'u') === 4; jono.tostring() === "kissaistpssa"; 51 /// PoistaKirjain.Poista(jono, 'k') === 1; jono.tostring() === "issaistpssa"; 52 /// PoistaKirjain.Poista(jono, 'a') === 2; jono.tostring() === "issistpss"; 53 /// PoistaKirjain.Poista(jono, 's') === 5; jono.tostring() === "iitp"; 54 /// PoistaKirjain.Poista(jono, 'x') === 0; jono.tostring() === "iitp"; 55 /// </pre> 56 /// @endexample 57 public static int Poista(StringBuilder jono, char poistettava) 58 { 59 int i = 0; 60 int loydetty = 0; 61 while (i < jono.length) 62 { 63 if (jono[i] == poistettava) 64 { 65 jono.remove(i, 1); 66 loydetty++; 67 } 68 else i++; 69 } 70 return loydetty; 71 } 72 } 1

C:\MyTemp\ohj1\ohjdemot\k2012\demot\vastaukset\demo11\t6.txt 26. maaliskuuta 2012 8:04 Tehtävä 6 a) Miten C# ohjelma käännetään ja ajetaan komentoriviltä? Entä jos ohjelma tarvitsee jonkin kirjaston avukseen? (2 p) csc Lumiukko.cs /reference:kirjasto.dll;kirjasto2.dll b) Laske (laskutoimitukset mukaan) seuraavien binäärilukujen arvo 10 järjestelmän lukuna. Mitä oletuksia teit? (2 p): 0100 0101 0011 1111 1000 0001 oletus: käsitellään positiivisia kokonaislukuja (i) 0100 0101 = 2^6 + 2^2 + 2^0 = 64 + 4 + 1 = 69 (ii) 0011 1111 = 2^5 + 2^4 + 2^3 + 2^2 + 2^1 + 2^0 = 32 + 16 + 8 + 4 + 2 + 1 = 63 (iii) 1000 0001 = 128 + 1 = 129 c) Oletetaan 8 bittisille negatiivisille kokonaisluvuille 2 komplementtiesitys. Mikä olisi luvun miinus viisi ( 5) bittiesitys tällaisessa järjestelmässä. (1 p) 5 = 0000 0101 (+5) => 1111 1010 (1 komplementti) => 1111 1011 (+1 bitti eli 5) d) Binäärinen desimaaliluku 1001.1110 10 järjestelmän lukuna. (1 p) 1001.1110_2, kokonaisosa 2^3 + 2^0 = 8+1 = 9 desimaaliosa 2^( 1) + 2^( 2) + 2^( 3) = 0.5 + 0.25 + 0.125 = 0.875 => 9.875_10 e) Pohdi missä mielessä List on parempi kuin tavallinen taulukko. Missä mielessä huonompi? (2 p) parempi: Tietorakenne on "dynaaminen", eli koko muuttuu automaattisesti kun alkioita poistetaan / lisätään => kokoa ei tarvitse tietää etukäteen. Muistitilan rajoissa voidaan siis lisätä aina uusia alkioita. huonompi: koon automaattisessa muuttumisessa on myös haittapuolensa, eli jossain tapauksessa saatetaan varata turhan paljon tilaa listalle, jolloin muistia menee "hukkaan". samoja ominaisuuksia: Sekä Listia etta taulukkoa voidaan mennä läpi indeksoidusti (lista[0], lista[1],..., vastaavasti taulukko[0], -1-

C:\MyTemp\ohj1\ohjdemot\k2012\demot\vastaukset\demo11\t6.txt 26. maaliskuuta 2012 8:04 taulukko[1]), ja molempia voidaan iteroida (foreach silmukka). f) Mikä ero on String ja StringBuilder luokilla? (1 p) String on muuttamaton (immutable), StringBuilder oliota (sisältöä) voidaan muuttaa vielä olion luomisen jälkeenkin. Mitä hyötyä Stringin muuttamattomuudesta on? Sen ansiosta merkkijonojen kopiointi saadaan nopeaksi, koska itse asiassa kopiontia ei tarvita, vaan riittää laittaa toinen viite samaan olioon. Muuttumattomuuden ansiosta kaikki viitteen omistajat voivat olla varmoja, että sisältö ei muutu esimerkiksi aliohjelmakutsun aikana. Vastaavasti jos itse sisältöä pitää muuttaa, tarvitaan StringBuilder luokan olioita. Jos jonoon tulee paljon muutoksia, kannattaa ensin muutokset tehdä StringBuilder luokan olioon ja sitten jos tarvitaan String olio, lopuksi pyydetään sellainen StringBuilder luokan oliolta ToString() metodilla. g) Paljonko on 34/7 C#:ssa. Paljonko on 34%7 C#:ssa. (1 p) 34/7 = 4, sillä molemmat luvut (34 ja 7) ovat int tyyppisiä, ja niinpä laskutoimituksen tuloskin on int tyyppiä ja "oikeasta" tuloksesta otettu mukaan vain kokonaisosa. 34%7 = 6 (jakojäännösoperaattori % palauttaa jakolaskun jakojäännöksen) h) Mitä tarkoittaa että olio "muuttuu roskaksi"? (1 p) Kun olioon ei ole enää yhtään viitettä, ei olioon päästä mistään kautta käsiksi. Tällöin olio muuttuu "roskaksi", ja kielen automaattinen roskienkeruu mahdollisesti aikanaan vapauttaa olion viemän muistitilan muiden olioiden käyttöön. Olion viite voi kadota esimerkiksi, kun viitteelle annetaan uusi arvo: StringBuilder jono = new StringBuilder("kissa");... jono = new StringBuilder("koira"); // nyt ei kukaan enää osoita ensin luotuun "kissa" jonoon // joten sitä edustava olio muuttuu roskaksi. -2-

C:\MyTemp\ohj1\ohjdemot\k2012\demot\vastaukset\demo11\t6.txt 26. maaliskuuta 2012 8:04-3-

C:\MyTemp\ohj1\ohjdemot\k2012\demot\vastaukset\demo11\Salakirjoita\Salakirjoita\Salakirjoita.cs 1 using System; 2 using System.Collections.Generic; 3 using Jypeli; 4 using Jypeli.Assets; 5 using Jypeli.Controls; 6 using Jypeli.Effects; 7 using Jypeli.Widgets; 8 9 /// @author Vesa Lappalainen 10 /// @version syksy 2011 11 /// @author Antti Jussi Lakanen 12 /// @version 26.3.2012 13 14 /// <summary> 15 /// Salakirjoitetaan teksti kuvaan 16 /// </summary> 17 public class Salakirjoita : PhysicsGame 18 { 19 /// <summary> 20 /// Ominaisuus johon voi valmiiksi sijoittaa nimen jota käytetään 21 /// </summary> 22 public string Nimi { get; set; } 23 24 /// <summary> 25 /// Luodaan kaksi kuvaa joista toiseen salakirjoitetaan teksti 26 /// </summary> 27 public override void Begin() 28 { 29 string kuvannimi = "viivat"; 30 31 Image kuva = LoadImage(kuvannimi); 32 AddKuva(kuva, 0, 0); 33 34 string nimi = "Antti Jussi Lakanen"; // Nimi pitäisi oikeassa elämässä kysyä dialogilla, tässä tehty näin yksinkertaisuuden vuoksi 35 if (Nimi!= null) nimi = Nimi; 36 37 Image kuva2 = kuva.clone(); 38 uint[,] bmp2 = kuva2.getdatauint(); 39 SalakirjoitaKuvaan(bmp2, nimi, 20, 0); 40 41 kuva2.setdata(bmp2); 42 AddKuva(kuva2, 1, 0); 43 } 44 45 46 /// <summary> 47 /// Lisää kuvan näyttöön valittuun "ruutuun" 48 /// </summary> 49 /// <param name="kuva">lisättävä kuva</param> 50 /// <param name="nx">ruudun x paikka</param> 51 /// <param name="ny">ruudun y paikka</param> 52 private void AddKuva(Image kuva, int nx = 0, int ny = 0) 53 { 54 GameObject k = new GameObject(kuva); 55 k.position = new Vector(Level.Left + k.width / 2 + k.width * nx, Level.Top k.height / 2 k. Height * ny); 56 Add(k); 57 } 58 59 60 /// <summary> 61 /// "Salakirjoitetaan" nimi kuvaan sijoittamalla nimen kirjainten ASCII koodi 62 /// paikasta aix,aiy alkaen sinisen värin tilalle. Jos "teksti" menee 63 /// kuvan laitaan, aloitetaan seuravaalta riviltä. Jos rivit tulee täyteen, 64 /// jatketaan paikasta 0,0 65 /// </summary> 66 /// <param name="kuva">bittimatriisi, johon nimi sijoitetaan</param> 67 /// <param name="nimi">joka "salakirjoitetaan"</param> 68 /// <param name="aiy">aloitusindeksi y koordinaatille</param> 69 /// <param name="aix">aloitusindeksi x koordinaatille</param> 70 /// <example> 71 /// <pre name="test"> 1

C:\MyTemp\ohj1\ohjdemot\k2012\demot\vastaukset\demo11\Salakirjoita\Salakirjoita\Salakirjoita.cs 72 /// uint[,] kuva = { { 0x010101,0x020202,0x030303,0x040404 }, 73 /// { 0x010101,0x020202,0x030803,0x050505 }, 74 /// { 0x010101,0x090909,0x030303,0x060606 } }; 75 /// Salakirjoita.SalakirjoitaKuvaan(kuva,"Kissa",0,0); 76 /// kuva[0,0].tostring("x") === "1014B"; 77 /// kuva[0,1].tostring("x") === "20269"; 78 /// kuva[0,2].tostring("x") === "30373"; 79 /// kuva[0,3].tostring("x") === "40473"; 80 /// kuva[1,0].tostring("x") === "10161"; 81 /// kuva[1,1].tostring("x") === "20202"; 82 /// 83 /// Salakirjoita.SalakirjoitaKuvaan(kuva,"Kissa",2,2); 84 /// kuva[2,2].tostring("x") === "3034B"; 85 /// kuva[2,3].tostring("x") === "60669"; 86 /// kuva[0,0].tostring("x") === "10173"; 87 /// </pre> 88 /// </example> 89 public static void SalakirjoitaKuvaan(uint[,] kuva, String nimi, int aiy, int aix) 90 { 91 int ix = aix, iy = aiy; 92 for (int i = 0; i < nimi.length; i++) 93 { 94 if (iy >= kuva.getlength(0)) iy = 0; 95 if (ix >= kuva.getlength(1)) { iy++; ix = 0; if (iy >= kuva.getlength(0)) iy = 0; } 96 uint pxl = kuva[iy, ix]; 97 pxl = Color.PackRGB(Color.GetRed(pxl), Color.GetGreen(pxl), (byte)nimi[i], Color.GetAlpha (pxl)); 98 kuva[iy, ix++] = pxl; 99 } 100 } 101 } 102 2