Różnice między wybraną wersją a wersją aktualną.
|
so:test3_cwiczenia [2024/06/10 20:21] jkonczak utworzono |
so:test3_cwiczenia [2025/07/01 00:22] (aktualna) jkonczak |
||
|---|---|---|---|
| Linia 1: | Linia 1: | ||
| + | <html><style>pre{font-family:DejaVu Sans Mono}</style></html> | ||
| + | |||
| Strona zawiera przykładowe pytania jakie mogą pojawić się na teście. | Strona zawiera przykładowe pytania jakie mogą pojawić się na teście. | ||
| \\ | \\ | ||
| Linia 23: | Linia 25: | ||
| ''Suma dwóch pierwszych argumentów nie jest parzysta!'' | ''Suma dwóch pierwszych argumentów nie jest parzysta!'' | ||
| i wychodzić. W innym przypadku skrypt ma kontynuować pracę. | i wychodzić. W innym przypadku skrypt ma kontynuować pracę. | ||
| + | |||
| + | **~~#~~.** | ||
| + | Napisz skrypt który sprawdza czy plik podany jako pierwszy argument zawiera | ||
| + | linie zaczynające się od ''password = '' i jeżeli tak, to zamienia w tych | ||
| + | liniach wszystko po znaku równości na drugi argument skryptu. | ||
| + | \\ | ||
| + | Jeżeli nie podano dwóch argumentów lub pierwszy argument nie jest zwykłym | ||
| + | plikiem, skrypt ma wyświetlić ''błędne argumenty'' i zwracać kod | ||
| + | sygnalizujący niepowodzenie. | ||
| + | \\ | ||
| + | Jeżeli plik nie zawiera linii zaczynające się od ''password = '', | ||
| + | skrypt ma ma wyświetlić ''nie ma hasła'' i również zwracać kod | ||
| + | sygnalizujący niepowodzenie. | ||
| + | \\ | ||
| + | Skrypt musi działać również dla plików których nazwa zawiera | ||
| + | spacje. | ||
| + | \\ | ||
| + | Do zmiany w pliku //''nazwapliku''// linii zaczynających się od | ||
| + | ''password = '' tak żeby zastąpić tekst po znaku równości tekstem | ||
| + | //''nowehaslo''// możesz użyć polecenia | ||
| + | ''sed -i "s/^password = .*/password = //nowehaslo//%%%%/" //>nazwapliku//'' | ||
| Linia 99: | Linia 122: | ||
| </html> | </html> | ||
| </small> | </small> | ||
| + | |||
| + | **~~#~~.** | ||
| + | Napisz fragment skryptu który próbuje policzyć dla każdego wpisu w bieżącym | ||
| + | katalogu kończącego się na ''.jpg'' sumę kontrolną SHA-512 i umieszcza | ||
| + | wyliczone sumy w kolejnych liniach pliku o nazwie ''sumy.txt''. | ||
| + | Po wykonaniu takiej akcji dla wszystkich wpisów w katalogu fragment skryptu | ||
| + | ma wyświetlić komunikat | ||
| + | ''Udało się policzyć sumy dla plików mających łącznie //N// bajtów'', | ||
| + | gdzie w miejsce //N// ma zostać wstawiona faktyczna suma rozmiarów plików | ||
| + | dla których udało się policzyć sumę kontrolną. | ||
| + | \\ | ||
| + | Kod musi działać poprawnie również jeśli wpisy w katalogu zawierają spacje w | ||
| + | nazwach. | ||
| + | \\ | ||
| + | Do wyświetlenia rozmiaru pliku //F// możesz wykorzystać komendę | ||
| + | ''stat -c%s //F//''. | ||
| + | \\ | ||
| + | Sumę kontrolną SHA-512 pliku //X// możesz policzyć poleceniem | ||
| + | ''sha512sum //X//'', przy czym polecenie ''sha512sum'' | ||
| + | zwraca czy udało się policzyć sumę kontrolą. | ||
| Linia 116: | Linia 159: | ||
| pliku pętla ma zostać przerwana. Następnie funkcja ma stworzyć pusty plik o | pliku pętla ma zostać przerwana. Następnie funkcja ma stworzyć pusty plik o | ||
| tak znalezionej nazwie i wypisać tę nazwę na standardowe wyjście. | tak znalezionej nazwie i wypisać tę nazwę na standardowe wyjście. | ||
| + | |||
| + | **~~#~~.** | ||
| + | Napisz polecenie które utworzy w powłoce funkcję ''sekwencja''. | ||
| + | Funkcja wykonana z jednym argumentem (będącym liczbą) ma wypisać w osobnych | ||
| + | liniach kolejne numery od 1 do podanej liczby, natomiast wykonana | ||
| + | z dwoma argumentami (będącymi liczbami) ma wypisać w osobnych liniach kolejne | ||
| + | numery od pierwszego podanego argumentu do drugiego podanego argumentu. | ||
| + | \\ | ||
| + | W tym zadaniu nie wolno używać polecenia ''seq'' – zadaniem funkcji jest | ||
| + | zastąpić to polecenie w przypadku jego braku. | ||
| **~~#~~.** | **~~#~~.** | ||
| Linia 199: | Linia 252: | ||
| Liczby mają być odczytywane do pierwszej pustej linii (lub końca pliku), | Liczby mają być odczytywane do pierwszej pustej linii (lub końca pliku), | ||
| następnie suma liczb ma być wypisana na standardowe wyjście. | następnie suma liczb ma być wypisana na standardowe wyjście. | ||
| + | |||
| + | **~~#~~.** | ||
| + | Napisz skrypt który czyta kolejno linie ze standardowego wejścia, | ||
| + | następnie wyświetla treść linii ze spacjami zamienionymi na podkreślniki. | ||
| + | Skrypt ma działać do czasu aż użytkownik użyje skrótu //Ctrl// + //c//, | ||
| + | a przy przerwaniu działania skrypt ma wyświetlić tekst | ||
| + | ''Przetworzono //N// linii'', gdzie w miejsce //N// ma zostać | ||
| + | wstawiona faktyczna ilość przetworzonych linii. | ||
| ==== Obsługa plików w C/C++ z użyciem API POSIX ==== | ==== Obsługa plików w C/C++ z użyciem API POSIX ==== | ||
| + | |||
| + | **~~#~~.** | ||
| + | Podaj nazwę funkcji z systemowego interfejsu programistycznego POSIX która | ||
| + | usuwa z katalogu wpis dotyczący zwykłego pliku do którego ścieżka jest podana | ||
| + | jako argument tej funkcji. | ||
| + | |||
| + | |||
| + | -------------------------- | ||
| Linia 281: | Linia 350: | ||
| } | } | ||
| return 0; | return 0; | ||
| + | } | ||
| + | </code> | ||
| + | |||
| + | |||
| + | **~~#~~.** | ||
| + | Poniższy program ma ustawiać rozmiar pliku (wskazanego jako pierwszy argument) | ||
| + | na podany rozmiar (wskazany jako drugi argument). | ||
| + | \\ | ||
| + | Zamień zawartość luk tak, żeby program próbował ustawić rozmiar pliku, a jeśli | ||
| + | to się nie powiedzie z powodu braku pliku, to najpierw spróbował utworzyć pusty | ||
| + | plik, a następne ponownie spróbował ustawić rozmiar pliku. | ||
| + | Jeżeli wystąpi inny błąd lub drugie ustawienie rozmiaru się nie powiedzie, | ||
| + | program ma wypisać komunikat z informacją dlaczego nie udało się ustawić | ||
| + | rozmiaru. | ||
| + | <html><div style="margin-top:-1.2em"></div></html> | ||
| + | <code c> | ||
| + | #include <fcntl.h> | ||
| + | #include <stdio.h> | ||
| + | #include <stdlib.h> | ||
| + | #include <unistd.h> | ||
| + | ┌────────────────────────────────────────────────────────┐ | ||
| + | │ │ | ||
| + | └────────────────────────────────────────────────────────┘ | ||
| + | |||
| + | int main(int ac, char **av) { | ||
| + | if (ac != 3) { | ||
| + | fprintf(stderr, "Usage:\n %s file size\n", av[0]); | ||
| + | return 1; | ||
| + | } | ||
| + | |||
| + | char *filename = av[1]; | ||
| + | |||
| + | char *endpt; | ||
| + | long size = strtol(av[2], &endpt, 10); | ||
| + | if (*endpt || size < 0) | ||
| + | fprintf(stderr, "\"%s\" is not a valid size\n", av[2]); | ||
| + | ┌─────────────────────────────────────────────────────────────────┐ | ||
| + | │truncate(filename, size); │ | ||
| + | │if ( /* truncate się powiódł */ ) │ | ||
| + | │ return 0; │ | ||
| + | │if ( /* truncate się nie powiódł, bo plik nie istnieje */ ) { │ | ||
| + | │ close(creat(filename, 0666)); │ | ||
| + | │ truncate(filename, size); │ | ||
| + | │ if ( /* truncate się powiódł */ ) │ | ||
| + | │ return 0; │ | ||
| + | │} │ | ||
| + | │/* wyświetl dlaczego truncate się nie powiódł */ │ | ||
| + | └─────────────────────────────────────────────────────────────────┘ | ||
| + | return 1; | ||
| } | } | ||
| </code> | </code> | ||
| Linia 331: | Linia 449: | ||
| pierwszą linią. | pierwszą linią. | ||
| + | **~~#~~.** | ||
| + | Uzupełnij lukę w poniższym programie tak, żeby program otrzymując argumenty np. | ||
| + | //''aecdmn''// oraz //''plik.txt''// zmienił na dysku zawartość | ||
| + | pliku o nazwie //''plik.txt''// zamieniając litery | ||
| + | ''a'' ↔ ''e'', ''c'' ↔ ''d'', i ''m'' ↔ ''n''. | ||
| + | \\ | ||
| + | <small> | ||
| + | Dla podanych powyżej przykładowych argumentów plik z zawartością | ||
| + | \\ | ||
| + | ''Hardware, n.: The parts of a computer system that can be kicked'' | ||
| + | \\ | ||
| + | powinien stać się plikiem z zawartością | ||
| + | \\ | ||
| + | ''Hercwera, m.: Tha perts of e donputar systan thet dem ba kidkac'' | ||
| + | </small> | ||
| + | \\ | ||
| + | Do obsługi plików program musi wykorzystać omawiane na wykładzie | ||
| + | i laboratoriach API (POSIX API). | ||
| + | \\ | ||
| + | Użycie innych API będzie skutkować ocenieniem zadania na 0 punktów. | ||
| + | \\ | ||
| + | Program ma pomijać obsługę błędów. Pamiętaj żeby zwolnić wszystkie zajęte zasoby. | ||
| + | \\ | ||
| + | <small> | ||
| + | Zauważ że tworzona w kodzie poniżej tablica ''tr'' pod indeksem każdego | ||
| + | znaku ma znak którym należy go zastąpić. | ||
| + | </small> | ||
| + | <html><div style="margin-top:-1.2em"></div></html> | ||
| + | <code c> | ||
| + | #include <fcntl.h> | ||
| + | #include <string.h> | ||
| + | #include <unistd.h> | ||
| + | |||
| + | int main(int ac, char **av) { | ||
| + | if (ac != 3) | ||
| + | return 1; | ||
| + | |||
| + | char *transforms = av[1]; | ||
| + | char *filename = av[2]; | ||
| + | |||
| + | char tr[256]; | ||
| + | for (int i = 0; i < 256; ++i) | ||
| + | tr[i] = i; | ||
| + | for (int i = 0; i < strlen(transforms); i += 2) { | ||
| + | tr[(unsigned)transforms[i ]] = transforms[i + 1]; | ||
| + | tr[(unsigned)transforms[i + 1]] = transforms[i ]; | ||
| + | } | ||
| + | ┌──────────────────────────────────────────────────────┐ | ||
| + | │ │ | ||
| + | │ │ | ||
| + | │ │ | ||
| + | │ │ | ||
| + | └──────────────────────────────────────────────────────┘ | ||
| + | return 0; | ||
| + | } | ||
| + | </code> | ||