11 класс Информатика ГДЗ учебник Босова Параграф 8. Структурированные типы данных. Массивы — Глава 2. Алгоритмы и элементы программирования
Стр.116-119.
1) Примеры задач поиска информации в больших массивах
Решение. Поиск записи по ключу (ФИО/ID) в журнале; отбор всех покупок за дату; поиск минимальной/максимальной температуры в годовом массиве; нахождение медианы/квартилей; подсчёт частот значений (сколько раз встречается товар/оценка); поиск первого элемента, удовлетворяющего условию (например, > 1000); бинпоиск по отсортированному массиву.
2) Зачем уметь решать задачи «одним проходом»?
Решение. Однопроходные алгоритмы экономят время и память: данные читаются последовательно, без промежуточного хранения всего массива (потоковая обработка). Это критично для больших наборов данных, когда повторные проходы дороги (I/O) или невозможны.
3) Программа суммирования: что выведет, когда правильна, где ошибка?
|
1 2 3 4 5 6 7 8 9 10 11 12 |
Program summa; const n = 10; var a: array [1..n] of integer; s, i: integer; begin s := 0; for i := 1 to n do begin readln(a[i]); s := s + i; { ОШИБКА! } end; writeln('s=', s) end. |
- Что напечатает для ввода 1, −2, 3, −4, 5, −6, 7, −8, 9, −10?
Программа игнорирует значения массива и накапливает сумму индексов →1+2+…+10 = 55. Ответ: 55. - Когда даёт «правильную» сумму элементов? Если настоящая сумма элементов массива случайно равна 55. Пример массива:
[1,2,…,10]или любой набор чисел, суммой 55. - Ошибка и исправление. Должно быть
s := s + a[i].
4) Программа произведения: что выведет, когда правильна, где ошибка?
|
1 2 3 4 5 6 7 8 9 10 11 12 |
Program proizv; const n = 10; var a: array [1..n] of integer; p, i: integer; begin p := 0; { ОШИБКА! } for i := 1 to n do begin readln(a[i]); p := p * a[i]; end; writeln('p=', p) end. |
- Что напечатает для ввода 1, −2, 3, −4, 5, −6, 7, −8, 9, −10?
Из-за начальногоp=0результат всегда 0. - Когда совпадает с правильным произведением? Если в массиве есть хотя бы один ноль.
- Исправление. Инициализировать
p := 1.
5) Одновременный поиск минимума и максимума (реализация + запуск на массиве из п.6)
|
1 2 3 4 5 6 7 8 9 10 11 12 |
const n = 7; var a: array[1..n] of integer = (10,12,5,8,4,15,20); i, mn, mx: integer; begin mn := a[1]; mx := a[1]; for i := 2 to n do begin if a[i] < mn then mn := a[i]; if a[i] > mx then mx := a[i]; end; writeln('min=', mn, ' max=', mx); end. |
Результат для массива (10,12,5,8,4,15,20): min = 4, max = 20.
6) Что делает фрагмент for i:=k+1 to n do a[i-1]:=a[i];?
Решение. Это «сдвиг влево» начиная с позиции k: элемент с индексом k перезаписывается значением a[k+1], затем a[k+1] ← a[k+2] и т. д. Итог — логическое удаление элемента номер k. Последний элемент (a[n]) остаётся «дублированным», поэтому обычно после такого сдвига уменьшают размер массива: n := n - 1.
7) Вставка по индексу k vs замена по индексу k
Решение. Замена изменяет значение в ячейке a[k] и не меняет длину. Вставка увеличивает длину: элементы с позиции k сдвигаются вправо (a[n+1] := a[n] … a[k+1] := a[k]), затем в a[k] помещается новый элемент.
8) Что делает фрагмент (обмен концов, разворот массива)
|
1 2 3 4 5 6 |
for i := 1 to n div 2 do begin r := a[i]; a[i] := a[n-i+1]; a[n-i+1] := r; end; |
Решение. Это разворот массива. Для набора (10,12,5,8,4,15,20) получим (20,15,4,8,5,12,10).
9) Программа поиска двух наибольших значений — что напечатает? какую задачу решает?
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
const n = 5; const a: array[1..n] of integer = (1,2,6,4,6); var i, max1, max2: integer; begin max1 := a[1]; max2 := a[2]; for i := 2 to n do if a[i] > max1 then begin max2 := max1; max1 := a[i]; end else if a[i] > max2 then max2 := a[i]; writeln('max1=', max1, ', max2=', max2); end. |
Решение. Печатает: max1=6, max2=6. Программа ищет наибольшее и второе по величине значения (вторая величина может совпадать с наибольшей, если максимум встречается несколько раз).
10) По цифрам числа n (n ≤ 32000): сформировать массив, найти min/max цифры, их сумму и произведение
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
var n, m, i, d, mn, mx, sum, prod: longint; a: array[1..10] of byte; { хватит для 32000 } begin readln(n); m := n; i := 0; sum := 0; prod := 1; if m = 0 then begin i:=1; a[i]:=0; end; while m > 0 do begin d := m mod 10; m := m div 10; i := i + 1; a[i] := d; { цифры в обратном порядке } if (i = 1) or (d < mn) then mn := d; if (i = 1) or (d > mx) then mx := d; sum := sum + d; prod := prod * d; end; { при желании развернуть a[1..i], чтобы цифры шли слева направо } writeln('min_digit=', mn, ' max_digit=', mx); writeln('sum_digits=', sum, ' prod_digits=', prod); end. |
11) Отсортировать по весу пустые банки чая, имея только чашечные весы без гирь
Решение (словесный алгоритм — «сортировка выбором» сравнениями попарно).
- Положить первую банку как текущий минимум.
- По очереди сравнивать её с каждой следующей на весах:
если другая легче — объявить её текущим минимумом. - После прохода поставить найденный минимум в начало ряда.
- Повторять шаги 1–3 для оставшейся части ряда (со второй позиции и т. д.), пока банки не закончатся.
Такой подход потребует ~O(n²) попарных взвешиваний, но не требует гирь и даёт упорядочивание по неубыванию массы.
| § 6 | § 7 | § 8 | § 9 | § 10 |