Алгоритмы без множественного выбора (PascalABC.NET)

Материал из Информационная безопасностя
Версия от 20:06, 9 мая 2023; Безуглов Сергей (обсуждение | вклад)
(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к навигации Перейти к поиску

Поиск минимумов и максимумов

Найти минимальное из двух произвольных чисел.

Если сказано, что числа произвольные, выбираем для них тип real. Алгоритм поиска минимума среди чисел a и b следующий: если а < b, минимум равен a, иначе он равен b.

 1 ##
 2 var (a, b) := ReadReal2('Введите два числа:');
 3 
 4 if a < b then
 5   Print('Минимум равен', a)
 6 else
 7   Print('Минимум равен', b); 
 8 
 9 Println('Минимум равен', if a < b then a else b); 
10 
11 Println('Минимум равен', (a < b) ? a : b);

Найти максимальное из трех целых чисел.

Сначала найдем максимальное из первой пары чисел, а затем сравним результат с третьим числом.

1 ##
2 var (a, b, c) := ReadInteger3('Введите три целых числа;');
3 var m := if a > b then a else b;
4 m := if m > c then m else c;
5 Print('Максимум:', m);
Введите три целых числа; 4 7 2
Максимум: 7

Короткое альтернативное решение:

1 ##
2 var (a, b, c) := ReadInteger3('Введите три целых числа;');
3 Print('Максимум:', Max(a, b, c));

Процент отклонения значения максимального из чисел от среднего значения

Даны четыре натуральных числа. Найти процент отклонения значения максимального из чисел от среднего значения всех чисел с точностью до двух знаков после запятой.
1 ##
2 var a, b, c, d: integer;
3 Write('Введите четыре целых числа: ');
4 Read(a, b, c, d);
5 var mx := Max(a, b, c, d);
6 var m := (a + b + c + d) / 4;
7 Write('Отклонение составляет ', (mx - m) / m * 100:0:2, '%');
Введите четыре целых числа: 29 31 32 31
Отклонение составляет 4.07%

Анализ цифр в числе заданной разрядности

Если заданное трехзначное число читается одинаково слева направо и справа налево, вывести «Да». В противном случае вывести «Нет».

Число трехзначное, поэтому для выполнения приведенного в задании условия достаточно, чтобы первая цифра числа равнялась последней.

1 ##
2 var n := Abs(ReadInteger('Введите трехзначное число:'));
3 Print(if n div 100 = n mod 10 then 'Да' else 'Нет');
Введите трехзначное число: 161
Да

Решение линейных и квадратных уравнений

Линейное уравнение

Линейное уравнение имеет вид ax + b = 0, где a ≠ 0. Его решением (корнем) является значение x = -b / a. В некоторых задачах, особенно олимпиадных, намеренно содержащих препятствия к получению корректного решения, значение a = 0 также считается допустимым, несмотря на то, что математически оно приводит к вырожденности линейного уравнения – об этом следует помнить.

Вычисление х производится при помощи операции деления «/», перед делением операнды приводятся к вещественному типу, так что лучше сразу определить для переменных a и b тип real.

Написать программу для решения уравнения ax + b = 0. Значения a и b ввести с клавиатуры. Рассмотреть случаи, когда уравнение может иметь множество корней или не иметь корней вообще.

Корень линейного уравнения определяется по формуле x = -b / a. При a = 0 возможны два случая. Если b = 0, исходное уравнение обращается в тождество 0 ≡ 0 при любом х и корней бесчисленное множество. При b ≠ 0 исходное уравнение принимает вид b = 0, что противоречит рассматриваемому значению, поэтому уравнение в этом случае корней не имеет. Для коэффициентов а и b выбираем тип real. Следует помнить, что если взять значение а достаточно близким к нулю, появится шанс получить «машинную бесконечность».

1 ##
2 var (a, b) := ReadReal2('Введите коэффициенты a и b:');
3 if a = 0 then
4   if b = 0 then
5     Print('Корней бесконечное множество')
6   else
7     Print('Корней нет')
8 else
9   Print('x =', -b / a);
Введите коэффициенты a и b: 0.18 3.173
x = -17.6277777777778

Квадратное уравнение

Квадратное уравнение в общем виде записывается как ax2 + bx + c = 0, где a ≠ 0. Такие уравнение обычно решают при помощи вычисления вспомогательной величины – дискриминанта. Дискриминант определяется формулой D = b2 – 4ac.

  • Если дискриминант положительный, уравнение имеет два разных действительных корня.
  • Если дискриминант равен нулю, оба действительных корня совпадают и для простоты говорят, что уравнение имеет один корень.
  • Если дискриминант отрицательный, школьникам обычно говорят, что уравнение корней не имеет.

На самом деле, уравнение не имеет лишь действительных корней. Как становится известно при дальнейшем изучении математики, в этом случае имеются два комплексносопряженных корня, но пока будем считать, что при D < 0 уравнение корней не имеет. Лица, продвинутые в математике, могут при вычислении дискриминанта явно указать тип complex и не тратить время на всякие анализы. Остальным следует использовать тип real.

Корни квадратного уравнения определяются по формуле

Ser.png

Из приведенной формулы понятно, почему при D = 0 получаются два равных по значению корня. Также понятно, почему при D < 0 говорят, что корней нет: возникает проблема с извлечением квадратного корня из отрицательного числа.

Найти корни квадратного уравнения ax2+bx+c=0, если a≠0. Коэффициенты a, b и c ввести с клавиатуры. Вывод осуществить с точностью 5 знаков после запятой. Если действительных корней нет, вывести соответствующее сообщение.
 1 ##
 2 ##
 3 var (a, b, c) := ReadReal3('Введите коэффициенты a, b, c:');
 4 var D := b * b - 4 * a * c;
 5 if D > 0 then // два разных корня
 6 begin
 7   D := Sqrt(D);
 8   var x1 := (-b - D) / (2 * a);
 9   var x2 := (-b + D) / (2 * a);
10   Write('x1 = ', x1:0:5, ', x2 = ', x2:0:5)
11 end
12 else if D = 0 then
13   Write('x = ', -b / (2 * a):0:5)
14 else
15   Print('Корней нет');
Введите коэффициенты a, b, c: 3.8 -10 4
x1 = 0.49197, x2 = 2.13960

Существует ли треугольник?

Даны три отрезка прямой длиной a, b и c. Можно ли из них составить треугольник?

Из геометрии известно условие существования треугольника: сумма длин двух любых его сторон должна быть больше длины третьей. Этим условием и нужно воспользоваться.

1 ##
2 var (a, b, c) := ReadReal3('Введите длины сторон треугольника:');
3 if (a + b > c) and (a + c > b) and (b + c > a) then
4   Print('Треугольник можно построить')
5 else
6   Print('Треугольник построить нельзя');

Прямоугольный ли треугольник?

Даны три отрезка прямой длиной a, b и c. Можно ли из них составить прямоугольный треугольник?

К условию существования треугольника из предыдущей задачи нужно добавить еще одно условие: в треугольнике должна выполняться теорема Пифагора. Квадрат большей из сторон (это будет гипотенуза) должен равняться сумме квадратов катетов (двух меньших сторон). Можно обеспечить нахождение в переменной с наибольшего из введенных значений. А можно каждой тройки значений набора {a, b, c} проверить выполнение теоремы Пифагора. Последний вариант записывается короче.

1 ##
2 var (a, b, c) := ReadReal3('Введите длины сторон треугольника:');
3 if (a + b > c) and (a + c > b) and (b + c > a) then
4   if (a * a + b * b = c * c) or (a * a + c * c = b * b) or (b * b + c * c = a * a) then
5     Print('Можно построить прямоугольный треугольник')
6   else
7     Print('Можно построить непрямоугольный треугольник')
8 else
9   Print('Треугольник построить нельзя');
Введите длины сторон треугольника: 15 20 25
Можно построить прямоугольный треугольник