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