28127-1 C-Ohjelmointi Uusintakuulustelu 18.8.2000 1. Kirjoita ohjelma, joka lukee kaksi päiväystä muodossa pp.kk.vvvv ja ilmoittaa niiden välisen eron päivinä. Ota ratkaisussasi huomioon myös karkausvuodet. Vuosi on karkausvuosi, jos se on jaollinen neljällä. Kuitenkin sadalla jaollisista vuosista karkausvuosia ovat vain neljälläsadalla jaolliset vuodet. 2. Kirjoita ohjelma, joka tutkii, onko komentorivin parametrina 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. 3. Yksisuuntaiseen linkitettyyn listaan on talletettu merkkejä niin, että listan jokainen alkio sisältää yhden merkin ja osoittimen listan seuraavaan alkioon. a) Anna tarvittavat rakenteet (structures) listan ja sen alkioiden käsittelemiseen. b) Kirjoita funktio, joka luo tyhjän listan. c) Kirjoita funktio list_reverse, joka kääntää yksisuuntaisen linkitetyn listan linkit. Siis listan ensimmäisestä solmusta tulee viimeinen, toisesta solmusta toiseksi viimeinen jne. 4. Eräs C-kurssin innokas opiskelija on kirjoittanut seuraavan, paperin kääntöpuolella olevan C-ohjelman parhaansa yrittäen ja tietenkin ilman kommentteja. Tällaisena ohjelma ei kuitenkaan aivan toimi niin kuin sen pitäisi. Selvitä, mitä ohjelma yrittää tehdä. Kerro, mitä virheitä ohjelmassa on. Perustele myös, miksi mielestäsi kyseessä on virhe. Näytä, kuinka korjaisit ohjelman toimivaksi. #include int longest(char **p, char *r) { char *s,*t; int max=0, len; while(*p++) { if (len=strlen(*p) > max ) { max=len; s=*p; } p++; } t=s; while(*r++ = *s++); r=t; return s - t; } int main () { int pit; char pisin_rivi[80]; static char *tptr[5] ={ "Ensimmäinen rivi", "Toinen rivi", "Ja tässä kolmas rivi", "Neljäs on riveistä kaikkein pisin", "Viides ja viimeinen" }; char *pp; pp=pisin_rivi; pit= longest(tptr,pp); printf("%d merkkiä: %s\n",pit, pp); return 0; }