80 likes | 258 Views
qsort ja failid. qsort. Lihtne ja optimaalne viis sorteerida massiive Kiirusest Halvimal juhul sama kiire, kui mullsort (tehakse kuni n 2 vahetust) Keskmiselt tunduvalt kiirem (tehakse n*log2(n) vahetust)
E N D
qsort • Lihtne ja optimaalne viis sorteerida massiive • Kiirusest • Halvimal juhul sama kiire, kui mullsort (tehakse kuni n2 vahetust) • Keskmiselt tunduvalt kiirem (tehakse n*log2(n) vahetust) • Nt sorteerides 100 arvu:100^2 = 10 000 vahetust100*log2(100) = 100 *6.6 = 660 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, struktuure 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. 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 (ebaeetiline) • 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 programminimi fail1.c fail2.c –lm • Veendu programmi töötamises • NB! MS Windowsis vaja lisata kompilaatori asukoht Environment Variables -> System Variables -> PATH alla! (geany kasutajatel olemas) • Linuxis töötab vaikimisi Risto Heinsar & Ott Madis Ozolit
Tunnitöö • Ava kood„05_tunnikood.c" • Deklareerifunktsioonide prototüübid ja muu vajalik päisefailis • Realiseerifunktsioonideraldikoodifailis • Tehtedrealiseerijärgnevalt: Kasutajaltküsitakse 2 reaalarvu, vastavatehtetulemustagastataksefunktsioonitöötulemusena ning kuvatakse väljakutsunud funktsioonis (mitte arvutusfunktsioonis) • Sortiminerealiseerijärgnevalt: Kasutajaltküsitaksenreaalarvu, need salvestataksemassiiviningkasutaqsortfunktsioonisortimiseks • Kompileerifailidkäsurealt • Tundus liiga kerge? Tee sama struktuuri char välja alusel! Risto Heinsar & Ott Madis Ozolit