Приветствуем читателей нашего сайта. Сегодня мы решаем proc31-40.
Proc31-40
Proc31. Описать функцию IsPalindrome(K), возвращающую True, если целый параметр K (> 0) является палиндромом (т. е. его запись читается одинаково слева направо и справа налево), и False в противном случае. С ее помощью найти количество палиндромов в наборе из 10 целых положительных чисел.
program proc31; function IsPalindrom(k: integer): boolean; var k_clone, digit, palindrom: integer; begin k_clone := k; while k_clone <> 0 do begin digit := k_clone mod 10; palindrom := palindrom * 10 + digit; k_clone := k_clone div 10; end; if k = palindrom then IsPalindrom := true else IsPalindrom := false; end; var n, i: integer; begin for i := 1 to 10 do begin write('Введите число: '); readln(n); writeln('Число ', n, ' палиндром - ', IsPalindrom(n)) end end.
Proc32. Описать функцию DegToRad(D) вещественного типа, находящую величину угла в радианах, если дана его величина D в градусах (D — вещественное число, 0 ≤ D < 360). Воспользоваться следующим соотношением: 180° = π радианов. В качестве значения π использовать 3.14. С помощью функции DegToRad перевести из градусов в радианы пять данных углов.
program proc32; function DegToRad(d: real): real; begin DegToRad := d * pi / 180; end; const pi = 3.14; var deg: real; i: integer; begin for i := 1 to 5 do begin write('Введите величину угла в градусах: '); readln(deg); writeln(deg, ' гр. = ', DegToRad(deg):0:2, ' рад.') end end.
Proc33. Описать функцию RadToDeg(R) вещественного типа, находящую величину угла в градусах, если дана его величина R в радианах (R — вещественное число, 0 ≤ R < 2·π). Воспользоваться следующим соотношением: 180° = π радианов. В качестве значения π использовать 3.14. С помощью функции RadToDeg перевести из радианов в градусы пять данных углов.
program proc33; function RadToDeg(r: real): real; begin RadToDeg := r * 180 / Pi; end; const pi = 3.14; var rad: real; i: integer; begin for i := 1 to 5 do begin write('Введите величину угла в радианах: '); readln(rad); writeln(rad, ' рад. = ', RadToDeg(rad):0:0, ' гр.') end end.
Proc34. Описать функцию Fact(N) вещественного типа, вычисляющую значение факториала N! = 1·2·…·N (N > 0 — параметр целого типа; вещественное возвращаемое значение используется для того, чтобы избежать целочисленного переполнения при больших значениях N). С помощью этой функции найти факториалы пяти данных целых чисел.
program proc34; //for19 function Fact(n: integer): real; var i: integer; begin Fact := 1; // По определению 0! = 1 for i := 1 to N do Result := Result * i; end; var i, n: integer; begin for i := 1 to 5 do begin write('N = '); readln(n); writeln(N, '! = ', Fact(N)) end end.
Proc35. Описать функцию Fact2(N) вещественного типа, вычисляющую двойной факториал:
N! = 1·3·5·…·N, если N — нечетное;
N! = 2·4·6·…·N, если N — четное
(N > 0 — параметр целого типа; вещественное возвращаемое значение используется для того, чтобы избежать целочисленного переполнения при больших значениях N). С помощью этой функции найти двойные факториалы пяти данных целых чисел.
program proc35; //while6 function Fact2(n: integer): real; var anva: integer; begin result := n; anva := n; if (n <> 1) and (n <> 2) then if odd(n) then // проверяем четность и нечетность. odd возвращает правду, если нечетно while anva <> 1 do // пока не равно 1, выполняем цикл подсчета факториала begin anva := anva - 2; result := result * anva; end else while anva <> 2 do // пока не равно 2, выполняем цикл begin anva := anva - 2; result := result * anva; end; end; var i, n: integer; begin for i := 1 to 5 do begin write('N = '); readln(n); writeln(N, '! = ', Fact2(N)) end end.
Proc36. Описать функцию Fib(N) целого типа, вычисляющую N-й элемент последовательности чисел Фибоначчи FK, которая описывается следующими формулами:
F1 = 1, F2 = 1, FK = FK−2 + FK−1, K = 3, 4, ….
program proc36; //program while_24; function Fib(n: integer): integer; var a, b, tmp: integer; begin a := 1; // Первое число ряда Фибоначчи. b := 1; // второе число Фиббоначчи n := n - 2; //Первые два числа уже известны while (n <> 0) do begin tmp := b; // записываем второе число во временную переменную b := a + b; // записываем вместо второго числа, следующее число Фиббоначчи a := tmp; // переносим значение второго числа в первое Dec(n); end; Result := b; end; var N, i: integer; begin for i := 1 to 5 do begin write('N = '); readln(N); writeln('Число Фибоначчи под номером ', n, ' : ', Fib(N)) end; end.
Используя функцию Fib, найти пять чисел Фибоначчи с данными номерами N1, N2, …, N5.
Дополнительные задания на процедуры и функции
Proc37. Описать функцию Power1(A, B) вещественного типа, находящую величину AB по формуле AB = exp(B·ln(A)) (параметры A и B — вещественные). В случае нулевого или отрицательного параметра A функция возвращает 0. С помощью этой функции найти степени AP, BP, CP, если даны числа P, A, B, C.
program proc37; function Power1(a, b: real): real; begin if a <= 0 then Power1 := 0 else Power1 := Exp(b * Ln(a)); end; var a, b, c, p: real; begin write('A = '); readln(a); write('B = '); readln(b); write('C = '); readln(c); write('P = '); readln(p); writeln(a, ' в степени ', p, ' равно ', Power1(a, p)); writeln(b, ' в степени ', p, ' равно ', Power1(b, p)); writeln(c, ' в степени ', p, ' равно ', Power1(c, p)) end.
Proc38. Описать функцию Power2(A, N) вещественного типа, находящую величину AN (A — вещественный, N — целый параметр) по следующим формулам:
A0 = 1;
AN = A·A·…·A (N сомножителей), если N > 0;
AN = 1/(A·A·…·A) (|N| сомножителей), если N < 0.
С помощью этой функции найти AK, AL, AM, если даны числа A, K, L, M.
program proc38; function Power2(a: real; n: integer): real; begin if n = 0 then Power2 := 1 else if n < 0 then Power2 := 1 / (Exp(abs(n) * Ln(a))) // не забываем про модуль else Power2 := Exp(n * Ln(a)) end; var a: real; k, l, m: integer ; begin write('A = '); readln(a); write('K = '); readln(k); write('L = '); readln(l); write('M = '); readln(m); writeln(a, ' в степени ', k, ' равно ', Power2(a, k):0:2); writeln(a, ' в степени ', l, ' равно ', Power2(a, l):0:2); writeln(a, ' в степени ', m, ' равно ', Power2(a, m):0:2) end.
Proc39. Используя функции Power1 и Power2 из Proc37 и Proc38, описать функцию Power3(A, B) вещественного типа с вещественными параметрами, находящую AB следующим образом: если B имеет нулевую дробную часть, то вызывается Power2(A, N), где N — переменная целого типа, равная числу B; иначе вызывается Power1(A, B). С помощью Power3 найти AP, BP, CP, если даны числа P, A, B, C.
program proc39; function Power1(a, b: real): real; begin if a <= 0 then Power1 := 0 else Power1 := Exp(b * Ln(a)); end; function Power2(a: real; n: integer): real; begin if n = 0 then Power2 := 1 else if n < 0 then Power2 := 1 / (Exp(abs(n) * Ln(a))) // не забываем про модуль else Power2 := Exp(n * Ln(a)) end; function Power3(a, b: real): real; begin if Frac(b) = 0 then Power3 := Power2(A, Round(b)) else Power3 := Power1(A, B) end; var a, b, c, p: real; begin write('A = '); readln(a); write('B = '); readln(b); write('C = '); readln(c); write('P = '); readln(p); writeln(a, ' в степени ', p, ' равно ', Power3(a, p):0:2); writeln(b, ' в степени ', p, ' равно ', Power3(b, p):0:2); writeln(c, ' в степени ', p, ' равно ', Power3(c, p):0:2) end.
Proc40°. Описать функцию Exp1(x, ε) вещественного типа (параметры x, ε — вещественные, ε > 0), находящую приближенное значение функции exp(x):
exp(x) = 1 + x + x2/(2!) + x3/(3!) + … + xn/(n!) + …
(n! = 1·2·…·n). В сумме учитывать все слагаемые, большие ε. С помощью Exp1 найти приближенное значение экспоненты для данного x при шести данных ε.
program proc40; function Exp1(var x, e: real): real; var a: real; j: integer; begin result := 1; j := 1; a := 1; while a > e do begin a := a * x / j; result := result + a; inc(j) end end; var e, x: real; i: integer; begin write('x = '); readln(x); for i := 1 to 6 do begin write('e = '); readln(e); writeln('Экспонента в точке х: ', Exp1(x, e), ' (проверка) = ', Exp(x)) end end.
На сегодня все! Если у вас возникли проблемы с решением задач proc31-40 или с любыми другими задачами, то напишите их в комментариях.