Oбработка одномерных числовых массивов
Составьте программу вычисления суммы элементов встречающихся только в одном из массивов A(N) или B(N).
Затем просмотрим массивы параллельно: на каждом шаге увеличиваем индекс в том массиве, чей элемент сейчас меньше, таким образом "отстающий" индекс будет всегда догонять "опережающий". Это позволит обнаружить все значения, присутствующие в обоих массивах. Остальные просуммируем.
Код:
program SumUnique;
const
N = 100;
type
A = array [1..N] of Real;
procedure Sort(var a : A);
var
{ TODO: переменные для сортировки }
begin
{ TODO: реализуйте любой алгоритм сортировки }
end;
var
a1, a2 : A;
i1, i2 : Integer;
sum, prev : Real;
begin
sum := 0.0;
{ TODO: реализуйте ввод исходных данных в массивы a1, a2 }
Sort(a1);
Sort(a2);
i1 := 1;
i2 := 1;
while (i1 <= N) and (i2 <= N) do
begin
if a1[i1] < a2[i2] then
begin
sum := sum + a1[i1];
inc(i1);
end
else if a2[i2] < a1[i1] then
begin
sum := sum + a2[i2];
inc(i2);
end
else
{ нашли неуникальное значение: a1[i1] = a2[i2] }
begin
prev := a1[i1];
inc(i1);
inc(i2);
{ пропускаем все такие значения }
while (i1 <= N) and (a1[i1] = prev) do
inc(i1);
while (i2 <= N) and (a2[i2] = prev) do
inc(i2);
end;
end;
{ один из массивов кончился, из второго нужно просуммировать остатки }
while i1 <= N do
begin
sum := sum + a1[i1];
inc(i1);
end;
while i2 <= N do
begin
sum := sum + a2[i2];
inc(i2);
end;
writeln('Sum = ', sum:4:2);
end.
const
N = 100;
type
A = array [1..N] of Real;
procedure Sort(var a : A);
var
{ TODO: переменные для сортировки }
begin
{ TODO: реализуйте любой алгоритм сортировки }
end;
var
a1, a2 : A;
i1, i2 : Integer;
sum, prev : Real;
begin
sum := 0.0;
{ TODO: реализуйте ввод исходных данных в массивы a1, a2 }
Sort(a1);
Sort(a2);
i1 := 1;
i2 := 1;
while (i1 <= N) and (i2 <= N) do
begin
if a1[i1] < a2[i2] then
begin
sum := sum + a1[i1];
inc(i1);
end
else if a2[i2] < a1[i1] then
begin
sum := sum + a2[i2];
inc(i2);
end
else
{ нашли неуникальное значение: a1[i1] = a2[i2] }
begin
prev := a1[i1];
inc(i1);
inc(i2);
{ пропускаем все такие значения }
while (i1 <= N) and (a1[i1] = prev) do
inc(i1);
while (i2 <= N) and (a2[i2] = prev) do
inc(i2);
end;
end;
{ один из массивов кончился, из второго нужно просуммировать остатки }
while i1 <= N do
begin
sum := sum + a1[i1];
inc(i1);
end;
while i2 <= N do
begin
sum := sum + a2[i2];
inc(i2);
end;
writeln('Sum = ', sum:4:2);
end.