W związku z Uchwałą Nr 15/2024 Uniwersyteckiej Komisji Wyborczej UKSW z 15.03.2024 w sprawie zwołania zebrania kolegium elektorów Uniwersytetu na dzień 18 marca 2024 r. o godz. 11.00, informuję, że ze względu na obowiązkowy udział w tym zebraniu dwóch osób z komisji egzaminacyjnej, egzamin komisyjny z ZTP zostaje przełożony na 22 marca (piątek) w godz. 10:00-12:00, w s. 316, bud. 21.
ZTP2023: egzamin komisyjny
Egzamin komisyjny z ZTP odbędzie się 18 marca (poniedziałek) w godz. 10:00-12:00, w auli 108, bud. 21. Do egzaminu są dopuszczone tylko te osoby, które uzyskają zgodę Prodziekana ds. studenckich. Formuła egzaminu taka sama jak w pierwszym terminie:
- Egzamin jest pisemny. Proszę zabrać ze sobą kartki papieru i długopisy oraz legitymacje studenckie. Proszę być punktualnie. Prace osób spóźnionych mogą nie podlegać ocenie.
- Szczegółowe zasady udziału są opisane na stronie www: Zasady zaliczenia wykładu, ale nie ma części praktycznej, to znaczy, nie będzie kartki z kodem programu, dla którego należy podać komunikaty wypisywane w oknie konsoli.
- Opuszczenie sali w trakcie egzaminu jest jednoznaczne z zakończeniem egzaminu.
- Zwracam uwagę na zasadę: Na egzaminie nie wolno sięgać do telefonów komórkowych. Telefony w czasie egzaminu muszą być wyciszone i schowane np. w torbie czy plecaku. Telefony nie mogą być w tym czasie trzymane przy sobie, tj. np. w kieszeni spodni czy bluzy. Niestosowanie się do tej zasady skutkuje natychmiastowym zakończeniem egzaminu przez studenta i opuszczeniem sali.
PO2024: Wejściówka na Lab.5
Napisz funkcję bin2int
, która jako argument przyjmuje wskaźnik do tablicy znaków (np. char* t
) przechowującej liczbę zapisaną w postaci binarnej w taki sposób, że pierwszym znakiem musi być zawsze '1′, tj. np. 1001
, 100
, 10101111
, 1110010
, itp., i która zwróci wartość typu int
odpowiadającą podanej liczbie binarnej (np. dla 1001
będzie to wartość 9
).
Następnie napisz program, który:
- Do dwuwymiarowej tablicy dynamicznej podobnej do tej prezentowanej na slajdach 143 i 144, wykład 4, ale przechowującej dane typu
char
i o wymiarach m wierszy na n kolumn (m i n podane przez użytkownika), 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ż n-1. W każdym wierszu tablicy przechowywana będzie jedna wczytana liczba. Przyjmij, że liczba wierszy w pliku nie jest znana, ale nie większa niż m, tak aby było wiadomo, że dane zmieszczą się w tablicy. -
Po zakończeniu wczytywania wywoła dla każdego ciągu binarnego z tablicy funkcję
bin2int
, która zwróci wartość typuint
odpowiadającą podanej liczbie binarnej. Zwrócona wartość na być wypisana w oknie konsoli. - Posortuje wczytane ciągi binarne w taki sposób, aby liczby całkowite reprezentowane przez ciągi były uporządkowane maleją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, np. sortowanie przez wybór. Uwaga: przygotuj swój program również na sytuację, kiedy plik z liczbami był pusty.
-
Po zakończeniu przestawiania jeszcze raz wypisze w oknie konsoli wartości liczbowe dla wszystkich ciągów binarnych w tablicy ułożonych wg nowego porządku korzystając z funkcji
bin2int
.
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” w sekcji „Temat 5”.
Hint:
Algorytm sortowania przez wybór:
- Ustaw:
i
= 0 - Wyszukaj w tablicy minimalną wartość spośród elementów od
i
do końca tablicy - Zamień znalezioną wartość minimalną, z wartością na pozycji
i
w tablicy - Wykonaj:
++i
; jeżelii
jest indeksem ostatniego elementu w tablicy to zakończ, w przeciwnym przypadku wróć do kroku nr 2.
PO2024: Wejściówka na Lab.4
Napisz program, który będzie wczytywał dane z jednego pliku tekstowego i zmienione zapisywał do drugiego. W tym celu:
- Zadeklaruj strukturalny typ danych
struct para
zdefiniowany tak, że zmienna takiego typu może przechowywać dwie wartości: napis oraz liczbę. W funkcjimain
zadeklaruj lokalną tablicę o długości 5, zawierającą elementy typustruct para
. - Napisz funkcję
wiersz
, która będzie odczytywała dane z jednego wiersza w już 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)
gdzief
to wskaźnik do otwartego pliku, natomiastp
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. - 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ą funkcjiwiersz
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. Uwaga: nazwisko należy zapisać do pliku w postaci zaszyfrowanej, tj. należy zastąpić wszystkie samogłoski znakiem '*’. Jeżeli nie wszystkie komórki tablicy zostały zapełnione danymi, zapisz do pliku 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 funkcjimain
.
Uwaga: kod odczytujący dane z pliku napisz w dwóch wariantach: kiedy użytkownik na koniec ostatniego wiersza pliku wejściowego dodał znak nowej linii oraz kiedy go nie dodał (zobacz slajdy 100-103, wykład 3). Na początku funkcjimain
użytkownik określa, który wariant wybiera, tj. wskazuje czy plik wejściowy ma na końcu ostatniej linii znak nowej linii czy nie. - Przygotuj sobie odpowiednie dwa pliki tekstowe z prawidłowymi danymi wejściowymi w kilku wierszach i umieść je we właściwym folderze. Następnie przetestuj program. Zobacz jak zachowa się twój program, kiedy wskażesz niepoprawnie wariant pliku wejściowego.
Do obsługi plików wykorzystaj funkcje: fopen
, fclose
, fprintf
, fscanf
i feof
. Wszystkie z biblioteki: stdio.h
.
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” w sekcji „Temat 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 (np. Zadania z programowania w języku C/C++, cz. I, rozdział 8). 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).
PO2024: 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ń.
Kod przetestowanego, działającego programu załaduj do https://e.uksw.edu.pl jako rozwiązanie zadania „Wejściówka” w sekcji „Temat 3”, tak aby na początku zajęć można go było szybko pobrać, skompilować i zademonstrować działanie.
ZTP2023: Wyniki z egzaminu w terminie drugim
Lista ocen osób, które uczestniczyły w egzaminie w drugim terminie. Wiersze zawierają: trzy ostatnie cyfry nr indeksu, liczbę zdobytych punktów i proponowaną ocenę.
- ***235 12+ ε 3
- ***274 12.5 3
- ***327 0 2
- ***466 14 3
- ***475 12+ ε 3
- ***478 12+ ε 3
- ***482 9 2
- ***526 4 2
- ***531 10 2
- ***536 6 2
- ***587 9.5 2
- ***595 12.5 3
- ***807 8 2
- ***867 10 2
- ***986 5 2
W razie niejasności, proszę o kontakt mailowy.
Prace będą do wglądu w poniedziałek (26 lutego), w godz. 11:15-12:00 (lub do ostatniej zainteresowanej osoby) w pok. 1247, bud. 12.
PO2024: tworzenie nowego programu
W pracowniach komputerowych na stanowiskach zainstalowany jest Visual Studio Enterprise 2017. Jest to starsza, ale nadal wspierana wersja środowiska programistycznego. Wersje instalacyjne starszych wersji są do pobrania tutaj: https://visualstudio.microsoft.com/pl/vs/older-downloads/
Pobranie wymaga zalogowania się.
Kody programów napisanych w nowszej, np. aktualnej wersji środowiska kompilują się w Visual Studio Enterprise 2017, jeżeli nie korzystają z konstrukcji języka C++ nie obsługiwanych przez VS2017. Przy czym program zajęć lab. nie przewiduje korzystania z takich konstrukcji składniowych.
Aby rozpocząć pisanie programu należy uruchomić środowisko VS i utworzyć nowy projekt. Poniżej są opisane dwie możliwości postępowania – do wyboru.
Postępowanie #1:
Nowy projekt typu „Pusty projekt”
Zostanie utworzony projekt nie zawierający żadnych plików:
1.1 Do tak utworzonego projektu możemy dodać pierwszy plik, w którym zamierzamy umieścić kod naszego programu. Można to zrobić klikając prawym klawiszem myszki na „Pliki źródłowe” w okienku prezentującym projekt, a następnie „Dodaj” i „nowy element”:
W otwartym oknie należy wybrać „Plik C++”. Utworzony zostanie plik z rozszerzeniem 'cpp’, który będzie traktowany przez kompilator jako plik zawierający kod napisany w C++.
1.2. Jeżeli mamy już wcześniej przygotowany plik z kodem źródłowym, np. z rozwiązaniem Wejściówki, albo utworzyliśmy w innym edytorze (lub ręcznie) plik z rozszerzeniem 'c’ lub 'cpp’, i chcemy go dołączyć do tak utworzonego projektu, należy kliknąć prawym klawiszem myszki na „Pliki źródłowe” w okienku prezentującym projekt, a następnie „Dodaj” i „istniejący element”, po czym znaleźć właściwy plik i wskazać go do dołączenia do projektu:
Dobrze jest wcześniej, tzn. przed dołączeniem, umieścić już przygotowany plik we właściwym folderze. To ułatwi jego dołączenie do projektu. Aby szybko znaleźć ten folder, należy kliknąć prawym klawiszem myszki na nazwę projektu w okienku prezentującym projekt (np. na „Project1”) i wybrać opcję „Otwórz folder w eksploratorze plików”:
Zostanie otwarte okno Eksploratora plików prezentujące folder, gdzie powinien trafić plik.
Postępowanie #2:
Nowy projekt typu „Aplikacja konsolowa systemu Windows”
Wybierając tę opcję, zostanie utworzony projekt zawierający cztery pliki:
W załączonym przykładzie miejscem, gdzie należy pisać kod programu, jest plik „ConsoleApplication1.cpp”. Do projektu należy też plik „stdafx.h”. Jest to tzw. wstępnie skompilowany plik nagłówkowy. To niestandardowa, autorska konstrukcja Microsoftu, której celem jest przyspieszenie procesu kompilacji dużych projektów. Do tej konstrukcji należą też pliki „stdafx.cpp” i „targetver.h”.
Po podwójnym kliknięciu na „ConsoleApplication1.cpp” zostanie otwarte okno z prostym programem:
Linijki zawierającej dyrektywę #include "stdafx.h"
nie należy usuwać. Microsoft rekomenduje, aby dyrektywy dołączenia niezbędnych standardowych bibliotek, np. #include "stdlib.h"
, umieścić w pliku stdafx.h w miejscu poniżej już istniejących dyrektyw #include. Natomiast dyrektywy dołączenia niezbędnych bibliotek własnych można umieścić w „ConsoleApplication1.cpp” poniżej dyrektywy #include "stdafx.h"
.
Jeżeli chcemy do tak utworzonego pliku wkleić kod z pliku Wejściówki, który został napisany bez korzystania z dyrektywy #include "stdafx.h"
, należy ten kod w całości wkleić poniżej tej dyrektywy, zastępując nim treść wygenerowaną automatycznie przez VS. Po wklejeniu nie należy edytować dyrektywy #include "stdafx.h"
, ani niczego przed nią dopisywać (powinna pozostać jako pierwsza linijka programu).
Jeżeli plik zawierający kod Wejściówki został utworzony w projekcie typu „Aplikacja konsolowa Windows”, należy ten plik dołączyć do sekcji „pliki źródłowe” w projekcie bez wprowadzania w nim żadnych zmian oraz usunąć z tej sekcji automatycznie tworzony plik „ConsoleApplication1.cpp”.
Hint: dobrym pomysłem jest unikanie mieszania typów projektów, tj. np. jeżeli Wejściówka została utworzona, napisana i przetestowana w projekcie typu „Aplikacja konsolowa Windows”, to projekt takiego samego typu należy utworzyć w pracowni, żeby ją zaprezentować.
Na koniec – co zrobić, żeby okno konsoli nie zamykało się po wykonaniu naszego programu?
Postępowanie #1:
W Solution Explorer kliknąć prawym klawiszem myszy na nazwę projektu (nie przestrzeni roboczej). Potem wybrać Properties (Właściwości). Pojawi się okno, w którym po lewej stronie trzeba kolejno rozwinąć Configuration Properties->Linker->System (Właściwości konfiguracji->Konsolidator->System), a potem z prawej strony kliknąć na pole SubSystem (Podsystem). Pojawi się wówczas rozwijana lista, z której wybieramy Console (/SUBSYSTEM:CONSOLE).
Postępowanie #2:
Na końcu funkcji main
, w linijce tuż przed poleceniem return
dopisać instrukcję:
system("pause");
i dołączyć bibliotekę stdlib.h
.
PO2024: Wejściówka na Lab.2
Napisz program szyfrujący tekst wprowadzany przez użytkownika. W tym celu przygotuj tablicę dwuwymiarową 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 wszystkich komórek tablicy B wpisz wartości NULL
, a do tablicy A wpisz litery alfabetu (z pominięciem liter zawierających znaki diakrytyczne: ą, ć, ę, ł, ń, ó, ś, ź, ż), np. tak:
a | f | k | p | v |
b | g | l | r | w |
c | h | m | s | x |
d | i | n | t | y |
e | j | o | u | z |
Następnie wczytaj od użytkownika ciąg znaków bez spacji, reprezentujący dowolny napis składający się tylko ze znaków z tablicy A, którego długość jest mniejsza 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. Napis wczytaj poleceniem scanf
do pomocniczej tablicy. Następnie dla każdej kolejnej litery wczytanego napisu znajdź w tablicy A komórkę, przechowującą tę literę, po czym adres znalezionej komórki w A zapisz w odpowiedniej komórce tablicy B (tj. adres pierwszej litery – w pierwszej komórce B, adres drugiej litery – w drugiej, itd.). Po zakończeniu tablica B powinna zawierać wskaźniki do odpowiednich komórek tablicy A z kolejnymi literami wprowadzonego napisu. Jeżeli długość tablicy B jest większa niż długość wczytanego słowa, pozostałe komórki tablicy B przechowują wartość NULL
.
Wypisz w oknie konsoli napis podany przez użytkownika korzystając tylko 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 | z |
a | f | k | p | v |
b | g | l | r | w |
c | h | m | s | x |
d | i | n | t | y |
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” w sekcji „Temat 2”, tak aby na początku zajęć można go było szybko pobrać, skompilować i zademonstrować działanie.
PS: szczegółowe reguły pracy na zajęciach lab. są dostępne pod adresem:
https://ktrojanowski.blog.uksw.edu.pl/programowanie-obiektowe/zasady-zaliczenia-lab/zasady-dla-zadan-lab/
ZTP2023: terminy w sesji poprawkowej
- Poprawa oceny z zajęć lab.: 20 lutego (wtorek) w godz. 16:45-20:00, sala 119 w bud. 21. Osoby zainteresowane proszę o przyjście na egzamin ZTP i udział w egzaminie. Jeżeli poprawa da pozytywny wynik, praca egzaminacyjna zostanie sprawdzona. Proszę też o mail z potwierdzeniem chęci udziału. Wystarczy krótki tekst w rodzaju „Zgłaszam swój udział w poprawie ZTP lab.” i podpis. Zgłoszenia są potrzebne, abym wiedział ile przygotować zadań. Zgłoszenia można nadsyłać do niedzieli (18.02) wieczorem.
- Egzamin z ZTP, drugi termin: 20 lutego (wtorek) w godz. 11:30-13:30, aula Schumana. Formuła egzaminu taka sama jak w pierwszym terminie:
- Egzamin jest pisemny. Proszę zabrać ze sobą kartki papieru i długopisy oraz legitymacje studenckie. Proszę być punktualnie. Prace osób spóźnionych mogą nie podlegać ocenie.
- Szczegółowe zasady udziału są opisane na stronie www: Zasady zaliczenia wykładu, ale nie ma części praktycznej, to znaczy, nie będzie kartki z kodem programu, dla którego należy podać komunikaty wypisywane w oknie konsoli.
- Zwracam uwagę na zasadę: Na egzaminie nie wolno sięgać do telefonów komórkowych. Telefony w czasie egzaminu muszą być wyciszone i schowane np. w torbie czy plecaku. Niestosowanie się do tej zasady skutkuje natychmiastowym zakończeniem egzaminu przez studenta i opuszczeniem sali.
ZI2024: zmiana terminu zajęć
Uwaga: pierwsze zajęcia konwersatorium „Zastosowania informatyki” odbędą się 4 marca (poniedziałek), o godz. 9:45 11:30 w sali 316, b.21. Zajęcia zaplanowane na 19 lutego nie odbędą się w tym terminie. Zostają przełożone, a nowy termin będzie ogłoszony później.