`
Читать книги » Книги » Разная литература » Газеты и журналы » Интернет-журнал "Домашняя лаборатория", 2007 №6 - Усманов

Интернет-журнал "Домашняя лаборатория", 2007 №6 - Усманов

Перейти на страницу:

// Книга

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 // максимальное число символов в имени автора и названии публикации

// Базовый класс

class CPublication

{

public:

     CPublication (); // конструктор

     virtual ~CPublication(); // деструктор

     virtual void Display (); // вывод описания публикации

protected:

     char m_szTitle[MAX_LENGTH]; //название публикации

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

};

#endif

Следующий файл содержит реализацию класса CPublication

// Файл CPublication.срр — реализация класса CPublication

#include "CPublication.h"

#include <iostream.h>

// Конструктор

CPublication::CPublication()

{

// Ввод года издания и названия

     cout << "Year: ";

     cin >> m_nYear;

     cout << "Title;";

     cin >> m_szTitle;

}

// Деструктор

CPublication::~CPublication ()

{

}

// Вывод описания публикации

void CPublication::Display()

{

     cout << "PUBLICATION: " << endl;

     cout << "Title: "<< m_szTitle << endl;

     cout << "Year: "<< m_nYear «endl;

}

Файлы CBook.h и CBook.cpp задают класс CBook.

// СВоок.h

#ifndef _СВООК_

#define _СВООК_

#include "CPublication.h"

class CBook: public CPublication // класс CBook — производный от CPublication

{

public:

     CBook(); //

Перейти на страницу:

Откройте для себя мир чтения на siteknig.com - месте, где каждая книга оживает прямо в браузере. Здесь вас уже ждёт произведение Интернет-журнал "Домашняя лаборатория", 2007 №6 - Усманов, относящееся к жанру Газеты и журналы / Сделай сам / Хобби и ремесла. Никаких регистраций, никаких преград - только вы и история, доступная в полном формате. Наш литературный портал создан для тех, кто любит комфорт: хотите читать с телефона - пожалуйста; предпочитаете ноутбук - идеально! Все книги открываются моментально и представлены полностью, без сокращений и скрытых страниц. Каталог жанров поможет вам быстро найти что-то по настроению: увлекательный роман, динамичное фэнтези, глубокую классику или лёгкое чтение перед сном. Мы ежедневно расширяем библиотеку, добавляя новые произведения, чтобы вам всегда было что открыть "на потом". Сегодня на siteknig.com доступно более 200000 книг - и каждая готова стать вашей новой любимой. Просто выбирайте, открывайте и наслаждайтесь чтением там, где вам удобно.

Комментарии (0)