Palindrom czy dobry pomysł?
Ostatnio zmodyfikowano 2017-04-16 00:53
Beginner777 Temat założony przez niniejszego użytkownika |
Palindrom czy dobry pomysł? » 2017-04-14 19:04:31 Zapisałem to w taki sposób ale ciągle mam wątpliwości odnośnie if. Czy to jest poprawne rozwiązanie? #include<iostream> #include<string> using namespace std; int main() { int a; int b; string wyraz; cout << "Podaj wyraz:" << endl; cin >> wyraz; for( a = 0, b = wyraz.length() - 1; a++; b-- ) { if( wyraz[ a ] != wyraz[ b ] ) cout << "To nie jest palindrom" << endl; else cout << "To jest palindrom" << endl; } return 0; } [ / b ]
|
|
Gibas11 |
» 2017-04-14 19:23:55 Wystarczyłoby to skompilować i uruchomić, już nie byłoby wątpliwości, że if jest źle napisany. ;) Poza tym wystarczy ci jeden int do skakania po pozycjach. A, no i standardowo – using namespace std; to zuo. #include <iostream> #include <string>
int main() { std::string wyraz; std::cout << "Podaj wyraz:" << std::endl; std::cin >> wyraz; bool palindrom = true; for( int i = 0; i <= wyraz.size() / 2; ++i ) { if( wyraz[ i ] != wyraz[ wyraz.size() - 1 - i ] ) { palindrom = false; } } std::cout << std::boolalpha << palindrom << std::endl; return 0; } Kodu wydaje mi się nie trzeba tłumaczyć, ale jak coś to odpowiem na jakieś pytania. |
|
Beginner777 Temat założony przez niniejszego użytkownika |
Dlaczego nie używamy using » 2017-04-14 19:37:14 Dlaczego nie używamy using namespace std? #include <iostream> #include <string>
int main() { std::string wyraz; std::cout << "Podaj wyraz:" << std::endl; std::cin >> wyraz; bool palindrom = true; for( int i = 0; i <= wyraz.size() / 2; ++i ) { if( wyraz[ i ] != wyraz[ wyraz.size() - 1 - i ] ) { palindrom = false; } } std::cout << std::boolalpha << palindrom << std::endl; return 0; }
|
|
Gibas11 |
» 2017-04-14 21:34:34 Dlaczego nie używamy using namespace std? | Dlatego.Bo iterując po parach przód–koniec wystarczy dojść do połowy żeby sprawdzić wszystkie. Przy okazji środkowy znak (przy nieparzystej długości) można pominąć, on nie wpływa na to czy wyraz jest palindromem. czemu odejmujemy jeszcze i oprócz 1? |
Dlatego, że indeks ostatniego znaku to nie word.size() , tylko word.size() - 1 . |
|
mokrowski |
» 2017-04-15 10:59:26 Nieco inaczej i trochę wydajniej. #include <iostream> #include <string>
int main() { using namespace std; string wyraz; cout << "Podaj wyraz:" << endl; cin >> wyraz; bool palindrom = true; size_t pierwszy = 0; size_t ostatni = wyraz.size() - 1; while( pierwszy < ostatni ) { if( wyraz[ pierwszy++ ] != wyraz[ ostatni-- ] ) { palindrom = false; break; } } std::cout << std::boolalpha << palindrom << std::endl; }
Lub wręcz bazując na działaniu operatorów logicznych: #include <iostream> #include <string>
int main() { using namespace std; string wyraz; cout << "Podaj wyraz:" << endl; cin >> wyraz; bool palindrom = true; size_t pierwszy = 0; size_t ostatni = wyraz.size() - 1; while( pierwszy < ostatni &&( wyraz[ pierwszy++ ] == wyraz[ ostatni-- ] ||( palindrom = false ) ) ); std::cout << std::boolalpha << palindrom << std::endl; }
Ale nie powiem żeby to ostatnie broniło się czytelnością... :-/ |
|
Gibas11 |
» 2017-04-15 12:51:06 Bo po co dzielić i stosować arytmetykę indeksów? |
Bo odruch. :P Bo po co sprawdzać dalej? |
Bo pomyślałem, że już wstawiłem break i więcej tam nie spojrzałem. ;-; |
|
Beginner777 Temat założony przez niniejszego użytkownika |
Jednego nie rozumiem » 2017-04-15 22:31:46 Dlaczego od dlugości odjemujemy 1 ? jesli isdziemy dekrementacja od końca? |
|
karambaHZP |
» 2017-04-16 00:49:29 |
|
« 1 » 2 |