Skip to content
Kategorie:

Program dla Dziekana

Post date:

Kilka tygodni temu uczniowie na zajęciach u dziekana spytali sie czy będą dodatkowe punkty na egzaminie za obecność na wykładach. W poprzednich semestrach na innych przedmiotach tego prowadzącego zawsze tak było, dawało to ~10-15% za „darmo” przy pełnych obecnościach.
Dziekan jest osobą bardzo zabieganą i stwierdził, że nie ma czasu na liczenie obecności, dlatego też poprosił studentów, że w ramach ich inicjatywy ktoś z nich przygotowałby tego typu program który dodatkowo liczyłby jeszcze ile minut dana osoba była na spotkaniu.

Na platformie Teams, z której korzystamy do zajęć, jest opcja eksportu listy wejść i wyjść z danego spotkania.

Przykładowy wygląd takiego pliku: (oczywiście z zachowaniem RODO 😉 )

example-meet.csv

Jak widać Teams zapisuje nawet tymczasowe rozłączenia. I każda osoba może mieć takich dowolną ilość w trakcie trwania spotkania z przypadku np. słabego łącza.

Pierwszą rzecza jaką chciałem zrobić było zmapowanie komórek na obiekty. Użyłem do tego biblioteki CsvHelper, która bardzo ale to bardzo uprasza cały proces 😀

Dodatkowo zrobiłem prostą walidacje czy użytkownik podaje poprawne dane na wejście programu, której kodu nie ma potrzeby pokazywać.
Ostatecznie przykład wywołania programo będzie wyglądał tak:
program.exe example-meet.csv Attendance.csv 2137 10:10:00 11:45:00

Przypisałem argsy odpowiednio do zmiennych:

Dodatkowo używam zmiennych lectureStartDateTime i lectureEndDateTime, które są przesunięte odpowiednio o -5 i 10 minut aby rozszerzyć pule minut wykładu wymaganych do zaliczenia obecności.
Ten czas jest przechowywany w timeForAttendanceToCount gdzie, dla zajęć w godzinach
np. 10:10:00 11:45:00 czas w jaki musimy przebywac na spotkaniu aby mieć zaliczoną obecność wyniesie 110 * .75 = 82.5 pamietając o wcześniej dodanych widełkach (-5, 10) minut.

Teraz zajmiemy sie stworzeniem prostej struktury, tu słownik, która będzie przechowywać jako klucz imiona uczesników a jak wartość liczby godzin w jakich byli na spotkaniu.
Następnie sumujemy ten czas który mieści się w wyżej oznaczonych ramach.

Teraz w zmiennej usersWithMinutes mamy uczestników wraz z wykazem ile minut byli obecni na zajęciach.

Następnym krokiem bedzie spisanie wartości z poprzedniej listy którą podawaliśmy jako drugi parametr. Do tego również użyjemy opcji mapowania kolumn na pola.

Teraz musimy napisać metode czytającą dane z pliku.

I ją użyć a nastepnie zająć się logiką odpowiedzalną za sprawdzenie czy liczba minut z wykładu jest wystarczająca żeby dostać obecność.

Następnym krokiem jest znalezienie w poprzednim pliku osoby o tym samym imieniu i nazwisku co bieżący, jeśli wystapił to sprawdzamy jego poprzednie obecności oraz długość czasu obecności na poprzednich wykładach.
Ostatecznie tworzymy nowy obiekt typu RecordOutput sprawdzając czy obecność powinna być policzona oraz dopisując nowe dane do trzeciej kolumny.
Jeśli osoba była nie obecna na danym wykładzie wartości dla niej sa przepisywane.

I na sam koniec musimy wpisać te dane do nowego pliku.

Dziekan poprosił również żeby plik był posortowany wg nazwisk rosnąco dlatego w pierwszej linijce Select wcześniej odwróciliśmy kolejność wyrazów w napisie.

Teraz przetestujmy działanie:

git bash – użycie programu

Wynikiem powyższego programu jest plik z zawartością:

Attendance-2020-10-27_09-33-27.csv.

Zmodyfikuje teraz plik example-meet.csv żeby zasymulowac nową liste:

example-meet.csv – zmodyfikowane

git bash – użycie programu

Wynik:

Attendance-2020-10-27_09-53-59.csv

Jak widzimy jedna osoba z poprzedniej listy była nieobecna więc nie została dla niej dodana wartość w trzeciej kolumnie, natomiast osoba której nie było na liście wcześniej została dodana.

Dziękuje za Twoją uwagę 🙂