html>C-ohjelmointi, laskuharj. 1

C-ohjelmointi syksy 1999

Harjoitus 3 (4.-8.10.1999)

Tee C-ohjelmasi heti alusta alkaen tietokoneella. Pisteitä jaetaan vain tietokoneella koetelluista ratkaisuista. Varmistaudu ohjelmasi toimivuudesta kääntämällä ja suorittamalla sitä, tarpeen mukaan erilaisilla testiaineistoilla. Vältä sellaisten piirteiden käyttöä harjoituksissa, joita ei vielä ole käsitelty kurssilla.

1. Kirjoita kirjastofunktioita käyttämättä funktio, joka lajittelee kokonaislukutaulukon alkiot suuruusjärjestykseen.

2. Kirjoita funktio, joka laskee kirjaimien 'a', ... 'z' prosenttiosuudet syötteestä. Tässä voit käyttää apuna sopivia kirjastofunktioita. Mitä ongelmia aiheuttavat kirjaimet ä, å ja ö? Miten voisit laskea myös näiden kirjaimien prosenttiosuudet?

3. Kirjoita reursiivinen funktio, joka laskee kahden luvun suurimman yhteisen tekijän (syt).
Voit käyttää hyväksi tietoa syt(a,b) = syt (b, a%b), kun a > 0 ja b > 0 (% tarkoittaa jakojäännöstä.) Ps. Rekursiosta on syytä tulla ulos heti kun a%b on nolla ja palauttaa b:n arvo eli esim. syt(4,2) = syt(2,4%2), kun a%b eli 4%2 == 0, => syt = 2 (=b). Jos a tai b on 0, niin syt = 0 eli syt(0,b) => syt = 0 ja syt(a,0) => syt = 0.

4. Kirjoita funktio, joka tutkii, onko annettu merkkijono palindromi. Palindromi on merkkijono, joka on sama luettuna etuperin ja takaperin. Huom! välilyöntejä ei huomioida ollenkaan palindromissa. Tunnettu palindromi on 'saippuakauppias', mutta myös 'innostunut sonni' ja 'sinä ja jänis' ovat palindromeja.

5. Kirjoita ohjelma, joka laskee syötteestä eripituisten sanojen frekvenssit tyyliin 'pituus 1: 30 kpl'. Sana päättyy välilyöntiin tai rivinvaihtomerkkiin. Voit olettaa, että sanat ovat korkeintaan 80 merkin mittaisia.

6. Kirjoita ohjelma, jolla voit käsitellä tavallista 52 kortin korttipakkaa. Kirjoita ainakin seuraavat funktiot:

   
 sekoita (int pakka[], int kortteja)                /*sekoittaa korttipakan*/
 jaa (int pakka[], int kasi[],int kortteja,  int n) /*jakaa pelaajalle n korttia eli siirtää n */
                                /*seuraavaa korttia korttipakasta taulukkoon kasi*/
      
 Käytä satunnaislukujen generointiin standardikirjaston funktioita:
   void srand (unsigned int_seed)   asettaa seed:n rand-satunnaislukujen
                                    uudeksi siemenluvuksi
                                     
   int rand (void)                  palauttaa satunnaisluvun väliltä
                                    0-RAND_MAX. RAND_MAX on vähintään 32767.
   Esimerkiksi:  
     srand(time(NULL)); /*time (NULL) gives the new seed for rand() */ 
     rand()%(n+1);  /* gives a random number between 0 .. n */
     rand()%n+1;    /* gives a random number between 1 .. n */
                                     
Vihje: Korttipakassa on neljä maata, joissa jokaisessa on 13 korttia. Voit kuvata kortin kokonaisluvuksi sopimalla, että arvot 0-12 ovat pataa, 13-25 herttaa, 26-38 ruutua ja 39-51 ristiä. Tämän jälkeen saat kortin maan ja arvon seuraavasti: olkoon kortin int-arvo n. Tällöin maa = n/13, arvo = n%13.