_ОП_ЛР4
.doc
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ
-
Федеральное государственное автономное образовательное учреждение высшего образования
«Санкт-Петербургский государственный университет аэрокосмического приборостроения»
КАФЕДРА № 2
Преподаватель
доцент, к.т.н. Куртяник Д.В.
Отчёт
по лабораторной работе №4
по дисциплине Информатика
на тему: « Операторы цикла: вычисления с заданной точностью»
Работу выполнил
студент гр. 4616 Павлов А.В.
Санкт-Петербург
Цель лабораторной работы: изучение концепций и освоение технологии процедурного программирования, приобретение навыков процедурного программирования на языке C/С++ циклических вычислений.
Задание на программирование: используя технологию процедурного программирования разработать программу решения индивидуальной задачи тремя видами циклических управляющих структур: Цикл - Пока (с предусловием), Цикл - До (с постусловием), Цикл - Для (с параметром).
Порядок выполнения работы:
1) Получить у преподавателя индивидуальное задание. Выполнить постановку задачи: сформулировать условие, определить входные и выходные данные.
2) Разработать математическую модель.
3) Построить схему алгоритма, последовательно используя для решения задачи все три циклические управляющие структуры (операторы while, do…while, for). Каждое решение должно быть реализовано в виде отдельной функции.
При этом запрещается использовать оператор if для проверки условия входа в циклы и в качестве одного из операторов тела цикла;
4) Составить программу на языке C/С++.
5) Входные данные вводить с клавиатуры по запросу.
6) Вывод результатов должен осуществляться в функции main(). Выходные данные выводить на экран в развернутой форме с пояснениями.
7) Использовать стандартные потоковые объекты ввода/вывода cin и cout.
8) Проверить и продемонстрировать преподавателю работу программы на полном наборе тестов, в том числе с ошибочными входными данными.
9) Оформить отчет о лабораторной работе в составе: постановка задачи, математическая модель, схема алгоритма решения, текст программы, контрольные примеры.
1-3)
Вариант 10
Вычислить предел последовательности {Yn} при n , где Yn вычисляется по формулам:
n = 2, 3, 4…
Значение X (0 ≤ X < 1) и точность вычисления вводятся с клавиатуры. Вычисления прекратить при выполнении условия Yn – Yn-1 < .
Ввод X и EPS => Проверка х на условие 0 ≤ X < 1, если прошло то проверка на (y1-y0)>=eps && n<SHRT_MAX) => Дальше цикл y0=y1; y1=0.5*(x+y0*y0); и вывод n при условии n>SHRTMAX
Текст программы.
/*последовательность (Yn) задана равенствами:
X (0<=X<1)
Y1=X/2
Yn=1/2*(X+Yn-1^2)
n=2,3,4...
Вычисления закончить при |Yn-yn-1|<eps*/
#include <iostream>
#include <locale.h>
#include <limits.h>
#include <math.h>
#include <stdio.h>
using namespace std;
float predel1(float eps, float x);
float predel2(float eps, float x);
float predel3(float eps, float x);
int main(){setlocale(LC_ALL,"Russian") ;
int var;
float rez1,rez2,rez3; //результат решения задачи
float eps, x; //точность вычисления
bool bo=true;
for(;;){
//Выбор вида действия
cout<<"\nВид действия:\n1 - вычисления предела произведения\n2 - завершения задачи\nвведите вид действия -> ";
cin>>var;
switch(var){
case 1:
//ввод исходных данных и вывод результата
while(bo){
cout<<"\nВведите X (0<=X<1): ";
cin>>x;
if(x<0||x>=1)cout<<"\nХ должен находиться в указаном диапозоне";
else bo=false;
}
while(!bo){
cout<<"\nВведите точность: ";
cin>>eps;
if(eps>0)bo=true;
else cout<<"\nточность должна быть больше нуля";
}
rez1=predel1(eps,x);
printf("\nДля цикла while результат = %1.8f",rez1);
rez2=predel2(eps,x);
printf("\nДля цикла do..while результат = %1.8f",rez2);
rez3=predel3(eps,x);
printf("\nДля цикла for результат = %1.8f\n",rez3);
break;
case 2: return 0;
}//switch
}//for
}
//вычисление придела произведения циклом while
float predel1(float eps, float x){
float y0=x/2,y1=0.5*(x+y0*y0);
int n=2;
while(fabs(y1-y0)>=eps&&n<SHRT_MAX){
y0=y1;
y1=0.5*(x+y0*y0);
n++;
}//while
if(n<SHRT_MAX) cout<<"\nКоличество слагаемых: "<<n;
else cout<<"\nТочность не достигнута, количество слагаемых: "<<n;
return y1;
}
//вычисление придела произведения циклом do..while
float predel2(float eps, float x){
float y0,y1=x/2;
int n=1;
do{
y0=y1;
y1=0.5*(x+y0*y0);
n++;
}while(fabs(y1-y0)>=eps&&n<SHRT_MAX); //do..while
if(n<SHRT_MAX) cout<<"\nКоличество слагаемых: "<<n;
else cout<<"\nТочность не достигнута, количество слагаемых: "<<n;
return y1;
}
//вычисление придела произведения циклом for
float predel3(float eps, float x){
float y0=x/2,y1=0.5*(x+y0*y0);
int n;
for(n=2;fabs(y1-y0)>=eps&&n<SHRT_MAX;n++){
y0=y1;
y1=0.5*(x+y0*y0);
}//for
if(n<SHRT_MAX) cout<<"\nКоличество слагаемых: "<<n;
else cout<<"\nТочность не достигнута, количество слагаемых: "<<n;
return y1;
}
Примеры.