Перейти к содержанию

Книга программиста/Обработка массивов в 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.