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 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 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, 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).

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).

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 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 moodle jako rozwiązanie zadania „Wejściówka” zajęć nr 2, tak aby na początku zajęć można go było szybko pobrać z moodle, skompilować i zademonstrować działanie.

Rekrutacja do grup laboratoryjnych

  1. Składy grup na zajęciach laboratoryjnych z PO pozostają takie, jak zostały ustalone w usosie dla semestru zimowego.
  2. Liczba osób w grupie powinna być nie większa, niż liczba sprawnych stanowisk komputerowych w pracowni komputerowej.
  3. Osoby z II lub III roku, które powtarzają PO, powinny rekrutować się do grupy utworzonej specjalnie dla nich lub do innej, wskazanej przez Dziekanat (szczegółowych informacji na ten temat udziela Dziekanat). Gdyby zdarzyło się, że we wskazanej grupie brakuje już wolnych stanowisk, to osoby te muszą szukać miejsc w pozostałych grupach, jednak przy założeniu, że muszą ustąpić pierwszeństwa osobom już zapisanym do danej grupy w usosie. Po znalezieniu sobie grupy osoby powtarzające PO mają obowiązek niezwłocznie poinformować o tym Dziekanat.
  4. Uwaga: nieobecność na pierwszych zajęciach może sprawić, że zaistnieje wolne stanowisko komputerowe, które może zostać zajęte przez chętnego. W tej sytuacji osoba zapisana, ale nieobecna, traci swój priorytet. Dlatego jeżeli ktoś z powodów obiektywnych nie może uczestniczyć w pierwszych zajęciach swojej grupy, musi skontaktować się (skutecznie!) ze swoim prowadzącym ćwiczenia jeszcze przed zajęciami (np. za pomocą poczty elektronicznej) i poinformować go o nieobecności, aby zarezerwował miejsce. Na następnych zajęciach należy prowadzącemu dostarczyć dokument potwierdzający niemożność uczestniczenia w pierwszych zajęciach, np. zwolnienie lekarskie. Oczywiście nie zwalnia to z obowiązku zaliczenia tych zajęć w innym terminie w innej grupie.
  5. Przechodzenie ze swojej grupy usosowej do innej jest zabronione.
  6. Osoby, które – mimo zasady nr 5. – będą próbowały zmienić grupę, mają najniższy priorytet: muszą ustąpić wszystkim miejsca, zarówno osobom zapisanym w usosie, jak i osobom powtarzającym PO. Jeżeli po zastosowaniu zasady najniższego priorytetu okaże się, że nadal pozostaje w pracowni wolne stanowisko komputerowe, które można zająć, niezbędna jest jeszcze zgoda prowadzącego. Ma on zawsze prawo odmówić, choćby np. dla zachowania podobnych warunków pracy w grupach poprzez zachowanie podobnych liczb studentów.