1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
| unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Grids;
type
TForm1 = class(TForm)
Memo1: TMemo;
Button2: TButton;
StringGrid1: TStringGrid;
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button2Click(Sender: TObject);
const
//Количество элементов в массиве А.
N = 5;
//Количество элементов в массиве Б.
M = 5;
//Количество элементов в массиве С.
H = N + M;
//Массив А.
Arr1 : array[1..N] of Integer = (1, 3, 5, 7, 9);
//Массив Б.
Arr2 : array[1..M] of Integer = (2, 4, 6, 8, 10);
var
//Массив С.
Arr3 : array[1..H] of Integer;
//Счётчики для циклов.
i, j, k : Integer;
//Флаг, показывающий произошла ли вставка элемента. Применяется при сборке результирующего массива.
IsInsert : Boolean;
//Строка - применяется в коде распечатки.
StrTmp : String;
//Актуальный размер массива С - число элементов перенесённых из массивов А и Б.
ActualLengthArr3 : Integer;
begin
//Очищаем Мемо.
Memo1.Clear;
//Распечатываем исходный массив А:
Memo1.Lines.Add('Исходный массив А:');
StrTmp := '';
for i := 1 to N do begin
if StrTmp <> '' then begin
StrTmp := StrTmp + Char(9);
end;
StrTmp := StrTmp + IntToStr(Arr1[i]);
end;
Memo1.Lines.Add(StrTmp);
//Распечатываем исходный массив Б:
Memo1.Lines.Add('Исходный массив Б:');
StrTmp := '';
for i := 1 to M do begin
if StrTmp <> '' then begin
StrTmp := StrTmp + Char(9);
end;
StrTmp := StrTmp + IntToStr(Arr2[i]);
end;
Memo1.Lines.Add(StrTmp);
//Решаем поставленную задачу.
//Составляем новый массив С из элементов массивов А и Б
//так, чтобы в массиве С сохранилась упорядоченность элементов по возрастанию.
//Переписываем в массив С все элементы массива Б.
for i := 1 to M do begin
Arr3[i] := Arr2[i];
end;
//Добавляем в массив С элементы массива А, так чтобы не нарушалась
//сортировка элементов по возрастанию.
ActualLengthArr3 := M; //= Length(Arr2) - т. к. мы только что перегрузили элементы массива Б в массив С.
for i := 1 to N do begin
//Инициализируем флаг значением "вставка не произошла".
IsInsert := False;
for j := 1 to ActualLengthArr3 do begin
if Arr1[i] < Arr3[j] then begin
//Если оказалось, что i-й элемент массива А меньше, чем j-й элемент массива С
//тогда вставляем элемент i-й элемента массива А в массив С на j-ю позицию.
//Но перед этим сдвигаем все элементы массива С с индексами j...ActualLengthArr3
//на одну позицию вправо.
for k := ActualLengthArr3 downto j do begin
Arr3[k + 1] := Arr3[k];
end;
//После сдвига записываем i-й элемент массива А на j-ю позицию массива С.
Arr3[j] := Arr1[i];
//Устанавливаем смысл флага в "вставка произошла".
IsInsert := True;
//Выходим из цикла.
Break;
end;
end;
//Если вставка не произошла, значит i-й элемент массива А больше всех
//значимых элементов массива С. В этом случае добавляем i-й элемент массива А
//в конец последовательности значимых элементов массива С - т. е. в вставляем
//в позицию ActualLengthArr3 + 1.
if not IsInsert then begin
Arr3[ActualLengthArr3 + 1] := Arr1[i];
end;
//Так как мы добавили в массив С новый элемент - значит, количество значимых
//элементов массива С увеличилось на единицу.
ActualLengthArr3 := ActualLengthArr3 + 1;
end;
//Распечатываем результирующий массив С:
Memo1.Lines.Add('Результирующий массив С:');
StrTmp := '';
for i := 1 to H do begin
if StrTmp <> '' then begin
StrTmp := StrTmp + Char(9);
end;
StrTmp := StrTmp + IntToStr(Arr3[i]);
end;
Memo1.Lines.Add(StrTmp);
end;
end. |