Kezdőoldal » Számítástechnika » Programozás » C++ feladatban segítene valaki?

C++ feladatban segítene valaki?

Figyelt kérdés

Feladat:

Kérjen be egy max 1000 karakterből álló szöveget, majd írassa ki a legalább kétszer előforduló leghosszabb szövegrészletet.


Nem tudom a feladat mire gondol a leghosszabb szövegrészlet alatt, leghosszabb szóra talán?

Az a helyzet, hogy programozni nem tudok... bekérem a szöveget, de még azt se tudom, hogy írassam ki a leghosszabb szót belőle.

Valaki tudna segíteni?


2017. dec. 2. 13:43
 1/9 anonim ***** válasza:

Igen a leghosszabb szóra gondol szerintem is de függetlenül attól hogy ez a szó értelmes vagy értelmetlen e,ezért úgy fogd fel hogy van egy karaktersorozatod amiben meg kell keresned azt a két leghosszabb karaktersorozaton belüli karaktersorozatot amely egyforma.


A karaktersorozatod felétől ha páros a száma a karaktereket tartalmazó szövegnek ha páratlan akkor fele - 1 mert ugye egy felétől hosszabb az egyik karaktersorozatod akkor annak nem lehet egyező párja , veszed ezt a hosszúságú szövegrészt(fél ha páros) és összehasonlítod a másik felével ha nincs egyezés akkor mész tovább veszel eggyel kevesebb karaktert mind a két szórészletedből de mind a kettőnek hátulról vagy az elejéről és ha találsz egyezést eltárolod és kilépsz a ciklusból.


Valami ilyesmi logika alapján kéne megcsinálod.

2017. dec. 2. 14:49
Hasznos számodra ez a válasz?
 2/9 anonim ***** válasza:

#1 Te azt feltételezed, hogy a két szórészlet a szöveg két felében lesz?


Erre alapvetően van egy igen gyors megoldás, ami egyben némiképp komplikált is, szóval ragaszkodjunk az egyszerű megközelítéshez.


Az én megközelítésem a következőn alapszik: Ha van egy n hosszú karakterlánc ami megegyezik, akkor annak az összes substringje is egyezni fog, egészen az első karakterig. Tehát először elég az első karaktert megtalálni.

Először fogod a legelső karaktert, és elkezdesz végigmenni a szövegen, egészen addig, amíg nem találsz egy ugyanolyan karaktert. Eztán elkezded szépen nézni, hogy az első karakter után hány karakterig egyezik a két szövegrészlet. Ha egy ponton már nincs egyezés, akkor fogod, az addigi szövegrészletet kimásolod, mint 'leghosszabb'. Ezután mész tovább a szövegen, keresve további egyezést az első karakterrel, de mostmár ha egyezést találsz, bevethetsz egy egyszerű trükköt. Ha mondjuk n karakter hosszú az aktuális leghosszabb szövegrészlet, megnézheted, hogy az n+1. karakterhelyen egyezik-e a két szövegrészlet amit épp vizsgálsz. Ha nem, akkor kár vesződni, mehetsz tovább. Így mész végig a szövegen az első karakterre, majd a másodikra, majd a harmadikra, és így tovább, amíg el nem érsz a szöveg előtti n+1. karakterhez, ahonnan már úgysem találhatsz kellő hosszúságú egyezést. Nem túl gyors, egy szolid n^2 a műveletigénye, itt-ott optimalizálható mondjuk. Viszont relatíve egyszerű.

2017. dec. 2. 15:16
Hasznos számodra ez a válasz?
 3/9 anonim ***** válasza:

Köszi előző hogy rávilágítottál a hülyeségemre.

Írtad hogy lehet itt ott optimalizálni,megtennéd pls hogy elmagyarázod azt is hogy hogyan. :)

2017. dec. 2. 19:05
Hasznos számodra ez a válasz?
 4/9 anonim ***** válasza:
Nos, a hatékony megoldása a feladatnak az lenne, ha egy Suffix tree-t építenénk fel, de az egy picit komplikált első blikkre. Léynegében minél jobban hasonlít a megoldás ahhoz, annál hatékonyabb lesz. Egy egyszerű gyorsítás az lehet pl, ha első körben kigyűjtjük az egyes kezdőbetűk indexeit, így utána már csak a megfelelő kezdőkaraktereket kell végigjárnunk. Pl.
2017. dec. 2. 19:24
Hasznos számodra ez a válasz?
 5/9 anonim válasza:

Gyorsan írtam egy megoldást:


#include <iostream>

#include <string>

#include <vector>

#include <sstream>


int main()

{

char text[1000] = "ez egy szoveg random szavakkal ossze vissza szavakkal ossze meg vissza a szoveg";

std::vector<std::string> sections;


std::istringstream ss(text);

std::string token;

while(std::getline(ss, token, ' '))

sections.push_back(token);


int maxSize = sections[0].length();

int maxIndex = 0;

for(int i=0; i<sections.size(); i++)

{

for(int j=i; j<sections.size(); j++)

{

if(sections[i] == sections[j] && maxSize < sections[i].length())

{

maxSize = sections[i].length();

maxIndex = i;

break;

}

}

}


std::cout << sections[maxIndex] << std::endl;


return 0;

}


Nem biztos hogy a legszebb megoldás, messze nem a leghatékonyabb, de mivel írta a kérdező, hogy nem tud programozni, nem akartam bonyolítani a dolgot.

2017. dec. 2. 22:44
Hasznos számodra ez a válasz?
 6/9 anonim válasza:
Előző vagyok: ha a feladat úgy szól, hogy szövegrészlet két random index közötti karaktersorozat, nem pedig úgy, hogy egy szeparátorral elválaszott rész, akkor a megoldásom semmit nem ér.
2017. dec. 2. 22:47
Hasznos számodra ez a válasz?
 7/9 A kérdező kommentje:

Köszönöm a válaszokat!


Utolsó küldött nekem egy megoldást, ezen kellene még csiszolni egy kicsit.

Tehát a lényeg, hogy elindul a program és fontos, hogy ne tűnjön el. Ki írja a felhasználónak, hogy írjon be egy szöveget. Entert nyom a felhasználó és a program kiválasztja a leghosszabb szót, ami legalább kétszer előfordul (ezt a szót ki is íratja a progi). Ezután egy gombnyomásra bezáródik.


Próbáltam átírni a kódot, de annyira béna vagyok, hogy nem megy.

Idáig jutottam:


#include <iostream>

using namespace std;

#include <string>

#include <vector>

#include <sstream>


int main()

{

setlocale(LC_ALL, "hun");

cout << "Írjon be egy maximum 1000 karakterből álló szöveget : " << endl;

char text[1000] = "ez egy szoveg random szavakkal ossze vissza szavakkal ossze meg vissza a szoveg";

std::vector<std::string> sections;


std::istringstream ss(text);

std::string token;

while (std::getline(ss, token, ' '))

sections.push_back(token);


int maxSize = sections[0].length();

int maxIndex = 0;

for (int i = 0; i<sections.size(); i++)

{

for (int j = i; j<sections.size(); j++)

{

if (sections[i] == sections[j] && maxSize < sections[i].length())

{

maxSize = sections[i].length();

maxIndex = i;

break;

}

}

}


std::cout << sections[maxIndex] << std::endl;

system("pause");

return 0;

}



Talán a getline(cin, ); utasítást kellene használnom?

2017. dec. 3. 14:22
 8/9 anonim ***** válasza:
#5 Ez a megoldás már ott elhasal, hogy feltételezi, hogy egyáltalán létezik két egyforma szó, raádásul rögtön az első szót veszi alapértéknek, mintegy feltételezve, hogy az első szó eleget tesz ennek a feltételnek. Semmi nem garantálja, hogy az első szó szerepelni fog kétszer, sőt, semmi nem garantálja, hogy bármelyik szó szerepelni fog kétszer. Ezt ennek tudatában kéne átírni.
2017. dec. 3. 14:35
Hasznos számodra ez a válasz?
 9/9 anonim válasza:
Valóban hibás. Nem fogok megint kódot írni, elég egy bool változó, aminek az értékét igazra állítjuk ha a belső ciklusban lévő feltétel teljeseül. + még azt is javítani kéne, hogy int j = i+1 legyen, ne i, mert így minden szóra teljesül.
2017. dec. 3. 18:17
Hasznos számodra ez a válasz?

Kapcsolódó kérdések:




Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!