Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointiputka: Uuden tehtäväsarjan suunnittelu

Sivun loppuun

Metabolix [28.01.2021 00:40:05]

#

Ohjelmointiputkaan on tarkoitus tehdä monipuolinen tehtäväsarja ohjelmoinnin harjoittelua varten. Tehtävät lähtevät alkeista mutta etenevät myös vaikeisiin algoritmeihin. Tehtävissä opetetaan samalla ratkaisuun tarvittavia asioita eli käytännössä kerrotaan, millä algoritmilla tehtävä pitäisi ratkaista ja miten algoritmi pääpiirteittäin toteutetaan. Toki joukkoon voidaan tehdä myös vaikeita tehtäviä, joissa pitää osata itse soveltaa opittuja asioita.

Tehtävät mitoitetaan niin, että hyvin tehtynä ratkaisun laskeminen vie selvästi alle sekunnin tavallisella tietokoneella. Tehtävät ratkaistaan omalla koneella, ja tehtäväsarja sopii eri kielille. Ratkaisu tarkistetaan siten, että tehtäväsivun antamaan satunnaiseen syötteeseen pitää lähettää oikea vastaus minuutin kuluessa.

Tehtävän syötteenä ja tuloksena on vain yksi luku, mutta ensimmäisessä tehtävässä toteutetaan satunnaislukugeneraattori (LCG), jolla voidaan tuottaa lisää lukuja. Tehtäviin tulee siis yleensä kaksi osaa: ensin varsinaisen syötteen generointi täsmällisen ohjeen mukaan ja sitten pyydetyn asian laskeminen.

Vaikka tehtävän muoto kuulostaa melko rajoittuneelta, sillä voi simuloida monenlaisia asioita. Tässä on muutamia ideoita:

Alkeet: Arvotaan sata lukua taulukkoon ja harjoitellaan esimerkiksi järjestämistä, etsimistä, summaa, keskiarvoa ym.

Geometria: Arvotaan jotain muotoja ja lasketaan näistä asioita, vastaukseksi esimerkiksi leikkauskohtien lukumäärä. Ensin voisi olla tehtäviä, joissa on vain yhdenlaisia muotoja (viiva, ympyrä, suorakulmio), ja sitten näitä voisi alkaa yhdistellä.

Käyttöliittymä: Määrätään muutaman napin paikka ja näiden vaikutukset käyttöliittymään, arvotaan sitten syötettä (klikkauksia tms.) ja katsotaan, missä tilassa käyttöliittymä on lopuksi.

Algoritmit (reitinhaku ym.): Arvottu syöte sopii erinomaisesti, ja monesta algoritmitehtävästä saadaan luontevasti tulokseksi luku.

Olisiko täällä kiinnostuneita keksimään tehtäviä ja niiden ratkaisuja? Koska nämä tehtävät ovat todellakin harjoitustehtäviä eivätkä mitään kilpailua, tehtävien ei tarvitse olla ihmeellisiä vaan selviä ja yksiselitteisiä.

Myös nimeä tehtäväsarjalle voi ehdottaa.

Jaska [28.01.2021 11:26:38]

#

Tehtävien harjoittelu on mukavaa, jos löytyy aikaa. Toivottavasti tehtävät toteutetaan siten, että vihjeitä ei näe heti kun katsoo tehtävää vaan vinkit voi katsoa sitten kun omia ratkaisuideoita ei enää keksi.

carabia [17.02.2021 17:18:24]

#

nekrotetaan ketjua; tuota käyttöliittymäideaa vois ehkä jatkojalostaa jonkunsortin simppelin ISAn tutkiskeluun. muutama käsky ja rekisteri, kenties.

Grez [17.02.2021 17:57:52]

#

carabia kirjoitti:

simppelin ISAn tutkiskeluun

ISA tässä yhteydessä tarkoittanee Instruction Set Architecture

Metabolix [27.05.2021 19:56:42]

#

Kommentteja ja ideoita saa edelleen esittää. On ollut tässä kaikenlaista kiirettä, mutta jospa nyt alkukesästä saisin tehtäväsarjaa edistettyä.

Tehtävissä tuntuu olevan yksi ongelma: niistä tulee helposti joko liian monimutkaisia tai hieman tylsästi samanlaisia keskenään. Jos samaan tehtävään laittaa monta asiaa, se paisuu heti valtavaksi ja siitä tulee ainakin aloittelijalle vaikea hahmottaa. Toisaalta jos joka asiasta tekee erillisen tehtävän, tulee (ainakin alkuun) paljon lähes samanlaisia tehtäviä, joissa pahimmillaan voi olla sama runko mutta muutaman rivin muutos; esimerkkinä alkeisiin sopivat tehtävät peruslaskutoimituksista, jakojäännöksestä, bittioperaatioista, taulukon summasta, keskiarvosta jne.

Pohdinnan päätteeksi tuntuu, että usean pienen tehtävän tekeminen olisi näistä parempi vaihtoehto. Silloin tehtävät olisivat aloittelijalle selvempiä. Tässähän ei ole mikään kilpailu kyseessä, joten tylsät tehtävät voi jättää väliin.

Olen hahmotellut alkuun mm. tällaisia tehtäviä:

Perusohjelmointia:
– Perusoperaatiot +-*/%, bittioperaatiot, 32-bittinen kokonaisluku. (5 kpl)
– Taulukon pienin, suurin, summa, keskiarvo, ehkä jotain hajontalukuja. (5 kpl)
– Taulukon järjestäminen muutamalla eri algoritmilla. (3 kpl)
– Taulukon sekoitus. (1–2 kpl)
– Tietorakenteet: pino, jono, keko, binääripuu.
– Laskulausekkeen laskenta (omat operaatiot, ettei ratkea evalilla).
– Satunnainen koodinpätkä, jäsennys ja suoritus.
– Hakualgoritmit: syvyys, leveys, Dijkstra.
– Kisakoodarin käsikirjan aihepiirit algoritmeista.

Geometriaa:
– Piste suorakulmiossa, montako arvottua pistettä osuu sisään?
– Suorakulmiot 1, leikkaavan pinta-alan summa.
– Suorakulmiot 2, montako erilaista suorakulmiota muodostuu?
– Ympyröiden leikkaus.
– Ympyrän ja janan leikkaus, 0–2 leikkauspistettä.
– Janojen leikkaus, montako leikkauspistettä on joukossa?
– Piste kolmiossa, pinta-alan määritys Monte carlo -menetelmällä.
– Kolmioiden leikkaus.
– Suorien leikkaus, mitä kulmioita joukosta muodostuu?
– Trigonometriaa, vektoreita, törmäykset, etupuolella/takapuolella.

Jaska kirjoitti:

Toivottavasti tehtävät toteutetaan siten, että vihjeitä ei näe heti kun katsoo tehtävää vaan vinkit voi katsoa sitten kun omia ratkaisuideoita ei enää keksi.

Ajatuksena on, että perustehtävissä nimenomaan opetetaan tietty asia eli selostetaan algoritmin toiminta tarkalleen, jotta tehtävän voi tehdä sillä tiedolla. Vaikeampiin tehtäviin voi tulla enemmän soveltamista, kuitenkin yleensä sillä tavalla, että edellisten tehtävien tiedoilla ratkaisun pitäisi onnistua. Tietysti opetustehtävien lisäksi voidaan tehdä mitä tahansa lisähaasteita.

Vanutyyny [28.05.2021 20:13:14]

#

Ihanaa, kun jaksat tehdä tällaista. Laitoin sivun jo suosikkeihin. Löytyy todella paljon tarpeellista juttua ja selvästi ja helposti.

Mä en osaa varmaan tehdä vielä tehtäviä, mutta ehkä voin antaa ideoita alkeisiin?

Miten olis joku tämmöinen:

Luku1 = input("Syötä Luku 1: ");
Luku2 = input("Syötä Luku 2: ");
Numero1 = input("Syötä Numero 1: ");
Numero2 = input("Syötä Numero 2: ");

Luku1 = float (Luku1);
Luku2 = float (Luku2);
Numero1 = int (Numero1);
Numero2 = int (Numero2);

if Luku1 + Luku2 >= 10
 print("Mennään suurilla luvuilla")

if Luku1 & Numero1 > Luku1
 print("Hähää")
 # Ja tässä kysymys, että miksei onnistu ja miten meinasit korjata :)

Tai no, tossahan toi tehtävä nyt melkein olikin! Vastaus puuttuu, mut se ny vaan johtuu siitä, etten tiedä vielä. Luulen, et se ei anna tota & merkkiä floateille, ainoastaan inteille.
Mut sit floatin kans menikin and ... im confused.

Metabolix [28.05.2021 21:16:17]

#

Vanutyyny kirjoitti:

Miten olis joku tämmöinen

Kuten kirjoitin, tehtävät sopivat eri kielille ja tarkistetaan automaattisesti. Silloin ei ole mahdollista tehdä tehtävää siitä, miksi jokin koodi ei toimi, eikä muitakaan sanallisesti vastattavia kysymyksiä. Kaikki tehtävät ovat pohjimmiltaan muotoa "laske näistä luvuista tämä asia".

Hyvä kuitenkin, että muistutit if-lauseesta ja vertailuista. Jokin tehtävä niihin liittyen pitää keksiä jo alkeisiin, vaikka tietysti ehtoja joutuu käyttämään muissakin tehtävissä.

Antti Laaksonen [29.05.2021 13:30:30]

#

Tehtäväsarjan tekeminen on hyvä idea, mutta tällä hetkellä minulle ei ole selvää, mikä on tämän tehtäväsarjan kohderyhmä ja miten tämä eroaa oleellisesti jo olemassa olevista tehtäväkokoelmista.

Erityisesti algoritmien ja tietorakenteiden alkeista on paljon materiaalia, joten en ole varma, onko hyvä tehdä vielä yhtä tehtäväsarjaa näistä aiheista.

Metabolix kirjoitti:

Tehtävän syötteenä ja tuloksena on vain yksi luku, mutta ensimmäisessä tehtävässä toteutetaan satunnaislukugeneraattori (LCG), jolla voidaan tuottaa lisää lukuja

Tämä tuntuu aloittelijalle hankalalta tavalta. Voisiko syötteenä olla yhden luvun sijasta enemmän dataa (esim. koko listan sisältö)?

Metabolix kirjoitti:

– Taulukon järjestäminen muutamalla eri algoritmilla. (3 kpl)

Mikä on tällaisen tehtävän vastaus ja miten varmistetaan, että on käytetty oikeaa algoritmia?

Metabolix [29.05.2021 16:19:35]

#

Antti Laaksonen kirjoitti:

mikä on tämän tehtäväsarjan kohderyhmä ja miten tämä eroaa oleellisesti jo olemassa olevista tehtäväkokoelmista.

Olennaiset piirteet ovat suomen kieli, riippumattomuus ohjelmointikielestä ja enemmän mekaaniseen toteuttamiseen keskittyvät tehtävät.

Sarja lähtee alkeista, eli esimerkiksi Vanutyyny yllä voisi kuulua kohderyhmään. Kuitenkin erityisiä aiheita käsittelevät tehtävät sopivat myös muille, esimerkiksi geometria voi olla vieras aihe, vaikka osaisi muuten ohjelmoida hyvin.

Sarja on kielestä riippumaton tekemällä oppimisen sarja, jossa ideaalitilanteessa seuraava ratkaisu tulee kohtalaisen pienillä muutoksilla edellisistä. Se siis sopii alkeiden osalta kielikurssien täydennykseksi, ja muut aiheet voidaan valita, miten halutaan. Mielestäni tärkeintä olisi tehdä ensin alkeet, jolloin näkisi, miten sarja toimii käytännössä ja miten sitä kannattaa jatkaa.

Vertailuna: Monet muut tehtävät vaativat joko oivaltamista (Putkaposti) tai erillisen materiaalin tarkkaa lukemista (Datatähti-harjoitukset). Monissa tehtävissä yhteys käytännön tilanteisiin jää epäselväksi (esim. PHP-haasteen lukuspiraalit, harvemmin PHP-koodaria koskettava ongelma). Kielten omat tehtäväsarjat usein painottavat juuri kyseisen kielen rakenteita (juuri tietyt luokat ja funktiot).

Myös mahdollisia tulevia oppaita ajatellen kannattaisi olla yleispätevät alkeistehtävät, ettei joka kielelle tarvitse alusta asti uutta.

Antti Laaksonen kirjoitti:

Metabolix kirjoitti:

Tehtävän syötteenä ja tuloksena on vain yksi luku, mutta ensimmäisessä tehtävässä toteutetaan satunnaislukugeneraattori (LCG), jolla voidaan tuottaa lisää lukuja

Tämä tuntuu aloittelijalle hankalalta tavalta.

Uskon, että siitä selvittäisiin. Valmiin syötteen joutuisi pian laittamaan tiedostoksi, eli ei sekään ole ongelmaton vaihtoehto.

Antti Laaksonen kirjoitti:

Metabolix kirjoitti:

– Taulukon järjestäminen muutamalla eri algoritmilla. (3 kpl)

Mikä on tällaisen tehtävän vastaus ja miten varmistetaan, että on käytetty oikeaa algoritmia?

Tehtävässä voisi esimerkiksi laskea, montako vertailua tai sijoitusta tms. joutuu tekemään.

Antti Laaksonen [29.05.2021 16:45:54]

#

Metabolix kirjoitti:

Mielestäni tärkeintä olisi tehdä ensin alkeet, jolloin näkisi, miten sarja toimii käytännössä ja miten sitä kannattaa jatkaa.

Tämä on hyvä tapa testata tehtäväsarjan toimivuutta.

Metabolix kirjoitti:

Monissa tehtävissä yhteys käytännön tilanteisiin jää epäselväksi (esim. PHP-haasteen lukuspiraalit, harvemmin PHP-koodaria koskettava ongelma).

Käytännönläheisyys on hyvä tavoite, mutta en ole varma, toteutuuko se monissa noissa tehtävissä. Esimerkiksi lähes koskaan nykyään ei pitäisi koodata omaa järjestämisalgorimia vaan käyttää kielen valmista toteutusta.

Metabolix [29.05.2021 23:15:10]

#

Antti Laaksonen kirjoitti:

Käytännönläheisyys on hyvä tavoite, mutta en ole varma, toteutuuko se monissa noissa tehtävissä. Esimerkiksi lähes koskaan nykyään ei pitäisi koodata omaa järjestämisalgorimia vaan käyttää kielen valmista toteutusta.

Totta sinänsä. Valmiita ratkaisuja löytyy melkein mihin vain. Tarkoitan käytännönläheisyydellä kuitenkin sitä, että tehtävän algoritmille on jokin selvä käyttökohde. Vaikkapa järjestämisen tarve on arkielämässäkin selvä ja geometriaa voi käyttää pelien tekemiseen. Tarvittaessa tehtävät voidaan myös muotoilla sitä kautta. Sen sijaan itse en muista yhtään tilannetta, jossa olisin tarvinnut vaikka PHP-haasteen lukuspiraalia.

Aloittelijat, esim. Vanutyyny! Onnistuuko seuraavan tehtävänannon toteuttaminen: ”Eräässä satunnaislukugeneraattorissa jatketaan lukujonoa niin, että edellinen luku sijoitetaan kaavaan: luku * 1737 mod 1234577. (Kaavassa mod tarkoittaa jakojäännöstä, monissa ohjelmointikielissä käytetään %-merkkiä. Jakojäännös on se osa luvusta, joka ei mene jakolaskussa tasan: esimerkiksi laskun 11 / 4 tulos on 2 jää 3, eli jakojäännös 11 mod 4 on 3.) Esimerkiksi lähtöarvolla 1 generaattorin ensimmäiset luvut ovat 1737, 548015, 43188 ja 942936. Mitkä ovat generaattorin neljä ensimmäistä lukua, jos lähtöarvo on 2?”

Vanutyyny [31.05.2021 14:32:17]

#

Metabolix kirjoitti:

Antti Laaksonen kirjoitti:

Käytännönläheisyys on hyvä tavoite, mutta en ole varma, toteutuuko se monissa noissa tehtävissä. Esimerkiksi lähes koskaan nykyään ei pitäisi koodata omaa järjestämisalgorimia vaan käyttää kielen valmista toteutusta.

Aloittelijat, esim. Vanutyyny! Onnistuuko seuraavan tehtävänannon toteuttaminen: ”Eräässä satunnaislukugeneraattorissa jatketaan lukujonoa niin, että edellinen luku sijoitetaan kaavaan: luku * 1737 mod 1234577. (Kaavassa mod tarkoittaa jakojäännöstä, monissa ohjelmointikielissä käytetään %-merkkiä. Jakojäännös on se osa luvusta, joka ei mene jakolaskussa tasan: esimerkiksi laskun 11 / 4 tulos on 2 jää 3, eli jakojäännös 11 mod 4 on 3.) Esimerkiksi lähtöarvolla 1 generaattorin ensimmäiset luvut ovat 1737, 548015, 43188 ja 942936. Mitkä ovat generaattorin neljä ensimmäistä lukua, jos lähtöarvo on 2?”

Ei ole huono idea lisätä tehtäväsarjoja. Toistolla oppii, kerrasta ainakaan minä en:D Unohdin salasananikin eilen, nyt on uus nikki, terveisin entinen vanutyyny.

Tässä ilmeisesti lähtöarvo tarkoittaa 2:sta, eli kaavaan sijoitettaisiin
2 * 1737....
En tiedä, onnistuisiko, en löytänyt vielä topiccia aiheelle oppaista.
Mä tekisin ton nyt niin, et
luku1= input("Syötä luku ")
print (toi laskutoimitus..) Täytynee katsoa vielä sieltä keskeytyksistä, kuinka monta arvoa haluaa tulostettavan, et ei mee koko päivää.

Metabolix [31.05.2021 20:33:48]

#

Vanutyyny kirjoitti:

Unohdin salasananikin eilen, nyt on uus nikki, terveisin entinen vanutyyny.

Asia korjattu!

Vanutyyny kirjoitti:

En tiedä, onnistuisiko, en löytänyt vielä topiccia aiheelle oppaista.

Antti on varmaan oikeassa, että tarvitaan alkuun jotain vielä yksinkertaisempaa. Toisaalta lukujen generointi ei varmaan ole ainoa ongelma, vaan ei taitaisi onnistua muutenkaan listaa käsittelevä tehtävä.

Vanutyyny [01.06.2021 09:49:41]

#

Metabolix kirjoitti:

(31.05.2021 20:33:48): ”– –” Asia korjattu! ”– –” Antti on varmaan...

Voisko ton generoinnin ja listan tehtävän kääntää toisinpäin. Eli tehtävänanto olis "Pyydä käyttäjältä luku, sijoita se kaavaan xxx, palauta arvot neljästä ensimmäisestä luvusta. (ja mitä muuta niille pitää tehdä ..?) Tällä tavalla luot satunnaislukugeneraattorin ja listan.."
Mut en todellakaan ole vastaan sitä, että yksinkertaisia harjoituksia. Joskus näissä tehtäväsarjoissa käsitellään yksinkertaisia juttuja, kuten tota printtaamista ja yhtäkkiä hypätään johonkin tosi syvälle, ilman sen kummempaa toistoa helpommissa asioissa.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta