• Nie Znaleziono Wyników

Zadania z Języka C dla grup 7. i 9. Zestaw IV

N/A
N/A
Protected

Academic year: 2021

Share "Zadania z Języka C dla grup 7. i 9. Zestaw IV"

Copied!
2
0
0

Pełen tekst

(1)

Zadania z Języka C dla grup 7. i 9.

Zestaw IV - grudzień 2015 / styczeń 2016

13. Szyfrowanie plików. Napisać prosty program, który szyfruje zawartość pliku za pomocą hasła wpisywanego z klawiatury. Nazwę pliku do zaszyfrowania po- dajemy jako argument wywołania programu (“$ ./szyfruj mojplik.dat”); plik o podanej nazwie jest otwierany do odczytu binarnego za pomocą instrukcji

if (NULL==(file1=fopen(Arg[1],"rb"))) return 1;

gdzie tablica wskaźników char *Arg[] jest parametrem funkcji main (por. Zada- nie 6. z Zestawu II). Ponadto, otwieramy plik tymczasowy do zapisu binarnego

if (NULL==(file2=fopen(Tymczasowy,"wb"))) return 1;

którego nazwa generowana jest wcześniej funkcją tmpnam(Tymczasowy) z biblioteki standardowej. Zasadnicza część programu to czytanie kolejnych znaków funkcją znak=getc(file1), szyfrowanie za pomocą operacji binarnej:

znak ^= haslo[ j %(dlugosc_hasla) ];

(j to numer kolejnego czytanego znaku, pozostałe zmienne objaśniam niżej) oraz zapis do pliku tymczasowego: putc(...). Jak wspomniano wyżej, hasło (przecho- wywane w tablicy znakowej haslo[...] o pewnym założonym rozmiarze maksy- malnym) może być wczytywane z klawiatury bezpośrednio po uruchomieniu pro- gramu, jego faktyczną długość (dlugosc_hasla) można określić z pomocą funkcji strlen. Do sprawdzania, czy nie osiągnięto końca pliku wejściowego, służy funk- cja feof(file1), która powinna być wywoływana bezpośrednio po każdorazowym wczytaniu znaku. Na koniec, należy użyć funkcji unlink(Arg[1]) i rename(...), tak aby zastąpić plik wejściowy plikiem zaszyfrowanym. Powtórne wywołanie pro- gramu, z tym samym hasłem, powinno odszyfrować zakodowaną wiadomość.

14. Kalkulator. Tzw. odwrotna notacja polska to wygodna (dla komputera ...) forma zapisu działań arytmetycznych i nie tylko. Przykładowo, działanie (3 + 7) · (11 − 1) będzie miało w tej notacji postać:

3 7 + 11 1 - *

Komputer interpretuje taki zapis następująco: każdy operand (tutaj operandami są po prostu liczby) jest odkładany na stos, każdy operator dwuargumentowy (tu- taj: “+”, “-” , “*”) powoduje zdjęcie ze stosu dwóch elementów i położenie wyniku operacji. Jak widać, nawiasy nie są potrzebne, zaś notacja jest jedno- znaczna pod warunkiem, że ustalimy ilu argumentów potrzebuje dany operator:

(2)

a zatem, jeśli np. “-” oznacza odejmowanie, to nie może równocześnie oznaczać zmiany znaku ostatniego argumentu.

Napisać prosty, obsługiwany za pośrednictwem terminalu tekstowego, kalkulator interpretujący działania arytmetyczne wprowadzane w notacji odwrotnej polskiej.

Do implementacji stosu można użyć zmiennych globalnych: tablicy liczb typu double o pewnym założonym rozmiarze maksymalnym, zmiennej typu int prze- chowującej aktualną liczbę argumentów na stosie, oraz dwóch funkcji:

void push(double); double pop(void);

odpowiednio do odkładania argumentu na stosie i zciągania argumentu ze stosu (funkcje te powinny sprawdzać, czy maksymalny rozmiar stosu nie został przekro- czony, lub czy stos nie jest pusty, i generować odpowiednie komunikaty wypisywane na ekran). Operatory i operandy można wczytywać instrukcją scanf("%s",oper);

gdzie oper to zadeklarowana wcześniej tablica znakowa (taka konstrukcja zapewnia poprawną interpretację standardowych separatorów). Później, należy dokonywać identyfikacji co zostało wczytane.

Po pierwsze, wprowadzenie liczby można rozpoznać z pomocą funkcji isdigit z pliku <ctype.h> (warto pamiętać o możliwości wystąpienia wiodącego minusa, jeśli dopuścimy działania na dla liczbach ujemnych). W pozostałych przypadkach pomocna będzie funkcja strcmp z nagłówka <string.h>. Przykładowo, fragment kodu odpowiedzialny za dodawanie może wyglądać tak:

if (!strcmp(wyr,"+")) { y=pop();

x=pop();

push(x+y);

}

gdzie x i y to zadeklarowane wcześniej zmienne typu double.

W wersji podstawowej, kalkulator powinien obsługiwać operatory: “+”, “-”,

“*”, “/”; jak również operator “=”, który zdejmuje ostatni argument ze stosu i wypisuje na ekran. Aby zakończyć działanie kalkulatora, wprowadzamy ustalony znak, np. “q”. Proszę samodzielnie zaproponować proste rozszerzenia kalkulatora, tak aby np. obliczał potęgi, logarytmy, funkcje trygonometryczne. Proszę zwrócić uwagę, że funkcja strcmp jest bardzo elastyczna, np. konstrukcja:

if (!strcmp(wyr,"moja-specjalna-funkcja")) {...}

zachowa się jak trzeba, o ile tylko na stosie znajdować się będzie potrzebna liczba argumentów.

Cytaty

Powiązane dokumenty

Schinzlowi za pomoc w sformułowaniu niniejszego artykułu, jak również za wskazanie twierdzenia Prachara, na którym opiera się część dowodu twierdzenia 3.. Prace

Napisa¢ równania Friedmana dla pyªu z dodatni¡ staª¡ kosmologiczn¡ i dobra¢ tak warto±ci parametrów, aby rozwi¡zanie byªo statyczne.. Pokaza¢, »e to

Pokaza´c, ˙ze det A jest liczb ˛a całkowit ˛a... Zastosowa´c indukcj˛e wzgl˛edem stopnia

W artykule omówiono zasadê dzia³ania ogniwa paliwowego typu PEMFC (ang. Proton Exchange Membrane Fuel Cell).. Scharakteryzowano ró¿ne typy

Proszę napisać funkcje, która mnoży dwie liczby typu unsigned (albo unsigned long), a wynik zapamiętuje w dwóch innych zmiennych, z których jedna przechowuje najmłodsze bity

W przypadku funkcji generującej liczby losowe metodą Boxa-Mullera, można zadbać o to, aby przy nieparzystym wywołaniu była wykonywana cała pro- cedura począwszy od losowania liczb x

Napisać program, który czyta ciąg liczb ze standardowego wejścia aż do wystąpie- nia znaku końca pliku (kombinacja klawiszy Ctrl–D na klawiaturze), a następnie oblicza

, n−1, dla każdej permutacji określa liczbę punktów stałych k, oraz wylicza, ile razy w ciągu N permutacji mamy k = 0.. Ułamek N/N k=0 stanowi oszacowanie