/* kortti.c SJ */ #include #include // Luetellut tyypit korttipakan maista ja numeroista // Viimeiset vakiot Maita ja Numeroita kertovat montako maata ja numeroa // pakassa on enum Kortti_maat { Ruutu, Hertta, Risti, Pata, Maita }; enum Kortti_numerot { Assa, Kaksi, Kolme, Nelja, Viisi, Kuusi, Seitseman, Kahdeksan, Yhdeksan, Kymmenen, Sotilas, Kuningatar, Kuningas, Numeroita }; // Merkkijonoesitykset maista ja numeroista // Ei käytetä ääkkösiä ettei Viopen automaattitarkastuksessa tule // merkistöongelmia static char *maat[Maita] = { "Ruutu", "Hertta", "Risti", "Pata" }; static char *numerot[Numeroita] = { "assa", "2", "3", "4", "5", "6", "7", "8", "9", "10", "sotilas", "kuningatar", "kuningas" }; // rakenne joka sisältää yhden kortin tiedot ja merkkijonoesityksen typedef struct Korttirakenne { enum Kortti_maat maa; enum Kortti_numerot numero; char ulkoasu[20]; } *Kortti; // Kortti on osoitin Korttirakenne:een. /** * Funktio joka luo uuden kortin tietueen ja täyttää siihen tarvittavat * tiedot. Funktio tarkistaa, että parametrit maa ja numero ovat kelvollisia, * tallettaa ne uuden dynaamisesti varatun kortin kenttiin ja muodostaa * kenttään ulkoasu merkkijonon jossa on kortin maa ja kortin * numero yhteenliitettynä merkkijonoesityksenä. * Funktio palauttaa arvonaan uuden varatun kortin osoitteen. Jos parametrit * olivat kelvottomia, palauttaa NULL. **/ Kortti uusikortti(int maa, int numero); /** * Funktio joka luo ja palauttaa kokonaisen korttipakan. * Funktio palauttaa 52-alkioisen taulukon jonka alkiot ovat * tyyppiä Kortti (siis osoittimia Korttirakenne:een). * Kortit talletetaan taulukkoon maittain (järjestys kuten ylläolevassa * luetellussa tyypissä) ja maan sisällä numerojärjestykseen (1..13) **/ Kortti * korttipakka(); // testiohjelma // komentoriviltä annetaan parametreja pareittain lopun // testausta varten int main(int argc, char *argv[]) { Kortti a; Kortti *P; int i, m, n; // testataan ensin yhden kortin luomista a = uusikortti(Hertta, Assa); if (a) printf("%s\n", a->ulkoasu); else printf("Ei onnistunut\n"); free(a); a = NULL; // testataan viallista korttia a = uusikortti(Ruutu, 15); if (!a) printf("Viallisesta tuli NULL\n"); else printf("Viallisesta tuli kortti???\n"); // luodaan koko korttipakka P = korttipakka(); // tulostetaan pari esimerkkiä printf("P[%d] %s%s == %s\n", Ruutu*Numeroita + Kaksi, maat[Ruutu], numerot[Kaksi], P[Ruutu*Numeroita + Kaksi]->ulkoasu); printf("P[%d] %s%s == %s\n", Pata*Numeroita + Kuningatar, maat[Pata], numerot[Kuningatar], P[Pata*Numeroita + Kuningatar]->ulkoasu); // otetaan vielä komentoriviltä esimerkkejä i = 1; while (i <= argc-2) { m = atoi(argv[i])-1; n = atoi(argv[i+1])-1; printf("P[%d] == %s\n", m*Numeroita + n, P[m*Numeroita + n]->ulkoasu); i += 2; } // vapautetaan kaikki kortit for (i = 0; i < Maita*Numeroita; i++) { free(P[i]); P[i] = NULL; } // vapatutetaan korttipakka free(P); P = NULL; printf("Kaikki ok\n"); return 0; } // main()