• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Szyfr Cezara - czemu nie działa?

Cloud VPS
0 głosów
945 wizyt
pytanie zadane 13 kwietnia 2018 w C i C++ przez Duke_Astaroth Nowicjusz (240 p.)

Witam, mam pytanie apropo zadania c. z załączonego zdjęcia, chodzi o szyfrowanie Cezarem, program zwraca tekst jedynie częściowo zaszyfrowany tekst. W czym jest problem? Z góry dziękuję za pomoc.

#include <iostream>
#include <string>
#include <fstream>
#include <algorithm>

using namespace std;

int obliczKlucz(string s)
{
int a = count(s.begin(), s.end(), 'a');
int e = count(s.begin(), s.end(), 'e');
int o = count(s.begin(), s.end(), 'o');

return (a+e+o);
}

string szyfruj (string tekst, int klucz){
	int i=0;
	const int n=tekst.size();
	char sz[n];
	while(i<tekst.size()){
		if(tekst[i]+klucz>126)
			sz[i]=(char)(tekst[i]+klucz-95);
		else
			sz[i]=(char)(tekst[i]+klucz);
	i++;
	}
	return sz;
}

string rozszyfruj (string tekst, int klucz){
	int i=0;
	const int n=tekst.size();
	char sz[n];
	while(i<tekst.size()){
		if(tekst[i]-klucz>126)
			sz[i]=(char)(tekst[i]-klucz+95);
		else
			sz[i]=(char)(tekst[i]-klucz);
	i++;
	}
	return sz;
}

int main(){
	int klucz=0;
	int w=0;
	string tekst;
	string szyfr;
	string roz;
	cout<<"Wybierz operacje: 1-zaszyfrowanie tekstu 2-rozszyfrowanie tekstu"<<endl;
	cin>>w;
	switch(w){
	case 1:{	
		cout<<"Podaj tekst:"<<endl;
		cin>>tekst;
		klucz=obliczKlucz(tekst);
		cout<<"Tekst po zaszyfrowaniu: "<<endl;
		szyfr=szyfruj(tekst, klucz);
		cout<<szyfr<<endl;
		ofstream zapis;
		zapis.open("cezar.txt");
		zapis<<szyfr;
		zapis.close();
		zapis.open("klucz.txt");
		zapis<<klucz;
		zapis.close();
		break;
	}
	case 2:{
		ifstream odczyt;
		/*odczyt.open("cezar.txt");
		odczyt<<szyfr;
		odczyt.close();
		odczyt.open("klucz.txt");
		odczyt<<klucz;
		cout<<"Tekst po rozszyfrowaniu: "<<endl;
		roz=rozszyfruj(szyfr, klucz);
		cout<<roz;
		*/break;
	}
	default:{
		cout<<"Wybrano nieprawidlowa operacje"<<endl;
		break;
	}
	}
	return 0;
}
1
komentarz 14 kwietnia 2018 przez Qwerty96 Stary wyjadacz (13,580 p.)

Taka uwaga:

const int n=tekst.size();
char sz[n];

Taki sposób tworzenia tablic jest niepoprawny w C++. Wyrażenie określające wielkość tablicy musi być możliwe do obliczenia w czasie kompilacji. Ponadto ten ciąg znaków nie jest zakończony nullem, co może sprawić, że program będzie źle działał. Skoro zwracasz stringa, to czemu zmienna sz nie jest stringiem?

komentarz 14 kwietnia 2018 przez Patrycjerz Mędrzec (192,320 p.)
Jeśli autor pytania używa kompilatora obsługującego variable-length arrays (np. GCC), to nie ma chyba powodu, aby nie używał takiej składni, głównie jeśli kod jest czysto dydaktyczny. Oczywiście warto wspomnieć, że ta funkcja nie zawiera się w standardzie języka C++, ale C już tak.

2 odpowiedzi

+1 głos
odpowiedź 13 kwietnia 2018 przez Patrycjerz Mędrzec (192,320 p.)
if(tekst[i]-klucz>126)

W funkcji `rozszyfruj` powinno być w warunku `< 32`.

0 głosów
odpowiedź 14 kwietnia 2018 przez RafalS VIP (122,820 p.)

Dodatkowo wczytywanie przez cin >> tekst wczytuje Ci tylko jedno słowo. Żeby wczytywało całą podaną linijkę możesz skorzystać z takiej konstrukcji:

char input[100];
cin.getline(input,sizeof(input));

Plus operatory >> w złą stronę przy wczytywaniu z pliku w case 2 :P

Podobne pytania

0 głosów
2 odpowiedzi 484 wizyt
pytanie zadane 22 kwietnia 2017 w C i C++ przez SebekChlebek Stary wyjadacz (11,290 p.)
0 głosów
1 odpowiedź 439 wizyt
pytanie zadane 19 maja 2018 w C i C++ przez Saddre Nowicjusz (240 p.)
0 głosów
1 odpowiedź 474 wizyt
pytanie zadane 7 grudnia 2015 w C i C++ przez Armando Obywatel (1,870 p.)

93,487 zapytań

142,423 odpowiedzi

322,773 komentarzy

62,909 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Kursy INF.02 i INF.03
...