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". #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 44: { if( oryginal[ i + 1 ] != ' ' ) oryginal.insert( i + 1, " " ); break; } case 46: { if( oryginal[ i + 1 ] != ' ' ) oryginal.insert( i + 1, " " ); break; } 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() { 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; 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; } } } interpunction_space_adder( oryginal, oryginal[ i ], i ); } int endl_pos = 0; 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 = SZER - i %( SZER + 1 ); break; } i = spaces_lines * SZER + endl_pos - SZER; 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 check_space = spaces_lines * SZER + endl_pos - i; check_space = SZER - i %( SZER + 1 ); |
|
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. 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 ); break; } } i = spaces_lines * SZER + endl_pos - SZER; 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. |
|
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... #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 44: { if( orginal[ i + 1 ] != ' ' ) orginal.insert( i + 1, " " ); break; } case 46: { if( orginal[ i + 1 ] != ' ' ) orginal.insert( i + 1, " " ); break; } 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 ); } }
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 ); break; } } i = spaces_lines * width + endl_pos - width; 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" ); }
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() { 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? |
|
pekfos |
» 2014-03-02 11:42:56 Czy to błąd operować tylko referencjami? |
Nie. |
|
1 « 2 » |