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

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

Напишите функцию, которая определяет являются ли значения переданного массива целых чисел уникальными относительно друг друга.
Протестируйте работу функции на массиве из 7 случайных элементов из диапазона от 1 до 15-ти.
Например для массива:


|1|5|4|5|6|7|8|

-- функция должна "сообщить", что он неуникальный

а для:

|1|15|4|5|6|7|8|

-- что уникальный.

type inArr = array[1..7] of Integer;

var a: array [1..7] of integer;
    L, i, min, max: integer;
    res: boolean;

function SS(x: inArr; L: integer): boolean;
var flag1, flag2: boolean;
    k: integer;
begin
  flag1 := false;
  flag2 := false;
  for k := 1 to L do  // цикл прохода в зависимости от длины массива (L)
    begin
      for i := low(x) to high(x) do
        begin
          if((x[k] = x[i]) and (i<>k)) then
            flag1 := true
          else
            flag2 := false;
        end;
    end;
  if(flag1) then
    result := true
  else
    result := false;
end;

begin
  min := 1;
  max := 15;
  randomize();
  for i := 1 to 7 do
    a[i] := random(max - min + 1) + min;
  for i := low(a) to high(a) do //цикл вывода на экран начального массива
    begin
      write(a[i], ' ');
      L := i; // узнаем длину массива для отправки в функцию.
    end;
  writeln();
  res := SS(a,L);
  if(res) then
    writeln('ne ynikalnii')
  else
    writeln('ynikalniy');
  readln();
end.
vedro-compota's picture

for k := 1 to L do  // цикл прохода в зависимости от длины массива (L)
    begin
      for i := low(x) to high(x) do
        begin
          if((x[k] = x[i]) and (i<>k)) then
            flag1 := true
          else
            flag2 := false;
        end;
    end;

Не нужен ли тут break?

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

type inArr = array[1..7] of Integer;

var a: array [1..7] of integer;
    L, i, min, max: integer;
    res: boolean;

function SS(x: inArr; L: integer): boolean;
var flag1, flag2: boolean;
    k: integer;
begin
  flag1 := false;
  flag2 := false;
  for k := 1 to L do  // цикл прохода в зависимости от длины массива (L)
    begin
      for i := low(x) to high(x) do
        begin
          if((x[k] = x[i]) and (i<>k)) then
            flag1 := true
          else
            begin
              flag2 := false;
              break;
            end;
        end;
    end;
  if(flag1) then
    result := true
  else
    result := false;
end;

begin
  min := 1;
  max := 15;
  randomize();
  for i := 1 to 7 do
    a[i] := random(max - min + 1) + min;
  for i := low(a) to high(a) do //цикл вывода на экран начального массива
    begin
      write(a[i], ' ');
      L := i; // узнаем длину массива для отправки в функцию.
    end;
  writeln();
  res := SS(a,L);
  if(res) then
    writeln('ne ynikalnii')
  else
    writeln('ynikalniy');
  readln();
end.    
vedro-compota's picture

if(flag1) then
    result := true
  else
    result := false;

--можно записать короче

  if((x[k] = x[i]) and (i<>k)) then
            flag1 := true
          else
            begin
              flag2 := false;
              break;
            end;
        end;

-- что-то странное

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

type inArr = array[1..7] of Integer;

var a: array [1..7] of integer;
    L, i, min, max: integer;
    res: boolean;

function SS(x: inArr; L: integer): boolean;
var flag1, flag2: boolean;
    k: integer;
begin
  flag1 := true;
  for k := 1 to L do  // цикл прохода в зависимости от длины массива (L)
    begin
      for i := low(x) to high(x) do
        begin
          if((x[k] = x[i]) and (i<>k)) then
            begin
              flag1 := false ;
              break;
            end;
        end;
    end;
  if(not flag1) then
    result := false;
end;

begin
  min := 1;
  max := 15;
  randomize();
  for i := 1 to 7 do
    a[i] := random(max - min + 1) + min;
  for i := low(a) to high(a) do //цикл вывода на экран начального массива
    begin
      write(a[i], ' ');
      L := i; // узнаем длину массива для отправки в функцию.
    end;
  writeln();
  res := SS(a,L);
  if(res) then
    writeln('ynikalnii')
  else
    writeln('ne ynikalniy');
  readln();
end.    
vedro-compota's picture

 if(not flag1) then
    result := false;

-- результат можно вернуть короче, проанализируйте зависимость

[статический анализ]

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

type inArr = array[1..7] of Integer;

var a: array [1..7] of integer;
    L, i, min, max: integer;
    res: boolean;

function SS(x: inArr; L: integer): boolean;
    k: integer;
begin
  flag1 := true;
  for k := 1 to L do  // цикл прохода в зависимости от длины массива (L)
    for i := low(x) to high(x) do
      if((x[k] = x[i]) and (i<>k)) then
        result := false; ;
end;

begin
  min := 1;
  max := 15;
  randomize();
  for i := 1 to 7 do
    a[i] := random(max - min + 1) + min;
  for i := low(a) to high(a) do //цикл вывода на экран начального массива
    begin
      write(a[i], ' ');
      L := i; // узнаем длину массива для отправки в функцию.
    end;
  writeln();
  res := SS(a,L);
  if(res) then
    writeln('ynikalnii')
  else
    writeln('ne ynikalniy');
  readln();
end.  
vedro-compota's picture

function SS(x: inArr; L: integer): boolean;
    k: integer;
begin
  flag1 := true;
  for k := 1 to L do  // цикл прохода в зависимости от длины массива (L)
    for i := low(x) to high(x) do
      if((x[k] = x[i]) and (i<>k)) then
        result := false; ;
  • 1) брейк в случае если уже всё ясно
  • 2) result определен не всегда

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

type inArr = array[1..7] of Integer;

var a: array [1..7] of integer;
    L, i, min, max: integer;

function SS(x: inArr; L: integer): boolean;
var   k: integer;
begin
  for k := 1 to L do  // цикл прохода в зависимости от длины массива (L)
    begin
      for i := low(x) to high(x) do
        if((x[k] = x[i]) and (i <> k)) then
          begin
            result:= false;
            break;
          end;
      if(not result) then
        break
      else
        result := true;
    end;
end;

begin
  min := 1;
  max := 15;
  randomize();
  for i := 1 to 7 do
    a[i] := random(max - min + 1) + min;
  for i := low(a) to high(a) do //цикл вывода на экран начального массива
    begin
      write(a[i], ' ');
      L := i; // узнаем длину массива для отправки в функцию.
    end;
  writeln();

  if(SS(a,L)) then
    writeln('ynikalnii')
  else
    writeln('ne ynikalniy');
  readln();
end.
vedro-compota's picture

решение засчитано

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