PO 2017: Wejściówka na Lab.5

Napisz program, który:

  1. Do struktury odpowiadającej dwuwymiarowej tablicy dynamicznej podobnej do tej prezentowanej na slajdzie 121, wykład 4, wczyta z pliku tekstowego kilka liczb zapisanych w postaci binarnej. W każdym wierszu pliku znajduje się jedna liczba zapisana w taki sposób, że pierwszą cyfrą musi być zawsze 1, tj. np. 1001, 100, 10101111, 1110010, itp. Tak zapisane liczby mogą mieć różną liczbę znaków, ale nie większą niż k. W każdym wierszu struktury, którym ma być tablica elementów typu char, przechowywana będzie jedna wczytana liczba. Przyjmij, że liczba wierszy w pliku nie jest stała, ale nie większa niż n, tak aby było wiadomo, jakiej maksymalnej długości musi być pomocnicza tablica wskaźników. Alokowane dynamicznie tablice przechowujące kolejne ciągi binarne muszą być dokładnie takiej długości, aby zmieścił się cały C-napis reprezentujący daną liczbę binarną i nic więcej.
    (uwaga: w poleceniu powyżej nie chodzi o utworzenie nowego typu danych za pomocą słowa kluczowego struct, ale o zaproponowanie sposobu powiązania ze sobą zależnościami kilku prostych tablic jednowymiarowych, tak aby wspólnie tworzyły pewną konstrukcję. Takich różnych konstrukcji można zaproponować wiele, w zależności od tego, czy mamy w nich przechowywać listę, graf, drzewo, etc. Dla wspólnego określenia tych konstrukcji używa się zwrotu struktury danych. Można o nich poczytać w wielu podręcznikach i w sieci, np. http://www.algorytm.org/klasyczne/)
  2. Dla każdego ciągu binarnego wywoła funkcję bin2int, która zwróci wartość typu int odpowiadającą podanej liczbie binarnej (np. dla ciągu binarnego 1001 będzie to wartość 9). Zwrócona wartość na być wypisana w oknie konsoli. Funkcja bin2int przyjmuje jako argument wywołania wskaźnik do tablicy przechowującej napis-liczbę w postaci binarnej i zwraca odpowiednią wartość typu int. Funkcję bin2int trzeba napisać samemu.
  3. Posortuje wczytane ciągi binarne w taki sposób, aby liczby całkowite reprezentowane przez ciągi były uporządkowane rosnąco. Przemieszczenia ciągów binarnych nie dokonuj poprzez kopiowanie wartości z jednych tablic dynamicznych do drugich, ale poprzez zamianę położeń wartości wskaźników do dynamicznych tablic przechowujących ciągi binarne. To ważne: aby zmienić porządek, nie wykonuj żadnych alokacji nowych tablic dynamicznych, a jedynie zamieniaj adresy w komórkach tablicy wskaźników. Zastosuj dowolne sortowanie. Uwaga: przygotuj kod również na sytuację, kiedy plik był pusty.
  4. Po zakończeniu przestawiania jeszcze raz wypisze w oknie konsoli wartości liczbowe dla wszystkich ciągów binarnych ułożonych wg nowego porządku korzystając z funkcji bin2int.

PO 2017: Wejściówka na Lab.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 wiersza w otwartym pliku. W 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 wartość 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 folderze.

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 zapisu. 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” tematu 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. Dobre słowa kluczowe dla wyszukiwarki 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 okna VC++ i sprawdzając, jak naprawdę działa.

Hint:

Przygotowując się na lab. nr 4 warto przypomnieć sobie jak skonstruowany jest C-napis, sprawdzić jak działa szyfr Cezara, 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 lab. 4 mogą mieć wspólne fragmenty z zadaniami poziomu 2 lab. 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).

VS2013: Błąd kompilacji C4996

Aby uniknąć błędu kompilacji C4996 występującego, kiedy używamy starszych wersji niektórych funkcji bibliotecznych (np. strcpy), należy w opcji „Properties” naszego projektu ustawić „No” w dwóch miejscach: „Treat warning as errors” oraz „SDL checks”, tak jak to zostało pokazane poniżej:

Ustawienia VS2013
Project|Properties -> Configuration Properties -> C/C++ -> General

PO 2017: Wejściówka na Lab.3

Zadeklaruj strukturalny typ danych, który będzie zawierał dwa pola: napis oraz liczba całkowita. W funkcji main zadeklaruj lokalną tablicę o niewielkiej długości (np. 5), zawierającą elementy typu takiego, jak zdefiniowana wcześniej struktura.

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.

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. W 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” lab. nr 3 (uploadować należy wyłącznie plik cpp z kodem źródłowym, nic więcej).

PO 2017: Wejściówka na Lab.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 napis 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 https://e.uksw.edu.pl jako rozwiązanie zadania „Wejściówka” Lab. nr 2, tak aby na początku zajęć można go było szybko pobrać, skompilować i zademonstrować działanie.

Zmiana przynależności do grupy na lab. PO

Ogólna zasada jest taka, że skład grup zajęciowych określa usos i nie ma przechodzenia do innej grupy.

Ponieważ część studentów po pierwszym semestrze rezygnuje, niektóre grupy mogą jednak faktycznie okazać się mniej liczne niż inne. W takim przypadku przejście do innej grupy – za zgodą prowadzącego i Dziekanatu – jest możliwe, pod warunkiem że nie powoduje pogłębienia tych różnic, ale ich wygładzenie.

Ponieważ grupa osób, które chcą zapisać się do mnie na zajęcia laboratoryjne z PO, jest coraz większa, proponuję wszystkim zainteresowanym postępować asekuracyjnie i wziąć udział w pierwszych zajęciach z tą grupą, która została ustalona przez Dziekanat, żeby nie stracić zajęć. Patrząc na obecny skład grupy zapisany w usosie nie widzę możliwości dopisania dodatkowych osób. Jednak dużo będzie zależało od frekwencji na pierwszych zajęciach.