§26 ГДЗ Семакин 10 класс (Информатика)
2. Как можно вычислять целые случайные числа в диапазоне от -50 до 0?
3. Как можно вычислять вещественные случайные числа в диапазоне от 2,5 до 10?
4. Даны два вектора{xi}, {yi}, i = 1, …, 10, упорядоченные по возрастанию. Соедините их в один вектор {z1}, i = 1, …, 20 так, чтобы сохранилась упорядоченность.
5. Дан массив, состоящий из 100 целых чисел. Выведите все числа, которые встречаются в этом массиве:
а) несколько раз;
б) только по одному разу.
6. В целочисленной матрице размером 10 х 10 найдите максимальное значение и индексы всех элементов, равных ему.
7. Матрицу размером 5 х 10 заполните случайными двоичными цифрами (0 и 1). Определите номер строки с наибольшим количеством нулей.
8. В двоичной матрице размером 10 х 10 (см. задание 7) найдите совпадающие строки.
1. Массив можно заполнять двумя основными способами: вводом с клавиатуры и случайными числами.
2. Чтобы получить целые случайные числа от $$-50$$ до $$0$$, можно использовать выражение:
$$-50 + \text{Random}(51)$$
Так как $$\text{Random}(51)$$ даёт целое число от $$0$$ до $$50$$.
3. Чтобы получить вещественные случайные числа от $$2{,}5$$ до $$10$$, можно использовать:
$$2{,}5 + \text{Random}(7{,}5)$$
4. Чтобы объединить два упорядоченных вектора в один упорядоченный, нужно идти по ним двумя указателями и каждый раз брать меньший из текущих элементов, а затем дописывать оставшиеся элементы.
program test;
begin
var a := ArrRandomInteger(10); a.Sort;
var b := ArrRandomInteger(10); b.Sort;
var c := new integer[20];
writeln(‘Array 1:’); a.println;
writeln(‘Array 2:’); b.println;
var i := 0;
var j := 0;
var k := 0;
while (i < 10) and (j < 10) do
begin
if a[i] < b[j] then
begin
c[k] := a[i];
i := i + 1;
end
else
begin
c[k] := b[j];
j := j + 1;
end;
k := k + 1;
end;
while i < 10 do
begin
c[k] := a[i];
i := i + 1;
k := k + 1;
end;
while j < 10 do
begin
c[k] := b[j];
j := j + 1;
k := k + 1;
end;
writeln(‘Merged array:’); c.println;
end.
5. Чтобы вывести числа, встречающиеся в массиве несколько раз, удобно сначала отсортировать массив, а затем сравнивать соседние элементы. Для чисел, встречающихся только один раз, проверяем, что они не равны соседям.
var
a: array[1..100] of integer;
i, j: integer;
procedure swap(var x, y: integer);
var t: integer;
begin
t := x;
x := y;
y := t;
end;
begin
for i := 1 to 100 do a[i] := random(100);
for j := 1 to 99 do
for i := 1 to 100 — j do
if a[i] > a[i + 1] then swap(a[i], a[i + 1]);
for i := 2 to 99 do
if (a[i] = a[i + 1]) or (a[i] = a[i — 1]) then writeln(‘a[‘, i, ‘]=’, a[i]);
end.
Для пункта б) достаточно вывести элементы, у которых нет равных соседей:
var
a: array[1..100] of integer;
i, j: integer;
procedure swap(var x, y: integer);
var t: integer;
begin
t := x;
x := y;
y := t;
end;
begin
for i := 1 to 100 do a[i] := random(100);
for j := 1 to 99 do
for i := 1 to 100 — j do
if a[i] > a[i + 1] then swap(a[i], a[i + 1]);
if a[1] <> a[2] then writeln(‘a[1]=’, a[1]);
for i := 2 to 99 do
if (a[i] <> a[i + 1]) and (a[i] <> a[i — 1]) then writeln(‘a[‘, i, ‘]=’, a[i]);
if a[100] <> a[99] then writeln(‘a[100]=’, a[100]);
end.
6. В матрице нужно сначала найти максимальный элемент, а затем вывести все его координаты.
program Test;
var
ar: array[1..10, 1..10] of integer;
i, j, max, count: integer;
begin
count := 1;
max := 0;
randomize;
for i := 1 to 10 do
begin
for j := 1 to 10 do
begin
ar[i, j] := random(10) + 1;
if (j mod 10 = 0) then writeln(ar[i, j]) else write(ar[i, j], ‘ ‘);
if ar[i, j] > max then max := ar[i, j];
end;
end;
for i := 1 to 10 do
for j := 1 to 10 do
if ar[i, j] = max then
begin
writeln(‘Индекс ‘, count, ‘ элемента = ‘, i, ‘ ‘, j);
inc(count);
end;
end.
7. Для каждой строки считаем количество нулей и запоминаем номер строки с наибольшим их числом.
program Test;
var
x: array[1..5, 1..10] of integer;
i, j, max, t, st: integer;
begin
writeln(‘Матрица:’);
for i := 1 to 5 do
begin
for j := 1 to 10 do
begin
x[i, j] := random(2);
if x[i, j] = 0 then inc(t);
write(x[i, j]:2);
end;
if t > max then
begin
max := t;
st := i;
end;
t := 0;
writeln;
end;
writeln(‘Строка с наиб. кол-вом нулей: ‘, st);
end.
8. Чтобы найти совпадающие строки в двоичной матрице, можно сравнивать каждую строку со всеми остальными и выводить одинаковые.
const
n = 10;
var
ms: array[1..n] of string;
t: string;
i, j: integer;
f: Text;
begin
Assign(f, ‘in.txt’); Reset(f);
for i := 1 to n do Readln(f, ms[i]);
Close(f);
Writeln(‘*** Бинарная матрица ***’);
for i := 1 to n do Writeln(ms[i]);
Writeln(‘Совпадающие строки’);
for i := 1 to n — 1 do
for j := i + 1 to n do
if ms[i] = ms[j] then
Writeln(‘Строки ‘, i, ‘ и ‘, j, ‘ совпадают’);
end.
Ответ
1. Вводом с клавиатуры и случайными числами.
2. $$-50 + \text{Random}(51)$$.
3. $$2{,}5 + \text{Random}(7{,}5)$$.
4. Объединение двух упорядоченных векторов выполняется методом двух указателей.
5. Для поиска повторяющихся и уникальных чисел массив нужно отсортировать и сравнивать соседние элементы.
6. Сначала находится максимум, затем выводятся все его индексы.
7. Номер строки с наибольшим количеством нулей определяется по подсчёту нулей в каждой строке.
8. Совпадающие строки находятся попарным сравнением строк матрицы.