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

Sortowanie znaków

Ostatnio zmodyfikowano 2017-11-23 18:29
Autor Wiadomość
mateczek
» 2017-11-22 11:00:35
for( int i = 0, j = 0; j < plikowe.size(); )
P-167077
adrian.paz
Temat założony przez niniejszego użytkownika
» 2017-11-22 11:26:32
Boże co mi tu dalej nie działa.. Działa tylko jak mam pomieszane litery tylko jak już jest np literka więcej w wpisanych to już się nie zgadza.. Nie wiem może problem jest gdzieś dalej w programie?
C/C++
#include <iostream>
#include <string>
#include <fstream>
#include <cstdlib>
#include <conio.h>
#include <algorithm>
using namespace std;
bool porownanie( string plikowe, string wpisane )
{
    int licz;
    sort( plikowe.begin(), plikowe.end() );
    sort( wpisane.begin(), wpisane.end() );
    for( int i = 0, j = 0; j < plikowe.size(); ) //dopóki są jeszcze litery w wyrazie z pliku
    {
        if( i >= wpisane.size() ) //Jeżeli ilość liter w pliku jest większa od ilości liter wpisanych
             return false;
       
        if( wpisane[ i ] > plikowe[ j ] ) i++;
       
        if( wpisane[ i ] < plikowe[ j ] ) i++;
       
        if( wpisane[ i ] == plikowe[ j ] ) i++; j++; licz++;
        if( licz == plikowe.size() )
             return plikowe == wpisane;
       
    }
    return plikowe == wpisane;
}
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-167078
karambaHZP
» 2017-11-22 11:43:06
Ale wiesz, że w
if( wpisane[ i ] == plikowe[ j ] ) i++; j++; licz++;
 przy spełnionym warunku wykonywana jest postinkrementacja
i++;
, a pozostałe wykonywane są zawsze?
P-167080
adrian.paz
Temat założony przez niniejszego użytkownika
» 2017-11-22 12:07:28
No to jak to zrobić? Chodzi mi o to żeby sprawdziło kolejna literkę w jednym i drugim słowie. To licz jest po to żeby mi liczyło dobre literki. Jak słowo plikowe jest np 4 literowe to musza 4 pasować. Jak to zrobić żeby działało? Nie za bardzo wiem co tu jest zle, ci to postimrementacja?
P-167083
mateczek
» 2017-11-22 14:50:09
tak na drodze logiki skoro masz tylko
return plikowe == wpisane;

to myślę, że cała pętla for nie ma znaczenia. i tak funkcja działa w ten sposób

C/C++
bool porownanie( string plikowe, string wpisane )
{
    int licz;
    sort( plikowe.begin(), plikowe.end() );
    sort( wpisane.begin(), wpisane.end() );
    return plikowe == wpisane;
}
P-167085
pekfos
» 2017-11-22 14:59:17
Źle zrobiłeś już to, co podałem wcześniej w kodzie. Masz przejść po wszystkich wpisanych literach. Nie wszystkie plikowe muszą być wykorzystane. Dodatek zmiennej licz jest błędny i nie ma tu żadnego sensu. Kod w warunkach też nie ma sensu. Tu nie ma być żadnego porównywania całych napisów! Jedyne co tu możesz dodać tego typu, to sprawdzenie rozmiarów napisów, czy w ogóle starczy liter zanim zaczniesz dokładnie sprawdzać. Jedyne co napisałeś z sensem, to inkrementacja obu liczników, gdy para znaków jest sobie równa, ale nawet tego nie zapisałeś poprawnie.
P-167086
mateczek
» 2017-11-22 15:12:50
weź sobie string z literami i kasuj literkę jak znajdziesz

C/C++
#include <iostream>
#include <string>
using namespace std;
bool porownaj( const string & wyraz, string litery ) {
    for( int i = 0; i < wyraz.size(); i++ ) {
        bool jest = false;
        for( int j = 0; j < litery.size(); j++ ) {
            if( wyraz[ i ] == litery[ j ] ) {
                jest = true;
                litery[ j ] = 0; //znalazłem literkę i ją kasuje; kasuj przez wpisanie zera lub funkcją erase()
                break; //for można przerwać
            }
        }
        if( !jest ) return false; //gdy pętla nie znalazła litery to koniec funkcji nie da się zbudować wyrazu
       
    }
    return true; //da się zbudować wyraz
}
int main()
{
    string litery = "alamakotaa";
    string wyraz1 = "alamakotki";
    string wyraz2 = "aalamatoka";
    cout << "1 porownanie ok=0 " << porownaj( wyraz1, litery ) << endl;
    cout << "2 porownanie ok=1 " << porownaj( wyraz2, litery ) << endl;
   
}
P-167087
YooSy
» 2017-11-22 23:07:17
C/C++
bool is_it_possible( std::string random_letters, const std::string & word )
{
    if( random_letters.size() < word.size() ) { return false; }
    auto word_it = word.cbegin();
    auto rnd_ltr_it = random_letters.begin();
    while( word_it != word.cend() )
    {
        auto pos = random_letters.find( * word_it );
        if( pos != std::string::npos ) // jeśli znaleziono znak w literkach
        {
            random_letters.erase( pos, 1 ); // usuń ją z literek
            ++word_it; // przejdź do następnej szukanej literki w słowie wzorze
        }
        else // jeśli nie znaleziono literki, nie ma sensu szukać dalej
        {
            return false;
        }
    }
    return true;
}
P-167103
1 2 « 3 » 4
Poprzednia strona Strona 3 z 4 Następna strona