Программирование на языке С++ с использованием классов
Работа добавлена: 2016-05-29





Лабораторная работа №14

Программирование на языке С++ с использованием классов.

Цель работы: 1) изучить возможности программирования классов на языке С++; 2) получить основные навыки программирования манипуляторов ввода/вывода.

Теоретические сведения

Класс есть расширение понятия структуры языка С++. Он позволяет создавать типы и определять функции, которые задают поведение типа. Каждый представитель класса называется объектом.

Определение класса

Определение класса идентично определению структуры в С++, за исключением того, что

Пример 14.1. Определение класса.

classstr

{char *s;//элемент-данное

public://спецификатор открытого доступа

str(char *word);//функция-элемент: конструктор

~str();//функция-элемент: деструктор

voidwrite();//функция-элемент: метод печати

};

Управление доступом

В С++ можно ограничить видимость данных и функций класса при помощи метокpublic,protected,private. Метка-спецификатор доступа применяется ко всем элементам класса, следующим за ней, пока не встретится другая метка или кончится определение класса.

Метка-спецификаторpublic(открытый) используется тогда, когда элементы-данные и функции-элементы класса должны быть доступны для функций-элементов и других функций программы, в которой имеется представитель класса.

Метка-спецификаторprotected(защищенный) используется в том случае, когда элементы данных и функции-элементы должны быть доступны для функций-элементов данного класса и классов производных от него.

Метка-спецификаторprivate(закрытый) используется, если элементы-данные и функции-элементы должны быть доступны только для функций-элементов данного класса.

В классе элементы по умолчанию являются закрытыми.

Элементы класса

Элементы класса делятся на две основные категории:

Данные-элементы

Данные-элементы классов С++ идентичны элементам структур языка С++ с некоторыми дополнениями:

Элементы-функции

Функция-элемент является функцией, объявленной (описанной) внутри определения класса. Тело функции может также определяться внутри определения класса, в этом случае функция называется встроенной (inline) функцией-элементом. Когда тело функции определяется вне тела класса, перед именем функции ставится префикс из имени класса и операции разрешения области видимости (::).

Пример 14.2.

classstr

{char *s;// указатель на строку

public:

str(char *word)// встроенный конструктор

{s=new char[strlen(word)+1];

strcpy(s, word);

};

~str()   {delete [ ]s; };// встроенный деструктор

voidwrite();// объявление функции-элемента

};

voidstr::write()// определение функции-элемента

{cout<<s);

};

Доступ к данным-элементам

Функции-элементы находятся в области действия класса, в котором они определены. Т.о. они могут обращаться к любому элементу класса, используя просто имя переменной. Обычные функции или функции-элементы другого класса могут получить доступ к элементам-данным с помощью операции . или>, применяемых к представителю или указателю на представитель класса.

Пример 14.3.

class coord

{public: int x, y;//координаты xи y

};

void main()

{coordorg;// представитель класса координат

coord *orgptr = &org;// указатель на представитель класса

org.x = 0;// задание значения координатыx

orgptr>y = 0;  }// задание значения координатыy

Вызов функций-элементов

Функции-элементы класса могут вызывать другие функции-элементы того же класса, используя имя функции.

Пример 14.4.

class coord

{intx,y;// координатыx иy

public:

voidsetcoord(int _x,int _y)

// функция задания значений координат

{  x =_x; y =_y;

};

void getcoord(int &_x, int &_y)

//функция получения значений координат

{_x = x; _y = y;};

};

voidmain()

{coordorg;// представитель класса координат

coord *orgptr = &org;// указатель на представитель класса

org.setcoord(10, 10);// вызов функции-элемента

//задания значений

intcol,row;

orgptr>getcoord(col,row);// вызов функции-элемента

// получения значений координат

}

Указательthis

Каждая нестатическая (не имеющая спецификатораstatic) функция-элемент имеет доступ к объекту, для которого вызвана, через ключевое словоthis. Указательthis является указателем натип_класса *.

Пример 14.5.

class simple

{public:

simple();

void greet() { cout<<“ Hello!”;};

};

simple::simple()

{greet();// вызов

this>greet();//функции

(*this).greet();// greet()

}

Т.к. функции-элементы могут обращаться ко всем элементам класса просто по имени, в основном указательthis используется для возвращения указателя (returnthis) или ссылки (return *this) на подразумеваемый объект.

Конструктор

Конструктор инициализирует представитель класса (объект) и является функцией-элементом с тем же именем, что и класс. Конструктор вызывается компилятором всегда, когда создается представитель класса. Объект считается созданным в тот момент, когда завершил работу конструктор объекта.

Для конструкторов выполняются следующие правила:

Деструктор

Деструктор является дополнением конструктора. Он имеет то же имя, что и класс, но с префиксом - тильдой (~). Он вызывается всякий раз, когда уничтожается представитель класса. Объект считается уничтоженным, когда завершил работу деструктор объекта. Для деструктора существуют следующие правила:

Пример 14.6.

//file ctime.h

#ifndef __CTIME_H__

#define __CTIME_H__

class CTime

{char *timestr;

public:

CTime(char *str=”00:00:00”);//конструктор по умолчанию

CTime(constCTime&clk);//копирующий конструктор

~CTime();//деструктор

show();//функция-элемент

};//обязательно ставить точку с запятой, т.к.class

// объявление типа

#endif

//filectime.cpp

#include <string>

#include <iostream>

#includectime.h

using namespace std;

CTime:: CTime(char *str=”00:00:00”)

{timestr=new char[strlen(str)+1];

strcpy(timestr,str);

}

CTime:: CTime(const time& clk)

{timestr=new char[strlen(clk.timestr)+1];

strcpy(timestr,clk.timestr);

}

CTime::~ CTime()

{delete [] timestr;

}

CTime::show()

{cout<<”Time is “<<timestr<<endl;

}

//filemain.cpp

#include “ctime.h”

void main(void)

{CTimea;//дляа вызывается конструктор по умолчанию

CTime *b=newCTime;//дляb вызывается конструктор по

// умолчанию

CTimee(a);//дляe вызывается копирующий конструктор

//вызовемфункцию-элемент

a.show();//00:00:00

b->show();//00:00:00

e.show;//00:00:00

}

//в конце области видимости автоматически вызываются деструкторы объектов в порядке, обратном вызову конструкторов, т.е. сначала дляе, затем дляd и т.д..

Примеры программирования

Пример 14.7.Вывод данных с использованием манипуляторов.

#include <iostream>

#include <iomanip>

#include <math.h>

using namespace std;

int main()

{double x, y;

cout << "Input x ";

cin >> x;

y = sin(x);

cout << setprecision(3);

cout << setw(7) << x;

cout << setw(7) << y;

return 0;

}

Пример 14.8.Описать и определить класс-список.

Файлlist.h содержит описание класса.

#ifndef __LIST_H__

#define __LIST_H__

structlist

{

intinf;// информационное поле

list *next;// указатель на следующий элемент списка

};

classCSpisok

{

list*head;// указатель на начало списка

public:

CSpisok (int);

CSpisok (CSpisok&);

void print ();

~CSpisok();

};

#endif

Файлlist.cpp содержит определение функций-элементов.

#include <stdlib.h>

#include <iostream>

#include <iomanip>

#include "list.h"

using namespace std;

CSpisok::CSpisok(intn)

//конструктор инициализирует список изn элементов по принципу

// "очередь"

{head = NULL;

list *p,*pn;

for (int i = 0; i<n; i++)

{

p = new list;

p>inf = random(100)-50;

p>next = NULL;

if (head == NULL) head = p;

else pn>next = p;

pn = p;

}

}

CSpisok:: CSpisok (constCSpisok& s)

//конструкторкопииклассаCSpisok

{head = NULL;

list *sp = s.head, *p, *pn;

while (sp)

`{p = new list;

p>inf = sp>inf;

p>next = NULL;

if (head == NULL) head = p;

else pn>next = p;

pn = p;

sp = sp>next;

}

}

CSpisok::~CSpisok()

//деструктор - уничтожает объект класса список из памяти

{list *p;

while (head)

{p = head;

head = head>next;

delete p;

}

}

voidCSpisok::print()

//функция-элемент печати содержимого списка

{list *p = head;

while (p)

{cout<<setw(5)<<p>inf;

p = p>next;

}

cout<<endl;

}

Файлmain.cpp содержит основную функцию.

#include <iostream>

#include <iomanip>

#include “list.h”

using namespace std;

void main (void)

{spisoks1(10),// создание списка из 10 элементов

s2(s1),// s2-копиясписка s1

s3(15);// создание списка из 15 элементов

s1.print();//печать s1

s2.print();//печать s2

s3.print();//печатьs3

}

В проект включены файлы:main.cpp иlist.cpp.

Результаты выполнения программы:

-49  -50  -17  -47  -15  -29     3   -31  20  44

-49  -50  -17  -47  -15  -29     3   -31  20  44

-23    -6  -40   19      6  -46  -34    31  18  26  32  45  -29  -8  45

Контрольные вопросы

  1. Что представляет собой класс?
  2. Какие спецификации доступа используются при описании класса?
  3. Что является элементами класса?
  4. Как осуществляется доступ к элементам класса?
  5. Для чего используется указатель this?
  6. Что такое конструктор?
  7. Что такое деструктор?

Варианты заданий

варианта

Задание

1, 16

Определить класс-строку. В класс включить два конструктора: для определения класса строки строкой символов и путем копирования другой строки (объекта класса строки). Предусмотреть функции поиска слова в строке и добавления другой строки, начиная с позицииN

2, 17

Определить класс-строку. В класс включить два конструктора: для определения класса строки строкой символов и путем копирования другой строки (объекта класса строки). Предусмотреть функции слияния двух строк и функцию подсчёта предложений в строке.

3, 18

Определить класс-строку. В класс включить два конструктора: для определения класса строки строкой символов и путем копирования другой строки (объекта класса строки). Предусмотреть функции сортировки слов в строке по-алфавиту и подсчёта количества слов.

варианта

Задание

4, 19

Определить класс список элементов. В определение класса включить два конструктора: для определения списка по его размеру и путем копирования другого списка. Предусмотреть функции подсчёта количества элементов списка и добавления одного списка в другой список, начиная с позицииN.

5, 20

Определить класс список элементов. В определение класса включить два конструктора для определения списка по его размеру и путем копирования другого списка. Предусмотреть функции сортировки списка по возрастанию и вывода на экран в обратном порядке.

6, 21

Определить класс список элементов. В определение класса включить два конструктора для определения списка по его размеру и путем копирования другого списка. Предусмотреть функции инверсии списка (123->321) и поиска подсписка в списке.

7, 22

Определить класс сортированный список элементов. В определение класса включить два конструктора для определения списка по его размеру и путем копирования другого списка. Предусмотреть функции добавления элемента и слияния двух сортированных списков.

8, 23

Определить класс список элементов. В определение класса включить два конструктора для определения списка по его размеру и путем копирования другого списка. Предусмотреть функции формирования нового списка из элементов, входящих только в один из двух других списков и вычисления суммы элементов списков.

9, 24

Определить класс матрицу. В класс включить два конструктора для определения матрицы по количеству элементов и путем копирования другой матрицы. Предусмотреть функции вычисления детерминанта матрицы и умножения матрицы на число.

10, 25

Определить класс стек. В класс включить два конструктора для определения стека по его размеру и путем копирования другого стека. Предусмотреть функции вычисления среднего арифметического из элементов стека и нахождения элемента по его номеру

11, 26

Определить класс вектор. В класс включить два конструктора для определения вектора по его размеру и путем копирования другого вектора. При задании вектора по его размеру предусмотреть его заполнение случайными числами. Предусмотреть функции умножения векторов и подсчёта суммы элементов вектора.

12, 27

Определить класс вектор. В класс включить два конструктора для определения вектора по его размеру и путем копирования другого вектора. При задании вектора по его размеру предусмотреть его заполнение случайными числами. Предусмотреть функции нахождения максимального и минимального из элементов вектора и умножения вектора на число.

13, 28

Определить класс вектор. В класс включить два конструктора для определения вектора по его размеру и путем копирования другого вектора. При задании вектора по его размеру предусмотреть его заполнение случайными числами. Предусмотреть функции сортировки вектора по возрастанию и нахождения среднего арифметического из элементов вектора.

14, 29

Определить класс квадратная матрица. В класс включить два конструктора для определения матрицы по количеству элементов и путем копирования другой матрицы. Предусмотреть функцию нахождения седловой точки матрицы и функцию, меняющую местами элементы матрицы, симметричные относительно побочной диагонали.

15, 30

Определить класс квадратная матрица. В класс включить два конструктора для определения матрицы по количеству элементов и путем копирования другой матрицы. Предусмотреть функцию поворота матрицы на 900 и функцию нахождения суммы элементов столбца с минимальным диагональным элементом.




Возможно эти работы будут Вам интересны.

1. Использование классов в языке Си++

2. Программирование на языке JavaScript

3. Программирование на языке высокого уровня

4. Программирование задач с использованием динамических структур данных

5. Наследования классов

6. ПРОЕКТИРОВАНИЕ КЛАССОВ

7. Входная диагностическая работа для учащихся 1-х классов

8. Речевые ошибки учащихся начальных классов

9. Основные характеристики и области применения ЭВМ различных классов

10. Фразеологизмы в русском языке