IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

Diskusia – 10. diel - Textové reťazce v jazyku C ++ druhýkrát - Práca so znakmi

Späť

Upozorňujeme, že diskusie pod našimi online kurzami sú nemoderované a primárne slúžia na získavanie spätnej väzby pre budúce vylepšenie kurzov. Pre študentov našich rekvalifikačných kurzov ponúkame možnosť priameho kontaktu s lektormi a študijným referentom pre osobné konzultácie a podporu v rámci ich štúdia. Toto je exkluzívna služba, ktorá zaisťuje kvalitnú a cielenú pomoc v prípade akýchkoľvek otázok alebo projektov.

Komentáre
Avatar
Jakub Sobinovsky:2.5.2017 20:50

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

 
Odpovedať
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

Editované 13.7.2017 20:34
 
Odpovedať
13.7.2017 20:33
Avatar
Odpovedá 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;
}
Odpovedať
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?

 
Odpovedať
10.11.2017 13:20
Avatar
Martin Petrovaj
Tvůrce
Avatar
Odpovedá 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.

Odpovedať
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 :-)

 
Odpovedať
28.9.2018 20:21
Avatar
Zakk
Člen
Avatar
Odpovedá 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"

 
Odpovedať
14.11.2018 19:53
Avatar
Odpovedá na Zakk
Petr Štechmüller:14.11.2018 20:39

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

Odpovedať
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í?

 
Odpovedať
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;
}
Editované 2.2.2019 17:06
Odpovedať
2.2.2019 17:06
Pokud ti něco jde těžko, znamená to, že jdeš tou správnou cestou...
Robíme čo je v našich silách, aby bola tunajšia diskusia čo najkvalitnejšia. Preto do nej tiež môžu prispievať len registrovaní členovia. Pre zapojenie sa do diskusie sa zaloguj. Ak ešte nemáš účet, zaregistruj sa, je to zadarmo.

Zatiaľ nikto nevložil komentár - buď prvý!