Szyfr Cezara i błąd w pętli for

Odpowiedz Nowy wątek
2015-02-12 18:16
0

Witam. Wiem, że zadanie z Szyfrem Cezara było wałkowane tysiąc razy, lecz proszę o pomoc.

Zadanie - standardowo - ma na celu zaszyfrowania i odszyfrowania tekstu. Oto jego treść:

W tym zadaniu Twój program powinien realizować algorytm szyfrowania i odszyfrowywania danych, który był już używany w czasach Juliusza Cezara. Szyfrowanie tekstu polega na szyfrowaniu kolejnych jego liter (pozostałe znaki pozostawiamy bez zmian). Każda litera zostaje zamieniona w k-tą następną w alfabecie (k jest stałą szyfru), przy czym jeżeli taka nie istnieje (wychodzimy za z), to odliczanie jest kontynuowane z powrotem od a. Szyfrowanie zachowuje wielkość liter (tj. małe przechodzą na małe, a wielkie na wielkie). Zakładamy, że w tekście występują jedynie litery alfabetu angielskiego (małe i wielkie).

Dla przykładu, jeżeli k=5, to małe litery tekstu przechodzą na małe litery szyfru według poniższej tabelki:

litera a b c d e f g h i j k l m n o p q r s t u v w x y z
szyfr f g h i j k l m n o p q r s t u v w x y z a b c d e
Wielkie litery tekstu przechodzą na wielkie litery szyfru zgodnie z tą samą regułą.

Napisz program, który wczyta tekst do zaszyfrowania lub odszyfrowania i stałą k i zaszyfruje lub odszyfruje ten tekst, w zależności od polecenia.

Wejście
Pierwszy wiersz wejścia zawiera jedną liczbę 1 lub 2. Liczba 1 oznacza "szyfruj", a liczba 2 - "odszyfruj". Drugi wiersz wejścia zawiera stałą k. Trzeci i ostatni wiersz wejścia zawiera tekst, złożony wyłącznie z liter (małych bądź dużych) i/lub znaków interpunkcyjnych (bez odstępów). Tekst będzie zawierał co najmniej jeden znak i co najwyżej 1000 znaków.

Wyjście
Pierwszy i jedyny wiersz wyjścia powinien zawierać tekst po zaszyfrowaniu bądź odszyfrowaniu.

Oto mój kod:

#include <iostream>
#include <cstdlib>
#include <time.h>

using namespace std;

int main()
{
    int x,k;
    string tekst;

    scanf("%d\n %d\n %s", &x, &k, &tekst);
    if(x==1)
    {
        for(int i=0; i<tekst.length(); i++);
        {
            tekst[i]=tekst[i]+k;
        }
    }
    else
    {
        for(int i=0; i<tekst.length(); i++);
        {
            tekst[i]=tekst[i]-k;
        }
    }
    printf("%s", tekst);
}

Po próbie skompilowania wyskakuje mi taki oto błąd:

Wiersz Kolumna Plik Komunikat
C:\Users\Kuba\Desktop\Informatyka\Szyfr Cezara.cpp In function 'int main()':
17 10 C:\Users\Kuba\Desktop\Informatyka\Szyfr Cezara.cpp [Error] name lookup of 'i' changed for ISO 'for' scoping [-fpermissive]
17 10 C:\Users\Kuba\Desktop\Informatyka\Szyfr Cezara.cpp [Note] (if you use '-fpermissive' G++ will accept your code)
24 10 C:\Users\Kuba\Desktop\Informatyka\Szyfr Cezara.cpp [Error] name lookup of 'i' changed for ISO 'for' scoping [-fpermissive]
27 20 C:\Users\Kuba\Desktop\Informatyka\Szyfr Cezara.cpp [Error] cannot pass objects of non-trivially-copyable type 'std::string {aka class std::basic_string<char>}' through '...'

I tutaj proszę o pomoc, bo się zaciąłem. Co kompilatorowi nie pasuje z tym "i"? Przecież zostało wcześniej zadeklarowane w pętli for.
Proszę o wskazówki co jest nie tak, ewentualnie jakieś pouczenie. Nie chciałbym gotowego kodu.
Z góry dziękuję.

edytowany 1x, ostatnio: Vis.CouTT, 2015-02-12 18:32

Pozostało 580 znaków

2015-02-12 18:27
0

Na pewno ma być

if(x=1)

a nie

if(x==1)

To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell
edytowany 1x, ostatnio: bogdans, 2015-02-12 18:27
Bez znaku zapytania wygląda to strasznie dwuznacznie. ;-) - Tacet 2015-02-12 23:19
Masz rację, ale nie lubię samotnego znaku zapytania. ;-) - bogdans 2015-02-13 07:10

Pozostało 580 znaków

2015-02-12 18:29
0

Już poprawione, zagapiłem się. ^^''
Nie zmienia to faktu, że nadal kompilator rzuca się o te "i".

edytowany 1x, ostatnio: Vis.CouTT, 2015-02-12 18:31

Pozostało 580 znaków

2015-02-12 18:50

Po pętlach for np. u Ciebie for(int i=0; i<tekst.length(); i++); jest średnik. A chyba nie powinien :)

edytowany 4x, ostatnio: n4lik, 2015-02-12 19:15

Pozostało 580 znaków

2015-02-12 23:12
0

...
Dobra.
Dzięki. X'D

Pozostało 580 znaków

2015-09-04 23:36
Biały Lew
0
Vis.CouTT napisał(a):

...
Dobra.
Dzięki. X'D

A nie masz błędu kompilacji ? prog.cpp:11:5: error: use of undeclared identifier 'scanf'
scanf("%d\n %d\n", &x, &k, &tekst);

Pozostało 580 znaków

2015-09-04 23:56
1

Masz też błąd taki, że nie zawijasz(nie wiem jak to napisać). Np przy szyfrowaniu znak+przesuniecie będzie większy od 'z'. Czyli masz np, znak w tekście 'y', chcesz go zaszyfrować kluczem 5, robisz 'y'+5, a to jest równa 126 czyli znak '~', a nie 'd'.

Musisz robić dzielenie modulo (:
Przy rozszyfrowaniu podobnie

EDIT

nie wiem też jakim cudem ma działać

scanf("%d\n %d\n %s", &x, &k, &tekst);

podajesz do scanf wskaźnik na string? Trochę wtf imho :p Czemu nie wczytasz rzeczy std::cinem?

Samo używanie stanf w c++ wygląda lipnie

edytowany 1x, ostatnio: stryku, 2015-09-04 23:59

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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