przejście do zawartości
Jan Kończak
Narzędzia użytkownika
Zaloguj
Narzędzia witryny
Narzędzia
Pokaż stronę
Poprzednie wersje
Odnośniki
Ostatnie zmiany
Menadżer multimediów
Indeks
Zaloguj
Ostatnie zmiany
Menadżer multimediów
Indeks
Jesteś tutaj:
start
»
so
»
test3_cwiczenia
so:test3_cwiczenia
Ta strona jest tylko do odczytu. Możesz wyświetlić źródła tej strony ale nie możesz ich zmienić.
<html><style>pre{font-family:DejaVu Sans Mono}</style></html> Strona zawiera przykładowe pytania jakie mogą pojawić się na teście. \\ Pytania na teście będą podobnego rodzaju, natomiast poniższe przykładowe pytania nie wyczerpują całego zakresu materiału. ==== Bash ==== **~~#~~.** Podaj __początek__ skryptu który sprawdzi czy został uruchomiony z dwoma argumentami i czy drugi z nich jest ścieżką do istniejącego katalogu. \\ Jeśli któryś z tych warunków nie jest spełniony, skrypt ma wyświetlić na ekranie odpowiednio komunikat ''Skrypt musi mieć dwa argumenty!'' lub ''Drugim argumentem musi być ścieżka do istniejącego katalogu!'' i wyjść. W przeciwnym razie skrypt ma kontynuować pracę. **~~#~~.** Podaj __początek__ skryptu który sprawdzi czy został uruchomiony z przynajmniej dwoma argumentami i czy suma dwóch pierwszych argumentów jest parzysta. \\ Jeśli któryś z tych warunków nie jest spełniony, skrypt ma wyświetlić na ekranie odpowiednio komunikat ''Skrypt musi mieć co najmniej dwa argumenty!'' lub ''Suma dwóch pierwszych argumentów nie jest parzysta!'' 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//'' -------------------------- **~~#~~.** Podaj komendę lub komendy które wypiszą pięć losowych liczb z zakresu 100-499. \\ <small> Podpowiedź: do rozwiązania może przydać się zmienna ''RANDOM'' </small> **~~#~~.** Napisz skrypt który przyjmuje dwa argumenty - szerokość i wysokość, a następnie rysuje (używając znaków ''#'') ramkę tych rozmiarów. \\ Załóż że skrypt zawsze będzie wywoływany z poprawnymi argumentami, tzn. dwoma liczbami większymi niż 2. \\ <small> Przykładowe wjście skryptu dla wywołania przez ''./script.sh 15 4'': <html><div style="margin-top:-1.2em"></div></html> <code> ############## # # # # ############## </code> </small> **~~#~~.** Podaj treść skryptu, który dla każdego z argumentów: * sprawdzi czy argument jest zwykłym plikiem * jeżeli nie jest, wyświetli komunikat ''//ARG// nie jest plikiem'', gdzie //ARG// ma być wartością argumentu * jeżeli jest, wyświetli jego nazwę oraz pierwszą i ostatnią linię **~~#~~.** Podaj treść skryptu, który dla każdego pliku z rozszerzeniem ''.rc'' z katalogu ''/etc'' wypisze nazwę pliku oraz linie nie zaczynające się od ''#''. <small> Oczywiście skrypt ma działać również w przypadku jeśli któryś plik ma spację w nazwie. </small> **~~#~~.** Katalog ''/usr/share/figlet/fonts'' zawiera pliki rozszerzeniami ''.flf'' – czcionkami programu ''figlet''. \\ Żeby użyć np. czcionki ''/usr/share/figlet/fonts/block.flf'' do wypisania tekstu //Text// można wykonać ''figlet -f block //Text//''. \\ Podaj komendę lub komendy które stworzą funkcję o nazwie ''allFonts'', która podany jako pierwszy argument tekst wypisze programem ''figlet'' kolejno w każdej z dostępnych czcionek, poprzedzając każde wypisanie nazwą czcionki. \\ <small> Przykładowy wynik wywołania funkcji: <html><div style="margin-top:-1.2em"></div></html> <html><pre style="line-height:1em"> <span style="font-weight:bold;color:#00ff00;">user@host</span><span style="font-weight:bold;color:#5c5cff;"> ~ $</span> allFonts Tekst (...) small _____ _ _ |_ _|__| |__ __| |_ | |/ -_) / /(_-< _| |_|\___|_\_\/__/\__| smscript _____ () | _ |) , _|_ ||/ |/) / \_| (/ |_/| \/ \/ |_/ (...) </pre> </html> </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ą. -------------------------- **~~#~~.** Podaj treść skryptu który będzie na koniec pliku podanego jaki pierwszy argument dopisywać wynik polecenia ''fortune'' dopóki plik nie będzie mieć przynajmniej 42 linii. Jeśli wskazany plik nie istnieje, należy go stworzyć. **~~#~~.** Napisz funkcję o nazwie ''getNextLogFile'', która najpierw będzie w pętli sprawdzać czy w bieżącym katalogu istnieją pliki o nazwie ''log.0'', ''log.1'', ''log.2'', ''log.3'', … \\ Przy pierwszej nazwie ''log.//i//'' która odnosi się do nieistniejącego 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. **~~#~~.** 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. **~~#~~.** Podaj komendy powłoki które wypiszą wszystkie potęgi dwójki mniejsze niż wartość zmiennej ''WINDOWID''. \\ Wynik ma mieć następującą formę: <small> <html><div style="margin-top:-1.2em"></div></html> <code> 0 1 1 2 2 4 3 8 4 16 5 32 6 64 ... </code> </small> **~~#~~.** Problem Collatza to pytanie czy ciąg liczb c₁, c₂, c₃, … konstruowany w następujący sposób: \\ c<sub>n+1</sub> = (c<sub>n</sub>%2 == 0) ? c<sub>n</sub>/2 : 3*c<sub>n</sub>+1 \\ w skończonej liczbie kroków dotrze do elementu cᵢ == 1 dla dowolnej liczby naturalnej c₁. \\ Napisz komendy powłoki które podadzą kolejne liczby takiego ciągu rozpoczynając od liczby 7. \\ <small> Oczekiwany wynik komend (''……'' zastępuje kilkanaście linii): <html><div style="margin-top:-1.2em"></div></html> <code> 7 22 11 …… 4 2 1 </code> </small> -------------------------- **~~#~~.** Podaj linie które trzeba wpisać do skryptu żeby: * stworzyć funkcję o nazwie ''interruptHandler'' która wypisze na standardowe wyjście tekst ''Interrupted!'' i jeżeli jest ustawiona zmienna ''TMPFILE'', to usunie plik wskazany wskazany przez tą zmienną, * ustawić, żeby ta funkcja była wywoływana w konsekwencji naciśnięcia //Ctrl+c//. **~~#~~.** Komenda ''date +%s'' wypisuje //Unix time//, tzn. liczbę sekund które upłynęły od 1 stycznia 1970r. Odjęcie dwóch wyników tej komendy obliczy czas w sekundach między wywołaniami tych komend (z błędem do 1 sekundy). \\ Podaj linie które trzeba wpisać __na początek__ skryptu, żeby na końcu działania skryptu skrypt wyświetlił tekst ''Wykonanie skryptu trwało //N// sekund.'', gdzie //N// ma być zastąpione faktyczną liczbą sekund. -------------------------- **~~#~~.** Napisz skrypt, który: <html><div style="margin-top:-1.2em"></div></html> - Przypisze do zmiennej ''TO_GUESS'' losową wartość z zakresu od 0 do 1023 (możesz skorzystać ze zmiennej ''RANDOM'') - Poprosi użytkownika o podanie liczby - Jeżeli podana przez użytkownika liczba jest: * równa wartości ''TO_GUESS'', wyświetli komunikat ''Odgadłeś w //N// próbach'' (gdzie //N// to liczba podanych przez użytkownika liczb) i zakończy działanie skryptu, * mniejsza niż wartość ''TO_GUESS'', wyświetli komunikat ''Szukana liczba jest większa'', * większa niż wartość ''TO_GUESS'', wyświetli komunikat ''Szukana liczba jest mniejsza'', - wróci do kroku 2 **~~#~~.** Podaj komendy (=fragment skryptu) które odczytują ze standardowego wejścia liczby (podawane po jednej liczbie w wierszu) i je sumują. Liczby mają być odczytywane do pierwszej pustej linii (lub końca pliku), 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 ==== **~~#~~.** 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. -------------------------- **~~#~~.** Wyjaśnij co robi poniższy kod: <html><div style="margin-top:-1.2em"></div></html> <code c> int main(int ac, char *av[]) { if (ac < 3) return 1; char *end; int perms = strtol(av[1], &end, 8); if (!av[1][0] || *end) return 1; for (int i = 2; i < ac; ++i) { int fd = creat(av[i], perms); close(fd); } return 0; } </code> **~~#~~.** Wyjaśnij co robi poniższy kod. Podaj w jakim przypadku kod nie zadziała w pełni poprawnie i zaproponuj co zmienić w kodzie by zawsze dział dobrze. <html><div style="margin-top:-1.2em"></div></html> <code c> int main(int ac, char *av[]) { if (ac != 2) return 1; int fd = open(av[1], O_RDONLY); if (fd == -1) return 1; char buf[64]; lseek(fd, -64, SEEK_END); read(fd, buf, 64); write(1, buf, 64); return 0; } </code> **~~#~~.** Wyjaśnij co robi poniższy kod. Kod zawiera błąd – podaj jakiego rodzaju problemy może spowodować ten błąd i zaproponuj co zmienić w kodzie by to poprawić. <html><div style="margin-top:-1.2em"></div></html> <code c> int addLogEntry(const char *cstr) { int fd = open("log", O_WRONLY | O_APPEND); if (fd == -1) return -1; char buf[256]; int len = sprintf(buf, "[%ld] %s\n", time(NULL), cstr); int rv = write(fd, buf, len); int e = errno; close(fd); errno = e; return rv == -1 ? -1 : 0; } </code> -------------------------- **~~#~~.** W poniższym kodzie uzupełnij lukę wyrażeniami które w razie wstąpienia błędu przy tworzeniu pliku wyświetlą nazwę pliku którego nie udało się stworzyć oraz zrozumiałą dla człowieka przyczynę błędu: <html><div style="margin-top:-1.2em"></div></html> <code c> int main(int ac, char *av[]) { if (ac < 3) return 1; char *end; int perms = strtol(av[1], &end, 8); if (!av[1][0] || *end) return 1; for (int i = 2; i < ac; ++i) { int fd = creat(av[i], perms); ┌────────────────────────────┐ │ │ └────────────────────────────┘ close(fd); } 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> **~~#~~.** Podaj (<small>bądź uzupełnij lukę w innym przykładowym kodzie</small>) jak dowiedzieć się, że otwarcie pliku się nie powiodło z powodu braku uprawnień. -------------------------- **~~#~~.** Napisz program który wyświetli na ekranie całą zawartość pliku podanego jako pierwszy argument, "szyfrując" w treści litery z zakresu ASCII szyfrem Cezara (z przesunięciem o 3). **~~#~~.** Napisz program który dla każdego z podanych jako argumenty plików poda nazwę pliku i ilość bajtów w najdłuższej linii (załóż, że linie są kończone przez bajt ''%%'\n'%%''. **~~#~~.** Napisz program który jako argumenty przyjmuje dwie ścieżki do plików i wypisuje na standardowe wyjście czy pliki są identyczne. **~~#~~.** Napisz program który jako argument przyjmuje: ścieżkę do pliku źródłowego, zakres (dwie liczby) oraz ścieżkę do pliku docelowego Program ma utworzyć nowy plik o podanej nazwie i zapisać w nim bajty z podanego zakresu z pliku źródłowego. <small> \\ Przykład działania: <html><div style="margin-top:-1.2em"></div></html> <html> <pre> <span style="color:gray">user@host:~ $</span> <b>cat source</b> Kids always brighten up a house; mostly by leaving the lights on. <span style="color:gray">user@host:~ $</span> <b>./<i>prog</i> source 13 32 destination</b> <span style="color:gray">user@host:~ $</span> <b>cat destination</b> brighten up a house; </pre> </html> </small> **~~#~~.** Napisz program który usunie z pliku wskazanego jako argument wszystko poza 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>
so/test3_cwiczenia.txt
· ostatnio zmienione: 2025/07/01 00:22 przez
jkonczak
Narzędzia strony
Pokaż stronę
Poprzednie wersje
Odnośniki
Złóż / rozłóż wszystko
Do góry