Narzędzia użytkownika

Narzędzia witryny


so:test3_cwiczenia

Różnice

Różnice między wybraną wersją a wersją aktualną.

Odnośnik do tego porównania

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>​
  
so/test3_cwiczenia.txt · ostatnio zmienione: 2025/07/01 00:22 przez jkonczak