/* Tässä toteutuksessa esitellään satunnaislukujen generointi. */ #include #define N 1000 /* Seuraavat kirjastotiedostot tarvitaan satunnaislukujen generointiin. */ #include /* Sekalaisia funktioita. */ #include /* Tästä löytyy mm. kellonaika. */ #include /* Kahden luvun keskinäinen paikanvaihto. */ void swap(int*,int*); /* Funktio check_order tarkistaa, onko taulukko järjestyksessä. * Ks. Edellinen tehtävä. */ int check_order(int[],int); /* Funktio order järjestää taulukon alkiot. Se kutsuu funktiota * check_order. */ void order(int[],int); int main() { int t[N]; int n,i; time_t seed; printf("Enter size of array: "); scanf("%i",&n); /* Tietokoneella generoidut satunnaisluvut eivät ole oikeasti * satunnaisia, vaan jonkin monimutkaisen laskutoimituksen tuloksia -- * ne vaikuttavat satunnaisilta. Yleensä nämä generaattorit täytyy * alustaa, ja seuraava 'satunnaisluku' generoidaan edellisten lukujen * avulla. Jos halutaan että ohjelman generoimat luvut ovat erisuuria * eri ajokerroilla, kannattaa satunnaislukugeneraattori alustaa * esim. kellonajalla. Sitä varten sisällytettiin kirjastotiedosto time.h. */ seed=time(NULL); /* time(NULL) antaa sekuntien määrän tietystä viiteajasta. * Viiteaika on 1.1.1970 klo 00:00 'Greenwichin' aikaa. */ printf("\nTime elapsed since 1 Jan 1970:\n"); printf("%i years, %i days, %i hours, %i minutes and %i seconds\n\n", (seed/3600/24/365),(seed/3600/24)%365,(seed/3600)%24,(seed/60)%60,seed%60); /* Generaattori alustetaan komennolla srand */ srand(seed); /* Sijoitetaan taulukkoon t satunnaisia kokonaislukuja väliltä 0...100. * Funktio rand() antaa satunnaisen kokonaisluvun väliltä 0...RAND_MAX, * missä RAND_MAX on stdlib.h-tiedostossa määritelty vakio. Satunnaisluvun * väliltä 0...100 saa laskemalla luvun rand() jakojäännöksen jaettaessa 100:lla. */ printf("Original order:\n\n"); for(i=0;it[i+1]) return 0; } return 1; } /* Jos peräkkäiset alkiot ovat väärässä järjestyksessä, vaihdetaan * niiden paikat. Käydään näin läpi koko taulukko, ja tarkastetaan, * onko taulukko järjestyksessä. Jos ei ole, toistetaan menettely. */ void order(int t[],int n) { int i; /* Jos check_order palauttaa 0, taulukko ei ole järjestyksessä. */ while(!check_order(t,n)) { for(i=0;it[i+1], vaihdetaan niiden paikat keskenään. */ if(t[i]>t[i+1]) swap(&t[i],&t[i+1]); } } }