Найти корень уравнения методом половинного деления - C (СИ)
Формулировка задачи:
В программе методом половинного деления необходимо найти корень уравнения. Загвоздка в том что при вводе буквы программа автоматически приравнивает все переменные друг к другу и в итоге перебрасывает действие к последнему Else. Так же сделал защиту от дурака на примере одной переменной j, но к сожалению если ввести например 1к защита уже не работает.
Пожалуйста подскажите что исправить)
#include <stdlib.h>
double func(double x,double a, double b, double c, double d)
{
return ((a*x+b)+1/(c*x+d));
}
int main() {
double func(double x,double a, double b, double c, double d);
int n=0;
double a; // переменная
double b; // переменная
double c; // переменная
double d; // переменная
double j; // координата отрезка поиска корня
double g; // координата отрезка поиска корня
double u; // вспомогательная переменная
double eps; // абсолютная погрешность
printf("j=");
if (scanf ("%d", &j) != 1) {
printf("Error.\n");
}
printf("g=");
scanf("%lf", &g);
printf("eps=");
scanf("%lf", &eps);
printf("a=");
scanf("%lf", &a);
printf("b=");
scanf("%lf", &b);
printf("c=");
scanf("%lf", &c);
printf("d=");
scanf("%lf", &d);
if (func(j,a,b,c,d)*func(g,a,b,c,d)<=0)
{
do
{
u=(j+g)/2;
if (func(u,a,b,c,d)*func(j,a,b,c,d)<=0)
g=u;
else j=u;
n+=1;
printf("n=%d\n", n);
printf("u=%lf\n", u);
}
while (fabs(j-g)>=eps);}
else {
printf( "\n Neverno zadany nachalnye usloviya" ); // если ни одно из выше-перечисленных условий не подошло, то программа покажет этот вариант ответа
}
getch();
return 0;
}Решение задачи: «Найти корень уравнения методом половинного деления»
textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <math.h>
double func(double x, double a, double b, double c, double d)
{
return ((a*x + b) + 1 / (c*x + d));
}
int print_error() {
printf("\nIncorrect number...\n");
return 0;
}
double get_number(char* s)
{
char arr_int[10] = { 0 }, arr_fract[10] = { 0 };
char ch;
unsigned short fract = 0, i = 0, j = 0;
int sign = 1;
double d;
printf("\nEnter %s: ", s);
while ((ch = getchar()) != '\n') {
if ((ch == '-') && (i == 0)) { sign = -1;}
else if (isdigit(ch) || (ch == '.')) {
if ((ch == '.') && (i != 0)) fract = 1;
if ((ch == '.') && !( (i==1) && (sign == 1) ) ) fract = 1;
if ( isdigit(ch) && fract == 1) { arr_fract[j] = ch; j++; }
if ( isdigit(ch) && fract == 0) { arr_int[i] = ch; i++; }
}
else return print_error();
}
//printf("\n");
d = atol(arr_int) + atol(arr_fract)*pow(10, -1.0*j);
return d * sign;
}
int main() {
int n = 0;
double a;
if ((a = get_number("a")) == 0) { system("pause"); return -1; } // переменная
double b;
if ((b = get_number("b")) == 0) { system("pause"); return -1; } // переменная
double c = get_number("c"); // переменная
double d = get_number("d"); // переменная
double j = get_number("j"); // координата отрезка поиска корня
double g = get_number("g"); // координата отрезка поиска корня
double u = get_number("u"); // вспомогательная переменная
double eps = get_number("eps"); // абсолютная погрешность
if (func(j, a, b, c, d)*func(g, a, b, c, d) > 0) {
while (fabs(j - g) >= eps) {
u = (j + g) / 2;
if (func(u, a, b, c, d)*func(j, a, b, c, d) <= 0)
g = u;
else j = u;
n += 1;
printf("n=%d\n", n);
printf("u=%lf\n", u);
}
}
else {
printf("\n Neverno zadany nachalnye usloviya\n");
}
system("pause");
return 0;
}
Объяснение кода листинга программы
- Включаются необходимые заголовочные файлы
- Определяется функция
func(double x, double a, double b, double c, double d), которая представляет собой выражение под корнем - Определяется функция
print_error(), которая выводит сообщение об ошибке и возвращает 0 - Определяется функция
get_number(char* s), которая считывает число с плавающей точкой или знак минус и возвращает его в переменной типаdouble - В функции
main()считываются значения переменныхa,b,c,d,j,gиuс помощью функцииget_number(string) - Определяются значения переменных
epsиn - Выполняется проверка на корректность начального условия (если функция
func(j, a, b, c, d)умноженная наfunc(g, a, b, c, d)больше 0) - Если условие выполняется, то в цикле
whileпроисходит бинарный поиск корня методом половинного деления - Внутри цикла вычисляются значения
u,jиg, а также выводится информация о количестве итераций и значениях переменныхu,jиg - Если условие в начале функции
main()не выполняется, то выводится сообщение об ошибке - В конце программы выполняется пауза и возвращается 0