Найти разницу между массивами - C (СИ)
Формулировка задачи:
Допустим есть два массива целых чисел:
Числа упорядочены по возрастанию. Известно также количество элементов в том и в другом массиве.
Нужно найти элементы, которые добавились. То есть в приведенном выше примере должны быть выведены числа 121 и 122, потому что их нет в массиве n1.
int n1[] = {1, 12, 123, 1234};
int n2[] = {1, 12, 121, 122, 123, 1234};Решение задачи: «Найти разницу между массивами»
textual
Листинг программы
#include <stdio.h>
void array_sdiff(FILE* _out,
const int* f1, const int* l1,
const int* f2, const int* l2){
while((f1 != l1) && (f2 != l2)){
if(*f1 < *f2)
fprintf(_out, "%d ", *f1++);
else if(*f1 > *f2)
fprintf(_out, "%d ", *f2++);
else {
++f1;
++f2;
}
}
while(f1 != l1)
fprintf(_out, "%d ", *f1++);
while(f2 != l2)
fprintf(_out, "%d ", *f2++);
}
int main(void){
int n1[] = {1, 12, 123, 1234};
int n2[] = {1, 12, 121, 122, 123, 1234};
array_sdiff(stdout, n1, n1 + sizeof(n1)/sizeof(n1[0]),
n2, n2 + sizeof(n2)/sizeof(n2[0]));
return 0;
}
Объяснение кода листинга программы
- В данном коде реализуется функция
array_sdiff, которая вычисляет разность между двумя массивами целых чисел. - Функция принимает в качестве аргументов:
- указатель на файл, в который будет выводиться результат (по умолчанию это stdout).
- указатели на начало и конец первого массива.
- указатели на начало и конец второго массива.
- Внутри функции используется два вложенных цикла
while, которые выполняются до тех пор, пока не будут выполнены два условия:f1иf2не станут равнымиl1иl2соответственно (т.е. пока не будут пройдены все элементы массивов).- значение текущего элемента массива
f1не станет меньше значения текущего элемента массиваf2(т.е. пока элементы не будут увеличиваться).
- Если выполняется первое условие, то выводится значение текущего элемента массива
f1(илиf2, если условие не выполняется), после чегоf1иf2инкрементируются на 1. - Если выполняется второе условие, то выводится значение текущего элемента массива
f2(илиf1, если условие не выполняется), после чегоf1иf2инкрементируются на 1. - Если оба условия не выполняются, то значения текущих элементов массивов сравниваются. Если значение
f1меньше значенияf2, то выводится значениеf1, после чегоf1иf2инкрементируются на 1. Если значениеf1больше значенияf2, то выводится значениеf2, после чегоf1иf2инкрементируются на 1. Если значения равны, то оба указателя инкрементируются на 1 без вывода значения. - После выхода из вложенных циклов, функция продолжает работу и выводит все оставшиеся элементы первого массива, а затем все оставшиеся элементы второго массива.
- В функции
mainсоздаются два массива целых чисел:n1иn2. - Затем вызывается функция
array_sdiffс указанием вывода в stdout и указателями на начало и конец обоих массивов. - В конце функции возвращается 0, что означает успешное выполнение программы.