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: 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? |
|
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. int ktoryKlawisz( char znak ) { if( std::string( "abc" ).find_first_not_of( znak ) != std::string::npos ) return 2; } 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 char znak; int liczbaKlikniec[ 10 ];
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-funkcji-przez-referencje/356 |
|
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? |
|
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 |
|
SocrateZ |
» 2014-10-11 16:38:54 Zamiast if else if... użyj switch - case |
|
Dizip Temat założony przez niniejszego użytkownika |
» 2014-10-11 16:56:55 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. |
|
Dizip Temat założony przez niniejszego użytkownika |
» 2014-10-11 18:00:54 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; ) |
|
stryku |
» 2014-10-11 18:12:04 Tak, złą funkcję dałem tam. Dobrze poprawiłeś :) |
|
« 1 » |