Найти корень уравнения методом половинного деления - 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;
}

Объяснение кода листинга программы

  1. Включаются необходимые заголовочные файлы
  2. Определяется функция func(double x, double a, double b, double c, double d), которая представляет собой выражение под корнем
  3. Определяется функция print_error(), которая выводит сообщение об ошибке и возвращает 0
  4. Определяется функция get_number(char* s), которая считывает число с плавающей точкой или знак минус и возвращает его в переменной типа double
  5. В функции main() считываются значения переменных a, b, c, d, j, g и u с помощью функции get_number(string)
  6. Определяются значения переменных eps и n
  7. Выполняется проверка на корректность начального условия (если функция func(j, a, b, c, d) умноженная на func(g, a, b, c, d) больше 0)
  8. Если условие выполняется, то в цикле while происходит бинарный поиск корня методом половинного деления
  9. Внутри цикла вычисляются значения u, j и g, а также выводится информация о количестве итераций и значениях переменных u, j и g
  10. Если условие в начале функции main() не выполняется, то выводится сообщение об ошибке
  11. В конце программы выполняется пауза и возвращается 0

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 4.2 из 5
Похожие ответы