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

Szukanie wydajniejszego rozwiązania - rozdział 3, temat "Modyfikowanie tekstu i sprawdzanie jego długości"

Ostatnio zmodyfikowano 2016-07-04 09:06
Autor Wiadomość
Szkaplerny
Temat założony przez niniejszego użytkownika
Szukanie wydajniejszego rozwiązania - rozdział 3, temat "Modyfikowanie tekstu i sprawdzanie jego długości"
» 2016-06-29 19:25:59
Hej,

popełniłem takie oto rozwiązanie zadania domowego, by było wpasowane w 'klucz'. Choć cały kod działa poprawnie to szukam czegoś lepiej napisanego, lub po prostu w inny sposób złożonego.
Głównie chodzi mi o podmianę znaków '<' i '>' na '[', ']' - jakieś lepsze rozwiązanie, czy to jest wystarczające?
Szukanie podwójnej spacji - strasznie mnie to rozwiązanie gryzie (lecę po wszystkich znakach...).
Nie oczekuję gotowego kodu, sam pomysł wystarczy ;)
I gdyby ktoś mógł się wypowiedzieć co do czytelności kodu - czy brakuje gdzieś wolnych linii, etc.

C/C++
#include <iostream>
#include <string>
using namespace std;

string konwertuj( string napis ) {
    string finalny; //string koncowy
    finalny.insert( 0, napis ); //przepisuje zawartosc napisu wejsciowego, by nadac stringowi finalny wlasciwa dlugosc
    for( size_t i = 0; i < finalny.length(); i++ ) {
        if( finalny[ i ] == '<' ) { //zamiana znakow '<' na znaki '['
            finalny[ i ] = '[';
        }
        else if( finalny[ i ] == '>' ) { // jak wyzej
            finalny[ i ] = ']';
        }
    }
    for( size_t i = 0; i < finalny.length(); i++ ) { // !!!
        size_t miejsce = finalny.find( "  " ); //szukanie pierwszej podwojnej spacji
        if( miejsce != string::npos ) { //jesli jakiekolwiek podwojne spacje zostana znalezione
            finalny.erase( miejsce, 1 ); //usuwa pierwsza z podwojnej spacji
        }
    }
   
    return finalny;
}

int main()
{
    string wejsciowy = "<b>to jest </b> testowy       napis     <b>:)";
    cout << konwertuj( wejsciowy ) << endl;
   
    getchar();
    return 0;
}
P-149514
karambaHZP
» 2016-06-29 19:47:31
C/C++
string finalny; //string koncowy
finalny.insert( 0, napis ); //przepisuje zawartosc napisu wejsciowego, by nadac stringowi finalny wlasciwa dlugosc.

można prościej zainicjalizować łańcuch konstruktorem:

string finalny( napis );

Szukanie podwójnej spacji jest OK.
Można dodać sprawdzenie czy przed pierwszą literą są jakieś spacje.
Podmiana znalezionego znaku na inny OK
P-149515
Szkaplerny
Temat założony przez niniejszego użytkownika
» 2016-06-29 21:53:38
Dzięki za ocenę, nie sądziłem że kod jest na tyle dobrze napisany. Co z czytelnością? Domyślam się, że mógłbym nazwy zmiennych ustawić na jakieś bardziej odnoszące się do tematu.
P-149516
mateczek
» 2016-06-29 22:35:13
wydajniej zawsze można :) tylko pytanie czy jest sens. Jak chcesz poćwiczyć wydajność to polecam
http://pl.spoj.com/problems/AL_01_02/
bez optymalizacji nie przejdzie
P-149517
carlosmay
» 2016-06-29 22:49:33
getchar();
Jakiego środowiska używasz?
P-149518
michal11
» 2016-06-29 23:17:34
Nie jest dobrze napisany.
Przede wszystkim argument przesyłaj przez const referencję, nie potrzebujesz kopiowania.
Zamiana znaków < i > na [ i ] można zrobić czytelniej ale mniej wydajnie:
C/C++
std::replace( finalny.begin(), finalny.end(), '<', '[' );
std::replace( finalny.begin(), finalny.end(), '>', ']' );

ew. jedną funkcją i lambdą:
C/C++
std::transform( finalny.begin(), finalny.end(), finalny.begin(),[]( char arg ) { return arg == '<' ? '[':( arg == '>' ? ']': arg ); } );
ale to już chyba lepszy jest twój for (tylko to formatowanie).

Usuwanie spacji moim zdaniem jest bardzo nieczytelne, ja bym to zrobił tak:
C/C++
finalny.erase( std::unique( finalny.begin(), finalny.end(),[]( char lhs, char rhs ) { return lhs == ' ' && rhs == ' '; } ), finalny.end() );

jeżeli nie znasz lambd to wystarczy na początku zadeklarować funkcje
C/C++
char replaceParentheses( char arg );
bool isDoubleSpace( char lhs, char rhs );

i użyć nazwy funkcji zamiast lambdy.
P-149519
Szkaplerny
Temat założony przez niniejszego użytkownika
» 2016-06-30 01:00:50
@carlosmay - najnowszego VS. Wcześniej używałem system("pause"), jednak po przeczytaniu kilku postów/'rozpraw' przerzuciłem się na getchar(). Coś jest z tym nie tak?
@mateczek - dzięki za link, strona wygląda na niezłe wsparcie pod przyszłe rozwijanie umiejętności.
@michal11 - dzięki za krytyczne uwagi. Co do przesyłania argumentów - nie chciałem naruszać szkieletu podanego przez autora na zasadzie uczenia się pisania kodu pod czyjś sposób, ale rzeczywiście po moich wcześniejszych doświadczeniach z programowaniem wciąż zdarza mi się nie skorzystać z referencji.
Co masz na myśli "tylko to formatowanie"?
Dzięki za podrzucenie innych sposobów, mimo, że lambd jeszcze nie przerabiałem to przykłady przydadzą się kiedy coś z tego C++ liznę.
P-149521
carlosmay
» 2016-06-30 09:11:44
Visual nie potrzebuje wymuszać zatrzymania przed zakończeniem działania programu.
Klawisz F5 uruchamia program w trybie debug,
natomiast Ctrl + F5 bez debug i automatycznie zatrzymuje się na koniec.

Nie trzeba nic dopisywać.
P-149522
« 1 » 2
  Strona 1 z 2 Następna strona