PDAclub.pl - Forum użytkowników technologii mobilnych
Różne => Hyde Park => Wątek zaczęty przez: Progressive w Maj 10, 2010, 17:43:41
-
Jak w temacie, potrzebuję pomocy w realizacji programu którego zadaniem ma być szyfrowanie/deszyfrowanie tekstu metodą przestawieniową. Użytkownik może sam wprowadzić parametry szyfrowania(szerokość kolumny) oraz wybierać między szyfrowaniem a deszyfrowaniem. Maksymalna długość wprowadzonego tekstu może wynosić maksymalnie 250 znaków(dopuszczalne duże, małe litery, cyfry, znaki interpunkcyjne).
Potrafię sklecić możliwość wyboru między deszyfrowaniem a szyfrowaniem, nie mam jednak pomysłu na realizację samego rdzenia programu czyli części deszyfrującej/szyfrującej. Jedyne co mi się udało to uzyskanie w miarę pomyślnych efektów przy szyfrowaniu z góry określonej ilości kolumn(użytkownik nie ma wyboru). Nie jest jednak to co chciałbym osiągnąć. Nie mam również pojęcia jak zrealizować deszyfrowanie zakodowanego tekstu.
Jeżeli jakiś bardziej doświadczony i obeznany z tematem kolega(a takich z pewnością tu nei brakuje) mógłby pomóc i naprowadzić na metodę rozwiązania byłbym bardzo wdzieczny.
-
Pisałem nie jeden program tego typu ale w C++. Szyfrowanie i deszyfrowanie dajmy na to wyrazu polegalo na przesunieciu kazdego pojedynczego symbolu(znaku) o pewna unikalna jednorazowa wartosc ktora odnosila sie do zapisu tego symbolu w kodzie ASCII. Kazdy symbol zostawal osobno odbierany i przesuwany w ASCII o <x> w "lewo" badz w "prawo". Nie wiem czy rozumiesz co mam na mysli :). Najprosciej czyli na poczatek tak sobie zrob ze bedzie ci przesuwal zawsze o ta sama wartosc w ta sama strone, pozniej o wartosc jaka ty mu wskazesz, pozniej o wartosc jaka ty mu wskazesz i strone rowniez, pozniej tworzysz spboe wzor na odpowiedni ciag arytmetyczny ktory gdzie ( <a(indeks)> w zapisie matematycznym ) a(1), a(2), a(3), ..., a(n) zaleznie od znakow calego zdania (da sie zczytac odpowiednia funkcja str...costam w c++) odpowiada wartosci przesuniecia kazdego kolejnego znaku odnosnie do indeksu i do tego np. wartosci podzielne przez 4 beda przesuniete w lewo a pozostale w prawo. Deszyfrowanie to oczywiscie wszystkie kroki po kolei robimy od tylu. Tak zaszyfrowane zdanie nie wiem czy ktos jest w stanie rozszyfrowac ? Jak znajde stary podrecznik to podrzuce ci kod takiego podstawowego szyfrowania w C++ o ile tam znajde to. pamietam to jak dzis. Pisalem taki program na 5 z programowania w technikum ;) :ok:
-
Szkoda, że Pascal bo chętnie bym się podjął.
-
Niestety, musi to być koniecznie Pascal, nic innego nie wchodzi w grę.
Po pewnych zabiegach udało mi się skonstruować coś takiego:
program szyfrowanie;
uses crt;
const n=250;
var
a:array[1..100,1..100] of char;
s:string[n];
k,b,c,d,e,f,g,h:integer;
begin
clrscr;
write('Podaj tekst do zaszyfrowania: ');
readln(s);
write('Podaj szerokosc kolumny: ');
readln(k);
f:=length(s);
b:=f div k + 1;
e:=0;
for c:=1 to b do
begin
writeln;
for d:=1 to k do
begin
e:=e+1;
a[c,d]:=s[e];
write(a[c,d]);
end;
end;
writeln('Oto zaszyfrowany tekst: ');
for c:=1 to k do
begin
for d:=1 to b do
write(a[d,c]);
end;
readln;
end.
O dziwo to działa, jednak brakuje mi jeszcze opcji deszyfrowania. Może mógłby ktoś coś doradzić?
-
Jak to uczniom komplikują życie. Chodzi o szyfr Cezara, tak? Implementacja w C++ to jak kotex mówił, parę chwil. Nie masz możliwości w pascalu jakoś zrobić podobnie?
-
Nie, to nie Szyfr Cezara. Ten który muszę wykorzystać działa na zasadzie:
rower jest zapisywane w kolumnach jako np:
ro
we
r
A następnie odczytywane kolumnami w dół, w tym przypadku rwroe.
Szerokość kolumn definiuje użytkownik. Mam teraz jedynie problem z deszyfrowaniem.
-
W C++ banalna sprawa. Tworzysz stringowa albo charowa (tez powinna dzialac) tablice o watosci wskazanej przez ciebie po czym stosujesz funkcje zczytujaca kazdy kolejny symbol(nie pamietam jak sie nazywala, nie mam jednak starego podrecznika) w wyrazie poprzez petle for (odpowiednio skonfigurowanej odnosnie twojej szerokosci kolumny) i importujesz odczytywane symbole do wczesniej utworzonej tablicy. I to by bylo na tyle. Deszyfrowanie robisz poprostu przez odczytywanie wartosci tablicy ale od tylu do przodu tez za pomoca petli for. W tym przypadku stosujac tablice dwuwymiarowa mozesz kazdy wyraz umiescic w innym wymiarze. Natomiast jesli chodzi o Turbo Pascal to ci nie pomoge bo nie czaje go.
-
z nudów napisałem na brudno w c++ (jako element przygotowania do matury :P)
Jeśli ci się przyda to dobrze.
#include <cstdlib>
#include <iostream>
#include <string>
#include <cmath>
using namespace std;
int main()
{
const int k=3, z=50; //liczba przesunięć
char tablica[z][k]={0};
char tablica2[z][k]={0};
string source;
string result, result2;
cout<<"Wprowadz ciag";
cin>>source;
unsigned int n=0, t=0;
n=source.size();
//crypt
for(int i=0;i<n; i++)
{
t=floor(i/k);
tablica[t][i%k]=source[i];
}
cout<<"\n";
for(int i=0; i<k;i++)
{
for(int j=0; j<ceil(n/k)+1;j++)
{
if(tablica[j][i]==0)
break;
else
result=result+tablica[j][i];
}
}
cout<<result;
//decrypt
int x=0;
for(int i=0; i<k;i++)
{
for(int j=0; j<ceil(n/k);j++)
{
tablica2[j][i]=result[x];
x++;
}
}
for(int i=0;i<n; i++)
{
t=floor(i/k);
result2=result2+tablica2[t][i%k];
}
cout<<"\n"<<result2;
system("PAUSE");
return EXIT_SUCCESS;
}
-
z nudów napisałem na brudno w c++ (jako element przygotowania do matury :P)
Jeśli ci się przyda to dobrze.
#include <cstdlib>
#include <iostream>
#include <string>
#include <cmath>
using namespace std;
int main()
{
const int k=3, z=50; //liczba przesunięć
char tablica[z][k]={0};
char tablica2[z][k]={0};
string source;
string result, result2;
cout<<"Wprowadz ciag";
cin>>source;
unsigned int n=0, t=0;
n=source.size();
//crypt
for(int i=0;i<n; i++)
{
t=floor(i/k);
tablica[t][i%k]=source[i];
}
cout<<"\n";
for(int i=0; i<k;i++)
{
for(int j=0; j<ceil(n/k)+1;j++)
{
if(tablica[j][i]==0)
break;
else
result=result+tablica[j][i];
}
}
cout<<result;
//decrypt
int x=0;
for(int i=0; i<k;i++)
{
for(int j=0; j<ceil(n/k);j++)
{
tablica2[j][i]=result[x];
x++;
}
}
for(int i=0;i<n; i++)
{
t=floor(i/k);
result2=result2+tablica2[t][i%k];
}
cout<<"\n"<<result2;
system("PAUSE");
return EXIT_SUCCESS;
}
Dlaczego nie uzywasz funkcji ? Wszystko w main wladowane :mysli:
-
mówiłem, że na brudno? :wink: Po prostu napisałem, bez formatowania, bez komentarzy, bez optymalizacji (pętla przejeżdża więcej razy niż to konieczne).
Połączone: Maj 18, 2010, 14:53:30
Progressive, wiszę ci duże piwo za ten temat, dzisiaj na maturze z informatyki rozszerzonej był ten sam algorytm, tylko w prostszej postaci :ok:
Podaj konto albo paypala na PW to ci coś dorzucę na flachę :wink: