- •Пояснительная записка
- •Минск 2008 введение
- •1. Анализ предметной области
- •2. Определение модели базы данных
- •3. Проектирование интерфейса пользователя
- •4. Написание программного кода
- •4.1. Содержание модуля “unit1.Cpp”
- •4.2. Содержание модуля “film.Cpp”
- •5. Руководство пользователя программы
- •Заключение
- •Список использованной литературы
- •Список источников сети интернет
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(); // переписываем файл с базой данных