Материалы к лекциям (1119465)
Текст из файла
Карпов Л. Е.Материалы к лекциям "Системы программирования"ВМ и К, 2-й курс, 4 семестрСистемы классов, используемые в лекцияхКласс Boxclass Box { double len;// length – длинаdouble wid;// width – ширинаdouble hei;// height – высотаpublic: double volume () { return len * wid * hei; }void set_dimensions (double l, double w, double h){ len = l; wid = w; hei = h; }//для задания начальных значений всех трёх параметров параллелепипедов:Box (double l, double w, double h ){ hei = h; wid = w; len = l; }// если часто используются кубики, то достаточно одного параметра:Box (double s) { hei = wid = len = s; }// если часто используются коробки одного типа (кирпичи), параметры не нужны:Box (){ hei = 6; wid = 12; len = 24; }// другой вариант конструктора-умолчания:Box (double l = 6, double w = 12, double h = 24) {}// конструктор копирования:Box (Box &a) // или Box (const Box &a){ if (this != &a) { len = a.len; wid = a.wid; hei = a.hei; }// этот конструктор (как и любой другой) не может// возвращать никакого значения!}};BoxBoxBoxBoxBoxb1 (1, 2, 3);b2 (5);b3;// конструктор умолчания* b4 = new Box (2.3);b5 = Box ();void f(){ Box * bf4 = new Box (2, 3, 5); ////Box bf5 = * bf4;////Box bf6 = Box (4, 7, 1);//}//создание нового объектаи инициализация указателя на негоинициализация описываемого объектазначениями, извлекаемыми по указателюсоздание временногообъекта и инициализация bf6Класс Strclass str { char * p; int size;public: str (const char * s = 0) // для инициализации строками-константами{ if (s) { p = new char [(size = strlen(s))+1]; strcpy (p, s); } }~str () { delete [] p; }str (const str & a) // конструктор копирования{ p = new char [(size = a.size) + 1];strcpy (p, a.p); }str & operator = (str & a){ if (this != & a)// равны ли адреса объектов?{ delete [] p;// уничтожение старого значенияp = new char [(size = a.size) + 1];strcpy (p, a.p);}return * this;// для s3 = s1: *this == s3, a == s1}const intlength () const { return strlen (p); }const char* gets() const { return p; }str & concat (const str &s) // конкатенация строк{ str temp;temp.p = new char [(temp.size = length()) + 1];strcpy (temp.p, p);delete[] p;p = new char [(size = temp.length() + s.length()) + 1];strcpy (p, temp.p);strcpy (p + length(), s.p);return *this;// возврат ссылки на свой объект}str & operator += (const str & s){ return concat (s); }char& operator [] (int i) // индексация есть нестатический метод{ if (i < 0 || i >= length ()){ cerr << “str: ошибка размера:” << i << endl; exit (1); }return p [i];}};351s1Знак0Система0s347442s2431s1Знак0474Знак0s24Система0s3454Знак02void fs () { str s (“Системы программирования”);char c;c = s [3]; // эквивалентно c = s.operator[](3); => c == ‘т’}void sf(){ str s1 (“Знак”);cout << s1.gets (); str s2 = s1; cout << s2.gets () << endl;str s3 (“Система”); cout << s3.gets ();s3 = s1; cout << s3.gets () << endl;s1.concat (“ и ”).concat (s3).concat (“ – понятия”); cout << s1.gets () << endl;}Класс complexclass complex { double re, im;public:// 3 конструктора:complex (double r = 0, double i = 0){re = r; im = i;}// конструктор копирования:complex (const complex & a){re = a.re; im = a.im;}// деструктор:~complex () {}// операция присваивания:complex & operator = (const complex & a) { re = a.re; im = a.im; return * this; }void ChangeModule (const double a){ re *= a; im *= a; }void print () const { cout << “re = ” << re << “, im = ” << im << endl; }//constcomplex//friend complex//constcomplex//friend complex//constconstПерегрузка операции методом классаoperator+ (const complex & a) const{ complex temp (re + a.re, im + a.im); return temp; }Перегрузка операции функцией-другом классаoperator* (const complex &a, double b);Перегрузка унарной операции методом классаoperator-() const { complex temp (- re, - im); return temp; }Перегрузка унарной операции функцией-другом классаoperator+(complex &a);Перегрузка префиксной и постфиксной унарных операцийcomplex & operator++() { ++ re; return * this; }complexoperator++(int pusto){ complex temp = * this; ++ re; return temp; }};complex operator * (const complex & a, double b) {complex temp (a.re * b, a.im * b);return temp;}complex operator+(complex &a) { return a; }complex a (16.2, -8.3);complex d = a; // инициализация существующим объектомcomplex e = complex (1, 2);d.operator = (e);complex x (1, 2), y, z;z = ++ x; // z.re = 2, z.im = 2, x.re = 2, z.im = 2z = x ++; // z.re = 2, z.im = 2, x.re = 3, z.im = 2++ ++ x; // ОШИБКА, так как возвращается не адресное значениеy = (x + y)++;// ошибка, так как сложение возвращает// не адресное значениеСистемы классов studentОдиночное наследованиеstudentstudent3cstudent2cstudent4cstudent2cSPdepclass student { protected: char * name;int year;// год обученияdouble avb;// средний баллint student_id; // номер зачётной книжкиpublic: student (char* nm, int y, double b, int id):year (y), avb(b), student_id (id){ name = new char [strlen (nm) + 1]; strcpy (name, nm); }char * get_name () const { return name; }virtualvoid print ();virtual~student () { delete [] name; } // виртуальный деструктор};class student2c: public student { // указание на базовый классprotected: char* pract2;char* tutor2;public: student2c (char* n, double b, int id,char* p, char* t) : student (n, 2, b, id){ pract2 = new char [strlen (p) + 1];strcpy (pract2, p);tutor2 = new char [strlen (t) + 1];strcpy (tutor2, t); }virtual void print (); // эта функция печати атрибутов скрывает// print () базового класса (из другой области видимости)// полностью унаследован и может использоваться селектор get_name ()virtual ~student2c () { delete [] pract2; delete [] tutor2; }};void student :: print (){ cout << “ФИО= ” << name<< endl;cout << “Курс= ” << year<< endl;cout << “Средний балл = ” << avb<< endl;cout << “Номер зачётки = ” << student_id << endl;}void student2c :: print (){ student :: print (); // выдаёт в файл name, year, avb, student_idcout << “Тема курсовой = ” << pract2<< endl;cout << “Преподаватель = ” << tutor2<< endl;}class student3с: protected student{ ...
};class student4с: privatestudent{ ... };class student2сSPdep:student2c { ... };Множественное наследованиеstudentstudentstudentstudentstudent4ystudent2cstudent2cstudent5ystudent4pstudent5pclass student5с: student{ ... };class student4y: public student { // четырёхлетнее обучениеprotected: char* certificate;...
};class student5y: public student { // пятилетнее обучениеprotected: char* diploma;... };class student4p: public student2c, public student4y { protected: bool test;... };class student5p: public student2c, public student5y { protected: int exam;... };Виртуальное множественное наследованиеstudentstudent4ystudent2cstudent4pclassclassclassclassclassclassstudentstudent2c:student3с:student4y:student5y:student4p:student5ystudent5p{ ... protected: double avb;...student { ...
protected: char * pract2;...student { ... protected:...student { ... protected: char * certificate;...student { ... protected: char * diploma;...student2c, virtual public student4y{protected: booltest;...class student5p: virtual public student2c, virtual public student5y{ ... protected: intexam;...virtualvirtualvirtualvirtualvirtualpublicpublicpublicpublicpublicvoid fst (){ students (“Катя”, 2, 4.18, 20050210); // базовый конструкторstudent2c ds (“Таня”, 4.08, 20050211,// производный - // “Компилятор Си++”, “Виктор Петрович”);student* ps = & s; // указатель на базовый класс, хотя курс = 2student2c *pds = & ds; // указатель на производный классps -> print (); // student:: print (); // напечатается главноеpds -> print (); // student2c :: print (); // напечатается всёps = pds;// допустимо (будет стандартное преобразование)ps -> print (); // student :: print () – функция выбирается// статически по типу указателя.// Если же в определении класса student добавлено слово// virtual, будет вызвана динамически выбираемая// функция student2c :: print ()}};};};};};};};Операции над контейнерами с различными итераторамиИтераторыВыводаВводаОднонаправленныеДвунаправленныеЧтениеДоступx=*px=*px=*pp->fp->fp->fx=*pp->fp[n]Произвольный доступЗапись*p=e*p=e*p=e*p=eИзменениеp++ ++pp++ ++pp++ ++pp++ ++p p-- --pp++ ++p p-- --pp+n n+p p–n p-qp+=n p-=nСравнениеp==qP==qP==qp==qp<qp>=qp!=qp!=qp!=qp!=qp>qp<=qПоследовательный доступ к элементам данных контейнерных типов осуществляется отпервого элемента к последнему:после последнегоbegin ()ВAСDend ()template<class C> typename C::value_type sum (const C& c){ typename C::value_type s = 0;typename C::const_iterator p = c.begin ();while (p != c.end ()) s += * (p ++);}С помощью обратных итераторов последовательный доступ к элементам данныхконтейнерных типов осуществляется от последнего элемента к первому:перед первымrbegin ()DCBArend ()template<class C> typename C::value_type sum (const C& c){ typename C::value_type s = 0;typename C::const_reverse_iterator p = c.rbegin ();while (p != c.rend ()) s += * (p ++);}перед первымпосле последнегоArend ()ВСbegin ()Drbegin ()end ()Использование адаптеров контейнеров:stack<vector<int>>queue<deque<char>>// стек целых чисел на базе вектора// очередь символов на базе двойной очередиИспользование адаптеров функциональных объектов:void f (list<int> & c){ list<int>::iterator p = find_if (c.begin (), c.end (),bind2nd (less<int> (), 21));}Эта программа эффективнее, чем использование неадаптированного функционального объекта:bool less_than_21 (int v) { return v < 21; }void f (list<int> & c){ list<int>::iterator p = find_if (c.begin (), c.end (), less_than_21);}Векторы, строящиеся на основе контейнеров класса vector:// определено для всех контейнеров STL (vector, list, ...)// все стандартные контейнеры определены в стандартном// пространстве именования (std)template<class T, class A = allocator<T>> class vector;// по умолчанию используется распределитель памяти из класса,// к которому относятся элементы контейнераvector& operator = (const vector <T, A> & obj);vector (const vector <T, A> & obj); // конструктор копирования#include <vector>using namespace std;// инициализация вектора выборочным копированием элементов из [first, last)// It - итератор для чтенияvector (It first, It last, const A& = A());// Конструкторы, которые могут вызываться с одним параметром, во избежание// случайного преобразования объявлены как явные (explicit).
Характеристики
Тип файла PDF
PDF-формат наиболее широко используется для просмотра любого типа файлов на любом устройстве. В него можно сохранить документ, таблицы, презентацию, текст, чертежи, вычисления, графики и всё остальное, что можно показать на экране любого устройства. Именно его лучше всего использовать для печати.
Например, если Вам нужно распечатать чертёж из автокада, Вы сохраните чертёж на флешку, но будет ли автокад в пункте печати? А если будет, то нужная версия с нужными библиотеками? Именно для этого и нужен формат PDF - в нём точно будет показано верно вне зависимости от того, в какой программе создали PDF-файл и есть ли нужная программа для его просмотра.