Задача по c++. Операторы цикла, заданное число повторений

Во вложениях скриншот формул для задачи, нужно реализовать ее решение тремя способами, через цикл 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);
}

Это мой код, преподаватель ответил "

  1. Целое на целое дает целый результат. А нужна дробь. (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 теперь работает

:thinking:

(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

С этой частью насколько я понял всё, она работает. Но мне всё ещё не ясно что за ошибка в формуле для вычисления очередного слагаемого, там ведь по сути и ошибаться то вроде как негде