Ogłoszenia organizacyjne

  1. Od tego tygodnia nie wolno już zmieniać grup laboratoryjnych. Przez pierwsze trzy tygodnie był czas na znalezienie sobie grupy i ta grupa, z którą zrealizowane zostały zajęcia nr 3, staje dla każdego studenta grupą macierzystą. Od tej pory zmiana może nastąpić tylko jednorazowo i w drodze wyjątku, np. że względu na chorobę lub inne ważne zdarzenie losowe.
  2. W przyszłym tygodniu na zajęciach laboratoryjnych zostaną rozdane zadania semestralne. Jak mówiłem na wykładzie, nie należy ich jeszcze teraz realizować, ponieważ nie było jeszcze na wykładzie materiału z programowania obiektowego. Myślę, że dobrym terminem rozpoczęcia prac nad zadaniem będzie czas między Wielkanocą a długim weekendem majowym.
  3. Grupa środowa, której zajęcia w tym tygodniu zostały odwołane, w przyszłym tygodniu będzie realizowała ćwiczenia nr 3.

Wejściówka na ćwiczenia nr 4

Zadeklaruj strukturalny typ danych 'struct para’ zdefiniowany tak, że zmienna takiego typu może przechowywać dwie wartości: napis oraz liczbę. W funkcji 'main’ zadeklaruj lokalną tablicę o długości 5, zawierającą elementy typu 'struct para’. Następnie napisz funkcję 'wiersz’, która będzie odczytywała dane z poszczególnych wierszy pliku. W pojedynczym wierszu zapisane są kolejno: nr indeksu studenta, nazwisko i ocena. Funkcja odczytuje dane z jednego wiersza, następnie ignoruje odczytany nr indeksu a do komórki tablicy wpisuje w odpowiednich polach tylko nazwisko i ocenę. Przyjmij, że w pliku może być dowolna liczba wierszy (jest możliwe również, że plik jest pusty), ale nie większa niż rozmiar tablicy. Przyjmij też, że dane w pliku są zawsze poprawne, tj. wiersz zawsze zawiera trójkę prawidłowych napisów w tej samej kolejności: numer, nazwisko i ocena.
Nagłówek funkcji ma wyglądać tak:
int wiersz(FILE* f, struct para *p)
gdzie 'f’ to wskaźnik do otwartego pliku, natomiast 'p’ to wskaźnik do komórki tablicy, do której mają zostać zapisane dane z jednego odczytanego wiersza pliku. Funkcja zwraca wartość zero, jeżeli odczyt zakończył się pomyślnie, a 1, jeżeli nie udało się odczytać kolejnej porcji danych ze względu na koniec pliku.

Przygotuj sobie odpowiedni plik tekstowy z prawidłowymi danymi w kilku wierszach i umieść go we właściwym katalogu.

W funkcji 'main’ pobierz od użytkownika nazwę pliku z danymi oraz nazwę pliku wyjściowego. Otwórz plik z danymi w trybie do odczytu, a plik wynikowy w trybie do odczytu. Następnie w pętli za pomocą funkcji 'wiersz’ odczytaj kolejne wiersze pliku zapisując dane w kolejnych komórkach tablicy. Każdą odczytaną komórkę tablicy zapisz od razu do pliku wynikowego tak, aby w kolejnych wierszach pliku znalazły się pary: nazwisko i ocena. Jeżeli nie cała tablica została zapełniona danymi, zapisz tylko tyle, ile zostało odczytanych z pliku wejściowego. Po zakończeniu pętli zamknij pliki, wyświetl w oknie konsoli zawartość tablicy i zakończ działanie programu.

Do obsługi plików wykorzystaj funkcje: 'fopen’, 'fclose’, 'fprintf’, 'fscanf’ i 'feof’. Wszystkie z biblioteki: 'stdio.h’.

Przetestowany, działający program uploaduj do systemu moodle jako rozwiązanie zadania „wejściówka” ćwiczenia nr 4.

Różne przykłady zadań i problemów dotyczących tego rodzaju zastosowań można znaleźć w podręcznikach lub na forach, których tematem jest programowanie w ANSI C. Wujek gugiel wspiera szukających. Dobre słowa kluczowe na najbliższy tydzień to: 'fopen’, 'fclose’, 'fprintf’, 'fscanf’ i 'feof’ w połączeniu z 'ansi c’. Oczywiście niczego nie należy brać bezkrytycznie, każdy kawałek kodu warto zweryfikować wklejając do visuala i sprawdzając, jak naprawdę działa.

Hint:

Przygotowując się na ćwiczenia nr 4 warto przypomnieć sobie jak skonstruowany jest C-napis, oraz zapoznać się z funkcjami:

  • int isalpha(int c)
  • int islower(int c)
  • int isupper(int c)
  • int tolower(int c)
  • int toupper(int c)

Funkcje znajdują się w bibliotece ctype.h i służą do sprawdzania, czy dany znak jest literą i jakiego rodzaju (dużą czy małą) oraz do zamiany dużych liter na małe i małych na duże. Zadania pierwszego poziomu na ćwiczeniach 4 będą miały wspólne fragmenty z zadaniami poziomu 2 ćwiczeń nr 3, tj. będą dotyczyły konwertowania napisów do postaci zaszyfrowanych wg różnych reguł, oraz oczywiście będą dotyczyły pracy na plikach tekstowych (materiał ostatnio omawiany na wykładzie).

Wejściówka na ćwiczenia nr 3

Zadeklaruj strukturalny typ danych, który będzie zawierał dwa pola: napis oraz liczba całkowita. Następnie w funkcji main zadeklaruj lokalną tablicę o niewielkiej długości (np. 5), zawierającą elementy typu takiego, jak zdefiniowana wcześniej struktura. Napisz w funkcji main kod, który pozwala użytkownikowi wprowadzić wartości do obydwu pól w każdej z komórek tej tablicy.

Następnie napisz funkcję, która jako argument wywołania przyjmuje tę tablicę. Kod funkcji sprawdza, czy w każdej z komórek tablicy pole liczbowe nie zawiera wartości mniejszej (ale dodatniej) od długości napisu przechowywanego w drugim polu. Jeżeli tak, skraca napis do długości takiej, jak wartość w polu liczbowym. W przeciwnym przypadku pozostawia napis niezmieniony. Takie sprawdzenie i skracanie wykonuje się dla wszystkich komórek tablicy. Po przejrzeniu całej tablicy funkcja zwraca liczbę skróceń, jakie rzeczywiście zostały wykonane.

W funkcji main, poniżej kodu wprowadzającego dane umieść wywołanie funkcji skracającej napisy w tablicy, przy czym argumentem wywołania jest tablica, do której dane zostały właśnie przez użytkownika wprowadzone. Na koniec dopisz kod wyświetlający nową zawartość tablicy (w kolejnych wierszach pary: liczba i napis) oraz zwróconą przez funkcję liczbę faktycznie wykonanych skróceń.

Przetestowany, działający program uploaduj do systemu moodle jako rozwiązanie zadania „wejściówka” ćwiczenia nr 3 (uploadować należy wyłącznie plik cpp z kodem źródłowym, nic więcej).

Warto przed ćwiczeniami przypomnieć sobie zasady działania algorytmów obliczających wartość liczby zapisanej w formacie kodu dwójkowego oraz w formacie kodu ósemkowego, a także jak oblicza się wartość średnią i odchylenie standardowe dla serii liczb.

Szablon do prezentacji i terminarz

Szablon latex przydatny do zrobienia prezentacji na seminarium

Terminarz prezentacji:

  1. 11 marca
  2. 18 marca
  3. 25 marca
  4. 8 kwietnia
  5. 15 kwietnia
  6. 22 kwietnia
  7. 6 maja
  8. 13 maja

Gotowe slajdy (tex i pdf) muszą być do mnie przesłane najpóźniej w ostatni piątek przed środą, kiedy mają być prezentowane – do akceptacji. Dopiero po naniesieniu wszystkich moich uwag można być dopuszczonym do prezentacji.

Wejściówka na zajęcia nr 2

Napisz program szyfrujący tekst wprowadzany przez użytkownika. W tym celu przygotuj tablicę kwadratową A o wymiarze 5 na 5 przechowującą wartości typu char, oraz tablicę jednowymiarową B, przechowującą wskaźniki do zmiennych typu char. Do tablicy B wpisz wartości NULL, a do tablicy kwadratowej A wpisz litery alfabetu (z pominięciem liter zawierających znaki diakrytyczne), np. tak:

a f k p w
b g l r x
c h m s y
d i n t z
e j o u  

Następnie wczytaj od użytkownika ciąg znaków reprezentujący dowolny napis składający się ze znaków z tablicy A, którego długość nie jest większa niż długość tablicy jednowymiarowej B (zakładamy przy tym, że dane wprowadzane przez użytkownika są zawsze poprawne co do ich wartości i rozmiaru). Przyjmij, że zdarzeniem oznaczającym koniec wprowadzania napisu jest wciśnięcie przez użytkownika „Enter”. Po wprowadzeniu każdej kolejnej litery znajdź w tablicy A komórkę, przechowującą tę literę, po czym adres znalezionej komórki w A zapisz w kolejnej komórce tablicy B. Po zakończeniu wpisywania tablica B powinna zawierać wskaźniki do odpowiednich komórek tablicy A z kolejnymi literami wprowadzonego napisu.

Wypisz w oknie konsoli napis podany przez użytkownika korzystając z tablicy B, tj. za pomocą wskaźników z B sięgaj do odpowiednich komórek w A i wypisz ich zawartość kolejno na ekranie.

Następnie zaszyfruj wiadomość poprzez przestawienie wartości w wierszach tablicy A. Przykładowe przestawienie to przesunięcia wartości: z wiersza 1 do 2, z 2 do 3, z 3 do 4, z 4 do 5, a z 5 do 1, np. tak:

e j o u  
a f k p w
b g l r x
c h m s y
d i n t z

Po przestawieniu wierszy ponownie wypisz w oknie konsoli napis korzystając ze wskaźników z tabeli B.

Na koniec przywróć w tablicy właściwy porządek wierszy i jeszcze raz korzystając z tablicy B wypisz napis, tym razem w postaci odszyfrowanej.

Przetestowany, działający program (tylko plik z kodem źródłowym) uploaduj do systemu moodle jako rozwiązanie zadania „Wejściówka” zajęć nr 2.

Programowanie Obiektowe: składy grup na laboratoriach

Jak co roku, na początku semestru pojawia się kwestia składów grup na laboratoriach z PO. W planie jest 10 możliwych terminów. Do każdego z terminów przypisana jest jedna grupa. Jeżeli jednak jakaś grupa jest mniej liczna, niż liczba komputerów w pracowni (standardowo: 20 komputerów), to nie ma przeszkód, aby opuścić swoją grupę i uczęszczać na zajęcia z inną, o ile są tam wolne miejsca. Propozycja zmiany grupy dotyczy zwłaszcza studentów z tych grup, gdzie zapisanych jest więcej niż 20 osób. W takim przypadku, jeżeli na zajęcia stawi się więcej niż 20 osób, sam prowadzący dokona autorskiej selekcji, kto musi wyjść, przy czym kryterium eliminacji może być dowolne: kolor butów, rozmiar plecaka, itp.

Poniżej lista liczebności poszczególnych grup oraz inicjały prowadzącego (stan wg USOSa):
1. DD 16
2. DD 12
3. HZ 31
4. HZ 17
5. DD 28
6. DD 21
7. KT 17
8. MS 27
9. MS 16
10.MS 18

Proponuję studentom grup 3, 5, 6 i 8 już teraz pomyśleć nad zmianą terminu. Jest to ważne zwłaszcza dla grup p. Doroty Dąbrowskiej, które mają zajęcia w piątek. Osoby, które nie zmieszczą się w pracowni we środę, mogą jeszcze próbować wejść na zajęcia w piątek. Natomiast, kto nie zdoła uczestniczyć w zajęciach w ten piątek, otrzymuje pierwsze zero, ponieważ od następnego tygodnia na ćwiczeniach realizowane są już zadania nr 2. Generalnie zajęcia realizowane są w cyklach tygodniowych: od poniedziałku do piątku jest to ten sam materiał w każdej z grup. Dlatego właśnie jest możliwa zmiana przypisania do grup w obrębie tygodnia.

Aby obraz sytuacji był pełny, muszę wspomnieć o jeszcze jednym zjawisku. Co roku pewna niewielka liczba studentów rezygnuje już na etapie pierwszego semestru. Dlatego stany formalne grup niekoniecznie odzwierciedlają stan rzeczywisty. Żeby jednak nie było za łatwo, rezygnujący zwykle nie informują nikogo, że rezygnują, wiec tylko naocznie można ustalić, że ktoś jeszcze chodzi na zajęcia, albo już przestał.