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

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

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

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

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

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <math.h>
  3.  
  4. #define EPS ( 1.0e-6 )
  5.  
  6. enum RESULT { R_NO_ROOTS, R_ONE_ROOT, R_TWO_ROOTS, R_DIV_ZERO, R_BAD_PARAM };
  7.  
  8. #define good_root(x, a, b, c) ( ( fabs((x) + (b)) >= EPS ) && ( fabs(((x) + (a)) / ((x) + (b)) - (x) * (c)) < EPS ) )
  9.  
  10. int equation(const double _a, const double _b, const double _c, double * pX1, double * pX2) {
  11.     double a = _c;
  12.     double b = _c * _b - 1.0;
  13.     double c = -1.0 * _a;
  14.     double d = b * b - 4.0 * a * c;
  15.     int first = 0, second = 0;
  16.    
  17.     if ( fabs(a) < EPS )
  18.         return R_BAD_PARAM;
  19.    
  20.     else if ( d < 0.0 )
  21.         return R_NO_ROOTS;
  22.    
  23.     else if ( fabs(d) < EPS ) {
  24.         *pX1 = ( -1.0 * b ) / ( 2.0 * a );
  25.         return ( fabs(*pX1 + _b) < EPS ) ? R_DIV_ZERO : ( fabs((*pX1 + _a) / (*pX1 + _b) - *pX1 * _c) < EPS ) ? R_ONE_ROOT : R_NO_ROOTS;
  26.     }
  27.    
  28.     else {
  29.         *pX1 = ( -1.0 * b - sqrt(d) ) / ( 2.0 * a );
  30.         *pX2 = ( -1.0 * b + sqrt(d) ) / ( 2.0 * a );
  31.        
  32.         first = good_root(*pX1, _a, _b, _c);
  33.         second = good_root(*pX2, _a, _b, _c);
  34.        
  35.         if ( first )
  36.             return ( second ) ? R_TWO_ROOTS : R_ONE_ROOT;
  37.        
  38.         else if ( second ) {
  39.             *pX1 = *pX2;
  40.             return R_ONE_ROOT;
  41.         }
  42.     }
  43.  
  44.     return R_NO_ROOTS;
  45. }
  46.  
  47. int main(void) {
  48.     double a, b, c, x1, x2;
  49.    
  50.     while ( printf("Enter space separated A, B and C: ") && scanf("%lf %lf %lf", &a, &b, &c) == 3 ) {
  51.         switch ( equation(a, b, c, &x1, &x2) ) {
  52.             case R_BAD_PARAM :
  53.                 printf("Parameter C can't be ZERO.\n");
  54.                 break;
  55.             case R_NO_ROOTS :
  56.                 printf("No roots for given parameters.\n");
  57.                 break;
  58.             case R_DIV_ZERO :
  59.                 printf("The only root cause zero division.\n");
  60.                 break;
  61.             case R_ONE_ROOT :
  62.                 printf("Just one root: %f\n", x1);
  63.                 break;
  64.             case R_TWO_ROOTS :
  65.                 printf("First root: %f\nSecond root: %f\n", x1, x2);
  66.                 break;
  67.             default :
  68.                 fprintf(stderr, "Unknown error!\n");
  69.                 return 1;
  70.         }
  71.     }
  72.    
  73.     return 0;
  74. }

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

  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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы