adrian.paz Temat założony przez niniejszego użytkownika |
Sortowanie znaków » 2017-11-19 17:16:22 Witam ma problem z jednym programem. Ma on po wprowadzeniu ciągu liter do programu posortować je tak żeby pasowało do któregoś słowa zapisanego w pliku txt. Program działa faktycznie sortuje, jednakże chciałbym tak przerobić tą funkcję: bool porownanie( string lhs, string rhs ) { sort( lhs.begin(), lhs.end() ); sort( rhs.begin(), rhs.end() ); return lhs == rhs; }
żeby nie sortowało mi od początku do końca tylko np w zależności od tego jaką wpisze długość słowa to tyle liczb mi posortuje. Chodzi o to zeby z rozsypanki literowej którą wprowadze z klawiatury porównało ją z słowami zapisanymi w kolejnych liniach pliku txt. Niestety ten program działa tylko dla słów utworzonych ze wszystkich liter :( da rade zrobić tak, że podam że to słowo ma 5 znaków i wprowadze wszystkie dostepne litery to posortuje mi 5 pierwszych liter do takiego stanu aby pasowało ze słowem 5 literowym zapisanym w tym pliku? ogólnie program wyglada tak: #include <iostream> #include <string> #include <fstream> #include <cstdlib> #include <conio.h> #include <algorithm> using namespace std; bool porownanie( string lhs, string rhs ) { sort( lhs.begin(), lhs.end() ); sort( rhs.begin(), rhs.end() ); return lhs == rhs; } void odczyt() { system( "cls" ); fstream plik; plik.open( "slownik.txt", ios::in ); if( plik.good() == false ) { cout << "Wystapil problem ze znalezieniem/otwarciem pliku 'slownik.txt'!" << endl; exit( 0 ); } string slowo, napis; cout << "Podaj litery ktore masz do dyspozycji: "; cin >> slowo; system( "cls" ); int nr_linii = 1, licznik = 0; while( getline( plik, napis ) ) { if( porownanie( napis, slowo ) ) { cout << napis << endl; licznik = 1; } nr_linii++; } system( "PAUSE" ); if( licznik == 0 ) { cout << "Podane litery nie pasuja do zadnego wyrazu zapisanego w pliku. Wprowadz inne litery" << endl << endl; char wybor; cout << "1. Nowe litery" << endl; wybor = getch(); switch( wybor ) { case '1': odczyt(); break; default: exit( 0 ); break; } } }
void zapis() { system( "cls" ); string slowo; fstream plik; int nr_linii = 1; plik.open( "slownik.txt", ios::out | ios::app ); while( true ) { cout << "Podaj nowe slowo: "; cin >> slowo; plik << slowo << endl; nr_linii++; system( "cls" ); } plik.close(); } int main() { char wybor; cout << "1. Chce dodac do slownika nowe elementy" << endl; cout << "2. Chce przeszukac slownik" << endl; wybor = getch(); switch( wybor ) { case '1': zapis(); break; case '2': odczyt(); break; default: { system( "cls" ); cout << "W takim razie milego dnia :)" << endl << endl; system( "PAUSE" ); } } return 0; }
|
|
pekfos |
» 2017-11-19 17:26:02 Takie podejście nie zadziała poprawnie dla słów różnej długości. Musiałbyś słowa sprowadzić do tej samej długości, a więc sprawdzić każdą możliwą kombinację N liter z M > N. Takie rozwiązanie nie ma sensu. Prościej porównać histogramy. Jeśli w każdym punkcie histogram tekstu A jest mniejszy równy histogramowi tekstu B, to ze znaków tekstu B da się złożyć tekst A. |
|
adrian.paz Temat założony przez niniejszego użytkownika |
» 2017-11-19 17:56:44 Histogramy? Mógłbyś to jakoś szerzej omówić? Jestem kurczakiem w tej dziedzinie naukę programowania zacząłem miesiąc temu na początku studiów :P co to są te histogramy? Bo taka definicja: Histogram – jeden z graficznych sposobów przedstawiania rozkładu empirycznego cechy. Składa się z szeregu prostokątów umieszczonych na osi współrzędnych.
|
W ogole do mnie nie przemawia :( jak miałoby wyglądać takie porównanie? Widzę że tu już wyższa szkoła jazdy.. |
|
mateczek |
» 2017-11-19 18:23:26 |
|
pekfos |
» 2017-11-19 18:29:09 Co za beznadziejna definicja.. No liczysz ile masz każdego znaku i ile potrzebujesz. |
|
adrian.paz Temat założony przez niniejszego użytkownika |
» 2017-11-19 23:33:25 Rozumiem że to bardzo trudne? Ja kompletnie w temacie jakichś histogramów czy kontenerów co ktoś inny mi polecił jestem zielony :( Nw może łatwiej by było jakbym przy zapisie rozsyłał w zależności od ilości liter w wyrazie do poszczególnych plików? Wtedy przy odczycie miałbym jeden rozmiar.. coś ktoś mówił o zagnieżdżonej pętli w której z podanych liter kombinacje wszystkie będzie mi robić. Jak zrobić taki system kombinacji? I jak to porównać ze słowami z pliku?? Resztę jakoś odrzucić trzeba... Proszę pomóżcie miejscie wyrozumiałość dla niedoświadczonego człowieka :) coś więcej niż jedno zdanie :) |
|
pekfos |
» 2017-11-19 23:51:50 Rozumiem że to bardzo trudne? |
Tak trudne, jak jedna tablica. Ale jeśli koniecznie chcesz mieć te sortowanie, możesz to zrobić jak w twoim porownanie(), ale do porównania zamiast lhs == rhs będzie pętla, bardziej skomplikowana niż policzenie histogramu. Do porównania na bazie histogramów wystarczy jedna pomocnicza tablica i 3 trywialne pętle, jedna po drugiej. |
|
adrian.paz Temat założony przez niniejszego użytkownika |
» 2017-11-20 00:43:12 Ech... a myślałem że to prostsze.. Histogramow w ogole nie ogarniam nie mam pojęcia nawet co to znaczy i co to jest.. w necie też nie mogę znaleźć żadnej informacji poza tym że to graficzne przedstawienie czegoś.. Będę musiał się zadowolić tym co mam :( A co do tego sortowania to się nie uparłem po prostu jak usłyszałem o jakichś histogramach to się załamałem bo nawet nje mogę znaleźć żadnego poradnika który by to dobrze wytłumaczył |
|
« 1 » 2 3 4 |