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