Tak na szybkiego:
#pragma hdrstop#include <stdio.h>#include <string.h>#include <stdlib.h>#include <math.h>#pragma argsusedfloat f1(float x) {return x * x + 3;}float f2(float x) {return -x * x + 3 * x + 6;}int main() { float a = 0, b = 4, c, eps = 0.001; int step = 0, max_step = 1000; do { c = (a + b) / 2; if ((f1(c) - f2(c)) * (f1(b) - f2(b)) < 0) a = c; else b = c; step++; } while (fabs(f1(c) - f2(c)) > eps && step < max_step); printf("x: %f", c); return 0;}
Pascala nie trawię. Kod z łatwością przerobisz. Nie daję gwarancji, że w każdym przypadku będzie działać jak należy bo programista raczej kiepski ze mnie :/
P.S. 1 Max_step to "zawór bezpieczeństwa" w pętli. Dodałem na wszelki wypadek gdyby funkcje w przedziale [a, b] się nie przecięły. Jeśli funkcję się przecinają, a zadana dokładność nie została osiągnięta, to trzeba zwiększyć wart. max_step.
P.S. 2 Przed wejściem do pętli można sprawdzić czy istnieje co najmniej jeden punkt przecięcia funkcji. Musi być spełniony ten warunek:
(f1(a) - f2(a)) * (f1(b) - f2(b)) < 0
EDIT:
Przy parzystej liczbie przecięć funkcji w przedziale w/w warunek nie będzie spełniony. W takim wypadku należy zawęzić przedział do jednego przecięcia. W przypadku nieparzystej liczby przecięć też należy zawęzić przedział.