Задание 7 Урок 15

Задание 7 Урок 15

Заполните массив целых чисел (длиной 8 элементов) случайными значениями от -5 до 5.
Сохраните все неотрицательные числа первого массива во второй массив
и выведете этот второй массив на экран (если количество сохраненных чисел во втором массиве меньше, чем его длина, то выведете только их, не обходя неинициализированные яйчейки).

program Project1;
type
  type_for_the_array = array[0..7] of integer;
var counter_array,min,max,high_of_the_array: integer;
  first_array: type_for_the_array;
procedure print_array(copyArray: type_for_the_array; highOfTheArray: integer);
var auxiliary_array: array[0..7] of integer;// второй массив
  counter_auxiliary_array, counter_first_array: integer;
begin
  counter_auxiliary_array := 0;
  for counter_first_array := low(copyArray) to high(copyArray) do
    if  copyArray[counter_first_array] > 0 then
      begin
       auxiliary_array[counter_auxiliary_array]:=copyArray[counter_first_array];
       counter_auxiliary_array += 1;
      end;
  for counter_auxiliary_array :=low(auxiliary_array) to highOfTheArray do
      writeln(auxiliary_array[counter_auxiliary_array]);
end;
begin
  high_of_the_array := 0;
  min := -5;
  max := 5;
  randomize;
  for  counter_array := low(first_array) to high(first_array) do
    begin
      first_array[counter_array] := min + random(max - min + 1);
      if first_array[counter_array] > 0 then
      high_of_the_array += 1;
    end;
  print_array(first_array,high_of_the_array);
  readln();
end. 
2
3
3
2
2
0
vedro-compota's picture

добавить полные распечатки массивов

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

При объявлении массива либо же переменной в процедуре могут появляться следующие значения:

copyArray: Длина=8: {  0,   0,   38394,   1,   0,   0,   0,   0}

При использовании переменной counter_auxiliary_array без инициализации ячейка 0 (ноль)
второго массива auxiliary_array остаётся неинициализированной.
В результате, при выведении массива, значение этой ячейки может быть равно 0 (нулю) или же рандомному значению подобному значению из окна отладки указанному выше.
Также подобные значения проявляются и в конечном значении массива при неверном использовании переменной-счетчика. Т.к. конечное значение этой переменной на +1 выше номера ячейки массива:

auxiliary_array[counter_auxiliary_array]:=copyArray[counter_first_array];
       counter_auxiliary_array += 1;

Сначала инициализируется ячейка с текущим значением счетчика, а за тем значение счетчика увеличивается на 1.

Далее следуют два исправленных варианта кода

с процедурой

type
  type_for_the_array = array[0..7] of integer;
var i,min,max: integer;
  first_array: type_for_the_array;
procedure print_array(copyArray: type_for_the_array);{copyArray - имеется
в виду копия первого массива}
var g, i: integer;
  auxiliary_array: type_for_the_array;// второй массив
begin
  g := 0;// счетчик второго массива
  for i := low(copyArray) to high(copyArray) do
    if  copyArray[i] > 0 then // обход первого массива для инициализации второго
      begin
       auxiliary_array[g]:=copyArray[i];// инициализация второго массива
       g += 1;
      end;
  write('Второй массив: ');// вывод второго массива
  for i :=low(auxiliary_array) to (g-1) do
      write(auxiliary_array[i], ' ');
end;
begin
  min := -5;
  max := 5;
  randomize;
  for  i := low(first_array) to high(first_array) do
    begin
      first_array[i] := min + random(max - min + 1);{обход первого массива и
      инициализация его рандомными значениями}
    end;
  write('Первый массив:');// вывод первого массива
  for  i := low(first_array) to high(first_array) do
    write(first_array[i], ' ');
  writeln();
  print_array(first_array);// вывод второго массива через процедуру
  readln();
end.                   

без процедуры

type
  type_for_the_array = array[0..7] of integer;
var i,min,max,high_of_the_array: integer;
  first_array,second_array: type_for_the_array;
begin
  high_of_the_array := 0;// номер последней заполненной ячейки массива 2
  min := -5;// мин. значение рандома
  max := 5;// макс значение рандома
  randomize;
  for  i := low(first_array) to high(first_array) do
    begin
      first_array[i] := min + random(max - min + 1);// обход и инициализация м1
      if first_array[i] > 0 then
        begin
          second_array[high_of_the_array] := first_array[i];// инициал. м2
          high_of_the_array += 1;// счетчик второго массива
        end
    end;
  writeln('Первый массив: ');// вывод первого массива
  for i := low(first_array) to high(first_array) do
    write(first_array[i], ' ');
  writeln();

  if high_of_the_array = 0 then
    write('Значения всех ячеек первого массива отрицательные!!!'){проверка
    первого массива на наличие положительных значений}
  else
    begin
      writeln('Второй массив: ');
      for i := low(second_array) to (high_of_the_array-1) do{вывод второго масс}
        write(second_array[i], ' ');
      end;
  readln();
end. 
vedro-compota's picture

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

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