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

Skrócenie/zoptymalizowanie kodu.

Ostatnio zmodyfikowano 2014-10-11 18:12
Autor Wiadomość
Dizip
Temat założony przez niniejszego użytkownika
Skrócenie/zoptymalizowanie kodu.
» 2014-10-11 14:43:43
Witajcie, jestem świeżakiem w jezyku C/C++ i uczę się tego od niecałego tygodnia.

Programik, który pisze to licznik wciśnięć klawisza komórki.
Tzn po wprowadzeniu tekstu "abccab"
Program ma wyświetlić: [ 2 ] -- 12
bo tyle potrzeba wciśnięć dwójki do uzyskania tego tekstu.

Zrobiłem to, ale wg mnie wygląda to słabo. Do wyłapywania liter użyłem kopiowania i 'sprawdzam' je przez funkcje:
C/C++
void sprawdz( string znak )
{
    if( znak == "a" ) {
        licznik_2 += 1;
    }
    else if( znak == "b" ) {
        licznik_2 += 2;
    }
    else if( znak == "c" ) {
        licznik_2 += 3;
    }
    else if( znak == "d" ) {
        licznik_3 += 1;
    }
}
Kod jest oczywiście znacznie dłuższy bo musze na if,else dac kazda literke i znak.
Istnieje jakiś szybszy, lepszy lub bardziej optymalny sposób czy wypisanie calego alfabetu to jedyna opcja?
P-118251
stryku
» 2014-10-11 14:54:29
do przechowywania liczby kliknięć zrób sobie tablicę np.
int liczbaKlikniec[ 10 ]

do weryfikowania na podstawie znaku, który klawisz został wciśięty możesz zrobić funkcję np.
C/C++
int ktoryKlawisz( char znak )
{
    if( std::string( "abc" ).find_first_not_of( znak ) != std::string::npos ) return 2;
    /*...*/
}

C/C++
int potrzebnaLiczbaKlikniec( char znak, int klawisz )
{
    std::string tab[ 10 ] = { "", "abc", "def"...};
    return tab[ klawisz - 1 ].find_first_not_of( znak ) + 1;
}

i potem dajesz tylko

C/C++
char znak;
int liczbaKlikniec[ 10 ];
/*... wczytujesz znak ..*/
int klawisz = ktoryKlawisz( znak );
liczbaKliniec[ klawisz ] += potrzebnaLiczbaKlikniec( znak, klawisz );

mniej więcej coś takigo.

Co do samego kodu. Jak przekazujesz string(nie tylko string, ale też strukturę, klasę itp) do funkcji jako parametr to przekazuj jako referencję.
void sprawdz( string & znak )
 jest to szybsze niż przekazanie całego stringa. Kompilator i tak by pewnie to zoptymalizował, ale lepiej się uczyć od początku dobrych nawyków. Jeżeli będziesz używał referencji to poczytaj o niej trochę, żeby wiedzieć co się dzieje z tak przekazanym parametrem. http://cpp0x.pl/kursy/Kurs-C++​/Poziom-3​/Przekazywanie-argumentow-funk​cji-przez-referencje​/356
P-118253
Dizip
Temat założony przez niniejszego użytkownika
» 2014-10-11 16:26:25
Hmm, a czy przez char nie łapiemy tylko pierwszej litery?
tzn czy wczyta ciag znakow?
P-118261
stryku
» 2014-10-11 16:31:00
Podałem tylko przykład funkcji. Możesz wczytać stringa i poiterować po znakach i wywołać te funkcje dla każdego znaku. Z tym sobie poradzisz
P-118262
SocrateZ
» 2014-10-11 16:38:54
Zamiast if else if... użyj switch - case
P-118263
Dizip
Temat założony przez niniejszego użytkownika
» 2014-10-11 16:56:55
C/C++
int ktoryKlawisz( string znak )
{
    int klawisz;
    if( string( "abc" ).find_first_not_of( znak ) != string::npos ) klawisz = 2;
    else klawisz = 3;
   
    return klawisz;
}

czy ta funkcja na pewno jest poprawna. tzn caly czas zwraca mi 2.
P-118265
Dizip
Temat założony przez niniejszego użytkownika
» 2014-10-11 18:00:54
C/C++
int ktoryKlawisz( string szukanyZnak )
{
    int klawisz;
    if( string( "abc" ).find( szukanyZnak ) != string::npos ) klawisz = 2;
    else if( string( "def" ).find( szukanyZnak ) != string::npos ) klawisz = 3;
    else if( string( "ghi" ).find( szukanyZnak ) != string::npos ) klawisz = 4;
    else if( string( "jkl" ).find( szukanyZnak ) != string::npos ) klawisz = 5;
    else if( string( "mno" ).find( szukanyZnak ) != string::npos ) klawisz = 6;
    else if( string( "pqst" ).find( szukanyZnak ) != string::npos ) klawisz = 7;
    else if( string( "tuv" ).find( szukanyZnak ) != string::npos ) klawisz = 8;
    else if( string( "wxyz" ).find( szukanyZnak ) != string::npos ) klawisz = 9;
   
    return klawisz;
}

int potrzebnaLiczbaKlikniec( string znak, int klawisz )
{
    string tab[ 10 ] = { "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz", " " };
    return tab[ klawisz - 1 ].find( znak ) + 1;
}

teraz działa poprawnie. Dzięki za pomoc i wskazówki; )
P-118273
stryku
» 2014-10-11 18:12:04
Tak, złą funkcję dałem tam. Dobrze poprawiłeś :)
P-118275
« 1 »
  Strona 1 z 1