Witam,
Próbuję napisać program, który odczytuje tekst z jednego pliku, koduje go szyfrem Cezara i zapisuje zaszyfrowany tekst do drugiego pliku.
Program wprawdzie napisałem, ale nie działa prawidłowo. Czy ktoś mógłby sprawdzić mój kod i ewentualnie wskazać błąd w rozumowaniu?
#include <fstream>
#include <cstdlib>
int main(int argc, char *argv[])//wczytywanie nazw z konsoli cmd
{
int n = std::atof(argv[1]), placeASCI, stepsAdd = 0, stepsFree = 0; //atof konwertuje tekst na liczbe bo argv jest typu char, zakres 26 bo tyle jest liter w alfabecie
std::string input = argv[2], output = argv[3]; //nazwy plikow
std::string line; //pojedyncza linia
std::fstream file1, file2;
file1.open(input, std::ios::in); //odczyt pliku
file2.open(output, std::ios::out); // zapis pliku
while(getline(file1, line))
{
for(int i = 0; i < line.size(); i++)
{
placeASCI = int(line[i]); // numer asci znaku
if((placeASCI >= int('a') && placeASCI <= int('z')) || (placeASCI >= int('A') && placeASCI <= int('Z'))) // czy znak jest litera mala lub duza
{
if(placeASCI >= int('a') && placeASCI <= int('z')) // jesli znak to mala litera
{
if(n > 0)
{
stepsAdd = n % 26; // ile przejsc do przodu trzeba wykonac
stepsFree = int('z') - int(line[i]); //ile jest wolnych krokow az do litery 'z'
if(stepsAdd <= stepsFree) //ilosc krokow do wykonania do przodu mniejsza od ilosci wolnych krokow do litery 'z'
{
line[i] = char(int(line[i]) + stepsAdd);
}
else
{
line[i] = char(stepsAdd - stepsFree + int('a') - 1);
}
}
else if(n < 0)
{
stepsAdd = n % 26; // ile przejsc do tylu trzeba wykonac
stepsFree = int(line[i]) - int('a'); // ile jest wolnych krokow do litery a
if(stepsAdd <= stepsFree) //ilosc krokow do wykonania do tylu mniejsza od ilosci wolnych krokow do litery 'a'
{
line[i] = char(int(line[i]) - stepsAdd);
}
else
{
line[i] = char(int('z') - (stepsAdd - stepsFree) + 1);
}
}
}
else //duza litera
{
if(n > 0)
{
stepsAdd = n % 26; // ile przejsc do przodu trzeba wykonac
stepsFree = int('Z') - int(line[i]); //ile jest wolnych krokow az do litery 'z'
if(stepsAdd <= stepsFree) //ilosc krokow do wykonania do przodu mniejsza od ilosci wolnych krokow do litery 'z'
{
line[i] = char(int(line[i]) + stepsAdd);
}
else
{
line[i] = char(stepsAdd - stepsFree + int('A') - 1);
}
}
else if(n < 0)
{
stepsAdd = n % 26; // ile przejsc do tylu trzeba wykonac
stepsFree = int(line[i]) - int('A'); // ile jest wolnych krokow do litery a
if(stepsAdd <= stepsFree) //ilosc krokow do wykonania do tylu mniejsza od ilosci wolnych krokow do litery 'a'
{
line[i] = char(int(line[i]) - stepsAdd);
}
else
{
line[i] = char(int('Z') - (stepsAdd - stepsFree) + 1);
}
}
}
}
}
file2 << line << " \n"; // zapis zaszyfrowanej linii do pliku
}
}
Przykładowo: jeśli tekst, który trzeba zaszyfrować to:
Bwf Dbftbs!
Wfoj, wjej, wjdj!
to mój wynik jest taki:
Cxg Ecguct!
Xgpk, xkfk, xkek!
a powinien być taki:
Ave Caesar!
Veni, vidi, vici!