Во вложениях скриншот формул для задачи, нужно реализовать ее решение тремя способами, через цикл while, через do…while и через for. На форуме впервые, может что то упускаю, если так то прошу задавать уточняющие вопросы.
В чем проблема? Что пробовали? Что получилось, что не получилось?
#include<iostream>
#include<locale.h>
#include <cmath>
using namespace std ;
float recur1(int m, float y0, float y1, float y2) ;
float recur2(int m, float y0, float y1, float y2) ;
float recur3(int m, float y0, float y1, float y2) ;
//main_begin
int main()
{int var, m ;
float re1, re2, re3 ; //результаты решения задачи
float y0, y1, y2 ; //исходные данные
setlocale(LC_ALL,"Rus") ;
for(;;)
{//Выбор действия
cout << "\n Вид действия:" << endl ;
cout << " 1 - вычисление суммы по рекуррентной формуле" << endl;
cout << " 2 - завершение задачи" << endl ;
cout << " Введите вид действия -> " ;
cin >> var ;
switch(var)
{case 1://Ввод исходных данных
cout << " Введите m -> " ;
cin >> m ;
cout << " Введите y0, y1, y2 -> " ;
cin >> y0 >> y1 >> y2 ;
re1 = recur1(m, y0, y1, y2) ;
re2 = recur2(m, y0, y1, y2) ;
re3 = recur3(m, y0, y1, y2) ;
//Вывод результата
cout.precision(3); //число знаков после запятой при выводе
cout << " Для цикла WHILE результат = " << re1 << endl;
cout << " Для цикла DO..WHILE результат = " << re2 << endl;
cout << " Для цикла FOR результат = " << re3 << endl;
break;
default: return 1;
}//switch
}//for
}
//main_end
//recur1_beg
//вычисление значения суммы циклом while
float recur1(int m, float y0, float y1, float y2)
{int i = 0 ; //текущий номер слагаемого
float y , //очередное значение y[i]
sum = 0 ; //начальное значение суммы
sum += ((y0 * y0) + (i - 5.) / (m + 1.)); i++;
sum += ((y1 * y1) + (i - 5.) / (m + 1.)); i++;
sum += ((y2 * y2) + (i - 5.) / (m + 1.)); i++;
while(i <= m)
{
y = 1.5 * cos(y2) - 0.1 * sin(y0) + 1.5 * cos(y1);
sum += ((y * y) + (i - 5.) / (m + 1.)); i++;
y0 = y1;
y1 = y2;
y2 = y;
i++;
}
return(((m / 5) + 5) * sum);
}
//recur1_end
//recur2_beg
//вычисление значения суммы циклом do..while
float recur2(int m, float y0, float y1, float y2)
{int i = 0 ; //текущий номер слагаемого
float y , //очередное значение y[i]
sum = 0 ; //начальное значение суммы
sum += ((y0 * y0) + (i - 5.) / (m + 1.)); i++;
sum += ((y1 * y1) + (i - 5.) / (m + 1.)); i++;
sum += ((y2 * y2) + (i - 5.) / (m + 1.)); i++;
do
{y = 1.5 * cos(y2) - 0.1 * sin(y0) + 1.5 * cos(y1);
sum += ((y * y) + (i - 5.) / (m + 1.));
y0 = y1;
y1 = y2;
y2 = y;
i++;
}
while(i <= m);
return(((m / 5) + 5) * sum);
}
//recur2_end_______________________________________________________________
//recur3_beg_______________________________________________________________
//вычисление значения суммы циклом for
float recur3(int m, float y0, float y1, float y2)
{int i = 0; //текущий номер слагаемого
float y , //очередное значение y[i]
sum = 0; //начальное значение суммы
sum += ((y0 * y0) + (i - 5.) / (m + 1.)); i++;
sum += ((y1 * y1) + (i - 5.) / (m + 1.)); i++;
sum += ((y2 * y2) + (i - 5.) / (m + 1.)); i++;
for(; i <= m; i++)
{y = 1.5 * cos(y2) - 0.1 * sin(y0) + 1.5 * cos(y1);
sum += ((y * y) + (i - 5.) / (m + 1.)) ;
y0 = y1 ;
y1 = y2 ;
y2 = y ;
}
return(((m / 5) + 5) * sum);
}
Это мой код, преподаватель ответил "
- Целое на целое дает целый результат. А нужна дробь. (m / 5) 2) Ошибка в реализации формулы для вычисления очередного слагаемого"
Первую ошибку я вроде как исправил хотя не уверен, там были скобки неверно расставлены, а вот вторую так и не понял, где же там ошибка?
Насколько я понял имелась ввиду эта строка y = 1.5 * cos(y2) - 0.1 * sin(y0) + 1.5 * cos(y1);
Вряд ли, с этой строкой же вроде бы всё просто, и всё как в формуле. Наверно речь о чем-то вокруг нее ) Может с y0-2 какая-то путаница.
Тут так и осталось
Надо например 5.
как выше.
Тут речь о том, что 7 / 2
(или две переменные int
с этими значениями) будет 3
. Чтобы получился не целый результат надо хотя бы одно из этих значений сделать не целого типа.
Я правильно понял что для решения этой проблемы нужно просто поставить точку после 5 в формуле, т.е. (((m / 5.) + 5.) * sum); Я просто не понял как мне это проверить. А что с формулой y = 1.5 * cos(y2) - 0.1 * sin(y0) + 1.5 * cos(y1) я вообще не могу понять… даже не знаю как проверить её правильность, с окружением вроде как все впорядке
Вывести m
, sum
и результат вычисления этого выражения.
В каком плане вывести? посчитать всю формулу вручную?
Чтобы понять правильно ли вычисляется (((m / 5) + 5) * sum)
достаточно вывести эти переменные и результат, и сравнить с вычислением вручную.
Например, если m = 9, sum = 10, то должно получиться (1.8 + 5) * 10 = 6.8 * 10 = 68
Вывел, проверил, считает всё правильно, только округляет до целых, дробную часть отбрасывает, я вроде как везде где мог этих точек наставил, но всё равно не помогает
к примеру m = 0; sum 62,3 вручную выходил 423.64, в консоли 424
//Пример 1. Для произвольного значения m вычислить значение суммы заданного вида.
//Значения m, y0, y1, y2 вводятся с клавиатуры. Значение yi
//вычисляется по формуле y[i]=y[i-1] + y[i-3]^2, где i=3,4,...,m
#include<iostream>
#include<locale>
#include <cmath>
using namespace std ;
float recur1(int m, float y0, float y1, float y2) ;
float recur2(int m, float y0, float y1, float y2) ;
float recur3(int m, float y0, float y1, float y2) ;
//main_begin_______________________________________________________________
int main()
{int var, m ;
float re1, re2, re3 ; //результаты решения задачи
float y0, y1, y2 ; //исходные данные
setlocale(LC_ALL,"Russian") ;
for(;;)
{//Выбор действия
cout << "\n Вид действия:" << endl ;
cout << " 1 - вычисление суммы по рекуррентной формуле" << endl ;
cout << " 2 - завершение задачи" << endl ;
cout << " Введите вид действия -> ";
cin >> var;
switch(var)
{case 1://Ввод исходных данных
cout << " Введите m -> " ;
cin >> m ;
cout << " Введите y0, y1, y2 -> " ;
cin >> y0 >> y1 >> y2 ;
re1 = recur1(m, y0, y1, y2) ;
re2 = recur2(m, y0, y1, y2) ;
re3 = recur3(m, y0, y1, y2) ;
//Вывод результата
cout.precision(3) ;//число знаков после запятой при выводе
cout << " Для цикла WHILE результат = " << re1 << endl ;
cout << " Для цикла DO..WHILE результат = " << re2 << endl ;
cout << " Для цикла FOR результат = " << re3 << endl ;
break ;
default: return 1 ;
}//switch
}//for
}
//main_end_________________________________________________________________
//recur1_beg_______________________________________________________________
//вычисление значения суммы циклом while
float recur1(int m, float y0, float y1, float y2)
{int i = 0 ; //текущий номер слагаемого
float y , //очередное значение y[i]
sum = 0 ; //начальное значение суммы
sum += (y0 * y0) + (i - 5.) / (m + 1.); i++ ;
sum += (y1 * y1) + (i - 5.) / (m + 1.); i++ ;
sum += (y2 * y2) + (i - 5.) / (m + 1.); i++ ;
while(i <= m)
{y = 1.5*cos(y2) - 0.1 * sin(y0) + 1.5 * cos(y1);
sum += (y * y) + (i - 5.) / (m + 1.);
y0 = y1 ;
y1 = y2 ;
y2 = y ;
i++ ;
}
return(((m / 5.) + 5.) * sum);
}
//recur1_end_______________________________________________________________
//recur2_beg_______________________________________________________________
//вычисление значения суммы циклом do..while
float recur2(int m, float y0, float y1, float y2)
{int i = 0 ; //текущий номер слагаемого
float y , //очередное значение y[i]
sum = 0 ; //начальное значение суммы
sum += (y0 * y0) + (i - 5.) / (m + 1.); i++ ;
sum += (y1 * y1) + (i - 5.) / (m + 1.); i++ ;
sum += (y2 * y2) + (i - 5.) / (m + 1.); i++ ;
do
{y = 1.5 * cos(y2) - 0.1 * sin(y0) + 1.5 * cos(y1);
sum += (y * y) + (i - 5.) / (m + 1.);
y0 = y1 ;
y1 = y2 ;
y2 = y ;
i++ ;
}
while(i <= m) ;
return sum;
}
//recur2_end_______________________________________________________________
//recur3_beg_______________________________________________________________
//вычисление значения суммы циклом for
float recur3(int m, float y0, float y1, float y2)
{int i = 0 ; //текущий номер слагаемого
float y , //очередное значение y[i]
sum = 0 ; //начальное значение суммы
sum += (y0 * y0) + (i - 5.) / (m + 1.); i++ ;
sum += (y1 * y1) + (i - 5.) / (m + 1.); i++ ;
sum += (y2 * y2) + (i - 5.) / (m + 1.); i++ ;
for(; i <= m; i++)
{y = 1.5*cos(y2) - 0.1 * sin(y0) + 1.5 * cos(y1);
sum += (y * y) + (i - 5.) / (m + 1.);
y0 = y1;
y1 = y2;
y2 = y;
}
return (m / 5 + 5) * sum;
}
//recur3_end_______________________________________________________________
через do…while пока что вывожу sum
Ааа, вся разобрался там cout precision был со значением 3, изменил на 5 теперь работает
(0 / 5 + 5) * 62.3 = 5 * 62.3 = 311.5
С 5.
эта часть должна работать
https://onlinegdb.com/r1mK-A_Bd
#include <iostream>
int main()
{
int m = 9;
float sum = 2;
float res = (((m / 5) + 5) * sum); // 12
std::cout << res << "\n";
res = (((m / 5.) + 5) * sum); // 13.6
std::cout << res << "\n";
return 0;
}
опечатался, m = 9 а не 0
С этой частью насколько я понял всё, она работает. Но мне всё ещё не ясно что за ошибка в формуле для вычисления очередного слагаемого, там ведь по сути и ошибаться то вроде как негде