Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 58, средняя оценка - 4.66
Alekcandr9
0 / 0 / 0
Регистрация: 12.04.2011
Сообщений: 12
#1

Задание на вычисление синуса - C++

12.04.2011, 12:36. Просмотров 8014. Ответов 21
Метки нет (Все метки)

В этой задачке нужно вычислить синус вводимого угла без использования библиотеки <cmath>

Я сколько не пытался не получается вот последняя разработка "чего-то":

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include "stdafx.h"
#include "iostream"
 
using namespace std;
 
double a, b, c, sin;
int n, x;
 
int main(void)
{
setlocale(0,"Rus");
cout << "Введите значение, которого нужно вычислить синус: "; cin >> x;
for(n = 0; n < 1001; n ++){
    b += 2*n+1;
        if(n%2!=0){a = 0;}
        else if(n%2 == 0){
        a += (-1 * n); 
        c += x * b;}
        sin += a / b * c;   
}
    cout << a << "\t" << b << "\t" << c << "\n";
    cout  << "Синус равен: " << sin << "\n";
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.04.2011, 12:36
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Задание на вычисление синуса (C++):

Вычисление гиперболического синуса - C++
Помогите пожалуйста, абсолютно не могу понять..

Циклы: вычисление синуса - C++
Приступил к циклам. Задание такое: Как известно, функция sin(x) может может быть вычислена в виде ряда ...

Неправильное вычисление синуса угла - C++
#include &lt;iostream&gt; #include &lt;cmath&gt; #include &lt;math.h&gt; using namespace std; void main() { ...

Задание массивов, вывод их на печать и вычисление вспомогательных выражений - C++
Заданы 3 массива случайных вещественных чисел, определённой размерности A, B, C Необходимо вычислить значение М при помощи вычисления...

Реализовать задание с использованием функций (ввод матрицы, вывод матрицы, вычисление суммы) - C++
Реализовать задание с использованием функций (ввод матрицы, вывод матрицы, вычисление суммы) и цикла for для вычисления суммы. Изменение...

таблица синуса от о до п/2 - C++
Здравствуйте...помогите пожалйста составить прогу с while чтобы на экране появилась таблица синуса от о до п/2..и объясните пожалуйста...

21
ailia
27 / 26 / 1
Регистрация: 27.12.2009
Сообщений: 106
12.04.2011, 12:42 #2
что именно не получается?
0
Alekcandr9
0 / 0 / 0
Регистрация: 12.04.2011
Сообщений: 12
12.04.2011, 12:49  [ТС] #3
нет не из за этого тут же происходит вычисление по формуле Тейлора

где a = -1^n, b = (2*n+1)! а c=x^(2*n+1)

результаты работы если sin += a / b * c;

Введите значение, которого нужно вычислить синус: 90
-1000 1.002e+006 1.50902e+010
Синус равен: -1.506e+007
Для продолжения нажмите любую клавишу . . .

если же sin = a / b * c;

Введите значение, которого нужно вычислить синус: 90
-1000 1.002e+006 1.50902e+010
Синус равен: -2.52255e+009
Для продолжения нажмите любую клавишу . . .
0
ailia
27 / 26 / 1
Регистрация: 27.12.2009
Сообщений: 106
12.04.2011, 12:52 #4
может <math.h> подключить?
0
taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
12.04.2011, 12:55 #5
Цитата Сообщение от Alekcandr9 Посмотреть сообщение
Введите значение, которого нужно вычислить синус: 90
-1000 1.002e+006 1.50902e+010
Синус равен: -2.52255e+009
А что за угол 90 радиан?
0
Alekcandr9
0 / 0 / 0
Регистрация: 12.04.2011
Сообщений: 12
12.04.2011, 12:55  [ТС] #6
извините я криво написал условие, но сейчас переписываю , дело в том что ни math.h ни cmath нельзя подключать
0
taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
12.04.2011, 12:56 #7
Должно, кстати, получиться 0.893996664.
0
Alekcandr9
0 / 0 / 0
Регистрация: 12.04.2011
Сообщений: 12
12.04.2011, 13:05  [ТС] #8
taras atavin

вы знаете я и сам не пойму почему такой ответ выдаётся(

Добавлено через 8 минут
Наконец то переписал код по человечески и вот условие: Вычислить синус не используя библиотек cmath и math.h. Вычислял с помощью ряда Тейлора. Вот что получилось

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include "stdafx.h"// библеотека для ВС
#include "iostream"//библиотека для cin and cout
 
using namespace std;//определяем пространство имён
 
double a, b, c, sin;//задаём переменные типа double
int n, x;//задаём переменные типа int
 
int main(void)
{
setlocale(0,"Rus");//ставим русский шрифт
cout << "Введите значение, которого нужно вычислить синус: "; cin >> x;//Запрашиваем ввести значение и помещаем его в переменную х
for(n = 0; n < 1001; n ++){//цикл в котором перебираются значения от 0 до 1001 с шагом в 1
    b += 2*n+1;// вычисляется выражение 2n+1  а так как += то при следующем шаге происходит прибавление к этому значнию предыдущего
        if(n%2!=0){a = 0;}//если при делении n по полам остаётся остаток то а = 0 так как в ряде все степени нечётные
        else if(n%2 == 0){//если нет 
        a += (-1 * n); //вычисляется -1^n
        c += x * b;}
        sin = a / b * c;//  вычисляется синус 
}
    cout << a << "\t" << b << "\t" << c << "\n";//Вывод коэффициетнов а, б, с
    cout  << "Синус равен: " << sin << "\n";//Вывод полученного значения синуса
}
кстати мне писали убрать + после синуса когда писал комменты понял что вы были правы
0
Danvern
40 / 39 / 3
Регистрация: 22.06.2010
Сообщений: 415
Записей в блоге: 1
12.04.2011, 13:08 #9
сорри был не прав
0
Alekcandr9
0 / 0 / 0
Регистрация: 12.04.2011
Сообщений: 12
12.04.2011, 13:13  [ТС] #10
Danvern сейчас попробую

Добавлено через 4 минуты
перевёл в радианы код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include "stdafx.h"// библеотека для ВС
#include "iostream"//библиотека для cin and cout
#define PI 3,14159265358979323846
using namespace std;//определяем пространство имён
 
double a, b, c, sin;//задаём переменные типа double
int n, x;//задаём переменные типа int
 
int main(void)
{
setlocale(0,"Rus");//ставим русский шрифт
cout << "Введите значение, которого нужно вычислить синус: "; cin >> x;//Запрашиваем ввести значение и помещаем его в переменную х
x = x * PI/180;
for(n = 0; n < 1001; n ++){//цикл в котором перебираются значения от 0 до 1001 с шагом в 1
    b += 2*n+1;// вычисляется выражение 2n+1  а так как += то при следующем шаге происходит прибавление к этому значнию предыдущего
        if(n%2!=0){a = 0;}//если при делении n по полам остаётся остаток то а = 0 так как в ряде все степени нечётные
        else if(n%2 == 0){//если нет 
        a += (-1 * n); //вычисляется -1^n
        c += x * b;}
        sin = a / b * c;//  вычисляется синус 
}
    cout << a << "\t" << b << "\t" << c << "\n";//Вывод коэффициетнов а, б, с
    cout  << "Синус равен: " << sin << "\n";//Вывод полученного значения синуса
}
результат:

Добавлено через 24 секунды
Введите значение, которого нужно вычислить синус: 90
-1000 1.002e+006 4.52705e+010
Синус равен: -4.51801e+007
Для продолжения нажмите любую клавишу . . .
0
Danvern
40 / 39 / 3
Регистрация: 22.06.2010
Сообщений: 415
Записей в блоге: 1
12.04.2011, 13:18 #11
полюбому не правильно(
0
Alekcandr9
0 / 0 / 0
Регистрация: 12.04.2011
Сообщений: 12
12.04.2011, 13:32  [ТС] #12
Это я и сам понял, знать бы в чём проблема?

Добавлено через 11 минут
Вот ищё код который мы сегодня с однокурсником писали, вернее он создавал а я смотрел

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include "stdafx.h"
#include "iostream"
#define PI 3.14
using namespace std;
    
int main(void)
{
    double sinus,one=-1,F,rad,x;
    double factorial=1,fx;
    int i,k,n=100;
    setlocale(0,"Rus");
    cout << "\nВведите число от которого нужно вычислить синус: "; cin >> x;
    x = x * PI/190;
    for(i=1;i<=n;i++){
          if(i%2!=0){one*=(-1);
          for (k=1;k<=i;k++){factorial*=i;}//расчитать factorial
          for (k=1;k<i;k++){fx=x*x;}//рассчитать fx
          F=one*fx/factorial;
          sinus+=F;}
          else if(i%2==0){factorial*=i;fx=x*x;}
                     }
    cout<<"Res "<<sinus<<endl;
}
результаты при переводе в радианы


Введите число от которого нужно вычислить синус: 1
Res -5.05736e-006
Для продолжения нажмите любую клавишу . . .

без перевода

Введите число от которого нужно вычислить синус: 1
Res -0.018517
Для продолжения нажмите любую клавишу . . .

Добавлено через 1 минуту
извиняюсь:


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include "stdafx.h"
#include "iostream"
#define PI 3.14
using namespace std;
 
int main(void)
{
double sinus,one=-1,F,rad,x;
double factorial=1,fx;
int i,k,n=100;
setlocale(0,"Rus");
cout << "\nВведите число от которого нужно вычислить синус: "; cin >> x;
x = x * PI/190;
for(i=1;i<=n;i++){
if(i%2!=0){one*=(-1);
for (k=1;k<=i;k++){factorial*=i;}//расчитать factorial
for (k=1;k<i;k++){fx=x*x;}//рассчитать fx
F=one*fx/factorial;
sinus+=F;}
else if(i%2==0){factorial*=i;fx=x*x;}
}
cout<<"Res "<<sinus<<endl;
}
результаты при переводе в радианы


Введите число от которого нужно вычислить синус: 1
Res -5.05736e-006
Для продолжения нажмите любую клавишу . . .

без перевода

Введите число от которого нужно вычислить синус: 1
Res -0.018517
Для продолжения нажмите любую клавишу . . .
0
Danvern
40 / 39 / 3
Регистрация: 22.06.2010
Сообщений: 415
Записей в блоге: 1
12.04.2011, 18:55 #13
Меня заинтересовала эта тема, ну собственно я решил разобраться как вычислить синус без стандартных библиотек...
ну вот собственно код.
Вроде провел всё сходиться ))
И кстати в радианы переводить обязательно, либо писать х сразу в них.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream> 
using namespace std;
const float M_PI = 3.14159265;
 
int main()
{
  int fact = 1,z = 1,i = 1;
  double e,x,sum,xSt;
  cout << "Введите x : "; cin >> x;
  x *= M_PI / 180;
  e = 0.0001;
  xSt = x;
  for(int i = 1;xSt / fact >= e;) 
    {
      sum += (z * xSt) / fact; 
      i += 2;
      z *= -1;
      xSt *= x*x;
      fact *= (i -1) * i;
    }
  cout << sum;
  return 0;
}
0
Alekcandr9
0 / 0 / 0
Регистрация: 12.04.2011
Сообщений: 12
12.04.2011, 19:30  [ТС] #14
спасибо большое что написали код для вычисления синуса теперь, т.к. я начинающий с С++ немогли бы вы пояснить как вся эта штука работает?

Добавлено через 21 минуту
и ещё вопрос, конечно очень хорошо что вы написали код, но я приследую цель не тупо скопировать откудато код, а написать свой и самое главное ПОНЯТЬ его, вернёмся непосредственно к вопросу: в течении долгих размышлений я пришёл к выводу: может у меня не получается потому что я по отдельности вычисляю a b c т.е.
C++
1
2
3
4
5
6
7
8
for(n=0; n<1000; n++){//цикл в котором перебираются значения от 0 до 1001 с шагом в 1
    if(n%2!=0){a=0;}//если при делении n по полам остаётся остаток то а = 0 так как в ряде все степени нечётные
        else{//если нет 
        a+=(-1*n);//вычисляется -1^n
        b+=2*n+1;// вычисляется выражение 2n+1  а так как += то при следующем шаге происходит прибавление к этому значнию предыдущего
        c+=x*b;}
        sin=a/b*c;//вычисляется синус 
}
??++

Потомучто в ряде Тейлора сначала происходит вычисление а затем суммирование. . .

Добавлено через 1 минуту
вернее не вычисляю а суммирую
0
Danvern
40 / 39 / 3
Регистрация: 22.06.2010
Сообщений: 415
Записей в блоге: 1
12.04.2011, 19:39 #15
окей.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream> 
using namespace std;
const float M_PI = 3.14159265;// число пи
 
int main()
{
  int fact = 1,z = 1; //начальные значения факториала, переменная отвечающая за знак ряда
  double e,x,sum = 0,xSt;// точность, градусы, сумма рядов, x в степени n
  cout << "Введите x : "; cin >> x;
  x *= M_PI / 180; // перевод в радианы 
  e = 0.0001;
  xSt = x;
  for(int i = 1;xSt / fact >= e;) // пока x в степени n деленное на факториал больше или равно точности
    {
      sum += (z * xSt) / fact;  // прибавляем к сумме рядов значение ряда 
      i += 2; 
      z *= -1; // меняем знак ряда 
      xSt *= x*x;  // возводим в следующую степень
      fact *= (i -1) * i; // находим факториал 
    }
  cout << sum;
  return 0;
}
в 13 посте я забыл sum инициализировать и из-за этого может получиться ложный результат...
и из этой строчки
int fact = 1,z = 1,i = 1;
надо убрать объявление i.

Добавлено через 5 минут
a+=(-1*n);//вычисляется -1^n
вот это строчка вообще неправильная по моему ..
потомуто -1^n записывается не так как увас -1 * n а например если n = 2
то это будет выглядеть так -1 * (-1) а просто -1 * умнажаете сначала 1 потом на 2,3,4,5....,1000

Добавлено через 1 минуту
и с переменной с такая же проблема

Добавлено через 1 минуту
и я не вижу нахождение факториала?
0
12.04.2011, 19:39
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.04.2011, 19:39
Привет! Вот еще темы с ответами:

Ошибка в вычислениях синуса - C++
дана формула z=(2^(-x))*sqrt{x+\sqrt{abs(y)}}*\sqrt{exp^((x-1)/sin(x))}, по ней надо вычислить. Но вот ошибка возникает в синусе, не могу...

Функция для синуса - C++
Помогите найти в чём косяк. #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;cmath&gt; using namespace std; double...

Реализация синуса ряды Тейлора - C++
Здрасте, помогите пожалуйста, пытаюсь реализовать функцию, которая считает синус через ряды Тейлора, но результат получается отрицательный,...

Непонятный вывод значений синуса - C++
Есть вот такой код: #include &lt;iostream&gt; #include &lt;cmath&gt; using namespace std; const double pi = 3.14159265358979; int...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru