Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Istes
0 / 0 / 0
Регистрация: 01.04.2015
Сообщений: 16
#1

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

01.04.2015, 17:32. Просмотров 984. Ответов 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
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Сравнить две строки на различия не учитывая кол-во пробелов и такие различия в буквах как о-и, н-т, в-д. (C++):

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

Как сравнить две строки? - C++
Написал программу но не проходит сравнение вот это сравнение: bool flight_weight(char* flight) { if (predmet==flight) return...

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

Как сравнить две строки типа string? - C++
C типом char все просто. Поиск по Фамилии и имени. char name,name1,address, dom; int h=0; cout<<"Введите Фамилию "; ...

различия с и с++ - C++
заметил что во всех книгах по с++ вначале идет страниц 100 синтаксис С а потом С++с ооп Сильно ли отличается с от с++ стоит ли пропускать...

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

28
S_el
2124 / 1651 / 311
Регистрация: 15.12.2013
Сообщений: 6,480
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
1714 / 1342 / 166
Регистрация: 21.12.2010
Сообщений: 2,063
Записей в блоге: 10
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
2124 / 1651 / 311
Регистрация: 15.12.2013
Сообщений: 6,480
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
1714 / 1342 / 166
Регистрация: 21.12.2010
Сообщений: 2,063
Записей в блоге: 10
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
2124 / 1651 / 311
Регистрация: 15.12.2013
Сообщений: 6,480
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
2124 / 1651 / 311
Регистрация: 15.12.2013
Сообщений: 6,480
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
2124 / 1651 / 311
Регистрация: 15.12.2013
Сообщений: 6,480
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
03.04.2015, 18:44
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.04.2015, 18:44
Привет! Вот еще темы с ответами:

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

Как проанализировать различия между парадигмами программирования? - Python
Помогите пожалуйста с заданиями))) Документы с исходниками программ и условиями прилагаются. Язык программирования Python. Лабараторная...

Как найти различия между двумя проектами? - JAVA IDE
итак есть 2 проекта(2 .jar файла), я могу спокойно их открывать в intellij idea и смотреть декомпилированный исходный код, у меня задача...

Как сравнить две строки? - C (СИ)
Пожалуйста подскажите, как сделать, чтобы программа заработала. В данный момент, чтобы не ввел, отвечает &quot;Неверно&quot;. Видимо, напутал что-то...


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

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

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