Kirjoittaja: Antti Laaksonen
Kirjoitettu: 27.01.2008 – 27.01.2008
Tagit: koodi näytille, vinkki
Tässä on QBasic-ohjelma, joka lukee käyttäjältä sanoja ja tulostaa jokaisen sanan niin, että sanan kirjaimet ovat satunnaisessa järjestyksessä. Esimerkiksi jos käyttäjä kirjoittaa sanan "putka", ohjelma voi tulostaa "ktapu", "aputk", "ptkau" tai 117 muuta merkkijonoa.
Ohjelman hienous on siinä, että käyttäjän ei ole pakko kirjoittaa sanoja käsin, vaan ohjelman syötteeksi voi ohjata tiedoston käynnistämällä ohjelma komentoriviltä näin:
C:\QB>SEKOITUS < TESTI.TXT
Lisäksi ohjelman kääntämiä sanoja ei tarvitse katsella näytöllä, vaan ohjelman tulostuksen voi ohjata tiedostoon käynnistämällä ohjelma komentoriviltä näin:
C:\QB>SEKOITUS > UUSI.TXT
Nämä ohjaukset on myös mahdollista yhdistää. Lopputulos on, että sanat luetaan tiedostosta TESTI.TXT ja käännetyt sanat kirjoitetaan tiedostoon UUSI.TXT. Käyttäjältä ei kysytä mitään eikä myöskään näytölle tulosteta mitään.
C:\QB>SEKOITUS < TESTI.TXT > UUSI.TXT
Ohjelmoijan on varsin helppoa ottaa huomioon tällaiset ohjaukset. Nimittäin jos koodissa on käyttänyt QBasicin tavallisia komentoja, kaikki toimii luultavasti suoraan. Toisin sanoen esimerkiksi komento PRINT ei mitenkään varmasti tulosta tekstiä näytölle, vaan tulostus voi olla ohjattu tiedostoon tai muuallekin.
Ainoa ongelma on syötteen lopun tunnistus, koska ohjelma ei näytä saavan DOSin lopetusmerkkiä (ASCII 26) eikä mitään muutakaan tiedotusta, vaikka tiedoston kaikki merkit olisi luettu. Tässä asia on ratkaistu siirtymällä virhetilanteessa ohjelman loppuun, mutta parempia ehdotuksia otetaan vastaan.
RANDOMIZE TIMER ON ERROR GOTO LOPPU sana$ = "" DO merkki$ = INPUT$(1) SELECT CASE merkki$ CASE CHR$(13), " " PRINT SEKOITUS$((sana$)); merkki$; sana$ = "" CASE CHR$(10) CASE CHR$(26) PRINT SEKOITUS$((sana$)); EXIT DO CASE ELSE sana$ = sana$ + merkki$ END SELECT LOOP LOPPU: PRINT SEKOITUS$((sana$)); SYSTEM FUNCTION SEKOITUS$ (sana$) FOR i% = 1 TO LEN(sana$) kohta% = INT(RND * (LEN(sana$) - i% + 1)) + i% vanha$ = MID$(sana$, i%, 1) MID$(sana$, i%, 1) = MID$(sana$, kohta%, 1) MID$(sana$, kohta%, 1) = vanha$ NEXT SEKOITUS$ = sana$ END FUNCTION
esimerkkisyöte
Ohjelmointiputka on suomalainen ohjelmointisivusto, joka aloitti toimintansa vuoden 2002 alussa. Sivustolla julkaistaan oppaita ja koodivinkkejä, jotka esittelevät ohjelmoinnin eri alueita ja ohjelmointikieliä. Keskustelualueella moni ohjelmointiin liittyvä ongelma saa ratkaisun. Aika ajoin järjestetään myös erilaisia kilpailuja. Ohjelmointiputkan käyttäjien joukossa on niin aloittelevia ohjelmoijia kuin alan ammattilaisiakin.
esimerkkitulostus
ujnkloihtpOtaeim no soimneuaaln nles,juoovishitoimt joak ltoitai iminstantoa nueodv 0202 s.luaas liovsSulta uaaajlitsnk iaappot aj äde,kiknvkjooi jtako eslteetiätv linmnjooineh rie ltaieau aj mlkii.thnloiejäoei saeklluestaKelleuu nimo oimonlietjnhi ittlivyä laogmen saa ikaaus.rtn iAka noaji ejtnäjteäsär ysöm aisrailei apil.kjliau Ouilmojhaneitkpnt kitäyenäjt ojusasko on niin oelttevaiial hjoloaiijem inuk alna aiiatlatiaik.snmm
Hyvä vinkki! Mainittakoon vielä, että samanlainen ohjaus toimii myös monissa muissa käyttöjärjestelmissä ja muilla ohjelmointikielillä tehdyissä ohjelmissa.
Bashissä virtojen(stderr,stdout) ohjaus toimii näin: http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO-3.html
Apuohjelma?Ihan kiva kummiskii.
Tämä on varmasti hyödyllinen ;)
Hauska! Vinkin nimeä voisi kyllä hiukan muuttaa.