Harjoitukset

Vastaaminen Timissä

Tarvitset tunnukset Timiin tehtävien palauttamiseksi ja kirjoittamiseksi. Voit miettiä tehtävät myös Visual Studiolla.

Huom! Joissain tehtävissä ei näy koko koodi oletuksena, esimerkiksi mikäli koodia ei pääse muokkaamaan. Paina Näytä koko koodi-painiketta, jotta saat tehtävän koodin näkyviin.

Uuden projektin luominen

Luo uusi projekti Visual Studioon valitsemalla

File -> New -> Project

Ja sieltä valitse Visual C#. Tämän jälkeen valitse Console Application.

Mikäli sinulla on käynnissä Jypeli-projekti, voit valita Solutionin nimen(ylin "rakenne" kansio hierarkiassa), klikata oikealla tätä ja valita:

Add -> New Project

Valitse täältä myös Console Application Visual C#:n alta

Laita projekti C:\MyTemp-kansion alle. Muuten projektia ei voi ajaa.

Materiaalit

Näihin harjoituksiin kannattaa katsoa apua Ohjelmointi 1 -kurssin oppimateriaalista. Tehtävien kohdalla on laitettu linkkejä vastaaviin asiakokonaisuuksiin luentomonisteeseen.

Ehtolauseet

Tehtävä 0

# ehto0

Tehtävä 1

Ota pois kommenteista toinen sijoitusriveistä (esimerkiksi //a = true, poista //-merkit rivin alusta), niin että koodi tulostaa:

A
B
C
# ehtoA

Tehtävä 2

C# ohjelmointikielessä looginen tai esitetään || merkeillä ja looginen ja esitetään && merkeillä

# ehtoB

Tehtävä 3

Numeroita voi vertailla käyttämällä ==, > ja < merkkejä. == merkeillä voidaan verrata, ovatko kaksi lukua yhtä suuret. Vastaavasti > merkillä voidaan tarkistaa, onko vasemmanpuolinen luku suurempi kuin oikeanpuoleinen luku ja < merkillä voidaan tarkistaa, onko oikeanpuoleinen luku suurempi kuin vasemmanpuoleinen luku. Mikäli väite on tosi, suoritetaan ehto-lause.

Voit myös tarkistaa samalla kertaa, onko luku pienempi tai yhtäsuuri yhdistämällä yhtäsuuruuden ja pienuuden <= tai onko luku suurempi tai yhtäsuuri >=.

# ehtoC

Aliohjelmat

Aliohjelmista luentomonisteessa

Aliohjelmat ovat kokonaisuuksia, joita voidaan kutsua esimerkiksi pääohjelmasta jonkun ongelmakokonaisuuden ratkaisemiseksi. Aliohjelman runko näyttää seuraavanlaiselta:

Aliohjelmat koostuvat esittelyrivistä ja aliohjelman sisällöstä, eli rungosta.

Esittelyrivillä olevat asiat tulevat aina tietyssä järjestyksessä. Näitä asioita ovat

  • Saantimääre: Määrittää voiko muut ohjelmat käyttää aliohjelmaa. Tätä ei ole pakko kirjoittaa, oletuksena se on private, eli ei-julkinen.
  • Paluuarvon tyyppi: Määrittää minkä tyyppisen arvon aliohjelma palauttaa. Jos ei palauta mitään niin tähän tulee void. Paluuarvosta kerrottu lisää alempana.
  • Staattisuus: Tämä selitetään tarkemmin alempana.
  • Aliohjelman nimi: Aliohjelmien nimet kirjoitetaan isolla alkukirjaimella ilman välilyöntejä.
  • Parametrit: Aliohjelmalle tuodut muuttujat. Näitä ei ole pakko olla yhtään. Tämä selitetään tarkemmin alempana.

Esimerkki funktiosta, joka laskee kaksi annettua parametria yhteen:

public static int Summa(int a, int b)
{
    int tulos = a + b;
    return tulos;
}

Koska funktio on julkinen (public) ja staattinen (static) pystytään kyseistä aliohjelmaa kutsumaan mistä vaan pääohjelmasta. Paluuarvon tyyppinä on int, koska funktio palauttaa kokonaisluvun. Parametrina aliohjelma ottaa kaksi kokonaislukua.

Tehtava 1

Ratkaise seuraava tehtävä käyttäen apuna valmiiksi luotuja aliohjelmia

# AliohjelmaA

Edellä olleessa tehtävässä aliohjelmille on asetettu hyvinkin tarkka tehtävä. Esimerkiksi LisaaYksi kasvattaa arvoa täsmälleen yhdellä. Ohjelmoinnissa ei kannata tehdä näin tarkkaan määriteltyjä aliohjelmia, vaan kannattaa aina pyrkiä yleisluontoisiin aliohjelmiin. Seuraavassa tehtävässä tarkoitus onkin tehdä yleiskäyttöinen Muuta-aliohjelma, joka ottaa kaksi parametria, numeron, jota muutetaan ja numeron, kuinka paljon muutetaan.

Tehtava 2

Muodosta Muuta-aliohjelma niin, että tehtävä toimisi oikein

# AliohjelmaB

Samalla idealla kannattaisi toteuttaa myös Tuplaa aliohjelma ottamaan parametrina, kuinka paljon lukua kerrotaan. Hyvin usein ei edes laskutoimituksille tarvita omia aliohjelmia vaan aliohjelman vastuuna on hoitaa paljon isompia kokonaisuuksia.

Silmukat

Silmukoista monisteessa

C# ohjelmointikielessä on käytössä useita erilaisia silmukoita: for, while, do-while ja foreach. Yleisimmin käytetty silmukka lienee for-silmukka, jolla voit toistaa yhtä tai useampaa ohjelmakoodi riviä halutun määrän. Esimerkki for-silmukasta alla:

# silmukkaA2

Yllä olevassa esimerkissä on yksinkertainen silmukka, joka suoritetaan 5 kertaa. Yleensä for-silmukka alustetaan alkamaan 0:sta, kuten on esimerkissä kohdassa int i = 0.

Toinen asia for-silmukassa määrittää, kuinka pitkään silmukkaa suoritetaan. Esimerkissä ehto i < 5 käskee suorittamaan silmukkaa niin kauan kunnes silmukan kierrosluku on pienempää kuin 5. Tämä tarkoittaa, että silmukkaa suoritetaan kierrokset, joilla i saa arvon 0, 1, 2, 3 ja 4.

Viimeinen asia silmukan sulkujen sisällä on kierroksen lopussa tapahtuva asia. Hyvin usein perussilmukoissa kasvatetaan vain juoksevaa numeroa yhdellä isommaksi eli i++.

Tehtävä 1

Tee ohjelma, jossa silmukkaa käyttäen tulostetaan luvut 0-100, jokainen omalle rivilleen.

# silmukkaA

Tehtävä 2

Tee ohjelma, joka tulostaa luvut 1, 3, 5,..., 99, jokaisen omalle rivilleen.

# silmukkaB

Tehtävä 3

Tee ohjelma joka tulostaa luvut 1--100, ja jos luku on jaollinen 5:llä, tulosta luvun perään teksti "Hep!". Tulostuksen olla täsmälleen kuten mallisssa. Ota huomioon välit ja rivinvaihdon kohta.

1
2
3
4
5 Hep!
6
7
8
9
10 Hep!

Luvun jaollisuutta voi tarkastella esimerkiksi miettimällä, mikä luvun jakojäännös on.

C#:ssa jakojäännöksen kysyminen onnistuu %-merkillä. Esimerkiksi:

int jakojaannos = 7 % 2;
System.Console.WriteLine(jakojaannos); //Tulostaa 1
# silmukatC

Tehtävä 4

Tee ohjelma, joka tulostaa kaikki ne kokonaisluvut <= 1000, joiden neliöjuuri on kokonaisluku.

Asiaa voi miettiä myös vastakkaisesta suunnasta: mitkä kaikki luvut kuuluu tulostua.

# neliojuuret

Taulukot ja merkkijonot

Taulukoista luentomonisteessa

C#:ssa taulukkoja pystyy käsittelemään indeksien avulla kirjoittamalla taulukon nimen ja hakasulut:

taulukko[0]

Indeksointi alkaa 0:sta, eli ensimmäinen alkio taulukossa löytyy indeksistä 0 ja toinen alkio indeksistä 1 jne.

Merkkijonot toimivat hyvin samankaltaisesti C#:ssa kuin taulukot. Voit ottaa hakasuluilla ulos merkkijonosta kirjaimia esimerkiksi:

char merkki = merkkijono[0];
# silmukkaA

Yllä olevassa esimerkissä on otettu taulukosta yksittäinen alkio ulos ja tulostettu se. Seuraavaksi on tulostettu koko merkkijono ja tämän jälkeen tulostettu ensimmäinen kirjain merkkijonosta. Voit testata vaihtamalla indeksiä taulukon hakasuluista ja katsoa, miten tulostus muuttuu

Tehtävä 1

Muuta seuraavassa tehtävässä oleva merkkijono "Hello World!" tekstiksi "Hello Me!". Tehtävän voi ratkaista monella tavalla, koita saada ratkaistua se kaikilla tavoilla, jotka ovat kommentoituna tehtävässä.

# taulukonMuokkaus

Tehtävä 2

Tee funktio OnkoPalindromi, joka ottaa parametrina merkkijonon ja palauttaa totuusarvon, oliko annettu merkkijono palindromi. Palindromi on sana, joka on alusta loppuun ja lopusta alkuun luettaessa samanlainen.

# palindromi

Tehtävä 3

Anagrammilla tarkoitetaan sanan tai sanajoukon, kuten nimen, kirjainten uudelleen ryhmittelyä siten, että niistä muodostetaan yksi tai useampi uusi sana. Esimerkiksi sanan "vaali" eräs anagrammi on "laiva" (Wikipedia).

Tee funktio OnkoAnagrammi, joka palauttaa tiedon (true / false) siitä ovatko kaksi merkkijonoa anagrammeja keskenään. Funktiota voi kutsua esimerkiksi seuraavasti.

bool a1 = OnkoAnagrammi("Antti", "titnA"); // a1 == true
bool a2 = OnkoAnagrammi("Antti", "tianA"); // a2 == false

Jatkotehtävä: Muuta funktiota siten että kirjainkoolla ja välilyöntien määrällä ei ole väliä.

OnkoAnagrammi("Antti", "TITNA") === true
OnkoAnagrammi("anttijussi", "I Just stina") === true

Vinkki

Vinkki

# d8teht4a

Haastavampia tehtäviä

Tässä on Ohjelmointi 1-kurssilla haastavahkoina pidettyinä tehtäviä. Varsinkin aloittelijoille, tehtävissä voi vierähtää hetki aikaa.

G1

Tee ohjelmasta sellainen, että se piirtää viiden laatikon sijaan n laatikkoa, vieläpä siten, että laatikot pienenevät. Tällöin i:nnen laatikon koko tulisi olla

(n + 1 - i) / n * laatikonKoko

eli esimerkiksi jos halutaan piirtää yhteensä 10 laatikkoa, niin 7:nnen laatikon koko on

(10 + 1 - 7) / 10 = 4 / 10 * laatikonKoko

# g2portaat

G2

# g3suurempiJaParillinen

G3

Tee Anagrammi-tehtävä lineaarisessa ajassa (eli aikavaativuus O(n)).

# g4Anagrammi

These are the current permissions for this document; please modify if needed. You can always modify these permissions from the manage page.