Kirjautuminen

Haku

Tehtävät

Koodit: QB: DOS-apuohjelma

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

Kommentit

Metabolix [27.01.2008 13:04:29]

#

Hyvä vinkki! Mainittakoon vielä, että samanlainen ohjaus toimii myös monissa muissa käyttöjärjestelmissä ja muilla ohjelmointikielillä tehdyissä ohjelmissa.

ZcMander [27.01.2008 14:05:14]

#

Bashissä virtojen(stderr,stdout) ohjaus toimii näin: http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO-3.html

qwerty [28.01.2008 10:13:50]

#

Apuohjelma?Ihan kiva kummiskii.

Meitzi [30.01.2008 00:05:53]

#

Tämä on varmasti hyödyllinen ;)

Juhko [03.02.2008 15:53:15]

#

Hauska! Vinkin nimeä voisi kyllä hiukan muuttaa.

Kirjoita kommentti

Muista lukea kirjoitusohjeet.
Tietoa sivustosta