8 класс Информатика ГДЗ учебник Босова Параграф 4.3. Программирование линейных алгоритмов. Глава 4. Начала программирования на языке Паскаль
Стр.168-173.
Решения к задачам §4.3 Программирование линейных алгоритмов.
1. Площадь треугольника по формуле Герона
Краткое условие (ГДЗ): Программа вычисляет площадь треугольника со сторонами 12, 5 и 13.
Найдите результат и запишите математическую формулу для s.
Решение:
Полупериметр:
p = (a + b + c) / 2 = (12 + 5 + 13) / 2 = 30 / 2 = 15.
Формула Герона для площади треугольника со сторонами a, b, c:
s = √(p (p − a) (p − b) (p − c))
Подставим числа:
- s = 15
- s = s · (p − a) = 15 · (15 − 12) = 15 · 3 = 45
- s = s · (p − b) = 45 · (15 − 5) = 45 · 10 = 450
- s = s · (p − c) = 450 · (15 − 13) = 450 · 2 = 900
- s = √900 = 30
Ответ: s = 30; формула s = √(p (p − a) (p − b) (p − c)).
2. Программа для вычисления y = x³ + 2,5x² − x + 1
Краткое условие (ГДЗ): Написать программу, вычисляющую
y по формуле y = x³ + 2,5x² − x + 1, если:
- нельзя использовать операцию возведения в степень;
- в каждом операторе присваивания разрешена только одна арифметическая операция;
- разрешено не более 5 операторов присваивания.
Преобразование выражения (подсказка):
Используем форму Горнера:
y = x³ + 2,5x² − x + 1 = ((x + 2,5)x − 1)x + 1
Программа на Паскале:
|
1 2 3 4 5 6 7 8 9 10 11 |
var x, y: real; begin readln(x); y := x + 2.5; { 1-я операция: сложение } y := y * x; { 2-я операция: умножение } y := y - 1; { 3-я операция: вычитание } y := y * x; { 4-я операция: умножение } y := y + 1; { 5-я операция: сложение } writeln('y = ', y); end. |
Каждое присваивание содержит только одну арифметическую операцию, всего ровно 5 операторов присваивания, возведения в степень нет.
Задание 3. Написать программу, которая вычисляет расстояние между двумя точками A(xa, ya) и B(xb, yb). Проверить работу программы на данных: xa=2, ya=1, xb=10, yb=7.
Решение.
Формула расстояния между точками:
d = √((xb − xa)2 + (yb − ya)2).
Подставляем значения:
- Δx = 10 − 2 = 8
- Δy = 7 − 1 = 6
- d = √(64 + 36) = √100 = 10
Ответ: 10.0
Программа на Pascal:
|
1 2 3 4 5 6 7 8 |
var xa, ya, xb, yb: real; d: real; begin readln(xa, ya, xb, yb); d := sqrt( sqr(xb - xa) + sqr(yb - ya) ); writeln('|AB| = ', d:0:1); end. |
Задание 4. Написать программу, которая по сторонам треугольника a, b, c вычисляет его площадь. Проверка: a=3, b=4, c=5.
Решение.
Используем формулу Герона. Сначала полупериметр:
p = (a + b + c) / 2.
Тогда площадь:
S = √(p · (p − a) · (p − b) · (p − c)).
Подставим a=3, b=4, c=5:
- p = (3 + 4 + 5) / 2 = 12 / 2 = 6;
- S = √(6 · 3 · 2 · 1) = √36 = 6.
Ответ: 6.0
Программа на Pascal:
|
1 2 3 4 5 6 7 8 |
var a, b, c, p, s: real; begin readln(a, b, c); p := (a + b + c) / 2; s := sqrt(p * (p - a) * (p - b) * (p - c)); writeln('S = ', s:0:1); end. |
Задание 5. Даны координаты вершин треугольника A, B, C. Нужно написать программу, которая вычисляет его площадь. Тест: A(2,1), B(6,5), C(10,1) → S = 16.0.
Решение.
Площадь треугольника по координатам вычисляется формулой:
S = ½ · | (xb − xa)·(yc − ya) − (xc − xa)·(yb − ya) |
Подставим данные:
- xa = 2, ya = 1
- xb = 6, yb = 5
- xc = 10, yc = 1
Считаем:
S = ½ · | (6−2)·(1−1) − (10−2)·(5−1) |
S = ½ · | 4·0 − 8·4 | = ½ · | −32 | = 16
Ответ: 16.0
Программа на Pascal:
|
1 2 3 4 5 6 7 8 |
var xa, ya, xb, yb, xc, yc: real; s: real; begin readln(xa, ya, xb, yb, xc, yc); s := abs((xb - xa) * (yc - ya) - (xc - xa) * (yb - ya)) / 2; writeln('S = ', s:0:1); end. |
Задание 6. Налоговая сумма вводится с копейками. Нужно округлить её до ближайшего рубля по правилу:
- если копеек < 50 — округлить вниз;
- если копеек ≥ 50 — округлить вверх.
Решение.
Разделяем число на рубли и копейки. Далее применяем условие:
|
1 2 3 4 5 6 7 8 9 10 |
// Пусть sum — введённая сумма, например 123.47 rub := trunc(sum); // 123 kop := round((sum - rub) * 100); // 47 if kop < 50 then rub := rub else rub := rub + 1; write('К оплате: ', rub); |
Пример.
Ввод: 245.68
Копеек 68 ≥ 50 → округляем вверх → 246 руб.
Ввод: 100.12
Копеек 12 < 50 → округляем вниз → 100 руб.
Задание 7. Изучаем работу random() и отвечаем на вопросы: как получить случайное число в разных интервалах.
Решение.
В Паскале функция random(k) возвращает целое число от 0 до k−1.
1. Как получить случайное число из интервала (0, x)?
Нужны числа от 1 до x−1:
|
1 |
r := random(x - 1) + 1; |
2. Как получить случайное число из полуинтервала (0, x]?
Нужны числа от 1 до x:
|
1 |
r := random(x) + 1; |
3. Как получить случайное число из интервала (n, x + n)?
Нужны числа от n+1 до x+n−1. Ширина интервала равна x−1:
|
1 |
r := random(x - 1) + n + 1; |
Итог: используется общая формула:
|
1 |
random(b - a + 1) + a |
— для интервала [a, b]. Для открытых интервалов границы корректируются вручную.
Задание 8. Случайно выбрать номера лотерейных билетов
для трёх групп: молодёжь (1–100), взрослые (101–200), пенсионеры (201–250).
Решение. Используем функцию random, подбирая нужные
диапазоны.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
program Tickets; var youth, adult, pension: integer; begin randomize; youth := random(100) + 1; { 1..100 } adult := random(100) + 101; { 101..200 } pension := random(50) + 201; { 201..250 } writeln('Молодёжь: билет № ', youth); writeln('Взрослые: билет № ', adult); writeln('Пенсионеры: билет № ', pension); end. |
Получили три случайных номера из нужных интервалов.
Задание 9. Написать программу, которая для любого
двузначного числа находит: сумму его цифр, произведение его цифр,
а также число, полученное перестановкой цифр.
Решение.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
program Digits; var n, a, b, sum, prod, swapped: integer; begin write('Введите двузначное число: '); readln(n); a := n div 10; { десятки } b := n mod 10; { единицы } sum := a + b; prod := a * b; swapped := b * 10 + a; writeln('Сумма цифр = ', sum); writeln('Произведение цифр = ', prod); writeln('Число после перестановки = ', swapped); end. |
Пример проверки.
Если n = 47 → сумма = 11, произведение = 28, перестановка = 74.
Задание 10. Написать программу, которая по сумме сдачи находит, сколько нужно выдать купюр по 500, 200, 100 и 50 рублей, а остаток выдаётся монетами.
Решение.
|
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 |
program Cashier; var s: integer; k500, k200, k100, k50, coins: integer; begin write('Сумма сдачи: '); readln(s); k500 := s div 500; s := s mod 500; k200 := s div 200; s := s mod 200; k100 := s div 100; s := s mod 100; k50 := s div 50; coins:= s mod 50; writeln('500 руб: ', k500, ' шт.'); writeln('200 руб: ', k200, ' шт.'); writeln('100 руб: ', k100, ' шт.'); writeln('50 руб: ', k50, ' шт.'); writeln('Монетами: ', coins, ' руб.'); end. |
Пример проверки.
При s = 845 программа выдаст:
500 руб – 1 шт., 200 руб – 1 шт., 100 руб – 1 шт., 50 руб – 0 шт., монетами – 45 руб.
Задание 11. По номеру секунды k определить, сколько
прошло полных часов h и полных минут m от начала суток, и вывести фразу:
It is h hours m minutes.
Решение (программа на Pascal).
|
1 2 3 4 5 6 7 8 9 10 11 12 |
program TimeFromStart; var k, h, m: integer; begin write('k = '); readln(k); h := k div 3600; {целые часы} m := (k mod 3600) div 60; {целые минуты после часов} writeln('It is ', h, ' hours ', m, ' minutes'); end. |
Проверка.
При k = 13257 программа выводит:
It is 3 hours 40 minutes.
Задание 12. Найти сумму кодов букв в слове «БАЙТ».
Решение (Pascal).
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
program SumCodes; var s: string; i, sum: integer; begin s := 'БАЙТ'; sum := 0; for i := 1 to length(s) do sum := sum + ord(s[i]); {ord возвращает код символа} writeln('Sum = ', sum); end. |
Примечание. Значение суммы зависит от кодировки (обычно Windows-1251).
Задание 13. Вывести строку, составленную из символов с кодами 66, 69, 71, 73, 78.
Решение (Pascal).
|
1 2 3 4 5 6 7 |
program CodesToString; var s: string; begin s := chr(66) + chr(69) + chr(71) + chr(73) + chr(78); writeln(s); end. |
Комментарий. Функция chr() возвращает символ по его числовому коду (ASCII/Windows-1251).
Задание 14. Ввести три слова (прилагательное, существительное и глагол) и вывести все варианты фраз из этих слов.
Решение (Pascal).
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
program Phrases3; var a, b, c: string; begin readln(a); readln(b); readln(c); writeln(a, ' ', b, ' ', c); writeln(a, ' ', c, ' ', b); writeln(b, ' ', a, ' ', c); writeln(b, ' ', c, ' ', a); writeln(c, ' ', a, ' ', b); writeln(c, ' ', b, ' ', a); end. |
Задание 15. Из слова «ИНФОРМАТИКА» получить слова «ФОРМА», «ФИРМА», «МАК» и найти общее количество букв в этих словах.
Решение (Pascal).
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
program WordsFromInformatika; var s, w1, w2, w3: string; total: integer; begin s := 'ИНФОРМАТИКА'; w1 := 'ФОРМА'; {можно и через copy: copy(s,3,4) + s[7]} w2 := 'ФИРМА'; {Ф, И, Р, М, А из исходного слова} w3 := 'МАК'; {М, А, К из исходного слова} total := length(w1) + length(w2) + length(w3); {5 + 5 + 3 = 13} writeln(w1); writeln(w2); writeln(w3); writeln('Всего букв: ', total); {13} end. |
Задание 16. Пользователь по описанному «фокусу» вводит число N.
Нужно по этому числу «отгадать» день и месяц рождения.
Решение (Pascal).
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
program BirthdayTrick; var name: string; n, k, day, month: integer; begin writeln('Как вас зовут?'); readln(name); writeln('Введите полученное число N:'); readln(n); { алгоритм обратного восстановления даты } k := n - 250; month := k mod 100; {последние две цифры} day := k div 100; {остальные цифры} writeln(name, ', your birthday is ', day, '.', month, '.'); end. |
Задание 17. a = 10, b = 20. Определить значение логической переменной rez для каждого присваивания.
Решение.
а) rez := (a = 10) or (b > 10)
- a = 10 ⇒
(a = 10)= истина - b = 20 ⇒
(b > 10)= истина - истина or истина ⇒ rez = истина
б) rez := (a > 5) and (b > 5) and (a < 20) and (b < 30)
- 10 > 5 ⇒ истина
- 20 > 5 ⇒ истина
- 10 < 20 ⇒ истина
- 20 < 30 ⇒ истина
- все части истинны ⇒ rez = истина
в) rez := (not(a < 15)) or (b > 20)
- 10 < 15 ⇒ истина ⇒
not(истина)= ложь - 20 > 20 ⇒ ложь
- ложь or ложь ⇒ rez = ложь
18а) Программа на Паскале: сумма цифр трёхзначного числа чётная?
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
program EvenDigitSum; var x : integer; a, b, c, s : integer; rez : boolean; begin writeln('Введите трёхзначное число x:'); readln(x); a := x div 100; b := (x div 10) mod 10; c := x mod 10; s := a + b + c; rez := (s mod 2 = 0); writeln('Result: ', rez); end. |
18б) Программа на Паскале: треугольник со сторонами a, b, c разносторонний?
|
1 2 3 4 5 6 7 8 9 10 11 12 |
program ScaleneTriangle; var a, b, c : real; rez : boolean; begin writeln('Введите стороны треугольника a, b, c:'); readln(a, b, c); rez := (a <> b) and (b <> c) and (a <> c); writeln('Result: ', rez); end. |
| § 4.1 | § 4.2 | § 4.3 | § 4.4 | § 4.5 |