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

Podmiana litery badz znaku na inny

VPS Starter Arubacloud
0 głosów
3,450 wizyt
pytanie zadane 9 września 2016 w C i C++ przez Platiniumekk Początkujący (250 p.)
Siemka.

Polece prosto z mostu bo nie mam czasu sie rozpisywac. Posiadam tabele z ciagiem znakow. Chciałbym aby każda litera, znak  wpisany w pole tekstowe zmienił sie w inny. Powiedzmy ze w pole wpisuje "abcd" a program pobiera tabele z ciagiem znakow i podmienia "abcdaad" na "1234114".

Wiem ze mozna to zrobic za pomoca insert(), ale nie za bardzo to rozumiem ;/
Byłby ktos w stanie mnie poprowadzić?

3 odpowiedzi

+1 głos
odpowiedź 9 września 2016 przez niezalogowany
edycja 9 września 2016

Poczytaj sobie o tablicy znaków ACII. Zmienna char przechowuje wartości liczbowe. Każda liczba odpowiada jakiejś literze. Zmieniając char na int i dodając mu np 1 zmieniamy zgodnie z tablicą ASCII a na b. Następnie musisz zamienić tą liczbę na char:

#include <iostream>
using namespace std;

int main()
{
    char imie[10] = "abcdefghi";
    for(int i=0;i<9;i++)
        cout<<char(imie[i]+1);
    return false;
}

Teraz musisz tylko odpowiednią ilość dodać/odjąć zamiast jedynki.

komentarz 9 września 2016 przez niezalogowany
Twoja odpowiedź nie ma sensu, takie rozwiązanie byłoby strasznie przekombinowane
komentarz 9 września 2016 przez Platiniumekk Początkujący (250 p.)
tyle ze tablica znakow nie jest ustawiona po kolei. wygladaa mniej wiecej tak: Zz:n3Wd2}%x[trig~TV]R0Uf>SQ)IJ9@1+bhl*N/y=Oo7pPm#X|MEK&CL$4k_<,u(Y.^qD!c6sAw{jHvFe-?85GB

a odpowiada jej :

1234567890-=qwertyuiop[]\asdfghjklzxcvbnm,./~!@#$%^&*()_+QWERTYUIOP{}|ASDFGHJKL:ZXCVBNM<>?
komentarz 9 września 2016 przez niezalogowany
@Platiniumekk zignoruj tą propozycję bo w gruncie rzeczy nie ma zupełnie sensu
komentarz 9 września 2016 przez niezalogowany
Jakby dodać odpowiednie warunki zamiany to by jakieś miała. Twoje rozwiązanie faktycznie jest lepsze...
komentarz 9 września 2016 przez niezalogowany
Twoje jest skompilkowane już przy założeniu że ilość znaków szukanej frazy jest identyczna jest równa tej do zamiany.

A co w sytuacji gdy druga fraza jest innej długości? Np składa się z 0 znaków?
1
komentarz 9 września 2016 przez criss Mędrzec (172,590 p.)
Wystarczyłoby imie[i] + 1. Nie potzreba tych wszystkich konwersji.

No i pętla pomija ostatni element.
komentarz 9 września 2016 przez niezalogowany
Dokładniej to char(imie[i]+1).
Gdyby zadający pytanie chciał mieć różne tabele o różnych wielkościach poradziłbym string  i metodę size(). Nie chciał to nie chce zamazywać kodu. Nie było też określone czy chce zmienić a na 0, b na x... Było powiedziane bierze tablice i wszystko zmienia. W takim przypadku replace zajęłoby więcej czasu.
komentarz 9 września 2016 przez criss Mędrzec (172,590 p.)

imie[i] już jest char-em, więc imie[i] + 1 też zwraca char

edit : nie, mój błąd. imie[i] + 1 zwraca int

komentarz 9 września 2016 przez niezalogowany
imie[i] jest charem, ale w momencie dodania +1 rzutowane jest na typ int. Zobacz sobie w konsoli.
+1 głos
odpowiedź 9 września 2016 przez niezalogowany
edycja 9 września 2016

Zajrzyj do: http://www.cplusplus.com/reference/string/string/

Koniecznie zwróć uwagę na:

  1. find(...)
  2. replace(...)
  3. opcjonalnie na erase(...) oraz insert(...)- możesz tego użyć jeżeli nie chcesz używać replace().
komentarz 9 września 2016 przez Platiniumekk Początkujący (250 p.)

czyli teoretycznie cos takiego powinno dzialac

        string lewyy;       //pole tekstowe.
        string znaki("1234567890-=qwertyuiop[]\asdfghjklzxcvbnm,./~!@#$%^&*()_+QWERTYUIOP{}|ASDFGHJKL:ZXCVBNM<>? ");
        string mieszanka;       //znaki wymieszane losowo.


        for(int i; i != znaki.size(); i++){
        string * it = find(lewyy, lewyy[lewyy.size() + 1], znaki[i]);
        replace(lewyy, lewyy[lewyy.size() + 1], lewyy[i], mieszanka[i]);
        }

 

komentarz 9 września 2016 przez niezalogowany
Na pewno brakuje odpowiedniego początku pętli, bo i może być losowe z pamięci, więc musisz np int i=0 - inaczej zostanie wylosowana wartość. Zmienna pole tekstowe ma w sobie losowe wartości i nie wiesz jaka jest długa. Tak samo zmienna mieszanka... Więcej się nie wypowiadam, bo nie rozumiem co chcesz dokładnie zrobić.
komentarz 9 września 2016 przez Platiniumekk Początkujący (250 p.)
edycja 9 września 2016 przez Platiniumekk

Jak to trudno wytlumaczyc.... Probuje juz chyba 5 raz zeby to mialo sens xD

Ok. Mamy wygeneroway szyfr "mieszanka = "Zz:n3Wd2}%x[tri"" 

Z z : n 3 W d 2 } % x [ t r <-- mieszanka
1 2 3 4 5 6 7 8 9 0 - = q w <-- znaki

I teraz chciałbym aby kazdy znak z "mieszanki" odpowiadal w taki sposob do "znakow". Czyli jesli wpisze w pole tekstowe "054q-" wyjdzie "%3ntx". Taki szyfr. Tyle ,ze nie mam pojecia jak to zrobic. moze cos w stylu  'znaki[0]' = mieszanka[0]   ?

 

PS. zminna "mieszanka" jest tak samo dluga co zmienna "znaki". jest to poprostu wymieszana zmienna "znaki".

 

PPS. najlatwiej byłoby wrzucić to wszystko w petle "for(int i = 0; i > znaki.size(); i++)" i jakos ze soba porownac.

komentarz 9 września 2016 przez niezalogowany
edycja 9 września 2016

Coś w ten deseń?

 

#include <iostream>
using namespace std;

int main()
{
    string mieszanka = "f2jda";
    string znaki = "abcde";

    string tekst;
    cin>>tekst;

    for(int i=0; i<tekst.size(); i++)
    {
        for(int j=0; j<znaki.size(); j++)
        {
            if(tekst[i]==znaki[j])
            {
                cout<<mieszanka[j];
                break; /* zakończ szukanie w tablicy znaki, gdy już znajdziesz jej pasujący element */
            }
        }
    }

    return false;
}

 

komentarz 9 września 2016 przez niezalogowany
Gdy podasz np abcedee to wyświetli f2jadaa
0 głosów
odpowiedź 9 września 2016 przez plkpiotr Stary wyjadacz (12,420 p.)
Może warto byłoby wykorzystać coś w rodzaju Szyfru Cezara, tzn. "przesunąć" każdy ze znaków w kodzie ASCII o kilka/kilkanaście miejsc.
komentarz 9 września 2016 przez niezalogowany
Nie mów tak bo dostaniesz minusa :C
komentarz 9 września 2016 przez C☺ndzi Stary wyjadacz (12,100 p.)
Dlaczego?
komentarz 9 września 2016 przez niezalogowany
Patrz mój na mój komentarz z kodem w tym temacie.
komentarz 9 września 2016 przez plkpiotr Stary wyjadacz (12,420 p.)
Ok, faktycznie nie zauważyłem, że pomyślałeś wcześniej podobnie :)
Chylę czoła w takim razie, bo byłeś pierwszy a ja niepotrzebnie powtarzam...

A nie... chodziło Ci, że skoro Ty dostałeś minusa to i ja, no to zaraz coś dodamy :D

Podobne pytania

0 głosów
1 odpowiedź 3,366 wizyt
pytanie zadane 15 grudnia 2015 w C i C++ przez pineapple505 Nowicjusz (120 p.)
0 głosów
1 odpowiedź 940 wizyt
0 głosów
1 odpowiedź 547 wizyt

92,453 zapytań

141,262 odpowiedzi

319,088 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...