Не работает функция объединения множеств
string obdnenie(string a, string b)
{
string c = {};
int i = 0, j = 0;
while (i < a.size() || j < b.size())
if (a[i] != b[j])
{
c += a[i];
c += b[j];
i++; j++;
}
else if (a[i] == b[j])
{
c += a[i];
i++;
}
return c;
}
надо что бы работал так: "чебурек", "монгол"
бгелкмрнуоч. Выводит так: бгелкмрнуо До этого функции их сортируют по алфавиту, по этому так получается
Ответы (1 шт):
Я бы хоткл разделить свой ответ на 3 части:
- Если просто взять Ваш код и запустить его на входных словах
чебурекимонгол- он выведетчмеобнугроелк. Как я вижу - все буквы присутствуют, и некоторые - например,о- больше одного раза.
Сортировки в коде у Вас нет, поэтому всё неотсортировано.
- Если говорить о формальном объекдинении множеств - то обычно предполагается, что каждый элемент входит туда только по одному разу. Очевидно, что так функция и приведенного кода просто не может работать.
Посмотрите у Вас есть индексы i и j, которые предназначены для "пробегания" по двум переданным строкам.
Но Вы меняете их одновременно. При этом вы
- не провряете, что достигли конца самого короткого слова. Увеличение каждого индекса продолжается, до тех пор, пока не достигнете конца длинного слова
- вы НЕ ПРОВЕРЯЕТЕ, есть ли добавляемый элемент (или элементы) в результирующем множестве.
Логичной реализацией была бы такая:
создаём пустое результирующее множество.
Пробегаем по первой строке. Для каждой буквы первой строки добавляем её в результирующее множество, ЕСЛИ ЕЁ ТАМ ЕЩЕ НЕТ.
Для второго слова - аналогично.
Примерно код мог бы выглядеть так, (windows.h используется для нормального вывода русских букв в кодировке 1251, можно его выкинуть, но тогда не работать с консолью, а только с файлами, видимо)
#include <iostream>
#include <string>
#include <algorithm>
#include <windows.h>
#include <fstream>
using namespace std;
// сюда переадется слово и стока, представляющая объединенноее множество символов.
// так как пеердача просиходи по ссылке - я прямо здесь меняю это множество.
// поэтому функция имеет тип void - возвращать из неё ничего не надо
void add_word_and_sort(const string& src, string& dst ){
for( auto& ch : src )
if ( dst.find(ch)==string::npos )
dst += ch;
sort( dst.begin(), dst.end() );
}
string str_conjunction(const string& a, const string& b)
{
string c = {};
add_word_and_sort(a, c);
add_word_and_sort(b, c);
return c;
}
int main(){
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
ifstream inp("input.txt");
string s1 , s2;
inp >> s1 >> s2;
string rez = str_conjunction( s1, s2 );
cout << rez << endl;
}
- Вообще, есть стандартный контейнер set. Он красиво и просто объдиняет множества.