Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Sortowanie znaków

Ostatnio zmodyfikowano 2017-11-23 18:29
Autor Wiadomość
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ę:
C/C++
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:
C/C++
#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;
}
P-166977
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.
P-166979
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..
P-166980
mateczek
» 2017-11-19 18:23:26
P-166982
pekfos
» 2017-11-19 18:29:09
Co za beznadziejna definicja.. No liczysz ile masz każdego znaku i ile potrzebujesz.
P-166983
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 :)
P-166993
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.
P-166994
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ł
P-166995
« 1 » 2 3 4
  Strona 1 z 4 Następna strona