Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Ohjelman aloitus uudestaan (QB)

Sivun loppuun

tekojalka [07.06.2004 23:12:34]

#

Eli miten saan ohjelman aloittamaan käyttäjän käskystä uudelleen, jos se on aliohjelma.
edit: typoja

Blaze [07.06.2004 23:22:28]

#

Aliohjelman lopussa vaan kysyt käyttäjältä, haluaako hän uuden kierroksen, ja jos vastaus on myöntävä, kutsut aliohjelmaa.

Koodi tulee näyttämään jokseenkin tällaiselta (disclaimer: en osaa QBasicia):

Sub munhienosubi
  'do j00r magic here
  'kysy käyttäjältä
  If käyttäjä_käski Then munhienosubi
End Sub

tekojalka [07.06.2004 23:26:06]

#

öö... hiukan sekavaa. :D

rndprogy [07.06.2004 23:29:35]

#

Eli jos tietty ehto toteutuu Subi kutsutaan uudelleen.

Gaxx [07.06.2004 23:35:08]

#

Hmm...

Säästätkö sormia vai näppäimistöä kun et viitsi kirjoittaa selvää kysymystä? :P Luin tuon kysymyksen yli kymmenen kertaa läpi enkä saanut siitä tolkkua. Tarkoititko siis todella tuota mitä blaze ehdotti? En saanut siitä millää sellaista kuten en myöskään mitää muutakaan.
Vastaappa vaikka ensitöiksesi pariin kysymykseen:
-Minkä haluat käynnistää uudelleen?
-Jos mikä olisi aliohjelma?

Edit: tuossa blazen hommassa on vain se vika, että pinomuisti täyttyy aika pian ja sitten tulee ERRORIA.
Edit2: Vai tuleeko se muuten tossa vastaan? Se pino siis.

tekojalka [07.06.2004 23:37:49]

#

1. ohjelman ilman ensimmäistä ali-ohjelmaa.
2. ali-ohjelma olisi kysymys haluaako ohjelman käyttäjä koittaa ohjelmaa uudelleen.

Gaxx [07.06.2004 23:44:22]

#

No tuohon ehdottaisin tämäntyyppistä ohjelmarakennetta:

do
'tähän kaikkee mitä sitten tartteekin
'tähän vaikka aliohjelmakutsuja
'tähän taas kaikkee muuta

'tähän tulee se aliohjelma, joka kysyy käyttäjältä, että haluaako alottaa ohjelman alusta

loop until [i]ehto[/i]
'sitten tänn jotain jos tarttee

Vähän vaikee ehdottaa kun ei tiedä miten olet ohjelmasi toteuttanut.

Kai se gotollakin onnistuisi, mutta en suosittele käyttämään.

tekojalka [07.06.2004 23:48:43]

#

öö tuo ohjelma järjestys on kovin kummalinen
edit: oikeastaan en ymmärä yhtään tuota järjestystä
edit: onko tuo ohjelma järjestys ali-ohjelman vai pää-ohjelman

Gaxx [08.06.2004 00:02:33]

#

No selvennetäänpä :)

koko ohjelmasi on niin kuin looppi. Kun ajat ohjelman, joka vaikkapa kysyy kaksi lukua ja laskee sitten niiden summan ja tulostaa sen näytölle, se kulkee loopin läpi ja lopussa käyttäjältä kysytään, haluaako tämä kokeilla ohjelmaa uudestaan. Jos kyttäjä haluaa kokeilla uudelleen, hoidetaan asia niin, että loopin ehto on sellainen, että se "looppaa". Jos käyttäjä ei halua kokeilla ohjelmaa uudelleen, hoidetaan asia niin, että poistutaan loopista.

Tässä esimerkkikoodi selostuksestani(ei typoja testattu :P):

dim shared vastaus as string
do
   cls
   print "Anna luku"
   input luku1

   print "Anna toinen luku"
   input luku2

   summa = luku1 + luku2
   print summa

   kysy
loop until vastaus = "e" or vastaus = "E"


sub kysy()
   print "Haluatko kokeilla uudestaan? k/e"
   input vastaus
end sub

Piti toi aliohjelmakin tonne lykätä ku siitä puhuit(ihan selvyyden vuoks tjsp)

Edit: Tossa ei kyllä tarttis käyttää yleistä muuttujaa...

tekojalka [08.06.2004 00:46:41]

#

siis minun koodini näyttää tältä niin tiedät jo minun aiheenikin.

------------------------
P Ä Ä - O H J E L M A
------------------------

DECLARE SUB ALKU ()
alku
CLS
DIM SHARED luku AS LONG
DO
INPUT "anna arvottavan luvun ylä-raja", yla&
RANDOMIZE TIMER
luku = INT((YLA& + 1) * RND)
INPUT "Luku: ", arvaus
IF arvaus = luku& THEN
PRINT "oikein!!"
ELSE
PRINT "väärin!!"
PRINT "Oikea luku oli"; luku
END IF
loppu
LOOP UNTIL vastaus = "e" OR vastaus = "E"

----------------------------------
A L K U   A L I - O H J E L M A
----------------------------------

SUB alku
CLS
PRINT "Luvun arvonta ohjelma"
END SUB

----------------------------------
L O P P U   A L I - O H J E L M A
----------------------------------

SUB loppu
PRINT "Uudestaan?"
INPUT "K/E", vastaus
END SUB

tuollaiselta koodin pitäisi näyttää
edit: mutta koodi valittaa osasta ("e" OR) ja valitus on type mismatch

Antti Laaksonen [08.06.2004 01:19:59]

#

Tässä pari vinkkiä:

  1. Määrittele muuttujat ennen niiden käyttöä DIM-lauseella. Toinen tapa on kirjoittaa muuttujan nimen perään sen tyyppiä kuvaava tunnus. Kiinnitä myös huomiota muuttujien tyyppiin (merkkijono vai luku). Lisätietoa.
  2. Aliohjelmia kannattaa käyttää vain silloin, kun sama osuus toistuu ohjelmassa useamman kerran. Eli jos kutsut aliohjelmaa vain kerran koodista, voit kirjoittaa aliohjelman koodin suoraan siihen kohtaan, josta sitä kutsuisit.
  3. Sisennä koodi, koska tämä selkeyttää sitä huomattavasti. Mallia voit katsoa esim. koodivinkeistä.

Tässä on vielä ohjelmasi korjattu versio:

CLS
PRINT "Luvunarvontaohjelma"
DIM luku AS LONG, arvaus AS LONG, yla AS LONG
DIM vastaus AS STRING

RANDOMIZE TIMER

DO
    INPUT "Anna arvottavan luvun yläraja:", yla
    luku = INT((yla + 1) * RND)
    INPUT "Luku: ", arvaus
    IF arvaus = luku THEN
        PRINT "Oikein!!"
    ELSE
        PRINT "Väärin!!"
        PRINT "Oikea luku oli"; luku
    END IF
    PRINT "Uudestaan?"
    INPUT "K/E", vastaus
LOOP UNTIL vastaus = "e" OR vastaus = "E"

Blaze [08.06.2004 01:23:24]

#

tekojalka kirjoitti:

mutta koodi valittaa osasta ("e" OR) ja valitus on type mismatch

Yrität siis sijoittaa vääräntyyppistä tietoa vääräntyyppiseen muuttujaan. QB:ta en juurikaan tunne, mutta auttaisko, jos tuohon muuttujanimen perään laittais $:n (ts. korvaa kaikki 'vastaus' -> 'vastaus$')?

Tai jos tuon vastauksen määrittelis merkkijonoks. Dim vastaus As String

Gaxx [08.06.2004 01:27:37]

#

Yrität pistää lukumuuttujaan merkkiä. Määrittele siis tuo vastaus muuttuja.

Käsitit ilmeisesti väärin, mitä tarkoitin, kun sanoin, että globaalia muuttujaa ei ole pakko käyttää. Homman voi hoitaa funktioilla jolloin sitä ei tarvitse(kai...).

Joka tapauksessa. Lisää siis ohjelmasi alkuun:
dim shared vastaus as string

Mitä tolla alku subilla tossa tekee? Eihän käyttäjä edes periaatteessa huomaa sitä mitä se tulostaa.

Edit: Blaze ehti ensin... ja antti.


Sivun alkuun

Vastaus

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

Tietoa sivustosta