Funkcja przesunięcia znaku w szyfrze cezara

0

Dana jest funkcja o nagłówku

char PrzesunZ(char zn,int k);

której wartością jest znak powstały po przesunięciu znaku zn o wartość k (mod 255).
*Napisz funkcje o nagłówku *

int Szyfruj(string nazwaWE, string nazwaWY); 

Funkcja ta ma zaszyfrować wartość pliku o nazwie nazwaWE szyfrem Cezara,a wynik umieścić w pliku o nazwie nazwaWY. Szyfr Cezara to szyfr o przesunięciu 3
Struktura pliku ma zostać niezmieniona, tzn. nie szyfrujemy znakow spacji (' '), tabulacji ('\t ') i znaków końca lini ('\n'). Wartością funkcji jest ilość zaszyfrowanych znaków lub -1 jeśli nie udały się operacje.

Ktoś może mi powiedzieć jak ma działać ta pierwsza funkcja? Czy ma wczytywać znak po znaku z pliku i odczytywać kod znaku ascii i dopiero po tej zamianie na ascii przesuwać o wartość k?

1

Funkcja pierwsza, zamieniająca znak o k, powinna tylko i wyłącznie zamienić ten znak na inny.

char PrzesunZ(char zn,int k)
 {
  return char((zn+k)%255);
 }
data17 napisał(a):

Czy ma wczytywać znak po znaku z pliku i odczytywać kod znaku ascii i dopiero po tej zamianie na ascii przesuwać o wartość k?

Funkcja, która ma szyfrować pliki powinna "martwić się" o wszystko inne, ta tylko zwracać zaszyfrowany znak, który jest już swoim kodem, nie trzeba się o tą konwersję martwić. Możesz na tym charze operować, jakby był liczbą, co widać w pokazanym już przeze mnie kodzie. Jeśli chodzi o szyfrowanie pliku, pobierając znak po znaku to jest to możliwe, dlaczego nie? Może to wyglądać na przykład tak:

//zedytowane za sugestią @_13th_Dragon
for(char pobrany;wejscie.get(pobrany);wyjscie.put(pobrany))
 if(pobrany!=' ' && pobrany!='\t'&&pobrany!='\n')
  pobrany=PrzesunZ(pobrany,k);

Pod koniec masz już zaszyfrowany plik.
Myślę, że odpowiedziałem na zasadnicze pytanie o funkcję pierwszą i z resztą sobie poradzisz sam.

2

@Tacet, zdecydowanie przekombinowałeś, wystarczy:

char ch;
while(inp.get(ch)) out.put(strchr(" \t\n",ch)?ch:PrzesunZ(ch,3));

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