помогите с алгоритмом
От: Аноним  
Дата: 27.10.08 11:08
Оценка: :)
как написать в с++ алгоритм определения палендромной строки?
Re: помогите с алгоритмом
От: ffk  
Дата: 27.10.08 11:14
Оценка:
Здравствуйте, Аноним, Вы писали:

А>как написать в с++ алгоритм определения палендромной строки?


А без С++ можешь? На словах.
Re[2]: помогите с алгоритмом
От: Аноним  
Дата: 27.10.08 11:22
Оценка:
Здравствуйте, ffk, Вы писали:

ffk>Здравствуйте, Аноним, Вы писали:


А>>как написать в с++ алгоритм определения палендромной строки?


ffk>А без С++ можешь? На словах.


Как правильно построить алгоритм?
Re[3]: помогите с алгоритмом
От: Аноним  
Дата: 27.10.08 11:28
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, ffk, Вы писали:


ffk>>Здравствуйте, Аноним, Вы писали:


А>>>как написать в с++ алгоритм определения палендромной строки?


ffk>>А без С++ можешь? На словах.


А>Как правильно построить алгоритм?


Нужно написать программу с использованием строк, которая получает слова и читает их в обратном порядке,при этом не учитывая пробелы.
Re: помогите с алгоритмом
От: Аноним  
Дата: 27.10.08 11:35
Оценка:
Здравствуйте, Аноним, Вы писали:

А>как написать в с++ алгоритм определения палендромной строки?



bool is_palindromic( char const *str ) {
  char const *p = str + strlen(str);
  while( --p > str ) if( *p != *str++ ) return false;
  return true;
}
Re: помогите с алгоритмом
От: codelord  
Дата: 27.10.08 11:38
Оценка:
Здравствуйте, Аноним, Вы писали:

А>как написать в с++ алгоритм определения палендромной строки?

как нить так

#include <string>
#include <iostream>
bool is_paly( const std::string &source )
{
 size_t len = source.length();
 for( size_t i = 0; i < len/2; ++i  )
 {
        if( source[i] != source[ len-i-1 ] ) return false;
 }
 return true;
}

int main() {
 while( true )
 {
        std::string str;
        std::cout << "введите строку : "<< std::endl;
        std::getline( std::cin, str );
        std::cout << ( is_paly( str ) ? "это полиндром " : "это не полиндром " ) << std::endl;
 }
}
Re[2]: помогите с алгоритмом
От: Аноним  
Дата: 27.10.08 11:50
Оценка:
Здравствуйте, codelord, Вы писали:

C>Здравствуйте, Аноним, Вы писали:


А>>как написать в с++ алгоритм определения палендромной строки?

C>как нить так

C>
C>#include <string>
C>#include <iostream>
C>bool is_paly( const std::string &source )
C>{
C> size_t len = source.length();
C> for( size_t i = 0; i < len/2; ++i  )
C> {
C>        if( source[i] != source[ len-i-1 ] ) return false;
C> }
C> return true;
C>}

C>int main() {
C> while( true )
C> {
C>        std::string str;
C>        std::cout << "введите строку : "<< std::endl;
C>        std::getline( std::cin, str );
C>        std::cout << ( is_paly( str ) ? "это полиндром " : "это не полиндром " ) << std::endl;
C> }
C>}
C>


Спасибо, но предложение "а роза упала на лапу азора" читается наоборот ,а при вводе в программу, она говорит , что это не полиндром, тоесть она учитывыет пробелы?
Re[3]: помогите с алгоритмом
От: codelord  
Дата: 27.10.08 12:08
Оценка:
А>Спасибо, но предложение "а роза упала на лапу азора" читается наоборот ,а при вводе в программу, она говорит , что это не полиндром, тоесть она учитывыет пробелы?
да учитывает, напишите функцию которая уберет пробелы и дело в шляпе
Re[4]: помогите с алгоритмом
От: Аноним  
Дата: 27.10.08 12:14
Оценка:
Здравствуйте, codelord, Вы писали:

А>>Спасибо, но предложение "а роза упала на лапу азора" читается наоборот ,а при вводе в программу, она говорит , что это не полиндром, тоесть она учитывыет пробелы?

C>да учитывает, напишите функцию которая уберет пробелы и дело в шляпе

bool is_palindromic( char const *str ) {
char const *p = str + strlen(str);
while( --p > str ) if( *p != *str++ ) if( str[-1] == ' ' ) ++p; else if( *p == ' ' ) --str; else return false;
return true;
}
Re[3]: помогите с алгоритмом
От: codelord  
Дата: 27.10.08 12:18
Оценка:
Здравствуйте, Аноним, Вы писали:
А>Спасибо, но предложение "а роза упала на лапу азора" читается наоборот ,а при вводе в программу, она говорит , что это не полиндром, тоесть она учитывыет пробелы?

Да и можете воспользоваться кодом который вам любезно предлагают рядом,

ну или не так красиво например так:

#include <string>
#include <iostream>
std::string trim_space( const std::string &source )
{
        std::string result;
        for( std::string::const_iterator it = source.begin(); it != source.end(); ++it )
        {
                if( isspace( *it ) ) continue;
                result += *it;
        }
        return result;
}
bool is_paly( const std::string &source )
{
 size_t len = source.length();
 for( size_t i = 0; i < len/2; ++i  )
 {
        if( source[i] != source[ len-i-1 ] ) return false;
 }
 return true;
}

int main() {
 while( true )
 {
        std::string str;
        std::cout << "введите строку : "<< std::endl;
        std::getline( std::cin, str );
        std::cout << ( is_paly( trim_space( str ) ) ? "это полиндром " : "это не полиндром " ) << std::endl;
 }
}
Re: помогите с алгоритмом
От: Кодт Россия  
Дата: 27.10.08 13:16
Оценка: 6 (1) +1 :)))
Здравствуйте, <Аноним>, Вы писали:

А>как написать в с++ алгоритм определения палендромной строки?


#include <algorithm>

bool is_palindromic_word(const std::string& str)
{
    return std::equal(str.begin(), str.end(), str.rbegin());
}

Вдвое дольше, чем оптимальный, зато в одну строку. Ибо!

Чтобы игнорировать пробелы, нужно воспользоваться бустом
#include <algorithm>
#include <boost/iterator/filter_iterator.hpp>
#include <boost/algorithm/string/compare.hpp>

bool is_palindromic_phrase(const std::string& str)
{
    return std::equal(
        boost::make_filter_iterator(isalpha, str.begin(), str.end()),
        boost::make_filter_iterator(isalpha, str.end(), str.end()),
        boost::make_filter_iterator(isalpha, str.rbegin(), str.rend()),
        boost::algorithm::is_iequal()
    );
}

Внимание! Этот алгоритм некорректно работает в немецкой локали, поскольку эсцет в нижнем регистре представлен одной буквой, а в верхнем — двумя.
Также могут быть хитрые трактовки умляутов (которые записаны то лигатурами, то парами букв).
В русском языке тоже возможны варианты — скажем, покровительственное отношение к мягкому и твёрдому знаку. И в английском и украинском, где есть апострофы.


А вообще, нечестно с твоей стороны.
Вот у тебя есть учебная задача. И ты, вместо того, чтобы с нашей помощью произвести обсуждение твоего решения — просишь подсказки. А смысл?
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Перекуём баги на фичи!
Re[2]: помогите с алгоритмом
От: Аноним  
Дата: 27.10.08 13:30
Оценка:
Здравствуйте, Кодт, Вы писали:

К>А вообще, нечестно с твоей стороны.

К>Вот у тебя есть учебная задача. И ты, вместо того, чтобы с нашей помощью произвести обсуждение твоего решения — просишь подсказки. А смысл?

А, всё бессмысленно. Зачем вот заставляют офисный планктон торчать в офисе? Зачем гонят детишек во всякие учебные заведения? Дали бы им игрушек лучше хороших.

PS А что касается вопроса — для зубров хоть развлечение какое-то
Re[3]: помогите с алгоритмом
От: Кодт Россия  
Дата: 27.10.08 13:59
Оценка: +1 :)
Здравствуйте, <Аноним>, Вы писали:

А>PS А что касается вопроса — для зубров хоть развлечение какое-то


Это да!

Тогда развлечение для зубров: проверка палиндрома, настраиваемая под разные правила игры.
Вплоть до того, чтобы "аргентина манит негра, а негр манит аргентину" считалось палиндромом
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Перекуём баги на фичи!
Re: помогите с алгоритмом
От: Yuriy83 Украина  
Дата: 28.10.08 18:57
Оценка: 35 (2) :))) :)
Здравствуйте, Аноним, Вы писали:

А>как написать в с++ алгоритм определения палендромной строки?


Можно еще написать что-нибудь типа такого (используя библиотечку FC++):

#define FCPP_ENABLE_LAMBDA
#include "prelude.h"

using namespace fcpp;

LambdaVar<1> X;
LambdaVar<2> Y;

template <typename T> bool is_palindrom(List<T> l)
{
    return foldl(lambda(X,Y)[X %multiplies% if0[ fst[Y] %equal% snd[Y], 1, 0]], 1)(zip(l,foldl(lambda(X,Y)[cons[Y,X]], List<int>(), l)));
}
Re[2]: помогите с алгоритмом
От: Аноним  
Дата: 28.10.08 23:04
Оценка: :))) :)
Здравствуйте, Yuriy83, Вы писали:
Y>
Y>{
Y>    return foldl(lambda(X,Y)[X %multiplies% if0[ fst[Y] %equal% snd[Y], 1, 0]], 1)(zip(l,foldl(lambda(X,Y)[cons[Y,X]], List<int>(), l)));
Y>}
Y>


Это С++?
Re[3]: помогите с алгоритмом
От: FR  
Дата: 29.10.08 10:27
Оценка: :)
Здравствуйте, Аноним, Вы писали:

А>Это С++?


Это у него бабушка с водолазом, то есть с хаскелем согрешила
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.