Составить функцию для решения уравнения - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Пользователь вводит три вещественных числа: a,b,c. Составить функцию для решения уравнения (x+a)/(x+b)=сx, которая получает введенные числа в качестве параметров. Найденные корни уравнения функция возвращает в качестве двух других параметров. Результат, который возвращает сама функция, должен позволять отслеживать следующие случаи (зависящие от значений введенных чисел): уравнение имеет только один корень, нет вещественных корней, корни одинаковые, деление на нуль.
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
void qvadr(float a, float b, float c){ float d,x1,x2;
        d=(c*b-1)*(c*b-1)+4*c*a;
        if (d>0) {x1=(-b+sqrt(d))/(2*a);printf("%f",x1);
                  x2=(-b-sqrt(d))/(2*a);printf("%f",x2);
                  }
        if (d=0) {x1=(-b+sqrt(d))/(2*a);printf("%f",x1);  }
        if (d<0) printf("net kornei");
    }
не могу понять про то что функция должна возращать результат. как это надо писать7

Решение задачи: «Составить функцию для решения уравнения»

textual
Листинг программы
#include <stdio.h>
#include <math.h>
 
#define EPS ( 1.0e-6 )
 
enum RESULT { R_NO_ROOTS, R_ONE_ROOT, R_TWO_ROOTS, R_DIV_ZERO, R_BAD_PARAM };
 
#define good_root(x, a, b, c) ( ( fabs((x) + (b)) >= EPS ) && ( fabs(((x) + (a)) / ((x) + (b)) - (x) * (c)) < EPS ) )
 
int equation(const double _a, const double _b, const double _c, double * pX1, double * pX2) {
    double a = _c;
    double b = _c * _b - 1.0;
    double c = -1.0 * _a;
    double d = b * b - 4.0 * a * c;
    int first = 0, second = 0;
    
    if ( fabs(a) < EPS )
        return R_BAD_PARAM;
    
    else if ( d < 0.0 )
        return R_NO_ROOTS;
    
    else if ( fabs(d) < EPS ) {
        *pX1 = ( -1.0 * b ) / ( 2.0 * a );
        return ( fabs(*pX1 + _b) < EPS ) ? R_DIV_ZERO : ( fabs((*pX1 + _a) / (*pX1 + _b) - *pX1 * _c) < EPS ) ? R_ONE_ROOT : R_NO_ROOTS;
    }
    
    else {
        *pX1 = ( -1.0 * b - sqrt(d) ) / ( 2.0 * a );
        *pX2 = ( -1.0 * b + sqrt(d) ) / ( 2.0 * a );
        
        first = good_root(*pX1, _a, _b, _c);
        second = good_root(*pX2, _a, _b, _c);
        
        if ( first ) 
            return ( second ) ? R_TWO_ROOTS : R_ONE_ROOT;
        
        else if ( second ) {
            *pX1 = *pX2;
            return R_ONE_ROOT;
        }
    }
 
    return R_NO_ROOTS;
}
 
int main(void) {
    double a, b, c, x1, x2;
    
    while ( printf("Enter space separated A, B and C: ") && scanf("%lf %lf %lf", &a, &b, &c) == 3 ) {
        switch ( equation(a, b, c, &x1, &x2) ) {
            case R_BAD_PARAM :
                printf("Parameter C can't be ZERO.\n");
                break;
            case R_NO_ROOTS :
                printf("No roots for given parameters.\n");
                break;
            case R_DIV_ZERO :
                printf("The only root cause zero division.\n");
                break;
            case R_ONE_ROOT :
                printf("Just one root: %f\n", x1);
                break;
            case R_TWO_ROOTS :
                printf("First root: %f\nSecond root: %f\n", x1, x2);
                break;
            default :
                fprintf(stderr, "Unknown error!\n");
                return 1;
        }
    }
    
    return 0;
}

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

  1. Объединение функций и переменных:
    • Объединение функции equation и переменных a, b, c, d, first, second, good_root и EPS в единый код.
    • Объединение переменных x1 и x2 в массив double pX1, double pX2 в функции equation.
    • Объединение переменных a, b, c в массив double _a, double _b, double _c в функции main.
  2. Исправление ошибок:
    • Устранение ошибки с использованием scanf для ввода чисел.
    • Использование double вместо int для переменных a, b, c, x1, x2 в функции main.
    • Устранение ошибки с использованием printf для вывода результатов.
  3. Улучшение кода:
    • Использование определения enum RESULT для обработки результатов функции equation.
    • Использование функции good_root для проверки корней.
    • Использование условного оператора switch для обработки результатов функции equation.
    • Использование break для выхода из цикла while в функции main.
    • Использование default для обработки неизвестных ошибок.
    • Использование fprintf для вывода сообщения об ошибке в функции main.
    • Использование return 1; для возврата ошибки в функции main.
    • Использование printf для вывода значений переменных a, b, c, x1, x2 в функции main.
    • Использование функции sqrt для вычисления квадратного корня.
    • Использование функции scanf для ввода чисел с пробелами в функции main.
    • Использование функции printf для вывода сообщения об ошибке в функции main.

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


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

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

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