Tästä listauksesta löytyvien aliohjelmat taivuttavat suomenkielisen (ja useimmissa tapauksissa muunkielisenkin) nimen kahdessa yleisessä sijamuodossa, genetiivissä ja partitiivissa, eli:
nominatiivi=Pekka
genetiivi=Pekan
partitiivi=Pekkaa
Aliohjelmista voisi olla hyötyä jossain peleissä, missä pelaajan nimi pitää sovittaa lauseeseen, kuten "Pekan vuoro", "Kääpiö iskee Pekkaa" jne.
Aliohjelmissa on varmasti joitain puutteita, mutta itse en niitä testeissäni löytänyt.
DECLARE FUNCTION TeeNimiGenetiivi$ (nimi$) DECLARE FUNCTION TeeNimiPartitiivi$ (nimi$) DECLARE FUNCTION VaihdaMerkki$ (vanha AS STRING, uusi AS STRING, teksti AS STRING) CLS PRINT "nominatiivi", , "genetiivi", , "partitiivi" PRINT STRING$(80, "-") FOR i = 1 TO 21 READ nimi$ PRINT nimi$, , TeeNimiGenetiivi(nimi$), , TeeNimiPartitiivi(nimi$) NEXT 'listan nimet DATA Antti, Daniel, Eeva, Heikki, Ivan, Joel, Keijo DATA Luukas, Merja, Niina, Oskar, Paul, Reija, Samuel DATA Teo, Ulla, Valtteri, Yrjö, Jokinen, Lindström, Nieminen FUNCTION TeeNimiGenetiivi$ (nimi$) knimi$ = nimi$ 'jos nimi on kaksiosainen... IF INSTR(knimi$, " ") > 0 THEN alku$ = LEFT$(knimi$, INSTR(knimi$, " ") - 1) knimi$ = MID$(knimi$, INSTR(knimi$, " ") + 1) END IF 'kaksoiskonsonantit lähtevät pois IF MID$(knimi$, LEN(knimi$) - 2, 2) = "tt" THEN knimi$ = VaihdaMerkki("tt", "t", knimi$) END IF knimi$ = VaihdaMerkki("kk", "k", knimi$) knimi$ = VaihdaMerkki("pp", "p", knimi$) 'poikkeus: sukunimen nen-pääte IF RIGHT$(knimi$, 3) = "nen" THEN knimi$ = LEFT$(knimi$, LEN(knimi$) - 3) + "sen" GOTO gloppu END IF SELECT CASE RIGHT$(knimi$, 1) CASE "a", "e", "i", "o", "u", "y", "ä", "ö" 'vokaaliloppu -> +n knimi$ = knimi$ + "n" CASE "s" 's-loppu -> -1 +ksen knimi$ = LEFT$(knimi$, LEN(knimi$) - 1) + "ksen" CASE ELSE 'konsonanttiloppu -> +in knimi$ = knimi$ + "in" END SELECT gloppu: TeeNimiGenetiivi = LTRIM$(alku$ + " " + knimi$) END FUNCTION FUNCTION TeeNimiPartitiivi$ (nimi$) knimi$ = nimi$ 'jos nimi on kaksiosainen... IF INSTR(knimi$, " ") > 0 THEN alku$ = LEFT$(knimi$, INSTR(knimi$, " ") - 1) knimi$ = MID$(knimi$, INSTR(knimi$, " ") + 1) END IF 'määrittää, onko pääte a vai ä IF INSTR(nimi$, "a") > 1 OR INSTR(nimi$, "o") > 1 OR INSTR(nimi$, "u") > 1 THEN paate$ = "a" ELSEIF INSTR(nimi$, "y") > 1 OR INSTR(nimi$, "ä") > 1 OR INSTR(nimi$, "ö") > 1 THEN paate$ = "ä" ELSE paate$ = "ä" END IF 'poikkeus: sukunimen nen-pääte IF RIGHT$(knimi$, 3) = "nen" THEN knimi$ = LEFT$(knimi$, LEN(knimi$) - 3) + "st" + paate$ GOTO ploppu END IF SELECT CASE RIGHT$(knimi$, 1) CASE "a", "e", "i", "o", "u", "y", "ä", "ö" 'vokaaliloppu -> +a/ä knimi$ = knimi$ + paate$ CASE "s" 's-loppu -> +ta/tä knimi$ = knimi$ + "t" + paate$ CASE ELSE 'konsonanttiloppu -> +ia/iä knimi$ = knimi$ + "i" + paate$ END SELECT ploppu: TeeNimiPartitiivi = LTRIM$(alku$ + " " + knimi$) END FUNCTION FUNCTION VaihdaMerkki$ (vanha AS STRING, uusi AS STRING, teksti AS STRING) DO UNTIL INSTR(teksti, vanha) = 0 kohta% = INSTR(teksti, vanha) teksti = LEFT$(teksti, kohta% - 1) + uusi + MID$(teksti, kohta% + LEN(vanha)) LOOP VaihdaMerkki$ = teksti END FUNCTION
Kyllähän tuo hyvä on.
mäki joskus väsäilin tommosta.. ihan hyvä on
BUGI! Antti -> part. = Anttia, ei Anttiä
No onpa tosissaan hieno!
Toimisiko Matti Nykäsen kohdalla? Se tuli ensimmäisenä mieleen... :)
Eipäsku "Kääpiö iskee Pekan" 8----------D
Aihe on jo aika vanha, joten et voi enää vastata siihen.