2009-02-07 6 views
5

Na początek, jestem cztery tygodnie na kursie C++ i jeszcze nie znam pętli, więc proszę porozmawiaj z dzieckiem?Szyfr Cezara w C++

Okej, więc powinienem przeczytać dwunastoznakowy ciąg znaków (plus NULL tworzy trzynaście) z pliku, a następnie przesunąć litery w tył o trzy, a następnie wydrukować moje wyniki na ekranie i w pliku. Nic mi nie jest z wyjątkiem tych zmieniających się liter. Nie chcę pisać mil kodu, aby każdą postać pojedynczo odjąć, odjąć trzy i ponownie złożyć ciąg, ale nie jestem pewien, jak pracować z całym ciągiem na raz. Czy ktoś może polecić naprawdę prostą metodę robienia tego?

+0

Przez "Nie znam jeszcze pętli", czy oznacza to, że nie możesz ich jeszcze użyć? –

+0

Masz na myśli przesunięcie liter jak w re positionthem w ciągu znaków lub użycie wcześniejszych znaków z alfabetu. –

+0

Amanda: Proszę zaznaczyć odpowiedź jako zaakceptowaną. Jest kilka dobrych odpowiedzi do wyboru. – abelenky

Odpowiedz

1

Powtórzyć znaki za pomocą pętli for. I rób to, co chcesz, z char *. Następnie odłóż nowy char z powrotem.

1
for(int i=0; i<12; i++){ 
    string[i] = string[i] - 3; 
} 

Gdzie jest tablica znaków (ciąg znaków). Jest trochę bardziej zaangażowany, jeśli chcesz, aby był okresowy (I.E. mają Zawijanie zaokrąglone do Z, ale powyższy kod powinien pomóc Ci zacząć)

2

Będziesz musiał nauczyć się pętli. Pozwoli to na powtórzenie kodu przez znaki ciągu znaków, co jest dokładnie tym, czego potrzebujesz tutaj. Będziesz zachowywał zmienną całkowitą, która będzie twoim indeksem w łańcuchu, a wewnątrz pętli przesuwaj litery po znaku w tym indeksie i zwiększaj wartość indeksu o jeden, aż osiągniesz NULL.

Edit: Jeśli nie oczekuje się wiedzieć o pętlach w trakcie jeszcze, może chcą Państwo, aby to zrobić:

string[0] -= 3; // this is short for "string[0] = string[0] - 3;" 
string[1] -= 3; 
string[2] -= 3; 
... 

To spowoduje jedynie 12 linii kodu zamiast mil . Nie musisz "składać" ciągu w ten sposób, możesz po prostu edytować każdy znak w miejscu. Potem zakład po zrobieniu tego, pokażą ci szybki sposób robienia tego za pomocą pętli.

1

Jestem trochę niejasny, co masz na myśli przez "przesunąć litery w tył 3"? Czy to oznacza D ==> A?
Jeśli tak, oto prosta pętla.

(nie zrobiłem odczytu z pliku lub zapis do pliku ... Ów swoją część)

#include <string.h> 

int main(void) 
{      
    char input[13] = "ABCDEFGHIJKL"; 
    int i; 

    int len = strlen(input); 

    for(i=0; i<len; ++i) 
    { 
     input[i] = input[i]-3; 
    } 

    printf("%s", input); // OUTPUT is: ">[email protected]" 
} 
+0

WTF to głosowanie oddane w głosowaniu? Myślę, że moja odpowiedź jest dość jasna i prosta. – abelenky

+0

Nie zabrałem ci głosu, ale zgaduję, że to dlatego, że podałeś kod zamiast wyjaśniać * jak * rozwiązać problem, co nie jest tak korzystne dla kogoś, kto dopiero zaczyna się uczyć. – Chuck

6

Jeśli masz do czynienia z prostymi literami (od A do Z lub od A do Z) , wtedy możesz założyć, że kody wewnętrzne są liniowe.

litery są kodowane w ilościach, w zakresie od 0 do 127 A oznaczonych jako 65, B, C, jak 66 jako 67, a 90. Z

W celu przesunięcia litery, trzeba tylko zmienić wewnętrzny kod literowy tak, jakby był liczbą, więc w zasadzie odejmowanie 3 od postaci. Uważaj jednak na przypadki skrajne, ponieważ odjęcie 3 do "A" da ci ">" (kod 62), a nie "X" (kod 88). Możesz sobie z nimi poradzić używając instrukcji "if" lub operatora modulo ("%").

Oto ASCII characters table aby pomóc

5

Po załadowaniu swój ciąg, możesz użyć operatora modulous obracać utrzymując w ramach A-Z przestrzeni.

będę śledzić, czy list był kapitał na początek:

bool isCaps = (letter >= 'A') && (letter <= 'Z'); 
if(isCaps) 
    letter -= 'A'-'a'; 

a potem po prostu zrobić szyfr shift takiego:

int shift = -3; 
letter -= 'a'; // to make it a number from 0-25 
letter = (letter + shift + 26) % 26; 
     // add 26 in case the shift is negative 
letter += 'a'; // back to ascii code 

ostatecznie zakończyć mecz

if(isCaps) 
    letter += 'A'-'a'; 

więc, łącząc to wszystko otrzymujemy:

char *mystring; // ciphertext 
int shift = -3; // ciphershift 

for(char *letter = mystring; letter; ++letter) 
{ 
    bool isCaps = (*letter >= 'A') && (*letter <= 'Z'); 
    if(isCaps) 
    *letter -= 'A'-'a'; 

    letter -= 'a'; 
    letter = (letter + shift + 26) % 26; 
    letter += 'a'; 

    if(isCaps) 
    letter += 'A'-'a'; 
}