Федеральное агенство по образованию
Санкт-Петербургский государственный электротехнический университет «ЛЭТИ»
Факультет компьютерных технологий и информатики
Кафедра МО ЭВМ
Дисциплина: «Программирование»
Отчет по лабораторной работе № 4
Выполнили: студенты группы 1381
Баканов Александр
Грейнер Андрей
Проверил: Самойленко В.П.
Санкт-Петербург 2011
Задание
Изменить программы из лабораторных работ №№ 2, 3 таким образом, чтобы ввод данных, вычисления и вывод данных осуществлялись с использованием функций.
Содержательная постановка задачи
1. Лабораторная работа №2: для разделения программы на отдельные логические блоки определим следующие функции:
1. Ввод данных
2. Проверка входных данных
3. Подсчет суммы
4. Вывод результата
2. Лабораторная работа №3: аналогично предыдущему пункту выделим в программе следующие логические блоки:
1. Ввод данных
2. Вычисление точности
3. Вывод результата
Интерфейсы функций:
1. Лабораторная работа №2:
1. void getIncomingData(double &n, double &k)
2. bool checkIncomingData(double n, double k)
3. double countSum(double n, double k)
4. void showResult(double sum)
2. Лабораторная работа №3:
1. void getIncomingData(double &p, double &x)
2. double e_pow_10_p(double p)
3. void showResult(double x, double sum)
Код программы (лабораторная работа №2)
#include <iostream>
using namespace std;
/**
* Функция получения входных данных.
* @param n максимальное значение итератора
* @param k вводимый коэффициент
*/
void getIncomingData(double &n, double &k);
/**
* Функция проверки введенных данных.
* @param n максимальное значение итератора
* @param k вводимый коэффициент
* @return true, если данные корректны, false в противном случае
*/
bool checkIncomingData(double n, double k);
/**
* Функция вычисления суммы ряда.
* @param n максимальное значение итератора
* @param k вводимый коэффициент
* @return значение суммы ряда
*/
double countSum(double n, double k);
/**
* Функция вывода результата.
* @param sum сумма ряда
*/
void showResult(double sum);
int main()
{
// Объявление переменных.
double n, // максимальное значение шага цикла
k, // вводимый коэффициент
sum; // сумма
// Ввод значений
getIncomingData(n, k);
// Проверка на правильность введенных данных
if (!checkIncomingData(n, k))
{
cout << " The entered arguments are incorrect.\n\n";
return 1;
}
// Вычисление суммы ряда
sum = countSum(n, k);
// Вывод результата
showResult(sum);
return 0;
}
void getIncomingData(double &n, double &k)
{
cout << "\n----------------- Lab 02 ------------------\n\n";
cout << " Counting the sum of a(i);\n a(i) = (n - i) * k^i, k > 1\n i = 0...n\n\n";
cout << " Enter the number of iterations (n ≥ 0): "; cin >> n;
cout << " Enter the coefficient (k > 1): "; cin >> k; cout << endl;
cout << " Entered values: n = " << n << "; k = " << k << "\n";
}
bool checkIncomingData(double n, double k)
{
return!(n < 0 || k <= 1);
}
double countSum(double n, double k)
{
double i, // шаг цикла
sum, // сумма
a, // коэффициент рекурентного соотношения
f; // член ряда
// Значение первого члена ряда, а значит и суммы, равно n. В силу того, что i = 0.
f = sum = n;
// Переходим к следующему члену ряда
i = 1;
// примечание: случай i = n можно не рассматривать,
// т.к. при любом n, n-й член ряда будет равен нулю.
while (i < n)
{
// Вычисление коэффициента рекурентного соотношения происходит на каждом шаге
// цикла, т.к. он зависит от i.
a = (n - i) * k / (n - i + 1);
// Вычисление очередного члена ряда
f = f * a;
// Прибавление его к сумме
sum += f;
// Увеличение шага цикла
i++;
}
return sum;
}
void showResult(double sum)
{
cout << endl << " The sum is " << sum << endl;
cout << "\n--- Thank you for choise our production ---\n\n";
}
Код программы (лабораторная работа №3)
#include <iostream>
#include <cmath>
using namespace std;
/**
* Функция вычисляет значение e в степени -p и возвращает его
* @param p степень, в отрицательное значение которой будет возведено e
* @return число e в степени -p.
*/
double e_pow_10_p(double p);
/**
* Функция получения входных данных.
* @param p степень, для получения точности вычисления
* @param x аргумент ряда и проверочной функции
*/
void getIncomingData(double &p, double &x);
/**
* Функция вывода результата.
* @param x аргумент проверочной функции
* @param sum сумма ряда
*/
void showResult(double x, double sum);
int main()
{
// Используемые переменные
double sum, // сумма
u, // слагаемое
x, // аргумент
p, // показатель степени эпсилон
eps; // точность
int i = 0; // итератор
// Получаем входные данные
getIncomingData(p, x);
// Вычисляем эпсилон
eps = e_pow_10_p(p);
// Первый член ряда u(0) = 1. Сумма изначально равна нулю
u = 1;
sum = 0;
// До тех пор пока |u| > eps считаем сумму ряда
while (fabs(u) > eps)
{
// Проверенный в условии член ряда попадает в сумму
sum += u;
// Вычисляем следующий член ряда
// если его модуль окажется меньше либо равен эпсилон, цикл будет завершен
// и данный член уже не попадет в сумму, что и требуется.
u *= -(double(x*x) / double(i+1));
// Увеличиваем шаг цикла
i++;
// Вывод промежуточных данных
cout << "(i = " << i << ")" << " u(" << i << ") = " << u << "; sum = " << sum << endl;
}
// Выводим результат
showResult(x, sum);
return 0;
}
double e_pow_10_p(double p)
{
double eps = exp(-p * log(10.0));
cout << "Epsilon = " << eps << endl;
return eps;
}
void getIncomingData(double &p, double &x)
{
cout << "Enter epsilon = 10^-p (p > 0); p = "; cin >> p;
cout << "Enter argument x; x = "; cin >> x;
}
void showResult(double x, double sum)
{
// Выводим сумму
cout << "Sum = " << sum << endl;
// Для проверки вычислим функцию, равносильную сумме ряда:
cout << "exp(-(x^2)) = " << exp(-(x * x)) << endl;
}