Differences

This shows you the differences between two versions of the page.

Link to this comparison view

programare:teme_2023:tema2_2023_cbd [2023/12/22 04:41]
alin_bogdan.popa [Partea B - Network Packing]
programare:teme_2023:tema2_2023_cbd [2024/01/15 21:49] (current)
alin_bogdan.popa [Changelog:]
Line 1: Line 1:
 ====== Tema 2 - Unix Timestamps ====== ====== Tema 2 - Unix Timestamps ======
  
 +==== Changelog: ====
 +  * 23 Dec 2023 20:35: update schelet de cod typos
 +  * 13 Ian 2023 23:55: adaugat teste pt taskurile 1-8 {{:​programare:​teme_2023:​t2_tests_1-to-8.zip|}}
 +  * 14 Ian 2023 00:55: corectat testele pt taskul 8
 +  * 15 Ian 2024 02:56: adaugat checker {{:​programare:​teme_2023:​t2_checker.zip|}} (thanks Cosmin & Mihnea & Teo pentru debugging la checker noaptea ca hotii)
 +  * 15 Ian 2024 19:57: update checker + reparat teste task 9
 +  * 15 Ian 2024 21:49: update teste sa fie timezone-urile de max 4 caractere
 ==== Responsabili:​ ==== ==== Responsabili:​ ====
   * Alin Popa   * Alin Popa
  
 Termen de predare: Termen de predare:
-  * Deadline soft: **TODO** +  * Deadline soft: **Joi 11 Ianuarie 2024, 23:55** 
-  * Deadline hard: **TODO**+  * Deadline hard: **Duminica 14 Ianuarie 2024, 23:55**
  
 Pentru fiecare zi (24 de ore) de întârziere,​ se vor scădea 10 puncte din nota acordată, până la atingerea deadline-ului hard. Pentru fiecare zi (24 de ore) de întârziere,​ se vor scădea 10 puncte din nota acordată, până la atingerea deadline-ului hard.
  
 ====Întrebări==== ====Întrebări====
-Dacă aveți nelămuriri,​ puteți să ne contactați pe forumul dedicat [[https://​curs.upb.ro/​2023/​mod/​forum/​view.php?​id=80135|temei de casă nr. 1]] sau pe [[https://​teams.microsoft.com/​l/​channel/​19%3a0a648c85e9ed4a2bbb343b5792443551%40thread.tacv2/​Tema%25200?​groupId=1f7c7112-0ea2-4f0b-9131-d5c29590d62c&​tenantId=2d8cc8ba-8dda-4334-9e5c-fac2092e9bac|canalul Temei 1]].\\+Dacă aveți nelămuriri,​ puteți să ne contactați pe forumul dedicat [[https://​curs.upb.ro/​2023/​mod/​forum/​view.php?​id=96053|temei de casă nr. 2]] sau pe [[https://​teams.microsoft.com/​l/​channel/​19%3A894fd875001546b28dec5f997c2097b5%40thread.tacv2/​Tema%202?​groupId=1f7c7112-0ea2-4f0b-9131-d5c29590d62c&​tenantId=2d8cc8ba-8dda-4334-9e5c-fac2092e9bac|canalul Temei 2]].\\
 Nu se acceptă întrebări în ultimele 24 de ore înainte de deadline. Nu se acceptă întrebări în ultimele 24 de ore înainte de deadline.
  
Line 23: Line 30:
 Ne propunem să construim un sistem care simulează [[https://​www.epochconverter.com|Epoch Converter]]. Ne propunem să construim un sistem care simulează [[https://​www.epochconverter.com|Epoch Converter]].
  
-Un Unix Timestamp este un mod standardizat de reprezentare a unui moment în timp, foarte folosit în multe aplicații, framework-uri,​ și sisteme de operare. Un Unix Timestamp este definit ca numărul de secunde care au trecut de la 1 ianuarie 1970, ora 00:00:00.+Un Unix Timestamp este un mod standardizat de reprezentare a unui moment în timp, foarte folosit în multe aplicații, framework-uri,​ și sisteme de operare. Un Unix Timestamp este definit ca numărul de secunde care au trecut de la 1 ianuarie 1970, ora 00:​00:​00 ​(in timezone-ul UTC, fostul GMT, numit popular și "ora Angliei"​).
  
 <​note>​ <​note>​
Line 38: Line 45:
 ===== Schelet de cod ===== ===== Schelet de cod =====
  
-Pentru această temă trebuie să porniți de la scheletul de cod de aici: {{:​programare:​teme_2023:​tema1_schelet.zip|}}+Pentru această temă trebuie să porniți de la scheletul de cod de aici: {{:​programare:​teme_2023:​tema2_schelet.zip|}}.
- +
-În scheletul de cod veți găsi următoarele:​ +
-  * Un Makefile cu reguli care compilează și rulează ''​main.c''​ și respectiv ''​interactive.c''​ +
-  * Un fișier ''​imageprocessing.c''​ în care voi va trebui să completați implementările funcțiilor pentru taskurile 1-6 +
-  * Un fișier ''​interactive.c''​ în care voi va trebui să completați implementarea programului pentru taskul 7 +
-  * Un fișier ''​main.c''​ care **nu trebuie trimis în arhiva cu tema**, scopul lui este să vă ofere un exemplu pentru rularea funcțiilor din celelalte fișiere (ca de exemplu, funcțiile ''​read_from_bmp''​ și ''​write_to_bmp''​). +
-  * Un fișier ''​bmp.c''​ ce conține implementările funcțiilor ''​read_from_bmp''​ și ''​write_to_bmp''​ ce trebuie folosite în temă.+
  
 <note important>​ <note important>​
 Atenție! **Nu** aveți voie să: Atenție! **Nu** aveți voie să:
-  * redenumiți fișierele temei (imageprocessing.c și interactive.c) +  * redenumiți fișierele temei (timelib.c, bitpacking.c,​ planner.c) 
-  * schimbați numărul, tipul, sau ordinea parametrilor funcțiilor din imageprocessing.c și imageprocessing.h+  * schimbați numărul, tipul, sau ordinea parametrilor funcțiilor din timelib.c și timelib.h
   * schimbați sau redenumiți comenzile sau regulile din Makefile   * schimbați sau redenumiți comenzile sau regulile din Makefile
 </​note>​ </​note>​
Line 71: Line 71:
 } TTime } TTime
 </​code>​ </​code>​
 +
 +<​note>​
 +Exemple de rulare:
 +<​code>​
 +timestamp=0 => hour=0; min=0; sec=0
 +timestamp=3659 => hour=1; min=0; sec=59
 +timestamp=1703201916 => hour=23; min=38; sec=36
 +</​code>​
 +</​note>​
  
 <​note>​ <​note>​
Line 89: Line 98:
 } TDate } TDate
 </​code>​ </​code>​
 +
 +<​note>​
 +Exemple de rulare:
 +<​code>​
 +timestamp=0 => day=1; month=1; year=1970
 +timestamp=3659 => day=1; month=1; year=1970
 +timestamp=1703201916 => day=3; month=1; year=2024
 +</​code>​
 +</​note>​
  
 <​note>​ <​note>​
Line 104: Line 122:
 </​code>​ </​code>​
 Funcția trebuie să returneze ziua, luna și anul corespunzătoare timestamp-ului primit, sub forma unei structuri TDate ca la taskul anterior, însă luând în considerare anii bisecți. Un an bisect este un an cu 366 de zile (luna februarie are 29 de zile în loc de 28). Anii bisecți sunt toți anii divizibili cu 4 (e.g. 2004, 2008, 2012) cu excepția anilor care sunt multipli de 100 dar nu și multipli de 400 (exemplu: anii 2000 și 2400 sunt bisecți, dar anii 2100, 2200, 2300 nu sunt). Funcția trebuie să returneze ziua, luna și anul corespunzătoare timestamp-ului primit, sub forma unei structuri TDate ca la taskul anterior, însă luând în considerare anii bisecți. Un an bisect este un an cu 366 de zile (luna februarie are 29 de zile în loc de 28). Anii bisecți sunt toți anii divizibili cu 4 (e.g. 2004, 2008, 2012) cu excepția anilor care sunt multipli de 100 dar nu și multipli de 400 (exemplu: anii 2000 și 2400 sunt bisecți, dar anii 2100, 2200, 2300 nu sunt).
 +
 +<​note>​
 +Exemple de rulare:
 +<​code>​
 +timestamp=0 => day=1; month=1; year=1970
 +timestamp=3659 => day=1; month=1; year=1970
 +timestamp=1703201916 => day=21; month=12; year=2023
 +</​code>​
 +</​note>​
  
 <note important>​ <note important>​
Line 122: Line 149:
 typedef struct { typedef struct {
     char name[5];     char name[5];
-    ​unsigned ​char utc_hour_difference;​+    ​signed ​char utc_hour_difference;​
 } TTimezone } TTimezone
 </​code>​ </​code>​
Line 139: Line 166:
  
 Pentru această funcție, la conversia din Unix Timestamp în formatul Date+Time, trebuie luată în considerare diferența de timp impusă de timezone. Spre exemplu, timestamp-ul ''​1703201916''​ corespunde datei ''​21 decembrie 2023, ora 23:​38:​36''​ dacă acesta este considerat în timestamp-ul UTC (echivalent cu GMT), pentru care ''​utc_hour_difference''​ este 0. Însă același timestamp, într-un timezone în care ''​utc_hour_difference''​ este 2 (spre exemplu, EET) va corespunde datei ''​22 decembrie 2023, ora 01:​38:​36''​ (2 ore mai târziu). Același timestamp, într-un timezone în care ''​utc_hour_difference''​ este -5, va corespunde datei ''​21 decembrie 2023, ora 18:​38:​36''​. Pentru această funcție, la conversia din Unix Timestamp în formatul Date+Time, trebuie luată în considerare diferența de timp impusă de timezone. Spre exemplu, timestamp-ul ''​1703201916''​ corespunde datei ''​21 decembrie 2023, ora 23:​38:​36''​ dacă acesta este considerat în timestamp-ul UTC (echivalent cu GMT), pentru care ''​utc_hour_difference''​ este 0. Însă același timestamp, într-un timezone în care ''​utc_hour_difference''​ este 2 (spre exemplu, EET) va corespunde datei ''​22 decembrie 2023, ora 01:​38:​36''​ (2 ore mai târziu). Același timestamp, într-un timezone în care ''​utc_hour_difference''​ este -5, va corespunde datei ''​21 decembrie 2023, ora 18:​38:​36''​.
 +
 +<​note>​
 +Fie următorul vector de timezone-uri:​ ''​[("​UTC",​ 0); ("​EET",​ 2); ("​PST",​ -8)]''​
 +
 +Exemple de rulare:
 +<​code>​
 +timestamp=1703201916,​ timezone_index=0 => 21-12-2023 23:38:36
 +timestamp=1703201916,​ timezone_index=1 => 22-12-2023 01:38:36
 +timestamp=1703201916,​ timezone_index=2 => 21-12-2023 15:38:36
 +</​code>​
 +</​note>​
  
 <​note>​ <​note>​
Line 157: Line 195:
 <note important>​ <note important>​
 Unix Timestamp-ul trebuie calculat așa cum este el în timezone-ul UTC! Spre exemplu, ''​22 decembrie 2023, ora 01:​38:​36''​ în timezone EET (UTC+2) va corespunde timestamp-ului ''​1703201916''​. Unix Timestamp-ul trebuie calculat așa cum este el în timezone-ul UTC! Spre exemplu, ''​22 decembrie 2023, ora 01:​38:​36''​ în timezone EET (UTC+2) va corespunde timestamp-ului ''​1703201916''​.
 +</​note>​
 +
 +<​note>​
 +Fie următorul vector de timezone-uri:​ ''​[("​UTC",​ 0); ("​EET",​ 2); ("​PST",​ -8)]''​
 +
 +Exemple de rulare:
 +<​code>​
 +21-12-2023 23:38:36 (UTC) => 1703201916
 +22-12-2023 01:38:36 (EET) => 1703201916
 +21-12-2023 15:38:36 (PST) => 1703201916
 +</​code>​
 </​note>​ </​note>​
  
Line 164: Line 213:
 void printDateTimeTZ(TDateTimeTZ datetimetz) void printDateTimeTZ(TDateTimeTZ datetimetz)
 </​code>​ </​code>​
-Funcția afișează la stdout datetime-ul primit, în următorul format: ''​[data] [luna] [anul], [ora]:​[minutul]:​[secunda] [timezone name] (UTC[+/​-][timezone utc hour diff])''​ +Funcția afișează la stdout datetime-ul primit, în următorul format: ''​[data] [luna (cuvânt)] [anul], [ora]:​[minutul]:​[secunda] [timezone name] (UTC[+/​-][timezone utc hour diff])''​ 
-Exemple:+ 
 +<​note>​ 
 +Exemple ​de afișare:
 <​code>​ <​code>​
-25 decembrie 2023, 18:00:05 EET (UTC+2) 
 1 ianuarie 1970, 05:00:00 UTC (UTC+0) 1 ianuarie 1970, 05:00:00 UTC (UTC+0)
-25 decembrie 2023, 14:00:05 EET (UTC-2)+22 decembrie 2023, 01:38:36 EET (UTC+2
 +21 decembrie 2023, 15:38:36 PST (UTC-8)
 </​code>​ </​code>​
 +</​note>​
  
 ==== Partea B - Network Packing ==== ==== Partea B - Network Packing ====
Line 179: Line 231:
  
 ===Task7 (10p) - Basic Network Packing === ===Task7 (10p) - Basic Network Packing ===
-Printr-o rețea de calculatoare se trimite un vector de obiecte de tip "​dată"​ (zi, lună, an). Din motive de economisire a spațiului, aceste date sunt memorate pe biții unui unsigned int, în următorul format:+Printr-o rețea de calculatoare se trimite un vector de obiecte de tip "​dată"​ (zi, lună, an). Din motive de economisire a spațiului, aceste date sunt memorate pe biții unui unsigned int (presupunem unsigned int de 32 de biți), în următorul format:
 ^ Biți nefolosiți ^ Anul ^ Luna ^ Ziua ^ ^ Biți nefolosiți ^ Anul ^ Luna ^ Ziua ^
 | 17 biți | 6 biți | 4 biți | 5 biți | | 17 biți | 6 biți | 4 biți | 5 biți |
Line 193: Line 245:
   * N numere de tip unsigned int ce reprezintă fiecare câte o dată memorată pe biți așa cum este definit mai sus.   * N numere de tip unsigned int ce reprezintă fiecare câte o dată memorată pe biți așa cum este definit mai sus.
  
-Programul trebuie să afișeze la stdout datele citite, câte una pe linie, sortate în ordine cronologică,​ în formatul ''​[zi] [lună] [an]''​ (exemplu: ''​21 decembrie 2023''​).+Programul trebuie să afișeze la stdout datele citite, câte una pe linie, ​**sortate în ordine cronologică**, în formatul ''​[zi] [lună] [an]''​ (exemplu: ''​21 decembrie 2023''​).
  
 ===Task8 (20p) - Complex Network Packing === ===Task8 (20p) - Complex Network Packing ===
Line 220: Line 272:
   - dacă cele două valori coincid, se consideră că acest unsigned int de date a fost recepționat corect de pe rețea   - dacă cele două valori coincid, se consideră că acest unsigned int de date a fost recepționat corect de pe rețea
   - dacă cele două valori nu coincid, se consideră că acest unsigned int a fost corrupted, prin urmare toate datele ai căror biți fac parte din acest unsigned int vor fi ignorate și nu vor fi afișate în outputul programului.   - dacă cele două valori nu coincid, se consideră că acest unsigned int a fost corrupted, prin urmare toate datele ai căror biți fac parte din acest unsigned int vor fi ignorate și nu vor fi afișate în outputul programului.
 +
 +{{:​programare:​teme_2023:​pclp-complex-network-packing.png?​800}}
  
 Modificați programul de la task 7 (în fișierul ''​bitpacking.c''​) astfel încât, atunci când numărul taskului citit este 8, să ruleze cu următoarele modificări:​ Modificați programul de la task 7 (în fișierul ''​bitpacking.c''​) astfel încât, atunci când numărul taskului citit este 8, să ruleze cu următoarele modificări:​
Line 237: Line 291:
   * citește un număr T ce reprezintă numărul de timezone-uri din program   * citește un număr T ce reprezintă numărul de timezone-uri din program
   * citește fiecare timezone, câte unul pe linie:   * citește fiecare timezone, câte unul pe linie:
-    * numele timezone-ului (un string de maxim caractere), și diferența în ore față de UTC+    * numele timezone-ului (un string de maxim caractere), și diferența în ore față de UTC
   * citește un număr P ce reprezintă numărul de persoane   * citește un număr P ce reprezintă numărul de persoane
   * pentru fiecare persoană, citește următoarele:​   * pentru fiecare persoană, citește următoarele:​
 +    * numele persoanei (un cuvânt de maxim 10 caractere)
     * numele timezone-ului în care această persoană locuiește     * numele timezone-ului în care această persoană locuiește
     * un număr K ce reprezintă numărul de intervale în care această persoană este liberă     * un număr K ce reprezintă numărul de intervale în care această persoană este liberă
Line 249: Line 304:
     * durata evenimentului în număr de ore     * durata evenimentului în număr de ore
  
-Programul trebuie să găsească **primul** interval temporal în care evenimentul se poate organiza astfel încât minim F persoane să fie disponibile pe întreaga durată a evenimentului. Dacă nu există niciun interval în care să se poată organiza evenimentul,​ programul trebuie să afișeze "​imposibil"​. Dacă se găsește un interval în care evenimentul se poate ține, atunci programul trebuie să afișeze P linii (câte una pentru fiecare dintre cele P persoane), cu următorul conținut:​ +Programul trebuie să găsească **primul** interval temporal în care evenimentul se poate organiza astfel încât minim F persoane să fie disponibile pe întreaga durată a evenimentului. Dacă nu există niciun interval în care să se poată organiza evenimentul,​ programul trebuie să afișeze "​imposibil"​. Dacă se găsește un interval în care evenimentul se poate ține, atunci programul trebuie să afișeze P linii (câte una pentru fiecare dintre cele P persoane, sortate alfabetic după nume), cu următorul conținut:​ 
-  * dacă persoana respectivă poate ajunge la eveniment, se afișează data (an, lună, zi, oră, minut, secundă, timezone - în același format ca la taskul 6) evenimentului,​ în timezone-ul acestei persoane+  * dacă persoana respectivă poate ajunge la eveniment, se afișează ​''​[nume]:​ [data]'' ​(data fiind reprezentată sub forma an, lună, zi, oră, minut, secundă, timezone - în același format ca la taskul 6) evenimentului,​ în timezone-ul acestei persoane
   * dacă persoana respectivă nu va fi disponibilă pentru eveniment, se afișează "​invalid"​   * dacă persoana respectivă nu va fi disponibilă pentru eveniment, se afișează "​invalid"​
 +
 +<​note>​
 +Exemplu de rulare:
 +<​code>​
 +1
 +UTC 0
 +
 +3
 +
 +Alin UTC 1
 +2023 12 20 12 5
 +
 +Vlad UTC 3
 +2023 12 20 12 1
 +2023 12 20 14 2
 +2023 12 20 16 1
 +
 +Traian UTC 1
 +2023 12 20 12 1
 +
 +2 3
 +</​code>​
 +Pentru inputul de mai sus, outputul trebuie să fie:
 +<​code>​
 +Alin: 20 decembrie 2023, 14:00:00 UTC (UTC+0)
 +Traian: invalid
 +Vlad: 20 decembrie 2023, 14:00:00 UTC (UTC+0)
 +</​code>​
 +Explicație:​
 +  * Avem un singur timezone, și anume UTC (UTC+0)
 +  * Avem 3 persoane: Alin, Vlad, Traian (toate în același timezone)
 +    * Toate intervalele persoanelor sunt în acest caz în aceeași zi (20 decembrie 2023)
 +    * Alin este liber între orele 12-17
 +    * Vlad este liber între orele 12-13, 14-17 (14-16 și 16-17 sunt două intervale lipite)
 +    * Traian este liber între orele 12-13
 +  * Evenimentul necesită cel puțin 2 persoane libere și durează 3 ore
 +  * Singurul interval în care se poate organiza este 14-17 (participă Alin și Vlad)
 +  * Persoanele sunt afișate în ordine alfabetică
 +
 +Încă un exemplu de input pentru care rezultatul va fi același, dar de data asta persoanele se află în timezone-uri diferite:
 +<​code>​
 +3
 +UTC 0
 +EET 2
 +PST -8
 +
 +3
 +
 +Alin UTC 1
 +2023 12 20 12 5
 +
 +Vlad EET 3
 +2023 12 20 14 1
 +2023 12 20 16 2
 +2023 12 20 18 1
 +
 +Traian PST 1
 +2023 12 20 4 1
 +
 +2 3
 +</​code>​
 +</​note>​
  
 <​note>​ <​note>​
Line 274: Line 391:
  
 Utilitarul se va rula folosind urmatoarea comanda: Utilitarul se va rula folosind urmatoarea comanda:
-<​code>​ valgrind --tool=memcheck --leak-check=full --error-exitcode=1 ./interactive ​</​code>​+<​code>​ valgrind --tool=memcheck --leak-check=full --error-exitcode=1 ./planner ​</​code>​
  
 ==== Coding Style ==== ==== Coding Style ====
  
-La fel ca la tema 0, există o depunctare de până la -20p pentru coding style. Checkerul verifică coding style-ul în mod automat.+La fel ca la temele precedente, există o depunctare de până la -20p pentru coding style. Checkerul verifică coding style-ul în mod automat.
 ==== Validare locală temă ==== ==== Validare locală temă ====
  
-Pentru a vă ajuta în dezvoltarea temei, arhiva ​{{:​programare:​teme_2023:​tema1_checker.zip|}} ​conține o copie a checkerului. +**Checker: ​{{:​programare:​teme_2023:​t2_checker.zip|}}**
- +
-Pentru a instala dependențele necesare verificării pentru ​**coding style** utilizați scriptul **install-linters.sh**:​ +
-<​code>​ +
-./​install-linters.sh +
-</​code>​ +
- +
-Pentru a rula checkerul local, copiați toate fișierele checkerului în același director în care aveți codul sursă, apoi folosiți comanda: +
-<​code>​ +
-./​check.sh +
-</​code>​ +
- +
-<note important>​ +
-Checkerul trebuie rulat pe Linux! Trebuie să aveți instalat utilitarul Valgrind (care nu există pe Windows). +
-</​note>​+
 ==== Trimitere temă ==== ==== Trimitere temă ====
  
-Tema va fi trimisă folosind Moodle, cursul **Programarea Calculatoarelor (CB & CD)**, activitatea "​Tema ​1".+Tema va fi trimisă folosind Moodle, cursul **Programarea Calculatoarelor (CB & CD)**, activitatea "​Tema ​2".
  
 <note warning> <note warning>
-Se va posta un anunț pe forum când se va deschide upload-ul.+Se va posta un anunț pe forum si Teams când se va deschide upload-ul.
 </​note>​ </​note>​
  
Line 314: Line 417:
  
 Conținutul arhivei trebuie să fie următorul: Conținutul arhivei trebuie să fie următorul:
- - Fișierele **imageprocessing.c**, **imageprocessing.h** + - Fișierele **timelib.c**, **timelib.h** 
- - Fișierele ​**bmp.c**, **bmp.h** + - Fișierul **bitpacking.c** 
- - Fișierul **interactive.c**+ - Fișierul **planner.c**
  - Fișierul **Makefile**  - Fișierul **Makefile**
  - Un fișier [[https://​en.wikipedia.org/​wiki/​README|README]] în care descrieți rezolvarea temei.  - Un fișier [[https://​en.wikipedia.org/​wiki/​README|README]] în care descrieți rezolvarea temei.
programare/teme_2023/tema2_2023_cbd.1703212880.txt.gz · Last modified: 2023/12/22 04:41 by alin_bogdan.popa
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0