Чтение онлайн

ЖАНРЫ

Интернет-журнал "Домашняя лаборатория", 2007 №6
Шрифт:

Рассмотрим программу на C++, в которой используется технология процедурного программирования. Пользователь вводит информацию о некотором множестве книг и журналов. Для книги это автор, название, год издания. Дня журнала — название, год и номер. Далее эти данные могут как-то обрабатываться. Например, информация о каждом издании может быть представлена в стиле, принятом в определенном издательстве и определяющем порядок полей, шрифты, разделители и т. п. В данном случае никакой обработки введенных данных не производится, и они просто выводятся на терминал по окончании ввода всех данных.

// Книги и журналы (процедурное

программирование)

#include <iostream.h>

#include <string.h>

#define MAX LENGTH 100 // максимальное число символов в имени

// автора или в названии издания

#define MAX ID 100 // максимальное число изданий

// Книга

typedef struct {

char szAuthor[MAX_LENGTH]; // автор

char szTitle[MAX_LENGTH]; // название

int nYear; // год издания

} Book;

// Журнал

typedef struct {

char szTitle[MAX LENGTH]; // название

int nYear; // год выпуска

int nNumber// номер;

} Journal;

// Массив изданий

typedef struct {

int nPubldx; // индекс издания (1 — книга, 2 — журнал)

void* pPub; // указатель на издание

} Pub;

Pub aPub[MAX ID];

int nNewID = 0; // индекс нового издания

// Прототипы глобальных функций

void DisplayBook(Book &book); // вывод описания книги

void DisplayJournal(Journal Sjournal); // вывод описания журнала

void NewBook; // ввод данных о новой книге

void NewJournal; // ввод данных о новом журнале

// Главная функция

void main {

Book *pBook;

Journal *pJournal;

int nMenu, flag = 1;

while(nNewID < MAX_ID && flag)

{

// Вывод пунктов меню

cout << "Новое издание. Введите: " << endl;

cout << "1 для книги,\n 2 для журнала\n 3 — выход" << endl;

// Выбор пункта меню

сin >> nMenu;

switch (nMenu)

{ case 1: NewBook; break;

case 2: NewJournal; break;

default: flag = 0; break;

}

}

// Вывод описаний изданий

for (int id = 0; id < nNewID; id++)

{

switch (aPub[id].nPubldx)

{ case 1: pBook = (Book*) aPub[id].pPub;

DisplayBook(*pBook);

delete pBook;

break;

case 2: pJournal = (Journal*) aPub[id].pPub;

DisplayJournal(*pJournal);

delete pJournal;

break;

}

}

}

// Реализация глобальных функций

void DisplayBook(Book &book) {

cout << "BOOK: " << endl;

cout << "Author: " << book.szAuthor << endl;

cout << "Title: " << book.szTitle << endl;

cout << "Year: " << book.nYear << endl;

}

void DisplayJournal(Journal Sjournal) {

cout «"JOURNAL: " << endl;

cout <<"Title: " << journal.szTitle << endl;

cout << "Year: " << journal.nYear << endl;

cout << "Number: " << journal.nNumber << endl;

}

void NewBook {

char szBuffer[MAX LENGTH];

int nY;

Book* pBook = new Book;

cout << "Author: ";

cin >> szBuffer;

strcpy(pBook —> szAuthor, szBuffer);

cout << "Title: ";

cin >> szBuffer;

strcpy(pBook — > szTitle, szBuffer);

cout << "Year: "; cin >> nY;

pBook —> nYear = nY;

aPub[nNewID].nPubldx = 1;

aPub[nNewID++].pPub = pBook;

}

void NewJournal {

char szBuffer[MAX_LENGTH];

int nY, nN;

Journal* pJournal = new Journal;

cout << "Title: ";

cin >> szBuffer;

strcpy(pJournal —> szTitle, szBuffer);

cout << "Year: "; cin >> nY;

pJournal —> nYear = nY;

cout << "Number: "; cin >> nN;

pJournal —> nNumber = nN;

aPub[nNewID].nPubldx = 2;

aPub[nNewID++].pPub = pJournal;

}

Данный

код содержит ряд недостатков, которые (хотя бы отчасти) можно объяснить стремлением придерживаться процедурного подхода

• Наличие нескольких глобальных функций и связанных с ними глобальных данных

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

• Хранение в массиве aPub не только указателя на издание (void* pPub), но и информации о типе издания (int nPubldx)

Информация о типе необходима для выполнения явного преобразования типа

pBook = (Book*) aPub[id].pPub,

pJournal = (Journal*) aPub[id].pPub,

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

Объектно-ориентированное программирование

Теперь рассмотрим объектную реализацию предыдущей программы. Проект включает в три класса: базовый класс CPubiication и производные от него классы CBоок и CJournal, главной функции в файле publications.срр реализуется основная бизнес-логика.

// Заголовочный файл CPublication.h для класса CPublication

#ifndef _CPUBLICATION_

#define _CPUBLICATION_

#define MAX LENGTH 100 // максимальное число символов в имени автора и названии публикации

Поделиться с друзьями: