Как решать задачи на цикл

Решенные задачи Pascal: операторы цикла
Pascal операторы цикла – Repeat
Repeat 1: Даны положительные числа A и B (A>B). На отрезке длины A размещено максимально возможное количество отрезков длины B (без наложений). Не используя операции умножения и деления, найти количество отрезков B, размещенных на отрезке A.
Проверить:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | var a,b,temp,c:integer; flag: boolean; begin writeln(‘A=’); readln(a); writeln(‘B=’); readln(b); temp:=a; repeat temp:=temp-b; inc(c); until temp-b>=0; writeln(‘result: ‘,c); end. |
Pascal операторы цикла – While
While 1: Определите значение переменной P после выполнения следующего фрагмента программы:
1 2 3 4 5 | P:=1; i:=3; while i <= 9 do begin P := P * (i div 3); i := i + 1; end; |
Варианты:
1) 1
2) 3
3) 9
4) 24
Проверить:
While 2: Определите значение переменной S после выполнения следующего фрагмента программы:
1 2 3 4 5 | S:=0; i:=7; while i > 1 do begin S := S + i div 2; i := i – 1; end; |
Варианты:
1) S = 0
2) S = 7
3) S = 12
4) S = 24
Проверить:
While 3: Даны целые положительные числа N и K. Используя только операции сложения и вычитания, найти частное от деления нацело N на K, а также остаток от этого деления.
Решение данного задания смотрите в видео уроке по Паскалю:
While 4: Дано целое число N (> 0). С помощью операций деления нацело и взятия остатка от деления определить, имеется ли в записи числа N цифра «2». Если имеется, то вывести TRUE, если нет – вывести FALSE.
Проверить:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | var number:integer; flag: boolean; begin writeln(‘введите целое число (number>0) number=’); readln(number); flag:=false; while (number div 10)>0 do begin if (number mod 10) = 2 then flag:=true; number:=number div 10; end; writeln(flag); end. |
While 5:
Дано целое число N (>1). Найти наибольшее целое число K, при котором выполняется неравенство 3K<N
* Из задачника М. Э. Абрамян (While10)
Предлагаем посмотреть разбор задачи на видео:
While 6:
Дано число A (>1). Вывести наибольшее из целых чисел K, для которых сумма 1+1/2+…+1/K будет меньше A, и саму эту сумму
* Из задачника М. Э. Абрамян (While14)
Проверить:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | var Temp:Real; A,K :Integer; begin Write(‘Введите A: ‘); Readln(A); K:=0; Temp:=0; while Temp<=A do begin inc(K,1); Temp:=Temp+1/K; end; Writeln(K-1,’ ‘,Temp-1/K); end. |
While 7:
Дано целое число K и набор ненулевых целых чисел; признак его завершения – число 0. Вывести количество чисел в наборе, меньших K
* Из задачника М. Э. Абрамян (Series14)
Проверить:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | var i,R,K:Longint; begin write(‘Введите K : ‘); readln(K); R:=1; i:=0; while(R<>0) do begin write(‘Введите число из набора: ‘); Readln(R); if R<K then i:=i+1; end; i:=i-1; Writeln(i); readln; end. |
While 8:
Спортсмен-лыжник начал тренировки, пробежав в первый день 10 км. Каждый следующий день он увеличивал длину пробега на P процентов от пробега предыдущего дня (P – вещественное, 0<P<50). По данному P определить, после какого дня суммарный пробег лыжника за все дни превысит 200 км, и вывести найденное количество дней K (целое) и суммарный пробег S (вещественное число).
* Из задачника М. Э. Абрамян (While16)
Проверить:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | var P, S, D:Real; K :Integer; begin Write(‘Введите процент: ‘); Readln(P); K:=1; D:=10; S:=10; while S<=200 do begin inc(K,1); D:=D+D*P/100; S:=S+D; end; Writeln(K,’ ‘,S); end. |
Pascal операторы цикла – For
For 1: Дано вещественное число – цена 1 кг конфет. Вывести стоимость 0.1, 0.2, …, 1 кг конфет.
* Из задачника М. Э. Абрамян
Проверить:
1 2 3 4 5 6 7 8 9 10 11 12 | var c,m:real; i:integer; begin writeln(‘Цена?’); readln(c); m:=0.1; for i := 1 to 10 do begin writeln(‘ price of ‘,m, ‘ kg = ‘,c*m); m:=m+0.1; end; end. |
For 2: Даны два целых числа A и B ( A<B ). Вывести в порядке убывания все целые числа, расположенные между A и B (не включая числа A и B), а также количество N этих чисел.
* Из задачника М. Э. Абрамян
Проверить:
1 2 3 4 5 6 7 8 9 10 11 | var a, b, i: integer; begin writeln(‘A:’); readln(a); writeln(‘B:’); readln(b); for i:= b-1 downto a+1 do write(i:3 ); writeln; writeln(‘kolvo: ‘,b-a-1); end. |
For 3:
Дано целое число N>0. Найти сумму
* Из задачника М. Э. Абрамян (For11)
Проверить:
1 2 3 4 5 6 7 8 9 | var N, Rez,i :Integer; begin Write(‘Введите N: ‘); Readln(N); rez:=0; For i:=0 to N do Rez:=Rez+sqr(N+i); Writeln(Rez); end. |
Сейчас предлагаем решить сложную олимпиадную задачу на Паскале:
Пять делителей: Найти сумму всех чисел от 1 до заданного n, имеющих ровно пять делителей. Единица и само число входят в число его делителей
Проверить:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | var c,n,s,k,i:integer; begin c:=0; s:=0; readln(n); for i:=2 to n do begin k:=i; while k>0 do begin if i mod k = 0 then c:=c+1; k:=k-1; end; if c= 5 then s:=s+i; c:=0; end; writeln(s); end. |
Источник
Данная статья:
- написана командой Vertex Academy. Надеемся, что она Вам будет полезна. Приятного прочтения!
- это одна из статей из нашего “Самоучителя по Java”
Ниже даётся детальное объяснение простых задач в помощь тем, кто ранее не программировал и только делает свои первые шаги в программировании. Изучив их, Вам будет легче перейти к более сложным задачам – уровень сложности 2.
Задача №1
Необходимо вывести на экран числа от 1 до 5. На экране должно быть:
1 2 3 4 5
Решение:
class Test { public ic void main(String[] args) { for (int i=1; i <= 5; i++) { System.out. (i + ” “); } } } |
Комментарии к задаче:
Как видно из условия, числа увеличиваются от 1 до 5 с шагом 1. Есть определенная закономерность, не так ли? А значит, необходимо использовать цикл. Осталось только понять какой именно цикл нужно использовать? Мы точно знаем, что числа будут увеличиваться от 1 до 5. А раз мы точно знаем сколько раз будет повторяться цикл, можем использовать цикл for.
Пишем строчку с конструкцией цикла for:
for (int i=1; i <= 5; i++) { |
- int i = 1; – это начальное значение переменной
- i<=5; – это условие, при котором будет выполняться цикл
- i++ – это шаг, с которым будет выполняться цикл. В данном случае мы использовали инкремент, а значит переменная будет увеличиваться на 1. То есть с 1 до 2, с 2 до 3, с 3 до 4, с 4 до 5.
А чтобы после каждого шага кода выводить новое значение переменной, мы написали вот эту строчку:
System.out. (i + ” “); |
Поскольку нам необходимо вывести числа строчкой: 1 2 3 4 5 мы используем System.out. ()
Если бы мы использовали System.out.ln(); числа бы были выведены на экран вот так:
1
2
3
4
5
Обязательно обращайте внимание на то, чтобы количество скобок открывающих { и закрывающих } совпадало. В нашем случае 3 открывающие и 3 закрывающие скобки.
Задача №2
Необходимо вывести на экран числа от 5 до 1. На экране должно быть:
5 4 3 2 1
Решение:
class Test { public ic void main(String[] args) { for (int i=5; i>=1; i–) { System.out. (i + ” “); } } } |
Комментарии к задаче:
Как видно из условия, числа уменьшаются от 5 до 1 с шагом 1. Есть определенная закономерность, не так ли? А значит, необходимо использовать цикл. Вопрос какой? Мы точно знаем, что числа будут уменьшаться от 5 до 1. А раз точно знаем сколько раз будет повторяться цикл, можем использовать цикл for.
Пишем строчку с конструкцией цикла for:
for (int i=5; i>=1; i–) { |
- int i = 5; – это начальное значение переменной
- i >=1; – это условие, при котором будет выполняться цикл
- i- – декремент, то есть уменьшение переменной на 1. С 5 до 4, с 4 до 3, с 3 до 2, с 1 до 1
А с помощью этой строчки выводим на консоль значения переменной
System.out. (i + ” “); |
Мы используем System.out. (); поскольку нам необходимо вывести числа строчкой: 5 4 3 2 1
Если бы мы использовали System.out.ln(); числа бы были выведены на экран вот так:
5
4
3
2
1
И снова напоминаем, обязательно обращайте внимание на то, чтобы количество скобок открывающих { и закрывающих } совпадало. В нашем случае снова 3 открывающие и 3 закрывающие скобки.
Задача №3
Необходимо вывести на экран таблицу умножения на 3:
3*1=3
3*2=6
3*3=9
3*4=12
3*5=15
3*6=18
3*7=21
3*8=24
3*9=27
3*10=30
Решение:
class Test { public ic void main(String[] args) { for (int i=1; i<=10; i++) { System.out.ln (“3*” + i + “=” + 3*i); } } } |
Комментарии к задаче:
Как видно из условия, мы 3 умножаем сначала на 1, потом на 2, потом на 3 и так до 10. Не кажется ли Вам, что необходимо применить цикл? Правильно, нужен цикл. Осталось понять какой именно цикл. Раз мы точно знаем сколько будет повторений – от 1 до 10 – применяем цикл for.
Пишем строчку с конструкцией цикла for:
- int i = 1; – это начальное значение переменной
- i <= 10; – это условие, при котором будет выполняться цикл
- i++ инкремент, то есть увеличение переменной на 1. С 1 до 2, с 2 до 3, с 3 до 4 и т.д.
Разберем вот эту строчку с помощью которой мы выводим значения на консоль
System.out.ln (“3*” + i + “=” + 3*i); |
Посмотрим на первые 3 строчки задания:
3*1=3
3*2=6
3*3=9
Как видно, есть:
- текстовая часть: “3*” и “=”
- алгоритмическая часть: будет подставлять значения за счет цикла for – это все остальные значения.
Поэтому в System.out.ln() всю текстовую часть заключаем в кавычки. И получаем: System.out.ln (“3*”+ i + “=” + 3*i);
Задача №4
Напишите программу, где пользователь вводит любое целое положительное число. А программа суммирует все числа от 1 до введенного пользователем числа.
Например:
- если пользователь введет число 3. Программа должна посчитать сумму чисел от 1 до 3, то есть 1+2+3 и выдать ответ 6.
- если пользователь введет число 5. Программа должна посчитать сумму чисел от 1 до 5, то есть 1+2+3+4+5 и выдать ответ 15.
Думаю, суть задачи Вы уже поняли – переходим к ее решению.
Решение:
import java.util.Scanner; class Test { public ic void main(String[] args) { System.out.(“Введите любое целое положительное число: “); Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int sum = 0; for (int i=1; i<= n; i++){ sum = sum + i; } System.out.ln (sum); } } |
Комментарии к задаче:
Сначала мы должны предложить пользователю ввести любое целое положительное число. Это мы делаем с помощью этой строчки:
System.out.(“Введите любое целое положительное число: “); |
Чтобы считать с консоли введенное пользователем число, нам нужен сканер. Поэтому мы выполняем 3 шага.
Шаг №1 – подключаем сканер из библиотеки java.util с помощью этой строчки
import java.util.Scanner; |
Шаг №2 – объявляем сканер
Scanner sc = new Scanner(System.in); |
Шаг №3 – считываем с консоли введённое целое число. Для этого используем метод nextInt ()
В условиях задачи сказано, что числа будут суммироваться от 1 до введённого пользователем числа. Не кажется ли Вам, что это цикл? Да, конечно же это цикл. Причем мы заранее знаем сколько раз будут суммироваться числа: от 1 до n, где n – введённое пользователем число. А значит нам надо использовать цикл for.
Пишем строчку с конструкцией цикла for:
for (int i=1; i<= n; i++) |
По условию задачи, нам надо суммировать числа от 1 до n. Для этого перед циклом мы объявляем переменную int sum и присваиваем ей значение 0:
В переменную sum будут суммироваться числа с помощью цикла for
int sum = 0; for (int i=1; i<= n; i++){ sum = sum + i; } |
Далее с помощью этой строчки выводим результат суммирования на консоль
System.out.ln (sum); |
Надеемся, что наша статья была Вам полезна. Также есть возможность записаться на наши курсы по Java в Киеве. Обучаем с нуля.
По всем вопросам звоните:
+38 050 205 77 99
+38 098 205 77 99
Или читайте информацию по нашим курсам Java c нуля у нас на сайте.
Источник
Цели урока:
- Рассмотреть решение задачи с использованием различных видов циклов.
- Сформировать умение решать задачи с использованием циклов.
- Способствовать развитию таких мыслительных операций, как анализ, синтез, обобщение.
- Развитие познавательного интереса.
План урока:
- Постановка цели урока.
- Актуализация знаний и умений учащихся.
- решение задач.
- Домашняя работа.
- Подведение итогов урока.
Ход урока
I. Постановка цели урока.
Освоив, операторы присваивания и научившись пользоваться условным оператором IF, теоретически можно написать любую программу. Но в нашей повседневной жизни мы очень часто встречаемся с процессами, которые повторяются во времени несколько раз. Например: прорастание растения из семечки, смена времён года, смена времени суток, покраска забора, укладка кирпича и т.д. Гораздо удобнее в этих случаях использовать циклы. Циклы позволяют существенно упростить алгоритм и текст программы, сделать программу изящной, гибкой, более привлекательной. Сегодня на уроке мы будем решать такие задачи и убедимся в этом сами.
II. Актуализация знаний и умений учащихся.
Но прежде чем мы перейдём к решению задач, давайте вспомним с вами, какие циклы вы знаете?
В чём отличительная черта цикла While?
В чём отличительная черта цикла Repeat?
В чём отличительная черта цикла с параметром?
Ответы учащихся сопровождаются демонстрацией слайдов №№ 2-8 презентации к уроку см. Приложение.
III. Решение задач.
Задача:
Гражданин 1 марта открыл счёт в банке, вложив 1000 рублей. Через каждый месяц размер вклада увеличивается на 2% от имеющейся суммы. Определить:
Сумму вклада через один, два, …, двенадцать месяцев.
Текст задачи выводится на экран слайд презентации № 9.
1. Анализ условия:
- Что нам известно?
- Что надо найти?
- Сколько переменных используется в задаче?
- Какие переменные мы будем вводить, а какие рассчитывать?
- К какому типу относятся переменные вводимые с клавиатуры?
- Если эти переменные относятся к вещественному типу, то какой результат мы получим?
- Как мы обозначим переменные?
Проанализировав условие данной задачи, мы можем записать описательную часть программы на языке Pascal.
Слайд презентации № 10.
2. Построение математической модели решения:
Первоначальный вклад а0=1000
1 месяц: а1=а0+а0*0,02
2 месяц: а2=а1+а1*0,02
—————————-
10 месяц: а10=а9+а9*0,02
Общий случай: an=an-1+an-1*0,02
Слайд презентации № 11.
3. Составление алгоритма решения:
Слайд презентации № 12.
4. Запись программы:
Program vklad;
Var i: integer;
a: real;
Begin Writeln (‘введите значение первоначального вклада’);
Readln (а);
For i:=1 to 12 do
begin a:= a + a*0,02;
writeln (a); end;
end.
Слайд презентации № 13.
А теперь запишите данную программу с помощью цикла ДО или цикла ПОКА кому как удобнее.
Цикл до:
Program vklad;/
Var i: integer;
a: real;
Begin Writeln (‘введите значение первоначального вклада’);
Readln (а);
i:=1;
repeat
a:= a+a*0,02;
writeln (a);
i:=i+1;
until i>12;
end.
Цикл пока:
Program vklad;
Var i: integer;
a: real;
Begin Writeln (‘введите значение первоначального вклада’);
Readln (а);
i:=1;
while i<=12 do
begin a:= a+a*0,02;
writeln (a);
i:=i+1; end;
end.
Слайд презентации № 14.
IV. Домашняя работа.
Решите задачу, используя цикл на ваше усмотрение.
Одноклеточная амёба каждые 3 часа делится на 2 клетки. Определить, сколько будет клеток через 3, 6, 9, …, 24 часа.
Слайд презентации № 15.
Источник
Простейшие алгоритмы
№1. Сумма вводимых целых чисел
begin var n := ReadInteger(‘Введите число слагаемых:’); var s := 0.0; for var i:=1 to n do begin var x := ReadReal($’Введите слагаемое №{i}:’); s += x; end; ln($’Сумма равна {s}’); end.
В алгоритме используются интерполированные строки вида $’Сумма равна {s}’. Они начинаются с $. Выражение в фигурных скобках, расположенное в такой строке, заменяется на его значение.
№2. Произведение целых чисел
begin var n := ReadInteger(‘Введите число множителей: ‘); var p := 1.0; for var i:=1 to n do begin var x := ReadReal(‘Введите множитель: ‘); p *= x; end; ln($’Произведение равно {p}’); end.
№3. Двойной факториал n!!=n*(n-2)*(n-4)*…*2 (или 1)
begin var x := ReadInteger(‘Введите x: ‘); var p := 1; while x>=2 do begin p *= x; x -= 2; end; ln($’Двойной факториал равен {p}’); end.
№4. Сколько нечетных среди n введенных
begin var n := ReadInteger(‘Введите n: ‘); var c := 0; for var i:=1 to n do begin var x := ReadInteger(‘Введите целое число: ‘); if x mod 2 <> 0 then c += 1; end; ln($’Количество нечетных равно {c}’); end.
№5. Защита от неверного ввода
begin var x: real; repeat x := ReadReal(‘Введите x>0: ‘); if x<=0 then ln(‘Неверный ввод’); until x>0; end.
№6. Табулирование функции f(x) на отрезке в точках, разбивающих отрезок на N частей
Дан отрезок [a,b]
f(x: real) := sin(x)*x; begin var N := ReadInteger(‘Введите N: ‘); Assert(N>0); var (a,b) := ReadReal2(‘Введите a и b: ‘); var h := (b-a)/N; var x := a; loop N+1 do begin Writeln(x:5:2,f(x):10:4); x += h; end; end.
№6a. Решение, использующее while. Погрешность округления и вычислительная погрешность
f(x: real): real:= sin(x)*x; begin var N:=ReadInteger(‘Введите N: ‘); Assert(N>0); var (a,b):=ReadReal2(‘Введите a и b: ‘); var h := (b-a)/N; var x := a; while x <= b+h/2 do begin writeln(x:5:2,f(x):10:4); x += h; end; end.
Рекуррентные соотношения
№7. Вывод 10 первых степеней двойки
begin var x := 2; for var i := 1 to 10 do begin writeln(i:2,x:5); x *= 2; end; end.
№8. Вывод всех двухзначных чисел, кратных 5
begin var x := 10; while x < 100 do begin writeln(x:3); x += 5; end; end.
№9. Вывод n первых чисел Фибоначчи
begin var n := ReadInteger(‘Введите целое число n (n > 1): ‘); Assert(n>1); var (a,b) := (1,1); (a,b); loop n-2 do begin (a,b):=(b,a+b); (b); end; end.
В алгоритме используются кортежи. В момент переприсваивания в цикле создаются буферные переменные, что позволяет нам избежать их объявления вручную.
№10. Найти НОД(A,B), используя алгоритм Евклида:
НОД(A,B) = НОД(B,A mod B); НОД(A,0) = A
begin var (a,b):=ReadInteger2(‘Введите целые числа A и B: ‘); while b<>0 do (A,B):=(B,A mod B); ln($’НОД(A,B) = {A}’); end.
№11. Найти сумму цифр целого числа m
begin var m := ReadInteger(‘Введите целое число m: ‘); var (s,m1) := (0,abs(m)); while m1 > 0 do begin s += m1 mod 10; m1 := m1 div 10; end; ln($’Сумма цифр числа {m} равна {s}’); end.
Для работы с отрицательными числами в алгоритме используется стандартная функция abs(x) возвращающая модуль от x.
Максимумы и минимумы
№12. Найти max из введенных чисел
begin var n := ReadInteger(‘Введите целое число n (n>0): ‘); assert(n>0); var x := ReadReal(‘Введите 1 число: ‘); var max := x; for var i := 2 to n do begin x := ReadReal($’Введите {i} число: ‘); if max < x then max := x; end; ln($’Максимальное из введенных чисел: {max}’); end.
№12a. Найти min, удовлетворяющее условию p(x)
// Условие взятое как пример (Если число положительное, то условие p(x) возвращает true, иначе false) p(x: real): boolean:=x > 0; begin var n := ReadInteger(‘Введите целое число n (n>0): ‘); assert(n>0); var min := real.MaxValue; for var i := 1 to n do begin var x := ReadReal($’Введите {i} число: ‘); if (x < min) and p(x) then min := x; end; if min = real.MaxValue then ln(‘Нет чисел, удовлетворяющих условию’) else ln($’Минимальное из введенных чисел, удовлетворяющее условию: {min}’); end.
Суммирование рядов (конечных и бесконечных)
№13. Вычислить Σ(i=1..n) a^i/i!
begin var a:=ReadReal(‘Введите a: ‘); var n:=ReadInteger(‘Введите n (n>0): ‘); assert(n>0); var x := a; var s := x; for var i := 2 to n do begin x *= a / i; s += x; end; ln($’Сумма = {s}’); end.
№13a. Вычислить Σ(i=1..∞) (-1)^i * a^i/i!
begin var a:=ReadReal(‘Введите a (0 < a < 1): ‘); assert((a>0) and (a<1)); var eps := 0.0001; var i := 1; var s := 0.0; var y := -a; repeat s += y / i; i += 1; y *= -a; until abs(y/i) < eps; ln($’Сумма = {s}’); end.
Поиск значения
№14. Есть ли среди введенных число k?
var n,k: integer; begin write(‘Введите целые числа n (n>0) и k: ‘); readln(n,k); assert(n>0); var Exists := false; for var i := 1 to n do begin write(‘Введите ‘, i, ‘ целое число: ‘); var x := ReadInteger; if x = k then begin Exists := true; break; end; end; if Exists then writeln(‘Число ‘, k, ‘ было введено’) else writeln(‘Число ‘, k, ‘ не было введено’); end.
№14b. Есть ли среди введенных число k? (то же с использованием while)
var n,k: integer; begin write(‘Введите целые числа n (n>0) и k: ‘); readln(n,k); assert(n>0); var Exists := false; var i := 1; while (i <= n) and not Exists do begin write(‘Введите ‘, i, ‘ целое число: ‘); var x := ReadInteger; i += 1; if x = k then Exists := true; end; if Exists then writeln(‘Число ‘, k, ‘ было введено’) else writeln(‘Число ‘, k, ‘ не было введено’); end.
№15. Является ли число N>1 простым?
begin write(‘Введите целое число N (N>1): ‘); var N := ReadInteger; assert(N>1); var IsPrime := True; for var i := 2 to round(sqrt(N)) do if N mod i = 0 then begin IsPrime := False; break; end; if IsPrime then writeln(‘Число ‘, N, ‘ является простым’) else writeln(‘Число ‘, N, ‘ является составным’); end.
Другие алгоритмы
№16. Разложение числа на простые множители
begin var x := ReadInteger(‘Введите целое число x (x>1): ‘); assert(x>1); var i := 2; write(x, ‘ = 1’); repeat if x mod i = 0 then begin (‘*’, i); x := x div i; end else i += 1; until x = 1; end.
№17. Вычисление значения многочлена в точке x по схеме Горнера
var x,a: real; n: integer; begin write(‘Введите x: ‘); readln(x); write(‘Введите степень многочлена n (n>0): ‘); readln(n); assert(n>=0); write(‘Введите коэффициенты: ‘); readln(a); var s := a; for var i := 1 to n do begin write(‘Введите a_{‘, i+1,’}: ‘); readln(a); s := s*x + a; end; writeln(‘Значение многочлена p(x) = a_{1}*x^n + a_{2}*x^(n-1) + … + a_{n}*x + a_{n+1} в точке x = ‘, x, ‘ равно ‘, s); end.
№18. Дана непрерывная на отрезке функция f(x), имеющая на отрезке ровно один корень. Найти его методом половинного деления
Дан отрезок [a,b] (f(a)*f(b)<=0)
// В качестве примера взяты eps = 0.0001 и функция f(x) = sin(x) const eps = 0.0001; const f = sin; var a,b: real; begin write(‘Введите числа a и b (a<b): ‘); readln(a,b); assert(a<b); var fa := f(a); var fb := f(b); assert(fb*fa<0); while (b-a) > eps do begin var x := (b+a)/2; var fx := f(x); if fa*fx <= 0 then b := x; else begin a := x; fa := fx; end; end; writeln(‘Корень функции на [a,b] равен ‘,(b+a)/2); end.
© Буцев Виктор, Белоусько Тихон, Зуев Семен, Гончаров Владислав, Батраков Михаил, Гаджиев Казанфар, Пак Владислав
Источник