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

powtarzanie się wyrazu w pliku - algorytm

Object Storage Arubacloud
+1 głos
1,394 wizyt
pytanie zadane 14 maja 2016 w C i C++ przez Evelek Nałogowiec (28,960 p.)

Chcę sprawdzić, ile razy dany napis powtórzył się w danym pliku a potem wypisać powtarzające się wyrazy. Przykładowo w pliku tekstowym mam:

AUTO

DOM

SAMOCHOD

DOM

MOTOR

I widzimy, że słowo DOM się powtórzyło więc wypisuje je. Napisałem wstępny program, ale ciężko mi wymyślić pomysł na algorytm, który weźmie np. pierwszy wyraz i przeszuka po całym pliku czy się nie powtarza...

#include <iostream>
#include <fstream>
#include <cstdlib>

using namespace std;

int main()
{
    string dane;
    bool wystepuje;
    
    fstream plik;
    plik.open("napis.txt", ios::in);
    
    while(!plik.eof())
    {
        plik >> dane;
        wystepuje = true;
        for (int i = 1; i < 1000; i++)
        {
        
        ???
        
        }
    }
    plik.close();
    return 0;
}

 

2 odpowiedzi

+1 głos
odpowiedź 14 maja 2016 przez niezalogowany
wybrane 15 maja 2016 przez Evelek
 
Najlepsza
Użyj kontenera map.
komentarz 16 maja 2016 przez Evelek Nałogowiec (28,960 p.)

Jeszcze jedno pytanie do tego. Kod już ogarnąłem i zrozumiałem jako tako.

Ale jak go jeszcze inaczej przerobić, aby wypisywał tylko te wyrazy, które się powtarzają min. 2 razy? Bo np. nie interesują mnie te, które wystąpiły tylko jeden raz, tylko te, co min.2 razy występują w pliku?

Stosuje kod drugi od Ciebie, czyli:

#include <iostream>
#include <string>
#include <fstream>
#include <map>

int main(){
    std::fstream file("napis.txt");
    std::map<std::string, int> map;
    std::string temp;
    while(file>>temp)
        ++map[temp];
    for(std::map<std::string, int>::iterator it = map.begin(); it != map.end(); ++it)
          std::cout<<"Wyraz \""<<it->first<<"\" wystapil "<<it->second<<" razy\n";
}

Zastanawiałem się nad jakąś formułką typu if(it->second > 1) cout << it->first ale ciągle błąd w kompilacji.

komentarz 16 maja 2016 przez draghan VIP (106,230 p.)

Dobrze się zastanawiałeś. Powinno działać coś w stylu:

for(std::map<std::string, int>::iterator it = map.begin(); it != map.end(); ++it)
{
    if(it -> second > 1)
        std::cout << it->first << " (" << it->second << " wystąpienia)\n";
}

Jaki błąd kompilacji?

komentarz 16 maja 2016 przez Evelek Nałogowiec (28,960 p.)

Aj, miałem identycznie jak teraz napisałeś, usunąłem jeden dwukropek w linijce przy ::iterator i szlak mnie trafiał dlaczego to sie kompilować nie chce:

expected unqualified-id before ':' token

Tego błędu nie zrozumiałem, teraz widzę. Dzięki za pomoc, jutro maturka z informatyki i czuję się przygotowany.

A co do tego kodu, nie ma może możliwości napisania go przy użyciu using namespace std; aby nie pisać wszędzie tych std:: ? Próbowałem go modyfikować poprzez usunięcie wszystkich tych std:: a dopisanie samego using namespace std; ale mam błąd:  expected primary-expression before ',' token| w linijce gdzie się znajduje:

for(map<string, int>::iterator it = map.begin(); it != map.end(); ++it)

Może tylko w tej jednej linijce trzeba coś zostawić a reszta niepotrzebna?

komentarz 16 maja 2016 przez Evelek Nałogowiec (28,960 p.)
A najlepiej to chyba metodą prób i błędów tak mi przyszło teraz do głowy... i popatrzeć co może zostać a co nie.
komentarz 17 maja 2016 przez draghan VIP (106,230 p.)

Powinno działać z dyrektywą using, być może usunąłeś coś więcej niż same std::.

Powodzenia! :)

+1 głos
odpowiedź 14 maja 2016 przez ZakosiliMiNeta Nałogowiec (30,870 p.)
Moment, twój algorytm ma znajdować powtarzający się wyraz czy ty mu podajesz jakiś wyraz i ma sprawdzić ile razy się powtórzył ?
komentarz 14 maja 2016 przez Evelek Nałogowiec (28,960 p.)
Mój algorytm sprawdza ile jest takich samych wyrazów w jednym pliku. Nic nie dorzucam od siebie, wszystko pobierane z pliku.

Podobne pytania

0 głosów
2 odpowiedzi 1,264 wizyt
pytanie zadane 29 września 2017 w Mikrokontrolery przez niezalogowany
0 głosów
2 odpowiedzi 6,999 wizyt
pytanie zadane 21 września 2017 w C i C++ przez Resmittieno Początkujący (280 p.)

92,572 zapytań

141,423 odpowiedzi

319,645 komentarzy

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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy 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!

...