Seppo Mustonen: Sukrojen ohjelmointi Survossa

7. Ehdolliset toiminnat

Ehdollisia toimintoja (if-lauseiden osalta) on jo käytetty aikaisemmissa kohdissa. Kuvaamme nyt if-rakennetta tarkemmin ja esittelemme myös switch-lauseen, jonka avulla saatetaan samanaikaisesti tarkastella monia vaihtoehtoja muistipaikan sisällön suhteen. Ehdollisia toimintoja täydentää vielä goto-käsky.
     Näissä kaikissa esiintyy viittauksia nimettyihin sukro-ohjelman kohtiin. Viitesanoina saa käyttää sekä kirjaimista että numeroista koostuvia merkkijonoja. Viitepaikat ovat ohjelman listauksessa aina kontrollimerkillä + varustettujen rivien alussa ja tätä paikkaa koskeva viitesana lopetetaan kaksoispisteeseen (:) ja välilyöntiin:

Esim. ohjelmanpätkä

 21 *{R}Tekstiä jae{goto ABC}
 22 *Tämä osa jää väliin.
 23 + ABC: ttuna kahteen osaan.
kirjoittaa kenttään "Tekstiä jaettuna kahteen osaan.". Huomaa, että viitesanan ABC perässä kaksoispisteen lisäksi yksi välilyönti kuuluu merkintään ja muu koodi (tässä teksti ttuna...) jatkuu vasta seuraavasta merkistä.

If-lause

Saatavilla on kaksi päämuotoa

    - if <ehto> then goto <viite>
    - if <ehto> then load <sukro> .
Siis jos <ehto> on voimassa, joko jatketaan samassa sukrossa kohdasta <viite> tai (jälkimmäisessä muodossa) jatketaan toisella sukrolla aivan kuin olisi annettu käsky {load <sukro>} . Jos <ehto> ei ole voimassa, jatketaan normaalisti sukro-ohjelman seuraavalla toiminnalla.
     Ehtoina saa käyttää yksinkertaisia sukromuistipaikkoja W1,W2,... ja vakioita vertaavia yhtälöitä tai epäyhtälöitä. Ehdot ovat joko numeerisia tai kirjaimellisia (eli merkkijonoja koskevia). Jälkimmäisessä tapauksessa ehtoa merkitsevä symboli (esim. =) kirjoitetaan yläpilkkujen väliin ('=').
     Olettakaamme, että muistipaikassa W1 on merkkijono 1.0 . Tällöin ehto W1 '=' 1.0 on tosi mutta ehto W1 '=' 1 ei ole tosi. Toisaalta sekä ehto W1 = 1.0 että W1 = 1 ovat tosia, koska numeerisesti merkkijonot 1.0 ja 1 tarkoittavat samaa lukua.
     Tämä poikkeuksellinen ehtojen merkintätapa johtuu siitä, että sukromuistissa muuttujat W1,W2,... eivät ole valmiiksi tyypitettyjä vaan sisältävät aina merkkijonoja, jotka tilanteesta riippuen tulkitaan joko luvuiksi tai merkkijonoiksi.
     Mahdolliset ehtosymbolit ovat =, <, <=, >, >= ja <> ja vastaavasti yläpilkuin varustettuina merkkijonojen vertaamisessa. Tällöin esim. W1 '<' W2 tarkoittaa, että W1:n sisältämä merkkijono on aakkosellisesti ennen W2:n sisältämää.

Ehdoissa esiintyvät vakiot kirjoitetaan sellaisenaan. Merkkijonovakioita ei saa pistää lainausmerkkeihin, elleivät ne kuulu vakioon. Pelkkä välilyönti merkitään ehdoissa {sp} ja tyhjä merkkijono {} . Jos esim. sukrokutsu edellyttää kolmea parametria, parametrilistan vaillinaisuus todetaan vaikkapa lauseella

    - if W3 '=' {} then goto Puute

Esimerkki 1:

Seuraava lajittelusukro näyttää erilaisia vertailutilanteita:
  44  1 SURVO 84C EDITOR Sat May 04 14:39:08 1991         C:\SUOPAS\ 120  80 0
  35 *
  36 *TUTSAVE LAJ1
  37 / def Wluku1=W1 Wluku2=W2 Wluku3=W3 Wapu=W4
  38 *{tempo -1}{init}{line start}{R}
  39 - if Wluku3 '<>' {} then goto A
  40 *{erase}{erase} /LAJ1 luku1,luku2,luku3{R}
  41 *{erase}{erase} tulostaa luvut suuruusjärjestyksessä seuraavalle rivil
  42 *le.{R}
  43 *{goto Loppu}
  44 + A:
  45 - if Wluku1 <= Wluku2 then goto B
  46 *{Wapu=Wluku1}{Wluku1=Wluku2}{Wluku2=Wapu}
  47 + B:
  48 - if Wluku2 <= Wluku3 then goto C
  49 *{Wapu=Wluku2}{Wluku2=Wluku3}{Wluku3=Wapu}
  50 + C:
  51 - if Wluku1 <= Wluku2 then goto D
  52 *{Wapu=Wluku1}{Wluku1=Wluku2}{Wluku2=Wapu}
  53 + D: {erase}{erase}Luvut suuruusjärjestyksessä: {print Wluku1} {}
  54 *{print Wluku2} {print Wluku3}
  55 + Loppu: {tempo +1}{end}
  56 *
  57 */LAJ1 14.3 -5.5 12.8
  58 *Luvut suuruusjärjestyksessä: -5.5 12.8 14.3_
  59 *

Mitään yleisiä lajitteluohjelmia ei tietenkään kannata kirjoittaa pelkällä sukrokielellä. Jos lajittelua tarvitaan, sukro tekee sen aktivoimalla joko SORT-komennon, kun tiedot ovat toimituskentässä, tai FILE SORT -operaation, kun tiedot ovat havaintotiedostossa.

Esimerkki 2:

Teemme sukron, joka laskee komentorivin alla olevien rivien määrään ensimmäiseen tyhjään riviin asti. Sukron tulee huomata myös se tilanne, että tyhjiä rivejä ei ole lainkaan ennen kentän loppua.
  15  1 SURVO 84C EDITOR Sun May 05 10:33:38 1991         C:\SUOPAS\ 120  80 0
  61 *
  62 *TUTSAVE RIVIT1_
  63 / def Wkoko=W1    Rivejä toimituskentässä
  64 / def Wrivejä=W2  Rivejä ennen ensimmäistä tyhjää riviä
  65 / def Wrivi=W3 Wsar=W4
  66 / def Wteksti=W5
  67 *{tempo -1}{init}
  68 / Siirrytään komentorivin alkuun ja pannaan paikka muistiin:
  69 *{line start}{ref}
  70 / Todetaan kentän koko rivimäärä Wkoko ja nollataan rivilaskuri Wrivejä:
  71 *{save dim Wkoko,Wsar}{Wrivejä=0}
  72 / Siirrytään seuraavan rivin alkuun ja talletetaan se:
  73 + A: {R}{save line Wteksti}
  74 / Jos rivi on tyhjä, mennään kohtaan L:
  75 - if Wteksti '=' {} then goto L
  76 / Rivi ei ollut tyhjä. Kasvatetaan rivilukua:
  77 *{Wrivejä=Wrivejä+1}
  78 / Talletetaan kohdistimen paikka. Ellei viimeinen rivi, palataan alkuun:
  79 *{save cursor Wrivi,Wsar}
  80 - if Wrivi < Wkoko then goto A
  81 / Löytynyt tyhjä rivi tai kentän loppu. Palataan komentorivin alkuun:
  82 + L: {ref}{ref}
  83 / Kirjoitetaan laskettu rivimäärä komentorivin loppuun:
  84 *{line end}  Rivien lukumäärä on {print Wrivejä}.
  85 *{tempo +1}{end}
  86 *

Jos sukro RIVIT1 aktivoidaan tämän listauksen yläpuolella, rivillä 61, samalle riville ilmestyy vastaus

  61 */RIVIT1 Rivien lukumäärä on 24.
sillä tässä tapauksessa ensimmäinen tyhjä rivi on 86.

Switch-lause

Tällä lauseella saadaan sukro haarautumaan samanaikaisesti useilla tavoilla annetun muistipaikan sisällön perusteella.
     On selvintä näyttää esimerkillä, mistä switch-lauseessa on kysymys. Rakennamme sukron VIIKONP, joka kertoo toimituskentän seuraavalla rivillä nykyisen viikonpäivän muodossa "Tänään on sunnuntai.". Toiminta perustuu Survon komentoon TIME, joka antaa päiväyksen ja kellonajan yhteydessä viikonpäivän englanninkielisiä lyhenteitä Sun, Mon, Tue jne. käyttäen.
  16  1 SURVO 84C EDITOR Sun May 05 14:31:25 1991         D:\SUOPAS\ 120  80 0
   1 *
   2 *TUTSAVE VIIKONP
   3 *{tempo -1}{init}
   4 / Siirrytään seuraavan rivin alkuun ja tyhjennetään se:
   5 *{R}{line start}{erase}{erase}
   6 / Aktivoidaan TIME-komento. Siirretään kohdistinta pykälä oikealle:
   7 *TIME{act}{r}
   8 / Rivillä näkyy esim. *TIME Sun May 05 14:30:28 1991
   9 / Poimitaan viikonpäivää osoittava merkintä muistipaikkaan W1:
  10 *{save word W1}
  11 / Tyhjennetään rivi ja kirjoitetaan vastauksen alku:
  12 *{line start}{erase}Tänään on
  13 /
  14 / Valitaan switch-lauseella W1:n sisällön mukaan:
  15 - switch W1
  16 -   case Sun: goto Sun
  17 -   case Mon: goto Mon
  18 -   case Tue: goto Tue
  19 -   case Wed: goto Wed
  20 -   case Thu: goto Thu
  21 -   case Fri: goto Fri
  22 -   case Sat: goto Sat
  23 -   default: continue
  24 /
  25 / switch-lause johtaa aina johonkin seuraavista:
  26 + Sun:  sunnuntai{goto L}
  27 + Mon:  maanantai{goto L}
  28 + Tue:  tiistai{goto L}
  29 + Wed:  keskiviikko{goto L}
  30 + Thu:  torstai{goto L}
  31 + Fri:  perjantai{goto L}
  32 + Sat:  lauantai
  33 / Päätetään vastauslause pisteellä:
  34 + L: .{tempo +1}{end}
  35 *

switch-lauseessa, joka on ohjelmassa riveillä 15-23, verrataan switch-rivillä mainitun muistipaikan (W1) sisältöä vuorollaan kuhunkin case-rivillä olevaan kaksoispisteeseen päättyvään vakiosanaan. Jos jokin vaihtoehto täsmää, siirrytään ohjelmassa kohtaan, jonka ao. case-rivi määrää goto-käskyllä. Jos mikään tarjotuista vaihtoehdoista ei päde, noudatetaan viimeisenä olevan default-rivin (23) määräystä. Käsky continue tarkoittaa aina, että jatketaan suoraan. Tässä tapauksessa default-rivin olisi voinut jättää kokonaan pois.
     case-riveillä saa goto-käskyn asemasta olla joko load <sukro> -käsky tai pelkkä continue .

Sukrojen ohjelmointi Survossa - Seppo Mustonen 1991
  1. Johdanto
  2. Esimerkki
  3. Sukrokielen koodisanoja
  4. Sukromuisti
  5. Hapuilukoodit, tulostus ja kohdistimen liikuttelu
  6. Sukrojen aloittaminen ja kytkeminen toisiinsa
  7. Ehdolliset toiminnat
  8. Käyttäjän vuorovaikutus
  9. Aritmetiikka ja muistin välitön hallinta
  10. Sukrotiedostot
  11. Sukrojen lajit
  12. Sukrojen laatiminen käytännössä
  13. Virhetilanteet
  14. Näytesovelluksia
Liite: Sukrokielen koodisanat