NOVINKA: Získej 40 hodin praktických dovedností s AI – ZDARMA ke každému akreditovanému kurzu!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze – Lekce 11 - Textové řetězce v jazyce C++ podruhé - Práce se znaky

Zpět

Upozorňujeme, že diskuze pod našimi online kurzy jsou nemoderované a primárně slouží k získávání zpětné vazby pro budoucí vylepšení kurzů. Pro studenty našich rekvalifikačních kurzů nabízíme možnost přímého kontaktu s lektory a studijním referentem pro osobní konzultace a podporu v rámci jejich studia. Toto je exkluzivní služba, která zajišťuje kvalitní a cílenou pomoc v případě jakýchkoli dotazů nebo projektů.

Komentáře
Avatar
Jakub Sobinovsky:2.5.2017 20:50

Len taká mala otázka prečo sme si museli vynulovať tie počitadlá ?

 
Odpovědět
2.5.2017 20:50
Avatar
Matěj Krbeček:13.7.2017 20:33

Ahoj chtěl bych se zeptat, proč je v mém kódu délka stringu "sifera" nula?

#include <cstdlib>
#include <string> // pro práci s řetězci
#include <iostream> // pro tisk

using namespace std;
/*
*
*/
int main(void) {

string veta, sifra;
int pom, posun;

cout<<"Zadejte vaši zprávu!"<<endl;
getline(cin, veta);

cout<<"Zadejte posnu"<<endl;
cin>> posun;

pom=0;
for(int i=0; i<veta.length(); i++){
pom=(int)veta[i]+po­sun;
sifra[i]=(char)pom;
// cout<<sifra[i];

}
cout<<"Vaše zpráva je zašifrována jako: ";
for(int i=0; i<sifra.length(); i++){
cout<<sifra[i];
}

return 0;
}

Když vypíšu šifru v jednom cyklu, tak mi vše v pořádku funguje, ale pokud udělám pro výpis cyklus samostatný, tak jako to mám v tomto kódu, tak to nefunguje. Je to tím, že délka stringu "sifra" je nula. Ale já nevím proč. Byl by někdo prosím tak laskavý a objasnil mi to.

Děkuji

Editováno 13.7.2017 20:34
 
Odpovědět
13.7.2017 20:33
Avatar
Odpovídá na Matěj Krbeček
Jaroslav Dubánek:14.8.2017 9:44

Podle mě je to proto, že v prvním řádku v cyklu zašifrování, je v proměnný pom přiřazená nula a to tam dělá paseku.

Přepsal jsem tvůj kód pro vlastní procvičení a funguje mi takhle:

#include <string>
#include <iostream>

using namespace std;

int main(void) {

        string veta;

        cout << "zadejte vasi zpravu malymi pismeny a bez diakritiky " << endl;
        getline(cin, veta);

        cout << "zadejte posun cislem" << endl;
        int posun;
        cin >> posun;

        for (int i = 0; i<veta.length(); i++) {
                veta[i] = veta[i] + posun;
                if (veta[i] > 122)
                        veta[i] = veta[i] - 26;

        }
        cout << "vase zprava je zasifrovana: " << endl;
        for (int i = 0; i < veta.length(); i++)
                cout << veta[i];
        cin.get(); cin.get();
        return 0;
}
Odpovědět
14.8.2017 9:44
Život je ve skutečnosti strašně jednoduchej.
Avatar
Filip Vomela
Člen
Avatar
Filip Vomela:10.11.2017 13:20

#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;

int main()
{

string retezec = "Cernadirajeu­nasdomaprotoj­semtadyz";
cout << "puvodni retezec: " << retezec << endl;
int posun = 1;
for (int i = 0; i < retezec.length(); i++) {
retezec[i] = retezec[i] + posun;
if (retezec[i] > 'z') { retezec[i] = retezec[i] - 26; }
}

cout << retezec << endl;

for (int i = 0; i < retezec.length(); i++) {
retezec[i] = retezec[i] - posun;
if (retezec[i] < 'a') { retezec[i] = retezec[i] + 26; }
}
cout << retezec << endl;
}

Chci se zeptat proč mi to vypíše místo 'c' ten znak?

 
Odpovědět
10.11.2017 13:20
Avatar
Martin Petrovaj
Tvůrce
Avatar
Odpovídá na Filip Vomela
Martin Petrovaj:28.12.2017 13:18

Asi si na to už prišiel sám, ale pre teba aj pre iných, je to tým že to 'C' je veľké. Veľké písmená majú rozdielne ASCII hodnoty než ich malé náprotivky.

Pokiaľ si teda v kóde buď neošetríš správny posun aj veľkých písmen, alebo nezadáš (resp. neprevedieš) vstupný reťazec na malé písmená, tak veľké písmená sa prevedú nesprávne.

Odpovědět
28.12.2017 13:18
if (this.motto == "") { throw new NotImplementedException(); }
Avatar
Petr Švarc
Člen
Avatar
Petr Švarc:28.9.2018 20:21

Ahoj, chtěl bych poprosit o vysvětlení téhle části kódu, nějak nechápu co se tam s čím porovnává atp :-)

if (samohlasky.find(retezec[i]) < samohlasky.length())

Díky :-)

 
Odpovědět
28.9.2018 20:21
Avatar
Zakk
Člen
Avatar
Odpovídá na Petr Švarc
Zakk:14.11.2018 19:53

taky mě to mátlo, ale koukám, že metoda find(), vrátí pozici znaku v řetězci.. takže pokud ten výsledek toho findu bude menší než je délka řetězce samohlásky, tak se ten znak nachází v tom řetězci samohlásky.. a když ho to nenajde, tak to přeleze někam mimo ? a vrátí to nějaký větší číslo?
zkusil jsem si napsat

string s="chleba";
    cout<<s.find('r');

a výstup je

18446744073709551615

takže zřejmě ano, ale úplně mi teda není jasné, kam to "přeleze"

 
Odpovědět
14.11.2018 19:53
Avatar
Odpovídá na Zakk
Petr Štechmüller:14.11.2018 20:39

If no matches were found, the function returns string::npos

Odpovědět
14.11.2018 20:39
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Lukáš Labor:30.11.2018 14:55

Ahoj zkusil jsem si vytvořit svou verzi programu caesarova šifra

int main()
{
cout << "Zadej zpravu:" << endl;
string a;
string b;
int c;
char d;
getline(cin,a);
cout<<"zadej posuv"<<endl;
cin>>c;
for(int i=0;i<a.length();i++)
if(a[i]=='z'|­|a[i]=='Z')
{d=a[i]-26+c;
b[i]=d;
cout<<d;}
else
{d=a[i]+c;
b[i]=d;
cout<<d;}

a program přestane fungovat pokud zadám řetězec delší než 17 znaků, nemáte nějaké vysvětlení?

 
Odpovědět
30.11.2018 14:55
Avatar
pgarsky
Člen
Avatar
pgarsky:2.2.2019 17:06

Prosím o ohodnocení mojí jednoduché aplikace pro šifrování:

#include <iostream>
// #include <cmath>
#include <string>
// #include <algorithm>
// #include <ctime>

using namespace std;

int main(void) {
        setlocale(LC_ALL, "");

        unsigned int posun;

        string text;
        string moznost;
        string povolenaPismena = "abcdefghijklmnopqrstuvwxyz";

        bool vyskocit = false;
        bool spatne = false;

        cout << "Zadejte text: " << endl;
        getline(cin, text);

        do {
                if (spatne == true) {
                        getline(cin, moznost);
                        spatne = false;
                }

                for (int i = 0; i < text.length(); i++) {
                        if (povolenaPismena.find(text[i]) < povolenaPismena.length()) {
                                if (i == text.length() - 1) {
                                        vyskocit = true;
                                        break;
                                }
                        }
                        else {
                                cout << "Zadejte pouze text s malymi pismeny a bez mezer.";
                                i = 0;
                                spatne = true;
                                break;
                        }
                }

                if (vyskocit == true) {
                        break;
                }

        } while (1);

        cout << "Chcete text sifrovat nebo rozsifrovat? (s/r): ";
        do {
                getline(cin, moznost);

                if (moznost == "s" || moznost == "r") {
                        break;
                }
                else {
                        cout << "Zadejte pouze \"s\" nebo \"r\": ";
                }

        } while (1);

        cout << "O kolik mist chcete text sifrovat nebo rozsifrovat?: ";
        cin >> posun;

        if (moznost == "s") {
                for (int i = 0; i < text.length(); i++) {
                        text[i] = text[i] + posun;
                        if (text[i] > 'z') {
                                text[i] = text[i] - 26;
                        }
                }
        }
        else if (moznost == "r") {
                for (int i = 0; i < text.length(); i++) {
                        text[i] = text[i] - posun;
                        if (text[i] < 'a') {
                                text[i] = text[i] + 26;
                        }
                }
        }

        cout << "Zasifrovany/odsifrovany text: " << text << endl;
        cin.ignore(0xFF, '\n');

        cin.get();
        return 0;
}
Editováno 2.2.2019 17:06
Odpovědět
2.2.2019 17:06
Pokud ti něco jde těžko, znamená to, že jdeš tou správnou cestou...
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 18.