Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
Istes
0 / 0 / 0
Регистрация: 01.04.2015
Сообщений: 16
1

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

01.04.2015, 17:32. Просмотров 1122. Ответов 28
Метки нет (Все метки)

Здравствуйте. Помогите пожалуйста дополнить программу. Суть программы -
нужно сравнить две строки на различия не учитывая кол-во пробелов и такие различия в буквах как о-и, н-т, в-д.
Это значит, что предложения:
Сова сидела на суку
и
Сида содела на суку
равны, а строки
Сова сидела на суку
и
Сова сидела на полу
не равны.
Имеется код игнорирующий кол-во пробелов.
Прошу помощи в добавлении к нему проверки по буквам для выполнения оставшейся части задачи.
Вот код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
int cmp( const char * c1, const char * c2 ){
    for(; *c1 && *c2 && !(( isalnum( *c1 ) && isalnum( *c2 ) || *c1 == ' ' || *c2 == ' ' ) && *c1 != *c2 ); c1++, c2++ );
    return !( *c1 + *c2 );
}
void RemoveSpaces(char* p)
{
    for(char* p1 = p; *p = *p1; ++p1)
    {
        if(*p != ' ')
            ++p;
    }
}
int main(int argc, char *argv[])
{
    char * c1 = "s-f   g.2";
    char * c2 = "s[f g]2";
    RemoveSpaces(c1);
    RemoveSpaces(c2);
    if( cmp( c1, c2 ))
        puts("True");
    else puts("False");
    getchar();
    return 0;
}
Выдаёт True так как строки схожи без учёта пробелов и спец символов.
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.04.2015, 17:32
Ответы с готовыми решениями:

Как сравнить две строки игнорируя различия в регистрах?
Дело в том, что нельзя использовать основные функции, в моей случае tolower, я...

Функция сравнивает две строки, игнорируя различия в регистрах
Я студент 1 курса на зачёт сказали написать программку помогите!! не хочу...

Как сравнить две строки?
Написал программу но не проходит сравнение вот это сравнение: bool...

Объяснить различия в работе указателей на целое число и указателей на const char (строки в стиле Си)
Уважаемые программисты, возникло несколько вопросов касательно указателей. ...

Как сравнить две строки типа string?
C типом char все просто. Поиск по Фамилии и имени. char...

28
S_el
2151 / 1679 / 353
Регистрация: 15.12.2013
Сообщений: 6,644
01.04.2015, 17:38 2
Istes, делаете копию второй строки проводите замену одних символов,на символы "синонимы"+ удаляете пробелы.Затем проверяете на равенство.
Советую использовать std::string вместо массивов char.
0
Istes
0 / 0 / 0
Регистрация: 01.04.2015
Сообщений: 16
01.04.2015, 19:48  [ТС] 3
Цитата Сообщение от S_el Посмотреть сообщение
Istes, делаете копию второй строки проводите замену одних символов,на символы "синонимы"+ удаляете пробелы.Затем проверяете на равенство.
Советую использовать std::string вместо массивов char.
Благодарю, но можно пожалуйста на примерах. Ведь я потому и обратился, что не могу разобраться сам. Алгоритм я понял, но программно затрудняюсь реализовать. Пробелы уже удаляются, а как сравнить две строки без учёта указанных в задании букв? Подробней пожалуйста.
0
igorrr37
1867 / 1483 / 751
Регистрация: 21.12.2010
Сообщений: 2,473
Записей в блоге: 11
01.04.2015, 20:11 4
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <iostream>
#include <algorithm>
#include <string>
#include <map>
#include <windows.h>
 
std::map<char, char> mp;
 
void Prepare(std::string& s)
{
    s.assign(s.begin(), std::remove(s.begin(), s.end(), ' '));
    for(std::map<char, char>::const_iterator ib(mp.begin()), ie(mp.end()); ib != ie; ++ib)
    {
        std::replace(s.begin(), s.end(), ib->first, ib->second);
    }
}
 
int main()
{
    SetConsoleOutputCP(1251);
    mp.insert(std::make_pair('о', 'и'));
    mp.insert(std::make_pair('н', 'т'));
    mp.insert(std::make_pair('в', 'д'));
 
    std::string s1("  о - и  н - т  в - д  ");
    std::string s2("и-от-нд-в");
 
    Prepare(s1);
    Prepare(s2);
 
    std::cout << (s1 == s2) << '\n';
 
    return 0;
}
1
Istes
0 / 0 / 0
Регистрация: 01.04.2015
Сообщений: 16
02.04.2015, 16:27  [ТС] 5
igorrr37,
Прошу прощения за непонятливость, но при выполнении Вашего кода у меня пошли ошибки. Я попытался найти информацию и слегка изменил код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <iostream>
#include <algorithm>
#include <string>
//#include <map>
#include <windows.h>
#include <set>
 
std::set<char, char> mp;
 
void Prepare(std::string& s)
{
    s.assign(s.begin(), std::remove(s.begin(), s.end(), ' '));
    for(std::set<char, char>::const_iterator ib(mp.begin()), ie(mp.end()); ib != ie; ++ib)
    {
        std::replace(s.begin(), s.end(), ib->first, ib->second);
    }
}
 
int main()
{
    SetConsoleOutputCP(1251);
    mp.insert(std::make_pair('Г®', 'ГЁ'));
    mp.insert(std::make_pair('Г*', 'ГІ'));
    mp.insert(std::make_pair('Гў', 'Г¤'));
 
    std::string s1("  Г® - ГЁ  Г* - ГІ  Гў - Г¤  ");
    std::string s2("ГЁ-îò-Г*Г¤-Гў");
 
    Prepare(s1);
    Prepare(s2);
 
    cout << (s1 == s2) << '\n';
 
    return 0;
}
Но с этим выполнением так же возникли ошибки:
Сравнить две строки на различия не учитывая кол-во пробелов и такие различия в буквах как о-и, н-т, в-д.


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


Прошу помочь решить ошибки.
0
S_el
2151 / 1679 / 353
Регистрация: 15.12.2013
Сообщений: 6,644
02.04.2015, 17:00 6
Цитата Сообщение от Istes Посмотреть сообщение
Прошу помочь решить ошибки.
Все должно работать как надо:
http://ideone.com/OhsjCB

Какая у вас среда?
0
Istes
0 / 0 / 0
Регистрация: 01.04.2015
Сообщений: 16
02.04.2015, 17:38  [ТС] 7
Цитата Сообщение от S_el Посмотреть сообщение
Все должно работать как надо:
http://ideone.com/OhsjCB
Какая у вас среда?
Ох я верю, что проблема не в коде.
Среда у меня - Borland C++ 5.02.
Увы приходится управляться этой старой версией потому как задание работать именно в этой среде.
0
igorrr37
1867 / 1483 / 751
Регистрация: 21.12.2010
Сообщений: 2,473
Записей в блоге: 11
02.04.2015, 20:15 8
вот в версии 5.0 работает
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
#include <string.h>
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------- 
void Prepare(char* p)
{
    for(char* p1 = p, *p2 = p; *p1 = *p2; ++p2)
    {
        if(*p1 == 'о') *p1 = 'и';
        else if(*p1 == 'н') *p1 = 'т';
        else if(*p1 == 'в') *p1 = 'д';
        
        if(*p1 != ' ') ++p1;
    }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
    char s1[] = "  о - и  н - т  в - д  ", s2[] = "и-от-нд-в";
    Prepare(s1);
    Prepare(s2);
    if(!strcmp(s1, s2)) ShowMessage("true");
    else ShowMessage("false");
}
//---------------------------------------------------------------------------
0
Istes
0 / 0 / 0
Регистрация: 01.04.2015
Сообщений: 16
03.04.2015, 15:32  [ТС] 9
Цитата Сообщение от igorrr37 Посмотреть сообщение
вот в версии 5.0 работает
Вы меня немного не так видимо поняли. В Вашем коде буквы в строках безвозвратно заменяются, а мне нужно лишь сравнить два строки без изменений их не учитывая число пробелов и те буквы которые я привёл выше.
0
S_el
2151 / 1679 / 353
Регистрация: 15.12.2013
Сообщений: 6,644
03.04.2015, 15:36 10
Цитата Сообщение от Istes Посмотреть сообщение
В Вашем коде буквы в строках безвозвратно заменяются, а мне нужно лишь сравнить два строки без изменений их не учитывая число пробелов и те буквы которые я привёл выше.
Введите дополнительную строковую переменную,преобразуйте её сравните с первой исходной и сделайте вывод о эквивалентности.
0
Istes
0 / 0 / 0
Регистрация: 01.04.2015
Сообщений: 16
03.04.2015, 16:39  [ТС] 11
Цитата Сообщение от S_el Посмотреть сообщение
Введите дополнительную строковую переменную,преобразуйте её сравните с первой исходной и сделайте вывод о эквивалентности.
Ввести ещё одну переменную? Значит у меня будет 3 строковых переменных? Если честно не могу представить целесообразность этого действия в применении последнего кода igorrr37.
Тем более я просил Вас в прошлом сообщении выразить Ваши мысли в примерах кода. Потому как не могу понять ход выполнения Ваших идей.
Сейчас у меня есть первая строка:
C++
1
s1[] = "  о - и  н - т  в - д  "
И вторая:
C++
1
s2[] = "и-от-нд-в"
Что даст ввод третьей? И чем она должна заполнится?
В коде igorrr37 меня всё устраивает, нужно лишь вместо:
C++
1
2
3
        if(*p1 == 'о') *p1 = 'и';
        else if(*p1 == 'н') *p1 = 'т';
        else if(*p1 == 'в') *p1 = 'д';
выполнять не замену, а лишь приравнять эти буквы друг другу.
Повторю ещё раз, к примеру пользователь ввёл первую стро:
C++
1
s1[] = "  о = и  н = т  в = д  "
И вторая строка:
C++
1
s2[] = "о=и н=т в=д"
Видно, что при визуальном сравнении строк в них отличается лишь кол-во пробелов, символы в двух строках равны.
Нужно что бы программа сравнивала две эти строки друг с другом не изменяя их и не учитывая кол-во пробелов и равные друг другу, для программы, буквы о=и н=т в=д. И программа выдаст - TRUE извещая о равенстве строк.
Следовательно если пользователь во втором эксперименте введёт первой строкой:
C++
1
s1[] = "  у = и  з = т  р = д  "
и сторую строку:
C++
1
s2[] = "о=и н=т в=д"
то теперь они будут уже не равны и программа выдаст - FALSE
Меня интересует именно процедура сравнения символов в двух сравниваемых строках.
0
S_el
2151 / 1679 / 353
Регистрация: 15.12.2013
Сообщений: 6,644
03.04.2015, 16:43 12
Цитата Сообщение от Istes Посмотреть сообщение
Тем более я просил Вас в прошлом сообщении выразить Ваши мысли в примерах кода.
Мою мысль в коде очень хорошо представил igorrr37. Я бы так изящно не написал,разве что windows.h подключать не стал

Цитата Сообщение от Istes Посмотреть сообщение
Нужно что бы программа сравнивала две эти строки друг с другом не изменяя их и не учитывая кол-во пробелов и равные друг другу, для программы, буквы о=и н=т в=д.
Вот именно для этого я и предлагаю ввести доп.переменную.Тогда исходные строки не изменятся.
1
Istes
0 / 0 / 0
Регистрация: 01.04.2015
Сообщений: 16
03.04.2015, 17:49  [ТС] 13
Цитата Сообщение от S_el Посмотреть сообщение
Вот именно для этого я и предлагаю ввести доп.переменную.Тогда исходные строки не изменятся.
Значит если я верно понял будет всё же две переменные как основные, не изменяемые две строки и ещё одна строка в которой будут заменяться символы по коду igorrr37.
Но как тогда будет происходить сравнение?
s1 = s3 и s2 = s3?
А если в s1 строка будет отличаться от s2 не только кол-вом пробелов, но и символами. Что тогда программа будет выдавать? Вот разум мучает сколько то близкое осознание Вашей идеи, но пока не могу сообразить.

Добавлено через 1 минуту
Приведите пожалуйста пример процедуры сравнения? Независимо от краткости и изящности. Для меня главное - суть. Из него я бы уже упорядочил и свои мысли.

Добавлено через 1 минуту
Сейчас попытаюсь выразить то как я это смутно представил.

Добавлено через 10 минут
Так, вопрос ещё.
Как сравнить s1 с s3 и s2 с s3 в одном условии?
C++
1
if(!strcmp(s1, s3)&&(s2, s3))
Понял, что это не верный вариант.

Добавлено через 47 минут
Цитата Сообщение от S_el Посмотреть сообщение
Вот именно для этого я и предлагаю ввести доп.переменную.Тогда исходные строки не изменятся.
Нет, я понял, что ничего не понял.
C++
1
2
3
4
5
6
7
8
9
10
11
int main(void)
{
SetConsoleOutputCP(1251);
    char s1[] = "  Г® - ГЁ  Г* - ГІ  Гў - Г¤  ", s2[] = "ГЁ-îò-Г*Г¤-Гў", s3[] = "ГЁ-îò-Г*Г¤-Гў";
    Prepare(s3);
    //Prepare(s2);
    if(!strcmp(s1, s3)) puts("true");
    else puts("false");
    system ("pause");
return 0;
}
Какой то бред получается.
0
Istes
0 / 0 / 0
Регистрация: 01.04.2015
Сообщений: 16
03.04.2015, 18:29  [ТС] 14
Всё же не увидел смысла в введении третьей строки.
Сравнить две строки на различия не учитывая кол-во пробелов и такие различия в буквах как о-и, н-т, в-д.
0
S_el
2151 / 1679 / 353
Регистрация: 15.12.2013
Сообщений: 6,644
03.04.2015, 18:44 15
Цитата Сообщение от Istes Посмотреть сообщение
Нет, я понял, что ничего не понял.
Изменил код,приведенный выше:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <iostream>
#include <algorithm>
#include <string>
#include <map>
 
bool isEquals(const std::string &first,const std::string &second);
void Prepare(std::string& s);
 
std::map<char, char> mp;
 
int main()
{
    setlocale(LC_ALL,"rus");
 mp.insert(std::make_pair('о', 'и'));
 mp.insert(std::make_pair('н', 'т'));
 mp.insert(std::make_pair('в', 'д'));
 std::string s1("  о = и  н = т  в = д  ");
 std::string s2("и=от=нд=в");
 std::string s3("  у = и  з = т  р = д  ");
 std::string s4("о = он = т  в = в");
 
 std::cout<<isEquals(s1,s2)<<std::endl;
 std::cout<<isEquals(s3,s4)<<std::endl;
 std::cout<<isEquals(s1,s4)<<std::endl;
 
return 0;
}
 
bool isEquals(const std::string &first,const std::string &second)
{
    std::string s1(first);
    std::string s2(second);
    Prepare(s1);
    Prepare(s2);
    return (s1==s2);
}
 
void Prepare(std::string& s)
{
 s.assign(s.begin(), std::remove(s.begin(), s.end(), ' '));
 for(std::map<char, char>::const_iterator ib(mp.begin()), ie(mp.end()); ib != ie; ++ib)
 {
 std::replace(s.begin(), s.end(), ib->first, ib->second);
 }
}
0
Istes
0 / 0 / 0
Регистрация: 01.04.2015
Сообщений: 16
03.04.2015, 18:53  [ТС] 16
Цитата Сообщение от S_el Посмотреть сообщение
Изменил код,приведенный выше:
Этот код увы не подходит мне.
Цитата Сообщение от Istes Посмотреть сообщение
Ох я верю, что проблема не в коде.
Среда у меня - Borland C++ 5.02.
Увы приходится управляться этой старой версией потому как задание работать именно в этой среде.
Нужный код чуть ниже.
0
S_el
03.04.2015, 18:57
  #17

Не по теме:

Цитата Сообщение от Istes Посмотреть сообщение
Этот код увы не подходит мне.
Я надеялся,что во второй раз вы сможете самостоятельно перевести код под нужную вам среду.

0
Istes
0 / 0 / 0
Регистрация: 01.04.2015
Сообщений: 16
03.04.2015, 19:01  [ТС] 18
Цитата Сообщение от S_el Посмотреть сообщение
Я надеялся,что во второй раз вы сможете самостоятельно перевести код под нужную вам среду.
Увы, сознаюсь, что ещё не столь хорошо овладел языком. Прошу прощения за мою неосведомлённость.
0
S_el
2151 / 1679 / 353
Регистрация: 15.12.2013
Сообщений: 6,644
03.04.2015, 19:07 19
Цитата Сообщение от Istes Посмотреть сообщение
Увы, сознаюсь, что ещё не столь хорошо овладел языком. Прошу прощения за мою неосведомлённость.
Так показывайте попытки.Поверьте для вас будет намного полезнее,если вы эту задачу(перевод кода) решите сами.
0
Istes
0 / 0 / 0
Регистрация: 01.04.2015
Сообщений: 16
03.04.2015, 19:15  [ТС] 20
Могу лишь предположить, что в Вашем примере сравнение происходит в три действия. Следовательно при выводе результата в консоль будет три строки сравнения s1-s2, s3-s4, s4-s1. Но ведь суть задачи - сравнить две строки.

Добавлено через 4 минуты
Я вообще ещё не работал не разу с библиотекой map и увы пока не могу представить её функционал.
igorrr37 при переводе своего первого кода в нужный мне на мой взгляд кардинально изменил код, что мне даже не за что зацепиться для начала.
К примеру:
C++
1
2
3
4
5
6
7
8
    for(char* p1 = p, *p2 = p; *p1 = *p2; ++p2)
    {
        if(*p1 == 'о') *p1 = 'и';
        else if(*p1 == 'н') *p1 = 'т';
        else if(*p1 == 'в') *p1 = 'д';
        
        if(*p1 != ' ') ++p1;
    }
И
C++
1
2
3
4
5
6
7
 mp.insert(std::make_pair('о', 'и'));
 mp.insert(std::make_pair('н', 'т'));
 mp.insert(std::make_pair('в', 'д'));
 std::string s1("  о = и  н = т  в = д  ");
 std::string s2("и=от=нд=в");
 std::string s3("  у = и  з = т  р = д  ");
 std::string s4("о = он = т  в = в");
Каким образом это связано?

Добавлено через 2 минуты
Да,
C++
1
2
3
4
 std::string s1("  о = и  н = т  в = д  ");
 std::string s2("и=от=нд=в");
 std::string s3("  у = и  з = т  р = д  ");
 std::string s4("о = он = т  в = в");
- объявление строк. Но что такое mp.insert. Извлечение?
0
03.04.2015, 19:15
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.04.2015, 19:15

Функция сравнивает две строки, игнорируя различия в регистрах
Мне нужно написать программу в которой функция сравнивает две строки, игнорируя...

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

Как вытянуть различия по двум выборкам
Дано: есть две выборки,в каждой одно поле в 1-ой выборке 1000 записей, во...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru