Остащенко А.Ю., Певцов Е.Ф. Практикум по программированию Основы программирования на VISUAL C++ 6.0 (1017102), страница 3
Текст из файла (страница 3)
Например, return (x>5) будет возвращать false, если х небольше 5, или true, если х больше 5. Функция может содержатьнесколько операторов return. Например:int Doubler (int origin){if (origin <= 1000)return origin*2;else17return -1;}В языке С++ предусмотрена возможность создания нескольких функций с одинаковым именем (полиморфизм функций илиперезагрузка функций). Перезагруженные функции должны отличаться друг от друга списком параметров: либо типом параметров, либо их количеством. Например:int myFunction (int, int);int myFunction (long, long);int myFunction (long);Если функция объявлена с ключевым словом inline, компилятор не будет записывать функцию в отдельном месте в памятикомпьютера, а копирует её строки непосредственно в код программы по месту вызова.
Это приводит к увеличению скоростивыполнения программы и одновременно увеличивает объем памяти программы. Для объявления встраиваемой функции (inlineфункции) необходимо в прототипе добавить слово inline передтипом возвращаемого значения.inline int Doubler (int);всё остальное, а именно: заголовок и тело функции, и её вызов восновной программе остаются прежними.Замечание 2. Рекурсия. Стоит отметить, что внутри функциинельзя определить другую функцию, но из одной функции можновызвать сколько угодно других функций. Функции могут дажевызывать самих себя, что именуется рекурсией. Рекурсия бываетдвух видов: прямая, когда функция вызывает сама себя, и косвенная, когда функция вызывает другую функцию, которая вызывает затем первую функцию.
Пример: программа вычислениячисел, образующих ряд Фибоначчи: первые два числа ряда равныединице и каждый последующий член ряда является суммой двухпредыдущих (1, 1, 2, 3, 5, 8, 13, 21, 34 … и т.д.). Для вычисленияочередного члена ряда Фибоначчи используем рекурсию:#include <iostream.h> // пример рекурсииint fib(int n); /* прототип функции вычисления члена рядаФибоначчи */int main()18{int n, answer;cout<< "Enter number to find: ";cin >> n;cout << "\n\n";answer = fib(n);cout<< answer<< " is the " <<n <<"-th member of Fibonacci series\n";return 0 ;}int fib(int n) /* заголовок функции вычисления члена рядаФибоначчи */{if(n<3)return 1;elsereturn( fib(n-2) + fib(n-1));}Пример программирования циклов по заданиям к лабораторной работе №3.Используя циклы, функции и рекурсии вычислим с точно2(i −1)∞i +1 xстью eps=0,0001 сумму ∑ (−1) ⋅, которая является раз2(i−1)!i =1ложением в ряд Тейлора функции cos(x), при изменении х в диапазоне [0.1, 1] с шагом 0.1.#include <iostream.h>#include <math.h>double factorial(int); /* прототип функции вычисления факториала */int main(){double a,b,h,eps,S;a=0.1; b=1; h=0.1; eps=1e-4;for (double i=a; i<=b; i+=h){19int j=1;double st,f;S=0;do{f = factorial(2*(j-1));st = pow(-1,(j+1))*pow(i,(2*(j-1)))/f;j++;S += st; // равнозначно S = S+st}while(st>=eps);cout << "Sum of series is:" << S << " Value ofcos("<<i<<") is: "<< cos(i) << endl;}return 0;}double factorial(int a){if (a==0||a==1) /* заметьте, что здесь стоитзнак равенства = = , а не присвоить = */return 1;elsereturn (a*factorial(a-1));/* для вычисления использована рекурсия */}Задания.
Вычислить сумму S при изменении аргумента х в указанном диапазоне [a,b] с шагом h., прекращая суммирование, когда очередной член станет меньше 0.0001. Для проверки в каждойточке вычислите также функцию y=f(x), представляющую собойаналитическое выражение ряда. Варианты приведены в Табл.3.Таблица 3Варианты заданий к лабораторной работе №3№ варианта1S=y=∞1+ xi =1(1 − x )3∑ i 2 ⋅ x i −1a=b=h=00.90.120234∞∑ (2i − 1) ⋅ x2i −1i =1∞i +1∑ (− 1) ⋅i =1∞x 2i −1(2i − 1)!i +1 x∑ (− 1) ⋅∞(2 x )ii =0i!∞2i∑5(1 − x )00.90.1sin x0.10.90.1cos x0.110.1e2 x0.110.050.110.050.110.050.10.50.0500.90.05π2x −34-0.50.50.1ln (1 + x )-0.50.50.10.10.80.050.110.10.210.0832(i −1)2(i - 1)!i =11 + 6x + x 26xi =0 (2i )!e x + e −xchx =27x ( 2i +1)∑i =0 (2i + 1)!e x − e−xshx =28x ( 2i +1)∑ (− 1) ⋅(2i + 1)i =0∑∞∞i∞1+ xi =0(1 − x )2∑ (2i + 1) ⋅ x i9∞∑ (− 1)10icos(ix )i2i =1x )i(∑ (− 1)∞11i +1ii =11213arctgx∞∑ (− 1)i +1i =1x 2i⋅2i(2i − 1)∞(2i + 1)x 2ii =0i!∑2x ⋅ arctg ( x ) −− ln 1 + x 2(1 + 2 x 2 )⋅ e x22 i +114⎛ x −1⎞⎟∞ ⎜+x1⎠∑⎝i = 0 (2i + 1)ln x221Лабораторная работа №4.
Понятие об объектноориентированном программировании. Базовые классыКласс – это набор переменных различных типов, скомбинированный с набором связанных функций. Инкапсуляцией называется соединение переменных и функций в один объект класса.Части программы, работающие с классом, могут использоватьваш объект, не беспокоясь о том, что находится в нём или как оноработает.Переменные в классе принадлежат только своему объекту иназываются ещё переменными-членами или данными класса.Функции в классе выполняют действия с переменнымичленами и называются методами класса.Например, объявление класса Cat делается так:Class Cat{int Age; // Данные классаint Weight; // Данные классаvoid Meaw(); // Метод класса};Объект нового типа определяется также как и любая переменная.
Например:int Skill;Cat Murzik;После этой записи Murzik является объектом класса Cat.Доступ к членам объекта (как переменным, так и методам) осуществляется оператором прямого доступа (.). Чтобы присвоитьчисло переменной-члену Weight объекта Murzik запишем:Murzik.Weight = 12;Аналогично, чтобы вызвать метод Meaw, запишем:Murzik.Meaw();Определенные значения должны присваиваются объектам, ане классам. Поэтому запись: Cat Age=5; - ошибочна. Синтаксически правильно будет:Cat Murzik;Murzik.Age = 5;При объявлении класса используются ключевые слова pub-22lic (открытый) и private (закрытый), определяющие порядокдоступа к членам класса. Все члены класса (переменные и методы) являются закрытыми по умолчанию. К закрытым членамможно получить доступ только с помощью методов самого класса. Открытые члены доступны для всех других функций программы.
Например, при записи:Cat Barsik;Barsik.Age = 3;компилятор выдаст ошибку, т.к. нельзя обращаться к закрытымпеременным объекта. Выходом из положения является объявление класса открытым:Class Cat{public:int Age;int Weight;void Meaw();};Общая стратегия использования классов состоит в том, чтобы оставлять переменные-члены класса закрытыми. Это позволяет инкапсулировать данные внутри класса. Доступ следует открывать только методам класса, которые обеспечивают доступ кзакрытым данным.
Эти методы можно вызвать из любого места впрограмме для возвращения или установления значения закрытых данных. Такая стратегия позволяет скрыть детали храненияданных в объектах, снабжая пользователя методами их использования. Можно модернизировать способы хранения и обработкиданных внутри класса, не переписывая при этом методы доступаи вызова их во внешнем программном коде. Например:class Cat{public:int GetAge();void SetAge(int Age);void Meaw();private:23int itsAge;};Чтобы установить возраст кота Мурзика теперь нужно запи-сать:Cat Murzik;Murzik.SetAge(5);Как и для функций, после объявления класса нужно дать определение класса, т.е.
определить, что он выполняет. Чтобы разобраться, выполним такой пример:#include <iostream.h> // пример классаclass Cat // объявляем класс Cat{public:int GetAge(); // метод доступаvoid SetAge(int age); // метод доступаvoid Meow(); // обычный методprivate:int itsAge; // переменная-член (данные) метода};int Cat::GetAge() // определение метода GetAge,{return itsAge; /* который возвращает значение переменной-члена метода */}void Cat::SetAge(int age) // определение метода SetAge,{itsAge = age; /* который инициирует переменную-член метода */}void Cat::Meow() // метод выводит на экран тест сообщения{cout<< "Meow\n";}int main(){24Cat Murzik; // создаём объект МурзикMurzik.SetAge(5); // устанавливаем его возрастMurzik.Meow(); /* заставляем его мяукнуть и выводимсообщение: */cout<< "Murzik has a " << Murzik.GetAge() <<" yearsold.\n";return 0;}Для инициализации и разрушения переменных-членов класса используется специальные функции: конструктор и деструктор.
Существуют специальные методы класса, имена которыхсовпадают с именем самого класса и которые обязательно должны присутствовать в коде и добавляются компилятором по умолчанию. Это конструктор и деструктор класса. Причём конструктор будет пустым, если инициализация переменных – членовкласса не проводится. Деструктор служит для удаления из памятиотработавших объектов, а также других действий при модификации объекта или класса. Он не принимает никаких аргументов ине возвращает никаких значений. Объявляется с помощью значкатильда (~), например: ~Cat();Пример, дополняющий предыдущий и позволяющий понятьроль конструктора:#include <iostream.h> // классы и конструктор/деструкторclass Cat // объявляем класс Cat{public:Cat(int initAge); // конструктор~Cat(); // деструкторint GetAge();void SetAge(int age);void Meow();private:int itsAge; // переменная-член метода};Cat::Cat(int initAge) /* конструктор инициализирует переменную-член значением */25{itsAge = initAge;}Cat::~Cat() // деструктор не выполняет действия{}int Cat::GetAge(){return itsAge;}void Cat::SetAge(int age){itsAge = age; }void Cat::Meow(){cout<< "Meow\n";}int main(){Cat Murzik(5); /* создаём объект Мурзик с инициализированным возрастом 5 */Murzik.Meow(); /*заставляем его мяукнуть и выводимсообщение*/cout<< "Murzik has a " << Murzik.GetAge() <<" yearsold.\n";Murzik.Meow();Murzik.SetAge(7); /* переустанавливаем его возраст ивыводим сообщение: */cout<< "Now Murzik has a " << Murzik.GetAge() <<"years old.\n";return 0;}В языке С++ предусмотрена возможность объявить методкласса таким образом, что такому методу будет запрещено изменять значение переменных-членов класса.