Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.09.2010, 20:32   #1
0479
Форумчанин
 
Аватар для 0479
 
Регистрация: 27.09.2009
Сообщений: 153
По умолчанию c++ Сравнение строк по составу символов.

Доброго времени суток.Помогите оптимизировать код.Задача:нужно сравнить две строки по набору составляющих их символов.
например, строки «abcd» и «bcad» считать равными, а «abcd» и «abce» - нет.Есть проблема что вот abcd и bcad программа считает равными а скажем abcd и cdba нет.Подскажите где может быть ошибка в коде.

#include <iostream>
using namespace std;
void main()
{char exit;
char stroka1[20],stroka2[20];
int faq=0;
cout<<"Vvedite stroku nomer 1"<<endl;
cin.getline(stroka1,15);
cout<<"\n Vvedite vtoruy stroku"<<endl;
cin.getline(stroka2,15);
if(strlen(stroka1)==strlen(stroka2) )
{for(int i=0;i<strlen(stroka1)-1;i++)
{faq=0;
for(int j=0; j<strlen(stroka2)-1;j++)
{if(stroka1[i]==stroka2[j])
{faq=1;
break;
}}if(faq==0)
{faq=-1;
cout<<"Stroki neravni"<<endl;
break;}}
if(faq==1)
cout<<"Stroki ravni";}
if (faq==0)
cout<<"Stroki neravni"<<endl;
cin>>exit;
}
0479 вне форума Ответить с цитированием
Старый 11.09.2010, 21:49   #2
VadEr
Форумчанин
 
Аватар для VadEr
 
Регистрация: 24.03.2009
Сообщений: 375
По умолчанию

В данном случае имеет смысл провести сортировку строк по символам, а затем, просто, сравнить, либо перебором всех символов, либо спецфункцией.
VadEr вне форума Ответить с цитированием
Старый 11.09.2010, 22:54   #3
kogemrka
Форумчанин
 
Аватар для kogemrka
 
Регистрация: 08.01.2010
Сообщений: 165
По умолчанию

Категорически советуют оформлять код в специальном теге, а то смотреть на эту красную вырвиглазную простыню просто невозможно.

Твой код я бы переделал так:

Код:
#include <iostream>
#include <cstring>
#include <cstdlib>

using namespace std;

int main()
{
  char str1[20], str2[20];
  char sym1[256] = {0}, sym2[256] = {0};

  // Ввод данных
  cout << "Введите первую строку:" << endl;
  cin.getline(str1, 20);
  
  cout << "Введите вторую строку:" << endl;
  cin.getline(str2, 20);

  // Проверяем строки на равенство длины
  if (strlen(str1) != strlen(str2))
  {
    cout << "Строки не равны" << endl;
    exit(0);
  }

  // Заполняем массивы символов. Массивы sym1 и sym2 устроены следующим образом:
  // в sym[n] хранится, сколько раз символ с кодом n встречался в строке.
  // разумеется, если наши строки состоят только из строчных латинских букв,
  // хранить 256 значений не имеет смысла и можно ограничиться 26-ю.
  int len = strlen(str1);
  for (int i = 0; i < len; ++i)
  {
    ++sym1[str1[i]];
    ++sym2[str2[i]];
  }
  
  // Проверяем, соответствует ли число использований для каждого символа в обоих строках
  for (int i = 0; i < 256; ++i)
  {
    if (sym1[i] != sym2[i])
    {
      cout << "Строки не равны" << endl;
      exit(0);
    }
  }

  // Если все проверки (на равенство длины и на число использований каждого символа)
  // пройдены, пишем, что строки равны и выходим
  cout << "Строки равны" << endl;

  return 0;
}

Последний раз редактировалось kogemrka; 11.09.2010 в 22:58. Причина: К коду добавлены комментарии
kogemrka вне форума Ответить с цитированием
Старый 12.09.2010, 00:33   #4
0479
Форумчанин
 
Аватар для 0479
 
Регистрация: 27.09.2009
Сообщений: 153
По умолчанию

Спасибо всё верно но лучше такой вариант
Код HTML:
#include <iostream>
#include <cstring>
#include <cstdlib>

using namespace std;

int main()
{ int d,fl;
  char str1[20], str2[20];
  char sym1[256] = {0}, sym2[256] = {0};

  // Ввод данных
  cout << "Введите первую строку:" << endl;
  cin.getline(str1, 20);
  
  cout << "Введите вторую строку:" << endl;
  cin.getline(str2, 20);


  // Заполняем массивы символов. Массивы sym1 и sym2 устроены следующим образом:
  // в sym[n] хранится, сколько раз символ с кодом n встречался в строке.
  // разумеется, если наши строки состоят только из строчных латинских букв,
  // хранить 256 значений не имеет смысла и можно ограничиться 26-ю.
  int len = strlen(str1);
  for (int i = 0; i < len; ++i)
  {
    ++sym1[str1[i]];
    ++sym2[str2[i]];
  }
  
  // Проверяем, соответствует ли число использований для каждого символа в обоих строках
   if (strlen(str1) == strlen(str2))
   {for (int i = 0; i < 256; ++i)
  {
    if (sym1[i] != sym2[i])
    {
      fl=1;
      
    }

  }
  if (fl==1){cout << "Ne Ravni" << endl;}
  else {cout << " Ravni" << endl;}}
   else  {cout << "Ne  Ravni" << endl;}
  // Если все проверки (на равенство длины и на число использований каждого символа)
  // пройдены, пишем, что строки равны и выходим
  
  cin>>d;
  
}
0479 вне форума Ответить с цитированием
Старый 12.09.2010, 12:08   #5
kogemrka
Форумчанин
 
Аватар для kogemrka
 
Регистрация: 08.01.2010
Сообщений: 165
По умолчанию

Ну, это уже тонкости, не имеющие отношения к своему алгоритму) На вкус и цвет фломастеры разные)

Кстати говоря, в твоей модификации стоит добавить добавить "break;" после проверки на неравенство числа встречающихся символов, то есть:

Код:
for (int i = 0; i < 256; ++i)
{
  if (sym1[i] != sym2[i])
  {
    fl=1;
    break;
  }
}
И, разумеется, стоит убрать подключение cstdlib, ведь он более никак не используется.

PS.
Почему-то над твоим кодом стоит пометка "код HTML:". И подсветка, разумеется, кривее некуда (ну а какая ещё может быть подсветка, если подсвечивать C++ код как HTML размётку?).
Я просто ставлю тег , попробуй, вдруг получится.

Последний раз редактировалось kogemrka; 12.09.2010 в 12:18.
kogemrka вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Макрос на сравнение и подсчет в первом столбце строк, и сумирование значений этих строк в другом столбце Shpr0T Microsoft Office Excel 8 30.08.2010 17:52
Сравнение символов DeEgo Общие вопросы Delphi 5 12.03.2010 15:14
Сравнение строк Jasper92 Общие вопросы C/C++ 6 23.12.2009 12:49
Сравнение строк Rivendell Microsoft Office Excel 8 18.12.2009 10:29
С++. Сравнение строк maxlav Помощь студентам 8 25.06.2009 04:33