Program generujacy losowo litery odpowiadajace malym i duzym literom alfabetu
--Autorzy. Michal Danicki (138004), Maciej Szpakowski
--Krotki opis: program pobiera od uzytkownika nazwe pliku, po czym tworzy p~lik o
podanej nazwie i zapisuie w nim
litery alfabetu wraz z wygenerowanymi im losowo odpowiednikami --Dane weqsciowe: nazwa pliku, skladajaca sie nie wiecej niz z 30 znakow (Nazwa) --Dane wyjsciowe: program zapisuje litery alfabetu wraz z ich odpowiednikami w pliku
--Poprawnosc danych wejsciowych: podana nazwa pliku musi zawierac nie wiecej niz 30 znakow --Gr. dziek.: 6 --Gr. lab. : 5
WITH Ada.Text_lo;
USE Ada.Text_lo; --wejscie/wyjscie znakow i napisow
with Ada.Numerics.Discrete_Random; --obsluga generownia losowych liczb
PROCEDURE Generator is
subtype zakres is Positive range 1..52;
--podtyp liczb calkowitych do indeksowania tablicy duzych i malych liter
package Losowanie IS NEW Ada.Numerics.Discrete_Random(Zakres);
--przemianowanie pakietu Ada.Numerics.Discrete_Random na pakiet Losowanie
--z zaznaczeniem zakresu losowanych liczb (1..52)
T : ARRAY (Positive RANGE 1 .. 2, Zakres) OF character;
--tablica do przechowywania liter i wylosowanych im odpowiednikow
Czy_Byl : array (T1range (2)) OF Boolean := (OTHERS => False);
--tablica przechowuiaca za pomoca zmiennych logicznych, czy dana litera z pierwszego wiersza tablicy T zostala
--juz przyporzadkowana podczas generowania
G : Losowanie.Generator; --zmienna do genarowania losowej liczby
Pom : zakres; --zmienna pomocnicza sluzaca do
przechowywania numerow indeksow
Plik : File_Type; --zmienna plikowa sluzaca do zapisu
tablicy do pliku
Nazwa : String (1 .. 30); --nazwa pliku
Dlugosc : Natural := 0; --zmienna pomocnicza przy wczytywaniu
nazwy pii ku
BEGIN
--wczytanie do pierwszego wiersza tablicy T wielkich liter alfabetu
FOR I IN 1..26 LOOP
T(l,I):=Character'Val(1+64);
END LOOP;
--wczytanie do pierwszego wiersza tablicy T (na kolejnych miejscach) malych liter alfabetu
FOR I IN 27. .52 LOOP
T(l, I) :Character' val (1+70) ;
end LOOP;
Losowanie.Reset(G); --zresetowanie zmiennej G
--generowanie losowych liter odpowiadajacych literom alfabetu zapisanym w pierwszym wierszu tablicy FOR I IN zakres LOOP
LOOP
Pom:=Losowanie.Random(G); --wygenerowanie losowej liczby IF Czy_By1(Pom)=False THEN
--jezeli wylosowana liczba nie jest indeksem litery z pierwszego wiersza,
--ktora zostala juz wczesniej przyporzadkowana
T(2,l):=T(l,Pom);
--zapisanie w drugim wierszu tablicy wygenerowanej litery
Czy_Byl(Pom):=True;
--po przypisaniu przyjmujemy, ze litera z pierwszego wiersza tablicy
T o indeksie pom
--zostala juz przyporzadkowana exit; END IF; end loop;
END LOOP;
--zapis tab!icy do pliku
Put( Podaj nazwe pliku (maksymalnie 30 znakow): ");
Get_Line(Nazwa, Dlugosc); --pobranie nazwy pliku
IF DlugoSC=0 THEN
Putf'Podano niepoprawna nazwe pliku");
ELSE
Create(Piik,out_File,Nazwa(l..Dlugosc));
--utworzenie pliku o podanej nazwie
--zapis wartosci z kolejnycn kolumn tab!icy w kolejnych wierszach w pliku
FOR I IN zakres LOOP
put(Plik,T(l,D);
PutCPlik,":");
Put(Plik,T(2,i));
New_Line(Plik); END LOOP;
close(Plik); --zamkniecie pliku PutC'wygenerowana tablica zostala zapisana"); end IF;
DELAY 2.0;
END;
--Autorzy: Michal Danicki (138004), Maciej Szpakowski
--Krotki opis: program pobiera od uzytkownika nazwe pliku szyfru, pliku
zrodlowego i pliku wynikowego,
po czym szyfruje Tub deszyfruje (w zaleznosci od wyboru uzytkownika) plik zrodlowy szyfrem podstawianym
z wykorzystaniem par wczytanych z pliku szyfru i zapisuje wynik w pliku wynikowym. Znaki inne niz litery
alfabetu angielskiego sa skopiowane z pliku zrodlowego do wynikowego bez zmian.
--Dane wejsciowe: nazwy plikow: szyfru, zrodlowego i wynikowego skladajace sie nie wiecej niz z 30 znakow,
znaki odpowiadajace rodzajom operacji, jakie uzytkownik chce wykonac (szyfrowanie Tub odszyfrowywanie)
--Dane wyjsciowe: plik wyjsciowy zawierajacy znaki przetworzone (zaszyfrowane Tub odszyfrowane) z pliku zrodlowego
--Poprawnosc danych wejsciowych: podane nazwy plikow musza zawierac nie wiecej niz 30 znakow, pliki: zrodlowy i szyfru
musza istniec --Gr. dziek.: 6 --Gr. lab. : 5
with Ada.Text_io;
use Ada.Text_lo; -- wejscie/wyjscie znakow i napisow
procedure szyfrator is
SUBTYPE Zakres IS Positive RANGE 1..52;
--podtyp liczb calkowitych do indeksowania tablicy duzych i malych liter
T : array (Positive range 1 .. 2, zakres) OF Character; --tablica do przechowywania danych z pliku szyfru
--zawiera w pierwszym wierszu litery alfabetu, a w drugim przyporzadkowane
--tym literom losowo ich odpowiedniki
Plik_Szyfru,
Plik_zrodlowy,
Plik_Wynikowy : File_Type; --zmienne plikowe umozliwiajace dzialania
na plikacn
Nazwa : String (1 .. 30); --zmienna przechowujaca nazwy plikow
Dlugosc, --zmienna pomocnicza przy wczytywaniu nazwy
pliku
I : Natural; --licznik petli sprawdzjacej jaki znak z
pliku wejsciowego wczytano
Pom : Character; --zmienna przechowuja.ca wczytane z pliku
wejsciowego i szyfrowane znaki
BEGIN
--pobranie nazwy pliku szyfru
PutC'Podaj nazwe pliku szyfru (nie wiecej niz 30 znakow): ");
Get_Li ne(Nazwa,Dlugosc);
Open(Plik_szyfru, in_File, Nazwa(l..Dlugosc)); --otwarcie pliku szyfru
--wczytanie liter alfabetu wraz z przyporzadkowanymi tym literom odpowiednikami z pliku szyfru do tablicy T
for D IN Zakres LOOP
Get(Plik_Szyfru, T(l,3)); --wczytanie litery alfabetu
Get(Plik_Szyfru,Pom); --wczytanie znaku ":"
Get(Plik_Szyfru, T(2,D)); --wczytanie przyporzadkowanej litery
END LOOP;
close(Plik_szyfru); --zamkniecie pliku szyfru
--pobranie nazwy pliku zrodlowego
PutC'Podaj nazwe pliku zrodlowego (nie wiecej niz 30 znakow): ");
Szyfrator.adb Get_Line(Nazwa,Dlugosc);
Open(Plik_zrodlowy, in_File, Nazwa(l..Dlugosc)); --otwarcie pliku zrodlowego
--pobranie nazwy pliku wyjsciowego
PutC'Podaj nazwe pliku wynikowego (nie wiecej niz 30 znakow): ");
Get_Line(Nazwa,plugosc);
create(Piik_Wynikowy, Out_File, Nazwa(l..Dlugosc));
--stworzenie pliku wyjsciowego
Put_Line("Co chcesz zrobic: ");
put_Line("l. zaszyfrowac dane");
Put_Line("2. odszyfrowac dane");
Put("wcisnij 1 albo 2: ");
Get(Pom); --wczytanie znaku odpowiadajacego wybranej opcji
case Pom IS
when 'I1 => --kiedy uzytkownik chce zaszyfrowac dane
while (NOT End_Of_File(Plik_Zrodlowy)) and End_of_Line( Plik_zrodlowy) LOOP
New_Li ne(Pli k_wyni kowy);
--wstawienie nowej linii do pliku wyjsciowego
Skip_Line(Plik_Zrodlowy);
--przejscie do nowej linii w pliku zrodlowym END LOOP; LOOP
--w petli wczytywane sa kolejne znaki z pliku wejsciowego i po zastapieniu tych znakow ich
--odpowiednikami zapisywane do pliku wyjsciowego
Get(Plik_zrodlowy, Pom;;
--pobranie znaku z pliku wejsciowego
i:=0;
LOOP
--pet!a sprawdzajaca czy wczytany znak jest litera alfabetu angielskiego - czyli
--czy znak ten wystepuje w tablicy liter T
I:=!+!;
EXIT WHEN (T(l,l)=Pom) OR (l>=52);
--koniec petli kiedy znak znaleziono w tablicy
--Tub kiedy sprawdzono cala tab!ice i znak nie wystapil
END LOOP;
IF T(l,l)=Pom THEN
--jezeli poprzednia petla zakonczyla sie dlatego, ze znaleziono
--odpowiadajaca wczytanemu znakowi litere
Pom:=T(2,l);
--zmiennej pom przypisany zostaje znaleziony odpowiednik wczytanej litery
END IF;
Put (Pi i k_vyyni kowy, Pom) ;
--zapisanie zaszyfrowanego znaku do pliku wynikowego
EXIT when End_of_File(Plik_zrodlowy);
--warunek konczacy wczytywanie znakow z pliku wejsciowego,
--jezeli osiagnieto koniec pliku
--petla wstawiajaca nowa linie w pliku wyjsciowym, jezeli w pliku zrodlowym osiagnieto koniec linii, -- ale nie koniec pliku
--petla dziala do momentu, az w kolejnej linii w pliku zrodlowym znajduja sie jakies znaki
while End_Of_Line(Plik_Zrodlowy) LOOP
New_Li ne(Pii k_wyni kowy);
--wstawienie nowej linii do pliku wyjsciowego
Skip_Line(Plik_Zrodlowy);
--przejscie do nowej linii w pliku zrodlowym
END LOOP; END LOOP;
Put("zapisano dane w pliku wynikowym");
Strona 2
Szyfrator.adb
WHEN '2' => --kiedy uzytkownik chce odszyfrowac dane
while (not End_Of_File(Plik_zrodlowy)) AND End_Of_Line(
Plik_zrodlowy) loop New_Li ne (Pii k_wyni kowy);
--wstawienie nowej linii do pliku wyjsciowego Skip_Line(Plik_Zrodlowy);
--przejscie do nowej linii w pliku zrodlowym END LOOP;
LOOP
--w petli wczytywane sa kolejne znaki z pliku wejsciowego i po
zastapieniu tych znakow literami, ktorycn sa ^^
--odpowiednikami zapisywane do pliku wyjsciowego Get(Plik_Zrodlowy, Pom); --pobranie znaku z pliku wejsciowego l:=0;
LOOP
--petla sprawdzajaca czy wczytany znak jest litera alfabetu angielskiego - czyli
--czy znak ten wystepuje w tablicy liter T
I:=!+!;
EXIT VyHEN (T(2,l)=Pom) OR (I>=52);
--koniec petli kiedy litere znaleziono w tablicy jako odpowiednik
--jakiejs litery Tub kiedy sprawdzono cala tablice i znak nie wystapil
END LOOP;
IF T(2,I)=Pom THEN
--jezeli poprzednia petla zakonczyla sie dlatego, ze znaleziono
--w tablicy odpowiednikow litere taka jak wczytany znak
Pom:=T(l,l);
--zmiennej pom przypisana zostaje litera, ktorej odpowiednikiem jest wczytany znak END IF;
Put (Pi i k_Wyni kowy, Pom) ;
--zapisanie odszyfrowanego znaku do pliku wynikowego EXIT WHEN End_Of_File(Plik_zrodlowy);
--warunek konczacy wczytywanie znakow z pliku wejsciowego, --jezeli osiagnieto koniec pliku
--petla wstawiajaca nowa linie w pliku wyjsciowym, jezeli w pliku zrodlowym osiagnieto koniec linii, -- ale nie koniec pliku
--petla dziala do momentu, az w kolejnej linii w pliku zrodlowym znajduja sie jakies znaki
while End_Of_Line(Plik_zrodlowy) loop New_Li ne(Pli k_wyni kowy);
--wstawienie nowej linii do pliku wyjsciowego Ski p_Li ne(Pli k_zrodlowy);
--przejscie do nowej linii w pliku zrodlowym END LOOP;
END LOOP;
Put("Zapisano dane w pliku wynikowym");
WHEN OTHERS =>
--kiedy nie wybrano ani 1 ani 2 (ani zaszyfrowania ani odszyfrowania)
Put("Nie wybrano zadnej z dostepnych opcji"); end case;
close(Plik_zrodlowy); --zamkniecie pliku zrodlowego Close(Piik_wynikowy); --zamkniecie pliku wynikowego delay 2.0;
--obsluga wyjatkow
EXCEPTION
WHEN Name_Error =>
Put("Podano nazwe pliku. ktory nie istnieje");
DELAY 2.0; when use_Error =>
Put("wystapil bledny dostep do pliku");
Delay 2.0;
When End_error =>
Put(“Nastapil niespodziewany koniec pliku');
Delay 2.0;
end;