Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: VB6: Funktio joka palauttaa ensimmäisen sanan stringistä

Sivun loppuun

LMR [19.04.2004 18:55:51]

#

Pääsi taas jotenkin unohtumaan tämä koodailu vähäksi aikaa, ja vanhat hatarat taidot ehtivät hieman ruostua tuona aikana...tämän pitäisi olla ihan perustason juttu, mutta en mitenkään saanut pähkäiltyä tätä...


Eli tarkoituksena olisi, että jos tekstikenttään ensimmäiseksi kirjoitetaan tietty avainsana, jotain tapahtuu.


Laitanpa tähän perään vielä toisenkin pikku kysymyksen, en sille viitsi uutta ketjua perustaa: miten saisi isojen ja pienten kirjainten merkityksen pois? Ohjelmani ymmärtää käskyn "toimi", mutta jos se kirjoitetaan vaikkapa muodossa "ToIMI", VB ei tunnista sitä käskyksi.

sooda [19.04.2004 19:00:44]

#

1. if left(text1.text, instr(text1.text, " ") - 1) = "avain" then msgbox "kirjotit teejotain!" ja tää kannattaa laittaa vaikka text1_changeen tai timeriin. Text1 vaihdat tietty tekstikentän nimeksi.
Eli jos tekstistä n merkkiä vasemmalta on avain niin tehään jotaki, n on instr(text1.text, " ") eli missä kohtaa text1.textiä on välilyönti, ja - 1 on sitävarten ettei väli tule sanaan mukaan.

2. käytä ucasea tai lcasea. Ucase muuntaa tekstin kirjaimet isoiksi ja lcase pieniksi. Tee vaikka: if lcase(text1.text) = "toimi" then msgbox "toimii se" eli tässä toi if saa sen aina pienillä kirjaimilla joten älä käytä sitte lcasen kanssa esim: if lcase(teksti) = "TOIMI" then ... koska tää ei ole koskaan tosi vaikka sen kirjottaisi TOIMIna niin lcase muuntaa sen lower caseksi, pikkukirjaimiksi.

huh mitä selitystä... :D
((edit) oho, siis ensimmäinen sana... korjasin 1. vastauksen)

LMR [19.04.2004 19:23:35]

#

Kiitos, mutta ei tuo ensimmäinen taida toimia ohjelmassani...olisi pitänyt selittää tarkemmin. Eli ohjelmani on hupimielessä väsätty botti joka kykenee kommunikoimaan käyttäjän kanssa jollain tasolla ja vastailee kysymyksiin hieman oraakkelin tapaan. Se mitä tällä ketjulla hain, on tämä:

Jos ohjelman ensimmäinen sana päättyy kirjaimiin "ko", riippumatta siitä että mitä muita kirjaimia sanassa on (ja riippumatta kirjainten määrästä), ohjelma tulkitsee sen "tuletko"/"halataanko" -tyyppiseksi kysymykseksi ja osaa valita vastauksen sen mukaan. Tuon vinkkisi soveltaminen tähän ei onnistu ainakaan minulta.

hunajavohveli [19.04.2004 19:51:26]

#

If Right$(Text1.Text, 2) = "ko" Then MsgBox ("Kysymys")

Edit: Eli tuo Right$ ja sen argumentti 2 siis tarkistaa oikealta päin 2 ensimmäistä kirjainta ja sitten tarkistaa ovatko ne "ko"
Ja muista ottaa myös huomioon umlauttisanojen kö-pääte? Esim. "mennäänkö?" Tuota $-päätettä ei muistaakseni kai VB:ssä tarvita, QB:ssä kyllä.

LMR [19.04.2004 20:02:09]

#

Pitihän se arvata että en vieläkään onnistunut selittämään tarpeeksi selvästi. Tuota hunajavohvelin tekniikkaa (tosin left$ right$:n asemasta) olen käyttänyt ohjelman perustana jo alusta asti, mutta tarkoitus olisi että "halataanko" voisi jatkaa: "halataanko nyt?" tai "halataanko vai pussataanko?". Eli tärkeätä on että ohjelma havaitsisi ensimmäisen sanan "ko"-päätteen, koska nythän tuo ei toimi jos kirjoittaa tuon "ko":n jälkeen jotain. Teinköhän itseni nyt selväksi?

hunajavohveli [19.04.2004 20:10:18]

#

If Right$(Left$(Text1.Text, InStr(Text1.Text, " ") - 1), 2) = "ko" Then MsgBox ("Jep!")

No jos tolla Instrin ja Leftin yhdistelmällä, minkä sooda näytti saadaan ensimmäinen sana, niin lisäksi Rightilla saadaan vielä siitä kaksi viimeistä kirjainta.

LMR [19.04.2004 20:24:48]

#

No jo on...vika on varmaan itsessäni, mutta tuota koodia soveltamalla VB toteaa seuraavaa:

"Run-time error: '5': Invalid procedure call or argument". Tuo koodinpätkä ei siis suostu toimimaan tuollaisenaan.

hunajavohveli [19.04.2004 20:26:49]

#

Jokin bugi tuossa tosiaan oli. Pitäisi ensin tehdä tarkistus, onko lauseessa edes tarpeeksi merkkejä ja sitten vasta katsoa, päättyykö se eka sana "ko". Kokeilepa ensin soveltaa sitä jotenkin itse.

zigilii [19.04.2004 20:53:51]

#

Private Sub Form_Click()
If Right$(Left$(Form1.Caption, InStr(Form1.Caption, " ") - 1), 2) = "ko" Then MsgBox ("Jep!")
End Sub

Private Sub Form_Load()
Form1.Caption = "onko tämä oikein"
End Sub

noi se toimii

LMR [19.04.2004 21:11:44]

#

Kiitos avusta, nyt homman pitäisi toimia jotenkin. Yksi ongelma on kuitenkin yhä, ja se on seuraava: jos käyttäjä ei kirjoita mitään tuon "ko" -päätteen jälkeen, ohjelma kaatuu. Yritin järkeillä ongelmaan jonkinlaista tarkistusta, mutta valitettavasti en puutteellisen tietämykseni takia keksinyt ratkaisua asiaan. Olisi kiva jos joku jaksaisi vielä vääntää tähän tarkistuksen kun en siihen itse kykene.

zigilii [20.04.2004 08:49:25]

#

Private Sub Command1_Click()

If Right$(Text1.Text, 2) = "ko" Then
    MsgBox ("Jep!")
Exit Sub
ElseIf Right$(Left$(Text1.Text, InStr(Text1.Text, " ") - 1), 2) = "ko" Then
    MsgBox ("Jep!")
End If

End sub

Noin se ainakin toimii, kai siihen on helpompia tapojakin olemassa.

hunajavohveli [20.04.2004 14:17:15]

#

If InStr(Text1.Text, " ") > 0 Then

If Right$(Left$(Text1.Text, InStr(Text1.Text, " ") - 1), 2) = "ko" Then MsgBox ("Jep!")

End If

Tässä vielä yksi ratkaisu. Eli ensimmäinen If-lauseke tarkistaa, onko lauseessa yleensä enemmän kuin yksi sana. Jos välilyöntiä (jonka esiintyminen tulkitaan kahdeksi sanaksi) ei löydy, Instr palauttaa nollan. Jos taas palautusarvo > 0, niin sitten tarkistetaan löytyykö "ko".

LMR [20.04.2004 17:22:05]

#

Kiitos kun jaksoitte vastailla kysymyksiini. Vähän nolottaa venyttää vielä tämän ketjun pituutta, mutta asia liittyy yhä aiheeseen. Voi olla että tämä menee jo liian vaikeaksi, mutta olen yrittänyt ratkaista tätä pulmaa jo päivien ajan siinä kuitenkaan onnistumatta.

Eli nythän botti toimii niin, että olen määritellyt erilaisia kysymyssanoja, joiden perusteella ohjelma päättää vastauksen tyypin. Ohjelma ymmärtää esimerkiksi sellaisten sanojen päälle kuin "mitä, missä, milloin", mutta vain jos kysymyssana on teskstikentän ensimmäinen sana. Esimerkiksi jos kysymyksen "mitä tapahtuu huomenna?" esittää hieman vapaamuotoisemmin lisäten "mitä" -avainsanan eteen "kertoisitko että", ohjelma ei ymmärrä tekstiä kysymykseksi, koska kysymyssana ei ole ensimmäisenä (käytän ohjelman koodauksessa tämän tyyppistä metodia: If Left$(kys$, 4) = "mitä" then...). Tarkoituksena olisi, että ohjelma tarkistaisi että mikä avainsana on ensimmäisenä, ja valitsisi vastauksensa sen mukaan. Esimerkiksi tälläiseen hölmöön kysymykseen: (määrittelemäni avainsanat kirjoitettuna isolla) "tämä on typerä kysymys: MITÄ tapahtui, KUKA se oli, ja MISSÄ se tapahtui?" ohjelman tulisi vastata kysymykseen "mitä", koska se on ensimmäinen kysymyslause ohjelmassa.


Tälläinen voi kuulostaa hölmöltä ja vähän kunnianhimoiselta (kuka haluaisi jutella botin kanssa?), mutta tarkoituksena olisi kyhätä botista hieman Lintukodon oraakkelin tapainen, jolloin se siis vastaisi aina ensimmäiseen kysymykseen. Jos joku edes tajusi että mitä tarkoitan, niin olisi kiva jos jotain suuntaa antavaa joku voisi edes antaa. Ketjun viestejä katsellessa voisi ajatella etten vaivaudu itse tekemään mitään ohjelman eteen, mutta paljon on jo tehty, sen kanssa pystyy jo keskustelemaan monista eri asioista mutta valitettavasti kysymyssanan on oltava aina ensimmäinen jotta se tajuaa sen kysymykseksi. Vastauksesta olisi paljon apua.

peki [20.04.2004 17:25:42]

#

Tuo lähestymistapasi on mielestäni väärä.
Sinun kannattaisi kyhätä virtuaalinen "neuraali verkko", johon sanojen kytkökset tallennettaisiin dynaamisesti. Sitten eräällä(en muista miten meni) algoritmillä haet sanat "neuraali verkosta". Googlella voisi löytyä lisätietoa. Myös Sorsalassa( http://sourceforge.net/ ) on projekteja, jotka käsittelevät tätä aihetta. Käy siellä tutkimassa lähdekoodeja.

Blaze [20.04.2004 17:42:33]

#

If InStr(Lcase(Teksti), "mitä") <> 0 Then MsgBox "Tekstissä oli sana 'mitä'"

LMR [20.04.2004 18:21:10]

#

Blaze kirjoitti:

If InStr(Lcase(Teksti), "mitä") <> 0 Then MsgBox "Tekstissä oli sana 'mitä'"

Miten tuota muka voi soveltaa käyttötarkoituksiini? Ideahan oli se, että ensimmäisenä mainittu avainsana määrää vastauksen tyypin. Jos laitan muillekin avainsanoille tuon tyyppisen koodin ja kirjoitan tekstikenttään "mitä kuka missä?", niin ohjelma ilmoittaa "kirjoitit mitä, kirjoitit kuka, kirjoitit missä", kuten oli odotettavissakin. En oikein ymmärtänyt koko pätkän toimintaperiaatetta joten hankala on lähteä sitä soveltamaan.

hunajavohveli [20.04.2004 21:48:41]

#

Tämä menee nyt aika monimutkaiseksi. Mutta kannattaako tuollaista bottia edes kyhätä, koska sen tiedot tulisivat aivan liian suppeiksi. Sitten olisi eri asia, jos pystyisit väsäämään ohjelman, joka tutkisi ensin lauseen:

Esim.
Mikä on tietokone?

Ja sitten ohjelma etsisi internetistä tietoa kysymykseen, eli siis mitä ikinä nettiin on kirjoitettu, toimisi tietokantana. Jos netistä löytyy, vaikka lause "tietokone on kätevä laite", ohjelma huomaisi, että lauseessa on sanat "tietokone" ja "on". Enää tarvitsee vain korvata "mitä" sana sanoilla "kätevä laite" ja vaihtaa sanajärestystä, niin ohjelma tulostaisi:

Tietokone on kätevä laite.

Tämä teoriassa toimisi, mutta käytännön toteutus olisi mutkikkaampi. Mutta en edelleenkään silti ymmärtänyt tuota ongelmaasi.

LMR [20.04.2004 22:09:06]

#

Äh, kyseessähän oli ihan vain hupikäyttöön tarkoitettu botti, jolta voi kysyä erilaisia kysymyksiä. Kun ohjelma havaitsee että käyttäjän kirjoittama lause on tietyn tyyppinen kysymys, se laittaa randomilla jonkun vastauksen. Vähän tämän tyyppinen:


http://www.lintukoto.net/viihde/oraakkeli/

Tuo tosin on sen verran laaja, etten ole ihan tuollaista kyhäämässäkään...useimmat varmaan tietävätkin tuon. Sen toimintaa tarkastelemalla saattaa valjeta millaista olen väsäämässä.

hunajavohveli [21.04.2004 14:42:58]

#

Hö, tuo oraakkelihan arpoo vastauksia miten sattuu! Vaikka kysyisi samaa lausetta kahta kertaa, vastaus on eri. Lisäksi nuo vastaukset eivät oikein tunnu sopivan (mikä ei tietenkään ole ihme) mutta kun ne eivät sovi edes kieliopillisesti, niin se on huono asia.

petrinm [21.04.2004 15:20:33]

#

Private Sub Command1_Click()
Dim sanat() As String
teksti = Text1.Text
sanat = Split(teksti, " ")
If LCase(sanat(0)) = "koska" Then
    If LCase(sanat(1)) = "minä" Then
        If LCase(sanat(2)) = "kuolen" Then
            'Vastaa tietyllä tavalla tarkennettuun kysymykseen
            MsgBox "Kuolet silloin kuin sinä kuolet"
        End If
    End If
        'Arpoo satunnausen vastauksen
        MsgBox "Heti kun kello lyö kuusi"
End If
End Sub

Edit: Pikku virhe koodissa


Sivun alkuun

Vastaus

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

Tietoa sivustosta