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 |