Урок 15 задача 10: Являются ли элементы массива уникальными - Обсуждение решения

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

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

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

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

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

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

program project1;

type newArr = array [1..7] of integer;
var numArr: newArr;
    i: integer;

procedure unicalArr(var promArr:newArr);
var x,y,flag:integer;
begin
  for x := 1 to 7 do
    for y := 1 to 7 do
    begin
      if((promArr[x]=promArr[y])and (x <> y))then
        flag:=1;
        break;
      end;
  if (flag=0)then
      write('уникален')
  else
    write('Не уникален');
end;
begin
  for i:=1 to 7 do
  begin
    write('Введите ',i,' элемент массива: '); readln(numArr[i]);
  end;
  for i:=1 to 7 do
  begin
    write(numArr[i],'|');
  end;
  writeln();
  unicalArr(numArr);
  writeln();
  readln();
end.                     
vedro-compota's picture

procedure unicalArr(var promArr:newArr);

--использовать функцию, которая возвращает boolean

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

program project1;

type newArr = array [1..7] of integer;
var numArr: newArr;
    i: integer;

function unicalArr(var promArr:newArr):boolean;
var x,y:integer;
    flag:boolean;
begin
  flag:=true;
  for x := 1 to 7 do
    for y := 1 to 7 do
    begin
      if((promArr[x]=promArr[y])and (x <> y))then
        flag:=false;
        result:=flag;
        break;
    end;
end;
begin
  for i:=1 to 7 do
  begin
    write('Введите ',i,' элемент массива: '); readln(numArr[i]);
  end;
  for i:=1 to 7 do
  begin
    write(numArr[i],'|');
  end;
  writeln();
  if (unicalArr(numArr))then
    write('уникален')
  else
    write('Не уникален');
  writeln();
  readln();
end. 
vedro-compota's picture

function unicalArr(var promArr:newArr):boolean;
var x,y:integer;
    flag:boolean;
begin
  flag:=true;
  for x := 1 to 7 do
    for y := 1 to 7 do
    begin
      if((promArr[x]=promArr[y])and (x <> y))then
        flag:=false;
        result:=flag;
        break;
    end;
end;

-- break; с первой же итерации цикла (не находится внутри условия)?

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

program project1;

type newArr = array [1..7] of integer;
var numArr: newArr;
    i: integer;

function unicalArr(var promArr:newArr):boolean;
var x,y:integer;
    flag:boolean;
begin
  flag:=true;
  for x := 1 to 7 do
    for y := 1 to 7 do
    begin
      if((promArr[x]=promArr[y])and (x <> y))then
      begin
        flag:=false;
        break;
      end;
      result:=flag;
      break;
    end;
end;
begin
  for i:=1 to 7 do
  begin
    write('Введите ',i,' элемент массива: '); readln(numArr[i]);
  end;
  for i:=1 to 7 do
  begin
    write(numArr[i],'|');
  end;
  writeln();

  if (unicalArr(numArr))then
      write('уникален')
  else
    write('Не уникален');
  writeln();
  readln();
end.  
vedro-compota's picture

  for x := 1 to 7 do
    for y := 1 to 7 do
    begin
      if((promArr[x]=promArr[y])and (x <> y))then
      begin
        flag:=false;
        break;
      end;
      result:=flag;
      break;
    end;

внешний цикл досрочно не завершается + просто так выходить из внешнего цикла тоже нельзя, нужно проверить некое условие

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

program project1;

type newArr = array [1..7] of integer;
var numArr: newArr;
    i: integer;

function unicalArr(var promArr:newArr):boolean;
var x,y:integer;
    flag:boolean;
begin
  flag:=false;
  for x := 1 to 7 do
  begin
    for y := 1 to 7 do
    begin
      if((promArr[x]=promArr[y])and (x <> y))then
      begin
        flag:=true;
        break;
      end;
      result:=flag;
    end;
    if(flag)then
      break;
  end;
end;
begin
  for i:=1 to 7 do
  begin
    write('Введите ',i,' элемент массива: '); readln(numArr[i]);
  end;
  for i:=1 to 7 do
  begin
    write(numArr[i],'|');
  end;
  writeln();
  if (unicalArr(numArr))then
      write('уникален')
  else
    write('Не уникален');
  writeln();
  readln();
end.   
vedro-compota's picture

1)

result:=flag;

-- сейчас будет присваиваться не всегда

2) Когдв unicalArr() возвращает true - что это значит?

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

если unicalArr()=true, то это означает, что массив не уникален.

program project1;

type newArr = array [1..7] of integer;
var numArr: newArr;
    i: integer;

function unicalArr(var promArr:newArr):boolean;
var x,y:integer;
    flag:boolean;
begin
  flag:=false;
  for x := 1 to 7 do
  begin
    for y := 1 to 7 do
    begin
      if((promArr[x]=promArr[y])and (x <> y))then
      begin
        flag:=true;
        break;
      end;
    end;
    if(flag)then
      break;
  end;
  result:=flag;
end;
begin
  for i:=1 to 7 do
  begin
    write('Введите ',i,' элемент массива: '); readln(numArr[i]);
  end;
  for i:=1 to 7 do
  begin
    write(numArr[i],'|');
  end;
  writeln();
  if (unicalArr(numArr))then
      write('Не уникален')
  else
      write('уникален');
  writeln();
  readln();
end.  
vedro-compota's picture

нужен неинвертированный вариант ответа на вопрос:
"Это массив уникален?"

unique(arr)
isUnique(arr)

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

program project1;

type newArr = array [1..7] of integer;
var numArr: newArr;
    i: integer;

function unicalArr(var promArr:newArr):boolean;
var x,y:integer;
    flag:boolean;
begin
  flag:=true;
  for x := 1 to 7 do
  begin
    for y := 1 to 7 do
    begin
      if((promArr[x]=promArr[y])and (x <> y))then
      begin
        flag:=false;
        break;
      end;
    end;
    if(not flag)then
      break;
  end;
  result:=flag;
end;
begin
  for i:=1 to 7 do
  begin
    write('Введите ',i,' элемент массива: '); readln(numArr[i]);
  end;
  for i:=1 to 7 do
  begin
    write(numArr[i],'|');
  end;
  writeln();
  if (unicalArr(numArr))then
      write('уникален')
  else
      write('Не уникален');
  writeln();
  readln();
end. 
vedro-compota's picture

засчитано

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