Составить функцию для решения уравнения - C (СИ)
Формулировка задачи:
Пользователь вводит три вещественных числа: a,b,c. Составить функцию для
решения уравнения (x+a)/(x+b)=сx, которая получает введенные числа в качестве
параметров. Найденные корни уравнения функция возвращает в качестве двух других
параметров.
Результат, который возвращает сама функция, должен позволять отслеживать
следующие случаи (зависящие от значений введенных чисел): уравнение имеет только
один корень, нет вещественных корней, корни одинаковые, деление на нуль.
не могу понять про то что функция должна возращать результат. как это надо писать7
Листинг программы
- #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");
- }
Решение задачи: «Составить функцию для решения уравнения»
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;
- }
Объяснение кода листинга программы
- Объединение функций и переменных:
- Объединение функции
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
.
- Объединение функции
- Исправление ошибок:
- Устранение ошибки с использованием
scanf
для ввода чисел. - Использование
double
вместоint
для переменныхa
,b
,c
,x1
,x2
в функцииmain
. - Устранение ошибки с использованием
printf
для вывода результатов.
- Устранение ошибки с использованием
- Улучшение кода:
- Использование определения
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
.
- Использование определения
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д