Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: QB: Lisää tyhmiä kysymyksiä

Sivun loppuun

SysRq868 [25.11.2006 17:09:33]

#

Jatkuu edellisestä.

Eli onko QB:ssä arrayta tai voiko sellaisia mestaroida jotenkin? Miten voi selvittää, montako numeroa on single-muuttujassa (esim. luvussa 10000 on viisi numeroa)? Miten voi tulostaa jostakin muuttujasta vain tietyn verran kirjaimia (esim. muuttujasta, jonka sisältö on "SANOJA", tulostetaan vain viisi kirjainta, eli "SANOJ")?

Kiitos erittäin paljon jo etukäteen!

moptim [25.11.2006 17:11:56]

#

single-muuttujan numeromäärän saa näin:

MunSinglenPituus = LEN(STR$(MunSingle))

Tietyt kirjaimet saa LEFT$- tai RIGHT$-funktioilla.
Arrayn saa kai näin:

DIM MunArray() AS INTEGER

hunajavohveli [25.11.2006 17:29:27]

#

Tietyn määrän kirjaimia saat LEFT$-funktiolla.

SysRq868 [25.11.2006 17:40:35]

#

Singlen pituus toimii hienosti! Kiitos siitä!

Kiitos linkistä, hunajavohveli!

Array-koodi ei pelitä: "Expected: expression"

Unohtui vielä yksi kysymys: Onko QB:ssa jotain tapaa suorittaa muuttujan sisällä olevaa koodia, niin kuin PHP:ssa on?

Kiitos!

Metabolix [25.11.2006 17:42:06]

#

Array-määrittely vaatii sulkuihin sen arrayn koon. Katsopa vaikka Putkan QBasic-oppaan toisesta osasta, siellä oli oikeannäköistä koodia.

Koodin suoritukseen tuskin on tapaa.

SysRq868 [26.11.2006 11:26:48]

#

Kiitos! Nyt toimii!

Vielä pari kysymystä (ei, en aio lopettaa ikinä):

Millä funktiolla voi laskea arrayn pituuden? Tai onko QB:ssa jotain array_push():in tyylistä funktiota, jotta en vahingossa pistä arrayhyn jonkin arvon päälle jo jotain, tai ettei sinne pääse rakoja väliin?

Ja miten QB:lla voisi yksinkertaisimmillaan luoda simulaatioajan, eli taustalla juoksevan päivämäärän (joka ei siis häiriinny GOTOista tai muista funktioista) niin, että yksi päivä kestäisi 2 sekuntia?

Kiitän mitä hartaimmin taas etukäteen niitä, joilla liikenee kallista aikaa suurimpaan sarjaani tyhmiä kysymyksiä 24 tunnin sisällä.

E.K.Virtanen [26.11.2006 19:55:16]

#

Mitähän oikein tarkoitat arrayn pituudella? Kuinka monta solua vai mitä?
array_push vastaavaa ei tietääkseni QB:sta löydy, joskaan moisen tekeminen ei kovinkaan vaikeaa ole.

Simulaatioajan tekeminen onnistunee helpoimmin tarkkailemalla tietokoneen kelloa ja jos nyk.aika - lähtöaika > 2 sek. niin silloin päivä = päivä + 1.

Antti Laaksonen [26.11.2006 20:08:04]

#

Taulukon pienimmän indeksin kertoo funktio LBOUND ja suurimman indeksin kertoo funktio UBOUND. Ohjelmoijan täytyy itse pitää huolta siitä, että taulukon oikeaan kohtaan menee oikea arvo.

Funktio TIMER ilmoittaa, kuinka monta sekuntia on kulunut keskiyöstä. Tämän avulla voi laskea, kuinka kauan peli on ollut käynnissä. Sekuntien laskurin (TIMER) nollaantuminen vuorokauden vaihtuessa täytyy ottaa huomioon.

SysRq868 [26.11.2006 20:19:44]

#

Eli siis jos aloitan tyhjän arrayn, voin UBOUNDia käyttämällä lisäillä ja tuhoilla arrayn viimeisiä tietoja, ja näin rakoja tms. ei pääse syntymään?

TIMERin kanssa saattaa mennä suht koht vaikeaksi. Jonkinlainen simppeli esimerkki voisi olla toki kohdallaan...

Kiitos teille molemmille (ja joku moderaattori voisi poistaa sen kolmannen threadin)!

Antti Laaksonen [26.11.2006 20:34:28]

#

Taulukko kannattaa heti aluksi määritellä niin suureksi, että siihen mahtuu kaikki tarvittava tieto.

Jos taulukon määrittelee sanalla REDIM, sen kokoa pystyy muuttamaan myöhemmin määrittelemällä sen uudestaan. Jos taulukon kokoa muuttaa, se kuitenkin tyhjentyy. (QB7.1:ssä on tosin avainsana PRESERVE, jota käyttämällä vanha tieto säilyy.)

PHP:n taulukoihin tottuneelle QB:n taulukot voivat tuntua rajoittuneilta. QB:ssä taulukolle annetaan siis heti määrittelyssä muuttumaton koko ja muuttumaton tyyppi. Tämän jälkeen taulukon arvoja voi ainoastaan lukea ja niitä voi muuttaa.

SysRq868 [26.11.2006 20:44:42]

#

Hienoa, uskoisin että ymmärsin miten kuten. Joka tapauksessa, tiedän, että se on rajoittuneempi, mutta se on itse asiassa hyväkin asia mitä peleihin tulee. Itse kun käytän taulukkoa esim. hankittujen laitteiden tietojen listaukseen, niin sitten kun on hankittu niin monta ensimmäisen luokan laitetta kun taulukkoon sopii, on peli virallisesti läpäisty. Hyvä. Kiitos paaaaljon.

Entäpä se TIMER? Kaikki mitä tässä nyt ehdin väsäilemään oli hieman väkisten väännetty... Hmh.

Antti Laaksonen [26.11.2006 21:04:36]

#

Teinpä tällaisen funktion, jonka pitäisi selviytyä myös vuorokauden vaihdoksesta.

' aloitetaan ajanlasku
alku& = aika&(1)
CLS

WHILE 1
   ' näytetään kuluneiden päivien määrä ylärivillä
   LOCATE 1, 60
   PRINT aika&(0) \ 2
WEND

FUNCTION aika& (nollaa%)
   STATIC paivat&, vanha&
   IF nollaa% THEN
      vanha& = INT(TIMER)
      paivat& = 0
   ELSE
      uusi& = INT(TIMER)
      WHILE uusi& <> vanha&
         vanha& = vanha& + 1
         paivat& = paivat& + 1
         IF vanha& = 86400 THEN vanha& = 0
      WEND
   END IF
   aika& = paivat&
END FUNCTION

Ohjelman alussa funktiota kutsutaan parametrilla 1, ja siitä hetkestä käynnistyy ajanlasku. Tämän jälkeen funktiota kutsutaan parametrilla 0, jolloin se palauttaa kuluneiden sekuntien määrän. Esim. jos sekuntien määrän jakaa kahdella, tulos on kahden sekunnin pituisten päivien määrä.

(Ohjelmassa on ikuinen silmukka, joten ohjelma täytyy sulkea painamalla Control + Break.)

SysRq868 [26.11.2006 21:07:24]

#

En pääse sitä tänään enää testaamaan, mutta kiitos erittäin erittäin paljon loputtomasta apusi määrästä ja korvaamattomuudesta. Testaan sitä heti huomenna kun pääsen töistä. :)


Sivun alkuun

Vastaus

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

Tietoa sivustosta