Labori materjal
- Slaidid: Qsort
- Slaidid: Koodi tükeldamine
- Näidisprojekt koodi tükeldamisest: https://blue.pri.ee/ttu/files/iax0584/demokood/division_to_files.zip
Laboriülesanded
Selles laboris on kaks ülesannet.
- Esimene ülesanne koosneb kahest baasosast ja edasijõudnute lisast.
- Teine ülesanne koosneb baasülesandest ja edasijõudnute lisast.
Ülesanne 1: Quicksort
Selle ülesande eesmärk on harjutada qsort() funktsiooni kasutamist ning koodi tükeldamist erinevate koodifailide vahel, sealjuures alustad oma esimese kergesti lisatava teegifaili loomist. Aluskoodis on juba koodi tükeldus failidesse sinu eest juba tehtud.
Lae alla aluskood: https://blue.pri.ee/ttu/files/iax0584/aluskoodid/5_1_qsort_task_basecode.zip
NB! Aluskood sisaldab tükke mõlema baasosa ja edasijõudnute osa jaoks!
Nõuded
- Realiseeri vajalikud funktsioonid mis on ette antud sulle erinevates päisefailides prototüüpidena. Funktsiooni realisatsioon peab olema päisefailiga samanimelises .c koodifailis
- Kutsu välja vajalikud funktsioonid andmete sorteerimiseks ja ekraanile kuvamiseks main funktsiooni switch lausest.
- Kompileeri programm kokku mitmest koodifailist – vastavalt struktuurile mis oli antud aluskoodis. Kasuta kompileerimiseks käsurida (võid kasutada ka Makefile’i kui oskad).
Ülesande hinnatavad alamosad
Esimese hinnatava osa jaoks peavad töötama menüüst valikud 1 ja 2. Selle sooritamiseks pead sa
- Realiseerima qsort võrdlusfunktsioonid täisarvudest ja murdarvudest koosneva massiivi jaoks
- Kutsuma välja qsort funktsiooni mõlema eelnimetatud massiivi sorteerimiseks ning väljatrükiks menüüs
Teise hinnatava osa jaoks peavad töötama menüüst valikud 3 ja 4. Selle sooritamiseks pead sa
- Realiseerima qsort võrdlusfunktsioonid struktuurimassiivi sorteerimiseks eesnime ja töösuhte pikkuse järgi
- Realiseerima struktuurimassiivi väljatrüki funktsiooni.
- Kutsuma välja qsort funktsiooni struktuurimassiivi sorteerimiseks vastavalt menüü valikule ning seejärel massiivi väljatrüki funktsiooni
Edasijõudnute ülesande hinnatava osa jaoks peab töötama menüüst valikud 5. Selle sooritamiseks pead sa
- Realiseerima qsort võrdlusfunktsioonid struktuurimassiivi sorteerimiseks perenime järgi. Kui perenimed on samad, tuleb teha täiendav otsus sorteerimiseks eesnime alusel.
- Kutsuma välja qsort funktsiooni struktuurimassiivi sorteerimiseks vastavalt menüü valikule ning seejärel massiivi väljatrüki funktsiooni
- Kutsuma välja qsort funktsiooni struktuurimassiivi sorteerimiseks vastavalt menüü valikule ning seejärel massiivi väljatrüki funktsiooni
Testimine
Järgnev näide sisaldab kõiki kolme hinnatavat osa (1 ja 2 baasosa ning edasijõudnute osa)
Ülesanne 2: Teekide kasutamine (covid-data)
Selles ülesandes tutvume esimest välise teegi (libcurl) lisamisest oma programmi, mille abil on võimalik näiteks kasutada internetis olevaid APIsid ja faile internetist alla laadida. Kasutame neid Eesti riigi avaandmete alla laadimiseks. Jätkame programmi tükeldamise harjutamisega.
NB! Ülesande lahendamine on kordades lihtsam UNIX põhistel süsteemidel (Nt Linux). Windowsil ülesande lahendamiseks on vaja teha täiendav seadistus ning muuta osa ette antud lähtekoodist!
Lae alla aluskood: https://blue.pri.ee/ttu/files/iax0584/aluskoodid/5_2_covid_starter.zip
Nõuded
- Kasuta põhjana sulle antud aluskoodi
- Lae alla Eesti Covid-19 avaandmed (ette antud aluskoodis)
NB! Avaandmeid uuendatakse korra nädalas! - Avaandmete spetsifikatsioon
- Kuva viimase 14 päeva kinnitatud nakatumised (päev ja nakatumiste arv)
- Kuva top10 kõige suurema nakatumiste arvuga päeva (päev ja nakatunute arv)
- Minimaalselt peab olema kood tükeldatud kolme koodi ja päisefaili
- file_helper.c ja file_helper.h on faili allalaadimiseks ja ettevalmistuseks (ette antud, muudatusi pole vaja teha)
- data_processor.c ja data_processor.h on failist andmete lugemiseks ja töötlemiseks
- main.c ja main.h on programmi töövoo juhtimiseks ja üldisteks makroteks
- Soovi korral võid näiteks faili lugemise lüüa lahku andmete töötlemisest
- Kompileeri kõik koodifailid kokku kas käsurealt või kasutades Makefile’i
Soovituslik töövoog
- Tutvu etteantud koodifaiide struktuuri ja sisuga
- Kommenteeri sisse enda eelistatud andmefaili formaat (kas tühikute või komadega eraldatud andmed)
- Kompileeri ja proovi kas allalaadimine töötab. Kompileerimiseks on vajalik lipp -lcurl
- Lisa
main.h faili struktuuri kirjeldus andmete mälus hoidmiseks ning teised vajalikud makrod suurustele
Vihje: sul ei ole vaja kõike failist loetut mälus hoida! Vali välja vaid olulised väljad! - Kodeeri
data_process.c faili andmefailist andmete lugemise funktsioon. Lisa selle funktsiooni prototüüp
data_process.h päisefaili ning väljakutse main funktsiooni.
NB! Kas märkasid, et CSV failil oli esimene rida päis!?
Vihje: konkreetse andmevälja ignoreerimiseks saad scanf funktsioonis kasutada formaati %*s – tärn tähistab, andmeid sellele formaadile vastavale osale ei salvestata. St ignoreeritakse kõike kuni järgmise tühiku või reavahetuseni. Kui kasutad tärni formaadis ei tohi selle kohta muutujat scanf parameetrina anda.
Kompileeri ja testi kas andmed loetakse edukalt sisse - Loo funktsioon andmete väljatrükiks, et kuvada viimase 14 päeva statistika.
Vihje: Kasuta ära oma teadmist massiividest ja viida-aritmeetikast mida rakendasime esimesel nädalal viitade tunnis (ülesanne 1, osa 2)! Nii jääb väljatrüki funktsioon lihtsaks ja korduvkasutatavaks järgmise punkti jaoks. - Loo
qsort jaoks võrdlusfunktsioon ning kutsu
qsort välja andmete sorteerimiseks. Kuva top 10 kõrgeima nakatunute arvuga päeva.
Vihje: Kui kasutasid eelmise punkti juures viida-aritmeetika ja jätsid väljatrüki funktsiooni lihtsaks, siis nüüd saad seda sama funktsiooni ka siin ära kasutada!
Testimine
NB! Väljundis on koos baasülesande ja edasijõudnute ülesande lahendused!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
risto@risto-wk-tux:~/Nextcloud/work/ttu/teaching/_generic/prog2/lab/wk5_div/t2_covid/covid_solution$ ./covid_stats Warning! The file opendata_covid19_tests_total.txt already exists! Are you sure you wish to download again? Enter [Y] or [N] n Last 14 days Date Cases 1. 2023-02-07 48 2. 2023-02-08 55 3. 2023-02-09 54 4. 2023-02-10 52 5. 2023-02-11 21 6. 2023-02-12 28 7. 2023-02-13 76 8. 2023-02-14 37 9. 2023-02-15 47 10. 2023-02-16 67 11. 2023-02-17 48 12. 2023-02-18 24 13. 2023-02-19 23 14. 2023-02-20 53 Top 10 days Date Cases 1. 2022-02-15 8467 2. 2022-02-03 8045 3. 2022-02-04 7849 4. 2022-02-01 7243 5. 2022-01-28 7171 6. 2022-02-05 7082 7. 2022-02-18 6996 8. 2022-02-02 6886 9. 2022-02-17 6751 10. 2022-02-08 6704 Date range: 2023-02-07 - 2023-02-13 total cases 334 Date range: 2023-02-14 - 2023-02-20 total cases 299 Case count decreased by 11.71% |
Edasijõudnute ülesanne
- Leia nakatumiste arv viimase 7 päeva jooksu
- Leia nakatumiste arv sellele eelneva 7 päeva jooksul
- Väljasta perioodi vahemikud ja nakatunute koguarv neil perioodidel
- Leia ja kuva kas nakatumine kahe võrreldava perioodi vahel on vähenenud, kasvanud või jäänud samaks. Näita protsenti kahe komakohaga.
Vihje: Baasülesande raames sorteerimise andmemassiivi terviklikult ära ja neid andmeid me kasutada ei saa ilma uuesti sorteerimata. Küll aga saame enne sorteerimist teha osalise koopia andmetest. Koopia saad teha (enne kui qsort välja kutsutakse) kasutades funktsiooni memcpy() . Uuri parameetreid ja meenuta viida-aritmeetikat alguspunkti määramiseks!
MS Windows
Antud ülesannet on võimalik lahendada ka Windowsil, kuid selleks tuleb teha mõned täiendavad liigutused. Sammud on testitud ja töötasid kevadel 2022 kasutades chocolatey kaudu installeeritud 64 bitist MinGW-d (see oli osa lihtsast tarkvara paigaldamise juhendist Windowsil kasutades käsurida). Väljavõte eelmise aasta vestlusest, kus sammud kirja said (inglise keeles)
1. Install libcurl on Windows. Uses chocolatey package manager
choco install curl
2. Make the library (dll file) available to the compiled program. Copy libcurl-x64.dll from libcurl installation directory to your program directory (assumes 64-bit compiler).
3. You need to download CA certificate so cURL can verify the certificate on the opendata website https://curl.se/ca/cacert.pem.
4. You need to specify the certificate authority file location to the code. Add this to the setup of the download in the file_helper.c, replacing the path\\to\\file with the path to the downloaded .pem file.
curl_easy_setopt(curl_handle, CURLOPT_CAINFO, "path\\to\\file");
5. You need to rewrite the check if a file is already downloaded because that uses POSIX library available on UNIX systems – unistd.h. You should rewrite it with windows solution of that. Haven’t tested, but you’ll likely find the function BOOL FileExists(LPCTSTR szPath)
in the library io.h
. You may need to add additional Windows-specific libraries.
6. You can only download as CSV with the code provided. To download space delimited, you need to rewrite the ReplaceChars function. Easy option would be to open up a second file pointer for writing to a different file and remove the fseek, Simplest would be to do getchar -> putchar with a check in between for commas to be replaced with spaces.
7. You need to add -I and -L flags to your compiler command line arguments. Mine were:
-I C:\ProgramData\chocolatey\lib\curl\tools\curl-7.81.0-win64-mingw\include\ -L C:\ProgramData\chocolatey\lib\curl\tools\curl-7.81.0-win64-mingw\lib\
Pärast seda tundi peaksid
- Oskama tükeldada oma programmi mitme koodifaili vahel mitmest koodifailist koosnevat programmi kompileerida
- Oskama kasutada qsort funktsiooni
- Mõistma qsort funktsiooni võrdlusfunktsiooni nõudeid ning suutma kirjutada võrdlusfunktsiooni lihtsatele massiividele ning ka struktuurimassiividele
- Teadma viitade eksisteerimisest funktsioonidele ning oskama funktsiooni edastada viita teisele funktsioonile
- Teadma üldistatult samme mis on vajalikud kolmandate osapoolte teekide kasutamiseks ning oskama neid oma programmi kompileerida
Täiendav materjal
- Sorting algorithms visualized
https://www.toptal.com/developers/sorting-algorithms - Big-O cheat sheet
https://www.bigocheatsheet.com - Quicksort algorithm
https://en.wikipedia.org/wiki/Quicksort - Example structure
https://github.com/JackWetherell/c-project-structure - List of common C libraries
https://github.com/oz123/awesome-c