Alfabet od xyz zamianst od abc

0

Mam problem z zadaniem, mam napisać szyfr cesara czyli przesunięcie litery o n pozycji, z tym że muszę przyjąć, że za literą 'z' wypada litera 'a', zaś przed literą 'a' wypada litera 'z'. Z pomocą internetu napisałem program jak poniżej ale to jest standardowo, czyli zaczyna od się od 'a', i dalej jest 'b' etc. jak przerobić żeby po 'z' wypadało 'a' jak w treści? Poniżej program, dodam, że to są wciąż moje początki ;)

#include <iostream>
#include <cstdlib>
#include <fstream>

int main(int argc, char** argv) {
    int n = atoi(argv[1]); 
    std::ifstream infile(argv[2]); 
    std::ofstream outfile(argv[3]);
    char c;
    bool notEof = true;

    while (notEof) { 
        c = infile.get(); 

        if (!infile.eof()) { 
            if ((c >= 'a') && (c <= 'z')) { 
                c = ((c - 'a') + n) % 26 + 'a'; 
            } else if ((c >= 'A') && (c <= 'Z')) { 
                c = ((c - 'A') + n) % 26 + 'A'; 
            }

            outfile << c; 
        } else {
            notEof = false;
        }
    }

    infile.close();
    outfile.close();

    return 0;
}
0

Rozumiem, że nie działa to dla dostatecznie "dużych" n ujemnych.
Po tej linijce:
int n = atoi(argv[1]);
zamień n by mieściło się od 0 do 25. Jakieś modulo 26 by się przydało tak, by bez względu na to jakie będzie podane n zawsze po konwersji zawierało się w podanym przedziale [0, 25].

Rozwiązanie naiwne: dodawaj w pętli do n tyle razy 26n będzie nieujemne.
Zwykłe n%26 nie zadziała gdy n będzie ujemne, bo np. -28 % 26 wynosi -2 zamiast oczekiwanego 24.

0

Dodałem taki warunek dla n ale nie bardzo wiem jak dalej

int main(int argc, char** argv) {
    int n = atoi(argv[1]); n>=0&&n<=25;
	std::ifstream infile(argv[2]); 
    std::ofstream outfile(argv[3]);
    char c;
    bool notEof = true;
0

Znalazłem taki kod w internecie, działa ale nie bardzo go rozumiem no i jednak chce żeby czytało z mojego dowolnego pliku i zapisywało też do podanego przeze mnie pliku w wierszu poleceń

#include<iostream>
#include<cstdlib>
#include<string>

using namespace std;

inline int sprawdz(char znak)
{	//jesli jest mala litera
	if(znak >= 'a' && znak <= 'z') return 0;
	//jesli jest duza litera
	if(znak >= 'A' && znak <= 'Z') return 1;
	//inna niż litera
	return 2;}

void szyfruj(int klucz, string &tab)
{	//sprawdzenie, czy klucz miesci sie w zakresie
	if(!(klucz >= -26 && klucz <= 26)) return;
	
	int pom;
	char a, z;
	
	for(int i = 0; i < tab.size(); i++)
	{ pom = sprawdz(tab[i]);
		//ustalienie wielkosci litery
		if(pom < 2)
		{ if(pom == 0) 
				a = 'a', z = 'z';
			else
				a = 'A', z = 'Z';
			if(klucz >= 0)
					
				if(tab[i] + klucz <= z)
					tab[i] += klucz;
				else
					tab[i] = tab[i] + klucz - 26; 
			else
				if(tab[i] + klucz >= a)
					tab[i] += klucz;
				else
					tab[i] = tab[i] + klucz + 26;
		}}}

int main()
{
	string tab; 
        int klucz;
	
	cout<<"Podaj zdanie do zaszyfrowania: ";
	getline(cin, tab);
	
	cout<<"Podaj klucz z przedziału [-26..26]: ";
	cin>>klucz;
	
	szyfruj(klucz,tab); //szyfrowanie
	cout<<"Po zaszyfrowaniu: "<<tab<<endl;
	szyfruj(-klucz,tab); //deszyfrowanie
	cout<<"Po rozszyfrowaniu: "<<tab<<endl;

	system("pause");
	return 0;
}
1

Dlaczego kombinujesz? Dlaczego piszesz kod, którego nie rozumiesz? Napisałem co masz zrobić. Ale ok. Teraz rzeczowo.

Między wierszem:
int n = atoi(argv[1]);
a przed wierszem:
while (notEof) {
dodaj ten jeden wiersz:
if(n < 0) n = n % 26 + 26;
Załatwi to całą sprawę.

Czyli będziesz mieć tak:

#include <iostream>
#include <cstdlib>
#include <fstream>

int main(int argc, char** argv) {
    int n = atoi(argv[1]);
    if(n < 0) n = n % 26 + 26;
    std::ifstream infile(argv[2]);
    std::ofstream outfile(argv[3]);
    char c;
    bool notEof = true;

    while (notEof) { 
//  dalsza część kodu pominięta
0

ok, dziękuje za pomoc, przeanalizuję teraz jeszcze raz wszystko na spokojnie

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