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 FUNCTIONKyllä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.