Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

1 / лаба3

.docx
Скачиваний:
1
Добавлен:
16.05.2025
Размер:
179.09 Кб
Скачать

МИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ

федеральное государственное автономное образовательное учреждение высшего образования

«САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ

АЭРОКОСМИЧЕСКОГО ПРИБОРОСТРОЕНИЯ»

КАФЕДРА №44

Институт вычислительных систем и программирования

ПРЕПОДАВАТЕЛЬ

Доцент

Бариков Л.Н.

должность, уч. степень, звание

подпись, дата

инициалы, фамилия

Лабораторная работа №3

Операторы цикла: заданное число повторений

по курсу: Основы алгоритмизации и программирования на C/C++

СТУДЕНТ ГР. №

Z0411

Карелина М. В.

номер группы

подпись, дата

инициалы, фамилия

Номер зачётной книжки: 2020/3477

Санкт-Петербург

2021

Цель лабораторной работы: изучение концепций и освоение технологии процедурного программирования, приобретение навыков процедурного программирования на языке C/C++ циклических вычислений.

Задание на программирование: используя технологию процедурного программирования разработать программу решения индивидуальной задачи тремя видами циклических управляющих структур: Цикл - Пока (с предусловием), Цикл - До (с постусловием), Цикл - Для (с параметром).

28.

Для заданного значения m вычислить

Значения m, Y0, Y1, Y2 вводятся с клавиатуры, а Yi вычисляется по формуле:

Математическая модель

Вводятся значения m, Y0, Y1, Y2.

Вычисляется значение суммы первых трёх слагаемых (i=0,1,2).

На основе значений Y0, Y1, Y2 для параметра i=3 вычисляется значение Yi по заданной формуле, вычисляется значение очередного слагаемого и увеличивается текущее значение суммы.

Для вычисления следующего значения Yi увеличивается на 1 значение i, значение Y1 переписывается в Y0, значение Y2 переписывается в Y1, значение Yi переписывается в Y2. Для текущего значения параметра i вычисляется значение Yi по заданной формуле, вычисляется значение очередного слагаемого и увеличивается текущее значение суммы.

Действия повторяются до превышения параметром i значения m.

Вычисленное значение суммы умножается на коэффициент (m/1+5)

Задача решена.

Схемы алгоритмов решения

а) решение с использованием цикла while (функция recur1)

Recur1(m,y0,y1,y2)

Return (sum)

Sumx=(1+5 /m)

I++;

Y2 = y;

Y1 = y2;

Y0 = y1;

Sum += (i* i+1)*sqrt(fabs(y));

Y=(pow(sin(y2))+(pow(cos(y0))

/ i*i/10+0.5);

Sum += (i* i+1)*sqrt(fabs(y2)) i++

Sum += (i* i+1)*sqrt(fabs(y1)) i++

Sum += (i*i+1)*sqrt(fabs(y0)) i++

I <= m

I=0

Sum=0

нет да

б) решение с использованием цикла dowhile (функция recur2)

Recur2(m,y0,y1,y2)

Return (sum)

Sumx=(1+5 /m)

Sum += (i* i+1)*sqrt(fabs(y2)) i++

Sum += (i* i+1)*sqrt(fabs(y1)) i++

Sum += (i*i+1)*sqrt(fabs(y0)) i++

I=0

Sum=0

Y=(pow(sin(y2))+(pow(cos(y0))

/ i*i/10+0.5);

I <= m

I++;

Y2 = y;

Y1 = y2;

Y0 = y1;

Sum += (i* i+1)*sqrt(fabs(y));

нет да

в) решение с использованием цикла for (функция recur3)

Recur2(m,y0,y1,y2)

Sum += (i* i+1)*sqrt(fabs(y2)) i++

Sum += (i* i+1)*sqrt(fabs(y1)) i++

Sum += (i*i+1)*sqrt(fabs(y0)) i++

I=0

Sum=0

I=3; I<=M; I++

Y=(pow(sin(y2))+(pow(cos(y0))

/ i*i/10+0.5);

Sum += (i* i+1)*sqrt(fabs(y));

Y0 = y1;

Y1 = y2;

Y2 = y;

Return (sum)

Sumx=(1+5 /m)

Текст программы

#include<iostream>;

#include<locale.h>;

#include<math.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, "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 += (i * i + 1 * sqrt(y0)); i++;

sum += (i * i + 1 * sqrt(y1)); i++;

sum += (i * i + 1 * sqrt(y2)); i++;

while (i <= m)

{

y = sqrt(sin(y2)) + sqrt(cos(y0))/(i*i/10.+0.5);

sum += (i * i + 1 * sqrt(y0));

y0 = y1;

y1 = y2;

y2 = y;

i++;

}

return((1. + 5. / m) * 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 += (i * i + 1 * sqrt(y0)); i++;

sum += (i * i + 1 * sqrt(y1)); i++;

sum += (i * i + 1 * sqrt(y2)); i++;

do

{

y = sqrt(sin(y2)) + sqrt(cos(y0)) / (i * i / 10. + 0.5);

sum += (i * i + 1 * sqrt(y0));

y0 = y1;

y1 = y2;

y2 = y;

i++;

} while (i <= m);

return((1. + 5. / m) * 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 += (i * i + 1 * sqrt(y0)); i++;

sum += (i * i + 1 * sqrt(y1)); i++;

sum += (i * i + 1 * sqrt(y2)); i++;

for (; i <= m; i++)

{

y = sqrt(sin(y2)) + sqrt(cos(y0)) / (i * i / 10. + 0.5);

sum += (i * i + 1 * sqrt(y0));

y0 = y1;

y1 = y2;

y2 = y;

}

return((1. + 5. / m) * sum);

}

//recur3_end_

Скриншот контрольного примера выполнения программы

Вывод:

В данной лабораторной работе я освоила технологии процедурного программирования, приобрела навыки процедурного программирования на языке C/C++ циклических вычислений.

Соседние файлы в папке 1