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

Program szyfrujący

Object Storage Arubacloud
0 głosów
1,261 wizyt
pytanie zadane 29 stycznia 2018 w C i C++ przez Cylian Początkujący (280 p.)

Chciałbym napisać program szyfrujący, który zamienia litery na liczby, np. a=1, b=2, c=3... z=23, a między liczbami wypisuje znak '/'. Bez znaków specjalnych, ani angielskich (tj. Q,X). Od razu mówię że jestem POCZĄTKUJĄCY i nie znam poleceń typu "scanf". Napisałem już program, ale jak go włączam to wyskakuje błąd w linijce 14 "expression in new-declarator must have integral or enumeration type". Dla przykładu słowo "informatyka" powinno wyglądać tak: 9/14/6/15/17/14/1/19/22/11/1

Oto kod:

#include <iostream>
#include <conio.h>
#include <string.h>

using namespace std;

int main()

{
    cout<<"Podaj tekst do zaszyfrowania:"<<endl;
    string litery;
    cin>>litery;
    int *tab;
    tab = new int [litery.size];
    int i = 0;
    while(litery[i] != NULL)
    {if(litery[i] != ' '||litery[i] != ','||litery[i] != '.'||litery[i] != ':'||litery[i] != '?'||
        litery[i] != '!'||litery[i] != '@'||litery[i] != '#'||litery[i] != '$'||litery[i] != '%'||
        litery[i] != '^'||litery[i] != '&'||litery[i] != '*'||litery[i] != '('||litery[i] != ')'||
        litery[i] != '-'||litery[i] != NULL)
        {
            litery[i] = tab[i];
            i++;
        }
        else{

            switch(litery[i])
          {
            case 'a':
                    litery[i] = 1;
            break;

            case 'b':
                    litery[i] = 2;
            break;

            case 'c':
                    litery[i] = 3;
            break;

            case 'd':
                    litery[i] = 4;
            break;

            case 'e':
                    litery[i] = 5;
            break;

            case 'f':
                    litery[i] = 6;
            break;

            case 'g':
                    litery[i] = 7;
            break;

            case 'h':
                    litery[i] = 8;
            break;

            case 'i':
                    litery[i] = 9;
            break;

            case 'j':
                    litery[i] = 10;
            break;

            case 'k':
                    litery[i] = 11;
            break;

            case 'l':
                    litery[i] = 12;
            break;

            case 'm':
                    litery[i] = 13;
            break;

            case 'n':
                    litery[i] = 14;
            break;

            case 'o':
                    litery[i] = 15;
            break;

            case 'p':
                    litery[i] = 16;
            break;

            case 'r':
                    litery[i] = 17;
            break;

            case 's':
                    litery[i] = 18;
            break;

            case 't':
                    litery[i] = 19;
            break;

            case 'u':
                    litery[i] = 20;
            break;

            case 'w':
                    litery[i] = 21;
            break;

            case 'y':
                    litery[i] = 22;
            break;

            case 'z':
                    litery[i] = 23;
            break;
          }
            litery[i] = tab[i];
            i++;
            tab[i] = '/';
            i++;
            }
        }


    while(tab[i] != NULL)
    {
        cout<<tab[i];
        i++;
    }
    delete [] tab;

    return 0;

}

 

komentarz 30 stycznia 2018 przez Cylian Początkujący (280 p.)
Dziękuję wszystkim za podpowiedzenie, ale wiem o tablicy ASCII i nie chciałem jej używać, bo tam jest 'Q' i 'X', a chciałem tylko polskie litery. "NieUmiemProgramowac" dzięki za pomoc, ale jak już mówiłem jestem dopiero początkującym i nie znam większości z tych komend, które tam napisałeś.

3 odpowiedzi

0 głosów
odpowiedź 29 stycznia 2018 przez jankustosz1 Nałogowiec (35,880 p.)

O Jezu nie trzeba sprawdzać każdej literki. Zapewne wiesz że każdej literce odpowiada w zapisie binarnym odpowiednia liczba. Zerknij na kody ascii: https://pl.wikipedia.org/wiki/ASCII

Jak zamienić literkę na liczbę jaką chcesz otrzymać? - Odejmując od literki 'a' i dodając jeden, gdyż każda kolejna literka ma o jeden większy numer. A więc tak z grubsza to będzie coś takiego:

#include <bits/stdc++.h>

int main()
{
   string str;
   cin >> str;
   for(int i = 0; i<str.size(); i++)
   {
        std::cout << (int)(str[i]-'a'+1 ) << "/";
   }
   return 0;
}

Nie testowałem więc może być jakaś literówka.W ramach nauki spróbuj np. napisać funkcję szyfruj i deszyfruj które jako argument pobierają stringa i zwracają w odpowiedniej formie.

komentarz 29 stycznia 2018 przez jankustosz1 Nałogowiec (35,880 p.)
I co do twojego błędu w linii 14. Size to metoda którą musisz wywołać a nie zmienna.
0 głosów
odpowiedź 29 stycznia 2018 przez niezalogowany

Jeżeli alfabet różni się od tablicy ASCII to myślę, że dobre jest też takie rozwiązanie:

#include <iostream>
#include <string>

int main()
{
	std::cout << "Podaj tekst do zaszyfrowania:" << std::endl;
	std::string word;
	std::cin >> word;

	std::string encrypted_word;
	std::string alphabet = "abcdefghijklmnoprstuwyz";

	for (int i = 0; i < word.size(); ++i)
	{
		int j = alphabet.find(word[i]); // zamiast find moglbys uzyc petli, ale musialbys sie troche nagimnastykowac
		if (j != std::string::npos)
		{
			encrypted_word += std::to_string(j + 1);
		}
		else
		{
			encrypted_word += word[i];
		}
		encrypted_word += "/";
	}

	std::cout << encrypted_word << "\n";
	std::cout << std::string(encrypted_word.begin(), encrypted_word.end() - 1) << "\n";
}

Jeżeli liczba jest literą z alfabetu zostanie zakodowana w odpowiedni sposób (alfabet jest jednocześnie kluczem, który gdy zostanie pomieszany może stanowić dodatkowe możliwości w szyfrowaniu). Przykładowo litera 'z' zostanie zakodowana na 23, więc trzeba ją przekonwertować na napis za pomocą std::to_string. Jeżeli litera nie pochodzi z alfabetu to do zakodowanego słowa zostanie dodany niezmieniony znak.

komentarz 29 stycznia 2018 przez jankustosz1 Nałogowiec (35,880 p.)
Jeżeliby literki w kodach ascii nie były po kolei to takie rozwiązanie byłoby wymagane, ale jeżeli już go rozpatrywać to można łatwo go 23' krotnie przyśpieszyć. Czyli zamiast używać std::string::find na sztywno wpisać do tablicy że tab['a'] = 1, tab['b'] = 2 itd, a potem tylko się w czasie stałym odwoływać do tablicy co da lepszą złożoność dla dużych danych.
0 głosów
odpowiedź 29 stycznia 2018 przez niezalogowany
Nie lepiej zrobić szyfrowanie jak enigma?

Sprawdzasz czas systemowy (date) i on ci mnoży przez ileś tam każdą literke i w while ci to zamienia na inne litery i drugi program (inną część kodu) przeznaczyć na odszyfrywacz po przez wpisanie daty i zdania
komentarz 29 stycznia 2018 przez jankustosz1 Nałogowiec (35,880 p.)
Po co się ograniczać od razu własne rsa z kluczem prywatnym i publicznym. Jest tylko jeden szkopuł, mała szansa że teraz to zrobi skoro ma problemy przy zwykłej zamianie literki na liczbę.
komentarz 29 stycznia 2018 przez niezalogowany

No właśnie, nie rób tego w stringach, rób to w boxerkach, tzn w char, jeżeli stwożysz zmienną char *zmienna; to bedziesz mia£ nieskończoną ilość tablic(prawie nieskonczoną) czyli można tak zrobić

char *wyraz;

char *pozamianie;

int petla = 0;

cin>>wyraz;

while (petla > 100)

    If (wyraz[petla] == "a")

    {

        pozamianie[petla] = g:

    }

    Else If (wyraz[petla] == "b")

    {

        pozamianie[petla] = d:

    }

//i tak do końca alfabetu jedziesz potem to dopracuj i napisz mi jak zrobisz to zobacze jak to zrobiłeś 

Podobne pytania

0 głosów
1 odpowiedź 295 wizyt
–2 głosów
3 odpowiedzi 2,563 wizyt
pytanie zadane 21 stycznia 2019 w C i C++ przez HaSen Nowicjusz (230 p.)
+1 głos
1 odpowiedź 357 wizyt
pytanie zadane 1 października 2016 w C i C++ przez 4sp3ll Początkujący (410 p.)

92,615 zapytań

141,465 odpowiedzi

319,779 komentarzy

61,997 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!

...