Модераторы: Poseidon

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C++] Функции и Строки, сравнение без учета пробелов 
:(
    Опции темы
Hqw33
Дата 25.3.2012, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 25.3.2012

Репутация: нет
Всего: нет



Пишу в Microsoft Visual Studio ->Win32 Console application ->C++.
Помогите пожалуйста Разработать функцию, которая сравнивает две строки, игнорируя количество пробелов между словами.
PM MAIL   Вверх
ColdSpirit
Дата 25.3.2012, 19:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 95
Регистрация: 10.12.2010

Репутация: 1
Всего: 2



Hqw33, всмысле? Сравнивает, игнорируя пробелы или сравнивает количество букв, игнорируя кол-во пробелов? Напиши поточнее, что требуется от программы, желательно с примерами  smile  - тогда написать ее не то, что другим, даже тебе будет легче =)

PM MAIL   Вверх
alexvs11
Дата 25.3.2012, 20:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


hell is here
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 21.8.2010

Репутация: нет
Всего: 10



Код

#include <iostream>

template <typename InputIterator1, typename InputIterator2>
bool f (InputIterator1 i, InputIterator1 i_end, InputIterator2 j, InputIterator2 j_end)
{
   for ( ; i != i_end && j != j_end ; ++i, ++j )
   {
       while (*i == ' ' && i != i_end) ++i; 
       while (*j == ' ' && j != j_end) ++j;
       if (*i != *j) return false; 
   }

   return i == i_end && j == j_end;
}

int main()
{
  std::string s1 = "hellow orld", s2 = "he  lloworld";
  std::cout << f (s1.begin(), s1.end(), s2.begin(), s2.end());
}

PM MAIL   Вверх
Riviero
Дата 28.3.2012, 17:26 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 136
Регистрация: 25.3.2010

Репутация: 1
Всего: 3



Если использовать AnisString, то просто Trim (). Или в консольном этого нет...
PM MAIL   Вверх
baldina
Дата 28.3.2012, 17:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 1
Всего: 101



Trim() убирает пробелы слева и справа, но не в середине.
CString можно использовать в консольном (atlstr.h)

а кому не понравился пример alexvs11? можно короче через stringstream, но врядли быстрее
PM MAIL   Вверх
mes
Дата 28.3.2012, 19:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: нет
Всего: 250



Цитата(baldina @  28.3.2012,  16:51 Найти цитируемый пост)
 кому не понравился пример alexvs11

только тут надо уточнить у тс.. без учета всех пробелов,  или только без белых ?
хотя это выразится всего лишь в поправке внуренних пока-циклов..

Добавлено через 3 минуты и 20 секунд
но.. если развивать мысль alexvs11, то следующим шагом желательно вынести циклы пропускания пробелов в сам итератор.. тогда можно будет применять стандартные алгоритмы.. 
smile



--------------------
PM MAIL WWW   Вверх
volatile
Дата 29.3.2012, 00:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 8
Всего: 85



Цитата(baldina @  28.3.2012,  17:51 Найти цитируемый пост)
а кому не понравился пример alexvs11? 

Мне не понравился!

По 2-ум причинам (хотя и одной было бы достаточно smile ).
1. Обращается за пределы контейнера.  (обращение к  *end () недопустимо!)
2. Не делает то что надо. простой пример

PM MAIL   Вверх
baldina
Дата 29.3.2012, 10:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 1
Всего: 101



Цитата(mes @  28.3.2012,  19:27 Найти цитируемый пост)
вынести циклы пропускания пробелов в сам итератор

это и будет что-то типа чтения из stringstream smile

Добавлено через 5 минут и 28 секунд
Цитата(volatile @  29.3.2012,  00:28 Найти цитируемый пост)
обращение к  *end () недопустимо

да, я не обратил внимание...

Цитата(volatile @  29.3.2012,  00:28 Найти цитируемый пост)
Не делает то что надо

странно
PM MAIL   Вверх
alexvs11
Дата 29.3.2012, 15:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


hell is here
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 21.8.2010

Репутация: нет
Всего: 10



volatile, так исправил бы smile 
вроде так правильно
Код

#include <iostream>
#include <functional>
#include <cstdio>
#include <cctype>

template <typename InputIterator1, typename InputIterator2, typename equal, typename skip>
bool f (InputIterator1 i, InputIterator1 i_end, InputIterator2 j, InputIterator2 j_end, equal f_e, skip f_s) 
{
   for ( ; i != i_end || j != j_end; ) 
   {
      while (i != i_end && f_s(*i)) ++i;
      while (j != j_end && f_s(*j)) ++j;
 
      if (i == i_end ^ j == j_end) return false;
      if (i != i_end && j != j_end && !f_e(*i, *j)) return false;
      if (i != i_end) ++i;
      if (j != j_end) ++j;
   }   

   return true; 
}

int main()
{
  std::string s1 = "h ellow    ", s2 = "hellow";
  std::cout << f (s1.begin(), s1.end(), s2.begin(), s2.end(), std::equal_to<char>(), isspace) <<std::endl;
}




Это сообщение отредактировал(а) alexvs11 - 29.3.2012, 15:49
PM MAIL   Вверх
mes
Дата 29.3.2012, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: нет
Всего: 250



Цитата(alexvs11 @  29.3.2012,  14:47 Найти цитируемый пост)
 ^

тут не || хотелось ?

Добавлено через 47 секунд
Цитата(alexvs11 @  29.3.2012,  14:47 Найти цитируемый пост)
equal f_e, skip f_s

не очень красиво.. 



--------------------
PM MAIL WWW   Вверх
alexvs11
Дата 29.3.2012, 16:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


hell is here
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 21.8.2010

Репутация: нет
Всего: 10



Цитата(mes @  29.3.2012,  15:55 Найти цитируемый пост)
тут не || хотелось ?

не, именно xor подразумевался

Цитата(mes @  29.3.2012,  15:55 Найти цитируемый пост)
не очень красиво.. 

как-то не пришло в голову как красивей сделать
PM MAIL   Вверх
mes
Дата 29.3.2012, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: нет
Всего: 250



alexvs11, отделить логику итерации от логики сравнения..


Цитата(alexvs11 @  29.3.2012,  15:14 Найти цитируемый пост)
не, именно xor подразумевался

получается, что нужно вернуть ложь и в случае если оба не достигли конца..   smile 

Это сообщение отредактировал(а) mes - 29.3.2012, 16:22


--------------------
PM MAIL WWW   Вверх
mes
Дата 29.3.2012, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: нет
Всего: 250



Цитата(baldina @  29.3.2012,  09:21 Найти цитируемый пост)
это и будет что-то типа чтения из stringstream 

угу.. 

вот на скорую руку в первом приближении :
Код

struct view_stream 
{
    view_stream (const char * begin, const char * end, bool(*skip)(char) )
        : _begin (begin) , _end(end), _skip (skip)
    {
    }
 
    char get () { char c = *_begin; next(); return c; }

    void next () { do { ++_begin; } while (!eof() && _skip(*_begin)); }


    bool eof () { return !( _begin<_end); }

  private:
    const char *   _begin,  * _end;
    bool (*_skip)(char);
};

bool compare (view_stream s1, view_stream s2)
{
   for (;! (s1.eof() && s2.eof()); )
   {
       if (s1.get() != s2.get()) return false;
   }
 
    return s1.eof() && s2.eof();
}
bool isspace (char c)
{
    return std::isspace (c);
}

int main ()
{
  const char s1[] = "hello   world !";
  const char s2[] = "hello world   !  ";

  std::cout << compare(view_stream(s1, s1+sizeof(s1), isspace) , 
                       view_stream(s2, s2+sizeof(s2), isspace));


}



--------------------
PM MAIL WWW   Вверх
bsa
Дата 29.3.2012, 23:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 1
Всего: 196



Для домашних заданий, курсовых, существует "Центр Помощи".

Тема перенесена! 
PM   Вверх
alexvs11
Дата 29.3.2012, 23:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


hell is here
**


Профиль
Группа: Участник
Сообщений: 518
Регистрация: 21.8.2010

Репутация: нет
Всего: 10



Цитата(mes @  29.3.2012,  16:18 Найти цитируемый пост)
получается, что нужно вернуть ложь и в случае если оба не достигли конца..

нет, вернуть ложь только если один достиг конца, а другой нет
если оба достигли или не достигли продолжаем
Цитата(mes @  29.3.2012,  16:18 Найти цитируемый пост)
alexvs11, отделить логику итерации от логики сравнения..

мне видится, что разделять есть смысл только если мы предоставляем клиентам интерфейс интерации или интерфейс сравнения
в вашем примере все равно  view_stream  не совместим с алгоритмами stl
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0600 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.