Урок 15. Задача 17.

Урок 15. Задача 17.

Дан массив длиной N (где 10≤N В качестве ответа (если отрезок найден) получите его начальный и конечных индекс - m и p ( 1≤m

Указание: Проверку массива на соответствие условиям задачи вынести в подпрограмму (процедуру, которая вычислит нужные индексы, если есть)
Подсказка: можно использовать функцию проверки отрезка в массиве из предыдущей задачи.

type newArr = array [1..100] of integer;
var i, m, p, F, F_F, k :integer;
    Arr_N :newArr;
    fl :boolean;

function random_array(Arr_N :newArr) :newArr;
var i, a :integer;
begin
  randomize;
  a := 10 + random(90); // длина массива
  for i := 1 to a do
  begin
    if i < a then
      Arr_N[i] := random(100) // инициализация исходного массива
    else
      Arr_N[i] := -1; // граница используемых значений
  end;
  random_array := Arr_N;
end;

function count_array(Arr_N :newArr) :integer;
var i, j :integer;
begin
  j := 0;
  for i := low(Arr_N) to high(Arr_N) do
  begin
    if Arr_N[i] = -1 then
      break;
    j := j + 1;
  end;
  count_array := j;
end;

function segment_array(A_n :newArr; k, F :integer) :boolean;
var i, j :integer;
      fl :boolean;
begin
  fl := false;
  for i := 0 to k do
  begin
    for j := 1 to f do
      if A_n[j] = i then
      begin
        fl := true;
        break;
      end;
    if not fl then
      break;
  end;
  segment_array := fl;
end;

procedure segment_index(A_n :newArr; k, F, m, p :integer);
var i, j :integer;
begin
  for i := 1 to F do
    for j := 0 to k do
      if A_n[i] = j then
      begin
        if j > m then

      end;
end;

begin
  fl := true;
  Arr_N := random_array(Arr_N); // массив
  F := count_array(Arr_N); // количество задействованных элементов массива
  writeln(F);
  for i := low(Arr_N) to high(Arr_N) do
    write(Arr_N[i], ' ');
  k := F div 8; // конец отрезка
  //F_F := k + 1;
  fl := segment_array(Arr_N, k, F);
  writeln(fl, ' ', k);

  readln();
end.
vedro-compota's picture

можно сделать длину массива = 15 и решать просто с фиксированной длиной

_____________
матфак вгу и остальная классика =)

type newArr = array [1..99] of integer;
var k, F :integer;
    Arr :newArr;
    fl :boolean;

function random_array() :newArr; // создаем массив
var i :integer;
    Arr_N :newArr;
begin
  randomize;
  for i := 1 to 99 do
    Arr_N[i] := random(100);
  random_array := Arr_N;
end;

function num_in(F :integer; Arr :newArr) :boolean; // ищем отрезок
var i, j, k :integer;
    fl :boolean;
begin
  k := F - 1; // отрезок
  for i := 0 to k do
  begin
    fl := false;
    for j:= low(Arr) to high(Arr) do
      if i = Arr[j] then
      begin
        fl := true;
        break;
      end;
    if not fl then
      break;
  end;
  num_in := fl;
end;

procedure index_F(F :integer; Arr :newArr);
var i, j, m, p :integer;
    fl : boolean;
begin
  fl := true;
  k := F - 1;
  m := high(Arr);
  p := low(Arr);
  for i := 0 to k do
    for j := low(Arr) to high(Arr) do
    begin
      if (i = Arr[j]) and (j < m) then
        m := j;
      if (i = Arr[j]) and (j > p) then
        p := j;
    end;
  write('m = ', m, ' p = ', p);
end;

begin
  F := 3;
  Arr := random_array();
  //for i := low(Arr) to high(Arr) do
    //write(Arr[i], ' ');
  fl := num_in(F, Arr);
  if fl then
    index_F(F, Arr);
  readln();
end. 
vedro-compota's picture

Основная подпрограмма здесь скорее всего должна:

  1. Быть процедурой - т.к. нужно будет принимать значения по ссылке
  2. m и p принимать по ссылке, по ссылке принимать какой-то флаг, по которому станет ясно - найдено ли значение или нет
  3. также просто по значению принимать массив и заданное числа f и k

_____________
матфак вгу и остальная классика =)

type newArr = array [1..99] of integer;
var k, F, m, p :integer;
    Arr :newArr;
    fl :boolean;

function random_array() :newArr; // создаем массив
var i :integer;
    Arr_N :newArr;
begin
  randomize;
  for i := 1 to 99 do
    Arr_N[i] := random(100);
  random_array := Arr_N;
end;

function num_in(F :integer; Arr :newArr) :boolean; // ищем отрезок
var i, j, k :integer;
    fl :boolean;
begin
  k := F - 1; // отрезок
  for i := 0 to k do
  begin
    fl := false;
    for j:= low(Arr) to high(Arr) do
      if i = Arr[j] then
      begin
        fl := true;
        break;
      end;
    if not fl then
      break;
  end;
  num_in := fl;
end;

procedure index_F(var fl :boolean; var m, p :integer; k :integer; Arr :newArr);
var i, j:integer;

begin
  if fl then
  begin
    for i := 0 to k do
      for j := low(Arr) to high(Arr) do
      begin
        if (i = Arr[j]) and (j < m) then
          m := j;
        if (i = Arr[j]) and (j > p) then
          p := j;
      end;
    write('m = ', m, ' p = ', p);
  end
  else
    write('Emptiness');
end;

begin
  F := 3;
  fl := true;
  Arr := random_array();
  fl := num_in(F, Arr);
  k := F - 1;
  m := high(Arr);
  p := low(Arr);
  index_F(fl, m, p, k, Arr);
  readln();
end. 
vedro-compota's picture

Идея: использовать в основной процедуре ранее написанную (из задачи 16) функцию, которая уметь проверять отрезок (см. предыдущую задачу), передавая ей границы очередного отрезка, который надо проверить

1 [2] 0 4 5 [9] 2 3

- напр. тут я выделил отрезок f=5 m=2 p=6

_____________
матфак вгу и остальная классика =)

type newArr = array [1..99] of integer;
var k, F, m, p :integer;
    Arr :newArr;
    fl :boolean;

function random_array() :newArr; // создаем массив
var i :integer;
    Arr_N :newArr;
begin
  randomize;
  for i := 1 to 99 do
    Arr_N[i] := random(4);
  random_array := Arr_N;
end;

function num_in(var m, p :integer; var fl :boolean; k :integer; Arr :newArr) :boolean;
var i, j :integer;
begin
  for i := 0 to k do
  begin
    fl := false;
    for j:= m to p do
      if i = Arr[j] then
      begin
        fl := true;
        break;
      end;
    if not fl then
      break;
  end;
  num_in := fl;
end;

function len_num(m, p :integer) :integer;
var i, j :integer;
begin
  j := 0;
  for i := m to p do
    j := j + 1;
  len_num := j;
end;

procedure index_F(var m, p :integer; var fl :boolean; k :integer; Arr :newArr);
var i, j :integer;
begin
  fl := num_in(m, p, fl, k, Arr);
  if fl then
    write('m = ', m, ' p = ', p)
  else
    write('Emptiness');
end;

begin
  fl := true;
  Arr := random_array();
  randomize;
  p := 9;
  m := p div 2;
  k := len_num(m, p) div 2;
  index_F(m, p, fl, k, Arr);
  readln();
end. 
vedro-compota's picture

Идея: использовать в основной процедуре ранее написанную (из задачи 16) функцию, которая уметь проверять отрезок (см. предыдущую задачу, можно целиком без изменений взять функцию num_in() отсюда), передавая ей границы очередного отрезка, который надо проверить

1 [2] 0 4 5 [9] 2 3

- напр. тут я выделил отрезок f=5 m=2 p=6

_____________
матфак вгу и остальная классика =)

type newArr = array [1..99] of integer;
var k, F, m, p :integer;
    Arr :newArr;
    fl :boolean;

function random_array() :newArr; // создаем массив
var i :integer;
    Arr_N :newArr;
begin
  randomize;
  for i := 1 to 99 do
    Arr_N[i] := random(7);
  random_array := Arr_N;
end;

function num_in(m, p, k :integer; Arr :newArr) :boolean;
var i, j :integer;
    fl :boolean;
begin
  for i := 0 to k do
  begin
    fl := false;
    for j:= m to p do
      if i = Arr[j] then
      begin
        fl := true;
        break;
      end;
    if not fl then
      break;
  end;
  num_in := fl;
end;

procedure index_F(var m, p :integer; var fl :boolean; k, F :integer; Arr :newArr);
var i :integer;
begin
  m := 1;
  p := F;
  for i := low(Arr) to (high(Arr) - F) do
  begin
    fl := num_in(m, p, k, Arr);
    if fl then
    begin
      writeln('m = ', m, ' ', 'p = ', p);
      break;
    end
    else
    begin
      m := m + 1;
      p := p + 1;
    end;
  end;
end;

begin
  Arr := random_array();
  fl := false;
  F := 7;
  k := F - 4;
  index_F(m, p, fl, k, F, Arr);
  if not fl then
    writeln('No');
  readln();
end.
vedro-compota's picture

засчитано

_____________
матфак вгу и остальная классика =)