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

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ę.

0

Na pewno ma być

if(x=1)

a nie

if(x==1)
0

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

4

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

0

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

0
Vis.CouTT napisał(a):

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

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

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

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