Перевести код из С++ в Си - C (СИ) (69518)
Формулировка задачи:
Помогите пожалуйста
#include "stdafx.h"
#include <iostream>
#include <math.h>
using namespace std;
double fix(double(*f)(double), double a, double b, double eps);
double f(double x);
int i;
int _tmain(int argc, _TCHAR* argv[])
{
setlocale(LC_ALL, "");//подключение языков
double a, b, eps;
cout << "Нахождение приближенного значения корня методом деления отрезка пополам.\nВведите левую границу отрезка 'a' = ";
cin >> a;//ввод левой границы отрезка 'a'
cout << "Введите правую границу отрезка 'b' = ";
cin >> b;//ввод правой границы отрезка 'b'
cout << "Введите точность нахождения 'eps' = ";
cin >> eps;//ввод точности нахождения 'eps'
cout << "Приближенное значение корня = " << fix(f, a, b, eps) << endl;
cout << "Приближенное значение корня найдено за " << i << " шагов" << endl;
system("PAUSE");
return 0;
}
double fix(double(*f)(double), double a, double b, double eps)
{
double x = (a + b) / 2;
while ((abs(b - a)>eps) && (f(x) != 0))
{
if (f(a)*f(x)<0)
b = x;
else
a = x;
x = (a + b) / 2;
cout << "x=" << x << endl;
i++;
}
return x;
}
double f(double x)
{
return sin(x);
}Решение задачи: «Перевести код из С++ в Си»
textual
Листинг программы
#include "stdafx.h"
//#include <iostream>
#include <math.h> /*библиотека матем. функций*/
#include <stdio.h> /*printf*/
#include <locale.h> /*библиотека выбора языка*/
double fix(double a, double b, double eps);
double f(double x);
int i;
int main()
{
double a, b, eps;
setlocale(LC_CTYPE, "");//подключение языков
printf("Нахождение приближенного значения корня методом деления отрезка пополам.\nВведите левую границу отрезка 'a' = ");
scanf("%lf", &a);//ввод левой границы отрезка 'a'
printf("Введите правую границу отрезка 'b' = ");
scanf("%lf", &b);//ввод правой границы отрезка 'b'
printf("Введите точность нахождения 'eps' = ");
scanf("%lf", &eps);//ввод точности нахождения 'eps'
printf("Приближенное значение корня = %lf\n", fix(a, b, eps));
printf("Приближенное значение корня найдено за %d шагов\n", i);
return 0;
}
double fix(double a, double b, double eps)
{
double x = (a + b) / 2;
i = 0;
while ((fabs(b - a)>eps) && (f(x) != 0))
{
if (f(a)*f(x)<0)
b = x;
else
a = x;
x = (a + b) / 2;
printf("x=%lf\n", x);
i++;
}
return x;
}
double f(double x)
{
return sin(x);
}
Объяснение кода листинга программы
- В функции
mainпрограмма запрашивает у пользователя значения переменныхa,bиepsс помощью функцииscanf. - Значения переменных
a,bиepsсохраняются в соответствующих переменных. - С помощью функции
fixосуществляется поиск корня методом деления отрезка пополам. - В цикле
whileпроисходит сравнение разностиb-aс заданной точностьюepsи проверка на ненулевой знаменатель функцииf(x). - Если знаменатель функции
f(x)меняется знака при переходе отaкx, тоbприсваивается значениеx. - Если знаменатель функции
f(x)не меняет знака при переходе отaкx, тоaприсваивается значениеx. - Значение
xобновляется как среднее арифметическоеaиb. - В цикле
whileвыполняется проверка условия и увеличивается счетчикiпри каждом шаге итерации. - Функция
fixвозвращает значениеxкак приближенное значение корня. - Значение
iвыводится на экран с помощью функцииprintf. - Значение
xвыводится на экран с помощью функцииprintf. - В функции
fреализуется вычисление значения функцииsin(x). - Значение функции
f(x)выводится на экран с помощью функцииprintf.