1) Динамический массив.
Объявляется так:
VAR a: POINTER TO ARRAY OF INTEGER;
Создается на заданное количество элементов так:
NEW(a, 150).
LEN(a) возвращает длину массива, а LEN(a)-1 соответственно номер его последнего элемента. Циклы надо писать с использованием "до LEN-1", это грамотно.
Удалять массив не надо, в ББ сборщик мусора, который сам его уничтожит потом.
2) Ввод данных.
А как Вы хотите получать данные от пользователя? Для учебных и "числомолотильных" задачек обычно используется модуль In (посмотрите его документацию). Он считывает данные из выделенного в момент запуска вашей программы куска текста.
Пример ввода:
## Код:
```
VAR a: POINTER TO ARRAY OF INTEGER;
      i, n: INTEGER;
BEGIN
  n := 0;
  In.Open;
  (* Считаем количество элементов в выделенном фрагменте *)
  In.Int(i);
  WHILE In.Done DO (* Пока считывается успешно *)
    INC(n);   
    In.Int(x)
  END;
  (* создаем массив на посчитанное количество элементов *)
  NEW(a, n);
  (* Повторно считываем фрагмент - теперь уже запоминая в массиве *)
  In.Open;
  FOR i := 0 TO LEN(a)-1 DO
    In.Int(a[i])
  END
```
