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

Justowanie tekstu - konsola

Ostatnio zmodyfikowano 2014-03-02 11:42
Autor Wiadomość
Rafals
Temat założony przez niniejszego użytkownika
» 2014-02-25 13:51:41
Wznowiłem pracę nad projektem. Udało się prawie w pełni samemu napisać. Pomysły z insertem zaczerpnąłem od Alixira.
Sprawdzałem na różne sposoby i niby błędów brak.
Jeszcze tylko parę funkcji do dodania z usuwaniem/dodawaniem spacji po znakach interpunkcyjnych.
Odczyt i zapis z/do pliku.
Definiowanie szerokości przez użytkownika.
Sprawdzenie czy dany wiersz nie jest ciągiem dłuższym od zadanej szerokości.
W sumie nie wiem czy jest sens się aż tak bawić :P
Na tekst nie patrzcie :P Pierwszy lepszy z brzegu po wpisaniu w googlach "sciana tekstu".
C/C++
#include <iostream>
#define SZER 50

using namespace std;

void interpunction_space_adder( string & oryginal, int ascii, int i )
{
    switch( ascii )
    {
    case 33: { if( oryginal[ i + 1 ] != ' ' ) oryginal.insert( i + 1, " " ); break; }
        //case 34:{if(oryginal[i-1] != ' ')oryginal.insert(i," ");break;} //dokonczyc otwierajacy " i zamykajacy ", sprawdzac ilosc, resetowac w zamykajacym
        //case 40:{if(oryginal[i+1] != ' ')oryginal.insert(i+1," ");break;} //to samo co wyzej ()
        //case 41:{if(oryginal[i+1] != ' ')oryginal.insert(i+1," ");break;}
    case 44: { if( oryginal[ i + 1 ] != ' ' ) oryginal.insert( i + 1, " " ); break; }
        //case 45:{if(oryginal[i+1] != ' ')oryginal.insert(i+1," ");break;}myslnik dodaj przed i po
    case 46: { if( oryginal[ i + 1 ] != ' ' ) oryginal.insert( i + 1, " " ); break; } // dodac opcje wielokropka
    case 58: { if( oryginal[ i + 1 ] != ' ' ) oryginal.insert( i + 1, " " ); break; }
    case 59: { if( oryginal[ i + 1 ] != ' ' ) oryginal.insert( i + 1, " " ); break; }
    case 63: { if( oryginal[ i + 1 ] != ' ' ) oryginal.insert( i + 1, " " ); break; }
    }
}

int main()
{ //01234567890123456789012345678901234567890
    string oryginal = "Mowie tylko do tych ktorzy chca mnie sluchac dasdas dcias dasjdk. "
    "Ci ktorzy nie chca nie obchodza mnie. "
    "Po co mam czas tracic na mowienie do nich sadojc. "
    "Sciana i tak zawsze swoje wie."
    "Mowie tylko do tych. "
    "Ktos na scianie?wyryl haslo. "
    "Sciana dobrze haslo zna. "
    "Sciana cala   jest tym haslem. "
    "Z    duma  wola   oto ja. "
    "Mowie tylko do tych."
    "Mowie tylko do tych ktorzy chca mnie slu. "
    "Ci ktorzy nie chca nie obchodza m niea. "
    "Po co mam czas tracic na mowienie do sci. "
    "Sciana i tak zawsze swoje wie. asasd ass. "
    "Mowie tylko do tych. "
    "Ktos na scianie ?wyryl haslo. "
    "Sciana dobrze haslo zna. "
    "Sciana cala   jest tym haslem. "
    "Z    duma  wola   oto ja. "
    "Mowie tylko do tych. hjhkh.";
   
    int spaces_lines = 0;
    int i = 0;
    cout << oryginal << endl << endl << endl;
    // usuniecie nadmiaru spacji oraz dodanie spacji po znakach interpunkcyjnych
    for(; i < oryginal.length(); i++ )
    {
        if( oryginal[ i ] == ' ' )
             spaces_lines++;
        else if( spaces_lines > 0 )
        {
            switch( spaces_lines )
            {
            case 1: { spaces_lines = 0; break; }
                default: { oryginal.erase( i - spaces_lines + 1, spaces_lines - 1 ); spaces_lines = 0; }
            }
        }
        //dodanie spacji po znakach interpunkcyjnych jezeli brakuje
        interpunction_space_adder( oryginal, oryginal[ i ], i );
    }
    //cout << oryginal << endl << endl;
   
    //justowanie
   
    int endl_pos = 0; // xyz zmienna odpowiadajaca za ustawienie na zerowy element dalszej czesci tekstu po wstawieniu znaku nowej linii
    spaces_lines = 1;
    int check_space = spaces_lines * SZER + endl_pos;
    int line_len;
    for(; check_space < oryginal.length() + SZER; )
    { while( oryginal[ check_space ] != ' ' )
             check_space--;
       
        oryginal.replace( check_space, 1, 1, '\n' );
        i = spaces_lines * SZER + endl_pos - SZER;
        for(; i <= spaces_lines * SZER + endl_pos; i++ )
        if( oryginal[ i ] == 10 )
        {
            //check_space = spaces_lines * 80 + endl_pos - i;
            check_space = SZER - i %( SZER + 1 );
            break;
        }
        i = spaces_lines * SZER + endl_pos - SZER;
        //line_len = spaces_lines*80+endl_pos - check_space - spaces_lines*80+endl_pos-81;
        line_len =( SZER + 1 ) - check_space;
        while( check_space > 0 && line_len > SZER / 1.5 )
        {
            if( oryginal[ i ] == ' ' )
            {
                oryginal.insert( i, 1, ' ' );
                check_space--;
                i++;
            }
            i++;
            if( i == spaces_lines * SZER + endl_pos )
                 i = spaces_lines * SZER + endl_pos - SZER;
           
        }
        spaces_lines++; endl_pos++;
        check_space = spaces_lines * SZER + endl_pos;
    }
    cout << oryginal;
    return 0;
}

Pytanie do tego fragmentu. Która wersja lepsza? Wiem, że w tak małym projekcie nie ma to wielkiego znaczenia, ale na przyszłość chciałem nabrać nawyku powiedzmy. Ja bym powiedział, że pierwsza. Gdyż druga to reszta z dzielenia, czyli w grę wchodzą przecinki. Ale nie jestem pewien swojej teorii :P
C/C++
check_space = spaces_lines * SZER + endl_pos - i;
check_space = SZER - i %( SZER + 1 );
P-105247
Rafals
Temat założony przez niniejszego użytkownika
» 2014-02-27 21:27:56
Witam.
Mam mały problem. Mianowicie kiedy przekopiuję tekst do pliku txt i chcę go wyjustować programem to wyrzuca mi taki błąd:
terminate called after throwing an instance of 'std::out_of_range'
what(): basic_string::replace
Np tekst z tej samej strony ten http://wypracowania24.pl/wos/3695/syria-zamieszki-wojna-domowa z pierwszej strony, wywala mi błąd.
Z kolei jak wezmę tekst niżej http://wypracowania24.pl/historia/9911/referendum-ludowe-z-roku to tu już wszystko jest ok.
Nie mam pojęcia co powoduje owy błąd.
W tej funkcji uzyskuję błąd.
C/C++
void justyfication( string & orginal, int check_space, int spaces_lines, int endl_pos, int i )
{ for(; check_space <( orginal.length() + SZER ); )
    {
        if( orginal[ check_space ] == '\n' )
             orginal.erase( check_space, 1 );
       
        while( orginal[ check_space ] != ' ' )
             check_space--;
       
        orginal.replace( check_space, 1, 1, '\n' );
        i = spaces_lines * SZER + endl_pos - SZER;
        for(; i <= spaces_lines * SZER + endl_pos; i++ )
        {
            if( orginal[ i ] == 10 )
            {
                check_space = SZER - i %( SZER + 1 ); //check_space = spaces_lines * 80 + endl_pos - i;
                break;
            }
        }
        i = spaces_lines * SZER + endl_pos - SZER;
        //line_len = spaces_lines*80+endl_pos - check_space - spaces_lines*80+endl_pos-81;
        int line_len =( SZER + 1 ) - check_space;
        while( check_space > 0 && line_len > SZER / 1.5 )
        {
            if( orginal[ i ] == ' ' )
            {
                orginal.insert( i, 1, ' ' );
                check_space--;
                i++;
            }
            i++;
            if( i == spaces_lines * SZER + endl_pos )
                 i = spaces_lines * SZER + endl_pos - SZER;
           
        }
        spaces_lines++; endl_pos++;
        check_space = spaces_lines * SZER + endl_pos;
    }
}

Problem rozwiązany. Dodałem przy wczytywaniu tekstu z pliku, metodą getline, po każdej wczytanej linii dodałem spację. W sumie potem i tak jest space remover/adder.
P-105366
Rafals
Temat założony przez niniejszego użytkownika
» 2014-02-28 18:06:27
Jednak problem nie rozwiązany.
Czegoś tu nie rozumiem. Raz działa, a raz nie. Najlepsze jest to że akurat teraz dodawałem tylko funkcję zapisu do pliku, a on mi wywala ten błąd.
Oto cały kod.

EDIT w momencie jak to pisałem nie działało, jak sprawdzałem jeszcze raz po wysłaniu posta już działa...

C/C++
#include <iostream>
#include <fstream>
#include <conio.h>
#include <cstdlib>
#include <string>
#include <windows.h>


using namespace std;

void console_width()
{
    COORD c;
    c.X = 101;
    c.Y = 101;
    SetConsoleScreenBufferSize( GetStdHandle( STD_OUTPUT_HANDLE ), c );
}

void width_justy( int & width )
{
    bool width_OK = 1;
    do
    {
        if( width_OK == false )
        {
            system( "cls" );
            cout << "Wprowadzona wartosc nie odpowiada dostepnemu zakresowi.\n";
        }
        cout << "\nPodaj szerokosc w liczbie znakow na ile chcesz,\naby tekst byl wyjustowany (30-100): ";
        cin.clear();
        cin.sync();
        cin >> width;
        width_OK = cin.good();
        if( !width_OK || width < 30 || width > 100 )
             width_OK = false;
       
    } while( !width_OK );
   
}

void punctuation_space_adder( string & orginal, int ascii, int i )
{
    switch( ascii )
    {
    case 33: { if( orginal[ i + 1 ] != ' ' ) orginal.insert( i + 1, " " ); break; }
        //case 34:{if(orginal[i-1] != ' ')orginal.insert(i," ");break;} //dokonczyc otwierajacy " i zamykajacy ", sprawdzac ilosc, resetowac w zamykajacym
        //case 40:{if(orginal[i+1] != ' ')orginal.insert(i+1," ");break;} //to samo co wyzej ()
        //case 41:{if(orginal[i+1] != ' ')orginal.insert(i+1," ");break;}
    case 44: { if( orginal[ i + 1 ] != ' ' ) orginal.insert( i + 1, " " ); break; }
        //case 45:{if(orginal[i+1] != ' ')orginal.insert(i+1," ");break;}myslnik dodaj przed i po
    case 46: { if( orginal[ i + 1 ] != ' ' ) orginal.insert( i + 1, " " ); break; } // dodac opcje wielokropka
    case 58: { if( orginal[ i + 1 ] != ' ' ) orginal.insert( i + 1, " " ); break; }
    case 59: { if( orginal[ i + 1 ] != ' ' ) orginal.insert( i + 1, " " ); break; }
    case 63: { if( orginal[ i + 1 ] != ' ' ) orginal.insert( i + 1, " " ); break; }
    }
}

void menu()
{
    cout << "Program majacy za zadanie wyjustowanie tekstu na zadana, przez uzytkownika,\nszerokosc  znakow.  ";
    cout << "Wyjustowany tekst zostanie wyswietlony w programie oraz\nzapisany do pliku w katalogu z programem.\n";
    cout << "[1] - Justowanie tekstu z pliku.\n";
    cout << "[2] - Justowanie tekstu podanego przez uzytkownika bezposrednio w programie.\n";
    cout << "[0] - Wyjscie z programu.\n";
}

void space_punctuation( string & orginal, int i, int spaces_lines )
{ for(; i < orginal.length(); i++ )
    { if( orginal[ i ] == ' ' )
             spaces_lines++;
        else if( spaces_lines > 0 )
        { switch( spaces_lines )
            {
            case 1: { spaces_lines = 0; break; }
                default: { orginal.erase( i - spaces_lines + 1, spaces_lines - 1 ); spaces_lines = 0; }
            }
        }
        punctuation_space_adder( orginal, orginal[ i ], i ); //dodanie spacji po znakach interpunkcyjnych jezeli brakuje
    } }

void justyfication( string & orginal, int check_space, int spaces_lines, int endl_pos, int i, int width )
{
    for(; check_space <( orginal.length() + width ); )
    {
        if( check_space == width )
        for( int x = 0; x < orginal.length(); x++ )
        if( orginal[ x ] == '\n' )
             orginal.replace( x, 1, 1, ' ' );
       
        while( orginal[ check_space ] != ' ' )
        {
            check_space--;
            if( check_space == 0 )
                 break;
           
        }
        if( check_space > 0 )
             orginal.replace( check_space, 1, 1, '\n' );
       
        i = spaces_lines * width + endl_pos - width;
        for(; i <= spaces_lines * width + endl_pos; i++ )
        {
            if( orginal[ i ] == 10 )
            {
                check_space = width - i %( width + 1 ); //check_space = spaces_lines * 80 + endl_pos - i;
                break;
            }
        }
        i = spaces_lines * width + endl_pos - width;
        //line_len = spaces_lines*80+endl_pos - check_space - spaces_lines*80+endl_pos-81;
        int line_len =( width + 1 ) - check_space;
        while( check_space > 0 && line_len > width / 1.5 )
        {
            if( orginal[ i ] == ' ' )
            {
                orginal.insert( i, 1, ' ' );
                check_space--;
                i++;
            }
            i++;
            if( i == spaces_lines * width + endl_pos )
                 i = spaces_lines * width + endl_pos - width;
           
        }
        spaces_lines++; endl_pos++;
        check_space = spaces_lines * width + endl_pos;
    }
}

void what_next( bool wybor_OK, int & wybor )
{
    cout << "Wyjustowany tekst znajdziesz w katalogu z programem.\n";
    do
    {
        if( !wybor_OK )
             cout << "\nWprowadzona wartosc nie odpowiada wartosciom z menu.\n\n";
       
        cout << "[0] - Zakoncz dzialanie programu\n";
        cout << "[1] - Powrot do menu glownego.\n";
        cin.clear();
        cin.sync();
        cin >> wybor;
        wybor_OK = cin.good();
        if( !wybor_OK || wybor < 0 || wybor > 1 )
        {
            wybor_OK = false;
        }
    } while( !wybor_OK );
   
}

void read_from_file( string & orginal, ifstream & file, string & save_to_file )
{
    string txt, file_name;
    do
    {
        cout << "\nWprowadz nazwe pliku tekstowego ktory chcesz wyjustowac.\n";
        cout << "Nazwa pliku bez rozszezenia: ";
        cin.clear();
        cin.sync();
        cin >> file_name;
        save_to_file = file_name;
        file_name += ".txt";
        file.open( file_name.c_str() );
        if( !file.good() )
             cout << "\nBrak pliku w folderze z programem lub zostala wprowadzona bledna nazwa pliku.\n\n";
       
    } while( !file.good() );
   
    while( getline( file, txt ) )
         orginal += txt + ' ';
   
    file.close();
}

void out_to_file( string & orginal, string & save_to_file )
{
    save_to_file += "_wyjustowany.txt";
    ofstream out_file( save_to_file.c_str() );
    out_file << orginal;
    out_file.close();
}

void console_txt( string & orginal )
{
    cout << "\nWpisuj tekst i zatwierdzaj kazde zdanie ENTER-em.\nGdy bedziesz chcial zakonczyc wpisywanie tekstu, wypisz na ekran komende\nSTOP\n";
    string txt;
    do
    {
        cin >> txt;
        if( txt != "STOP" )
             orginal += txt + '\n';
       
    } while( txt != "STOP" );
    //return orginal;
}

void console_name_of_file( string & save_to_file )
{
   
    cout << "Podaj nazwe pliku pod jakim zapisac wprowadzony, wyjustowany tekst: ";
    cin >> save_to_file;
    save_to_file;
}
int main()
{ //01234567890123456789012345678901234567890
    string orginal, save_to_file;
    ifstream file;
    int width, wybor, spaces_lines, i, endl_pos, check_space;
    bool wybor_OK;
    console_width();
   
    do
    {
        system( "cls" );
        wybor = - 1;
        wybor_OK = 1;
        do
        {
            if( wybor_OK == false )
            {
                system( "cls" );
                cout << "Wprowadzona wartosc nie odpowiada dostepnemu zakresowi.\n\n";
            }
            menu();
            cin.clear();
            cin.sync();
            cin >> wybor;
            wybor_OK = cin.good();
            if( !wybor_OK || wybor < 0 || wybor > 2 )
            { cout << "Wprowadzona wartosc nie odpowiada wartosciom z menu.\n\n";
                wybor_OK = false;
            }
        } while( !wybor_OK );
       
        spaces_lines = i = endl_pos = 0; spaces_lines = 1;
        orginal = save_to_file = "";
        switch( wybor )
        {
        case 1:
            {
                width_justy( width );
                check_space = spaces_lines * width + endl_pos;
                read_from_file( orginal, file, save_to_file );
                system( "cls" );
                space_punctuation( orginal, i, spaces_lines );
                justyfication( orginal, check_space, spaces_lines, endl_pos, i, width );
                out_to_file( orginal, save_to_file );
                cout << "Oto wyjustowany tekst:\n" << orginal << endl;
                what_next( wybor_OK, wybor );
                break;
            }
        case 2:
            {
                width_justy( width );
                check_space = spaces_lines * width + endl_pos;
                console_txt( orginal );
                system( "cls" );
                space_punctuation( orginal, i, spaces_lines );
                justyfication( orginal, check_space, spaces_lines, endl_pos, i, width );
                console_name_of_file( save_to_file );
                out_to_file( orginal, save_to_file );
                cout << "Oto wyjustowany tekst:\n" << orginal << endl;
                what_next( wybor_OK, wybor );
                break;
            }
        }
    } while( wybor != 0 );
   
    return 0;
}

EDIT chyba chodziło o to że wprowadzony tekst jest za krótki w stosunku do zadanej szerokości justowania. Zabezpieczenia wprowadzone.
Jeszcze pytanie, skoro operuję referencjami to może każda funkcja być typu void? Czy to błąd operować tylko referencjami?
P-105421
pekfos
» 2014-03-02 11:42:56
Czy to błąd operować tylko referencjami?
Nie.
P-105495
1 « 2 »
Poprzednia strona Strona 2 z 2