Составить функцию для решения уравнения - 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.
- Использование определения