Решение №10 из главы 15.Напишите программу, которая заполняет массив из 10 элементов случайными числами

Задача №10 из главы 15

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

program pascal_random_array_unique;
type b = array[1..10] of integer; // секция обьявления типов

{ функция заполнения массива }
function filling_array( min, max : integer ) : b;
  var  count, i, j, l, number : integer; // секция обьявления переменных
      arr : b;
begin  // начало тела функции
  count := 0;
  l := 1;
  j := 0;
  randomize; // вызов процедуры
  while( count < 10 ) do  // пока меньше 10
  begin
    j := 0;
    number := random( max - (min + 1) + min ) ; // случайные числа
    if( arr[1] = 0 ) then  // если значение элемента массива с индексом 1 равно 0
    begin
      arr[1] := number; // присваиваем значение
      count += 1; // увеличиваем счетчик
    end
    else
    begin
      for i := low( arr ) to high( arr ) do // обходим массив
      begin
        if( arr[i] <> number ) then // если значение массива не равно значению random
        begin
          j += 1; // считаем длинну
          if( j = high( arr ) ) then  // если длинна равна длинне массива
          begin
            l += 1; // увеличиваем индекс элемента массива
            arr[l] := number; // значение массива равно значению random
            count += 1; // увеличиваем счетчик
          end;
        end;
      end;
    end;
  end;
  filling_array := arr; // возвращаем значение функции
end; // завершение тела функции

procedure print_result ( arr : b ); // процедура вывода
   var i : integer;
begin // начало тела процедуры
for i := low( arr ) to high( arr ) do
begin
  writeln( arr[i], ' ' ); // вывод значений
end;
end; // завершение тела процедуры

var number1, number2 : integer;
    result_arr : b;
begin // начало основной программы
   writeln( 'input min and max' );
   readln( number1, number2 ); // считывание min и max значения 
   result_arr := filling_array( number1, number2 );
   print_result ( result_arr ); // вызов процедуры
   readln(); // удержание консоли
end. // завершение  основной программы








vedro-compota's picture

Проверить ситуацию

5 // random
1|0|0|0|0|0|0
6 // random
5|?|0|0|0|0|6

-- второе число, если не совпадает с первым, должно попасть во вторую ячейку.

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

vedro-compota's picture

2) проверить код на выполнимость.

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

program pascal_random_array_unique;
type b = array[1..10] of integer; // секция обьявления типов
 
{ функция заполнения массива }
function filling_array( min, max : integer ) : b;
  var  count, i, j, l, number : integer; // секция обьявления переменных
      arr : b;
begin  // начало тела функции
  count := 0;
  l := 0;
  j := 0;
  randomize; // вызов процедуры
  while( count < 10 ) do  // пока меньше 10
  begin
    j := 0; // при каждом проходе делаем равным  нулю счетчик сравнения длинны 
    number := random( max - (min + 1) + min ) ; // случайные числa
    write( number, ' ' ); // вывод для предварительного просмотра
    for i := low( arr ) to high( arr ) do // обходим массив
    begin
      if( arr[i] <> number ) then // если значение массива не равно значению random
      begin
        j += 1; // считаем длинну
        if( j = high( arr ) ) then  // если длинна равна длинне массива
        begin
          l += 1; // увеличиваем индекс элемента массива
          arr[l] := number; // значение массива равно значению random
          count += 1; // увеличиваем счетчик
        end;
      end;
    end;
  end;
  filling_array := arr; // возвращаем значение функции
end; // завершение тела функции
 
procedure print_result ( arr : b ); // процедура вывода
   var i : integer;
begin // начало тела процедуры
writeln();
  for i := low( arr ) to high( arr ) do
  begin
    write( arr[i], ' ' ); // вывод значений
  end;
end; // завершение тела процедуры
 
var number1, number2 : integer;
    result_arr : b;
begin // начало основной программы
   writeln( 'input min and max' );
   readln( number1, number2 ); // считывание min и max значения 
   result_arr := filling_array( number1, number2 );
   print_result ( result_arr ); // вызов процедуры
   readln(); // удержание консоли
end. // завершение  основной программы
vedro-compota's picture

нужна оптимизация:

  1. ведь заранее известен номер позиции, в которой будет записан новый элемент (в случае если окажется уникальным)
  2. если элемент не уникален, текущий перебор проверки надо остановить, и перейти к следующему числу

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

program pascal_random_array_unique;
type b = array[1..10] of integer; // секция обьявления типов
  
{ функция заполнения массива }
function filling_array( min, max : integer ) : b;
  var  count, i, j, l, k, number : integer; // секция обьявления переменных
      arr : b;
begin  // начало тела функции
  count := 0;
  l := 1;
  j := 0;
  k := 1;
  randomize; // вызов процедуры
  while( count < 10 ) do  // пока меньше 10
  begin
    number := random( max - (min + 1) + min ) ; // случайные числa
    write( number, ' ' ); // вывод для предварительного просмотра
    j := 0;
    for i := low( arr ) to k do // обходим массив
    begin
      if( arr[i] <> number ) then // если значение массива не равно значению random
      begin
          j += 1; // увеличиваем индекс 
          if( j = k ) then
          begin
            arr[l] := number; // значение массива равно значению random
            l += 1; // увеличиваем индекс массива
            count += 1; // увеличиваем счетчик элементов
            k += 1; // увеличиваем счетчик цикла for
          end;
      end
      else
        break;
    end;
  end;
  filling_array := arr; // возвращаем значение функции
end; // завершение тела функции
  
procedure print_result ( arr : b ); // процедура вывода
   var i : integer;
begin // начало тела процедуры
writeln();
  for i := low( arr ) to high( arr ) do
  begin
    write( arr[i], ' ' ); // вывод значений
  end;
end; // завершение тела процедуры
  
var number1, number2 : integer;
    result_arr : b;
begin // начало основной программы
   writeln( 'input min and max' );
   readln( number1, number2 ); // считывание min и max значения 
   result_arr := filling_array( number1, number2 );
   print_result ( result_arr ); // вызов процедуры
   readln(); // удержание консоли
end. // завершение  основной программы
vedro-compota's picture

объяснить назначение переменных:

 
j += 1; // увеличиваем индекс 
 l += 1; //
 

-- если подозрение, что они "дублируют" счетчик i и что без них можно обойтись.

И ещё:

  count += 1; // увеличиваем счетчик элементов
            k += 1; // увеличиваем счетчик цикла for

-- подозрительно синхронно увеличиваются, не дублируют ли они друг друга?

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

program pascal_random_array_unique;
type b = array[1..10] of integer; // секция обьявления типов
   
{ функция заполнения массива }
function filling_array( min, max : integer ) : b;
  var  count, i, j, k, number : integer; // секция обьявления переменных
      arr : b;
begin  // начало тела функции
  count := 0;
  k := 1;
  randomize; // вызов процедуры
  while( count < 10 ) do  // пока меньше 10
  begin
    number := random( max - (min + 1) + min ) ; // случайные числa
    write( number, ' ' ); // вывод для предварительного просмотра
    j := 0; // счетчик длинны массива
    for i := low( arr ) to k do // обходим массив
    begin
      if( arr[i] <> number ) then // если значение массива не равно значению random
      begin
          j += 1; // увеличиваем индекс счетчика длинны массива
          if( j = k ) then
          begin
            count += 1; // увеличиваем счетчик элементов
            k += 1; // увеличиваем счетчик цикла for 
            arr[count] := number; // значение массива равно значению random
          end;
      end
      else
        break;
    end;
  end;
  filling_array := arr; // возвращаем значение функции
end; // завершение тела функции
   
procedure print_result ( arr : b ); // процедура вывода
   var i : integer;
begin // начало тела процедуры
writeln();
  for i := low( arr ) to high( arr ) do
  begin
    write( arr[i], ' ' ); // вывод значений
  end;
end; // завершение тела процедуры
   
var number1, number2 : integer;
    result_arr : b;
begin // начало основной программы
   writeln( 'input min and max' );
   readln( number1, number2 ); // считывание min и max значения 
   result_arr := filling_array( number1, number2 );
   print_result ( result_arr ); // вызов процедуры
   readln(); // удержание консоли
end. // завершение  основной программы
vedro-compota's picture

можно обойтись без переменной k

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