Výpis nejdelších slov z pole – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Výpis nejdelších slov z pole – C / C++ – Fórum – Programujte.comVýpis nejdelších slov z pole – C / C++ – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené.
pazdy0
Návštěvník
30. 10. 2017   #1
-
0
-

Zdravím, mám za úkol vypsat z textu nejdelší slova. Vstupem je pole s textem a z tohohle pole, musím vypsat na obrazovku slova s nejvíce písmeny. Kód celkem mám, ale je problém, že když jsou tam dvě stejně dlouhá slova, tak program vypíše jen jedno a to druhé ne, mohl by mi někdo prosím poradit, kde tuhle chybu ošetřím? Díky.

void dlouha_slova ()
{
    string str(text);
    string workingword="";
    string maxword="";
    unsigned int i=0;

    for (i=0;i<str.size(); i++)
    {
        if (str[i]!=' ')
        {
            workingword+=str[i];
        }
        else
        {
            workingword="";
        }
        if(workingword.size()>maxword.size())
        {
            maxword=workingword;
        }
    }
    cout << maxword << endl;

}
Nahlásit jako SPAM
IP: 90.180.158.–
30. 10. 2017   #2
-
0
-

Variace na tvůj algoritmus, kde budeš ukládat do vectoru (maxword změníš na vector stringů) všechna slova se stejnou délkou jako aktuální nejdelší slovo:
1. je-li slovo delší než stávající maxword[0], vyprázdníš vector a do vyprázdněného vectoru vložíš slovo
2. je-li slovo stejně dlouhé jako maxword[0], přidáš slovo do vectoru

Po doběhnutí cyklu vypíšeš obsah vectoru.

std::vector se dá použít jako pole. Na rozdíl od pole se nemusíš starat o hlídání mezí, vector se sám realokuje a zná svou velikost.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
pazdy0
Návštěvník
30. 10. 2017   #3
-
0
-

Takže pokud to správně chápu, musí tam ještě být nějaký cyklus, který mi přičte k tomu maxword to další slovo o stejné délce?

Nahlásit jako SPAM
IP: 90.180.158.–
30. 10. 2017   #4
-
0
-

Další cyklus je až na výpis. Slova o stejné délce poznáš podle další podmínky

hu

Nahlásit jako SPAM
IP: 195.178.67.–
30. 10. 2017   #5
-
0
-

   

void dlouha_slova ()
{
    string str(text);
    string workingword="";
    unsigned int i=0;
    std::vector<string> maxword;

    maxword.clear();
    maxword.psh_back("");
    for (i=0;i<str.size(); i++)
    {
        if (str[i]!=' ')
        {
            workingword+=str[i];
        }
        else
        {
            workingword="";
        }
        if(workingword.size()>maxword[0].size())
        {
            //workingword je nove nejdelsi slovo, stara zahodim
            maxword.clear();
            maxword.psh_back(workingword);
        }
        else if(workingword.size() == maxword[0].size())
        {
           //workingword je dalsi nejdelsi slovo, pridam ho do seznamu nejdelsich slov 
           maxword.psh_back(workingword);
        }
    }
    //vypis
    for(i = 0; i < maxword.size(); i++)
    {
       cout << maxword[i] << endl;
    }
}

není vyzkoušeno. C++ jsem už 2 roky nedělal, snad bez chyb.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
30. 10. 2017   #6
-
0
-

Pro zvýšení efektivity bych zkusil podmínky trochu jinak uspořádat ( délka slova by se měla zjišťovat až když je slovo celé ): 

void dlouha_slova ()
{
    string str(text);
    string workingword="";
    unsigned int i=0;
    std::vector<string> maxword;

    maxword.clear();
    maxword.psh_back("");
    for (i=0;i<str.size(); i++)
    {
        if (str[i]!=' ')
        {
            workingword+=str[i];
        }
        else
        {
           if(workingword.size()>maxword[0].size())
           {
              //workingword je nove nejdelsi slovo, stara zahodim
              maxword.clear();
              maxword.psh_back(workingword);
           }
           else if(workingword.size() == maxword[0].size())
           {
              //workingword je dalsi nejdelsi slovo, pridam ho do seznamu nejdelsich slov 
              maxword.psh_back(workingword);
           }
           workingword="";
       }
    }
    //vypis
    for(i = 0; i < maxword.size(); i++)
    {
       cout << maxword[i] << endl;
    }
}

hu

Nahlásit jako SPAM
IP: 195.178.67.–
30. 10. 2017   #7
-
0
-

Ještě si vyzkoušej, co se stane, když nejdelší slovo je až poslední slovo v řetězci.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
pazdy0
Návštěvník
30. 10. 2017   #8
-
0
-

Díky za odpovědi, ale výsledek je pořád bohužel stejný, jak v mém v případě :(

Nahlásit jako SPAM
IP: 90.180.158.–
KIIV
~ Moderátor
+43
God of flame
30. 10. 2017   #9
-
0
-

Todle mi napriklad funguje:

#include <iostream>
#include <sstream>
#include <iterator>
#include <algorithm>
#include <vector>

using namespace std;

void dlouha_slova (string const& text)
{
        istringstream  input {text};
        vector<string> maxwords;

        for_each(
	        istream_iterator<string>(input),
		istream_iterator<string>(),
		[&maxwords](string const& slovo)
		{
			if (maxwords.empty() || maxwords[0].size() == slovo.size())
			{
				maxwords.emplace_back(std::move(slovo));
			}
			else if (maxwords[0].size() < slovo.size())
			{
				maxwords.clear();
				maxwords.emplace_back(std::move(slovo));
			}
		}
	);

	//vypis
	for(string slovo : maxwords)
	{
		cout << slovo << endl;
	}
}

int main()
{
	dlouha_slova("a b DD ss EERR issddv sESS DGGF DSE lksd sdfssd sdett g h");
}

Je to delane krasne pres algoritmy, lambdu, string stream na parsovani slov a tak (c++11)

Nahlásit jako SPAM
IP: 185.163.41.–
Program vždy dělá to co naprogramujete, ne to co chcete...
peter
~ Anonymní uživatel
4014 příspěvků
30. 10. 2017   #10
-
0
-

Jestli spravne chapu ten puvodni kod, tak hleda nejdelsi slovo. Nic vic.
Prvni cast kodu hleda slovo, znaky <> ' ' (ruzne od mezery).
Druha cas potom porovnava delku slova s max velikosti.
Druha cast by mela slova ukladat do pole. Muzes si tam poznacit jako 'delku nejkratsiho slova'. Kdyz tu delku prekroci tve slovo, tak spustit kod, ktery slovo prida do pole a soucasne odstrani nejmensi slovo z pole, opravi promennou 'delku nejkratsiho slova'.

Nebo muzes proste slova ukladat do pole, pole seradit podle delky, nejdelsi nahore. A vybrat prvnich 10 slov.

Nahlásit jako SPAM
IP: 2001:718:2601:258:4dbc:38...–
pazdy0
Návštěvník
30. 10. 2017   #11
-
0
-

Děkuji za rady, ale bylo by pro mě lepší, to upravit pro ten můj kód. Jsem začátečník a je pro mě lepší nějaký krátký srozumitelný kód, než nějaký "profesionální". Můžu z Vás teda někoho poprosit o úpravu toho mého kódu? Já si s tím fakt už nevím rady...

Nahlásit jako SPAM
IP: 90.180.158.–
KIIV
~ Moderátor
+43
God of flame
30. 10. 2017   #12
-
0
-

#11 pazdy
ja to tak delal schvalne, je pak mensi sance, ze to muzes odevzdat jako reseni domaciho ukolu :D

Nicmene na ten istringstream jde pouzit i >>, a do stringu to nacita po celych slovech. Tim usetris to tvoje parsovani. A zbytek zustava podobny.

#include <iostream>
#include <sstream>
#include <vector>

using namespace std;

void dlouha_slova (string const& text)
{
    istringstream  input {text};
    vector<string> maxwords;
    string slovo;

    while (input >> slovo)
    {
        if (maxwords.empty() || maxwords[0].size() == slovo.size())
        {
            maxwords.emplace_back(std::move(slovo));
        }
        else if (maxwords[0].size() < slovo.size())
        {
            maxwords.clear();
            maxwords.emplace_back(std::move(slovo));
        }
    }

    //vypis
    for(string slovo : maxwords)
    {
        cout << slovo << endl;
    }
}

int main()
{
    dlouha_slova("a b DD ss EERR isddv sESS DGGF DSE lksd sdssd sdett g h");
}
Nahlásit jako SPAM
IP: 185.163.41.–
Program vždy dělá to co naprogramujete, ne to co chcete...
30. 10. 2017   #13
-
0
-

#11 pazdy
Prokrokuj si můj kód a zkus si ho odladit. Je to modifikace tvého kódu. Abych mohl uložit několik stejných slov, potřebuji "úložiště", jako první nápad se nabízí pole, ale jeho nevýhodou je nutnost hlídat jeho meze aby nedošlo k zápisu "za pole", tj. mimo alokovanou paměť a pokud okamžitá velikost pole nestačí, realokovat paměť. Proto jsem zvolil vector, který to má ošetřené. Takže vector slouží jako seznam nejdelších slov. Cílem podmínek v těle cyklu je:
1. je-li workingword delší, než stávající nejdelší slovo nebo slova uložená ve vectoru (stačí porovnat s prvním slovem ve vectoru, ostatní jsou stejně dlouhá), starý seznam se smaže - provede se vymazáním vectoru a do takto vyprázdněného seznamu se vloží workingword jako nejdelší. Při ladění se projeví tak, že size vectoru bude 1

2. je-li workingword stejně dlouhé jako stávající nejdelší slovo nebo slova uložená ve vectoru, přidá se k nim do vectoru. Při ladění se ti projeví jako zvětšení size vectoru.

V druhé úpravě jsem se pokusil o drobnou optimalizaci, kde se nejdříve přečte celé slovo a pak se porovnává jeho délka.

Netvrdím, že je to bez chyb. Napsat kód je jedna věc a odladit druhá. Právě proto, že jsi začátečník, by bylo dobré pokusit se kód odladit. Takto získaná zkušenost bude pro tebe cenná a trvanlivá. Takže rada zní: spustit debuger a krokovat řádek po řádku a dívat se do proměnných, co v nich je a jak se jejich obsah mění. 

hu

Nahlásit jako SPAM
IP: 195.178.67.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 8 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý