@mumus

Как найти разницу между соседними элементами массива?

Есть ассоциативный массив.
Надо вычислить разницу между соседними элементами массива, причем разницу перезаписать в текущую ячейку. Нужно как бы на каждом последующем шаге брать из предыдущего значение и вычитать разницу и записывать в текущий шаг, притом, что нужно сохранить текущее значение до изменения, чтобы можно было разницу в следующем шаге сделать и так до конца. Первый элемент не считаем.

8e35f57a6d0b47b7a5b785c3a8da760f.jpg
  • Вопрос задан
  • 396 просмотров
Решения вопроса 1
<?php
$a = array(
    array(
        "year" => 0,
        "serial" => 0
    ),
    array(
        "year" => 0,
        "serial" => 13000
    ),
    array(
        "year" => 0,
        "serial" => 13640
    ),
    array(
        "year" => 0,
        "serial" => 14280
    )
);

$prev = $a[0]['serial'];

for($i = 1; $i < count($a); $i++) {

    $diff = $a[$i]['serial'] - $prev;
    $prev = $a[$i]['serial'];
    $a[$i]['serial'] = $diff;
}
print_r($a);

Результат
Array
(
    [0] => Array
        (
            [year] => 0
            [serial] => 0
        )

    [1] => Array
        (
            [year] => 0
            [serial] => 13000
        )

    [2] => Array
        (
            [year] => 0
            [serial] => 640
        )

    [3] => Array
        (
            [year] => 0
            [serial] => 640
        )

)

Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@prishelec
Извиняюсь что на Pascal, но задача была в свое время по нем:
Дана числовая матрица M*N. Сохранив без изменения элементы крайних строк и столбцов таблицы, замените каждый внутренний элемент средним арифметическим четырех соседних с ним элементов (сверху, снизу, слева, справа).(Без использования вспомогательного массива).
Решение через рекурсию (принцип работы такой как вам нужен. ...притом, что нужно сохранить текущее значение до изменения, чтобы можно было разницу в следующем шаге сделать и так до конца. ):

program Ex_18;

uses Crt;

const
   Row = 5;
   Col = 5;

var
   Arr: array [1..Row,1..Col] of Real;
   i,j: Integer;

procedure SimpleAverage(a, b: Integer);
var
   Average: Real;
begin
   if b = Col then
   begin
      a :=a+1;
      b := 2;
   end;

   Average := (Arr[a-1,b]+Arr[a,b-1]+Arr[a+1,b]+Arr[a,b+1]) / 4;

   if not ((b=2) and (a=5)) then
   begin
      SimpleAverage(a,b+1);
      Arr[a,b] := Average;
   end;
end;

procedure Print(a,b: Integer);
begin
   if (a in [1,5]) or (b in [1,5]) then
      TextAttr := 4
   else
      TextAttr := 2;
   Write(' ',Arr[a,b]:3:2);
end;

begin
   ClrScr;
   randomize;

   for i := 1 to Row do
   begin
      for j := 1 to Col do
      begin
         Arr[i,j] := random(10) + 10;
         Print(i,j);
      end;
      WriteLn;
   end;

   WriteLn;

   i := 2;
   j := 2;
   SimpleAverage(i,j);

   for i := 1 to Row do
   begin
      for j := 1 to Col do
      begin
         Print(i,j);
      end;
      WriteLn;
   end;

   ReadKey;
end.
Ответ написан
Ваш ответ на вопрос

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

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