Не работает функция объединения множеств

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 шт):

Автор решения: S.H.

Я бы хоткл разделить свой ответ на 3 части:

  1. Если просто взять Ваш код и запустить его на входных словах чебурек и монгол - он выведет чмеобнугроелк. Как я вижу - все буквы присутствуют, и некоторые - например, о - больше одного раза.

Сортировки в коде у Вас нет, поэтому всё неотсортировано.

  1. Если говорить о формальном объекдинении множеств - то обычно предполагается, что каждый элемент входит туда только по одному разу. Очевидно, что так функция и приведенного кода просто не может работать.

Посмотрите у Вас есть индексы 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;
}
  1. Вообще, есть стандартный контейнер set. Он красиво и просто объдиняет множества.
→ Ссылка