Загрузка данных


Лабораторная работа №14
Использование структур в программе
1.	Цель: научить создавать свой тип данных.

2.	Теоретические сведения.
Структура – это определяемый пользователем тип, который определяется с применением ключевого слова struct. Реальный мир – сложная модель, и для описания физического объекта потребуется несколько единиц данных. Какая информация потребуется, что бы описать книгу? Можно принять во внимание название, автора, издательство, дату публикацию, количество страниц, цену, номер ISBN – и этот список можно расширить. Вы должны специфицировать отдельные переменные для хранения каждого из параметров, необходимых для описания книги. Но в идеале вам потребуется единый тип данных, например BOOK.

Объявление структуры
Объявим структуру, для описания книги, и предположим, что включим в нее заголовок, автора, издательство, и год публикации. 
#include <iostream>
using namespace std;
struct BOOK				// Определение структуры с именем BOOK
{
	char Title[80];		// Поле структуры
	char Author[80];		// Поле структуры
	char Publisher[80];	// Поле структуры
	int Year;			// Поле структуры
};
void main()
{
	setlocale(0, "Rus");
	BOOK novel;
}
	Мы создали новый тип данных по имени BOOK. Ключевое слово struct, определяет тип BOOK, как таковой,  элементы, составляющие объект этого типа определены в фигурные скобки. Каждая строка определяет отдельный элемент структуры. Элементы структуры могут быть любого типа, за исключением самого типа структуры, внутри которой они определены.
	Элементы, заключенные в фигурные скобки (Title, Author, Publisher, Year) в  определении, называют полями структуры. 
	Для управления полями структуры создается переменная novel типа данных BOOK.

Инициализация структуры
Первый способ установить данные в структуре – это определить их начальное значение в объявлении. Проинициализируем структуру BOOK.
#include <iostream>
using namespace std;
struct BOOK				// Определение структуры с именем BOOK
{
	char Title[80];		// Поле структуры
	char Author[80];		// Поле структуры
	char Publisher[80];	// Поле структуры
	int Year;			// Поле структуры
};
void main()
{
	setlocale(0, "Rus");
	BOOK Novel=
	{
		"Paneless Programming",
		"I.C. Fingers",
		"Gutter Press",
		1981
	};
}
Как и в случае массивов, последовательность инициализирующих значений очевидно должна совпадать с последовательностью членов структур в ее определении. 

Доступ к членам структуры
Что бы обратиться к полям структуры, вы можете использовать операцию прямого выбора, которая обозначается точкой (.), иногда ее называют оператором доступа. Что бы сослаться на определенное поле структуры, вы пишете имя переменной структуры, за которой следует точка, а за ней имя поля, к которому хотите обратиться. Изменение можете записать так:

Novel.Year = 1988;
Это установит значение поля Year равным 1988. 

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

#include <iostream>
#include <fstream>
using namespace std;
struct Order
{
	int Ras_Plat;
	int Ras_Poluchat;
	int summa;
};
void main()
{
	setlocale(0, "Rus");
	Order peremen[8];		// Массив из 8 записей
	char Mas[50];		// символьный массив для временного хренения
	int i=0, x;		// i - для элементов массива, x  - расчетный счет
	ifstream in_data;		// Объявляем поток данных для ввода
	in_data.open("data.txt");	// открыаем поток для считывания
	while (!in_data.eof())		// пока не достигнут конец файла
	{
		if (i > 7)			// Если в текстовом файле больше записей
		{
			break;			// то выход из цикла
		}
		in_data.getline(Mas, '\n');	// Считываем первые данные из файла
		peremen[i].Ras_Plat = atoi(Mas);	// Преобразуем строку в число
		in_data.getline(Mas, '\n');
		peremen[i].Ras_Poluchat = atoi(Mas);
		in_data.getline(Mas, '\n');
		peremen[i].summa = atoi(Mas);
		i++;						// Увеличиваем индекс массива
	}
	in_data.close();		// Закрываем поток 	
/* Информация о сумме снятой с расчетного счета платильщика */ 
	cout <<"Введите расчетный счет платильщика: ";
	cin >> x;
	int ch=0;
	for (i=0; i<8; i++)
	{
		if (peremen[i].Ras_Plat == x)
		{
			cout << "Снятая сумма = " <<peremen[i].summa << endl;
			ch ++;
		}
	}
	/* Если такого расчетного счета нет, выдать на дисплей соответствующее сообщение*/
	if (ch == 0)
	{
		cout << "ввели неправильный расчетный счет" << endl;
	}
} 
Описание полученных результатов
Объявим структуру с тремя полями (Ras_Plat;	Ras_Poluchat; summa;). В теле главной программы объявим объект управления (Order peremen[8];). Данные считываются из текстового файла (in_data.open("data.txt");). В цикле считываем построчно данные и преобразуем эти символьные строки в числа – за это отвечает функция atoi (peremen[i].Ras_Plat = atoi(Mas);). После того как данные введены, введем с клавиатуры расчетный счет плотильщика и узнаем сумму снятую им. Если такого нет – выводим на экран соответствующее сообщение.


3.	Задание. 
Вариант 1. 
Описать структуру с именем STUDENT, содержащую следующие поля:
•	фамилия и инициалы;
•	номер группы;
•	успеваемость (массив из четырех элементов);
Написать программу, выполняющую следующие действия:
•	Ввод данных из текстового файла, состоящего из десяти записей;
•	Вывод на дисплей фамилий и номеров групп для всех студентов, имеющих оценки 4  и 5;
•	Если таких студентов нет вывести соответствующее сообщение.

Вариант 2.
Описать структуру с именем STUDENT, содержащую следующие поля:
•	фамилия и инициалы;
•	номер группы;
•	успеваемость (массив из четырех элементов);
Написать программу, выполняющую следующие действия:
•	Ввод данных из текстового файла, состоящего из десяти записей;
•	Вывод на дисплей фамилий и номеров групп для всех студентов, имеющих средний балл выше 4.0;
•	Если таких студентов нет вывести соответствующее сообщение.

Вариант 3.
Описать структуру с именем STUDENT, содержащую следующие поля:
•	фамилия и инициалы;
•	номер группы;
•	успеваемость (массив из четырех элементов);
Написать программу, выполняющую следующие действия:
•	Ввод данных из текстового файла, состоящего из десяти записей;
•	Вывод на дисплей фамилий и номеров групп для всех студентов, имеющих хотя бы одну оценку 2;
•	Если таких студентов нет вывести соответствующее сообщение.

Вариант 4.
Описать структуру с именем AEROFLOT, содержащую следующие поля:
•	название пункта назначения рейса;
•	номер рейса;
•	тип самолета;
Написать программу, выполняющую следующие действия:
•	ввод данных из текстового файла, состоящего из десяти записей;
•	вывод на экран номеров рейсов и типов самолетов, вылетающих в пункт назначения, название которого совпало с названием, введенным с клавиатуры;
•	если таких нет, выдать на экран соответствующее сообщение. 

Вариант 5.
Описать структуру с именем AEROFLOT, содержащую следующие поля:
•	название пункта назначения рейса;
•	номер рейса;
•	тип самолета;
Написать программу, выполняющую следующие действия:
•	ввод данных из текстового файла, состоящего из десяти записей;
•	вывод на экран номеров рейсов и пунктов назначения, тип которого совпало с названием, введенным с клавиатуры;
•	если таких нет, выдать на экран соответствующее сообщение. 

Вариант 6.
Описать структуру с именем WORKER, содержащую следующие поля:
•	фамилия и инициалы работника;
•	название занимаемой должности;
•	год поступления на работу;
Написать программу, выполняющую следующие действия:
•	ввод данных из текстового файла, состоящего из десяти записей;
•	вывод на дисплей фамилий работников, чей стаж работы в организации превышает значение, введенное с клавиатуры;
•	если таких нет, выдать на экран соответствующее сообщение.

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

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

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

Вариант 10.
Описать структуру с именем TRAIN, содержащую следующие поля:
•	название пункта назначения;
•	номер поезда;
•	время отправления;
Написать программу, выполняющую следующие действия:
•	ввод данных из текстового файла, состоящего из десяти записей;
•	вывод информации о поездах, номер которого введен с клавиатуры;
•	если таких нет, выдать на экран соответствующее сообщение.
 
Лабораторная работа №15
Объявление класса, создание экземпляра класса
1.	ЦЕЛЬ РАБОТЫ:
Научится работать с объектно – ориентированным программированием.
2.	ОСНОВНЫЕ ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ

Класс представляет собой абстрактный тип (определяемый программистом), ко-торый создается на основе существующих типов. Отдельный класс включает в себя данные, называемые элементами данных, и функции, называемые методами. Элементы данных и методы являются равноправными компонентами класса.
Описание класса имеет следующий формат:
class  |  struct | union   имя_класса {список_компонентов};
В этом описании:
•	одно из ключевых слов class, struct или union указывает на начало описания класса, определяет используемый по умолчанию статус доступа к компонентам класса, а так¬же влияет на возможности наследования свойств этого класса;
•	имя_класса  — идентификатор;
•	список_компонентов - перечень объявлений элементов данных и описаний ме-тодов класса.
В соответствии с синтаксисом языка C++ каждый компонент класса облада¬ет статусом доступа. Таких статуса три: общедоступный, собственный и защи¬щенный. В качестве спецификаторов доступа используются ключевые слова public (общедоступный), private (собственный), protected (защищенный), за ко¬торыми следует двоеточие. Действие спецификатора на компоненты класса на¬чинается с момента его написания до нового спецификатора или до конца описания класса.
Спецификатор доступа private используется в основном для задания статуса дос-тупа к элементам данных класса, что позволяет решить проблему защиты данных. Собственные данные являются доступными только для методов своего класса. Спе-цификатор доступа public часто используется для задания общедоступного доступа методам класса, которые организуют связь объекта данного класса с внешним миром. Статус защищенный (protected) используется в классах при применении механизма наследования классов. При отсутствии наследования спецификатор protected эквивалентен спецификатору private.
Все компоненты класса, введенные с помощью ключевых слов struct и union, являются по умолчанию общедоступными, а с помощью ключевого слова class — собственными, т.е. недоступными для обращений извне. Для изменения статуса компонентов классов, описанных с помощью ключевых слов class и struct, необхо¬димо использовать спецификаторы доступа. Классы, описанные с помощью клю¬чевого слова union, не могут использоваться в качестве базовых классов при на¬следовании. Кроме того, у объектов, объявленных на основе подобного класса, для элементов данных выделяется общее место в памяти. Статус компонентов у таких классов изменить нельзя.
Пример 1. Описание класса.
Рассмотрим описание класса Sum, который обеспечивает суммирование двух целых чисел. Компонентами класса являются: два слагаемых х и у, сумма s и методы getx(),gety(), summa(), которые предназначены для инициализации ком¬понентных данных х и у, а также для получения и вывода на экран компьютера результата.
Для того чтобы в классе Sum элементы данных определить собственными, а мето¬ды общедоступными, описание класса можно записать следующим образом:

#include <iostream>
#include <fstream>
using namespace std;
class Sum
{
	int x,y,s;					   // по умолчанию private
	public:
	void getx(int xl) { x=xl; } // описание метода
	void gety(int yl) { y=yl; } // описание метода
	void summa();					   // прототип метода
// Описание метода: 
};
void Sum ::  summa () 
{
	s=x+y;
	cout << "Сумма "<< x << " и " << y << " равна:" << s << endl; 
}

void main()
{
	setlocale(0, "Rus");
	Sum a;
	a.getx(34);
	a.gety(43);
	a.summa();
}
В приведенном классе Sum компонентные данные х, у и s являются собственными по умолчанию, а методы getx(), gety() и summa()общедоступными.
В описании класса методы getx(),gety() представлены полностью, а метод summa() — своим прототипом. Методы getx()  и gety() обеспечивают ввод компонентных данных х и у соответственно, так как доступ к элементам данных класса можно обеспечить только с помощью методов класса Sum. Другим функциям компонентные данные не¬доступны, т. к. данные х и у имеют статус доступа privat.
Описания методов getx()и gety() размещены внутри класса. Такая форма описания де¬лает метод встроенным (inline) по умолчанию. В этом случае тело метода будет размещено в самом классе в виде макрорасширения. Этим достигается экономия времени реализации метода при вызове функции и выходе из нее. Эту форму описания следует использовать лишь для небольших функций. Второй способ описания метода заключается в том, что внут¬ри класса записывается прототип, а описание метода размещается в произвольном месте программы вне тела класса. В приведенном примере таким образом описан метод summa().
Создание и использование объектов
После описания класса можно объявить один или несколько объектов как эк¬земпляр этого класса. Для приведенного примера объявление объектов будет выгля¬деть следующим образом:
Sum k, z;
Здесь объявлены объекты k и z типа Sum.
Для доступа к компонентам объекта можно использовать два способа указания имени объекта:
1. Непосредственное указание имени объекта.
2. Косвенное задание имени объекта с помощью указателя и операции косвенного выбора (->).
При первом способе задания обращение к компонентам объекта имеет следующий формат:

имя_объекта . имя_класса  ::  обращение_к_компоненту;

Например, запись k.Sum ::x означает обращение к компонентному данному x объекта k типа (класса) Sum..
Обращение к компонентам объекта в ряде случаев можно выполнить без указания имени класса, к которому принадлежит объект, в следующем формате:

имя_объекта . обращение_к_компоненту;

Такая форма записи возможна в случае однозначности определения принадлеж¬ности объекта классу. Неоднозначность возникает, если имеются методы с одинако¬выми именами, описанные в разных базовых классах.
Например: k.x, k.y и k.s представляют собой обращения к элементам данных х, у и S объекта k; k.getx(3) есть вызов метода getx() объекта k с аргументом 3.
При использовании объекта k обращение k.getx(8); к методу getx() осуществляет присвоение элементу данных х значение 8 и обращение k.gety(5); к методу gety() осу-ществляет присвоение значения 5 элементу данных у.
При втором способе указания имени объекта для доступа к компонентам объекта используется следующий формат:

указатель_на_объект_класса -> обращение_к_компоненту_объекта
Если объявить и инициализировать указатель b следующим образом: Sum *b=&z;, то для объекта z выражения, позволяющие обратиться к элементам данных х и у, бу¬дут выглядеть следующим образом: b -> X и b -> у. Вызов метода для присвоения значения 6 элементу данных х объекта z можно записать таким образом: b -> getx(6);. Теперь можно написать программу с использованием класса.

Пример 1. Создание и использование объектов.
Пусть требуется составить программу, выполняющую суммирование двух произ-вольных чисел.
#include <iostream>
using namespace std;
class Sum
{
	int x,y, s;	//по умолчанию private
	public:
	void getx(int xl)	{ x=xl; }// описание метода
	void gety(int yl)	{ y=yl; } // описание метола
	void summa();	// прототип метода:
};
void Sum :: summa()
{
	s=x+y;
	cout << "\n Сумма " << x << " и " << y << " равна:" << s;
} 
void main ()
{
	Sum z, *b=&z;
	int x2,y2;
	cout << "\n Введите первое слагаемое:";
	cin >> x2;
	cout << "\n Введите второе слагаемое:";
	cin >> y2;
	z.getx(x2);
	z.gety(y2);
	b->summa (); 
}
В данной программе введён тип Sum, компонентами которого являются три элемента данных x, y, s и три метода getx(), gety(), summa(). В функции main() объявлены объект z типа Sum и указатель *b на объекты типа  Sum, инициализированный адресом объекта z. Обращения к методам объекта z: z.getx(x2); и z.gety(y2); присваивают значения x2 и y2 элементам данных x и y объекта z соответственно. Вызов b->summa(); метода summa() выполняет вычисление суммы значений элементов x и y объекта z и вывод результата на экран.
В предпоследней строке записан в качестве комментария оператор, позволяющий выдать на экран  информацию о значении данных объекта z в случае, если доступ к компонентным данным класса Sum будет изменен на public. В настоящий момент с этими данными могут работать только методы своего класса, т.к. статус доступа у данных purivate.
3.	Задание: 
1.	Заменить в лабораторной работе № 14 структуры на классы. 
2.	Написать программу вычисления объема куба с использованием класса. Обращение к полям проводить двумя способами: прямое (.) и косвенное (->).