/****************************************************************************/ /* ** T U L K K I . C ** ** Ohjelmalla tehd„„n pieni sanakirja. ** Sanasto sijaitsee tiedostossa SANASTO.DAT ja sen on oltava muotoa: ** (Turbo-C:ss„ sanastoa etsit„„n samasta hakemistosta, josta ohjelma ** k„ynnistyi, muissa j„rjestelmiss„ oletushakemistosta, ks. lue_sanasto) ** ** Suomi | Ruotsi | Englanti ** ;------------------------------------------ ** min„ | jag | i ** sin„ | du | you (yks.) ** h„n | han (mask.) | he (mask.) ** h„n | hon (fem.) | she (fem.) ** me | vi | we ** te | ni | you (mon.) ** he | dom | they ** hernekeitto | „rtsoppa | pea soup ** sukellusvene | ub†t | submarine ** suklaa | chokolade | chocolate ** sukka | socka (lyhyt) | sock (lyhyt) ** sukka | strumpa (pitk„)| stocking (pitk„) ** ** ** Ohjelman aluksi koko sanasto luetaan muistiin seuraavann„k”iseen ** tietorakenteeseen: ** ** Sanasto: ** ---------- ** |Kieli„ 3| 0 1 2 ** | |-------- ** |Lyhenteet |S|R|E| ** | |-------- ** | | 0 1 2 ** | | ----------------------------- ** |kielet o+->|o|Suomi |Ruotsi |Englanti| ** | | -+--------------------------- ** | | | ** | | v ** | | ----------------------------- ** |loppu o| |o|min„ |jag |i | ** --------+- -+--------------------------- ** | | ** | v ** | ----------------------------- ** | |o|sin„ |du |you | ** | -+--------------------------- ** | | ** | v ** | ----------------------------- ** --->|o|h„n |han(mask|he(mask)| ** -+--------------------------- ** | ** v ** NULL ** ** Siis sanasto on linkitetty lista, jossa alkiona on yksi sana kaikilla ** kieleill„. Sanaston yksi rivi on totetutettu osoittimina merkkijonoon ** joka on p„tkitty pystyviivojen kohdalta: ** ** ** min„ jag i ** ^ ^ ^ ** ----- | | | ** Seuraava sana| o-+---> | | | ** |---| | | | ** sanat 0 | o-+--------- | | ** |---| | | ** 1 | o-+-------------- | ** |---| | ** 2 | o-+------------------ ** |---| ** ** ** ** Ohjelmaa voidaan my”s kutsua komentorivilt„ muodossa: ** >tulkki sukka/s-e ** ** T„m„n tiedoston aliohjelmat: ** alkuohjeet - tuloistaa ohjelman alussa olevat ohjeet ** ohjeet - tulostaa varsinaiset k„ytt”ohjeet ** tulkkaa - suorittaa tulkkauksen ** main - p„„ohjelma ** ** Ohjelman k„„nt„miseksi tarvittavat tiedostot: ** tulkki.c - t„m„ tiedosto ** tulkkita.c - sanaston lukeminen levylt„ ** tulkkiet.c - sanastosta etsiminen ** mjonot.c (tai mjonot.obj)- merkkijonojen k„sittelyyn liittyvi„ apuohjelmia ** tulkki.h - t„m„n ohjelman m„„ritykset ** mjonot.h - mekrkijonojen m„„ritykset ** ** ** Tekij„t: Vesa Lappalainen ** Ohjelmointikurssi 1991 ** Tehty: 6.12.1991 ** Muutettu: ** Mit„ muutettu: ** ** Jatkosuunnitelmat: ** - tulostusj„rjestyksen„ olisi ehk„ parempi tulostaa ensin yksi ** kieli kokonaan ja vasta sitten vaihtaa toiseen kieleen. ** Nyt tulostetaan sanaston yksi rivi kerrallaan ja t„m„ oli ** alkuper„isess„ suunnitelmassa. Muutos olisi helppo, sill„ ** vaihdettaisiin vain silmukoiden j„rjestyst„ aliohjelmassa ** tulosta_kaannos ** - parempi tietorakenne tilan s„„st„miseksi ** - k„ytt” suoraan levylt„, jolloin sanasto voisi olla suurempi */ #include #include #include #include "mjonot.h" #include "tulkki.h" /****************************************************************************/ void /* */ alkuohjeet( /* */ Sanasto_tyyppi *sanasto,/* s Sanasto josta tulkataan. */ Kaannos_tyyppi *kaannos /* s Alkuper„inen k„„nn”sohje */ ) /* ** Funktiolla tulostetaan ohjelman k„ynnistyksess„ tulevat ohjeet. ** Tulostus: N„ytt””n ----------------------------------------------------------------------------*/ { int i; printf( "Terve! Olen Satunnaiselle matkaajalle suunniteltu Tulkki!\n" "Sanastoni on tiedostossa "SANASTO". Mik„li haluat lis„t„\n" "sanastoa, k„yt„ tekstink„sittelyohjelmaa sanaston\n" "p„ivitt„miseksi.\n" "\n" "Avustusta saat vastaamalla ? kun sinulta kysyt„„n sanaa.\n" "Tulkattavina kielin„ on nyt " ); for (i=0; imista.lkm; i++) printf("%s ",sanasto->kielet->sanat[kaannos->mista.kielet[i]]); printf("- "); for (i=0; imihin.lkm; i++) printf("%s ",sanasto->kielet->sanat[kaannos->mihin.kielet[i]]); printf("\n"); } /****************************************************************************/ void /* */ ohjeet( /* */ Sanasto_tyyppi *sanasto /* s Sanasto josta tulkataan. */ ) /* ** Funktiolla tulostetaan ohjelman k„ytt”ohjeet. ** Tulostus: N„ytt””n ----------------------------------------------------------------------------*/ { int i; printf( "-------------------------------------------------------------\n" "Avustus:\n" "\n" "Kirjoita sanakysymyksen per„„n sana jonka haluat k„„nt„„.\n" "Mik„li painat pelk„n [RET], ohjelman toiminta loppuu.\n" "\n" "Mik„li haluat vaihtaa kieli„, kirjoita sanan per„„n\n" "kauttaviiva ja kielten nimien lyhennekirjaimet, joita \n" "haluat k„„nt„„. Mik„li haluat k„„nn”ksen samalla \n" "usealle eri kielelle/kielelt„, kirjoita kaikki haluamasi \n" "kielet. Mik„li haluat k„„nn”ksen kaikille mahdollisille\n" "kielille, kirjoita vain l„ht”kieli.\n" "\n" "Tunnen kielet" ); for (i=0; ikielia; i++) printf(" %s",sanasto->kielet->sanat[i]); printf(".\n" "Esimerkki: \n" "Sana>kissa/s-e\n" "suomi: kissa = englanti: cat\n" "Sana>car\n" "englanti: car = suomi: auto\n" "Sanassa voi k„ytt„„ my”s jokerimerkkej„ * ja ?\n" "Esimerkki:\n" "Sana>suk*\n" "--------------------------------------------------------------\n" ); } /****************************************************************************/ void /* */ tulkkaa( /* */ Sanasto_tyyppi *sanasto,/* s Sanasto josta tulkataan. */ char *jono ,/* s Tulkattava jono. */ Kaannos_tyyppi *kaannos /* s,t Alkuper„inen k„„nn”sohje */ ) /* ** Funktiolla kysyt„„n aina sana ja etsit„„n sit„ vastaavat k„„nn”kset ** sanastosta. Lopetetaan kun painetaan pelkk„ RET. ** ** Muuttuu: jono ** Sy”tt”: P„„tteelt„ ** Tulostus: N„ytt””n ** Kutsuu: lue_jono ** ohjeet ** muuta_kaannos ** tulosta_kaannos ----------------------------------------------------------------------------*/ { if ( strcmp(jono,"?")==0 ) { ohjeet(sanasto); return; } muuta_kaannos(kaannos,jono,sanasto->lyhenteet); if (*jono) tulosta_kaannos(sanasto,jono,kaannos); } int main(int argc, char *argv[]) { int i; Sanasto_tyyppi sanasto; char *lyhenteet=sanasto.lyhenteet; Kaannos_tyyppi kaannos; char *virhe; /*01234*/ char jono[80]="/s-r"; if ( (virhe=lue_sanasto(&sanasto,argv[0])) != NULL ) { printf("%s\n",virhe); return 1; } /* Aluksi oletusk„„nn”s: */ jono[1] = lyhenteet[0]; jono[3] = lyhenteet[1]; muuta_kaannos(&kaannos,jono,lyhenteet); if (argc<=1) /* argv[0] on ohjelman oma nimi! */ alkuohjeet(&sanasto,&kaannos); else { jono[0]=0; for (i=1; i"); if ( lue_jono(N_S(jono)) <= OLETUS ) break; tulkkaa(&sanasto,jono,&kaannos); } return 0; }