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

szyfr cezara - pomoc w zrozumieniu

Object Storage Arubacloud
0 głosów
836 wizyt
pytanie zadane 26 lutego 2016 w C i C++ przez rafalmagician Obywatel (1,320 p.)

Potrzebuję pomocy w zrozumieniu kodu ponizej:

#include <iostream>
using namespace std;

int main()
{
    string text;
    cout << "wpisz tekst do zaszyfrowania >> ";
    cin >> text;

    int liczba;
    cout << "podaj liczbe przesuniecia >> ";
    cin >> liczba; //o ile miejsc zamieniamy litery

    int x = text.length();

    int i;
    for(i=0;i<=x;++i)
    {
        if((text[i] >= 97) && (text[i] <= 122 - liczba))
        {
            text[i] = text[i] + liczba; //male litery
        }
        else if((text[i] >= 123 - liczba) && (text[i] <= 122))
        {
            text[i] = text[i] - 26 + liczba; //male litery
        }
    }
    cout << text << endl;

    return 0;
}

Ogolnie chcę wiedzieć czy dobrze rozumiem że liczby w instrukcjach warunkowych odnoszą się do kodu ASCII ??

I ta linijka: 

text[i] = text[i] - 26 + liczba;

dlaczego odejmuje sie 26 a pozniej dodaje liczbę ??

Dziękuję za odpowiedzi :)

2 odpowiedzi

0 głosów
odpowiedź 26 lutego 2016 przez Sareley Gaduła (4,740 p.)
edycja 26 lutego 2016 przez Sareley

Liczby 97, 98, ..., 122 to kolejno liczby z kodu ASCII:  a, b, ... ,z.

Ogólnie text (zmienna string) to tak naprawdę tablica znaków, dlatego można się do niej odwołać tak jak to zostało podane w kodzie.

Nie wiem czy jest sens tłumaczyć ci kod który i tak nie działa poprawnie. Zamiast tego podam Ci swoją implementację  (która też nie działa do końca poprawnie) ale nie chciałem nad tym spędzać więcej czasu.

Działa wyłącznie dla dodatnich przesunięć oraz tylko dla kilku przesunięć do przodu np. 10. Jeżeli podasz np. liczbe przesunięć 101 to wyświetlą się bzdury :). W kodzie masz komentarze, jak czegoś nie zrozumiesz to pisz.
 

// Duże Liczby z kodu ASCII:	A - 65, B - 66, ..., Z - 90
	// Małe Liczby z kodu ASCII:	a - 97, b - 98, ..., z - 122

	static const int DUZE_A_ASCII = 65;
	static const int DUZE_Z_ASCII = 90;

	static const int MALE_A_ASCII = 97;
    static const int MALE_Z_ASCII = 122;
	static const int SPACJA_ASCII = 32;

	static const int WRONG_ARGUMENT_ERROR = -1;

    string text;
    cout << "wpisz tekst do zaszyfrowania >> ";
	getline(cin, text);		// wpisywanie musi być w takiej formie ponieważ był problem ze spacją. Z wykorzystaniem cin napis ze spacją był traktowany jako drugi parametr
   // cin >> text;
 
    int liczba;

    cout << "podaj liczbe przesuniecia >> ";
    cin >> liczba; //o ile miejsc zamieniamy litery
 
 
	for (int i = 0; i <= text.length() -1; i++)
    {
		// Jeżeli jest spacja to zostawiamy taki sam znak
		if (text[i] == SPACJA_ASCII)
			continue;

		// sprawdzam czy podany znak jest z zakresu małych liczb
        else if((text[i] >= MALE_A_ASCII) && (text[i] <= MALE_Z_ASCII))
        {
			// jeżeli podany znak jest z zakresu małych liczb ale jego wartość z przesunięciem jest większa od (z - 122) to w takim wypadku 
			// zaczynamy liczenie od początku (a - 97) 
            if (text[i] + liczba > MALE_Z_ASCII)
            {
                int suma = text[i] + liczba;
                int test = suma - MALE_Z_ASCII;
                text[i] = MALE_A_ASCII  + test - 1;
				// -1 dlatego że liczbę 97 również musimy wziąć pod uwagę.
            }
            else
             text[i] = text[i] + liczba; //liczymy przesuniecia
        }
		// to samo robimy dla wielkich liter. Jezeli podamy duże litery to zwracamy również duże litery z odpowiednim przesunięciem
        else if((text[i] >= DUZE_A_ASCII) && (text[i] <= DUZE_Z_ASCII))
        {
            if (text[i] + liczba > DUZE_Z_ASCII)
            {
                int suma = text[i] + liczba;
                int test = suma - DUZE_Z_ASCII;
				text[i] = DUZE_A_ASCII + test - 1;
            }
            else
             text[i] = text[i]  + liczba; //duże litery
        }
		else
		{
			cout << "Podales niepoprawne wartosci. Nalezy podac wylacznie litery a-z lub A-Z." << endl;
			return WRONG_ARGUMENT_ERROR;
		}
    }
    cout << text << endl;



Pomocne strony:

Tabela kodu ASCII: http://www.algorytm.edu.pl/wstp-do-c/66.html

Szyfr cezara z Wiki:  https://pl.wikipedia.org/wiki/Szyfr_Cezara

Przykładowa implementacja online:  http://marcinmazurek.com.pl/szyfr-cezara-deszyfracja-online

komentarz 6 marca 2016 przez rafalmagician Obywatel (1,320 p.)

Jak przerobić ten kod tak żeby deszyfrowało ?? Proszę o podpowiedź bo nie wiem czy dobrze rozumiem że trzeba zamienić wszystkie znaki na przeciwne ??

#include <iostream>
using namespace std;

void /*int*/ szyfrowanie(int tab[], int w)
{
	int przesuniecie;
    int przesuniecie2;
	cout << "Podaj przesuniecie (+/-liczba) >> ";
	cin >> przesuniecie;

	przesuniecie2 = przesuniecie;

	if(przesuniecie > 26)
    {
        przesuniecie = przesuniecie % 26;
    }
    if(przesuniecie < 0)
    {
        przesuniecie = przesuniecie % 26;
    }
    if(przesuniecie2 > 10)
    {
        przesuniecie2 = przesuniecie2 % 10;
    }

        cout << "PO SZYFROWANIU >> ";

	int strona;
	if(przesuniecie >= 0)
    {
        strona=0;//dodatnia
    }
    else
    {
        strona = 1;//ujemna
    }

	if(przesuniecie2 >= 0)
    {
        strona = 0;
    }
    else
    {
        strona = 1;
    }
    //a-z 97-122 , A-Z 65-90
    //48 - 57 0-9

		switch(strona)
        {
            case 0:
            {
                for(int i=0;i<w;i++)
                {
                    if(tab[i] == 32)
                    {
                        tab[i] = 32;
                    }

                    if(tab[i] >= 48 && tab[i] < 57)
                    {
                        if(tab[i] + przesuniecie2 == 57)
                        {
                            tab[i] = 57;
                        }
                        else if(tab[i] + przesuniecie2 > 57)
                        {
                            int pom = tab[i] + przesuniecie2 - 57 - 1;
                            tab[i] = 48 + pom;
                        }
                        else
                        {
                            tab[i] += przesuniecie2;
                        }
                    }
                    else if(tab[i] == 57)
                    {
                        tab[i] = 48 + przesuniecie2 - 1;
                    }

                    if(tab[i] >= 65 && tab[i] < 90)
                    {
                        //duze litery
                        if(tab[i] + przesuniecie == 90)
                        {
                            tab[i]=90;
                        }
                        else if(tab[i] + przesuniecie > 90)
                        {
                            int pom = tab[i] + przesuniecie - 90 - 1;
                            tab[i] = 65 + pom;
                        }
                        else
                        {
                            tab[i]+=przesuniecie;
                        }
                    }
                    //else if(tab[i]==90)tab[i]=65+przesuniecie -1;
                    else if(tab[i] + przesuniecie == 90)
                    {
                        tab[i]=90;
                    }

                    if(tab[i] >= 97 && tab[i] < 122)
                    {
                        //male litery
                        if(tab[i] + przesuniecie == 122)
                        {
                            tab[i]=122;
                        }
                        else if(tab[i] + przesuniecie > 122)
                        {
                            int pom = tab[i] + przesuniecie - 122 - 1;
                            tab[i] = 97 + pom;
                        }
                        else
                        {
                            tab[i] += przesuniecie;
                        }
                    }
                    //else if(tab[i]==122)tab[i]= 97+przesuniecie -1;
                    else if(tab[i] +przesuniecie == 122)
                    {
                        tab[i]=122;
                    }
                cout << (char)tab[i];
                }
            cout << endl;
            break;
            }
            case 1:
            {
                for(int i=0;i<w;i++)
                {
                    if(tab[i] == 32)
                    {
                        tab[i] = 32;//spacja
                    }
                    //DUZE A-Z
                    if(tab[i]>48 && tab[i]<=57)
                    {
                        if(tab[i]+przesuniecie2 == 48)
                        {
                            tab[i]=48;
                        }
                        else if(tab[i]+przesuniecie2>48)
                        {
                            tab[i]+=przesuniecie2;
                        }
                        else if(tab[i]+przesuniecie2 <48)
                        {
                            int pom = tab[i]+przesuniecie2 - 48 +1;
                            tab[i]=57+pom;
                        }
                    }
                    else if(tab[i]==48)
                    {
                        tab[i]= 57+przesuniecie2;
                    }

                    if(tab[i]>65 && tab[i]<=90)
                    {
                        if(tab[i]+przesuniecie==65)
                        {
                            tab[i]=65;
                        }
                        else if(tab[i]+przesuniecie>65)
                        {
                            tab[i]+=przesuniecie;
                        }
                        else if(tab[i]+przesuniecie<65)
                        {
                            int pom = tab[i]+przesuniecie - 65 +1;
                            tab[i]=90+pom;
                        }
                    }
                    else if(tab[i] +przesuniecie ==65)
                    {
                        tab[i]=65;
                    }
                    else if(tab[i]==65)
                    {
                        tab[i]= 65;
                    }
                    //MALE a-z
                    if(tab[i]>97 && tab[i]<=122)
                    {
                        if(tab[i]+przesuniecie==97)
                        {
                            tab[i]=97;
                        }
                        else if(tab[i]+przesuniecie>97)
                        {
                            tab[i]+=przesuniecie;
                        }
                        else if(tab[i]+przesuniecie<97)
                        {
                            int pom = tab[i]+przesuniecie - 97 +1;
                            tab[i]=122+pom;

                        }
                    }
                    else if(tab[i] +przesuniecie ==97)
                    {
                        tab[i]=97;
                    }
                    else if(tab[i]==97)
                    {
                        tab[i]= 97;
                    }
                    cout<<(char)tab[i];
                }
            cout << endl;
            break;
            }
            default:
            {
            break;
            }
		}
}

int main()
{

	string slowo;
	cout << "Podaj tekst do zaszyfrowania >> ";
	getline(cin,slowo);

	int wielkosc = slowo.size();
	//cout<<wielkosc;
	int tab[wielkosc];

	//-------------------Asci--------------
	/*cout<<"\n W ASCI : \n";*/
	for(int i=0;i<wielkosc/*slowo.length()*/;i++)
    {
		tab[i] = (int) slowo[i];
	//cout<<tab[i]<<" ,";
	}

	szyfrowanie(tab,wielkosc);

	return 0;
}

 

0 głosów
odpowiedź 26 lutego 2016 przez jpacanowski VIP (101,940 p.)

Mój kod. Kiedyś pisałem, ale niedokończone... Zamiast tych case można byłoby krócej, ale wybaczcie mi przeszłości ;D Ale za to czytelne ;D

#include <stdio.h>

char crypt(char znak)
{
   switch(znak)
   {
      case 'a': return 'd';
      case 'b': return 'e';
      case 'c': return 'f';
      case 'd': return 'g';
      case 'e': return 'h';
      case 'f': return 'i';
      case 'g': return 'j';
      case 'h': return 'k';
      case 'i': return 'l';
      case 'j': return 'm';
      case 'k': return 'n';
      case 'l': return 'o';
      case 'm': return 'p';
      case 'n': return 'q';
      case 'o': return 'r';
      case 'p': return 's';
      case 'q': return 't';
      case 'r': return 'u';
      case 's': return 'v';
      case 't': return 'w';
      case 'u': return 'x';
      case 'v': return 'y';
      case 'w': return 'z';
      case 'x': return 'a';
      case 'y': return 'b';
      case 'z': return 'c';
   }
}

main()
{
   FILE *fp;
   int index;
   char znak, crypted;
   char string[20];

   if((fp = fopen("crypto.txt", "r"))==NULL)
   {
      printf("ERROR: file not found!");
      exit(1);
   }

   fgets(string,20,fp);
   index=0;

   do
   {
      znak = string[index];
      crypted = crypt(znak);
      printf("%c", crypted);
      index++;
   }
   while(string[index] != NULL);
}

Podobne pytania

0 głosów
1 odpowiedź 1,438 wizyt
pytanie zadane 5 maja 2016 w C i C++ przez Linker Bywalec (2,690 p.)
0 głosów
1 odpowiedź 396 wizyt
pytanie zadane 7 grudnia 2015 w C i C++ przez Armando Obywatel (1,870 p.)
0 głosów
0 odpowiedzi 388 wizyt

92,575 zapytań

141,424 odpowiedzi

319,649 komentarzy

61,960 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...