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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Анаграммы или сравнение 2-х С-строк. 
:(
    Опции темы
Gtar
Дата 23.1.2008, 20:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Добрый день!
Нашел интересную задачку,

Нужно написать интерактивную программу, которая спрашивает у пользователя 2 слова или фразы ( размер которых не должен превышать одну строку ввода на экране). Программа затем должна ответить пользователю анаграммы ли введенные фразы или нет.
И тут самое интересное: Пробелы, пунктуацию и заглавные буквы нужно игнорировать. Для решения использовать С или С++ строки.

Пример:
строка1: Eleven plus two!
строка2: Twelve, plus one
вывод: введенные фразы -  анаграммы!

Сразу в голову пришел следующий алгоритм:
1. Считать строки
2. Отсортировать по символам.
3. Удалить пунктуацию, пробелы и избавиться от заглавных букв.
4. Сравнить строки используя стандартную функцию strcmp(str1, str2).

Алгоритм вроде как работает, только вот с третьим пунктом я застрял...
Точнее есть идея, к примеру, используя ASCII коды удалить ненужные символы, но я думаю что должны быть решения проще !?
Буду благодарен за участие в дискуссии smile

Код


#include<iostream>
#include<cstring>
using namespace std;

void BubbleSort(char str[], int size);

int main()
{
 const int SZ=100;
 char str1[SZ], str2[SZ]; //фразы для сравнения 
 int len1,len2;

 cout<<"Enter first phrase: ";
 cin.getline(str1, SZ, '\n');
 cout<<"Enter second phrase: ";
 cin.getline(str2, SZ, '\n');
 
 len1=strlen(str1);
 len2=strlen(str2);

 BubbleSort(str1,len1); //сортировка строк
 BubbleSort(str2,len2);

 // Удалить пунктуацию, пробелы и избавиться от заглавных букв........

  // стравнение строк
if (strcmp(str1, str2)==0 )
   cout<<" They are anagrams";
else
   cout<<" They are not anagrams";
 
system("pause");
    return 0;
}

void BubbleSort(char str[], int size) {
    bool exchanges;
    do {
       exchanges = false;  // assume no exchanges
       for (int i=0; i<size-1; i++) {
          if (str[i] > str[i+1]) {
             char temp = str[i]; str[i] = str[i+1]; str[i+1] = temp;
             exchanges = true;  // after exchange, must look again
          }
       }
    } while (exchanges);
 }



Это сообщение отредактировал(а) Gtar - 25.1.2008, 09:04
PM MAIL   Вверх
JackYF
Дата 23.1.2008, 20:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



Цитата(Gtar @  23.1.2008,  19:11 Найти цитируемый пост)
Удалить пунктуацию, пробелы и избавиться от заглавных букв.

есть стандартные функции isalpha и isupper. Первая определит, что это символ, вторая - что это [НЕ] заглавная буква.
Соответственно проходишься по строкам и формируешь две новые строки из символов, которые подходят под заданный критерий.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
warmonger_
Дата 23.1.2008, 20:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



насчет заглавных букв, можно написать класс нечувствительный к регистру подобный string. У Sutter'a было...
--------------------
Make everything as simple as possible, but not simpler.Albert Einstein
PM MAIL   Вверх
JackYF
Дата 23.1.2008, 21:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



Цитата(warmonger_ @  23.1.2008,  19:49 Найти цитируемый пост)
можно написать класс нечувствительный к регистру подобный string. У Sutter'a было...

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


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Gtar
Дата 24.1.2008, 07:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(JackYF @ 23.1.2008,  20:21)
есть стандартные функции isalpha и isupper. Первая определит, что это символ, вторая - что это [НЕ] заглавная буква.
Соответственно проходишься по строкам и формируешь две новые строки из символов, которые подходят под заданный критерий.

Вот именно такую замечательную функцию как isalpha я и искал!
Сначала хотел сказать, что она естесвенно цифры выбрасывать будет, но потом нашел еще и функцию isdigit, которая тож будет очень кстати. Завтра проверим в деле =)

PS: А алгоритм описанный выше вцелом нормальный для такой задачи ?

Это сообщение отредактировал(а) Gtar - 24.1.2008, 07:31
PM MAIL   Вверх
JackYF
Дата 24.1.2008, 10:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



Цитата(Gtar @  24.1.2008,  06:29 Найти цитируемый пост)
А алгоритм описанный выше вцелом нормальный для такой задачи ?

почему бы и нет )


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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