Меню

Главная

Статистика

 

 


Упражнение #1.

Информация из школьного классного журнала размещается в трехмерном массиве: внешние компоненты - это страницы журнала, "средние" компоненты - строки на странице, и наконец, "внутренние" компоненты - оценки в строке. Притом, каждая страница, помимо строк, содержит еще и ключевое символьное поле Page - название предмета. Соответственно, ключевое поле Name - фамилию ученика - имеют и страницы. Оцените размеры памяти, необходимые для хранения массива, если заданы количество страниц NumPage, число строк на каждой странице NumLine, количество оценок в каждой строке NumMark, а также длина символьных строк-названий, соответственно, Length(Name) и Length(Page).


Упражнение #2.

Придумайте, вернее - найдите, примеры из различных предметных областей, связанные с использованием массивов фиксированного размера, когда риск их переполнения фактической информацией вполне реален.

Вновь напомним, что в Главе D мы обсуждали, в том числе, возможность осуществления операций над структурой как целым и операций над ее элементами. Обработка массивов как единого целого алгоритмического интереса не представляет. Так что речь мы ведем исключительно о манипуляциях с отдельными компонентами.

В связи с этим, в качестве основного достоинства структуры массив, указана возможность прямого доступа к его элементам по индексу. Все выглядит замечательно, если предусматривается поочередное обращение к каждому элементу, независимо от его значения и связи с остальными компонентами. Решение поставленной в такой форме задачи реализуется самым простым вариантом алгоритма перебора.

Алгоритм E1-1
  • index¬left

  • обработкаMas[index]

  • index¬index + 1

  • if index>right then Exit

  • переход к шагу 2

где left и right, соответственно, индексы левого и правого элементов линейной развертки входного массива Mas.

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

Пример #1.

Разместить в ячейках вектора заданной длины N (пусть, для определенности, N=100) натуральные числа от 1 до N в обратном порядке. Учитывая возможность использовать конструкцию цикла с параметром языка паскаль, одним из возможных вариантов решения будет следующая процедура, непосредственно "переписанная" из приведенного выше алгоритма:

const N=100;
type
  index1 = 0..N-1;
  massive1 = array [index1] of byte;

procedure InitArray1 (var Mas: massive1);
var i: index1;
begin
  for i:= 0 to N-1 do
    Mas[i]:= N-i;
end;
                
type
  index1 = 0..N-1; {N > 1}
  Programmer = record of
    Name: string; Number: byte; Time: word
  end;
var Results = array [index1] of Programmer;
        
type
  index1 = 0..N-1; {N > 1}
  massive1 = array [index1] of item;

function Search2 (Mas: massive1;
  left, right: index; sample: item): boolean;
var l, r, middle: index1;
begin
  l := left; r:= right;
  while l<r do begin
    middle:= (l+r) div 2;
    if Mas[middle] < sample then l:= middle + 1
    else r := middle
  end;
  if M[l] = sample then Search2:= true
  else Search2:= false
end;
            
type
  index1 = 0..N-1; {N>1}
  massive1 = array [index1] of item;

procedure SelectionSort (var Mas: massive1);
var i: index1;
begin
  for i := (N-1) downto 1 do
    Swap(Mas[i], Mas[IndexMax(Mas,0,i)]);
end;

        


Упражнение #3.

Напишите процедуру инициализации линейного массива случайными числами из заданного интервала. Повторение значений в разных ячейках допускается.


Упражнение #4.

Напишите такую же процедуру, но теперь значения элементов не должны повторяться. К этой задаче мы еще вернемся.

Назад