Файл: Отчёт по лабораторной работе.docx

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 20.03.2024

Просмотров: 7

Скачиваний: 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 students; //вектор для хранения указателей на студентов
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 students; //вектор для хранения указателей на студентов
//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;

}