Szyfrator i Deszyfrator alfabetu Morse'a.

0

Witam,

mam spore problemy z zadaniem domowym na PP. Zadanie brzmi:

Napisać program tłumaczący plik wejściowy na alfabet Morse’a i odwrotnie. Nazwa pliku do
przetłumaczenia podawana jest w linii poleceń po przełączniku -i, pliku wyjściowego po przełączniku
-o, kierunek tłumaczenia po -k, przy czym -k l2m oznacza tłumaczenie z alfabetu łacińskiego na
alfabet Morse’a, a -k m2l odwrotnie. Przykładowe wywołanie programu:
program.exe -o wyjscie -k m2l -i wejscie

Mój obecny kod wygląda tak:

 program tlumacz_morsea;
var
  i:integer;

procedure szyfrator(sciezka1:string); //zmienna sciezka1 ktora trzyma scezke do pliku
  var
     plik1 : text;
     tekst, tekst_wyjsciowy : string; //
     dlugosc, dlugosc_tekst : integer;//zmienna sterujaca petla
     j : integer;
begin
     tekst_wyjsciowy:='';
     assign(plik1,sciezka1);
     reset(plik1);
     while not Eof(plik1) do
      begin
       read(plik1,tekst);
       dlugosc_tekst:=Length(tekst);
       for j:=0 to dlugosc_tekst do
        begin
         if (tekst[j]=('a')) or (tekst[j]=('A')) then tekst_wyjsciowy:=tekst_wyjsciowy+('/*-/') else
         if (tekst[j]=('b')) or (tekst[j]=('B')) then tekst_wyjsciowy:=tekst_wyjsciowy+('/-***/') else
         if (tekst[j]=('c')) or (tekst[j]=('C')) then tekst_wyjsciowy:=tekst_wyjsciowy+('/-*-*/') else
         if (tekst[j]=('d')) or (tekst[j]=('D')) then tekst_wyjsciowy:=tekst_wyjsciowy+('/-**/') else
         if (tekst[j]=('e')) or (tekst[j]=('E')) then tekst_wyjsciowy:=tekst_wyjsciowy+('/*/') else
         if (tekst[j]=('f')) or (tekst[j]=('F')) then tekst_wyjsciowy:=tekst_wyjsciowy+('/**-*/') else
         if (tekst[j]=('g')) or (tekst[j]=('G')) then tekst_wyjsciowy:=tekst_wyjsciowy+('/--*/') else
         if (tekst[j]=('h')) or (tekst[j]=('H')) then tekst_wyjsciowy:=tekst_wyjsciowy+('/****/') else
         if (tekst[j]=('i')) or (tekst[j]=('I')) then tekst_wyjsciowy:=tekst_wyjsciowy+('/**/') else
         if (tekst[j]=('j')) or (tekst[j]=('J')) then tekst_wyjsciowy:=tekst_wyjsciowy+('/*---/') else
         if (tekst[j]=('k')) or (tekst[j]=('K')) then tekst_wyjsciowy:=tekst_wyjsciowy+('/-*-/') else
         if (tekst[j]=('l')) or (tekst[j]=('L')) then tekst_wyjsciowy:=tekst_wyjsciowy+('/*-**/') else
         if (tekst[j]=('m')) or (tekst[j]=('M')) then tekst_wyjsciowy:=tekst_wyjsciowy+('/--/') else
         if (tekst[j]=('n')) or (tekst[j]=('N')) then tekst_wyjsciowy:=tekst_wyjsciowy+('/-*/') else
         if (tekst[j]=('o')) or (tekst[j]=('O')) then tekst_wyjsciowy:=tekst_wyjsciowy+('/---/') else
         if (tekst[j]=('p')) or (tekst[j]=('P')) then tekst_wyjsciowy:=tekst_wyjsciowy+('/*--*/') else
         if (tekst[j]=('q')) or (tekst[j]=('Q')) then tekst_wyjsciowy:=tekst_wyjsciowy+('/--*-/') else
         if (tekst[j]=('r')) or (tekst[j]=('R')) then tekst_wyjsciowy:=tekst_wyjsciowy+('/*-*/') else
         if (tekst[j]=('s')) or (tekst[j]=('S')) then tekst_wyjsciowy:=tekst_wyjsciowy+('/***/') else
         if (tekst[j]=('t')) or (tekst[j]=('T')) then tekst_wyjsciowy:=tekst_wyjsciowy+('/-/') else
         if (tekst[j]=('u')) or (tekst[j]=('U')) then tekst_wyjsciowy:=tekst_wyjsciowy+('/**-/') else
         if (tekst[j]=('w')) or (tekst[j]=('W')) then tekst_wyjsciowy:=tekst_wyjsciowy+('/*--/') else
         if (tekst[j]=('x')) or (tekst[j]=('X')) then tekst_wyjsciowy:=tekst_wyjsciowy+('/-**-/') else
         if (tekst[j]=('z')) or (tekst[j]=('Z')) then tekst_wyjsciowy:=tekst_wyjsciowy+('/--**/') else
         if (tekst[j]=('1')) then tekst_wyjsciowy:=tekst_wyjsciowy+('/*----/') else
         if (tekst[j]=('2')) then tekst_wyjsciowy:=tekst_wyjsciowy+('/**---/') else
         if (tekst[j]=('3')) then tekst_wyjsciowy:=tekst_wyjsciowy+('/***--/') else
         if (tekst[j]=('4')) then tekst_wyjsciowy:=tekst_wyjsciowy+('/****-/') else
         if (tekst[j]=('5')) then tekst_wyjsciowy:=tekst_wyjsciowy+('/*****/') else
         if (tekst[j]=('6')) then tekst_wyjsciowy:=tekst_wyjsciowy+('/-****/') else
         if (tekst[j]=('7')) then tekst_wyjsciowy:=tekst_wyjsciowy+('/--***/') else
         if (tekst[j]=('8')) then tekst_wyjsciowy:=tekst_wyjsciowy+('/---**/') else
         if (tekst[j]=('9')) then tekst_wyjsciowy:=tekst_wyjsciowy+('/----*/') else
         if (tekst[j]=('0')) then tekst_wyjsciowy:=tekst_wyjsciowy+('/-----/') else
         if (tekst[j]=('.')) then tekst_wyjsciowy:=tekst_wyjsciowy+('/*-*-*-/') else
         if (tekst[j]=(',')) then tekst_wyjsciowy:=tekst_wyjsciowy+('/--**--/') else
         if (tekst[j]=('!')) then tekst_wyjsciowy:=tekst_wyjsciowy+('/-*-*--/') else
         if (tekst[j]=('?')) then tekst_wyjsciowy:=tekst_wyjsciowy+('/**--**/') else
         if (tekst[j]=(' ')) then tekst_wyjsciowy:=tekst_wyjsciowy+('/') else tekst_wyjsciowy:=tekst_wyjsciowy+tekst[j];
        end;
      end;
end;
procedure deszyfrator(sciezka2:string);
var
     plik2 : text;
     tekst2, tekst_wyjsciowy2 : string;
     j : integer;
     tablica : array [1..1000] of string;
begin
     j:=0;
     tekst_wyjsciowy2:='';
     assign(plik2,sciezka2);
     reset(plik2);
     while not Eof(plik2) do
      begin
        read(plik2,tekst2);
        dlugosc_tekst:=Length(tekst2);
        for j:=0 to dlugosc_tekst do
         begin
          if (tekst2[j]<>('/')) and (tekst2[j+1]<>('/')) and (tekst2[j+2]<>('/')) then read(plik2,tekst2);
         end;
      end;
end;
begin

end.

Moje pytania:

  1. Czy procedura szyfratora jest ok? Chodzi mi o wczytywanie pliku zewnętrznego.
  2. W jaki sposób uzyskać wymagany efekt "Nazwa pliku do przetłumaczenia podawana jest w linii poleceń". Niestety szukałem w googlach i nie znalazłem nic co by mi pomogło :(
  3. Nie wiem jak się zabrać za szyfrowanie, to z czym kombinuje jest w kodzie ale nie wiem czy to ma w ogóle sens bo nie wiem jak przekazać do programu te pliki i parametry.

Ogółem to jest granda wymagać od nas wiedzy i nawet nie podać źródeł skąd ją możemy uzyskać nie mówiąc już o wytłumaczeniu tego...

Proszę o pomoc bo nie wiem jak inaczej to zaliczę :( a nie chce kupować gotowca

0
  1. Kod to niezły potworek, można było to według mnie uprościć stosując tablicę stałych typów rekordowych, czyli: znaków i odpowiadających im kodów alfabetem Morse'a i zrobić funkcję, która dekoduje znak alfabetu na znaki w alfabecie Morse'a. 2. Wczytywanie do zmiennej typ string w konsolii można zrobić poprzez Readln(ZmiennaTypuString);. 3. Co do szyfrowana może być zwykły xor albo szyfr Cezara. Odpowiedne informacje znajdziesz w Google.
0

Nie mam pojęcia jak się za to zabrać po wpisaniu w googla Tablica znaków Pascal niewiele mi daje. Czytałem o ASCII ale ni jak nie wiem jak to zastosować. Możesz mi podać jakiś przykład tego wczytywania z konsoli?

0

Ech. Ręcę opadają. Sorry, ale czy codziennie musi się tutaj trafić kolejny delikatnie pisząc niesamodzileny leń, który mimo otrzymania podpowiedzi, zamiast trochę pokombinować samodzielnie od razu "smaruje" następnego posta na forum? Nieważne. To pytanie pozostanie za pewne bez konkretnej odpowiedzi. Masz poniżej przykład. Tak jak pisałem, do wczytywania masz instrukcje Readln lub Read. Co do przechowywania danych o znakach, to można było pogooglować za tym czym jest rekord i tablica. Wtedy wszystko byś wiedział. Resztę to sobie dopisz, zrób osobną tablicę na cyfry. Zaznaczam, że kod bez problemów kompiluje się i działa pod Delphi 7. Pod FPC lub Lazarusem powinno się dodać odpowiednią dyrektywe kompilatora MODE a jaką konkretnie to sobie wygoogluj. Oczywiśćie tablica nie musi być rekordowa, można trzymać to jako kolejne stringi, czyli bez pola o nazwie M. Ale dałem tak żeby było przejrzyściej przy formatowaniu. A temat przenoszę do Newbie i tam pytania o takie podstawy tam zadawaj!

program to_sa_podstawy_ogarnij_sie;

{$APPTYPE CONSOLE}

uses
  Windows;

function AnsiLowerCase(const S : string) : string;
var
  Len : integer;
begin
  Len := Length(S);
  SetString(Result, PChar(S), Len);
  if Len > 0 then
  begin
    CharLowerBuff(Pointer(Result), Len);
  end;
end;

function Text2Morse(AText : string) : string;
const
  MorseLettersArr : array[Ord('a')..Ord('c')] of record
    M : string;
  end =
  (
    (M : '/*-/'), // a
    (M : '/-***/'), // b
    (M : '/-*-*/') // c
    // ... itd ...
    );
var
  S : string;
  I : integer;
begin
  Result := '';
  if AText <> '' then
  begin
    S := AnsiLowerCase(AText);
    for I := 1 to Length(S) do
    begin
      if S[I] in ['a'..'z'] then
      begin
        Result := Result + MorseLettersArr[Ord(S[I])].M;
      end;
    end;
  end;
end;

begin
  Writeln(Text2Morse('BaCa'));
  Readln;
end.

A i teraz doczytałem, że chodzi Tobie o "odszyfrowanie" Morse'a na zwykły tekst. W takim wypadku należało by również zadeklarować tablicę stałych z kodami znaków w alfabecie Morse'a, na przykład jako taką tablicę rekordową i pole o nazwie na przykład M. I wtedy po średniku kolejny typ zadeklarowany wcześniej. Na przykład A : Char; i do tego robisz pętlę, która wyszukuje znak "zamorsowany" i podaje jego odpowiednik w alfabecie łacińskim. Do tego można stworzyć sobie funkcję Morse2String lub coś w tym stylu. A jeżeli ktoś tutaj ma lepszy pomysł to może napisać. Ale to Twoje zadanie domowe, nie nasze. Dlatego teraz kombinuj już samodzielnie i myśl, każdy człowiek posiada jakiś komponent TBrain :>

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