Tietojenkäsittelyopin laboratorio 30.01.96
Tik-76.002 Tietotekniikka B Sivu 1 (2)
Kirjoita JOKAISEEN palauttamaasi paperiin nimesi, opintokidan numero, myös tarkistuskirjain, "Tietotekniikka B, tentti 30.01.96" sekä allekirjoituksesi. Vastaa tehtäviin 1, 2 ja 6 yhdelle paperille, muut tehtävät 3, 4 ja 5 kukin omalle paperilleen ja palauta paperit tehtävänumeron perusteella omaan pinoonsa. Jos et vastaa johonkin kysymykseen, palauta kuitenkin ko. pinoon tyhjä paperi, jossa on tehtävänumero ja em. tiedot. Jätä paperien yläreunaan vähintään 3 riviä tyhjää tilaa pisteytystä varten.
Kaikissa ohjelmointitehtävissä on käytettävä ANSI-C-kieltä (C++ ei kelpaa).
1) Seuraavan ohjelman tarkoituksena on lukea stdin-tietovirrasta joukko lukuja ja tutkia sen jälkeen,montako kertaa ja millä paikoilla tietty luku esiintyy em.lukujenjoukossa. Ohjelma on syntaktisesti oikein, mutta siinä on kuusi toiminnallista virhettä. Mitkä ne ovat? (6p)
#include <stdio.h>
#define MAX 10
void search(int data, int places[], int numbers[], int size)
{
int i;
for (i = 0; i <= size; i++)
if (numbers [i) = data)
places[i) = 1;
}
int main()
{
int array[MAX), locations[MAX);
int i, number, count = 1;
printf("Give %d numbers \n", MA.X);
for (i = 0; i < MAX; i++)
scanf ("%d", array[i)) ;
printf("Give test number\n");
scanf("%d", &number);
search(number, array, locations, MAX);
for (i = 0; i < MAX; I++)
if (locations[i)) {
printf("Location: %d\n", i);
count++;
}
printf("The number occurred in %d places\n", count);
return 0;
}
2) Kidoita seuraavat C-funktiot, joiden prototyypit on annettu.
a) Funktio, joka laskee ja palauttaa annetun reaalilukutaulukon alkioiden keskiarvon. (2p)
double average(double table[], int table_size);
b) Funktio, joka saa argumenttina merkkijonon ja joka palauttaa toisessa argumentissaan saman merkkijonon käännettynä päinvastaiseen järjestykseen. Esimerkiksi merkkijono "HUIHAI" muuttuisi muotoon "IAHIUH". Voit olettaa, että merkkijonolle string2 on etukäteen allokoitu riittävästi tilaa. (2p)
void reverse_string(char *string1, char *string2);
c) Kirjoita esimerkki kummankin funktion käytöstä sekä tarvittavat muuttujien määrittelyt. (1+1p)
3) Suunnittelet asiakasrekisteriä Oy Valopää Ab:lle, joka valmistaa standardoituja hilavilkuttimia. Rekisteriin tulee pystyä tallettamaan kustakin asiakkaasta seuraavat tiedot:
- Nimi, yhteystiedot
- Myynninkokonaisarvoedellisenäkalenterivuonnajakuluvanvuodenkuluessakertynytp> myynnin arvo.
- Viimeisen kaupan päivämäärä
a) Esitä tietorakenne, jonka avulla kyseinen rekisteri voidaan esittää keskusmuistissa. (3p)
b) Kirjoita funktio, jokatulostaa stdoutiin luettelon niistä asiakkaista, joiden myynti v. 1995 ylitti argumenttina annetun rahasumman ja joiden kanssa viimeinen kauppa on solmittu ennen 1.7.95. (3p)
4) Kaksisuuntainen linkitetty lista on dynaaminen tietorakenne, jossa alkiot on linkitetty peräkkäin listaksi ja kustakin alkiosta on osoitin sekä listan seuraavaan että edelliseen alkioon.
a) Esitä tietorakenne ja muut tarpeelliset määrittelyt, joiden avulla voi toteuttaa kaksisuuntaisen listan, jossa alkiot ovat kokonaislukuja. (2p)
b) Kirjoita funktio, joka tulostaa listan kaikki alkiot peräkkäin stdoutiin. (2p)
c) Oletetaan lisäksi, että listan alkiot ovat suuruusjärjestyksessä. Kirjoita funktio, joka lisää annetun kokonaisluvun listaan oikealle paikalle. (3p)
Ota huomioon se, että lista voi olla myös tyhjä.
5) Kirjoita C-ohjelma, joka ratkaisee Newtonin menetelmällä seuraavan yhtälön suurimman reaalijuuren ja tulostaa sen kolmen desimaalin tarkkuudella. (5p)
e^x = sin x
6) Arvioi kysymyksiin vastaamiseen käyttämäsi yhteisaika puolen tunnin tarkkuudella.