Найти корень уравнения методом половинного деления - 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
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д