Форум программистов, компьютерный форум CyberForum.ru

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

Войти
Регистрация
Восстановить пароль
 
 
igor myakota
59 / 59 / 15
Регистрация: 03.05.2012
Сообщений: 1,213
#1

зделать задачу по дискретной математике - C++

08.09.2013, 22:21. Просмотров 780. Ответов 17
Метки нет (Все метки)

Пусть сгенерированные на ЭВМ множества А, В, С состоят из элементов: А = {1, 3, 4, 5, 10}, B = {3, 5, 7, 8, 9}, C = {3, 5, 6 , 9, 10}.
Тогда результат выполнения операции пересечения этих множеств имеет вид:
D = A http://www.cyberforum.ru/cgi-bin/latex.cgi?\subset B http://www.cyberforum.ru/cgi-bin/latex.cgi?\subset C = {3, 5}
написать код
Изображения
 
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.09.2013, 22:21
Здравствуйте! Я подобрал для вас темы с ответами на вопрос зделать задачу по дискретной математике (C++):

НЕ сложная Англоязычная литература по языкам программирования, алгоритмам и дискретной математике - C++
Подошел к своей подруге-лингвисту с вопросом:"Хочу выучить Английский, преимущественно технический. Если я уеду за границу на пару месяцев,...

Задача по дискретной математике (написать программу для расшифровки числового ребуса) - C++
Надо написать программу для расшифровки числового ребуса: ссср=рф Если честно, я чёт даже не пойму чего от меня требуют. (У нас...

О дискретной математике - Дискретная математика
Подскажите, в чем смысл ее изучения для программиста? Вот я уже выучил теорию множеств и несколько параграфов по теории графов, но так и не...

Задание по дискретной математике - Дискретная математика
Помогите решить! Постройте отрицания следующих утверждений и сформулируйте словами предложение, которое получится

Контрольная по дискретной математике - Дискретная математика
Помогите решить задания по дискретной математике Задание 1. Докажите тождества, используя только определения операций над множествами....

Не подскажите по дискретной математике? - Дискретная математика
Дискретная математика (экзамен)

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Nullik
43 / 12 / 1
Регистрация: 13.03.2013
Сообщений: 300
Завершенные тесты: 1
08.09.2013, 22:28 #2
брать одно число из А и проверять его через цикл for в В и C?
igor myakota
59 / 59 / 15
Регистрация: 03.05.2012
Сообщений: 1,213
08.09.2013, 22:30  [ТС] #3
то можете хотя б написать код а то с++ никогда не было был тока паскаль чтобы розобратся
кстати!! Считать универсальной множеством Х все натуральные числа от 0 до 40. Расчеты выполнить используя ЭВМ.
Nullik
43 / 12 / 1
Регистрация: 13.03.2013
Сообщений: 300
Завершенные тесты: 1
08.09.2013, 22:52 #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
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
#include "stdafx.h"
#include <iostream> //обязательная библиотека
#include <ctime> //для работы рандома
#include <vector> //для работы вектора
 
using namespace std; //чтобы не прописывать всё время std:: для cout, vector, cin, например.
 
void main() 
{
    int n1,n2,n3,i=0,j=0,h=0; //ввели переменные счётчики. Группа n -- для динамических одномерных массивов
    setlocale(0,""); //русский язык
    srand (time(0)); //рандомные числа по секундам
    cout << "Введите размер первого множества:\n";
    cin >> n1;
    cout << "Введите размер второго множества:\n";
    cin >> n2;
    cout << "Введите размер третьего множества:\n";
    cin >> n3;
    cout << "\n\nD = A с B с C = {";
 
    int *a,*b,*c; //создали указали на память
    a = new int[n1]; //выделили память под эти указатели, т.е., создали динамический массив int типа под n1 размер
    b = new int[n2];
    c = new int[n3];
    vector<int> d; //сделали вектор, куда будем складывать "решение"
 
    //сначала нужно создать эти множества, заполнили их рандомом
    for (;i<n1;i++) 
    {
        a[i]=rand() %40; // от 0 до 40, только не помню - 40 включительно или нет.
    }
    for (i=0;i<n2;i++)
    {
        b[i]=rand() %40;
    }for (i=0;i<n3;i++)
    {
        c[i]=rand() %40;
    }
 
    // поэлементно проверяем содержание одинаковых элементов
    for(i=0; i<n1; i++)
    {
        for (j=0; j<n2; j++)
        {
            for (h=0; h<n3; h++)
            {
                if ((a[i]==b[j])&&(a[i]==c[h])) //если выполнилось это условие, то
                {
                    d.push_back(a[i]); //добавляем в вектор элемент-повторюшку
                }
            }
        }
    }
 
    for (i=0; i<d.size(); i++) //распечатали элементы "пересечения"
    {
        cout << d[i] << ", ";
    }
 
    cout << "}";
 
    cin.get(); //задержка экрана
    cin.get();
}
gray_fox
What a waste!
1506 / 1209 / 68
Регистрация: 21.04.2012
Сообщений: 2,544
Завершенные тесты: 3
08.09.2013, 23:13 #5
Как вариант:
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 <iostream>
#include <iterator>
#include <algorithm>
#include <vector>
 
 
int main() {
   std::vector<int> U(41);
   std::iota(std::begin(U), std::end(U), 0);
 
   std::vector<int> A { 1, 3, 4, 5, 10 };
   std::vector<int> B { 3, 5, 7, 8, 9  };
   std::vector<int> C { 3, 5, 6, 9, 10 };
 
   std::vector<int> AandB;
   std::set_intersection(
         std::begin(A), std::end(A)
       , std::begin(B), std::end(B)
       , std::back_inserter(AandB));
 
   std::vector<int> notAandB;
   std::set_difference(
         std::begin(U), std::end(U)
       , std::begin(AandB), std::end(AandB)
       , std::back_inserter(notAandB));
 
   std::vector<int> result;
   std::set_intersection(
         std::begin(notAandB), std::end(notAandB)
       , std::begin(C), std::end(C)
       , std::back_inserter(result));
 
   std::copy(
         std::begin(result), std::end(result)
       , std::ostream_iterator<int>(std::cout, " "));
   std::cout << std::endl;
}
http://ideone.com/E4zDw1
igor myakota
59 / 59 / 15
Регистрация: 03.05.2012
Сообщений: 1,213
08.09.2013, 23:58  [ТС] #6
Цитата Сообщение от Nullik Посмотреть сообщение
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
#include "stdafx.h"
#include <iostream> //обязательная библиотека
#include <ctime> //для работы рандома
#include <vector> //для работы вектора
 
using namespace std; //чтобы не прописывать всё время std:: для cout, vector, cin, например.
 
void main() 
{
    int n1,n2,n3,i=0,j=0,h=0; //ввели переменные счётчики. Группа n -- для динамических одномерных массивов
    setlocale(0,""); //русский язык
    srand (time(0)); //рандомные числа по секундам
    cout << "Введите размер первого множества:\n";
    cin >> n1;
    cout << "Введите размер второго множества:\n";
    cin >> n2;
    cout << "Введите размер третьего множества:\n";
    cin >> n3;
    cout << "\n\nD = A с B с C = {";
 
    int *a,*b,*c; //создали указали на память
    a = new int[n1]; //выделили память под эти указатели, т.е., создали динамический массив int типа под n1 размер
    b = new int[n2];
    c = new int[n3];
    vector<int> d; //сделали вектор, куда будем складывать "решение"
 
    //сначала нужно создать эти множества, заполнили их рандомом
    for (;i<n1;i++) 
    {
        a[i]=rand() %40; // от 0 до 40, только не помню - 40 включительно или нет.
    }
    for (i=0;i<n2;i++)
    {
        b[i]=rand() %40;
    }for (i=0;i<n3;i++)
    {
        c[i]=rand() %40;
    }
 
    // поэлементно проверяем содержание одинаковых элементов
    for(i=0; i<n1; i++)
    {
        for (j=0; j<n2; j++)
        {
            for (h=0; h<n3; h++)
            {
                if ((a[i]==b[j])&&(a[i]==c[h])) //если выполнилось это условие, то
                {
                    d.push_back(a[i]); //добавляем в вектор элемент-повторюшку
                }
            }
        }
    }
 
    for (i=0; i<d.size(); i++) //распечатали элементы "пересечения"
    {
        cout << d[i] << ", ";
    }
 
    cout << "}";
 
    cin.get(); //задержка экрана
    cin.get();
}
а можете сказать что ето "Введите размер первого множества"??
Nullik
43 / 12 / 1
Регистрация: 13.03.2013
Сообщений: 300
Завершенные тесты: 1
09.09.2013, 06:52 #7
Ну, например, в паскале, чтобы сделать массив, ты внутри программы пишешь/объявляешь массив, его длину. Числа груупы n нужны для трёх различных множеств, т.е., это как бы мы вводим размер массива. Это динамические массивы, и вот:

Перед cin.get();

Допиши:

delete a, b,c; //раз мы память взяли, то её должны и вернуть


cin >> - это ввод данных, тоже самое что read в паскале
cout << - тоже самое, что write
igor myakota
59 / 59 / 15
Регистрация: 03.05.2012
Сообщений: 1,213
09.09.2013, 14:48  [ТС] #8
тойсь розмер каждого масива нада вводить 40 ??
Миниатюры
зделать задачу по дискретной математике  
Nullik
43 / 12 / 1
Регистрация: 13.03.2013
Сообщений: 300
Завершенные тесты: 1
09.09.2013, 16:37 #9
нет, массив 40 не надо вводить, это значит что числа натуральные от 0 до 40 или 39, не помню.

Кстати, сейчас, скину доработанный вариант программы.

Добавлено через 1 час 23 минуты
так, я в коде обнаружила ошибку. Проанализировав её, пришла к такому выводу: чтобы не было случая, когда в двух из множеств по одной, например, 2, а в третьем три 2 (а программа будет три раза выводить 2), сделала следующее:

сделаем через "вектор" множества a,b,c. Когда мы встретим одинаковые элементы, то мы по одному элементу будем удалять из каждого множества, добавляя "удалённый элемент" в множество d.


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
#include "stdafx.h"
#include <iostream> //обязательная библиотека
#include <ctime> //для работы рандома
#include <vector> //для работы вектора
 
using namespace std; //чтобы не прописывать всё время std:: для cout, vector, cin, например.
 
void main() 
{
    int n1,n2,n3,i=0,j=0,h=0, temp; //ввели переменные счётчики. Группа n -- для динамических одномерных массивов
    setlocale(0,""); //русский язык
    srand (time(0)); //рандомные числа по секундам
    cout << "Введите размер первого множества:\n";
    cin >> n1;
    cout << "Введите размер второго множества:\n";
    cin >> n2;
    cout << "Введите размер третьего множества:\n";
    cin >> n3;
 
 
 
    
 
    
    vector<int> d,a,b,c; //сделали вектора. Вектор d -- вектор для "ответа"
 
 
    //сначала нужно создать эти множества, заполнили их рандомом и выведем на экран
    for (;i<n1;i++) 
    {
        temp=rand() %41; // от 0 до 40 включительно => [0..40]
        a.push_back(temp);
        cout << a[i] <<" ";
    }
 
    cout << "\n";
 
    for (i=0;i<n2;i++)
    {
        temp=rand() %41;
        b.push_back(temp);
        cout << b[i] <<" ";
    }
 
    cout << "\n"; //перевод на след. строку ~ writeln();
 
    for (i=0;i<n3;i++)
    {
        temp=rand() %41;
        c.push_back(temp);
        cout << c[i] <<" ";
    }
 
    cout << "\n\nD = A с B с C = {";
    int dd_size1=0,dd_size2=0; //dd_size1 - начальный размер вектора d, dd_size2 - конечный. Нужно для сравнения, были ли изменения. 
    //так как мы будем удалять элемента, а на их место встанут другие -- надо проверять с того же места. В этом коде "сравнение размера ДО и ПОСЛЕ" поможет
 
    // поэлементно проверяем содержание одинаковых элементов
    for(i=0; i<n1; i++)
    {
        for (j=0; j<n2; j++)
        {
            for (h=0; h<n3; h++)
            {
                if ((a[i]==b[j])&&(a[i]==c[h])) //если выполнилось это условие, то
                {
                    d.push_back(a[i]); //добавляем в вектор элемент-повторюшку
                    a.erase(a.begin() + i); //удаляем элемент из ветора, "который на хочется на i" месте. 
                    //По сути, функция erase удаляет итератор, но мы сдвинули итератор на i, поэтому, тоже самое, как "удалить элемент на i-ом месте"
                    b.erase(b.begin() + j);
                    c.erase(c.begin() + h);
                    dd_size2++; //увеличили конечный размер
                    break; //вышли из этого цикла for
                }
                
            }
            if (dd_size1!=dd_size2) //если размеры поменялись, т.е., выход из цикла for выше был совершен, то
            {
                dd_size1++; //прировняли размеры ДО и ПОСЛЕ
                i--; //уменьшили переменную первого цикла, так как при начале цикла она вновь увеличится на 1 --> мы проверим ещё раз с того же места но другими элементами
                n1--; //уменьшаем размеры множеств, так как мы удаляли из них элементы. Можно было бы использовать name vector.size(); , но это длиннее. (возможно, постоянно будет проверка на размер) А так, разницы никакой. 
                n2--;
                n3--;
                break; //вышли из этого цикла for в "главный"
            }
        }
    }
 
 
    if (d.size()==0) //если в d ничего не добавили, то
    {
        cout << "пустое множество";
    }
    else //иначе
    {
 
        for (i=0; i<d.size(); i++) //распечатали элементы "пересечения"
        {
            cout << d[i] << ", ";
        }
    }
    cout << "}";
 
    cin.get(); //задержка экрана
    cin.get();
}
AlexCore
2 / 2 / 0
Регистрация: 28.08.2013
Сообщений: 26
09.09.2013, 17:52 #10
Зачем так сложно? Если я правильно понимаю, задача сводится к тому, чтобы найти кол-во всех чисел от 0 до 40 включительно для каждого из трех множеств, и вывести минимальное количество по каждому числу

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
int main()
{
    vector <vector<int> > rep(40);
 
    for(int i = 0;i < 40; ++i)
        rep[i].assign(3, 0);
 
    int n, m, l;
    cin >> n >> m >> l;
 
    int tmp = 0;
    for(int i = 0;i < n; ++i)
        cin >> tmp, ++rep[tmp][0];
 
    for(int i = 0;i < m; ++i)
        cin >> tmp, ++rep[tmp][1];
 
    for(int i = 0;i < m; ++i)
        cin >> tmp, ++rep[tmp][2];
 
    cout << "{";
    bool fg = true;
    int min_ = 0;
    for(int i = 0;i < 40; ++i){
        if((min_ = min(min(rep[i][0], rep[i][1]), rep[i][2])) > 0){
            if(!fg)
                cout << ", ";
 
            for(int j = 1;j <= min_; ++j){
                fg = false;
                cout << i;
                if(j != min_)
                    cout << ", ";
            }
        }
    }
    cout << "}" << endl;
 
    getch();
    return 0;
}
Тест:
5 5 5
1 2 2 3 3
4 3 2 2 3
1 3 2 2 3

Вывод:
{2, 2 ,3 ,3}
Nullik
43 / 12 / 1
Регистрация: 13.03.2013
Сообщений: 300
Завершенные тесты: 1
09.09.2013, 18:29 #11
Да, всё же:

5 5 5
1 2 2 3 3
4 3 2 2 3
1 3 2 2 3
ответ: { }

Добавлено через 4 минуты
хотя, я никак не пойму смысла картинки -- из неё следует, что будет ответ:

1,4,7,8,9,10 пересечь с 3,5,6,9,10, = 6,9,10.

Добавлено через 2 минуты
и почему в коде два раза буква m в циклах фор?
Raali
623 / 327 / 34
Регистрация: 06.07.2013
Сообщений: 1,056
Завершенные тесты: 1
09.09.2013, 18:32 #12
Цитата Сообщение от Nullik Посмотреть сообщение
1,4,7,8,9,10 пересечь с 3,5,6,9,10, = 6,9,10.
= 9 , 10 - только они присутствуют и там и там
AlexCore
2 / 2 / 0
Регистрация: 28.08.2013
Сообщений: 26
09.09.2013, 18:38 #13
Про m - верно замечено
Nullik
43 / 12 / 1
Регистрация: 13.03.2013
Сообщений: 300
Завершенные тесты: 1
09.09.2013, 18:44 #14
Да, верно.

И всё же, мне кажется, я нашла способ ещё короче (ещё один вариант).

AlexCore, если вам не сложно, расскажите вкратце ещё раз: что делает ваш код?

Мой код банально перебирает и сравнивает.
AlexCore
2 / 2 / 0
Регистрация: 28.08.2013
Сообщений: 26
09.09.2013, 18:56 #15
Диапазон чисел - от 0 до 40. Создадим вектор, который будет содержать вектор из трех элементов: число вхождений данного числа в первом множестве, второй элемент - число вхождений данного числа во втором множестве, третий - соответственно. Далее посчитаем количество вхождений чисел во всех множествах. Далее, мы выводим ответ: те числа, минимальное кол-во которых больше нуля, и столько раз, сколько составляет этот минимум...допустим, у нас множества {2, 3, 2}, {2, 1, 1}, {1, 3, 2}. для rep[0] = 0, 0, 0, rep[1](для единицы) = 0, 2, 1, rep[2] = 2, 1, 1. И так далее...потом находим минимумы, то есть для rep[0] = 0, rep[1](для единицы) = 0, rep[2] = 1, в итоге выводим {2}.

Но судя по картинке, нужно совсем другое.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.09.2013, 18:56
Привет! Вот еще темы с ответами:

Литература по дискретной математике - Дискретная математика
Подскажите литературу по дискретке, с математикой средние отношения не сказать что плохо или отлично)

Re: Книги по дискретной математике - Дискретная математика
Посоветуйте, что лучше купить Р. Хаггарти Дискретная математика для программистов или Рональд Л. Грэхем, Дональд Э. Кнут, Орен Паташник...

Задания по дискретной математике - Delphi
Помогите, пожалуйста, решить задания. Решение является вывод ответа и визуализация данной задачи.

Задачник по дискретной математике - Дискретная математика
Посоветуйте пожалуйста хороший задачник по дискретной математике. Необходимо затронуть следующие темы: 1) Отношение эквивалентности...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
09.09.2013, 18:56
Ответ Создать тему
Опции темы

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