Ohjelmointi 1, uusintatentti 4.5.2012 Arviointiraportti Antti-Jussi Lakanen Tehtävä 1 --- using System; /// /// Tulostaa riveittäin luvut 1..100. Jos luku on jaollinen neljällä, /// tulostetaan luvun lisäksi sana "Hip". Jos luku on jaollinen /// seitsemällä, tulostetaan "Hei". Jos luku on jaollinen sekä /// neljällä, että seitsemällä, tulostetaan "HipHei". /// public class LukujenTulostus { /// /// Tulostetaan luvut silmukassa. /// /// Ei käytössä. public static void Main(string[] args) { for (int i = 1; i <= 100; i++) { Console.Write(i + " " ); if (i % 4 == 0) Console.Write("Hip"); if (i % 7 == 0) Console.Write("Hei"); Console.WriteLine(); } } } - Tehty taulukkoon luvut 1..100, - 2 p. - Jos tulostaa liikaa, - 2 p. Tyypillinen virhe: if-tapaukset eivät sulje toisiaan pois, esim. if (i % 7 == 0 && i % 4 == 0) Console.WriteLine(i + " HipHei"); if (i % 7 == 0) Console.WriteLine(i + " Hei"); if (i % 4 == 0) Console.WriteLine(i + " Hip"); Tulostaa (ote) 80 Hip 81 82 83 84 HipHei 84 Hei 84 Hip Tehtävä 2 --- (a) 0100 1010_2 = 1 * 2^6 + 1 * 2^3 + 1 * 2^1 = 64 + 8 + 2 = 74_10 0011 1011_2 = 2^5 + 2^4 + 2^3 + 2^1 + 2^0 = 32 + 16 + 8 + 2 + 1 = 59_10 1000 0001_2 = 2^7 + 2^0 = 128 + 1 = 129_10 (sillä oletuksella, että käytössä on vain positiiviset kokonaisluvut) (b) Eroiksi kävivät (esimerkiksi): - Alkeistietotyyppinen muuttuja sisältää muuttujan arvon, oliotietotyyppinen viitteen olioon, eli sen sijaintiin kekomuistissa. - Oliotyyppisen muuttujan sisältö tallennetaan kekomuistiin, jonne muuttuja viittaa. Tämän takia parametrit, jotka viedään funktioille viitteinä, voivat muuttaa myös alkuperäisen muuttujan arvoa. Alkeistietotyypeillä tämä ei onnistu. Alkeistietotyyppien tapauksessa välitetään ("vain") kopio arvosta. - Alkeistietotyypit alustetaan ilman new-operaattoria, toisin kuin oliotyypit. Eroiksi eivät käyneet (esimerkiksi): - Alkeistietotyyppiset muuttujat sisältävät vähemmän tietoa. Yhtäläisyyksiksi kävivät (esimerkiksi): - Molempia koskevat samat nimeämissäännöt. - Molempien sisältöä voi mahdollisesti muokata, mutta esimerkiksi String-olio on muuttumaton (immutable). - Molemmilla on metodeja, esim ToString Yhtäläisyyksiin eivät käyneet (esimerkiksi): - Molemmista tyypeistä löytyy muuttujatyypit kirjaimille ja numeroille. (c) while Jatketaan niin kauan, kuin annettu ehto on tosi. Käytetään erityisesti, kun toistojen määrä ei ole tiedossa. do-while Vastaava kuin while, mutta silmukan jatkamisehto tarkistetaan vasta runko-osan (do-osa) suorittamisen jälkeen, jolloin do-osa suoritetaan vähintään kerran. for Käytetään erityisesti, kun toistojen määrä on tiedossa. Silmukka mennään läpi indeksimuuttujan (yleensä int i) avulla. foreach Tietorakenteen kaikki alkiot käydään läpi iteraattorin avulla (ilman indeksiä). Hyvä silloin, kun tiedetään, että todella kaikki alkiot tullaan käymään läpi (ilman tarvetta poistaa, tai lisätä välillä tietorakenteesta alkioita). Tehtävä 3 --- 1. == on vertailuoperaattori, esimerkiksi if(nimi == "Antti-Jussi") Console.WriteLine("nimi-muuttujan arvo todella on Antti-Jussi!"); Jos ei mitään mainintaa vertailusta, 0 p. = on sijoitusoperaattori. esimerkiksi int i = 5; i = i + 4; "Antaa uuden arvon" hyväksyttiin myös. 2. Algoritmi on äärellinen ja päättyvä sarja vaiheita, jota seuraamalla voidaan ratkaista tietty ongelma. 3. Aliohjelma on itsenäinen ohjelman osa, jota voidaan kutsua pääohjelmasta tai muista aliohjelmista. Metodi on olion aliohjelma, esimerkiksi pallo.Destroy() (kutsutaan Destroy-metodia, joka tuhoaa vain tietyn pallon, ei kaikkia palloja). Funktioksi sanotaan aliohjelmaa, joka palauttaa jonkin arvon. 4. double on liukuluku, jonka tarkkuus on 64-bittiä. Tällä saavutetaan noin 15 desimaalin tarkkuus. float on liukuluku, jonka tarkkuus on 32 bittiä, ja käytännössä noin 7 desimaalin tarkkuus. 5. Aritmeettisia (eli laskenta-)operaattoreita ovat +, -, *, / ja %. Esimerkiksi > ja < ovat vertailuoperaattoreita, eivät siis aritmeettisia operaattoreita. 6. Automaattinen roskienkeruu huolehtii, että niiden olioiden, joihin ei enää viitata, varaama muisti vapautetaan uudelleenkäyttöä varten. Tehtävä 4 --- - Jos käyttäjätunnus sisälsi muutakin kuin vain pieniä kirjaimia, vähennys 2 pistettä - Muut virheet tapauskohtaisesti /// /// Aliohjelma muuttaa nimen käyttäjätunnukseksi. /// Käyttäjätunnus muodostetaan yhdistämällä käyttäjän /// etunimen kaksi kirjainta ja sukunimen ensimmäiset /// kuusi merkkiä, jolloin käyttäjätunnuksesta tulee 8 merkkiä pitkä. /// Jos sukunimessä ei ole seitsemää merkkiä, sukunimi otetaan mukaan /// kokonaisuudessaan. /// Kirjaimet ä, ö ja å korvataan kirjaimilla a, o ja a. /// Käyttäjätunnus sisältää ainoastaan pieniä kirjaimia. /// /// muutettavan nimen etunimi /// muutettvan nimen sukunimi /// nimien perusteella muodostettu käyttäjätunnus /// ///
/// KayttajaTunnus.TeeTunnus("Matti-Esko", "Hytönen") === "mhytonen";
/// KayttajaTunnus.TeeTunnus("Äijä", "Åk") === "aak";
/// KayttajaTunnus.TeeTunnus("Irma", "Åk-Äijälä") === "iakaijal";
/// KayttajaTunnus.TeeTunnus("", "") === "";
/// 
///
public static String TeeTunnus(String etunimi, String sukunimi) { String alku = ""; if (etunimi.Length > 0) alku = "" + MuutaKirjain(etunimi[0]); StringBuilder tunnus = new StringBuilder(alku); int i = 0; while (i < sukunimi.Length && tunnus.Length < 8) { if (MuutaKirjain(sukunimi[i]) != '1') { tunnus.Append(MuutaKirjain(sukunimi[i])); i++; } else { i++; } } return tunnus.ToString(); }