Ülesandeks on luua programm, mis suudab analüüsida ürituse külastajate vanuselist kuuluvust. Sisendiks tuleb teadmata arv külaliste vanuseid, kuniks programmi kasutaja sisestab nulli. Sellega katkestatakse lugemine ja väljastatakse statistika.
Grupeerimise nõuded:
- Kõik alla 18 aastased grupeeritakse kui noored
- Üle 18 aastaste kohta luuakse järjest 9 vanusegruppi, sammuga 5 eluaastat (nt 18 – 22, 23 – 27 jne)
- Kõik, kelle vanus on suurem kui varasematesse gruppidesse mahtus, lahterda vanurite alla.
Andmestruktuur
Loendurid paiknevad massiivina, mille pikkus on määratud makroga GROUPS . Iga pesa massiivis on eraldi loendur vastavale vanusegrupile.
- Indeksiga GROUPS - 1 hoitakse eakate loendurit
- Indeksitega GROUPS - 2 hoitakse noorte loendurit
- Indeksid 0 … GROUPS - 3 on jaotatud ühtlaselt vanusegruppidele. Näiteks indeks 0 on vanusevahemik 18 – 22; indeks 1 on vahemik 23 – 27 jne.
Programmi nõuded:
- Grupeerimise väärtused peavad olema kergesti seadistatavad makrote abil
- Gruppide arv
- Grupi samm
- Noorimate grupi ülemine piir
- Ülejäänud programm peab olema võimeline vaid makrote väärtuste muutmise peale kohanduma uute vahemikega.
Nõutud funktsioonid
Selle ülesande lahenduse raames peaksid looma kolm funktsiooni
- Kasutaja sisendi valideerimiseks – kas see oli lubatud vahemikus
- Isiku vanusegrupi indeksi leidmiseks. Grupi indeks tuleb tagastada funktsiooni poolt ja salvestada idx muutujasse.
- Tulemuste väljastamiseks.
Võid luua ka neljanda funktsiooni, et programm struktuuri veelgi paremaks muutuja. Selleks sobiks algkoodis main funktsioonis oleva lõpmatu tsükli viimine eraldi funktsiooni.
Programmi struktuur
Oleme andnud sulle ette programmi üldise struktuuri koos vajalike makrotega. Peaksid neid kasutama, et programm
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 41 42 |
#include <stdio.h> /* Number of age groups in total */ #define GROUPS 11 /* Array position for minors group */ #define GROUP_MINOR (GROUPS - 2) /* Array position for elders group */ #define GROUP_ELDER (GROUPS - 1) /* Group size*/ #define GROUP_STEP 5 /* Upper bound for minors */ #define MINOR_UPPER_BOUND 17 /* Calculates lower bound for elders */ #define ELDER_LOWER_BOUND (MINOR_UPPER_BOUND + (GROUP_STEP * (GROUPS - 2))) int main(void) { int ageGroups[GROUPS] = {0}; int idx; /* Infinite loop for input*/ while (1) { /* Grab user input (call your function!) */ /* Check for break condition (age 0)*/ /* Determine the index (call your function!) */ /* idx = YourFunctionName()*/ /* Add to the age group counter */ ageGroups[idx]++; } /* Pint the results (Call your function!) */ return 0; } |
Algoritm
Oleme ka kirjeldanud ära suurema osa algoritmist, mis sul realiseerida tuleb. Mõned arvutused oleme sulle ka siiski jätnud välja mõelda – näiteks kuidas leida vanusevahemike otspunktid väljundis ning ka veidi massiivi indekseerimist.
Näidis
Siin on näha programmi üldine käitumine. Näha on ka silumise jaoks tehtud lisaväljatrükk mis algab DEBUG trükkimisega – see on kasulik enesekontrolliks mis massiivi indeks lõpuks välja arvutati – st mis loendurit lõpuks ikkagi suurendati. Valmisprogrammis seda olema ei pea, kuid arenduse juures tasub kindlasti välja trükkida erinevaid väärtusi enesekontrolliks!
NB! Kui testid oma rakendust, proovi muuta makrosid GROUPS ja GROUP_STEP ning veendu, et kogu programm kohandub muudatustele!
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 |
This program categorizes participants of the event into age brackets! To stop entry and show statistics, enter 0 or a negative number at any point! Enter participants age: 1 DEBUG: ind = 9 Enter participants age: 15 DEBUG: ind = 9 Enter participants age: 17 DEBUG: ind = 9 Enter participants age: 18 DEBUG: ind = 0 Enter participants age: 22 DEBUG: ind = 0 Enter participants age: 23 DEBUG: ind = 1 Enter participants age: 45 DEBUG: ind = 5 Enter participants age: 62 DEBUG: ind = 8 Enter participants age: 63 DEBUG: ind = 10 Enter participants age: 99 DEBUG: ind = 10 Enter participants age: 0 Minors: 3 Ages 18 - 22: 2 Ages 23 - 27: 1 Ages 28 - 32: 0 Ages 33 - 37: 0 Ages 38 - 42: 0 Ages 43 - 47: 1 Ages 48 - 52: 0 Ages 53 - 57: 0 Ages 58 - 62: 1 Elters: 2 |