program Number_of_mounth;
var month:byte;
begin
write('Введите номер месяца:');
readln(month);
if(month<1)or(month>12)then
writeln('Вы ввели неправильный номер месяца!')
else
begin
write('Название месяца:');
case month of
1:writeln('Январь');
2:writeln('Февраль');
3:writeln('Март');
4:writeln('Апрель');
5:writeln('Май');
6:writeln('Июнь');
7:writeln('Июль');
8:writeln('Август');
9:writeln('Сентябрь');
10:writeln('Октябрь');
11:writeln('Ноябрь');
12:writeln('Декабрь');
end;
write('Количество дней в месяце:');
case month of
1,3,5,7,8,10,12:writeln('31');
4,6,9,11:writeln('30');
2:writeln('28 или 29');
end;
write('Времягода:');
case month of
1,2,12:writeln('Зима');
3,4,5:writeln('Весна');
6,7,8:writeln('Лето');
9,10,11:writeln('Осень');
end;
if not (month=1)then writeln('Это не первый месяц в году');
if not (month=12)then writeln('Это не последний месяц в году');
end;
Объяснение:
Ошибка была в объявлении переменой а именно в начале блока бегин к переменой month задавался тип byte, это делает до начала блока в Var
Поделитесь своими знаниями, ответьте на вопрос:
Найти точку минимума целевой функции методом дихотомии f(x) = x3 - x, x' € [0, 1], = 0, 1
Идея такая: разбиваем отрезок [a, b] на два: [a, m] и [m, b], где m = (a + b)/2. Длина такого отрезка h = b - a. Cмотрим значения функции f в точках m - ε и m + ε. Если f(m - ε) < f(m + ε), то думаем, что функция возрастает в точке m, и разумно искать ответ на отрезке [a, m]; если f(m - ε) > f(m + ε), то оставляем отрезок [m, b]. Если нам ОЧЕНЬ не повезло, и f(m - ε) = f(m + ε), то оставим отрезок [m - h/4, m + h/4]. При этом в любом случае длина нового отрезка будет h/2. В качестве ε разумно взять желаемую точность, и останавливаться, если новая длина h/2 окажется меньше ε.
Очень маленький ε ставить не следует, при этом очень большую роль начинаю играть ошибки округления.
Точный ответ можно найти, посчитав производную. Должно получиться
Реализация (python 3.7):
from math import sqrt
def find_min(function_to_minimize, left, right, tolerance=1e-6):
assert left <= right
# print(left, right) # если хотите проследить за тем, как меняются границы
length = right - left
if length <= tolerance:
return left
midpoint = (left + right) / 2
y_left, y_right = function_to_minimize(midpoint - tolerance), function_to_minimize(midpoint + tolerance)
if y_left < y_right:
return find_min(function_to_minimize, left, midpoint, tolerance)
elif y_left > y_right:
return find_min(function_to_minimize, midpoint, right, tolerance)
else:
return find_min(function_to_minimize, midpoint - length / 4, midpoint + length / 4)
calculated = find_min(lambda x: x ** 3 - x, 0, 1)
exact = 1 / sqrt(3)
print(calculated)
print(calculated - exact)
Мне выводится ответ 0.5773496627807617
Разница между точным решением и найденным примерно