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

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

Напишите программу, которая будет заполнять массив из 10 элементов случайными числами из диапазона от 0 до 20, при этом в полученном массиве не должно быть одинаковых значений.

type myArr = array [1..10] of integer;
var a:myArr; i, min, max:integer;

function sravni(a:myArr; k:integer): boolean;
var l:integer;
begin
  for l:=1 to(k-1) do
  if a[k]=a[l] then
  begin
    result:=false;
    break;
  end
  else
    result:=true;
end;

begin
  randomize();
  min:=0;
  max:=20;

  for i:=low(a) to high(a) do
  begin
    repeat
      a[i]:= min+random(max-min+1);
      writeln(a[i]);
    until sravni(a,i);
  end;

  for i:=low(a) to high(a) do
     write(a[i],' ');
  readln();
end.                
vedro-compota's picture

  for l:=1 to(k-1) do
  if a[k]=a[l] then
  begin

нужен отступ внутри тела цикла

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

vedro-compota's picture


  for l:=1 to(k-1) do
  if a[k]=a[l] then
  begin
    result:=false;
    break;
  end
  else
    result:=true;

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

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

type myArr = array [1..10] of integer;
var a:myArr; i, min, max:integer;

function sravni(a:myArr; k:integer): boolean;
var l:integer;
begin
  result:=true;
  for l:=1 to(k-1) do
    if a[k]=a[l] then
    begin
      result:=false;
      break;
  end;
end;

begin
  randomize();
  min:=0;
  max:=20;

  for i:=low(a) to high(a) do
  begin
    repeat
      a[i]:= min+random(max-min+1);
      writeln(a[i]);
    until sravni(a,i);
  end;

  for i:=low(a) to high(a) do
     write(a[i],' ');
  readln();
end.           

type myArr = array [1..10] of integer;
var k: integer;

function sravni:myArr;
var a:myArr; i, l, min, max:integer;
begin
  randomize();
  min:=0;
  max:=20;
  a[low(a)]:=min+random(max-min+1);
  for i:=low(a) to high(a) do
  begin
    l:=0;
    repeat
      a[i]:= min+random(max-min+1);
       for l:=1 to(i-1) do
         if a[i]=a[l] then
           break;
     until (a[i]<>a[l]);
  end;
  result:=a;
end;


begin
 for k:=low(sravni) to high(sravni) do
    write(sravni[k], ' ');
 readln();
end.             
vedro-compota's picture

for i:=low(a) to high(a) do
  begin
    l:=0;
    repeat
      a[i]:= min+random(max-min+1);
      if i>1 then // можно вынести до цикла

-- тут можно оптимизировать код, чтобы не проверять каждый раз, небольшое дублирование, зато меньше проверок
см. подробности, в т.ч. с другими комментариями: https://youtu.be/BYx1b28OpQg

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

vedro-compota's picture

    repeat
      a[i]:= min+random(max-min+1);
      unik = true;
      if i>1 then
        for l:=1 to(i-1) do
          if a[i]=a[l] then
          begin;
            unik := false;
            break;
          end
     until(unik);

-- возможное использование флага

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