
- •Часть 1
- •18 Сентября 2012 г., протокол № 1
- •Предисловие
- •§ 1. Основные понятия программы
- •1.2. Директива препроцессора #include
- •Структура программы
- •Комментарии
- •Ключевые слова, идентификаторы, переменные
- •§ 2. Ввод, вывод
- •§ 3. Выражения
- •3.1. Константы
- •Непосредственно записать в выражении;
- •3.2. Операции и их приоритет
- •3.3. Операции отношения и логические операции
- •3.4. Операция присваивания
- •§ 4. Программирование ветвлений
- •4.1. Оператор if
- •4.2. Тернарная операция
- •4.3. Оператор выбора switch
- •Г л а в а 2 циклы
- •§ 1. Оператор while
- •§ 2. Оператор break
- •§ 3. Оператор do … while
- •§ 4. Оператор for
- •Г л а в а 3 Введение в массивы
- •§ 1. Основные понятия
- •§ 2. Способы определения массивов
- •§ 3. Вывод массива. Функции printf и cprintf
- •§ 4. Типы задач при работе с массивами
- •Упражнения и тесты
- •Г л а в а 4 модульное программирование. Функции
- •§1. Функции без результатов. Параметры-значения
- •1.1. Примеры. Правила оформления и вызова функций
- •Формальные и фактические параметры
- •Передача параметров по значению
- •§ 2. Функции типа void с результатами
- •2.1. Вычислeниe бeсконeчных сумм
- •2.2. Что такое ссылочный тип
- •2.3. Параметры ссылочного типа
- •§ 3. Функции, отличные от void. Оператор return
- •§ 4. Область действия имён. Локальные и глобальные имена
- •§ 5. Встраиваемые (inline) функции
- •§ 6. Параметры по умолчанию
- •§ 7. Перегрузка функций
- •7. Сравнение функций типа void и отличных от типа void.
- •Г л а в а 5 введение в объектно-оРиентированное программирование
- •§ 1. Первое знакомство с ооп
- •§ 2. Класс. Поля и методы класса
- •§ 3. Создание объектов. Конструктор
- •Упражнения и тесты
- •Оглавление
- •3.1. Константы …………………………………………….………..….........…8
- •Упражнения и тесты …….………………..………………………….…………....19
- •Методы программирования:
- •Лекции, примеры, тесты
- •Пособие для студентов механико-математического факультета
- •В двух частях
- •Часть 1
§ 2. Функции типа void с результатами
В предыдущем параграфе функция не получала никаких результатов и при её активизации в точку вызова ничего не возвращали. А как быть, если функция возвращает один или более одного результата? Предполагается пока, что такими возвращаемыми результатами являются значения простых переменных, но не массив. В таком случае можно использовать ссылочный тип, который появился в С++, и указатели, перешедшие из старого классического языка С в С++. Рассмотрение начинаем с первого способа, который легче второго.
2.1. Вычислeниe бeсконeчных сумм
Пример 3. Для x=-0.8, -0.6, -0.4, … , 0.8 найти и вывести на экран значения двух бесконечных сумм, вычисленных с заданной точностью, например, 0.000001:
В виде первой бесконечной суммы (y) вычисляется cos(x), а вторая сумма (z)— это значение функции sin(x). Поэтому результат целесообразно оформить в виде следующих пяти столбцов: x, y, cos(x), z, sin(x), в которых покажем значения указанных тригонометрических функций, вычисленные как сумма бесконечного ряда с заданной точностью, так и с помощью встроенных стандартных функций.
С
точки зрения разбиения на функции
возможны несколько вариантов. Например,
можно составить две функции, каждая из
которых вычисляет и возвращает по одному
результату, y и
z соответственно.
Но функцию с одним результатом эффективнее
оформить не как функцию типа void.
Такие функции будут рассмотрены в
следующем параграфе. Можно в виде одной
или двух функций оформить вычисление
очередного слагаемого
.
Но такой алгоритм неэффективен, так как
мы “заставляем” компьютер вычислять
и степень, и факториал с самого начала.
То есть, например, мы вычислили 5!, а
для вычисления 6! будем повторять
те же операции умножения 1*2*3*4*5.
Поэтому эффективнее 5! использовать для
получения 6!. Это относится и к вычислению
степени.
Составим функцию SINCOS, которая одновременно вычисляет обе бесконечные суммы. Поэтому она имеет два входных параметра: аргумент функций (x) и одинаковую точность вычисления бесконечных сумм (eps) и два выходных (y и z), которые в заголовке функции объявляются с помощью ссылочного типа.
void SINCOS(float x, float eps, float &y, float &z);
int main() { float x, sn, cs;
cout<<" x MySin Sin(Standart)";
cout <<" MyCos Cos(Standart)" <<endl <<endl;
for (x=-0.8; x<0.805; x+=0.1)
{ SINCOS(x,1E-6, cs, sn);
printf("%5.1f %10.6f %12.6f %10.6f %12.6f\n",
x, sn, sin(x), cs, cos(x)) ;
} // End of for
getch(); return 0;
} // End of main
void SINCOS(float x, float eps, float &y, float &z)
{ float k=1, v1=1; y=1;
do { v1=v1*(-1)*x*x/(k*(k+1));
y+=v1; k+=2; }
while (fabs(v1)>eps);
k=2; v1=x; z=x;
do { v1=v1*(-1)*x*x/(k*(k+1));
z+=v1; k+=2; }
while (fabs(v1)>eps);
} // End of function SinCos
Прототип функции перед main можно записать без имён формальных параметров: void SINCOS(float , float , float &, float &);
Для параметров ссылочного типа символ & записываем, так как он относится не к имени параметра, а к его типу.
Объединив вычисление y и z в одну функцию, мы имеем возможность оба ряда вычислять в одном цикле.
Упражнение. Усовершенствовать эту функцию следующим образом. Умножая очередное слагаемое на x/k, добавляем его попеременно то к y, то к z со своими знаками. Но по-прежнему функция будет иметь два результата.