Книга программиста/Обработка массивов в PascalABC.Net
К оглавлению | Назад | Вперёд
Все программы, код которых выложен здесь, являются работоспособными. На момент написания программ использовалась среда PascalABC.Net 3.0.
Вывод значений массива по спирали
[править]Частный случай
[править]Вывести на экран значения массива по спирали. Будем понимать под этим следующее. Если массив состоит из 100 элементов, то выводить по 10 элементов в каждой строке, при этом каждая вторая строка должна выводиться "задом наперед": сначала последние элементы строки, а затем первые.
- N - количество элементов массива
- Indent - количество символов, отводимое для вывода чисел
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.