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

Найти объединение двух множеств - C++

Восстановить пароль Регистрация
 
Erti86
0 / 0 / 0
Регистрация: 30.12.2015
Сообщений: 12
30.12.2015, 00:53     Найти объединение двух множеств #1
Необходимо найти объединение двух множеств, но программа некорректно выдает ответ.Не могу найти ошибку
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
#include<iostream>
#include<locale>
#include<fstream>
 
 
using namespace std;
 
const char inputfilename1[] = "input1.txt";
const char inputfilename2[] = "input2.txt";
const char outputFileName[] = "output.txt";
 
 
 
long long fs(int a, int b)
{
    
    ifstream inputFile1(inputfilename1);
    ifstream inputFile2(inputfilename2);
    ofstream fout(outputFileName);
    if (inputFile1.peek() == EOF) { cout << "Пустой входной файл!" << endl; return 0; }
    if (inputFile2.peek() == EOF) { cout << "Пустой входной файл!" << endl; return 0; }
    
    inputFile1 >> a;
    inputFile2 >> b;
    while (!inputFile1.eof() && !inputFile2.eof()){
        if (a > b){
            fout << b;
            inputFile2 >> b;
        }
        else{
            if (a < b){
                fout << a;
                inputFile1 >> a;
            }
            else{
                fout << a;
                if (inputFile1 >> a)
                inputFile2 >> b;
            }
        }
        
    }
    while (!inputFile1.eof()){
        inputFile1 >> a;
        fout << a;
 
    }
    while (!inputFile2.eof()){
 
        inputFile2 >> b;
        fout << b;
    }
    return 0;
}
 
 
int main(){
    ifstream inputFile1(inputfilename1);
    ifstream inputFile2(inputfilename2);
    ofstream fout(outputFileName);
    if (inputFile1.peek() == EOF) { cout << "Пустой входной файл!" << endl; return 0; }
    if (inputFile2.peek() == EOF) { cout << "Пустой входной файл!" << endl; return 0; }
    int a, b;
    //fout  inputFile2, inputFile2;
    inputFile1 >> a;
    inputFile2 >> b;
        fs(a,b);
        
        return 0;
    
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ПерС
366 / 282 / 84
Регистрация: 05.11.2013
Сообщений: 806
Записей в блоге: 5
Завершенные тесты: 1
30.12.2015, 08:46     Найти объединение двух множеств #2
Объединением множеств A и B называется множество элементов, принадлежащих, по крайней мере, одному из данных множеств (т. е. либо A, либо B, либо одновременно и A и B).
Вот прога не на плюсах, а на обычном Си, которая объединяет 2 множества-массива, может, поможет
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
#include <stdio.h>
#include <stdlib.h>
 
void delete_equal(int *n0, int *a) {
    //Удаляет из массива повторяющиеся элементы и вычисляет новую размерность n0
    int n = *n0;
    int i = 0;
    while (i<n) {
        int j = i + 1;
        while (j<n) {
            if (a[i] == a[j]) {
                for (int k = j; k<n - 1; k++) a[k] = a[k + 1];
                n--;
            }
            else j++;
        }
        i++;
    }
    *n0 = n;
}
 
int find_item(int na, int *a, int b) {
    //Ищет элемент b в массиве a[na] и возвращает его индекс или -1 (не найдено)
    for (int i = 0; i<na; i++) if (a[i] == b) return i;
    return -1;
}
 
int *copy_array(int n, int *a, int *c) {
    //Копирует массив a в новый массив c и возвращает указатель на него
    c = (int *)calloc(n, sizeof(int));
    if (c == NULL) return NULL;
    for (int i = 0; i<n; i++) c[i] = a[i];
    return &c[0];
}
 
int *union_array(int na, int *a, int nb, int *b, int *nc) {
    //Объединение массивов a и b с размерностями na и nb
    //в новый динамический массив (в массив войдут уникальные элементы,
    //присутствующие хотя бы в одном из массивов a,b)
    int *c=NULL, i, j;
    if (na<1) {
        if (nb<1) return NULL;
        else {
            delete_equal(&nb, b);
            return copy_array(nb, b, c);
        }
    }
    else if (nb<1) {
        delete_equal(&na, a);
        return copy_array(na, a, c);
    }
    delete_equal(&na, a);
    delete_equal(&nb, b);
    //Вычисляем количество разных элементов в 2 массивах
    int kc = 0;
    for (i = 0; i<na; i++) if (find_item(nb, b, a[i]) != -1) kc++;
    *nc = na + nb - kc;
    c = (int *)calloc(*nc, sizeof(int));
    if (c == NULL) return NULL;
    //Формируем массив c
    int k = 0;
    for (i = 0; i<na; i++) c[k++] = a[i];
    for (j = 0; j<nb; j++) if (find_item(na, a, b[j]) == -1) c[k++] = b[j];
    return c;
}
 
void print_array(int n, int *a) { //Выводит массив на экран
    printf("\n");
    for (int i = 0; i<n; i++) printf("%5d ", a[i]);
}
 
void wait() { //Ждет нажатия клавиши
    printf("\nPress a key to continue...");
    fflush(stdin); getchar();
}
 
const int na = 6, nb = 5; //Размерности массивов a,b
int a[na] = { 4, 4, 2, 5, 3, -1 },
b[nb] = { 2, 3, 4, 4, 1 };
//Описали множества как массивы
 
void main() {
    int nc;
    printf("\na=");
    print_array(na, a);
    printf("\nb=");
    print_array(nb, b);
    printf("\nUnion (a,b)=");
    int *c = union_array(na, a, nb, b, &nc);
    print_array(nc, c);
    wait();
}
sergei60
47 / 28 / 4
Регистрация: 10.06.2012
Сообщений: 334
31.12.2015, 17:41     Найти объединение двух множеств #3
Как перевести этот код в с++ особенно непонятна : printf("%5d ", a[i]);

Всех форумчан с Новым Годом! Здоровья .радости ,любви!

Добавлено через 3 часа 15 минут
ПерС,

Добавлено через 43 минуты
в объединении наших введенных по условию множеств должно быть две 4ки. ,а в выводе программы только одна 4. ?
Scorpik1
 Аватар для Scorpik1
7 / 7 / 4
Регистрация: 27.07.2011
Сообщений: 29
31.12.2015, 17:47     Найти объединение двух множеств #4
Цитата Сообщение от sergei60 Посмотреть сообщение
Как перевести этот код в с++ особенно непонятна : printf("%5d ", a[i]);
printf - печать
%5d – вывод целого числа в 5 позициях
a[i] - непосредственно числа из масcива

В с++ аналогичная запись : cout << setw(5) << a[i]; Единственное, что придется подключить библиотеку <iomanip> и setw(5) выведет всего 5 символов числа.( т.е если число будет 123456, то выведется только 12345)
Hikari
Хитрая блондиночка $)
 Аватар для Hikari
1337 / 900 / 272
Регистрация: 21.12.2015
Сообщений: 3,608
31.12.2015, 18:38     Найти объединение двух множеств #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
38
39
40
41
42
43
44
45
46
// а.cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h"
#include <iostream>
using namespace std;
 
 
class TSett{
private:
    int *a;
public:
    int Size;
    TSett(int n){
        a=new int[n]; 
        Size=n; 
        for(int i=0;i<Size;i++) 
            a[i]=rand()%100;
    };
    ~TSett(){/*delete a;*/};
    void List(){ 
        for(int i=0;i<Size;i++){
            cout.width(5);cout<<a[i];
        } 
        cout<<endl;
    };
    friend TSett operator + (const TSett &x,const TSett &y){
        TSett Result(x.Size+y.Size);
        int j=0;
        for(int i=0;i<x.Size;i++) Result.a[j++]=x.a[i];
        for(int i=0;i<y.Size;i++) Result.a[j++]=y.a[i];
        return Result;
    }
};
 
int _tmain(int argc, _TCHAR* argv[])
{
    TSett a(5),b(8);
    TSett c=a+b;
    a.List();
    b.List();
    c.List();
    
    cin.get();
    return 0;
}
Это набросок, прошу не чаять в нем особых надежд. Но думаю на вопрос темы он дает ответ
sergei60
47 / 28 / 4
Регистрация: 10.06.2012
Сообщений: 334
31.12.2015, 19:41     Найти объединение двух множеств #6
Hikari, Hikari, чисто механически чтобы были не только плюсики но и линуксики я убрал #include "stdafx.h" и преобразовал int _tmain(int argc, _TCHAR* argv[]) в int main() . Все работает ,но хотелось бы теоретического объяснения этому преобразованию.
castorsky
 Аватар для castorsky
1948 / 1038 / 78
Регистрация: 29.11.2013
Сообщений: 3,262
31.12.2015, 19:43     Найти объединение двух множеств #7
Цитата Сообщение от Hikari Посмотреть сообщение
Внесу и я пять коп, раз уж попросили плюсики
плюсики не знают никаких _tmain'ов и TCHAR'ов. А тем более stdafx.h.
Hikari
Хитрая блондиночка $)
 Аватар для Hikari
1337 / 900 / 272
Регистрация: 21.12.2015
Сообщений: 3,608
31.12.2015, 19:56     Найти объединение двух множеств #8
Цитата Сообщение от castorsky Посмотреть сообщение
плюсики не знают никаких _tmain'ов и TCHAR'ов. А тем более stdafx.h.
Это уже придирки
Цитата Сообщение от sergei60 Посмотреть сообщение
хотелось бы теоретического объяснения этому преобразованию.
Ну... В классе переопределен оператор +, которые принимает два аргумента (аргумент перед знаком и аргумент после). Переопределение "создает" новый экземпляр класса, в котором увеличен контейнер (массив) ровно на столько, сколько весят два массива, участвующие в выражении, и двумя циклами данные объеденены из двух массивов в один.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.12.2015, 19:57     Найти объединение двух множеств
Еще ссылки по теме:

Найти сумму (объединение) множеств Assembler
C (СИ) Объединение двух множеств
Найти объединение, пересечение и разницу множеств

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

Или воспользуйтесь поиском по форуму:
castorsky
 Аватар для castorsky
1948 / 1038 / 78
Регистрация: 29.11.2013
Сообщений: 3,262
31.12.2015, 19:57     Найти объединение двух множеств #9
Hikari, ну пусть придирки, однако факт остается фактом. Это не плюсики, а M$ зависимый код.
Yandex
Объявления
31.12.2015, 19:57     Найти объединение двух множеств
Ответ Создать тему
Опции темы

Текущее время: 05:34. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru