C++ написать проверку на то, входит ли первый массив во второй и наоборот. массивы вводит пользователь.
Ответы на вопрос:
#include <iostream>
#include <Windows.h> //локализация
using namespace std;
int main()
{
SetConsoleCP(1251); //локализация
SetConsoleOutputCP(1251);
short size{};
cout << "Введите размер массивов: ";
cin >> size;
int* arrA = new int[size];
int* arrB = new int[size];
cout << "\nВведите элементы первого массива:\n";
for (int i = 0; i < size; i++)
cin >> arrA[i];
cout << "\nВведите элементы второго массива:\n";
for (int i = 0; i < size; i++)
cin >> arrB[i];
for (int i = 0; i < size; i++)
{
for (int j = 0; j < size; j++)
{
if (arrB[i] == arrA[j]) //если значение элемента в массиве B найдётся в массиве A
{
int numOfRepeatsA{}, numOfRepeatsB{};
for (int l = 0; l < size; l++) //подсчитываем количество повторений этих элементов
{
if (arrB[i] == arrB[l])
numOfRepeatsB++;
if (arrB[i] == arrA[l])
numOfRepeatsA++;
}
if (numOfRepeatsA == numOfRepeatsB) //если элемент повторяется в массиве A столько же раз, сколько и в массиве B
break; //переходим к проверке следующего элемента
else //иначе очищаем память и завершаем программу, т.к. если хотя бы 1 элемент не проверку == дальше проверять нет смысла
{
cout << "\nМассивы не входят друг в друга";
delete[] arrA;
delete[] arrB;
return 0;
}
}
}
}
cout << "\nМассивы входят друг в друга"; //если в цикле программа не завершилась, значит ответ положительный
delete[] arrA;
delete[] arrB;
return 0;
}
Основное действие оставил функцией, так как проще потом осуществлять вызов в зависимости от того, какой массив больше
ответ (вариант исполнения 1):
#include <iostream>
using namespace std;
bool IsInclude(int* Find, int* Suorce, int sizeFind, int sizeSuorce);
int main()
{
int *A, *B, NA, NB;
setlocale(LC_ALL, "rus");
bool result;
cout << "Введите количество элементов первого массива: ";
cin >> NA;
A = new int[NA];
cout << "Введите элементы массива: " << endl;;
for (int i = 0; i < NA; i++) { cout << "A["<< i << "] = "; cin >> A[i]; }
cout << "Введите количество элементов второго массива: ";
cin >> NB;
B = new int[NB];
cout << "Введите элементы массива: " << endl;;
for (int i = 0; i < NB; i++) { cout << "B[" << i << "] = "; cin >> B[i]; }
//Тепеь смотрим какой массив длиннее и в зависимости от этого запускаем функцию по разному
if (NA > NB)
{
result = IsInclude(B, A, NB, NA);
if (result) cout << "Массив B входит в массив A";
else cout << "Массив B не входит в массив A";
}
else {
result = IsInclude(A, B, NA, NB);
if (result) cout << "Массив A входит в массив B";
else cout << "Массив A не входит в массив B";
}
delete[] A;
delete[] B;
return 0;
}
bool IsInclude(int* Find, int* Suorce, int sizeFind , int sizeSuorce)
{
int CountInSuorce, CountInFind;
for (int i = 0; i < sizeFind; i++) { // Перебираем по одному все элементы меньшего массива
CountInSuorce = 0;
CountInFind = 0;
for (int j = 0; j < sizeSuorce; j++)
{
if (Find[i] == Find[j] && j < sizeFind) CountInFind++; // Считаем сколько раз элемент искомого массива находится в нём самом
if (Find[i] == Suorce[j]) CountInSuorce++; // Считаем сколько раз элемент искомого массива встретился в большем массиве
}
if (CountInFind > CountInSuorce) return false;// Если счётчик элементов в искомом массиве оказался больше чем в большем массиве, значит выходим и дальше не имеет смысла искать
}
return true;// Если счётчики большего массива были всегда не меньше счетчика искомого массива, то мы попадём сюда и меньший массив можно составить из элементов большего
}
ответ (вариант исполнения 2):
#include <iostream>
using namespace std;
int IsInclude(int* First, int FirstCount, int* Second, int SecondCount);
int main()
{
int* A, * B, NA, NB;
setlocale(LC_ALL, "rus");
int result;
cout << "Введите количество элементов первого массива: ";
cin >> NA;
A = new int[NA];
cout << "Введите элементы массива: " << endl;;
for (int i = 0; i < NA; i++) { cout << "A[" << i << "] = "; cin >> A[i]; }
cout << "Введите количество элементов второго массива: ";
cin >> NB;
B = new int[NB];
cout << "Введите элементы массива: " << endl;
for (int i = 0; i < NB; i++) { cout << "B[" << i << "] = "; cin >> B[i]; }
result = IsInclude(A, NA, B, NB);
switch (result) {
case 0: {cout << "Массивы A и B не входят друг в друга"; break; }
case 1: {cout << "Массивы A и B имеют одинаковые элементы"; break; }
case 2: {cout << "Массив A входит в массив B"; break; }
case 3: {cout << "Массив B входит в массив A"; break; }
}
delete[] A;
delete[] B;
return 0;
}
int IsInclude(int* First, int FirstCount, int* Second, int SecondCount) // возвращаем 0 если массив не входид в другой, 1 если они одинаковые, 2 если первый входит во второй, 3 если второй входит в первый
{
int *Source, * Find, sizeSource, sizeFind, CountInSource, CountInFind;
bool Equal; // Флаг того что элементы одинаковые
bool AandB = FirstCount > SecondCount;
if(AandB)
{
Source = First;
sizeSource = FirstCount;
Find = Second;
sizeFind = SecondCount;
}
else
{
Find = First;
sizeFind = FirstCount;
Source = Second;
sizeSource = SecondCount;
}
if (sizeFind == sizeSource) Equal = true;
else Equal = false;
for (int i = 0; i < sizeFind; i++) { // Перебираем по одному все элементы меньшего массива
CountInSource = 0;
CountInFind = 0;
for (int j = 0; j < sizeSource; j++)
{
if (Find[i] == Find[j] && j < sizeFind) CountInFind++; // Считаем сколько раз элемент искомого массива находится в нём самом
if (Find[i] == Source[j]) CountInSource++; // Считаем сколько раз элемент искомого массива встретился в большем массиве
}
if (CountInFind > CountInSource) return 0;// Если счётчик элементов в искомом массиве оказался больше чем в большем массиве, значит выходим и дальше не имеет смысла искать
if (CountInFind != CountInSource) Equal = false; // Если количество в искомом и большом получилось различное, то сбрасываем флаг
}
// Если счётчики большего массива были всегда не меньше счетчика искомого массива, то мы попадём сюда и меньший массив можно составить из элементов большего
if (Equal) return 1; // если флаг не сброшен, то возврвщаем 1
if (!Equal && AandB) return 3; // если флаг не сброшен, то возврвщаем 1
else return 2;
}
Реши свою проблему, спроси otvet5GPT
-
Быстро
Мгновенный ответ на твой вопрос -
Точно
Бот обладает знаниями во всех сферах -
Бесплатно
Задай вопрос и получи ответ бесплатно
Популярно: Информатика
-
dolbaeb2k0020.06.2023 10:18
-
ДинислаМММ21.04.2021 08:04
-
turkeev9021.03.2023 09:11
-
jonlir13.01.2022 05:05
-
FedorShar2829.01.2022 16:57
-
idrisovsa03.03.2020 07:24
-
mozg3722.05.2020 11:16
-
Miky1415.06.2023 08:45
-
Мир666ад01.05.2020 20:57
-
igorzarubin200608.06.2022 17:59
Есть вопросы?
-
Как otvet5GPT работает?
otvet5GPT использует большую языковую модель вместе с базой данных GPT для обеспечения высококачественных образовательных результатов. otvet5GPT действует как доступный академический ресурс вне класса. -
Сколько это стоит?
Проект находиться на стадии тестирования и все услуги бесплатны. -
Могу ли я использовать otvet5GPT в школе?
Конечно! Нейросеть может помочь вам делать конспекты лекций, придумывать идеи в классе и многое другое! -
В чем отличия от ChatGPT?
otvet5GPT черпает академические источники из собственной базы данных и предназначен специально для студентов. otvet5GPT также адаптируется к вашему стилю письма, предоставляя ряд образовательных инструментов, предназначенных для улучшения обучения.