Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: QB: Nimien taivutus

Antti Laaksonen [27.07.2002 15:06:44]

#

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

ruuvari [28.07.2002 14:05:51]

#

Kyllähän tuo hyvä on.

Jaakko [09.08.2002 17:11:32]

#

mäki joskus väsäilin tommosta.. ihan hyvä on

Jaakko [09.08.2002 17:15:11]

#

BUGI! Antti -> part. = Anttia, ei Anttiä

(nimetön) [15.10.2002 16:18:56]

#

No onpa tosissaan hieno!

moptim [28.10.2006 15:28:06]

#

Toimisiko Matti Nykäsen kohdalla? Se tuli ensimmäisenä mieleen... :)

moptim [27.11.2007 15:27:30]

#

Eipäsku "Kääpiö iskee Pekan" 8----------D

Vastaus

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

Tietoa sivustosta