vector stringów problem z sortowaniem

0

Mam do napisania program, który ma wczytywać plik tekstowy, a następnie wyświetlać z posortowanymi alfabetycznie wyrazami i liczbą wystąpień danego wyrazu.

To co na razie udało mi się stworzyć:

 #include <iostream>
#include <fstream>
#include <string>
#include <sstream>
#include <vector>
#include <cctype>
#include <algorithm>
using namespace std;
////////////////////////////////////////////////////////
void sort_alfa (string *t, int r)
{
    for (int i = r - 1; i > 0; i--)        // tzw. sortowanie b¹belkowe, bêdziemy sortowaæ wiersze, tak aby ich znaki w pierwszej kolumnie by³y poustawiane alfabetycznie (zgodnie z rosn¹cym kodem ASCII)
    {
        for (int k = 0, j; k < i; k++)
        {
            j = 0;
            string temp;                    // zmienna pomocnicza, u¿ywana przy zamianie wyrazów
            while (t [k][j] == t [k+1][j])  // dopóki pierwsza litera wyrazu jest równa pierwszej literze wyrazu nastêpnego
            {
                  j++;
            }
            if (t [k][j] > t [k+1][j])
            {
                  temp = t [k];
                  t [k] = t [k + 1];
                  t [k + 1] = temp;
            }
        }
    }
}
///////////////////////////////////////////////////////
int liczba_znakow;
//////////////////////////////////////////
int main()
{
string nazwa;
char znak;
string tekst;
cout << "Podaj nazwe pliku do wyswietlenia: ";
cin >> nazwa;
ifstream plik(nazwa.c_str());
vector<string> linie;
    if (plik.is_open())
    {
        while (getline(plik, tekst,' '))
        {
            linie.push_back(tekst);
        }

//        vector<string>::iterator i;
//        for (i = linie.begin(); i < linie.end(); i++)
//        {
//            cout << *i << endl;
//        }
    }
    else
    {
        cout << "Plik nie moze zostac otwarty.";
    }
cout<<linie[1];
for (int i = linie.size() - 1; i > 0; i--)        // tzw. sortowanie b¹belkowe, bêdziemy sortowaæ wiersze, tak aby ich znaki w pierwszej kolumnie by³y poustawiane alfabetycznie (zgodnie z rosn¹cym kodem ASCII)
    {
        for (int k = 0, j; k < i; k++)
        {
            j = 0;
            string temp;                    // zmienna pomocnicza, u¿ywana przy zamianie wyrazów
            while (linie [k][j] == linie [k+1][j])  // dopóki pierwsza litera wyrazu jest równa pierwszej literze wyrazu nastêpnego
            {
                  j++;
            }
            if (linie [k][j] > linie [k+1][j])
            {
                  temp = linie [k];
                  linie [k] = linie [k + 1];
                  linie[k + 1] = temp;
            }
        }
    }
    cout<<endl;
cout<<linie[2];
cout<<endl;
system("PAUSE");
return 0;
}

Sortowanie nie działa, reszta sprawna.
Pozostanie mi jeszcze stworzenie tablicy obrazującej powtórzenia wyrazów, ale najpierw muszę mieć posortowane te wyrazy.

0

Mimo moich wielkich umiejętności do partolenia wszystkiego sortowanie działa. Dzięki Piotrze.

Niestety mam kolejny problem.

 #include <iostream>
#include <fstream>
#include <string>
#include <sstream>
#include <vector>
#include <cctype>
#include <algorithm>
using namespace std;
//////////////////////////////////////////
int main()
{
string nazwa;
char znak;
string tekst;
cout << "Podaj nazwe pliku do wyswietlenia: ";
cin >> nazwa;
ifstream plik(nazwa.c_str());
vector<string> linie;
    if (plik.is_open())
    {
        while (getline(plik, tekst,' '))
        {
            linie.push_back(tekst);
        }
    }
    else
    {
        cout << "Plik nie moze zostac otwarty.";
    }
for(int i=0; i<linie.size(); i++)
{
    int j=0;
    for(j;j<linie[i].size (); j++)
    {
     if(linie[i][j]>='A' && linie[i][j]<='Z')
     linie[i][j]= linie[i][j] + ('a' - 'A');
    }
}
cout<<linie[1];

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
for(int i=0; i<linie.size(); i++)
{
    int j=0;
    for(j;j<linie[i].size (); j++)
    {
     if(linie[i][j]<'a' && linie[i][j]>'z')
     linie[i].erase (linie[i][j],1);
    }
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

bool wr; // Czy zamieniono w ostatnim obrocie?

        do {
            wr= false;
            for (int i = 0; i < linie.size () - 1; ++i)
            {
                if (linie[i] > linie[i + 1]) {
                    swap(linie[i], linie[i + 1]);
                    wr = true;
                }
            }
        } while (wr);
    cout<<endl;
cout<<linie[1];
cout<<endl;
system("PAUSE");
return 0;
}

Wyszczególniony fragment ma usuwać wszystkie znaki poza literami w wyrazach (litery wielkie zmienione wcześniej na litery małe). Niestety nie działa - kompiluje się, ale efekt jest żaden.

0

Skorzystaj z biblioteki algorithm skoro już ją dołączasz. Wybierz sobie jedno z trzech sortowań:
http://cplusplus.com/reference/algorithm/sort/
http://cplusplus.com/reference/algorithm/sort_heap/
http://cplusplus.com/reference/algorithm/stable_sort/

0

Ale już mam posortowane elementy alfabetycznie.
Teraz zamierzam za pomocą funkcji count sprawdzać ile razy dany wyraz wystąpił i wypisywać.

Chodziło mi o to, że nie działa mi fragment, który miał usuwać znaki w stylu #?!.[] itd. itp.

for(int i=0; i<linie.size(); i++)
{
    int j=0;
    for(j;j<linie[i].size (); j++)
    {
     if(linie[i][j]<'a' && linie[i][j]>'z')
     linie[i].erase (linie[i][j],1);
    }
}

Dzięki za cierpliwość i wyrozumiałość.

EDIT: Doszedłem do takiego momentu - program kilkukrotnie sprawdzony - nie działa tak jak powinien...

#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
#include <vector>
#include <cctype>
#include <algorithm>
using namespace std;
//////////////////////////////////////////
int main()
{
string nazwa;
char znak;
string tekst;
cout << "Podaj nazwe pliku do wyswietlenia: ";
cin >> nazwa;
ifstream plik(nazwa.c_str());
vector<string> linie;
    if (plik.is_open())
    {
        while (getline(plik, tekst,' '))
        {
            linie.push_back(tekst);
        }
    }
    else
    {
        cout << "Plik nie moze zostac otwarty.";
    }
for(int i=0; i<linie.size(); i++)
{
    int j=0;
    for(j;j<linie[i].size (); j++)
    {
     if(linie[i][j]>='A' && linie[i][j]<='Z')
     linie[i][j]= linie[i][j] + ('a' - 'A');
    }
}
for(int i=0; i<linie.size(); i++)
{
    int j=0;
    for(j;j<linie[i].size (); j++)
    {
     if(linie[i][j]<'a' && linie[i][j]>'z')
     linie[i].erase (linie[i][j],1);
    }
}
bool wr; // Czy zamieniono w ostatnim obrocie?

        do {
            wr= false;
            for (int i = 0; i < linie.size () - 1; ++i)
            {
                if (linie[i] > linie[i + 1]) {
                    swap(linie[i], linie[i + 1]);
                    wr = true;
                }
            }
        } while (wr);
    cout<<endl;
//cout<<linie[200];
cout<<endl;
int ile_razy[linie.size()];
for(int i=0; i<linie.size();i++)
{
ile_razy[i]=count(linie.begin(), linie.end(), linie[i]);
}
//cout<<ile_razy[856]<<endl;
int t;
//cout<<ile_razy[0]<<linie[0];
//cout<<linie.size();
for(int i=0; i<linie.size(); ++i)
{
    if(ile_razy[i]>=ile_razy[i+1])
    t=i;
    else
    t=i+1;
}
cout<<ile_razy[t];
cout<<"Ile razy\t\tWyraz\nwyraz\nwystapil\n\n";
cout<<ile_razy[t]<<"\t\t"<<linie[t]<<endl;
for(int k=0, n=1; k<100 , n<30; n++, k++)
{
    int i=0;
    for(i=0; i< linie.size(); i++)
    {
        if(ile_razy[i]=ile_razy[t]-n)
        cout<<ile_razy[i]<<"\t\t"<<linie[i]<<endl;
    }
}
system("PAUSE");
return 0;
}
0
for(int i=0; i<linie.size(); i++)
{
//    int j=0;
    for(int j = 0; j < linie[i].size(); j++) // size to funkcja, nie mozesz miec spacji pomiedzy "size" a "()"
    {
     if(linie[i][j]<'a' && linie[i][j]>'z') // jak może być coś mniejsze od 'a' **i** zarazem większe od 'z'?
     linie[i].erase (linie[i][j],1);
    }
}
0

Dzięki, rzeczywiście nie zauważyłem, że zamiast || dałem z przyzwyczajenia &&.
Po poprawieniu i usunięciu zbędnej spacji zamiast wyniku działania programu w konsoli pojawia się to:
"This application has requested the runtime to terminate it in an unusual way"

1
MJay napisał(a)
    for(int j = 0; j < linie[i].size(); j++) // size to funkcja, nie mozesz miec spacji pomiedzy "size" a "()"
}
#include <iostream>
void spr(){
	std::cout<<"Dziala\n";
}
int main(){
	spr                           ();
} 

Sprawdzaj przed poradami.
@Kierownik
Do erase jako pierwszy argument podajesz chara, czy tak na pewno ta metoda działa (sprawdź w reference)?

0
Zjarek napisał(a)

@Kierownik
Do erase jako pierwszy argument podajesz chara, czy tak na pewno ta metoda działa (sprawdź w reference)?

Za Gręboszem:

string& erase (size_type pozycja, size type ile_znakow);

0

Zawiedziony działaniem funkcji erase() postanowiłem wszystko robić sam. Efekt:

 for(int a=0;a<linie.size();a++)
{
    for(int b=0; b<linie[a].size();b++)
    {
        if(linie[a][b]>='a' && linie[a][b]<='z');
        else
        {
            for(int i=0; i<linie.size(); i++)
            {
                int j=0;
                for(j;j<linie[i].size();j++)
                {
                    if(linie[i][j]>='a' && linie[i][j]<='z');
                    else
                    {
                        int z;
                        for(z=j; z<linie[i].size();z++)
                        {
                            linie[i][z]=linie[i][z+1];
                        }

                    }
                }
            }
        }

    }

To usuwa wszystkie niechciane znaki, ale za to w słowach pozostają spacje na końcu....

0

Po zakończeniu pętli po:
z
daj:

linie[i].resize(z);

Ale może zastanów się nad użyciem standardowych algorytmów.

bool IsBad(char ch) { return !isalpha(ch); }

   string s("dsaf53 6jkl5 ;5l34m kl5 j3j6 lkj536lk4jxx");
   s.replace(remove_if(s.begin(),s.end(),IsBad),s.end(),0,0);
   cout<<s<<endl;
0

Gdziekolwiek zastosuję funkcję resize(), to i tak wynik działania programu nadal jest zły(w jednym przypadku funkcja usuwa spacje, ale giną także poszczególne słowa).

2 sposób zaraz wypróbuję.

EDIT:
2 sposób działa. Dziękuję.
Pozostaje zliczanie wyrazów, zostawię to sobie na wieczór...

EDIT 2:
Program wreszcie działa.
Dziękuję wszystkim za pomoc i to za taką pomoc, dzięki której wielu rzeczy się dowiedziałem, a nie "podanie wszystkiego na tacy".

Temat do zamknięcia.

0

size to funkcja, nie mozesz miec spacji pomiedzy "size" a "()"
spacje można mieć praktycznie wszędzie.

#     include      <cstdio>
using        namespace
std
    ;int
main     (
){   printf
(           "hello\n"  )
                        ; }

1 użytkowników online, w tym zalogowanych: 0, gości: 1