80 likes | 222 Views
qsort ja failid. Risto Heinsar ja Ott Madis Ozolit. qsort. Lihtne ja optimaalne viis sorteerida massiive Kiirusest Halvimal juhul sama kiire, kui mullsort (tehakse kuni n 2 vahetust) Keskmiselt tunduvalt kiirem (tehakse kuni n* log n vahetust)
E N D
qsort ja failid Risto Heinsar ja Ott Madis Ozolit
qsort • Lihtne ja optimaalne viis sorteerida massiive • Kiirusest • Halvimal juhul sama kiire, kui mullsort (tehakse kuni n2 vahetust) • Keskmiselt tunduvalt kiirem (tehakse kuni n*log n vahetust) • Nt sorteerides 100 arvu:1002 = 10 000 vahetust100*log(100) = 100 *2 = 200 vahetust Risto Heinsar & Ott Madis Ozolit
qsort funktsioon • qsort funktsiooni protüüp: voidqsort (void* base, size_tnum, size_tsize, int (*compar)(constvoid*,constvoid*)); • Parameetrid: • base – viit massiivi kõige esimesele elemendile • num – mitu elementi on massiivis • size – ühe elemendi suurus • compar – viit võrdlusfunktsioonile Risto Heinsar & Ott Madis Ozolit
qsort näide #include <stdio.h> #include <stdlib.h> intvordlusFunktsioon(const void *a, const void *b); intmain(void) { inti, arvud[] = {40, 10, 100, 90, 20, 25}; qsort(arvud, 6, sizeof(int), vordlusFunktsioon); for (i= 0; i< 6; printf("%d ",arvud[i++]) ; return 0; } intvordlusFunktsioon(const void *a, const void *b) { if(*(int*)a > *(int*)b) return 1; else if(*(int*)a < *(int*)b) return -1; else return 0; } Risto Heinsar & Ott Madis Ozolit
Failideks jagamine • Suurte koodide puhul on sarnase eesmärgiga funktsioonid mõistlik jagada põhikoodist eraldiolevatesse failidesse • Võimalik lisada eelnevalt valmistatud koodifaile ja teeke oma programmi täiendava funktsionaalsuse loomiseks • Kasutatavad failid"minukood.h"– header ehk päise fail, mis sisaldab eelkõige funktsiooni prototüüpe. Täiendavalt ka (klasse), muutujaid jms"minukood.c" – funktsioonide sisu, mis soovitakse programmile lisada Risto Heinsar & Ott Madis Ozolit
Mitme faili kasutamise meetodid • Projektide kasutamine • Eeldab teekide lisamist (#include "minupais.h") • Eeldab IDE tuge projektidele. Nt Codeblocks, Visual Studio, Eclipse jt • Käsurealt kompileerimine • Eeldab teekide lisamist (#include "minupais.h") • gcc -o minuprogramm fail1.c fail2.c -lm • Otsene lisamine • Täiendavat päisefaili ei kasutata • Koodile lisatakse teise koodifaili asukoht (#include "minukood.c") Risto Heinsar & Ott Madis Ozolit
Käpp soojaks • Lae alla prog2 -> Koodinaited -> failideks-jagamine -> *.* • Tutvu failide ülesehitusega • kompileeri failid käsurealt: gcc-o programminimifail1.c fail2.c –lm • Veendu programmi töötamises • NB! MS Windowsis vaja lisata kompilaatori asukoht Environment Variables -> System Variables -> PATH alla! • Linuxis töötab vaikimisi Risto Heinsar & Ott Madis Ozolit
Tunnitöö • Ava kood"10_tunnikood.c" • Tekitapeaprogrammijaokspäisefail ("nimi.h") • Deklareerifunktsioonidpäisefailis • Realiseerifunktsioonideraldikoodifailis • Tehtedrealiseerijärgnevalt: Kasutajaltküsitakse 2 reaalarvu, vastavatehtetulemustagastataksefunktsioonitöötulemusena • Sortiminerealiseerijärgnevalt: Kasutajaltküsitaksenreaalarvu, need salvestataksemassiiviningkasutaqsortfunktsioonisortimiseks • Kompileerifailidkäsurealt Risto Heinsar & Ott Madis Ozolit