@tkachuk2222

Как записать из двох массивов одинаковые значения в третий?

задание:
есть два массива, записать одинаковые значения в третий
у меня вроде как записываются, но виводится "мусорные значения"
вот мой код
#include <iostream>
#include <time.h>
using namespace std;

void main()
{
	const int size = 10;
	int massA[size], massB[size],massC[size];
	srand(time(NULL));
	for (int i = 0; i < size; i++)
	{
		massA[i] = rand() % 10;
		cout << massA[i] << " ";
	}
	cout << endl;
	for (int i = 0; i < size; i++)
	{
		massB[i] = rand() % 10;
		cout << massB[i] << " ";
	}
	cout << endl << "spil'ni elementy:" << endl;
	for (int j=0, i = 0, z=0; i < size,j<size,z<size; i++,j++,z++)
	{
		if (massA[i] == massB[j]) {
			massC[z] = massA[i];
			cout << massC[z] << " ";
		}
	}
	cout << endl;
	system("pause");
}


когда на начале для massC[size] присваиваю {0,0,0,0,0,0,0,0,0,0} - то в конце выводятся нули
по логике вроде бы все окей, но не работает должным образом
помогите плиз
а то от этой заминки с мусорными значениями не могу дальше продолжать делать задания
  • Вопрос задан
  • 931 просмотр
Решения вопроса 1
@Alexander1705
Посмотрите вниметельней на этот код:
for (int j=0, i = 0, z=0; i < size,j<size,z<size; i++,j++,z++)
{
    if (massA[i] == massB[j]) {
        massC[z] = massA[i];
        cout << massC[z] << " ";
    }
}

Думаю, вы не понимаете, как работает for. Вы присваиваете трём переменным одинаковое значение и одновременно увеличиваете каждый на единицу. Всё равно, что вы написали бы следующее:
for (int i = 0; i < size; ++i)
{
    if (massA[i] == massB[i]) {
        massC[i] = massA[i];
        cout << massC[i] << " ";
    }
}

Согласитесь, это не имеет смысла. Чтобы сделать то, что вы задумали, нужно разместить один цикл внутри другого:
int k = 0;
for (int j = 0; i < size; ++i)
{
    for (int j = 0; j < size; ++i)
    {
        if (A[i] == B[j])
        {
            // Здесь можно сделать так:
            C[k] = A[i];
            ++k;

            // или одной строчкой
            // C[k++] = A[i]
        }
    }
}

Но заметьте, что у такого алгоритма будет один недостаток: если в одном массиве два одинаковых элемента, и в другом два таких же, в новом массиве их будет четыре. В более общем случае, если в одном массиве a одинаковых элементов, а в другом b таких же, в результате вы получите a*b таких элементов, что также может вызвать переполнение вашего массива.

Вообще странно, что ваш пример скомпилировался. Должно быть, вы используете устаревший компилятор. В C++ функция main должна возвращать int. Использование void приводит к ошибке:
main.cpp:1:11: error: ‘::main’ must return ‘int’


Так же обратите внимание, что если используете в C++ заголовочные файлы языка C, их принято называть с префиксом c и без расширения .h
#include <ctime>
А вообще, в C++ есть random.

Также никогда не используйте system("pause"); функция system, приостанавливает вашу программу, и запускает указанную в аргументе. Люди которые не используют Windows, не смогут запустить ваш код, потому что у них нет программы pause.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@saltydogd
1. Одинаковые значения - это равенство по значению и позиции? в указанной реализации кажется, что так, но мы то знаем...
2. massC[z] == massA[i]; это операция сравнения с неиспользующимся результатом - уместнее присвоение
3. Для сравнения и поиска одинаковых элементов потребуется вложенный цикл, скорее всего, друже
Ответ написан
@SiZen72
1. В вашем варианте сравниваются только значения, стоящие на одинаковых позициях, и записываются в такую же позицию в 3-ий массив. Это к вопросу необходимо ли искать одинаковые только по значению или одинаковые по значению и позиции.
2. Так как массив по сути указатель на некоторое количество ячеек памяти, то без его инициализации при обращению к какому-либо элементу будет возвращено значение хранящееся в данной ячейке. И в случае отсутствия инициализации нет никаких гарантий, что в данной ячейке не будет мусорных данных, что происходит практически в 100%.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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