Liukuhihna

Olkoon käytössä väsymätön robotti, jonka tehtävänä on käsitellä liukuhihnalla sille syötettäviä kokonaislukuja. Robotti ottaa vastaan luvun, käsittelee sen annetulla ohjeella, ja siirtää käsitellyn luvun valmiiden lukujen liukuhihnalle. Nimitetään sisääntulevien lukujen hihnaa input-hihnaksi ja valmiiden lukujen output-hihnaksi. Robotille voi antaa ohjeita seuraavien komentojen avulla:

Ohje koostuu robotille annettavasta suoritettavien komentojen sarjasta ja voi sisältää useita komentoja. Komennot suoritetaan yksi kerrallaan, ja robotilla voi olla kädessä vain yksi luku kerrallaan. Robotin työsuoritus päättyy, kun kumpi tahansa seuraavista ehdoista täyttyy: (a) ohjeessa ei ole enää suoritettavia komentoja, tai (b) input-hihnalla ei ole enää lukuja yritettäessä suorittaa INPUT-komentoa.

Esimerkiksi, jos input-hihnalle tulisivat luvut 1, 3 ja 7 (joista luku 1 tulee ensimmäisenä käsittelyvuoroon), niin seuraava ohje siirtäisi ne output-hihnalle. Kuvat 1 ja 2 havainnollistavat esimerkin robotin toimintaa.

INPUT
OUTPUT
INPUT
OUTPUT
INPUT
OUTPUT
Kuva 1: Ohjeen alkutilassa input-hihnalla ovat luvut 1, 3 ja 7.
Kuva 1: Ohjeen alkutilassa input-hihnalla ovat luvut 1, 3 ja 7.



Kuva 2: Ohjeen viimeisessä OUTPUT-komennossa luku 7 on käsiteltävänä.
Kuva 2: Ohjeen viimeisessä OUTPUT-komennossa luku 7 on käsiteltävänä.




Jotta robottia voidaan käyttää erilaisiin tehtäviin, sisällytetään robotin tunnistamiin komentoihin seuraavassa taulukossa esitellyt komennot. Lisäksi robotilla on käytettävissä 16 muistipaikkaa lukujen ja niistä laskettujen välitulosten varastointia varten. Muistipaikat on nimetty kokonaisluvulla nollasta alkaen, joten muistipaikkojen nimet ovat 0, 1, 2, 3, ... , 15.

Esimerkit

Esimerkki 1. Tehdään ohje, joka siirtää input-hihnalta output-hihnalle vain nollasta eroavat luvut. Ohjeen vieressä on ohjeen toimintaa kuvaava selitys.

Alku:              // Määritellään kohta "Alku".
INPUT              // Otetaan luku input -hihnalta.
JUMPIFZERO(Alku)   // Jos luku on 0, hypätään kohtaan "Alku".
OUTPUT             // Siirretään luku output -hihnalle.
JUMP(Alku)         // Siirrytään kohtaan "Alku".

Jos input-hihnalla olisivat esimerkiksi luvut

1, 0, 7, 9, 0, 4

olisi output-hihna ohjeen suorittamisen jälkeen:

1, 7, 9, 4

Kokeile robotilla


Esimerkki 2. Tehdään ohje, joka ottaa input-hihnalta ensimmäiset kaksi lukua ja siirtää ne output-hihnalle käänteisessä järjestyksessä. Ohjeen komentoja toistetaan niin kauan kuin input-hihnalla on lukuja. Lukuja oletetaan olevan parillinen määrä. Ohjeen vieressä on ohjeen toimintaa kuvaava selitys.

Alku:		 // Määritellään kohta "Alku".
INPUT		 // Otetaan luku input -hihnalta.
COPYTO(0)	 // Kopioidaan luku muistipaikkaan 0.
INPUT		 // Otetaan luku input -hihnalta.
OUTPUT		 // Siirretään luku output -hihnalle.
COPYFROM(0)	 // Kopioidaan muistipaikan 0 sisältö.
OUTPUT		 // Siirretään luku output -hihnalle
JUMP(Alku)	 // Siirrytään kohtaan "Alku".

Jos input-hihnalla olisivat esimerkiksi luvut

1, 0, 7, 9, 0, 4

olisi output-hihna ohjeen suorittamisen jälkeen:

0, 1, 9, 7, 4, 0

Kokeile robotilla

Huomautuksia

  • Jos INPUT-komentoa suoritettaessa robotin kädessä on jo jokin luku, niin kyseinen luku häviää.
  • OUTPUT-komennon antamisen jälkeen robotin kädessä ei ole mitään lukua.
  • Output-hihna on aina tyhjä ennen ohjeen suorittamista. Vastaavasti muistipaikat ovat tyhjiä, ellei kysymyksessä muuta ole sanottu.
  • Kysymyksissä 2.3–2.10 edellytetään, että ohjeen suorittamisen jälkeen input-hihnalle ei jää lukuja
  • tehtävän tekemisessä kynä ja paperia on välttämätöntä
  • muistipaikan käyttäminen (lukeminen) ei hävitä se arvoa
  • voit kommentoida koodirivejä // -merkeillä

Kysymykset

Kysymys 1.

Input-hihnalla ovat seuraavat luvut:

1, 2, 3, 4, 5, 6

Miltä output-hihna näyttää, kun luvut käsitellään alla olevalla ohjeella? (0.1 p.)

Kirjoita vastaus yhdelle riville, luvut pilkulla eroteltuina.

Alku:
INPUT
INPUT
OUTPUT
JUMP(Alku)
# k21

Kysymys 2.

Input-hihnalla ovat seuraavat luvut:

8, 3, 5, 0, 0, 6

Muistipaikassa 0 on valmiina luku 1. Miltä output-hihna näyttää, kun luvut käsitellään alla olevalla ohjeella? (0.1 p.)

Alku:
INPUT
ADD(0)
OUTPUT
INPUT
SUB(0)
JUMPIFNEG(VainNeg)
JUMP(Alku)
VainNeg:
OUTPUT
JUMP(Alku)
# k22

Kysymys 3.

Tätä robottia voit käyttää kokeiluihin eri tehtävissä. Liukuhihnan sisältö ei välttämättä vastaa tehtävän liukuhihnaa.

Robotti kokeiluja varten

# k3

Kysymys 4.

# k4

Kysymys 5.

# k5

Kysymys 6.

# k6

miten tää pitäs mennä?

VL: pitää laittaa enemmän jemmaan noita etteivät huku

03 Sep 24 (edited 03 Sep 24)

Kysymys 7.

# k7

Kysymys 8.

# k8

Kysymys 9.

Robotti harjoittelua varten

Haaste: Toistaiseksi lyhin vastaus on 13 riviä.

Sain 13 rivillä :3

Hienoa! Muokkasin ennätystä. -AJL

09 Sep 24 (edited 10 Sep 24)
# k9

Kysymys 10.

Haaste: Toistaiseksi lyhin vastaus on 15 riviä.

# k10

Tehtävänannossa määritellään muistipaikka 0 sisältämään luvun 0. Muistipaikkaa 0 ei mallivastauksessa kuitenkaan käytetä kertaakaan, vaan otetaan turhaan lisää muistia muistipaikasta 4. Lisäksi Rivillä 11 käskyn ADD (4) käyttö voi pahimmillaan opettaa tekijöitä viittaamaan ohjelman ulkopuolella olevaan muistiin, jota ei ole aluksi määritelty.

VL: Vaihdoin tuon mallin käyttämään 0-paikkaa eikä 4-paikkaa. Kuka lie tehnyt...

Saan ratkaisullani luvuille 0, 99 ja 0,0 tarkastuskoneesta seuraavan virheen: 7: 0 99 -> 0. Virhe! Input-hihna ei ole tyhjä: 99! tarkastuskone selvästikin haluaa, että molemmat luvut käsitellään, mikä on turhaa jos ensimmäinen luku oli 0.

VL: Huomasitko että tuolla ennen kysymyksiä olevassa huomautuksessa sanotaan että tietyissä tehtävissä input-hihnalle EI SAA jäädä lukuja.

Korjailin tehtävää ja se antaa vielä virheen: "7: 0 99 -> 0. Virhe! Output-hihnalle tuli: 0 0!" voisitko kertoa, mikä vielä menee pieleen?

VL: Jos liukuhihnalla on 0 ja 99, niin Outputtiin tulee sulla kaksi 0:aa vaikka saisi tulla vain yksi. Itse asiassa 0 ja mikä luku tahansa sulla käy noin. Kokeile vaikka siellä 9. kohdassa olevalla "Robotti harjoittelua varten". Kun laittaa ruksi TextMode, voi copy pasteta tuon ohjelman sinne.

Auttaisitko ymmärtämään miksi tulee kaksi nollaa? Kun testaan numeroilla 0 ja 99 niin seuraavat rivit mielestäni ajetaan: INPUT COPYTO(2) JUMPIFZERO(Loppu1) INPUT COPYFROM(0) OUTPUT

VL: Kyllä mää kun ajoin tuolla 9-kohdan Robotti harjoittelua varten, niin käskyt olivat: INPUT, COPYTO(2),JMPIFNEG,JMPIFZERO(Loppu1),Loppu1:,INPUT,COPYFROM(0),OUTPUT,Loppu2:,COPYFROM(0),OUTPUT,//end

15 Sep 24 (edited 30 Sep 24)

Mallivastaus

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