Книга программиста/Обработка массивов в PascalABC.Net

К оглавлению | Назад | Вперёд

Все программы, код которых выложен здесь, являются работоспособными. На момент написания программ использовалась среда PascalABC.Net 3.0.

Вывод значений массива по спирали править

Частный случай править

Вывести на экран значения массива по спирали. Будем понимать под этим следующее. Если массив состоит из 100 элементов, то выводить по 10 элементов в каждой строке, при этом каждая вторая строка должна выводиться "задом наперед": сначала последние элементы строки, а затем первые.

const
  N = 99;
  Indent = 4;

var
  A: array [0..N] of integer;
  IsReversed: boolean;

begin
  for var i := 0 to N do
    A[i] := i;
  
  IsReversed := true;
  for var i := 0 to (N + 1) div 10 - 1 do
  begin
    if IsReversed then
      for var j := i * 10 to i * 10 + 9 do
        Write(A[j]:Indent)
    else
      for var j := i * 10 + 9 downto i * 10 do
        Write(A[j]:Indent);
    Writeln();
    IsReversed := not IsReversed;
  end;
  
  Readln();
end.

Обобщенный вариант править

const
  N = 100;
  Step = 5;
  Indent = 5;

var
  A: array [0..N - 1] of integer;
  IsReversed: boolean;

begin
  for var i := 0 to N - 1 do
    A[i] := i;
  
  IsReversed := false;
  for var i := 1 to N div Step do
  begin
    if not IsReversed then
      for var j := (i - 1) * Step to i * Step - 1 do
        Write(A[j]:Indent)
    else
      for var j := i * Step - 1 downto (i - 1) * Step do
        Write(A[j]:Indent);
    Writeln();
    IsReversed := not IsReversed;
  end;
end.

Исключение одинаковых элементов массива править

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

const
  N = 10;
  Indent = 3;

var
  A: array [0..N - 1] of integer;
  Exists: array [0..N - 1] of boolean;

begin
  for var i := 0 to N - 1 do
  begin
    A[i] := Random(10);
    Exists[i] := true;
  end;
  
  Write('Изначальный массив:');
  for var i := 0 to N - 1 do
    Write(A[i]:Indent);
  
  for var i := 0 to N - 1 do
    if Exists[i] then
      for var j := i + 1 to N - 1 do
        if A[j] = A[i] then Exists[j] := false;
  
  Writeln();
  
  Write('Изменённый массив:');
  for var i := 0 to N - 1 do
    if Exists[i] then
      Write(A[i]:Indent);
  
  Readln();
end.
const
  N = 10;

var
  A: array [0..N - 1] of integer;
  Multiplicity: set of integer;

begin
  for var i := 0 to N - 1 do
  begin
    A[i] := Random(10);
    Include(Multiplicity, A[i]);
  end;
  
  WriteLn(A);
  WriteLn(Multiplicity);
  Readln();
end.

Смотрите также: реализация на Python.

Распаковка массива править

Вводится массив, представляющий собой сжатие серий нулей и единиц, где каждый элемент обозначает количество элементов в очередной серии нулей или единиц. Но если первым элементом вводимого массива является 0, значит первая серия распакованного массива - единицы. Например:

  • массив [2, 3] распаковывается как 00111,
  • массив [0, 4, 1, 2] распаковывается как 1111011.

Требуется написать программу распаковки вводимого массива.

const
  N = 10;

var
  A: array [0..N] of integer;
  IsZero: boolean;

begin
  for var i := 0 to N do
    A[i] := Random(10);
  
  if A[0] = 0 then IsZero := false else IsZero := true;
  
  for var i := 0 to N do
  begin
    for var j := 0 to A[i] - 1 do
      if IsZero then Write(1) else Write(0);
    IsZero := not IsZero;
  end;
  
  Readln();
end.

Совершенные числа править

Число совершенно, если оно равно сумме всех своих делителей, кроме самого себя. Пример: 6 = 1 + 2 + 3. Найдите все совершенные числа от 1 до 1000 и выведите их на экран. Подсказка: вам необходимо найти все делители от 1 до исследуемого числа. Делителем числа называется число, которое делит данное без остатка (a mod b = 0).

const
  N = 1000;

var
  S: integer;
  L: List<integer>;

begin
  L := new List<integer>();
  
  for var a := 1 to N do
  begin
    S := 0;
    for var k := 1 to a - 1 do
      if a mod k = 0 then S += k;
    if S = a then
      L.Add(a);
  end;
  
  for var i := 0 to L.Count - 1 do
    if i < L.Count - 1 then WriteFormat('{0}, ', L[i]) else WriteLnFormat('{0}.', L[i]);
end.

Смотрите также: реализация на Python.

Случайное большое число править

{Решение предложил: http://www.cyberforum.ru/members/203668.html}
uses System.Security.Cryptography;
 
function Rnd(): BigInteger;
begin
  var a := new byte[8];
  (new RNGCryptoServiceProvider()).GetBytes(a);
  Result := new BigInteger(a);
end;
 
begin
  Writeln(Rnd);
end.