• 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

+1 głos
2,293 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,525 wizyt
pytanie zadane 29 września 2017 w Mikrokontrolery przez niezalogowany
0 głosów
2 odpowiedzi 7,791 wizyt
pytanie zadane 21 września 2017 w C i C++ przez Resmittieno Początkujący (280 p.)

93,741 zapytań

142,676 odpowiedzi

323,294 komentarzy

63,322 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

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...