Другие языки программирования и технологии

Найти элементы, принадле-жащие и тому и другому массивам на C++

Значений элементам одномерного массива генерированы с помо-щью генератора случайных чисел. Даны два одномерных массива. Найти элементы, принадле-жащие и тому и другому массивам. Написать программу с использованием процедур и функций. Процедуру Init при решении задачи требуется использовать два раза с различными параметрами, процедуру Print — три раза. Где ошибка? Она не выводит элементы принадлежащие двум массивам. Программа написана на С++.
В третьих в "С" и его потомках индекс массивов начинается с 0
Илья Кушнов
Илья Кушнов
82 472
Лучший ответ
В четвертых Вы нигде не заполняете массив B вообще.
Значение j при первом проходе в solve не инициализировано => куда Вы там попадете при обращении B[j] никто не знает. Этот момент частично перекликается с первым ответом.

Глобальные массивы - ну зачем?

По-идее в init и print надо передавать указатель на массив и его размер,
в solve аналогично, но указателя уже 3. 2 на исходный массив, 3ий на результат

srand не используете для генерирования псевдослучайных чисел.

Если v и w это нижняя и верхняя граница у чисел, то она тоже сделана неправильно.

Короче почти всё переписывать.

P.S: Пересечение массивов (можно не только, но в примере они) в С++ set_intersection в STL
http://www.cplusplus.com/reference/algorithm/set_intersection/
Андрей Устинов Можно соревнование устроить, кто заставит этот код работать за наименьшее количество изменений.
Олег Румянцев Почитал по ссылке и вроде как set_intersection работает только на отсортированных массивах. Если массивы не отсортированные, то для выявления пересечения ИМХО можно было бы использовать map или еще что-то подобное.
Сергей Архипов Я за него перепишу и на свой лад, лишь бы сайт не делать.
Сергей Архипов Ничего себе дебаты тут у Вас.
Я ненавижу делать сайты и всё что с ними связано. Кто читает это, просьба - помолитесь, чтобы мне поручали писать только на C++ и никаких сайтов!

#include <iostream>
#include <windows.h>
#include <cstdlib>
#include <ctime>
#include <set>
#include <vector>
#include <algorithm>

using namespace std;

template<typename T>
void Print_(T v);

int main()
{
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
srand(time(0));
system("color 0A");

cout << "Введите длину массива 1 и 2 через пробел ";
size_t n1, n2;
cin >> n1 >> n2;
cout << "Введите левый и правый терминал генерируемых случайных чисел ";
int mi, ma;
cin >> mi >> ma;

auto Init = [&mi, &ma]()
{
return mi + rand() % (ma - mi + 1);
};

vector<int> v1(n1);
vector<int> v2(n2);
vector<int> v3;
generate(v1.begin(), v1.end(), Init);
generate(v2.begin(), v2.end(), Init);

cout << endl;
cout << "Содержание первого массива" << endl;
Print_(v1);
cout << "Содержание второго массива" << endl;
Print_(v2);
cout << endl;

set<int> s1(v1.begin(), v1.end());
set<int> s2(v2.begin(), v2.end());

set_intersection(s1.begin(), s1.end(), s2.begin(), s2.end(), back_inserter(v3));

cout << "Элементы, которые есть и в первом и во втором массиве" << endl;
Print_(v3);
cout << endl;

system("pause");
return 0;
}

template<typename T>
void Print_(T v)
{
for (const auto &t : v)
{
cout << t << " ";
}
cout << endl;
}
Булат Байбиков Будет правильней объявить и использовать шаблон не на typename а на class.
В функцию лучше передавать по ссылке на константу void Print_(const T &); чтобы избежать затратной операции копирования контейнеров.
Это я увидел после того, как код несколько раз перечитал.
Николай Теймуров Вопрос. Ваш set_intersection использует только сортированные массивы или любые?
чего-то не понял при залезании в ссылку http://www.cplusplus.com/reference/algorithm/set_intersection/
Во-первых, функция print в этом примере печатает элементы массива A. Всегда.
Во-вторых, в функции solve итерационные переменные i и g, а сравнение происходит A[ i ] и B[ j ]
Илья Петухов Благодарю

Похожие вопросы