Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курсовой по ОИиВТ - Сдано.doc
Скачиваний:
22
Добавлен:
01.04.2014
Размер:
409.6 Кб
Скачать

4. Написание программного кода

Для написания программного кода в нашем случае будет использоваться среда быстрой разработки Cи++ Builder, выпускаемая компанией CodeGear. Cи++ Builder объединяет Библиотеку визуальных компонентов и среду программирования (IDE). По ходу исходного текста отметим наиболее существенные моменты, поясняющие логику работы программы.

4.1. Содержание модуля “unit1.Cpp”

Итак, директива препроцессора #include позволяет подключить файл с объявлениями стандартных функций, заголовочный файл для организации ввода-вывода, функции для работы с консолью а также прототипы различных математических функций:

#include <stdlib.h> //

#include <stdio.h> //

#include <conio.h> //

#include <string>

#include <iostream>

#include <math.h> //

#include "film.cpp"

Здесь и далее "фильм" - объект (экземпляр класса) Film

using namespace std;

int mainMenu(); // реализация основного меню программы

void addFilm (); // функция добавления фильма (в массив указателей на объекты Film)

void editFilm (); // функция редактирования фильма

void delFilm(); // функция удаления фильма (из массива указателей на объекты Film)

void viewAllFilms(); // функция вывода всех фильмов (из массива указателей на

объекты Film)

void sellTickets(); // функция визуального представления зрительных мест кинотеатра и продажи определенного билета

void readDBfile (); // чтение из файла базы данных по фильмам в массивуказателей на объекты Film

void saveDBfile (); // запись в файл базы данных по фильмам из массива указателей на объекты Film

Film * filmDB [500]; // массив указателей на объекты Film

Film * pFilm; // указатель на объект Film

int filmDBitems; // кол-во элементов в массиве указателей на объекты Film

int main (void)

{

filmDBitems = 0;

readDBfile ();

int choice;

bool exit = false;

while (!exit) // цикл главного меню программы, он повторяется до тех пор пока не выбран пункт меню, отличный от перечисленных

{

choice = mainMenu(); // выбранный пункт меню

switch (choice) // определение, какая функция будет задействована далее

{

case 1: viewAllFilms(); break;

case 2: sellTickets(); break;

case 3: addFilm(); break;

case 4: editFilm(); break;

case 5: delFilm(); break;

default: exit = true; break; //если ни однн случай из (case 1 .. case 5)

}

if (exit) break; // .. то выйди из main (завершить программу)

}

}

void readDBfile ()

{

char * newName = new char [100]; // инициализация указателя на массив символов длиной 100 и выделение необходимого количества памяти (в динамической памяти)

char * newDate = new char [100]; // аналогично предыдущей записи

char * newTime = new char [100]; // аналогично предыдущей записи

int newRoom = 0; // инициализация целочисленной переменной (в стеке)

int newCost = 0; // аналогично предыдущей записи

FILE *out; // инициализация указателя на поток данных из файла

out=fopen("films.dat","r"); // открытие файла для чтения (указатель устанавливается в начало файла, если файла не существует - возвращается NULL)

if (out == NULL) // если файла не существует…

{

cout << "Can't find database file 'FILMS.DAT'"; // .. то вывести соответствующее предупреждение на экран

return;

}

fscanf (out, "%d\n", &filmDBitems); // получить первую строку из файла (количество фильмов) и записать ее в переменную filmsDBitems. Особенность функции fscanf заключается в том, что целочисленные переменные передаются по ссылке, поэтому используем &filmDBitems

for (int i=0; i< filmDBitems; i++) // читаем все строки из файла

{

fscanf(out,"%d%d%s%s%s\n", &newRoom, &newCost, newName, newDate, newTime); // получить данные по фильму

filmDB[i] = new Film (newName,newDate,newTime, newRoom, newCost); // создать экземпляр класса Film при помощи конструктора класса Film (char*, char*, char* , int, int) и разместить указатель на него в объявленном массиве указателей

}

fclose(out); // закрыть поток данных из файла

}

int mainMenu()

{

int choice;

cout << "\n ------------------------------------------ " << endl; // вывод текстовой надписи на экран

cout << " MAIN MENU " << endl; // аналогично предыдущей записи

cout << " (1) VIEW ALL FILMS " << endl; // аналогично предыдущей записи

cout << " (2) SELL TICKETS " << endl; // аналогично предыдущей записи

cout << " (3) ADD FILM " << endl; // аналогично предыдущей записи

cout << " (4) EDIT FILM INFO " << endl; // аналогично предыдущей записи

cout << " (5) DELETE FILM " << endl; // аналогично предыдущей записи

cout << " Your choice: "; // аналогично предыдущей записи

cin >> choice;

return choice;

}

void viewAllFilms()

{

if (filmDBitems == 0) // если фильмов не существует…

{

cout << "No films in database"; // .. то вывести соответствующее предупреждение на экран

return;

}

if (filmDBitems > 1) //сортировать, если количество фильмов больше 1

{

cout << " SORT FILMS BY " << endl; // вывод текстовой надписи на экран

cout << " (1) NAME " << endl; // аналогично предыдущей записи

cout << " (2) DATE " << endl; // аналогично предыдущей записи

cout << " (3) ROOM " << endl; // аналогично предыдущей записи

cout << " (4) PRICE " << endl; // аналогично предыдущей записи

cout << " Your choice: "; // аналогично предыдущей записи

int choice, i, j;

cin >> choice;

switch (choice) // определение, какая функция будет задействована далее

{

case 1:

//строки сравниваются по принципу: строка, где номер кодировки первого несовпадающего символа “больше”, является “большей” строкой

for (i=0; i<filmDBitems; i++) // обойти все фильмы

for (j=filmDBitems-1; j>i; j--) // обойти все фильмы в обратном порядке

if ( filmDB[j-1]->getName() > filmDB[j]->getName() ) // если название предыдущего фильма “больше” следующего то..

{ // .. поменять указатели массива местами

pFilm = filmDB[j-1]; // сохраняем адрес указателя из массива (во временном указателе)

filmDB[j-1] = filmDB[j]; // присваиваем первому указателю адрес второго указателя

filmDB[j] = pFilm; // присваиваем второму указателю адрес временного указателя

}

break;

case 2:

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

for (j=filmDBitems-1; j>i; j--)

if ( filmDB[j-1]->getDate() > filmDB[j]->getDate() ) // аналогично предыдущему случаю, только вызываются соответствующие методы getDate, и сравниваются даты фильмов

{

pFilm = filmDB[j-1];

filmDB[j-1] = filmDB[j];

filmDB[j] = pFilm;

}

break;

case 3: // аналогично предыдущему случаю, сравниваются комнаты (залы) фильмов

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

for (j=filmDBitems-1; j>i; j--)

if ( filmDB[j-1]->getRoom() > filmDB[j]->getRoom() )

{

pFilm = filmDB[j-1];

filmDB[j-1] = filmDB[j];

filmDB[j] = pFilm;

}

break;

case 4: // аналогично предыдущему случаю, сравниваются цены билетов

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

for (j=filmDBitems-1; j>i; j--)

if ( filmDB[j-1]->getCost() > filmDB[j]->getCost() )

{

pFilm = filmDB[j-1];

filmDB[j-1] = filmDB[j];

filmDB[j] = pFilm;

}

break;

}

}

cout << "\n------------------------------------------ " << endl;

for (int i=0; i<filmDBitems; i++)

{

std::cout << i+1 << ") ";

filmDB[i]-> printFilm();

}

cout << "------------------------------------------ \n " << endl;

}

void addFilm ()

{

std::cout << "Input film name: ";

char * newName = new char [100];

std::cin >> newName;

std::cout << "\nInput film date [dd:mm]: ";

char * newDate = new char [100];

std::cin >> newDate;

std::cout << "\nInput film time [HH:MM]: ";

char * newTime = new char [100];

std::cin >> newTime;

std::cout << "\nWhat room [1..3]: ";

int newRoom = 0;

std::cin >> newRoom;

int newCost = 0;

std::cout << "\nTicket cost: ";

std::cin >> newCost;

filmDB[filmDBitems] = new Film (newName,newDate,newTime, newRoom, newCost); // создать объект Film и разместить указатель на него в конце массива указателей

filmDB[filmDBitems]-> printFilm(); // вывести данные по добавленному фильму

filmDBitems++; // увеличить количество фильмов на единицу

saveDBfile(); // переписать файл с базой данных

std::cout << "New film added successfully!\n"; // вывод соответствующей надписи на экран

}

void editFilm()

{

int choice;

for (int i=0; i<filmDBitems; i++) //вывести все фильмы

{

std::cout << i+1 << ") ";

filmDB[i]-> printFilm();

}

std::cout << "Select a movie to edit: ";

std::cin >> choice; // выбрать фильм для редактирования

if (choice > filmDBitems) exit;

std::cout << "Input film name: ";

char * newName = new char [100];

std::cin >> newName;

std::cout << "\nInput film date [dd:mm]: ";

char * newDate = new char [100];

std::cin >> newDate;

std::cout << "\nInput film time [HH:MM]: ";

char * newTime = new char [100];

std::cin >> newTime;

std::cout << "\nWhat room [1..3]: ";

int newRoom = 0;

std::cin >> newRoom;

std::cout << "\nTicket cost: ";

int newCost = 0;

std::cin >> newCost;

filmDB[choice-1] -> setName (newName); // вызвать метод класса setName, который изменяет значение private переменной name для выбранного объекта Film

filmDB[choice-1] -> setDate (newDate); // -//-

filmDB[choice-1] -> setTime (newTime); // -//-

filmDB[choice-1] -> setRoom (newRoom); // -//-

filmDB[choice-1] -> setCost (newCost); // -//-

filmDB[choice-1] -> printFilm();

saveDBfile(); // переписать файл с базой данных

std::cout << "Film edited successfully!\n"; // вывод соответствующей надписи на экран

}

void sellTickets()

{

int choice;

for (int i=0; i<filmDBitems; i++)

{

std::cout << i+1 << ") ";

filmDB[i]-> printFilm();

}

std::cout << "Select a movie: ";

std::cin >> choice; //выбрать фильм

if (choice > filmDBitems) exit;

filmDB[choice-1]-> printFilm(); //вывести информацию по фильму

int counter = 0; // подсчет свободных мест во время вывода

int row, seat;

for (int j=0; j<16; j++) // обход всех рядов в зале

{

cout << j+1 << ">\t"; // номер ряда > TAB

if (floor(j/4)==1) cout << " "; // для точного отображения мест всех рядов ровно друг под другом

if (floor(j/4)==2) cout << " "; // -//-

if (floor(j/4)==3) cout << " "; // -//-

if (floor(j/4)==4) cout << " "; // -//-

for (int i =0; i<20 - floor(j/4); i++) // обойти все места в ряду

if (filmDB[choice-1]->getTicket(j,i)) // если место свободно..

{

counter++;

cout << i+1 << " "; // .. то вывести его помер

}

else // если место занято, то выводим “пробел”

{

if (i+1 < 10) cout << " "; // для точного отображения мест всех рядов ровно друг под другом

else cout << " "; // для точного отображения мест всех рядов ровно друг под другом

}

cout << endl; // переход на новый ряд

}

cout << "Available tickets: " << counter << endl;

cout << "Enter row and seat number: ";

cin >> row;

cin >> seat;

filmDB[choice-1]->setTicket(row-1,seat-1); // изменить состояние места с рядом “row” и местом “seat” в объекте класса Film

cout << "Ticket sold!"; // вывод соответствующей надписи на экран

}

void saveDBfile ()

{

char * newName = new char [100];

char * newDate = new char [100];

char * newTime = new char [100];

int newRoom =0;

int newCost =0;

FILE *in; // инициализация указателя на поток данных из файла

in=fopen("films.dat","w"); // открыть файл для записи (если не существует, то файл создается, если файл уже существует, то данные в нем уничтожаются)

fprintf (in, "%d\n", filmDBitems); // записать количество фильмов (строк в файле)

for (int i=0; i<filmDBitems; i++)

{

newName = filmDB[i]->getName(); //вызов метода класса, возвращающего значение private переменной name (хранящей имя фильма)

newDate = filmDB[i]->getDate(); // аналогично предыдущей записи (дата)

newTime = filmDB[i]->getTime(); // аналогично предыдущей записи (время)

newRoom = filmDB[i]->getRoom(); // аналогично предыдущей записи (зал)

newCost = filmDB[i]->getCost(); // аналогично предыдущей записи (цена)

fprintf(in,"%d %d %s %s %s\n",newRoom,newCost, newName, newDate, newTime); // записать строку с данными фильма в файл

}

fclose(in); //закрыть поток данных из файла

}

void delFilm()

{

int choice;

for (int i=0; i<filmDBitems; i++)

{

std::cout << i+1 << ") ";

filmDB[i]-> printFilm();

}

std::cout << "Select a movie to delete: ";

std::cin >> choice;

delete filmDB[choice-1];

if (choice == filmDBitems) // если выбран последний фильм, то количество фильмов уменьшается на единицу

filmDBitems--;

else // если выбран не последний фильм, то на место указателя выбранного фильма переписать следующий и т.д.

{

int id = choice-1;

for (int i=id; i<filmDBitems-1; i++)

{

filmDB[id] = filmDB[id+1];

}

filmDBitems--; // уменьшаем количество фильмов на единицу

}

cout << "Successfully deleted from database!"; // вывод соответствующей надписи на экран

saveDBfile(); // переписываем файл с базой данных