Вы находитесь на странице: 1из 11

Министерство Образования Республики Молдова

Технический Университет Молдовы

ОТЧЁТ
О ВЫПОЛНЕНИИ ЛАБОРАТОРНОЙ РАБОТЫ
по предмету ООП

Выполнила Михайлова Н.,гр.IBM-222

Проверил Митителу В.

Кишинев,2023

ЛАБОРАТОРНАЯ РАБОТА №1 : Структура – механизм абстракции


Цели работы:
● изучение основ абстракции;
● изучение правил определения и использования структур данных;
● создание переменных типа структуры, обращение к полям;
● изучение принципов программирования, основанное на работе со структурами.

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

1. Что означает понятие – абстрактный тип данных?

Абстрактный тип данных- производный тип, то есть созданный программистом, с


использованием уже существующих типов.

2. Как определяется структура?

Структура – это объединенное в единое целое множество элементов, обычно разных


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

3. Можно ли определить структуру без указания названия типа?

Структура уже сама по себе является определенным типом


данных(абстрактным),которая содержит в себе поля.При создании полей,нужно
указывать ,к какому типу будут принадлежать переменные,которые содержатся в поле.
Пример определения структуры :

struct Book{
// определение полей структуры
char *author;
char *title;
int year;
int pages;
};

4. Чем отличается структура от других типов данных?

Структура -это тип данных,который содержит в себе типы данных разного вида.

5. Как определяется переменная типа структуры?

struct circle a, b, c;
struct book mybook;
Каждая переменная типа circle содержит четыре элемента (или поля) — x, y, dia, color.
Можно сказать, что они представляют собой вложенные переменные. Причем эти
переменные разных типов. Таким образом переменная-структура позволяет
объединить под одним именем ряд разнородных данных.

6. Когда используется точка, а когда стрелочка?

Для обращения к полям структуры используются уточненные имена, состоящие из


имени переменной-структуры, оператора выбора “.” и имени переменной поля.
b1.pages = 153; bs[i].pages = 24; Если используется указатель, то тогда вместо
оператора выбора “.” используется оператор косвенного выбора “->”. bptr = new
Book; // Выделение памяти под новую переменную bptr->pages = 176;

7. Чем отличается структура в языках С и С++?

Перед словом struct иногда добавляется зарезервированное слово typedef. Однако,


такой синтаксис свойственен С, а не С++.

8. Может ли структура содержать в себе другую структуру?

Одни структуры могут содержать другие структуры. Например:


struct Employee
{
short id;
int age;
double salary;
};

struct Company
{
Employee CEO; // Employee - это структура внутри структуры Company
int numberOfEmployees;
};

Company myCompany;

9. Может ли структура содержать в себе указатель на саму себя?

Структура имеет право содержать ссылку на саму себя.

10. Может ли быть создана переменная типа структуры динамически?


В языке C++ имеются средства создания динамических структур данных, которые
позволяют во время выполнения программы образовывать объекты, выделять для них
память, освобождать память, когда в них исчезает необходимость.

11. Что значит передача по ссылке?

Передача по ссылке позволяет возвратить из функции сразу несколько значений.


Также передача параметров по ссылке является более эффективной при передаче
очень больших объектов. Поскольку в этом случае не происходит копирования
значений, а функция использует сам объект, а не его значение.

Вариант 8

а) Создать абстрактный тип данных (структура) - книга, у которой есть название,


автор, издательство, объем в страницах и год издания. Определить функции
установки, изменения данных, сравнения. Для задания текстовых полей использовать
оператор new. Освободить память. В main-е, привести пример поиска нужной книги по
названию и по автору.

b) Создать абстрактный тип данных (структура) - вектор, который имеет указатель на


short и число элементов. Определить функции: инициализации, удаления вектора,
установки/ изменения размера, доступа к элементам вектора, вычисления суммы
четных элементов вектора. Для примера, в функции main, организовать сравнение
векторов.

a)
код :

#include <iostream>
#include <cstring>

struct Book {
char* title;
char* author;
char* publisher;
int volume;
int year;
};

void setBookData(Book& book, const char* title, const char* author, const char* publisher,
int volume, int year) {
book.title = new char[strlen(title) + 1];
strcpy(book.title, title);

book.author = new char[strlen(author) + 1];


strcpy(book.author, author);

book.publisher = new char[strlen(publisher) + 1];


strcpy(book.publisher, publisher);

book.volume = volume;
book.year = year;
}

void changeBookData(Book& book, const char* title, const char* author, const char*
publisher, int volume, int year) {
delete[] book.title;
book.title = new char[strlen(title) + 1];
strcpy(book.title, title);

delete[] book.author;
book.author = new char[strlen(author) + 1];
strcpy(book.author, author);

delete[] book.publisher;
book.publisher = new char[strlen(publisher) + 1];
strcpy(book.publisher, publisher);

book.volume = volume;
book.year = year;
}

bool compareBooks(const Book& book1, const Book& book2) {


if (strcmp(book1.title, book2.title) == 0 && strcmp(book1.author, book2.author) == 0) {
return true;
}
return false;
}

int main() {
Book book1;
setBookData(book1, "The Great Gatsby", "F. Scott Fitzgerald", "Scribner", 180, 1925);

Book book2;
setBookData(book2, "To Kill a Mockingbird", "Harper Lee", "J. B. Lippincott & Co.", 281,
1960);

// Displaying book1 data


std::cout << "Book 1:" << std::endl;
std::cout << "Title: " << book1.title << std::endl;
std::cout << "Author: " << book1.author << std::endl;
std::cout << "Publisher: " << book1.publisher << std::endl;
std::cout << "Volume: " << book1.volume << std::endl;
std::cout << "Year: " << book1.year << std::endl;

// Displaying book2 data


std::cout << "Book 2:" << std::endl;
std::cout << "Title: " << book2.title << std::endl;
std::cout << "Author: " << book2.author << std::endl;
std::cout << "Publisher: " << book2.publisher << std::endl;
std::cout << "Volume: " << book2.volume << std::endl;
std::cout << "Year: " << book2.year << std::endl;

// Searching for a book by title and author


if (compareBooks(book1, book2)) {
std::cout << "The books are the same." << std::endl;
} else {
std::cout << "The books are different." << std::endl;
}

// Freeing memory
delete[] book1.title;
delete[] book1.author;
delete[] book1.publisher;

delete[] book2.title;
delete[] book2.author;
delete[] book2.publisher;

return 0;
}
результат вывода на консоли:

Структура кода :
В начале включены необходимые заголовочные файлы (iostream и cstring).
Определена структура Book, содержащая переменные-члены для хранения названия,
автора, издателя, тома и года издания книги. Название, автор и издатель
представлены в виде символьных указателей (char*), а том и год - в виде целых чисел.

Функция setBookData принимает ссылку на книгу (Book&) и необходимые параметры


для установки данных книги. Внутри функции используется динамическое выделение
памяти для строк title, author и publisher. Для определения длины каждой строки
используется функция strlen, а для копирования содержимого входных строк в
выделенную память - strcpy. Наконец, значения тома и года присваиваются
соответствующим переменным-членам структуры Book.

Функция changeBookData аналогична функции setBookData, но сначала она удаляет


ранее выделенную память для строк названия, автора и издателя с помощью
оператора delete[]. Затем выделяется новая память и копируется содержимое входных
строк во вновь выделенную память. И, наконец, обновляет значения тома и года в
структуре Book.

Функция compareBooks принимает две ссылки на книги (const Book&) и сравнивает их


строки названия и автора с помощью функции strcmp. Если строки названия и автора
одинаковы, то возвращается true, в противном случае - false.
В функции main создаются два объекта Book (book1 и book2). Для каждой книги
вызывается функция setBookData для установки соответствующих данных. Затем
данные каждой книги выводятся на экран с помощью std::cout. После этого вызывается
функция compareBooks, которая проверяет, являются ли книги одинаковыми или
разными по названию и автору. Наконец, динамически выделенная память для строк
названия, автора и издателя обеих книг освобождается с помощью оператора delete[],
чтобы избежать утечек памяти.

Выводы:

В целом этот код демонстрирует, как определить структуру Book, установить и


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

b)

#include <iostream>

struct Vector {
short* elements;
int size;
};

void initialize(Vector& vector, int size) {


vector.elements = new short[size];
vector.size = size;
}

void deleteVector(Vector& vector) {


delete[] vector.elements;
}

void resize(Vector& vector, int newSize) {


short* newElements = new short[newSize];
int minSize = (newSize < vector.size) ? newSize : vector.size;
for (int i = 0; i < minSize; i++) {
newElements[i] = vector.elements[i];
}
delete[] vector.elements;
vector.elements = newElements;
vector.size = newSize;
}

short& access(Vector& vector, int index) {


return vector.elements[index];
}
int sumOfEvenElements(Vector& vector) {
int sum = 0;
for (int i = 0; i < vector.size; i++) {
if (vector.elements[i] % 2 == 0) {
sum += vector.elements[i];
}
}
return sum;
}

int main() {
int size;
std::cout << "Enter the size of the vector: ";
std::cin >> size;

Vector vector1;
initialize(vector1, size);

std::cout << "Enter the elements of the vector: ";


for (int i = 0; i < size; i++) {
std::cin >> vector1.elements[i];
}

Vector vector2;
initialize(vector2, size);

std::cout << "Enter the elements of the second vector: ";


for (int i = 0; i < size; i++) {
std::cin >> vector2.elements[i];
}

int sum1 = sumOfEvenElements(vector1);


int sum2 = sumOfEvenElements(vector2);

std::cout << "Sum of even elements in vector 1: " << sum1 << std::endl;
std::cout << "Sum of even elements in vector 2: " << sum2 << std::endl;

deleteVector(vector1);
deleteVector(vector2);

return 0;
}

Результат вывода на консоль:


Структура кода:
Код начинается с включения необходимого заголовочного файла <iostream>, который
обеспечивает функциональность входных и выходных потоков в языке C++.

Далее определяется структура под названием "Vector". Эта структура имеет два
члена: elements, который является указателем на массив коротких целых чисел, и size,
который представляет собой размер вектора.

Затем в коде определяются несколько функций, которые работают со структурой


Vector:

initialize(Vector& vector, int size): Эта функция принимает в качестве параметров объект
Vector и целое число size. Она динамически выделяет память под массив элементов с
помощью ключевого слова new и присваивает размер члену size вектора.

deleteVector(Vector& vector): Эта функция принимает в качестве параметра объект


Vector и деаллоцирует память, выделенную под массив элементов, с помощью
ключевого слова delete[].

resize(Vector& vector, int newSize): Эта функция принимает в качестве параметров


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

access(Vector& vector, int index): Эта функция принимает в качестве параметров объект
Vector и индекс и возвращает ссылку на элемент по указанному индексу в массиве
элементов.

sumOfEvenElements(Vector& vector): Эта функция принимает в качестве параметра


объект Vector и вычисляет сумму четных элементов в массиве elements. При этом
выполняется итерация по массиву и проверяется, является ли каждый элемент
кратным 2 (т.е. четным). Если элемент четный, то он добавляется к текущей сумме.

Функция main() является точкой входа в программу. Она предлагает пользователю


ввести размер вектора, а затем инициализирует два объекта Vector - vector1 и vector2 -
с помощью функции initialize().

Далее пользователю предлагается ввести элементы для каждого вектора с помощью


цикла for и объекта std::cin. Элементы хранятся в массиве elements каждого вектора.

Затем с помощью функции sumOfEvenElements() вычисляется сумма четных


элементов в каждом векторе и результаты присваиваются переменным sum1 и sum2.

Наконец, с помощью объекта std::cout и оператора << выводится сумма четных


элементов для каждого вектора. Затем с помощью функции deleteVector() память для
каждого вектора деаллоцируется, и возвращается 0, что свидетельствует об
успешном выполнении программы.

Выводы:
В целом данный код демонстрирует использование struct для хранения и
манипулирования массивами коротких целых чисел в языке C++. Показано
динамическое выделение памяти, работа с массивами и основные операции ввода-
вывода.

Вам также может понравиться