Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование 3.docx
Скачиваний:
8
Добавлен:
17.11.2019
Размер:
265.13 Кб
Скачать

Лабораторная работа № 10 классы. Класс массивы структур

  1. ЦЕЛЬ И ЗАДАЧИ РАБОТЫ

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

Задачами работы являются:

  • написание программы на языке C++ с использованием класса массивов структур и обработкой файловой информации;

  • осуществление процедуры поиска необходимых данных в классе массивов структур и вывод результатов на экран и в файл;

  • тестирование работоспособности программы для различных исходных данных.

  1. КРАТКИЕ ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ

Целью введения концепции классов в C++ является предоставление программисту средств создания новых типов, которые настолько же удобны в использовании, как и встроенные типы. Класс - это определенный пользователем тип. Мы создаем новый тип для определения концепции, не выражаемой непосредственно встроенными типами. Например, мы могли бы ввести тип TrunkLine (междугородная линия) в программе, имеющей отношение к телефонии, тип Depositir (вкладчик) в программе управления банком или тип Pretator (хищник) в программе экологического моделирования.

Класс - фундаментальное понятие C++ и лежит в основе многих свойств C++. Класс предоставляет механизм для создания объектов.

С точки зрения синтаксиса класс в C++ - это структурированный тип, образованный на основе уже существующих типов.

В простейшем случае класс можно определить с помощью конструкции:

munjoiacca имякласса {список_членов класса}; где

. тип класса - служебное слово class;

. имя_класса - идентификатор;

. списокчленовкласса - определения и описания

типизированных данных и принадлежащих классу функций.

Функции - это методы класса, определяющие операции над объектом.

Данные - это поля объекта, образующие его структуру. Значения полей определяет состояние объекта.

Мы будем называть члены класса компонентами класса, различая компонентные данные и компонентные функции. Компоненты-функции предназначены для выполнения операций над объектным данным, их часто называют методами класса.

Для каждого компонента класса устанавливается уровень доступа либо явно, указанием уровня доступа одним из ключевых слов public или private с двоеточием, либо неявно, по умолчанию. Указание уровня доступа относится ко всем последующим компонентам класса, пока не встретится указание другого уровня доступа. Уровень доступа public разрешает доступ к компонентам класса из любого места программы, в котором известна переменная этого класса. Уровень доступа private разрешает доступ к компонентам класса только из методов этого класса. Уровень доступа к компонентам класса типа class по умолчанию private, явно можно определять и другие уровни.

Общедоступные (public) компоненты доступны в любой части программы. Они могут использоваться любой функцией как внутри класса, так и вне его. Доступ извне осуществляется через имя объекта:

имяобъекта. имя_члена_класса; ссылка_наобъект.имя_члена_класса; указатель_на_объект->имя_члена_класса;

Собственные (private) компоненты локализованы в классе и не доступны извне. Они могут использоваться функциями-членами данного класса.

Например, пусть программист решил в классе Point (точка) запретить внешний доступ к координатам точки и разрешить внешний доступ к методам перемещения точки на плоскости. Описание класса Point можно построить так:

class Point {private: int x,y;

public:

void movePoint (int newx, int newy); // смещение в новую точку void relmove (int dx, int dy ); // смещение на dx,dy

int getx ( void ) ( return x; }; int gety (void ) { return у ; };

};

Описание тела компоненты-функции может быть включено в описание класса, как это сделано в примере для функций getx и gety, или помещено вне описания класса. Компоненты-функции при их вызове неявно получают дополнительный аргумент - указатель на переменную объектного типа, для которой вызвана функция и в теле функции можно обращаться ко всем компонентам класса. В связи с этим при описании тела компоненты-функции вне описания класса нужно использовать операцию разрешения контекста, чтобы информировать компилятор о принадлежности функции к классу. Методы класса Point можно описать так:

void Point:: movePoint (int newx, int newy )

{ x = newx; у = newy ; } void Point:: relmove (int dx, int dy)

{ x += dx; у += dy ; }

Пример 1

class Date // класс дата

{

private:

int day, month, year; // поля: день, месяц, год public:

void set(int, int, int); // метод - установить дату void get(int *, int *, int *); // метод - получить дату void printO; // метод - вывести дату

};

Для описания объекта класса (экземпляра класса) используется конструкция

имя класса имя объекта Date today, myBirthday;

Date *point = &today; // указатель на объект Date clim[30]; // массив объектов

В определяемые объекты входят данные, соответствующие членам-данным класса. Функции-члены класса позволяют обрабатывать данные конкретных объектов класса. Обращаться к данным объекта и вызывать функции для объекта можно двумя способами. Во-первых, с помощью "квалифицированных" имен:

имя объекта. имя_класса:: имя данного имяобъекта. имя_кпасса:: имя_функции

Имя класса может быть опущено:

имя объекта, имя данного имяобъекта. имя_функции

Например:

Datexl;

xl.set(5, 12, 2007); xl .printO;

Второй способ доступа использует указатель на объект:

указателъ_на_объект->имя_компонента

Date *р = &xl; // или point = new Date; р -> set(7,10, 2007); р —>print();

Пример 2 Класс ’'товары"

int percent =12; // наценка class Goods {

char narae[40]; float price; public: void Input()

{

cout«"наименование:"; cin » name; cout«"цена"; cin » price;

void Print()

{

cout« "\n" « name; cout«",цена:";

cout«long(price * (1.0 + percent * 0.01));

}

};

int main(void)

{

const int к = 5;

Goods wares[k]; for (int i = 0; i < k; i++)

{

wares[i].Input();

}

cout «"\nCrmcoK товаров при наценке "«percent«"%"; for (int i = 0; i < k; i++)

{

wares[i].Print();

}

percent =10;

cout <<"\пСписок товаров при наценке "<<percent«"%";

Goods *pGoods = wares; for (int i = 0; i < k; i++)

{

pGoods->print();

pGoods++;

}

return 0;

}

Массив структур удобное средство представления и обработки табличной информации (таблиц). В качестве примера рассмотрим вариант задачи, рассмотренной в лабораторной работе № 9, но теперь решим ее с использованием класса массива структур.

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

Фамилия и инициалы

Курс

Группа

1

Иванов А.А.

1

ИСТ-101

2

Сидоров Б.Б.

1

САПР-120

...

...

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

  • include <iostream.h>

  • include <fstream.h>

  • include <string.h>

  • include <iomanip.h>

  • include <stdlib.h> const int N=200; struct student

{

char name[30]; int kurs; char gr[7];

};

struct group {

char gr[7]; intng;

class massiv // класс массив структур

{ private:

student st[N]; // исходная таблица задолжников

int n; // n - число строк в исходной таблице

group z[N]; II перечень групп, имеющих задолжников

int к; //к - число групп в перечне

public:

void inputstudentfile 0; II ввод массива задолжников из файла void outputstudent 0; II вывод массива задолжников на экран void outputgroup (); // вывод перечня групп задолжников на экран void outputgroupfile ();// вывод перечня групп задолжников в файл void perechengroup 0; // формирование перечня групп задолжников

};

// Ввод исходного массива задолжников из файла void massiv::inputstudentfile ()

{

ifstream fin; char file[10];

char iniz[7]; // рабочая переменная для инициалов

cout«’’Имя файла:” ; cin » file; fm.open(file);

if( fin=NULL) {соиК<”Файл не открыт.\п”; exit(l);}

n=0;

do {

fin » st[i].name » iniz » st[i].kurs » st[i].gr; strcat( st[i].name, “ “); // добавление инициалов через strcat( st[i].name, iniz); // пробел к фамилии n++;

}while (fm.goodO); n—;

fin.closeO;

}

// Вывод массива задолжников на экран void massiv "outputstudent 0 {

cout« “Фамилия и инициалы Курс Группа \п”; for (i=0; i<n; i++)

cout«setw(16)«st[i].name«setw(7)«st[i].kurs; cout <<setw(8)<<st[i].gr«endl;

}

// Формирование перечня групп, имеющих задолжников void massiv::perechengroup ()

{

int ij,fl; k=0;

for (i=0; i<n; i++)

{

fl=l;

for(j=0;j<k;j++)

if (strcmp(st[i].gr, z[j].gr) = 0) {fl=l; z[j].ng++; } if (fl=l) { strcpy(z[k].gr, st[i].gr); z[k].ng =1; k++; }

}

}

// Вывод перечня групп, имеющих задолжников, на экран void massiv::outputgroup ()

{

cout« “ Группа Кол-во \п”; for (i=0; i<k; i++)

cout« setw(8)« z[i].gr « setw(8)« z[i].ng « « endl;

}

// Вывод перечня групп, имеющих задолжников, в файл void massiv::outputgroupfile 0 {

ofstream fout; char file[10]; int i;

cout«’’Имя файла:” ; cin » file; fout.open(file);

if( !fout.goodO) {соиК<”Файл не открыт.\п”; exit(l);} for (i=0; i<k; i++)

fout« setw(8)« z[i].gr « setw(8)« z[i].ng « « endl;

fout.closeO;

}

/♦основная функция программы */ void main()

{

massiv а; // Объект класса massiv

  1. mputstudentfile 0;

cout« ” Исходный массив структур. \п” ;

  1. outputstudent ();

  1. perechengroup ();

cout« ” Перечень групп, имеющих задолжников. \п” ;

  1. outputgroup 0;

  1. outputgroupfile ();

}

  1. ПОРЯДОК ВЫПОЛНЕНИЯ ЛАБОРАТОРНОЙ РАБОТЫ

  1. Получение задания на лабораторную работу.

  2. Разработка алгоритма решения задачи.

  3. Составление программы на языке C++

  4. Отладка составленной программы

  5. Тестирование отлаженной программы

  6. Составление отчета о проделанной работе

  1. ТРЕБОВАНИЯ К ОФОРМЛЕНИЮ ОТЧЕТА

  1. Оформить титульный лист с указанием темы работы.

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

  3. Отобразить блок-схему алгоритма.

  4. Записать текст программы.

  5. Привести результаты тестирования программы

  6. Сформулировать вывод по проделанной работе.

  1. ВАРИАНТЫ ЗАДАНИЙ

Варианты заданий соответствуют заданиям лабораторной работы № 9. Необходимо для их решения использовать классы массива структур.

  1. КРИТЕРИИ РЕЗУЛЬТАТИВНОСТИ ВЫПОЛНЕНИЯ РАБОТЫ

Лабораторная работа считается успешно выполненной, если:

  • отчет на бумажном носителе содержит все необходимые пункты, согласно требованиям;

  • успешно демонстрируется работа программы как на выбранных студентом исходных данных, так и на заданных преподавателем исходных данных

  • студент правильно отвечает на контрольные вопросы.

  1. КОНТРОЛЬНЫЕ ВОПРОСЫ

  1. Какова цель введения классов в C++?

  2. Какие компоненты класса Вы знаете?

  3. Каково назначение методов класса?

  4. Что означает доступ к компонентам класса и как он задается?

  5. Что такое объект класса?

  6. Объясните назначение «квалифицированного» имени.