Program szyfrujący GADERYPOLUKI

0

Witam! Mam do napisania programik szyfrujący używający szyfru Gaderypoluki.

Gaderypoluki - bardzo prosty szyfr podstawieniowy. Najpierw należy podzielić sylabami (podzielić na pary) klucz szyfru, np. GA-DE-RY-PO-LU-KI. Aby zakodować literę, która znajduje się w kluczu, należy literę kodowaną zastąpić drugą literą z pary (sąsiadującą). Np. literę Y zakoduje się literą R (i odwrotnie). Jeśli litera do zakodowania nie występuje w kluczu, np. Z to przepisuje się ją bez żadnych zmian (tak samo jest ze znakami przestankowymi).

Ma może ktoś napisany taki programik w C++ lub C i chciałby sie nim podzielic? Albo może miałby ktos czas taki algorytm wymyslic? Byłbym wdzieczny :) Pozdrawiam

0

Nie bardzo rozumiem co tu jest do wymyślania. Masz przecież podany algorytm i masz go tylko napisać. Tak trudno napisać kilka ifów?

0

no dla osoby, która nie programowała nigdy to trudne...

0

Nie jest to pewnie najlepiej napisany kod, ale działa:

#include <cstdio>
#include <cstdlib>
#include <cstring>
int main()
{
	char szyfr[] = {"GADERYPOLUKI"};
	char tablica[20] = {'\0'};
	char zaszyfrowane[20] = {'\0'};
	printf("Podaj ciag znakow, ktory chcesz zakodowac:\nMax 20 znakow\n");
	scanf("%s",tablica);
	for (int i = 0; i < strlen(tablica); i++)
	{
		for (int j = 0; j < strlen(szyfr); j++)
		{
			if (tablica[i] == szyfr[j])
			{
				if (j%2 == 0)
				{
					zaszyfrowane[i] = szyfr[j+1];
					break;
				}
				else
				{
					zaszyfrowane[i] = szyfr[j-1];
					break;
				}
			}
			else
			{
				zaszyfrowane[i] = tablica[i];
			}
		}
	}
	printf("%s\n",zaszyfrowane);
	system("pause");
	return 0;
}
0

Dziekuje bardzo za pomoc :)

0

Proszę bardzo.

0

Chociaz cos chyba nie dziala tak jak trzeba, bo jak wpisuje np ala ma kota to wynikiem jest ala, a powinno byc GUG MG IPTG...

0

Tylko duże litery wpisz:
ALA MA KOTA

Jak chcesz te małe to dopisz tylko do tablicy szyfr małe litery po dużych.

0

Bo 'program' działa tylko dla dużych liter. A jeśli wpiszesz więcej niż 20 znaków to prawdopodobnie dostaniesz pięknego segfaulta. Więcej błędów mi się nie chciało szukać.

0

Wiem, że działa tylko na 20 znakach, jest napisane... Jeśli będzie chciał to doda sobie dynamiczną alokację jak poczyta.

0

dziekuje za szybka odpowiedz

0

a mam jeszcze jedno pytanko - jak zmierzyc czas wykonywania się takowego algorytmu?

0

Zależy do systemu. Dla windows masz np getTickCount() z <windows.h>

0

czyli do kodu dopisuje cos takiego ?:
#include <cstdlib>
#include <iostream>
#include <windows.h>

main (void)
{
long long double a,b,c,d;
int t1, t2, h, m, s;

     t1=GetTickCount();

for (a = 1; a <= 1024; a++)
{
b=a;
c=a * 24 * a;
d=a * 102400 / 3;
std::cout << a * b << std::endl;
std::cout << a * c << std::endl;
std::cout << a * d << std::endl;
std::cout << c * d << std::endl;
}
std::cout << "Test passed.\n" << std::endl;
t2=GetTickCount() - t1;
s = t2 % 60; // reszta z dzielenia ilosci sekund przez 60 daje nam "koncowke"
m = (t2 / 60) % 60; // dzielimy przez 60, aby uzyskac ilosc minut, ale interesuje nas tylko reszta z dzielenia przez 60, aby przy czasie >1h nie otrzymac dziwnych wynikow
h = t2 / 3600; // dzielimy przez ilosc sekund w godzinie i mamy ilosc godzin
std::cout << h << std::endl; std::cout << m << std::endl; std::cout << s << std::endl;

     system("Pause");

}
A czy jest to w miarę dokładne?

0

Na tyle dokładne ile się tylko da, bo mierzy ci ilość ticków procesora, przy czym twoje przeliczenie tego niekoniecznie jest poprawne bo skąd wiesz jaka jest rozdzielczość? To jest 10-16 milisekund z reguły.

0

Bo slyszalem o QueryPerformanceCounter i QueryPerformanceFrequency, tylko nie za bardzo wiem jak z tego skorzystac, ponoc jest bardziej dokladny... Jak w tym kodzie można to zastosowac?

0

jak chcesz policzyć dokładniej, to wywołaj kod w bardzo długiej pętli, a później podziel końcowy czas przez ilość iteracji pętli, przy dużej ilości wykonan spokojnie gettickcount wystarczy

0 użytkowników online, w tym zalogowanych: 0, gości: 0