ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 02.12.2023
Просмотров: 24
Скачиваний: 2
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
Лабораторная работа №1
Классыиобъекты.Инкапсуляция.
-
Цель задания:
-
Создание консольного приложения, состоящего из нескольких файлов в системе программирования Visual Studio. -
Использование классов и объектов в ОО программе.
-
-
Теоретические сведения
2.1. Классы, объекты и их представление в ОО программе
Классявляется абстрактным типом данных, определяемым пользователем, и представляет собой модель реального объекта в виде данных и функций дляработы с ними.
Данные класса называются полями(по аналогии с полями структуры) или атрибутами, а функции класса — методами. Поля и методы называются элементамикласса.
Описание класса в первом приближении выглядит так:
class <имя>
{
[ private: ]
<описание скрытых элементов> public:
<описание доступных элементов>
}; // Описание заканчивается точкой с запятой
Спецификаторы доступа private и public управляют видимостью элементов класса. Элементы, описанные после служебного слова private, видимы только внутри класса. Этот вид доступа принят в классе по умолчанию. Интерфейс класса описывается после спецификатора public. Действие любого спецификатора распространяется до следующего спецификатора или до конца класса. Можно задавать несколько секций private и public, порядок их следования значения не имеет.
Получить информацию о содержимом полей, описанных после спецификатора private можно только с помощью специальных методов, которые называются селекторами, а изменить – с помощью методов, которые называются модификаторами.
Видимостью элементов класса можно также управлять с помощью ключевых слов struct и class. Если при описании класса используется слово struct, то все поля и методы по умолчанию будут общедоступными (public). Если при описании класса используется слово class, то по умолчанию все методы и поля класса будут скрытыми (private).
Все методы класса имеют непосредственный доступ к его скрытым полям.
Свойства полей класса:
-
могут иметь любой тип, кроме типа этого же класса (но могут быть указателями или ссылками на этот класс); -
могут быть описаны с модификатором const, при этом они инициализируются только один раз (с помощью конструктора) и не могут изменяться; -
Инициализация полей при описании не допускается. -
Если тело метода определено внутри класса, он является встроенным (inline). Как правило, встроенными делают короткие методы. Если внутри класса записано только объявление (заголовок) метода, сам метод должен быть определен в другом месте
программы с помощью операции доступа к области видимости (::): class Person
{
string name;//имя int age;//возраст public:
void Set_Person(string Name,int Age);//модификатор void Set_Age(int Age);//модификатор
string Get_Person (){return name;}//селектор int Get_Age(){return age;}//селектор
void Print_Person()//встроенная функция печати
{
cout<
“<
}
...
};
//определение методов класса
void Person::Set_Person(string Name,int Age);
{
Name=name; age=Age;
}
Переменная класса Person называется экземпляром класса или объектом. Класс объявляется один раз, а переменных такого класса (объектов) может быть сколько угодно. Объявляются такие переменные так же как и переменные встроенных типов:
Person p;
Person *pp;//указатель на переменную Person Arr_p[10];//массив переменных
Обращаться к полям и методам класса можно точно также как к полям структуры:
Strcpy(p.name,”Ivanov”); p.age=20; p.Set_Person(”Ivanov”,20); pp=new(Person);
pp->Set_Person(”Petrov”,21); Arr_p[1].Set_Person(”Sidorov”,22);
-
Постановка задачи
-
Реализовать определение нового класса. Для демонстрации работы с объектами написать главную функцию. Продемонстрировать разные способы создания объектов и массивов объектов. -
Структура-пара – структура с двумя полями, которые обычно имеют имена first и second. Требуется реализовать тип данных с помощью такой структуры. Во всех заданиях должны присутствовать :-
метод инициализации Init (метод должен контролировать значения аргументов на корректность); -
ввод с клавиатуры Read; -
вывод на экран Show.
-
-
Реализовать внешнюю функцию make_тип(), где тип – тип реализуемой структуры. Функция должна получать значения для полей структуры как
параметры функции и возвращать структуру как результат. При передаче ошибочных параметров следует выводить сообщение и заканчивать работу.
-
Ход работы
Задача
Поле first – дробное число; поле second – целое число, показатель степени. Реализовать метод power() – возведение числа first в степень second. Метод должен правильно работать при всех значениях first и second
-
Создать пустой проект. Для этого требуется-
Запустить MS Visual Studio: -
Выбрать команду File/New/Project -
В окне New Project выбрать Win Console 32 Application, в поле Name указать имя проекта (Lab1), в поле Location указать место положения проекта (личную папку), нажать кнопку Ok. -
В следующем окне выбрать кнопку Next. -
В следующем окне выбрать кнопку Next. -
В диалоговом окне Additional Settings установить флажок Empty (Пустой проект) и нажать кнопку Finish. -
В результате выполненных действий получим пустой проект.
-
-
Добавим в проект файл fraction.h, содержащий описание класса. Для этого нужно:-
Вызвать контекстное меню проекта в панели Обозреватель решений (Solution Explorer), выбрать в нем пункт меню Add/ New Item. -
В диалоговом окне Add New Item – Lab1 выбрать Категорию Code, шаблон – Header File (.h), задать имя файла fraction. В результате выполненных действий получим пустой файл fraction.h. -
Ввести следующий текст программы: struct fraction
-
{
double first; int second;
void Init(double, int);//метод для инициализации полей void Read();//метод для чтения значений полей
void Show();//метод для вывода значений полей double Power();//вычисление степени
};
-
Добавим в проект файл fraction.cpp, содержащий описание методов класса fraction. Для этого нужно:-
Вызвать контекстное меню проекта в панели Обозреватель решений (Solution Explorer), выбрать в нем пункт меню Add/ New Item. -
В диалоговом окне Add New Item – Lab1 выбрать Категорию Code, шаблон – С++File (.cpp), задать имя файла fraction. В результате выполненных действий получим пустой файл fraction.cpp. -
Ввести следующий текст программы: #include
-
using namespace std;
//реализация метода для инициализации полей структуры void fraction::Init(double F, int S)
{
first=F; second=S;
}
//реализация метода для чтения значений полей структуры void fraction::Read()
{
cout<<"\nfirst?"; cin>>first; cout<<"\nsecond?";cin>>second;
}
//реализация метода для вывода значений полей структуры void fraction::Show()
{
cout<<"\nfirst="<
cout<<"\n";
}
//метод для возведения в степень double fraction::Power()
{
return pow (first, second);
}
-
Добавим в проект файл Lab1_main.cpp, содержащий основную программу. Для этого нужно:-
Вызвать контекстное меню проекта в панели Обозреватель решений (Solution Explorer), выбрать в нем пункт меню Add/ New Item. -
В диалоговом окне Add New Item – Lab1 выбрать Категорию Code, шаблон – С++File (.cpp), задать имя файла Lab1_main. В результате выполненных действий получим пустой файл Lab1_main.cpp, в котором будет редактироваться текст программы. -
Ввести следующий текст программы: #include
-
using namespace std;
fraction make_fraction(double F, int S)
{
fraction t;//создали временную переменную
t.Init(F,S);//инициализировали поля переменной t с помощью параметров функции return t;//вернули значение переменной t
}
-
Изменить текст функции main()
void main()
{
//определение переменных А и В fraction A;
fraction B;
A.Init(3.0,2);//инициализация переменной А B.Read();//ввод полей переменных В A.Show();//вывод значений полей переменной А B.Show();//вывод значений полей переменной В
//вывод значения степени, вычисленного с помощью функции Power() cout<<"A.Power("<
//указатели
fraction *X=new fraction;//выделение памяти под динамическую переменную X->Init(2.0,5);//инициализация
X->Show();//вывод значений полей X->Power();//вычисление степени
cout<<"X.Power("<
//массивы
fraction mas[3];//определение массива for (int i=0;i<3; i++)
mas[i].Read();//чтение значений полей for (i=0;i<3; i++)
mas[i].Show(); //вывод значений полей for (i=0;i<3; i++)
{
mas[i].Power(); //вычисление степени cout<<"mas["< cout<
}
//динамические масивы
fraction* p_mas=new fraction[3];//выделение памяти for (int i=0;i<3; i++)
p_mas[i].Read();//чтение значений полей for (i=0;i<3; i++)
p_mas[i].Show();//вывод значений полей
for (i=0;i<3; i++)
{
p_mas[i].Power();//вычисление степени cout<<"p_mas["<cout<<")="<
}
//вызов функции make_fraction() double y; int z; cout<<"first?";cin>>y; cout<<"second?";cin>>z;
//переменная F формируется с помощью функции make_fraction() fraction F=make_fraction(y,z);
F.Show(); return 0;
}
-
Выполнить компиляцию программы, используя команду Build / Build Solution или функциональную клавишу F7. Исправить имеющиеся синтаксические ошибки и снова запустить программу на компиляцию. -
После появления в окне вывода сообщения
1>lab1 - 0 error(s), 0 warning(s)
========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========
запустить программу на выполнение, используя команду Debug/ Start Without Debugging или комбинацию функциональных клавиш Ctrl+F5.
-
Изучить полученные результаты, сделать выводы.
-
Варианты
№ | Задание |
1 | Поле first – положительное целое число, числитель, поле second – положительное целое число, знаменатель. Реализовать метод ipart() – выделение целой части дроби first/second, метод должен проверять неравенство знаменателя нулю. |
2 | Поле first – положительное целое число, номинал купюры; номинал может принимать значения 1, 2, 5. 10, 50, 100, 500, 1000, 5000, поле second – положительное целое число, количество купюр данного достоинства. Реализовать метод summa() – вычисление денежной суммы. |
3 | Поле first – положительное целое число, цена товара, поле second – положительное целое число, количество единиц данного товара. Реализовать метод cost() –вычисление стоимости данного товара. |
4 | Поле first – дробное число, левая граница диапазона, поле second – дробное число, правая граница диапазона. Реализовать метод rangecheck(double x) – проверку принадлежности заданного числа х на принадлежность диапазону [first;second]. |
5 | Поле first – положительное целое число, часы, поле second – положительное целое число, минуты. Реализовать метод minutes() – приведение времени в минуты. |
6 | Линейное уравнение y=Ax+B. Поле first – дробное число, коэффициент А, поле second – дробное число, коэффициент В. Реализовать метод root() –вычисление корня линейного уравнения, метод должен проверять неравенство коэффициента А нулю. |
7 | Линейное уравнение y=Ax+B. Поле first – дробное число, коэффициент А, поле second – дробное число, коэффициент В. Реализовать метод function(double x) –вычисление значения y для заданного х. |
8 | Поле first – дробное число х, координата точки , поле second – дробное число y, координата точки. Реализовать метод distance() – вычисление расстояния от точки с координатами (first, second) до начала координат. |
9 | Поле first – дробное число х, координата точки , поле second – дробное число y, координата точки. Реализовать метод distance(double x1, doudle y1) – вычисление расстояния от точки с координатами (first, second) до точки с координатами (x1,y1). |
10 | Поле first – дробное положительное число, катет a прямоугольного треугольника, поле second – дробное положительное число, катет b прямоугольного треугольника. Реализовать метод hipotenuse() –вычисление гипотенузы. |
11 | Поле first – дробное положительное число, оклад, поле second – целое положительное число, количество отработанных дней. Реализовать метод summa() –вычисление начисленной суммы за данное количество дней по формуле: оклад/количество_дней_месяца*количество_отработанных _дней |
12 | Поле first – целое положительное число, продолжительность телефонного разговора в минутах, поле second – дробное положительное число, стоимость одной минуты разговора в рублях. Реализовать метод cost() –вычисление общей стоимости разговора |
13 | Поле first – положительное целое число, целая часть числа, поле second – положительное дробное число, дробная часть числа. Реализовать метод multiply(double k) – умножение на вещественное число k. |
14 | Поле first – положительное целое число, целая часть числа, поле second – положительное дробное число, дробная часть числа. Реализовать метод multiply(int k) – умножение на целое число k. |
15 | Элемент арифметической прогрессии aj вычисляется по формуле: aj=a0·rj.Поле first – дробное число, первый элемент прогрессии a0, поле second – положительное целое число, постоянное отношение r. Реализовать метод element(int j) –вычисление j-го элемента прогрессии. |
-
Контрольныевопросы-
Что такое класс? -
Что такое объект (экземпляр) класса?
-
-
Как называются поля класса? -
Как называются функции класса? -
Для чего используются спецификаторы доступа? -
Для чего используется спецификатор public? -
Для чего используется спецификатор private? -
Если описание класса начинается со спецификатора class, то какой спецификатор доступа будет использоваться по умолчанию? -
Если описание класса начинается со спецификатора struct, то какой спецификатор доступа будет использоваться по умолчанию? -
Какой спецификатор доступа должен использоваться при описании интерфейса класса? Почему? -
Каким образом можно изменить значения атрибутов экземпляра класса? -
Каким образом можно получить значения атрибутов экземпляра класса? -
Класс описан следующим образом struct Student
{
string name; int group;
………
};
Объект класса определен следующим образом Student *s=new Student;
Как можно обратиться к полю name объекта s?
-
Класс описан следующим образом struct Student
{
string name; int group;
……..
};
Объект класса определен следующим образом Student s;
Как можно обратиться к полю name объекта s?
-
Класс описан следующим образом class Student
{
string name; int group;
…….
};
Объект класса определен следующим образом Student *s=new Student;
Как можно обратиться к полю name объекта s?
-
Класс описан следующим образом class Student
{
string name; int group; public:
…..
};
Объект класса определен следующим образом Student s;
Как можно обратиться к полю name объекта s?
-
Класс описан следующим образом class Student
{
public:
char* name; int group;
………
};
Объект класса определен следующим образом Student *s=new Student;
Как можно обратиться к полю name объекта s?
-
Содержание отчета
-
Постановка задачи (общая и конкретного варианта). -
Описание класса. -
Определение компонентных функций. -
Определение функции make_(). -
Объяснение результатов работы программы. -
Ответы на контрольные вопросы
-