58127-1 C-ohjelmointi Liisa Marttinen Uusintakuulustelu 21.1.2000 Kirjoita jokaiseen vastauspaperiin oma nimesi, nimikirjoituksesi, syntymäaikasi tai opiskelijanumerosi sekä kokeen nimi ja päiväys. Kaikki kokeessa käytettävä materiaali annetaan koetilaisuudessa. Saat käyttää vain ANSI-standardin mukaisia kirjastofunktioita. 1. Kirjoita ohjelma, joka tulostaa alla olevan mallin mukaisen vinoneliön. Ohjelma pyytää vinoneliön sivun pituuden käyttäjältä. Vinoneliö tehdään kirjoittamalla merkkejä x ja välilyöntejä sopiviin paikkoihin. Alla on esimerkit vinoneliöistä, joiden sivun pituudet ovat 3 ja 4. (15 p) x x xxx xxx xxxxx xxxxx xxx xxxxxxx x xxxxx xxx x 2. 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. (15 p) 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. (15 p) 4. Kirjoita ohjelma, joka saa komentorivin parametreina joukon tiedostonimiä ja tulostaa niiden sisältämien rivien lukumäärän tiedostoittain. Jos jotain annettua tiedostoa ei ole olemassa, ohjelma tulostaa tämän nimen kohdalla virheilmoituksen, mutta jatkaa muiden tiedostojen rivimäärien tulostamista. (15 p) ONNEA KOKEESEEN! #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; }