Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
0 / 0 / 0
Регистрация: 10.10.2021
Сообщений: 68
1

Проверить является ли одно из множеств подмножеством другого

07.03.2022, 00:11. Показов 1366. Ответов 5
Метки c++ (Все метки)

Author24 — интернет-сервис помощи студентам
Попытался разработать программу к соответствующему заданию:
Разработать компьютерную программу, которая:
а) предлагает пользователю ввести два множества элементов,
либо считывает два множества элементов из заранее
подготовленных текстовых файлов;
б) проверяет, является ли одно из множеств подмножеством
другого;
в) выводит на экран результат проверки.

Если ввожу два множества одинаковой длины, то работает верно. Если множества разной длины, то всегда выводит, что ни одно из множеств не является подмножеством другого.
Помогите пожалуйста исправить, не могу понять в чем ошибка

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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
#include <iostream>
#include <string>
#include <sstream>
#include <windows.h>
 
using namespace std;
 
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    setlocale(LC_ALL, "Russian");
    string str1, str2, n1, n2, s, str11, str22;
    int k2 = 0, k1 = 0, i = 0, j = 0, kol1, kol2, kol;
    cout << "Введите первую последовательность" << endl;
    getline(cin, str1);
    cout << "Введите вторую последовательность" << endl;
    getline(cin, str2);
    stringstream s1(str1);
    stringstream s2(str2);
    cout << str1 << endl;;
    cout << str2 << endl;
    while (s1 >> str11)
        k1 ++; // считаем количество элементов в массиве
    if (k1 == 0)
        cout << "Введенная совокупность является пустым множеством." << endl;
    while (s2 >> str22)
        k2++; // считаем количество элементов в массиве
    if (k2 == 0)
        cout << "Введенная совокупность является пустым множеством." << endl;
    string* m = new string[k1]; // создаем одномерный динамический массив типа string
    string* p = new string[k2];  // создаем одномерный динамический массив типа int
    while (s1 >> n1) // заполняем массив m
    {
        m[i] = n1;
        i++;
    }
    while (s2 >> n2) // заполняем массив m
    {
        p[j] = n2;
        j++;
    }
    if (k1 == k2)
    {
        kol1 = 0;
        kol2 = 0;
        kol = 0;
        for (i = 0; i < k1; i++)
        {
            for (j = 0; j < k2; j++)
            {
                if (m[i] == m[j])
                    kol1 ++;
                if (m[i] == p[j])
                    kol2++;
            }
            if (kol1 == kol2)
                kol++;
        }
        if (kol == k1)
            cout << "Введеные множества равны" << endl;
    }
    else if (k1 > k2)
    {
        kol = 0;
        for (i = 0; i < k1; i++)
        {
            kol1 = 0;
            kol2 = 0;
            for (j = 0; j < k1; j++)
            {
                if (m[i] == m[j])
                    kol1++;
                if (m[i] == p[j])
                    kol2++;
            }
            if (kol1 == kol2)
                kol++;
        }
        if (kol == k2)
            cout << "Второе множество является подмножеством первого" << endl;
    }
    else if (k2 > k1)
    {
        kol = 0;
        for (i = 0; i < k2; i++)
        {
            kol1 = 0;
            kol2 = 0;
            for (j = 0; j < k2; j++)
            {
                if (p[i] == p[j])
                    kol1++;
                if (p[i] == m[j])
                    kol2++;
            }
            if (kol1 == kol2)
                kol++;
        }
        if (kol == k1)
            cout << "Первое множество является подмножеством второго" << endl;
    }
    if (kol == 0)
        cout << "Ни одно из множеств не является подмножеством другого" << endl;
   
 
    delete[] m;
    delete[] p;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.03.2022, 00:11
Ответы с готовыми решениями:

Установить, является ли одно множество подмножеством другого
помогите пожалуста))) 1)Создать множества А,В,С- псевдослучайных чисел из натурального ряда;...

Проверить, является ли один массив подмножеством другого
Здравствуйте! Опять нужна помощь. Задание: Написать функцию, принимающую в качестве аргумента,...

Проверить, является ли одно множество подмножеством другого
Определить функцию ПОДМНОЖЕСТВО, которая проверяет, является ли одно множество подмножеством...

Какое из данных множеств является подмножеством другого?
Не могу до конца разобраться с данной темой. Какое из данных множеств является подмножеством...

5
4770 / 2580 / 892
Регистрация: 29.11.2010
Сообщений: 5,581
07.03.2022, 00:51 2
Шота я не вижу, чтоб вам было нельзя использовать STL.

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
46
47
48
49
50
51
52
53
54
55
56
#include <iostream>
#include <string>
#include <sstream>
#include <unordered_set>
#include <iterator>
#include <algorithm>
 
void getLineToStream(std::istream &in, std::ostream &out) {
    std::string line;
    std::getline(in, line);
    out << line;
}
 
// returns true if all elements of set a are in set b;
template<typename T>
bool containsAll(const std::unordered_set<T> &a, const std::unordered_set<T> &b) {
    for (const auto &i : a) {
        if (b.find(i) == b.end()) {
            return false;
        }
    }
    return true;
}
 
int main() {
    std::stringstream streamA, streamB;
 
    getLineToStream(std::cin, streamA);
    getLineToStream(std::cin, streamB);
 
    std::unordered_set<int> setA, setB;
 
    std::copy(std::istream_iterator<int>(streamA), std::istream_iterator<int>(),
            std::inserter(setA, setA.begin()));
    std::copy(std::istream_iterator<int>(streamB), std::istream_iterator<int>(),
            std::inserter(setB, setB.begin()));
 
    bool aHasAllB = containsAll(setB, setA);
    bool bHasAllA = containsAll(setA, setB);
 
    if (aHasAllB) {
        if (bHasAllA) {
            std::cout << "Sets are equal." << std::endl;
        } else {
            std::cout << "Set B is a subset of set A." << std::endl;
        }
    } else {
        if (bHasAllA) {
            std::cout << "Set A is a subset of set B." << std::endl;
        } else {
            std::cout << "Sets are different." << std::endl;
        }
    }
 
    return 0;
}
1
403 / 261 / 167
Регистрация: 13.01.2021
Сообщений: 1,162
07.03.2022, 01:06 3
Если правильно понял суть
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <cstring>
using namespace std;
int main() {
    string s1 = "86s", s2 ="86"; 
    if(s1.length() == 0 || s2.length() == 0){
        cout << "Данные не записались";
        return 0;
    }
    if(strstr(s1.c_str(),s2.c_str()) && s1.length() == s2. length()){
        cout << "Множества равны. ";
    }
    else if(strstr(s1.c_str(),s2.c_str())){
        cout << "2 множество является подмножеством 1.";
    }
    else if(strstr(s2.c_str(),s1.c_str())){
        cout << "1 множество является подмножеством 2.";
    }
    else{
        cout <<"Ни одно множество не является друг другу подмножеством.";
    }
    return 0;
}
1
2848 / 1997 / 986
Регистрация: 21.12.2010
Сообщений: 3,705
Записей в блоге: 10
07.03.2022, 01:55 4
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include <vector>
#include <algorithm>
#include <set>
 
 
int main()
{
    std::set<int> sa{ 1,2,3 }, sb{ 1,2, }, sc;
    std::set_intersection(sa.begin(), sa.end(), sb.begin(), sb.end(), std::inserter(sc, sc.begin()));
    std::cout << std::boolalpha << (sa == sc || sb == sc) << std::endl;
}
1
0 / 0 / 0
Регистрация: 10.10.2021
Сообщений: 68
07.03.2022, 10:36  [ТС] 5
Я нашел ошибку в своем коде, была проблема с потоком.
Можно ли как-то этот код разделить на несколько функций (условно на две или три: ввод, вычисления и вывод), чтобы все не находилось в main? Я можно сказать недавно начал изучать программирование и с функциями пока как-то не очень) Буду благодарен если кто-то поможет

#include <iostream>
#include <string>
#include <sstream>
#include <windows.h>

using namespace std;


int main()
{
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
setlocale(LC_ALL, "Russian");
string str1, str2, ilement_mas_m, ilement_mas_p, s, kol_slov1, kol_slov2;
int kol_ilem_1 = 0, kol_ilem_2 = 0, i = 0, j = 0, kol_povt_1, kol_povt_2, kol_povt_str;
cout << "Введите первую последовательность:" << endl;
getline(cin, str1);
cout << "Введите вторую последовательность:" << endl;
getline(cin, str2);
stringstream potok_kol1(str1);
stringstream potok_kol2(str2);
stringstream potok_ilement1(str1);
stringstream potok_ilement2(str2);
while (potok_kol1 >> kol_slov1)
kol_ilem_1 ++;
while (potok_kol2 >> kol_slov2)
kol_ilem_2++;
string* m = new string[kol_ilem_1];
string* p = new string[kol_ilem_2];

while (potok_ilement1 >> ilement_mas_m)
{
m[i] = ilement_mas_m;
i++;
}
while (potok_ilement2 >> ilement_mas_p)
{
p[j] = ilement_mas_p;
j++;
}
if (kol_ilem_1 == kol_ilem_2)
{
kol_povt_1 = 0;
kol_povt_2 = 0;
kol_povt_str = 0;
for (i = 0; i < kol_ilem_1; i++)
{
for (j = 0; j < kol_ilem_2; j++)
{
if (m[i] == m[j])
kol_povt_1 ++;
if (m[i] == p[j])
kol_povt_2++;
}
if (kol_povt_1 == kol_povt_2)
kol_povt_str++;
}
if (kol_povt_str == kol_ilem_1)
cout << "Введеные множества равны." << endl;
}
else if (kol_ilem_1 > kol_ilem_2)
{
kol_povt_str = 0;
for (i = 0; i < kol_ilem_1; i++)
{
kol_povt_1 = 0;
kol_povt_2 = 0;
for (j = 0; j < kol_ilem_1; j++)
{
if (m[i] == m[j])
{
kol_povt_1++;
}
if (m[i] == p[j])
{
kol_povt_2++;
}
}
if (kol_povt_1 == kol_povt_2)
kol_povt_str++;
}
if (kol_povt_str == kol_ilem_2)
cout << "Второе множество является подмножеством первого." << endl;
}
else if (kol_ilem_2 > kol_ilem_1)
{
kol_povt_str = 0;
for (i = 0; i < kol_ilem_2; i++)
{
kol_povt_1 = 0;
kol_povt_2 = 0;
for (j = 0; j < kol_ilem_2; j++)
{
if (p[i] == p[j])
kol_povt_1++;
if (p[i] == m[j])
kol_povt_2++;
}
if (kol_povt_1 == kol_povt_2)
kol_povt_str++;
}
if (kol_povt_str == kol_ilem_1)
cout << "Первое множество является подмножеством второго." << endl;
}
if ((kol_povt_str == 0) && (kol_ilem_1 != 0) && (kol_ilem_2 != 0))
cout << "Ни одно из множеств не является подмножеством другого." << endl;


delete[] m;
delete[] p;
}
0
2827 / 2334 / 704
Регистрация: 29.06.2020
Сообщений: 8,609
07.03.2022, 19:22 6
C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>
void foo(int);
 
int main(){
   foo(5);
}
 
void foo(int a){
   std:: cout << a;
}
По аналогии.
0
07.03.2022, 19:22
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.03.2022, 19:22
Помогаю со студенческими работами здесь

Множества. Определить, является ли одно из них подмножеством другого
Сформировать множества A и B, базовый тип которых -60..-20, по заданному числу элементов для...

Clojure Опpеделить пpедикат, проверяющий, является ли одно множество подмножеством другого
не справляюсь с этим чудо-языком.. буду благодарен помощи в решении задач: Опpеделить пpедикат,...

Проверить, является ли один список подмножеством другого списка
не справляюсь с этим чудо-языком.. буду благодарен помощи в решении задач: Даны два списка L1...

Проверить истинность утверждения "F является подмножеством G, G является подмножеством H" (F, G и H - файлы)
Заданы три упорядоченных множества F, G и H, представленные файлами f, g и h соответственно....

Проверить, является ли одно дерево поддеревом другого
Постройте два дерева. Проверьте, является ли одно из них поддеревом другого. Если &quot;нет&quot;, то...

Проверить, является ли одно из чисел делителем другого
Помогите с задачей.Вот условие. &quot;Дано два числа: aa и bb. Определите, является ли одно из этих...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru