ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 20.03.2024
Просмотров: 7
Скачиваний: 1
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
МИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ
ФЕДЕРАЛЬНОЕ государственное БЮДЖЕТНОЕ образовательное учреждение высшего образования
«НОВОСИБИРСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ»
Кафедра вычислительной техники
ОТЧЁТ по лабораторной работе №1
по дисциплине «Программирование»
«Переопределение операций. Использование статических членов класса»
МИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ
ФЕДЕРАЛЬНОЕ государственное БЮДЖЕТНОЕ образовательное учреждение высшего образования
«НОВОСИБИРСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ»
Кафедра вычислительной техники
ОТЧЁТ по лабораторной работе №1
по дисциплине «Программирование»
«Переопределение операций. Использование статических членов класса»
МИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ
ФЕДЕРАЛЬНОЕ государственное БЮДЖЕТНОЕ образовательное учреждение высшего образования
«НОВОСИБИРСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ»
Кафедра вычислительной техники
ОТЧЁТ по лабораторной работе №1
по дисциплине «Программирование»
«Переопределение операций. Использование статических членов класса»
Факультет: АВТФ Группа: Студент(ы): | Преподаватель: |
Новосибирск 2022 г.
Содержание
Цель работы
Изучить структуру класса, механизм создания и использования, описание членов-данных класса и методов доступа к ним, возможность инициализации объектов класса с помощью конструкторов и уничтожение их с помощью деструкторов.
Задание на лабораторную работу
Реализовать класс в соответствии с вариантом. Класс должен обеспечивать набор методов для работы с данными. Создать перегруженные конструкторы: конструктор с параметрами, конструктор копирования, конструктор по умолчанию.
Вариант 10
Построить класс для работы с информацией о студенте. Класс должен включать следующие поля: фамилию (динамическое выделение памяти для фамилии), возраст, средний балл.
Класс должен обеспечивать простейшие методы для работы с полями класса: изменение значений, вывод значений, сложение двух объектов класса.
Ход работы
Создаём класс с необходимыми по заданию методами:
class Student
{
//Поля
char* Surname; //Фамилия
unsigned int Age = 0; //Возраст
float AverageScore = 0; //Средний балл
static int Count; //Общее количество созданых экземпляров студентов
public:
Student(char*, int, float); //Конструктор с параметрами
Student(const Student&); //Конструктор копирования
Student(); //Конструктор по умолчанию
Student(); //Деструктор
void PrintParameters(); //Вывод параметров
void SetSurname(char*); //Сеттер фамилии
void SetAge(int); //Сеттер возраста
void SetAverageScore(float); //Сеттер среднего балла
const Student& operator+(const Student&); //Перегрузка оператора сложения
void Sum(const Student&);//Метод суммирования
};
Описываем конструкторы ,методы и сеттеры:
using namespace std;
int Student::Count = 0; // Инициализация статического поля
Student::Student() // Конструктор по умолчанию
{
char sur[] = "кУЗЬМИН";
SetSurname(sur);
Age = 18;
AverageScore = 50;
}
Student::Student(char* surname, int age, float averageScore) //Конструктор с параметрами
{
//Вызываем сеттеры
SetSurname(surname);
SetAge(age);
SetAverageScore(averageScore);
Count++;
}
Student::Student(const Student &student) //Конструктор копирования
{
Surname = student.Surname;
Age = student.Age;
AverageScore = student.AverageScore;
Count++;
}
Student::Student() //Деструктор
{
cout << "Вызван деструктор студента " << Surname << endl;
//Освобождаем динамическую память
delete[] Surname;
}
void Student::PrintParameters() //Вывод параметров
{
cout << "Студент " << Surname << " | Возраст " << Age << " | Средний балл " << AverageScore << endl;
}
void Student::SetSurname(char* surname) //Сеттер фамилии
{
const int len = strlen(surname);
Surname = new char[len + 1];
for (int i = 0; i < len; ++i)
{
Surname[i] = surname[i];
}
surname[len] = '\0';
strcpy(Surname, surname);
}
void Student::SetAge(int age) //Сеттер возраста
{
if (age <= 0) {
Age = 1;
}
else {
Age = age;
}
}
void Student::SetAverageScore(float averageScore) //Сеттер среднего балла
{
if (averageScore < 0) {
AverageScore = 0;
}
else {
AverageScore = averageScore;
}
}
const Student& Student::operator+(const Student& student) //Оператор сложения
{
char* surname;// = new char[] {""};
const int len = strlen(surname);
Surname = new char[len + 1];//= new char[64]; //создаем новую строку
strcpy(surname, Surname); //копируем первую часть
strncat(surname, student.Surname, 64); //соединяем со 2 частью
Student* newStudent = new Student(surname, Age + student.Age, AverageScore + student.AverageScore); //Создаем новый экземпляр класса
return *newStudent; //возвращаем его
}
void Student::Sum(const Student& student) //Метод сложения двух студентов
{
strncat(Surname, student.Surname, 128); //Соединение двух массивов
Age += student.Age;
AverageScore += student.AverageScore;
}
int Student::GetCount() //Геттер количества
{
return Count;
}
Описываем функции создания, суммирования, копирования и вывода студентов и делаем меню:
#include
#include
#include
#include "student.h"
using namespace std;
void Menu();
vector
int main()
{
setlocale(0, "");
SetConsoleCP(1251);
Menu();
}
void Create() //Функция для создания нового студента
{
char* surname = new char[64];
int age;
float averageScore;
cout << "\nВведите фамилию ";
cin >> surname;
cout << "Введите возраст ";
cin >> age;
cout << "Введите средний балл ";
cin >> averageScore;
Student* student = new Student(surname, age, averageScore);
students.push_back(student);
}
void Print() { //Вывод всех студентов
for (int index = 0; index < students.size(); ++index)
students.at(index)->PrintParameters();
system("pause");
}
void Sum() { //Суммируем студентов
if (students.size() > 1)
{
int num1, num2;
cout << "Введите номера студентов\n";
cin >> num1;
while (num1 < 1 || num1 > students.size())
{
cout << "\nТакого студента нет!";
cin >> num1;
}
num1 -= 1; //Т.к у вектора отчет начинается с 0
cin >> num2;
while (num2 < 1 || num2 > students.size() || num2 == num1 + 1)
{
cout << "\nТакого студента нет! ";
cin >> num2;
}
num2 -= 1;
students.at(num1)->PrintParameters();
students.at(num2)->PrintParameters();
cout << "\nНовое:\n";
Student* newStudent = new Student(*students.at(num1) + *students.at(num2));
newStudent->PrintParameters();
}
else
{
cout << "Студентов меньше 2!\n";
}
system("pause");
}
void Copy() { //Копирование
if (students.size() > 0)
{
int number;
cout << "Введите номер студента\n";
cin >> number;
while (number < 1 || number > students.size())
{
cout << "\nТакого студента нет! ";
cin >> number;
}
number -= 1; //т.к отчет начинается с 0
Student* student = new Student(*students.at(number)); //Вызываем конструктор копирования
students.push_back(student); //Добавляем в вектор
//pop_back
}
else
{
cout << "У вас нет студентов!\n";
}
system("pause");
}
void Menu() {
int choice;
while (true)
{
system("cls");
//cout << "Всего студентов: " << students.size() << endl;
/* cout << f1 << f2 << f3 << endl;*/
Student f1 = Student();
Student k;
Student f2 = Student(k);
char m[] = "Романов";
Student f3(m, 1000, 100);
char n[] = "Черданцев";
f1.SetSurname(n);
cout << f1 << f2 << f3 << endl;
cout << "1.Создать студента\n2.Вывести параметры студента\n3.Изменение параметров студента\n";
cout << "4.Сложение двух студентов\n5.Скопировать параметры студента\n6.Преобразовать в char*\n";
cout << "7.Вычесть двух студентов\n8.Инкремент студента\n9.Всего созданно экземпляров";
cout << endl;
cin >> choice;
while (choice < 1 || choice > 10)
{
cout << "\nТакого выбора нет!";
cin >> choice;
}
if (choice == 10)
break;
switch (choice)
{
case 1:
{
Create();
break;
}
case 2:
{
Print();
break;
}
case 3:
{
Change();
break;
}
case 4:
{
Sum();
break;
}
case 5:
{
Copy();
break;
}
case 6:
{
Convert();
break;
}
case 7:
{
Minus();
break;
}
case 8:
{
IncrementStudent();
break;
}
case 9:
{
cout << Student::GetCount() << endl;
system("pause");
break;
}
default:
break;
}
}
}
Результаты работы программы:
Рисунок - 1 Меню программы
Рисунок - 2 Создание студента
Рисунок - 3 Вывод всех студентов
Рисунок - 4 Сложение студентов
Заключение
Усвоены и закреплены на практике знания по теме «Переопределение операций. Использование статических членов класса». В ходе лабораторной работы в программе успешно реализованы операции сложения, создания объектов копирования.
Список литературы
1. Подбельский В.В.Язык С++: Учеб.пособие. - М.: Финансы и статистика, 2000-2007гг.
2. Романов Е.Л. Практикум по программированию на С++ : [учебное пособие]- Новосиб. гос. техн. ун-т; СПб. : БХВ-Петербург ; Новосибирск : Изд-во НГТУ , 2004 - 426с., ил.
3. Джорж Шеферд. Программирование на Microsoft Visual C++ .NET : мастер-класс [пер. с англ.] - М. : Русская редакция ; СПб. : Питер , 2007 , 892 с., ил.
4. Ильдар Ш Хабибуллин. Программирование на языке высокого уровня C/C++ : [учебное пособие для вузов по направлению 654600 "Информатика и вычислительная техника" ] - СПб : БХВ-Петербург , 2006 , 485 с., ил.
5. Харви М Дейтел. Как программировать на C++ : пер. с англ. - М. : Бином , 2007 , 799 с., ил.
6. Павловская, Т. А. C/C++. Программирование на языке высокого уровня : [Учебник для вузов ]- СПб. : Питер , 2002, 2005гг. , 460 с., ил.
7. Программирование на С++ : учебное пособие / [В. П. Аверкин и др.] ; под ред. А. Д. Хомоненко - СПб. : КОРОНА принт ; М. : Альтекс-А , 2003, 508 с., ил.
Приложение А. Исходные коды модулей проекта
student.h
#include
#include
using namespace std;
class Student
{
//Поля
char* Surname; //Фамилия
unsigned int Age = 0; //Возраст
float AverageScore = 0; //Средний балл
static int Count; //Общее количество созданых экземпляров студентов
public:
Student(char*, int, float); //Конструктор с параметрами
Student(const Student&); //Конструктор копирования
Student(); //Конструктор по умолчанию
Student(); //Деструктор
void PrintParameters(); //Вывод параметров
void SetSurname(char*); //Сеттер фамилии
void SetAge(int); //Сеттер возраста
void SetAverageScore(float); //Сеттер среднего балла
const Student& operator+(const Student&); //Перегрузка оператора сложения
void Sum(const Student&);//Метод суммирования
operator char*() const; //Преобразование в массив char
Student& operator++(); //Префиксный
Student& operator++(int); //Постфиксный
static int GetCount(); //Геттер количества
friend void Subtraction(Student&, Student&);//Дружественная функция для вычитания
};
main.cpp
#include
#include
#include
#include "student.h"
using namespace std;
void Menu();
vector
//Student f1 = Student();
//Student k;
//Student f2 = Student(k);
//char m[] = "Романов";
//Student f3(m, 1000, 100);
//char n[] = "Черданцев";
//f1.SetSurname(n);
int main()
{
setlocale(0, "");
SetConsoleCP(1251);
Menu();
}
void Subtraction(Student& a, Student& b) { //Реализация дружественной функции
char* surname = new char[64];
int index = 0;
for (; a.Surname[index] != '\0'; ++index)
{
surname[index] = a.Surname[index]; //заполняем посимвольно, чтобы поставить знак конца строки
}
surname[index++] = '-';
surname[index] = '\0'; //ставим знак конца строки
strncat(surname, b.Surname, 128 - index); //соединяем с другим массивом
strcpy(a.Surname, surname); //Заменяем у первого студента на получившийся массив
a.SetAge(a.Age - b.Age);
a.SetAverageScore(a.AverageScore - b.AverageScore);
}
void Create() //Функция для создания нового студента
{
char* surname = new char[64];
int age;
float averageScore;
cout << "\nВведите фамилию ";
cin >> surname;
cout << "Введите возраст ";
cin >> age;
cout << "Введите средний балл ";
cin >> averageScore;
Student* student = new Student(surname, age, averageScore);
students.push_back(student);
}
void Print() { //Вывод всех студентов
for (int index = 0; index < students.size(); ++index)
students.at(index)->PrintParameters();
system("pause");
}
void Change() { //Изменение значение полей
if (students.size() > 0) {
int number, choice;
cout << "Введите номер студента\n";
cin >> number;
while (number < 1 || number > students.size())
{
cout << "\nТакого студента нет!";
cin >> number;
}
number -= 1; //т.к отчет у вектора начинается с 0
while (true)
{
students.at(number)->PrintParameters();
cout << endl;
cout << "\n1 Изменить Фамилию\n2 Изменить возраст\n3 Измененить средний балл\n4 Закончить изменения\n";
cin >> choice;
while (choice < 1 || choice > 4)
{
cout << "\nТакого выбора нет!";
cin >> choice;
}
if (choice == 4)
break;
char* Surname = new char[64];
int age;
float averageScore;
switch (choice)
{
case 1: {
cout << "\nФамилия ";
cin >> Surname;
students.at(number)->SetSurname(Surname);
break;
}
case 2: {
cout << "\nВозраст ";
cin >> age;
students.at(number)->SetAge(age);
break;
}
case 3: {
cout << "\nСредний балл ";
cin >> averageScore;
students.at(number)->SetAverageScore(averageScore);
break;
}
default:
break;
}
}
}
else {
cout << "У вас нет студентов!\n";
}
}
void Sum() { //Суммируем студентов
if (students.size() > 1)
{
int num1, num2;
cout << "Введите номера студентов\n";
cin >> num1;
while (num1 < 1 || num1 > students.size())
{
cout << "\nТакого студента нет!";
cin >> num1;
}
num1 -= 1; //Т.к у вектора отчет начинается с 0
cin >> num2;
while (num2 < 1 || num2 > students.size() || num2 == num1 + 1)
{
cout << "\nТакого студента нет! ";
cin >> num2;
}
num2 -= 1;
students.at(num1)->PrintParameters();
students.at(num2)->PrintParameters();
cout << "\nНовое:\n";
Student* newStudent = new Student(*students.at(num1) + *students.at(num2));
newStudent->PrintParameters();
}
else
{
cout << "Студентов меньше 2!\n";
}
system("pause");
}
void Copy() { //Копирование
if (students.size() > 0)
{
int number;
cout << "Введите номер студента\n";
cin >> number;
while (number < 1 || number > students.size())
{
cout << "\nТакого студента нет! ";
cin >> number;
}
number -= 1; //т.к отчет начинается с 0
Student* student = new Student(*students.at(number)); //Вызываем конструктор копирования
students.push_back(student); //Добавляем в вектор
//pop_back
}
else
{
cout << "У вас нет студентов!\n";
}
system("pause");
}
void Convert() {
if (students.size() > 0)
{
int number;
cout << "Введите номер студента\n";
cin >> number;
while (number < 1 || number > students.size())
{
cout << "\nТакого студента нет! ";
cin >> number;
}
number -= 1;
students.at(number)->PrintParameters();
cout << "\nВывод\n";
cout << (char*)(*students.at(number)) << endl; //оператор преобразования
}
else
{
cout << "У вас нет студентов!\n";
}
system("pause");
}
void Minus() {
if (students.size() > 1)
{
int num1, num2;
cout << "Введите номера студентов\n";
cin >> num1;
while (num1 < 1 || num1 > students.size())
{
cout << "\nТакого студента нет!";
cin >> num1;
}
num1 -= 1; //Т.к у вектора отчет начинается с 0
cin >> num2;
while (num2 < 1 || num2 > students.size() || num2 == num1 + 1)
{
cout << "\nТакого студента нет! ";
cin >> num2;
}
num2 -= 1;
students.at(num1)->PrintParameters();
students.at(num2)->PrintParameters();
cout << "\nИтог\n";
Subtraction(*students.at(num1), *students.at(num2));
students.at(num1)->PrintParameters();
}
else
{
cout << "Студентов меньше 2!\n";
}
system("pause");
}
void IncrementStudent() {
if (students.size() > 0)
{
int number;
cout << "Введите номер студента\n";
cin >> number;
while (number < 1 || number > students.size())
{
cout << "\nТакого студента нет! ";
cin >> number;
}
number -= 1;
students.at(number)->PrintParameters();
cout << "\nСтало\n";
(++(*students.at(number))).PrintParameters();//Префиксный инкремент
(*students.at(number))++.PrintParameters(); //Постфиксный инкремент
}
else
{
cout << "У вас нет студентов!\n";
}
system("pause");
}
void Menu() {
int choice;
while (true)
{
system("cls");
//cout << "Всего студентов: " << students.size() << endl;
/* cout << f1 << f2 << f3 << endl;*/
Student f1 = Student();
Student k;
Student f2 = Student(k);
char m[] = "Романов";
Student f3(m, 1000, 100);
char n[] = "Черданцев";
f1.SetSurname(n);
cout << f1 << f2 << f3 << endl;
cout << "1.Создать студента\n2.Вывести параметры студента\n3.Изменение параметров студента\n";
cout << "4.Сложение двух студентов\n5.Скопировать параметры студента\n6.Преобразовать в char*\n";
cout << "7.Вычесть двух студентов\n8.Инкремент студента\n9.Всего созданно экземпляров";
cout << endl;
cin >> choice;
while (choice < 1 || choice > 10)
{
cout << "\nТакого выбора нет!";
cin >> choice;
}
if (choice == 10)
break;
switch (choice)
{
case 1:
{
Create();
break;
}
case 2:
{
Print();
break;
}
case 3:
{
Change();
break;
}
case 4:
{
Sum();
break;
}
case 5:
{
Copy();
break;
}
case 6:
{
Convert();
break;
}
case 7:
{
Minus();
break;
}
case 8:
{
IncrementStudent();
break;
}
case 9:
{
cout << Student::GetCount() << endl;
system("pause");
break;
}
default:
break;
}
}
}
source.cpp
#include "student.h"
#include
#include
#define _CRT_SECURE_NO_WARNINGS
using namespace std;
int Student::Count = 0; // Инициализация статического поля
Student::Student() // Конструктор по умолчанию
{
char sur[] = "кУЗЬМИН";
SetSurname(sur);
Age = 18;
AverageScore = 50;
}
Student::Student(char* surname, int age, float averageScore) //Конструктор с параметрами
{
//Вызываем сеттеры
SetSurname(surname);
SetAge(age);
SetAverageScore(averageScore);
Count++;
}
Student::Student(const Student &student) //Конструктор копирования
{
//strcpy(Surname, student.Surname); //Копируем строку
Surname = student.Surname;
Age = student.Age;
AverageScore = student.AverageScore;
Count++;
}
Student::Student() //Деструктор
{
cout << "Вызван деструктор студента " << Surname << endl;
//Освобождаем динамическую память
delete[] Surname;
}
void Student::PrintParameters() //Вывод параметров
{
cout << "Студент " << Surname << " | Возраст " << Age << " | Средний балл " << AverageScore << endl;
}
void Student::SetSurname(char* surname) //Сеттер фамилии
{
const int len = strlen(surname);
Surname = new char[len + 1];
for (int i = 0; i < len; ++i)
{
Surname[i] = surname[i];
}
surname[len] = '\0';
strcpy(Surname, surname);
}
void Student::SetAge(int age) //Сеттер возраста
{
if (age <= 0) {
Age = 1;
}
else {
Age = age;
}
}
void Student::SetAverageScore(float averageScore) //Сеттер среднего балла
{
if (averageScore < 0) {
AverageScore = 0;
}
else {
AverageScore = averageScore;
}
}
const Student& Student::operator+(const Student& student) //Оператор сложения
{
char* surname;// = new char[] {""};
const int len = strlen(surname);
Surname = new char[len + 1];//= new char[64]; //создаем новую строку
strcpy(surname, Surname); //копируем первую часть
strncat(surname, student.Surname, 64); //соединяем со 2 частью
Student* newStudent = new Student(surname, Age + student.Age, AverageScore + student.AverageScore); //Создаем новый экземпляр класса
return *newStudent; //возвращаем его
}
void Student::Sum(const Student& student) //Метод сложения двух студентов
{
strncat(Surname, student.Surname, 128); //Соединение двух массивов
Age += student.Age;
AverageScore += student.AverageScore;
}
int Student::GetCount() //Геттер количества
{
return Count;
}
Student::operator char*() const { //оператор преобразования
return Surname;
}
Student& Student::operator++() { //Префиксный инкремент
++Age;
++AverageScore;
return *this;
}
Student& Student::operator++(int) { //Постфиксный инкремент
Age++;
AverageScore++;
return *this;
}