Книга программиста/Обработка массивов в 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.
Распаковка массива
правитьВводится массив, представляющий собой сжатие серий нулей и единиц, где каждый элемент обозначает количество элементов в очередной серии нулей или единиц. Но если первым элементом вводимого массива является 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.
Случайное большое число
править{Решение предложил: 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.