Задача 18 Урок 15

Задача 18 Урок 15

Дан массив длиной N (не более 100 элементов). Проверить, что в нем в встречаются все числа от 0 до k, где 0≤k Указание: Проверку массива на соответствие условиям задачи вынести в подпрограмму (функцию).

type Arr=array [1..30] of integer;
var i, k, min, max:integer;
  a: Arr;

function proverka(b:arr; j:integer): boolean;
var m, p, i, f, z:integer;
begin
  m:=10;
  p:=20;
  z:=0;
  result:= false;
  for i:= m to p do
    for f:=1 to j do
    if b[i]=f then
    begin
      z+=1;
      if z=5 then
        result:= true;
      break;
    end;
end;

begin
  randomize();
  min:=1;
  max:=60;

  for i:=low(a) to high(a) do
  begin
    a[i]:= min+random(max-min+1);
    write(a[i],' ');
  end;
  a[10]:=0;
  {for i:=10 to 15 do    //посмотреть, что будет, если все числа найдутся
    a[i+1]:=a[i]+1;  }
  k:=5;
  if proverka(a,k) then
    writeln('da')
  else
    writeln('net');
  readln();
end.          
vedro-compota's picture


function proverka(b:arr; j:integer): boolean;
var m, p, i, f, z:integer;
begin
  m:=10;
  p:=20;
  z:=0;
  result:= false;
  for i:= m to p do
    for f:=1 to j do
    if b[i]=f then
    begin
      z+=1;
      if z=5 then
        result:= true;
      break;
    end;
end;

--
1) при обходе массива нет нужды использовать никакие начальные и конечных значения индексов, их можно получить динамически (low и high) в данном случае, судя по всему мы обходим не весь массив, очень похоже что это не правильный код

2) Если хотя бы одно из значений в массиве не встрелось - уже можно выходить из обоих циклов, дважды применив break

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

type Arr=array [1..30] of integer;
var i, k, min, max:integer;
  a: Arr;

function proverka(b:arr; j:integer): boolean;
var i, f:integer;
begin
  result:= true;

  for f:=1 to j do
  begin
    for i:= 1 to high(a) do
      if b[i]=f then
        break
      else if i=high(a) then
        result:= false;
    if result= false then
      break;
  end;
end;

begin
  randomize();
  min:=1;
  max:=60;

  for i:=low(a) to high(a) do
  begin
    a[i]:= min+random(max-min+1);
    write(a[i],' ');
  end;
  {a[10]:=0;
  for i:=10 to 15 do    //посмотреть, что будет, если все числа найдутся
    a[i+1]:=a[i]+1; }
  k:=5;
  if proverka(a,k) then
    writeln('da')
  else
    writeln('net');
  readln();
end.          

type Arr=array [1..30] of integer;
var i, k, min, max:integer;
  a: Arr;

function proverka(b:arr; j:integer): boolean;
var i, f:integer;
begin
  result:= true;

  for f:=1 to j do
  begin
    for i:= 1 to high(a) do
      if b[i]=f then
        break;
   if b[i]<>f then
    begin
      result:=false;
      break;
    end;
  end;
end;

begin
  randomize();
  min:=1;
  max:=60;

  for i:=low(a) to high(a) do
  begin
    a[i]:= min+random(max-min+1);
    write(a[i],' ');
  end;
 { a[10]:=0;
  for i:=10 to 15 do    //посмотреть, что будет, если все числа найдутся
    a[i+1]:=a[i]+1; }
  k:=5;
  if proverka(a,k) then
    writeln('da')
  else
    writeln('net');
  readln();
end.                               

false присваивается, когда внутренний цикл пройден

vedro-compota's picture

for i:= 1 to high(a) do
      if b[i]=f then
        break;
   if b[i]<>f then
    begin
      result:=false;

-- можно было бы сразу выставить флаг, и для втрого брейка использовать поверку флага, это бы сделало второе сравнение более просытам, пределагаю переписать именно функцию в этом ключе, остальное можно не дублировать

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