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.