Разработка программы "Расписание"
Определение необходимых модулей программы, структуры файла базы данных. Описание разработки программы, отладка и тестирование. Разработка приложения Organizer.exe, меню и руководство пользователя. Алгоритм обработки событий главного меню (расписания).
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 11.02.2014 |
Размер файла | 901,8 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru
Содержание
Введение
1. Постановка задачи
2. Выбор решения
2.1 Определение необходимых модулей программы
2.1 Определение структуры файла базы данных
3. Описание разработки программы
4. Отладка и тестирование
5. Описание программы
5.1 Разработка приложения Organizer.exe
5.2 Разработка меню
6. Руководство пользователя
Заключение
Список используемых источников
Приложение А Листинг программы
Приложение А.1 - Файл «Kurs.h»
Приложение А.2 - Файл «Main.cpp»
Приложение А.3 - Файл «Graphics.cpp»
Приложение А.4 - Файл «Database.cpp»
Приложение В Результаты работы программы
Приложение B.1 - Информационная заставка
Приложение B.2 - Окно напоминания
Приложение B.3 - Меню событий
Приложение B.4 - Меню Подробнее/Изменить
Приложение B.5 - Результаты поиска
Введение
Цель курсовой работы - проверить знания студента по пройденному за семестр материалу. Студент должен владеть основами работы в операционной системе Windows, знать ее основные команды и возможности, иметь представление об окнах и обработке оконных сообщений. Решая задачи курсовой работы, необходимо изучить приемы программирования на языке С и ассемблер, способы хранения данных в файле, организацию и работу с массивами данных, поиск, добавление и удаление записей в файле, создание и удаление файлов, научиться обрабатывать сообщения клавиатуры и мыши, получить навыки написания программ с использованием псевдографики.
Цель оформления отчетов по курсовой работе - привить студентам навыки правильного оформления научно-технических отчетов, программной и технической документации в соответствии со стандартами.
Любая программа, выполняемая на ЭВМ, обрабатывает данные с целью получения требуемого результата. В современных языках программирования (Pascal,C) имеются базовые типы данных и средств построения структурных типов данных из базовых; они облегчают составление программ для решения сложных задач, однако не избавляют программиста от проблем разработки алгоритмов и выбора подходящей структуры данных. При разработке алгоритма выбирается некоторая удобная абстрактная структура данных и алгоритм разрабатывается в терминах операций над этим абстрактным типом данных. После разработки алгоритма выбирается представление абстрактной структуры данных с помощью структуры данных языка программирования (отображение на массив, на файлы). Если задача позволяет, целесообразнее использовать более простые структуры данных. К таким традиционным структурам данных, допускающих простое и эффективное представление на ЭВМ, относятся массивы, строки, записи, таблицы, файлы. Очень часто язык содержит лишь некоторые из перечисленных структур, а остальные приходится представлять с помощью имеющихся.
Псевдографика, псевдографические символы -- совокупность символов, включенных в набор символов компьютерного шрифта, отображающих графические примитивы (линии, прямоугольники, треугольники, кресты, различная заливка и т. п.). Псевдографические символы реализуются в рамках формата (к примеру, матрица 8х12 точек) шрифта и дополняют в таком наборе цифро-буквенные и служебные символы.
Основное назначение псевдографики -- графическое оформление программ с текстовым интерфейсом пользователя (в том числе и т. н. консольных) -- отображение в них окон, меню, кнопок и прочих элементов интерфейса, создания рамок и таблиц. Первоначальная цель применения -- изображение рамок и таблиц на текстовых терминалах. Псевдографика также зачастую используется там, где передача, хранение и визуализация графики непосредственно невозможна или затруднена: телетайпы, текстовые терминалы, почтовая переписка, СМС и т. п.
В системах с графическим интерфейсом псевдографика практически не используется, поскольку там есть возможность отрисовывать те же графические элементы с более высоким качеством и изобразительностью, используя встроенные графические средства системы (скажем, GDI). Кроме того, возможность рисовать рамки псевдографикой ограничена -- аккуратно это можно делать только используя шрифты фиксированной ширины.
Другой вид псевдографики используется когда недоступны и псевдографические символы. В этом случае используются доступные и визуально схожие с псевдографикой символы: !, I, O, -, =, +, и т. п. Поэтому псевдографикой можно считать и широко применяющиеся при виртуальном общении составленные из нескольких цифро-буквенных символов комбинации -- смайлики (впрочем, непосредственное вхождение их в состав некоторых наборов символов (к примеру, Юникод) позволяет им считаться полноценными псевдографическими символами).
Работа с файлом может проходить либо в режиме записи, либо в режиме чтения. Для определения размера файла, создание, удаление, открытие, закрытие файла в С имеются стандартные функции.
1. Постановка задачи
Необходимо разработать программу «Расписание». Программа должна уметь:
- производить ввод информации о занятиях
- удаление занятий и расписания в целом
- редактирование слов и описания к ним
- создание нового расписания
- чтение расписания из файла
- сохранение расписания в файл
Также программа должна обладать описанными ниже свойствами.
Многомодульность программы. Необходимо поделить программу на логические модули. Это повысит расширяемость программы и локализации ошибок при отладке и тестировании программы.
Использование сложных типов данных - массивов, структур, файлов. Необходимо изучить базовые и сложные типы данных. Это необходимо для структуризации базы данных и при обработке данных в коде программы.
Программа должна работать в графическом или текстовом режиме видеоподсистемы. Необходимо определиться с типом интерфейса, с элементами управления. Необходимо изучить приемы и механизмы реализации псевдографического интерфейса. Это необходимо для понимания, как и почему на консоли появляются псевдографические символы, линии, окна, кнопки и т.д.
Устройство ввода-вывода - клавиатура и мышь. Необходимо научится анализировать и различать события, возникающие от работы с клавиатурой и мышью. Необходимо однозначно идентифицировать и выполнять те или иные действия в зависимости от действий пользователя. Это необходимо для легкого использования программы.
Пользовательский интерфейс должен быть построен на основе меню и панели инструментов. Необходимо изучить приемы программирования меню, выбрать подходящий вид меню. Это необходимо для создания интуитивно понятного интерфейса.
Наличие заставки. Заставка-приветствие должна сообщать пользователю необходимую и достаточную информацию о программе, имя разработчика, тему курсовой работы.
2. Выбор решения
2.1 Определение необходимых модулей программы
Разработанная программа состоит из двух модулей:
Библиотека Barfic.lib
Приложение schedule.exe
Размещено на http://www.allbest.ru
Рисунок 1 - структура модулей программы
Библиотека Barfic.lib необходима для реализации консольных псевдографических приложений, данная библиотека предоставлялась для выполнения данной курсовой работы и не модифицировалась. Библиотека предоставляет богатый набор функций и позволяет: управлять положением курсора, выводить символы, инициализировать консоль, рисовать диалоговые окна, получать события от клавиатуры и мыши.
Приложение schedule.exe является основным модулем данной курсовой работы. Приложение использует функции из библиотеки Barfic.lib. Тем самым удовлетворяет требование модульности данной курсовой работы. Управление приложением осуществляется с помощью клавиатуры и мыши. При запуске приложения выводится заставка, затем, программа готова к работе. Программа предназначена для работы базой данных (дней недели и занятий), базы данных находится в соответствующем файле, открытие и сохранение файлов выполняются средствами данной программы. Программа дает возможность просматривать содержимое файлов (баз данных), добавлять новые записи, искать, удалять и редактировать существующие записи. Допускается одновременная работа двух приложений с одними и теми же базами данных. Данные из БД отображаются в программе в виде таблицы. Навигация по БД реализована через переход между днями недели и установкой курсора на определенном занятии.
2.2 Определение структуры файла базы данных
Для работы с рапсписаниями был разработан класс:
class Shedule {//класс работы с расписанием
public:
Shedule(BOOL N,wchar_t* Name );//для имеющегося расписания
int print();//вывод на экран
grop* Grop;//само расписание
~Shedule();
private:
FILE* desc;
BOOL New;//новый ли файл
BOOL Error;//информация об ошибке
char* fName; //имя файла
void Output(unsigned int cursor,int num);//текст расписания выводит
void Save();//сохранение полученного расписания в файл
void Dell();//удаление записи
para* Seach(int* num);//поиск дня недели
void Read();//чтение из файла
void Edit(int num,int idPos);//изменить/подробнее
void Сheck();//проверка на корректность и вывод на экран типа ошибки
void zagruzka(para* ukaz, int i);//считывание одного дня учебы
};
Структура, хранящая информацию о расписании:
struct para {//структура информации о занятии
wchar_t* time;//время
wchar_t* name;//имя предмета
wchar_t* teacher;//преподаватель
wchar_t* room;//кабинет
bool okno;//свободна ли пара
};
struct grop {//расписание группы
//каждый день не больше 7ти пар
//воскресенье выходной
para raspicanie[6][7];
int NUM[6];//удобного удаления считанного расписания
};
Основные поля структур имеют текстовый формат. Для решения проблемы организации данных был выбран статический массив указателей.
Выбранная структура проста и соответствуют всем потребностям программы.
Количество дней занятий и количество занятий в день ограничено размерами массива. Структура информации о занятии динамична, что позволяет экономить память.
Ниже на рисунке 2 представлена схема данных.
Рисунок 2 - Схема данных.
3. Описание разработки программы
Для написания данной программы будет использован язык программирования Си. Этот язык является распространённым языком программирования. При разработке языка Си был принят компромисс между низким уровнем языка ассемблера и высоким уровнем других языков. В языке Си предусмотрено много операций, непосредственно исполняемых большинством микропроцессоров; в то же время он дает программисту возможность выражать свои алгоритмы и данные наиболее подходящими средствами. Язык Си обеспечивает возможности структурирования данных. Он позволяет разрабатывать большие, но структурированные программы, предоставляя возможность отдельной разработки подпрограмм.
Целью создателей языка Си была разработка мобильного языка, который можно было бы использовать для разработки системного программного обеспечения. Программы, написанные на языке высокого уровня, мобильны, поскольку язык должен быть одним и тем же независимо от того, на каком компьютере и в какой операционной системе он используется. Дополнительное свойство языка Си, называемое условной компиляцией, позволяет программисту изолировать машинно-зависимые операторы и контролировать их компиляцию в другой среде. Это дополнительно повышает мобильность программного обеспечения, написанного на языке Си.
В качестве среды программирования был выбран программный продукт Visual Studio 2005.
Разработка программы началась с реализации набора функций, необходимых для работы с файлами баз данных. Для сохранения файлов были задействована функция Save(). Для чтения из файлов используется функции Read() и zagruzka(para* ukaz, int i). Добавление элементов и их редактирование осуществляется с помощью функции void Editing (int num,int idPos). Поиск выполняет функция Seach(int* num). Удаление расписания производится функцией Dell(word* ukaz). Для реализации псевдографического интерфейса была изучена библиотека Barfic.lib. Библиотека содержит все необходимые функции для инициализации консоли, отображения меню, вывода окон, ввода текстовой информации с клавиатуры, получения событий клавиатуры и мыши, перемещения курсора, рисование символов и линий.
Основная программа schedule.exe выполнятся функцией main. В функции main осуществляется переход к вспомогательным функциям, которые реализуют меню добавления, редактирования, поиска и другие. Был разработан алгоритм функции main. Блок-схема функции представлена на рисунке 3. Функция отвечает за инициализацию консоли, за вывод заставки-приветствия и за передачу управления в функции обработки меню. Цикл обработки событий главного окна обеспечивает активизацию меню и выход из него. После выхода из функции обработки меню функция обработки событий главного окна получает идентификатор выбранного пункта меню. В зависимости от идентификатора функция вызывает функцию обработки выбранного пункта меню.
Блок схема функции main() и функции обработки событий главного окна представлена на рисунке 3. Основной задачей данной функции является получения события от клавиатуры или мыши, если событие присутствует, то вызывается функция обработки этого события. Если события нет, то программа засыпает на 20 миллисекунд, после чего вновь получает событие от клавиатуры и мыши, и так пока не выберут пункт меню «Выход».
Рисунок 3 -- Схема программы.
При запуске программы выводится экран заставка, следом главное меню. Навигация осуществляется посредством мыши. Алгоритм работы меню представлен на рисунке 4.
Рисунок 4 - Алгоритм обработки событий главного меню
Особый интерес для нас имеет меню расписание, алгоритм его работы представлен на последующих схемах.
Рисунок 5 - Алгоритм работы расписания
программа база данный приложение
Основные действия разобраны на схемах ниже.
Рисунок 6 - Алгоритм перехода к определенному дню
Перевод к нижнему регистру осуществляется для того, чтобы пользователь вводил дни как ему удобно: все символы в нижнем или с заглавной буквы. После выполнения данной функции найденный день выводится на экран и вся работа происходит с ним.
Рисунок 7- Алгоритм изменения информации о паре
Ни один байт зря не используется, память выделяется именно на то количество символов, которое введено. Если после ввода поле оказалось пустым, ему присваивается значение «_». Буфер используется на 100 символов, его вполне достаточно для решения поставленной задачи.
Рисунок 8- Алгоритм очистки информации
Очищается информация только из программы и оперативной памяти, расписание, хранимое в файле, не трогается.
Рисунок 9- Алгоритм сохранения расписания
В ходе выполнения курсовой работы был разработан новый тип файлов, с которым может работать данная программа, в последующих версиях можно обеспечить запуск из командной строки.
4. Отладка и тестирование
В качестве среды разработки была выбрана программа Visual Studio 2010. Программа предоставляет все средства необходимые при разработке и отладке разрабатываемых модулей и программ. Для отладки использовались такие инструменты как точка останова, выполнение кода по шагам, анализ содержимого локальных и глобальных переменных, анализ содержимого памяти.
Тестирование проводилось в рабочем порядке, в процессе разработки, после завершения написания программы. В ходе тестирования было выявлено и исправлено множество проблем связанных с перерисовкой содержимого таблицы, с перерисовкой меню, с освобождением выделенной памяти и многое другое. Также были добавлены проверки связанные с недопустимостью обработки некоторых пунктов меню при определенных условиях.
5. Описание программы
5.1 Разработка приложения schedule.exe
Приложение Organizer.exe является основным модулем программы. Для реализации интерфейса с пользователем была задействована библиотека Barfic.lib. Используя функции из этой библиотеки, осуществляется вывод строк на экран, получение событий от клавиатуры и мыши, перемещение курсора мыши, закрашивание части рабочей области консоли. С помощью всех перечисленных возможностей этой библиотеки были реализованы меню и экран для работы со словарем. При запуске программы происходит вывод заставки - приветствия, далее мы попадаем в главное меню, где можно открыть нужный словарь или выйти из программы.
5.2 Разработка меню
Главное меню состоит из четырех кнопок. Кнопки «Расписание» переводит нас в меню выбора словаря.
Кнопка «Выход» закрывает программу.
Недостает кнопки «Настройки», может в дальнейших версиях программы появится возможность настройки.
Кнопка «Помощь» выводит подсказки.
Кнопка «Выход» закрывает программу.
В меню словарей и в центре мы видим таблицу со словом и ниже управляющие кнопки, позволяющие добавить новый элемент, просмотреть/изменит/удалить выделенный, найти элемент в списке и вернуться назад в главное меню.
5.3 Структура файла словаря
Для данной программы был разработан новый тип файлов с расширением sdh.
Его структура:
*BEGIN //начало расписания
*Monday //понедельник
*Tuesday //вторник
*Wednesday //среда
*Thursday //четверг
*Friday //пятница
*Saturday //суббота
*END //конец словаря
После имени дня недели идет информации о количестве занятий в этот день. Затем последовательно информация о занятиях, начиная с его номера, заканчивая преподавателем, ведущим данный предмет.
6. Руководство пользователя
Программа schedule.exe предназначена для хранения информации о расписании. Программа имеет интуитивно понятный интерфейс.
Чтобы закрыть заставку, необходимо нажать клавишу «Enter» на клавиатуре. После происходит оповещение о предстоящих событиях, если что-то запланировано на сегодня. Для закрытия окна сообщения необходимо кликнуть левой кнопкой мыши по кнопке «OK» или нажать клавишу «Enter» на клавиатуре. Откроется главное меню.
Рисунок 6.1 - Главное меню
Чтобы перейти к расписанию, нужно кликнуть левой кнопкой мышки по соответствующей кнопке в меню.
Рисунок 6.1 - Меню «словарь»
Для добавления занятия необходимо кликнуть по кнопке «Изменить».
В открывшемся диалоговом окне щелкните на синюю строку напротив ее названия для того, чтобы ввести информацию. После ввода информации нажмите кнопку «Enter» на клавиатуре. После заполнения Необходимой информации, для добавления контакта необходимо кликнуть по кнопке «Добавить». Программа добавит элемент в список.
Рисунок 6.3 - Добавление нового контакта
Для поиска нужного дня используйте кнопку «Перейти».
Для сохранения расписания необходимо кликнуть по кнопке «Сохранить». Далее будет предложено ввести строку поиска. После этого вы увидите искомый контакт или сообщение, что в списке его найти не удалось.
Для возвращения в предыдущее меню кликните по кнопке «Назад». Вам будет предложено сохранить измененную базу данных.
В меню событий работа происходит таким же образом.
Заключение
При выполнении данной курсовой работы были получены навыки разработки многомодульных программ. Были освоены приемы создания псевдографического интерфейса, изучены функции работы с консолью, способы обработки событий от клавиатуры и мыши. Усвоены механизмы реализации меню. Изучены функции работы с файлом. Получены базовые навыки программирования на языке С и Ассемблер. Изучены основные возможности среды программирования Visual Studio 2005. Получены навыки отладки и тестирования программ.
В рамках выполнения курсовой работы была написана программа необходимая для ведения базы данных контактов и событий. Программа предоставляет небольшой, но достаточный список возможностей. Не требует большого количества системных ресурсов и обеспечивает быструю обработку базы данных.
Не удалось реализовать панель инструментов, т.к. псевдографический интерфейс накладывает ограничения на интерфейс программы.
В дальнейшем программу можно улучшить, добавив в интерфейс горячие клавиши на каждый пункт меню. Улучшить навигацию по базе данных путем добавления постраничного перемещения и сортировки. Добавить вывод сообщений об ошибках и подсказок при неверных действиях пользователя. Оптимизировать код для более быстрого выполнения операций чтения и записи базы данных.
Список используемых источников
1. Керниган Б. Ритчи Д. Язык программирования С. 1985 г.
2. MSDN.
3. К. Джамса. Учимся программировать на языке С++. 1997 г.
4. В. Г. Давыдов. Программирование и основы алгоритмизации. 2003 г.
Приложение А
Листинг программы
Приложение А.1 - Файл «header.h»
#include <windows.h>
#include <conio.h>
#include <wchar.h>
#include <locale>
#include <io.h>
bool Clic(INPUT_RECORD vRecord, //функция проверки на нажатие
IN unsigned nX,
IN unsigned nY,
IN unsigned nWidth,
IN unsigned nHeight);
void Table();//чтобы увеличить понятность кода, рисование таблицы вынесли
/////////////////////////////////////////////
///// функции меню
////
/////////////////////////////////////////////
int Menu();//функция работы меню
int Сreator();//функция информации о создлателее
int Help();//вывод окна помощи
void Splash();//заставка
int Raspisanie();//само долгожданное расписание
/////////////////////////////////////////////
///// все что относится к работе с расписанием
////
/////////////////////////////////////////////
struct para {//структура информации о паре
wchar_t* time;//время
wchar_t* name;//имя предмета
wchar_t* teacher;//преподаватель
wchar_t* room;//кабинет
bool okno;//свободна ли пара
};
struct grop {//расписание группы
//каждый день не больше 7ти пар
//воскресенье выходной
para raspicanie[6][7];
int NUM[6];//колличество пар в каждый день
//да и вывода тоже
};
class Shedule {//класс работы с расписанием
public:
Shedule(BOOL N,wchar_t* Name );//для имеющегося расписания
int print();//вывод на экран
grop* Grop;//само расписание
~Shedule();
private:
FILE* desc;
BOOL New;//новый ли файл
BOOL Error;//информация об ошибке
char* fName; //имя файла
void Output(unsigned int cursor,int num);//текст расписания выводит
void Save();//сохранение полученного расписания в файл
void Dell();//удаление расписания
para* Seach(int* num);//поиск дня недели
void Read();//чтение из файла
void Edit(int num,int idPos);//изменить/подробнее
void Сheck();//проверка на корректность и вывод на экран типа ошибки
void zagruzka(para* ukaz, int i);//считывание одного дня учебы
};
Приложение А.2 - Файл «Main.cpp»
#define _CRT_NONSTDC_NO_WARNINGS
#include <windows.h>
#include <conio.h>
#include <locale>
#include "Barfic.h"
#include "header.h"
void main()
{
setlocale(LC_ALL,"russian");
int idButton=0;
BOOL fResult;
// Инициализация работы с консолью
fResult = ConsoleInitialize();
if (fResult == FALSE)
{
return;
}
// Скрытие курсора
fResult = SetCursorVisible(FALSE);
if (fResult == FALSE)
{
return;
}
Splash();//заставка
while (idButton!=4) {
idButton=Menu();
switch(idButton){
case 1://выбрана кнопка расписание
idButton=Raspisanie();
break;
case 2://выбрана кнопка помощь
idButton=Help();
break;
case 3://выбрана кнопка информация о создателе
idButton=Сreator();
break;
}
}
}
Приложение А.3 - Файл «menu.cpp»
#include "Barfic.h"
#include "header.h"
int Menu(){
CHAR_INFO vPoint;
EMessageBoxId eId;
INPUT_RECORD vRecord;
int idButton=0;
// Рисование окна с рамкой
DrawWindow(ColorRed, ColorChlorine, 0, 0, 80, 25);
DrawSingleLineText(ColorBrightWhite, ColorRed, 50, 4, 20, 3, L"Главное меню", MiddleCenter);
DrawButton(ColorBrightWhite, ColorGreen, ColorBlue, 10, 3, 20, 4, L"Расписание");
DrawButton(ColorBrightWhite, ColorGreen, ColorBlue, 20, 8, 20, 4, L"Помощь");
DrawButton(ColorBrightWhite, ColorGreen, ColorBlue, 30, 13, 20, 4, L"О создателе");
DrawButton(ColorBrightWhite, ColorGreen, ColorBlue, 40, 18, 20, 4, L"Выход");
while(idButton==0) {
if (InputRecordRead(vRecord))
{
// проверка нажатия на кнопку
if(Clic(vRecord, 10, 3, 20, 4))
idButton=1;
else if(Clic(vRecord, 20, 8, 20, 4))
idButton=2;
else if(Clic(vRecord, 30, 13, 20, 4))
idButton=3;
else if(Clic(vRecord, 40, 18, 20, 4))
{
eId =
DialogMessageBox(
ColorBrightWhite, ColorGrey,
15, 10, 40, 8,
ColorYellow, ColorBlue, L"Точно желаете выйти?", TopLeft,
MessageBoxYesNo);
if (eId==MessageBoxIdYes)
idButton=4;
else {
DrawWindow(ColorRed, ColorChlorine, 0, 0, 80, 25);
DrawSingleLineText(ColorBrightWhite, ColorRed, 50, 4, 20, 3, L"Главное меню", MiddleCenter);
DrawButton(ColorBrightWhite, ColorGreen, ColorBlue, 10, 3, 20, 4, L"Расписание");
DrawButton(ColorBrightWhite, ColorGreen, ColorBlue, 20, 8, 20, 4, L"Помощь");
DrawButton(ColorBrightWhite, ColorGreen, ColorBlue, 30, 13, 20, 4, L"О создателе");
DrawButton(ColorBrightWhite, ColorGreen, ColorBlue, 40, 18, 20, 4, L"Выход");
}
}
}
Sleep(20);
}
return idButton;
}
int Сreator() {
FILE* q;
int i=0;
char s[80];int idButton=9;
INPUT_RECORD vRecord;
DrawWindow(ColorRed, ColorChlorine, 0, 0, 80, 25);
DrawWindow(ColorChlorine,ColorBlack , 4, 2, 72, 5);
DrawSingleLineText(ColorBrightWhite, ColorBlack, 30, 4, 20, 1, L"Создатель", MiddleCenter);
DrawWindow(ColorChlorine, ColorBlack , 2, 8, 76, 13);
DrawButton(ColorBrightWhite, ColorGreen, ColorBlue, 50, 22, 20, 2, L"Назад");
q=fopen("Creator.txt","r");
if (q) {
while (fgets(s,80,q)&&i<11) {
SetCursorPosition(5,9+i);
printf("%s",s);
i++;
}
}
while(idButton!=0) {
if (InputRecordRead(vRecord))
{
// проверка нажатия на кнопку
if(Clic(vRecord, 50, 22, 20, 2))//назад
idButton=0;
}
}
if (q) {
fclose(q);
}
return 1;
}
int Help() {
FILE* q;
int i=0;
char s[80];int idButton=9;
INPUT_RECORD vRecord;
DrawWindow(ColorRed, ColorChlorine, 0, 0, 80, 25);
DrawWindow(ColorChlorine,ColorBlack , 4, 2, 72, 5);
DrawSingleLineText(ColorBrightWhite, ColorBlack, 30, 4, 20, 1, L"Помощь", MiddleCenter);
DrawWindow(ColorChlorine, ColorBlack , 2, 8, 76, 13);
DrawButton(ColorBrightWhite, ColorGreen, ColorBlue, 50, 22, 20, 2, L"Назад");
q=fopen("ReadMe.txt","r");
if (q) {
while (fgets(s,80,q)&&i<11) {
SetCursorPosition(5,9+i);
printf("%s",s);
i++;
}
}
while(idButton!=0) {
if (InputRecordRead(vRecord))
{
// проверка нажатия на кнопку
if(Clic(vRecord, 50, 22, 20, 2))//назад
idButton=0;
}
}
if (q) {
fclose(q);
}
return 1;
}
int Raspisanie() {
Shedule* p;
int idButton=0;
int idButton1=0;
wchar_t buf[100];
INPUT_RECORD vRecord;
DrawWindow(ColorRed, ColorChlorine, 0, 0, 80, 25);
DrawButton(ColorBrightWhite, ColorGreen, ColorBlue, 10, 5, 25, 4, L"Новое расписание");
DrawButton(ColorBrightWhite, ColorGreen, ColorBlue, 10, 10, 25, 4, L"Имеющееся расписание");
DrawButton(ColorBrightWhite, ColorGreen, ColorBlue, 50, 22, 20, 2, L"Назад");
while(idButton==0) {
idButton1=0;
if (InputRecordRead(vRecord))
{
// проверка нажатия на кнопку
if(Clic(vRecord, 50, 22, 20, 2))//назад
idButton=1;
else if(Clic(vRecord, 10, 5, 25, 4)){//новое
DrawWindow(ColorChlorine,ColorRed , 20, 5, 40, 15);
DrawSingleLineText(ColorBrightWhite, ColorRed, 21, 7, 38, 1, L"ВВЕДИТЕ ИМЯ ФАЙЛА С РАСПИСАНИЕМ", MiddleCenter);
DrawWindow(ColorRed, ColorBlue, 24, 10, 31, 3);
DrawButton(ColorBrightWhite, ColorGreen, ColorBlue, 25, 17, 10, 2, L"ОК");
DrawButton(ColorBrightWhite, ColorGreen, ColorBlue, 40, 17, 15, 2, L"Отмена");
DialogTextBox( ColorBrightWhite, ColorBlue, 25, 11, 29, 1, buf, 100);
while(idButton1==0) {
if (InputRecordRead(vRecord))
{
if(Clic(vRecord, 40, 17, 15, 2)){//назад
idButton1=1;
DrawWindow(ColorRed, ColorChlorine, 0, 0, 80, 25);
DrawButton(ColorBrightWhite, ColorGreen, ColorBlue, 10, 5, 25, 4, L"Новое расписание");
DrawButton(ColorBrightWhite, ColorGreen, ColorBlue, 10, 10, 25, 4, L"Имеющееся расписание");
DrawButton(ColorBrightWhite, ColorGreen, ColorBlue, 50, 22, 20, 2, L"Назад");
}
else if(Clic(vRecord, 25, 17, 10, 2)){//ок
//////////////////////////////////////
////инициализация класса и запуск работы
/////////////////////////////////////
idButton=1;
idButton1=1;
}
}
}
}
else if(Clic(vRecord, 10, 10, 25, 4)) {//открыть имеющееся
DrawWindow(ColorChlorine,ColorRed , 20, 5, 40, 15);
DrawSingleLineText(ColorBrightWhite, ColorRed, 21, 7, 38, 1, L"ВВЕДИТЕ ИМЯ НОВОГО ФАЙЛА С РАСПИСАНИЕМ", MiddleCenter);
DrawWindow(ColorRed, ColorBlue, 24, 10, 31, 3);
DrawButton(ColorBrightWhite, ColorGreen, ColorBlue, 25, 17, 10, 2, L"ОК");
DrawButton(ColorBrightWhite, ColorGreen, ColorBlue, 40, 17, 15, 2, L"Отмена");
DialogTextBox( ColorBrightWhite, ColorBlue, 25, 11, 29, 1, buf, 100);
while(idButton1==0) {
if (InputRecordRead(vRecord))
{
if(Clic(vRecord, 40, 17, 15, 2)){//назад
idButton1=1;
DrawWindow(ColorRed, ColorChlorine, 0, 0, 80, 25);
DrawButton(ColorBrightWhite, ColorGreen, ColorBlue, 10, 5, 25, 4, L"Новое расписание");
DrawButton(ColorBrightWhite, ColorGreen, ColorBlue, 10, 10, 25, 4, L"Имеющееся расписание");
DrawButton(ColorBrightWhite, ColorGreen, ColorBlue, 50, 22, 20, 2, L"Назад");
}
else if(Clic(vRecord, 25, 17, 10, 2)){//ок
//////////////////////////////////////
////инициализация класса и запуск работы
/////////////////////////////////////
idButton=2;
idButton1=2;
}
}
}
}
}
Sleep(20);
}
if (idButton1==1)//было выбрано "новое расписание"
p= new Shedule(true,buf);
if (idButton1==2)//было выбрано "имеющееся расписаниие"
p= new Shedule(false,buf);
p->print();//запуск словаря
delete p;
return 1;
}
Приложение А.4 - Файл «functions.cpp»
#include "Barfic.h"
#include "header.h"
bool Clic(INPUT_RECORD vRecord,
IN unsigned nX,
IN unsigned nY,
IN unsigned nWidth,
IN unsigned nHeight)
{
if(vRecord.EventType==MOUSE_EVENT
&& vRecord.Event.MouseEvent.dwMousePosition.X>=nX
&& vRecord.Event.MouseEvent.dwMousePosition.X<=(nX+nWidth)
&& vRecord.Event.MouseEvent.dwMousePosition.Y>=nY
&& vRecord.Event.MouseEvent.dwMousePosition.Y<=nY+nHeight
&& vRecord.Event.MouseEvent.dwButtonState==1)
return 1;
else
return 0;
}
Shedule::Shedule(BOOL N,wchar_t* Name ) {
New=N;
int i,j;
char* str;
int len=wcslen(Name);
fName= new char[len+4];
char* s=fName;
Grop= new grop;
memset(Grop,0,sizeof(grop));//все данные равны нулю
for (i=0;i<6;i++)
for (j=0;j<7;j++)
Grop->raspicanie[i][j].okno=true;
/////конвертирование
while (*Name) {
wctomb(s,*Name);
++Name;
++s;
}
fName[len]='.';//дописывание разрешения
fName[len+1]='s';
fName[len+2]='d';
fName[len+3]='h';
fName[len+4]=0;
if(New) {
desc=fopen(fName,"w");
if (desc==NULL)
Error=true;
else
Error=false;
}
else {
desc=fopen(fName,"r");
if (desc==NULL)
Error=true;
else {
Error=false;
Read();///чтение из файла
fclose(desc);
}
}
}
Shedule::~Shedule() {//деструктор, нужен при удалении класса
int i; //для освобождения памяти
int j;
for (i=0;i<6;i++)
if (Grop->NUM[i]!=0)//если в этот день есть хотябы одна пара
for (j=0;j<7;j++)
if(Grop->raspicanie[i][j].okno==false) {//и эта пара не окно
delete[] Grop->raspicanie[i][j].name;//чистим память
delete[] Grop->raspicanie[i][j].room;
delete[] Grop->raspicanie[i][j].teacher;
delete[] Grop->raspicanie[i][j].time;
}
}
int Shedule::print() {
int num=0;//номер дня
int idButton=0;
int idButton1=0;
int idPos=0;//номер курсора
INPUT_RECORD vRecord;
int pos=0;
wchar_t buf[100];
if (Error){
DrawWindow(ColorChlorine,ColorRed , 20, 5, 40, 15);
DrawSingleLineText(ColorBrightWhite, ColorRed, 21, 10, 38, 1, L"Ошибка открытия файла", MiddleCenter);
Sleep(2000);
return 0;
}
//////////////////////////////////////////
////разхметка страницы
/////////////////////////////////////////
while(idButton==0) {
if(idButton1!=7) {
DrawWindow(ColorRed, ColorChlorine, 0, 0, 80, 25);
DrawButton(ColorBrightWhite, ColorGreen, ColorBlue, 3, 22, 12, 2, L"Перейти");
DrawButton(ColorBrightWhite, ColorGreen, ColorBlue, 15, 22, 12, 2, L"Изменить");
DrawButton(ColorBrightWhite, ColorGreen, ColorBlue, 27, 22, 12, 2, L"Очистиь");
DrawButton(ColorBrightWhite, ColorGreen, ColorBlue, 39, 22, 12, 2, L"Удалить");
DrawButton(ColorBrightWhite, ColorGreen, ColorBlue, 51, 22, 12, 2, L"Сохранить");
DrawButton(ColorBrightWhite, ColorGreen, ColorBlue, 63, 22, 12, 2, L"назад");
}
idButton1=0;
Table();
Output(idPos, num);
////////////////////////////////////////////////////////
/// пользовательский интерфейс
///////////////////////////////////////////////////////
while(idButton1==0) {
idButton1=0;
if (InputRecordRead(vRecord))
{
// проверка нажатия на кнопку
if(Clic(vRecord, 3, 22, 10, 0)){//перейти
idButton1=1;
if(!New)
Seach(&num);
}
else if(Clic(vRecord, 15, 22, 10, 0)){//изменить
Edit(num,idPos);
New=false;
idButton1=2;
}
else if(Clic(vRecord, 27, 22, 10, 0)){//очистить
if(New==false) {//копипаст дескриптора+установка всех пар в "окна"
for (int i=0;i<6;i++)
if (Grop->NUM[i]!=0) {
for (int j=0;j<7;j++)
if(Grop->raspicanie[i][j].okno==false) {
delete[] Grop->raspicanie[i][j].name;
delete[] Grop->raspicanie[i][j].room;
delete[] Grop->raspicanie[i][j].teacher;
delete[] Grop->raspicanie[i][j].time;
Grop->raspicanie[i][j].okno=true;
}
Grop->NUM[i]=0;
}
New=true;
}
DrawWindow(ColorChlorine,ColorRed , 20, 5, 40, 15);
DrawSingleLineText(ColorBrightWhite, ColorRed, 21, 10, 38, 1, L"Расписание чисто", MiddleCenter);
Sleep(2000);
idButton1=2;
}
else if(Clic(vRecord, 39, 22, 10, 0)){//удалить
Dell();
idButton1=4;
}
else if(Clic(vRecord, 51, 22, 10, 0)){//сохранить
idButton1=1;
if(!New)
Save();
else {
DrawWindow(ColorChlorine,ColorRed , 20, 5, 40, 15);
DrawSingleLineText(ColorBrightWhite, ColorRed, 21, 10, 38, 1, L"Для начала добавьте хотябы одно занятие", MiddleCenter);
Sleep(2000);
}
}///управление курсором
else if( vRecord.Event.KeyEvent.wVirtualKeyCode==VK_UP && vRecord.Event.KeyEvent.bKeyDown==1){
///реагирует только на процесс нажатия, а не на удержание или отпускание
if(idPos!=0)
idPos--;
idButton1=7;
}
else if( vRecord.Event.KeyEvent.wVirtualKeyCode==VK_DOWN && vRecord.Event.KeyEvent.bKeyDown==1){
if(idPos!=6)
idPos++;
idButton1=7;
}
else if(Clic(vRecord, 63, 22, 10, 0)){// назад
idButton=1;
idButton1=1;
}
}
Sleep(20);
}
}
return 1;
}
void Shedule::Read(){
//в этой программе не учтено возможное баловство с файлом в блокноте
//в блокноте можно только смотреть файл НО НЕ РЕДАКТИРОВАТЬ!!!!!!!!!!!
/////////////////////////
////при считывании строки вконце ставится \n
///это проблема......
///пока просто на место \n записываем 0
//////////////////////
wchar_t str[200];//буффер, думаю название предмета столько строк не занимает)
int len;//длинна строки
int scht;
while (ftell (desc) < filelength(fileno(desc))) {//пока не конец файла
fgetws(str,200,desc);
len=wcslen(str);
str[len-1]=0;
if (!wcscmp(str,L"*Monday")){//сравнение считанной строки с зарезервированными словами
fscanf(desc,"%d",&Grop->NUM[0]);//колличество пар в этот день
zagruzka(Grop->raspicanie[0],Grop->NUM[0]);
}
else if (!wcscmp(str,L"*Tuesday")){
fscanf(desc,"%d",&Grop->NUM[1]);
zagruzka(Grop->raspicanie[1],Grop->NUM[1]);
}
else if (!wcscmp(str,L"*Wednesday")){
fscanf(desc,"%d",&Grop->NUM[2]);
zagruzka(Grop->raspicanie[2],Grop->NUM[2]);
}
else if (!wcscmp(str,L"*Thursday")){
fscanf(desc,"%d",&Grop->NUM[3]);
zagruzka(Grop->raspicanie[3],Grop->NUM[3]);
}
else if (!wcscmp(str,L"*Friday")){
fscanf(desc,"%d",&Grop->NUM[4]);
zagruzka(Grop->raspicanie[4],Grop->NUM[4]);
}
else if (!wcscmp(str,L"*Saturday")){
fscanf(desc,"%d",&Grop->NUM[5]);
zagruzka(Grop->raspicanie[5],Grop->NUM[5]);
}
else if (!wcscmp(str,L"*END"))//данный чанк значает конец файла
break;
};
}
void Shedule::Save()
{
desc=fopen(fName,"w");//сохраняем в тот же файл, что и вводили при открытии/создании расписания
if (desc==NULL) {
DrawWindow(ColorChlorine,ColorRed , 20, 5, 40, 15);
DrawSingleLineText(ColorBrightWhite, ColorRed, 21, 10, 38, 1, L"Ошибка cохранения файла файла", MiddleCenter);
Sleep(2000);
return;
}
else {
fwprintf(desc,L"*BEGIN\n");//чанк начала
int i;
if (Grop->NUM[0]!=0) {//если есть пары в этот день
fwprintf(desc,L"*Monday\n");//день
fwprintf(desc,L"%d\n",Grop->NUM[0]);//колличество пар
for (i=0;i<6;i++)
if(Grop->raspicanie[0][i].okno==false)//если не окно, зыписываем инфу
fwprintf(desc,L"%d\n%s\n%s\n%s\n%s\n",i,Grop->raspicanie[0][i].time,Grop->raspicanie[0][i].room,Grop->raspicanie[0][i].name,Grop->raspicanie[0][i].teacher);
}
if (Grop->NUM[1]!=0) {
fwprintf(desc,L"*Tuesday\n");
fwprintf(desc,L"%d\n",6);
for (i=0;i<6;i++)
if(Grop->raspicanie[1][i].okno==false)
fwprintf(desc,L"%d\n%s\n%s\n%s\n%s\n",i,Grop->raspicanie[1][i].time,Grop->raspicanie[1][i].room,Grop->raspicanie[1][i].name,Grop->raspicanie[1][i].teacher);
}
if (Grop->NUM[2]!=0) {
fwprintf(desc,L"*Wednesday\n");
fwprintf(desc,L"%d\n",6);
for (i=0;i<6;i++)
if(Grop->raspicanie[2][i].okno==false)
fwprintf(desc,L"%d\n%s\n%s\n%s\n%s\n",i,Grop->raspicanie[2][i].time,Grop->raspicanie[2][i].room,Grop->raspicanie[2][i].name,Grop->raspicanie[2][i].teacher);
}
if (Grop->NUM[3]!=0) {
fwprintf(desc,L"*Thursday\n");
fwprintf(desc,L"%d\n",Grop->NUM[3]);
for (i=0;i<6;i++)
if(Grop->raspicanie[3][i].okno==false)
fwprintf(desc,L"%d\n%s\n%s\n%s\n%s\n",i,Grop->raspicanie[3][i].time,Grop->raspicanie[3][i].room,Grop->raspicanie[3][i].name,Grop->raspicanie[3][i].teacher);
}
if (Grop->NUM[4]!=0) {
fwprintf(desc,L"*Friday\n");
fwprintf(desc,L"%d\n",Grop->NUM[4]);
for (i=0;i<6;i++)
if(Grop->raspicanie[4][i].okno==false)
fwprintf(desc,L"%d\n%s\n%s\n%s\n%s\n",i,Grop->raspicanie[4][i].time,Grop->raspicanie[4][i].room,Grop->raspicanie[4][i].name,Grop->raspicanie[4][i].teacher);
}
if (Grop->NUM[5]!=0) {
fwprintf(desc,L"*Saturday\n");
fwprintf(desc,L"%d\n",Grop->NUM[5]);
for (i=0;i<6;i++)
if(Grop->raspicanie[5][i].okno==false)
fwprintf(desc,L"%d\n%s\n%s\n%s\n%s\n",i,Grop->raspicanie[5][i].time,Grop->raspicanie[5][i].room,Grop->raspicanie[5][i].name,Grop->raspicanie[5][i].teacher);
}
fwprintf(desc,L"*END\n");
fclose(desc);
DrawWindow(ColorChlorine,ColorRed , 20, 5, 40, 15);
DrawSingleLineText(ColorBrightWhite, ColorRed, 21, 10, 38, 1, L"Сохранение успешно", MiddleCenter);
Sleep(2000);
}
}
void Shedule::zagruzka(para* ukaz, int i) {//считывание одного дня
int len;
int j;
int num;
wchar_t str[200];
for(j=0;j<i;j++) {
fwscanf(desc,L"%d",&num);//считываем номор пары
ukaz[num].okno=false;//автоматом она не окно
fwscanf(desc,L"%s",&str);
////для экономии памяти
len=wcslen(str);
ukaz[num].time= new wchar_t [len+1];
wcscpy(ukaz[num].time,str);//время
//специально оно не сделано стандартным для каждой пары, в каждом заведении все по разному, включая перерывы
//и школы могут пользоваться
//нет проверки на равильность введения времени, так что вся ответственность на заполнителя)
fwscanf(desc,L"%s",&str);
len=wcslen(str);
ukaz[num].room=new wchar_t [len+1];//кабинет
wcscpy(ukaz[num].room,str);
fwscanf(desc,L"%s",&str);
len=wcslen(str);
ukaz[num].name=new wchar_t [len+1];//название предмета
wcscpy(ukaz[num].name,str);
fwscanf(desc,L"%s",&str);
len=wcslen(str);
ukaz[num].teacher=new wchar_t [len+1];//препод
wcscpy(ukaz[num].teacher,str);
}
}
para* Shedule::Seach(int* num){//поис дня недели
int i;
int idButton=0;
int idButton1=0;
wchar_t buf[100];
INPUT_RECORD vRecord;
DrawWindow(ColorChlorine,ColorRed , 20, 5, 40, 15);
DrawSingleLineText(ColorBrightWhite, ColorRed, 21, 7, 38, 1, L"К какому дню недели перейти?", MiddleCenter);
DrawWindow(ColorRed, ColorBlue, 24, 10, 31, 3);
DrawButton(ColorBrightWhite, ColorGreen, ColorBlue, 35, 17, 10, 2, L"ОК");
DialogTextBox( ColorBrightWhite, ColorBlue, 25, 11, 29, 1, buf, 100);
i = wcslen(buf);//перевод к нижмему регистру
while(i--)
buf[i] = towlower(buf[i]);
while(idButton1==0) {
if (InputRecordRead(vRecord))
{
if(Clic(vRecord, 35, 17, 10, 2)){//ок
if (!wcscmp(buf,L"понедельник")){//сравнение считанной строки с именами дней делелии
*num=0;
return Grop->raspicanie[0];//возвращаем день недели
}
else if (!wcscmp(buf,L"вторник")){//без учета регистра
*num=1;
return Grop->raspicanie[1];
}
else if (!wcscmp(buf,L"среда")){
*num=2;
return Grop->raspicanie[2];
}
else if (!wcscmp(buf,L"четверг")){
*num=3;
return Grop->raspicanie[3];
}
else if (!wcscmp(buf,L"пятница")){
*num=4;
return Grop->raspicanie[4];
}
else if (!wcscmp(buf,L"суббота")){
*num=5;
return Grop->raspicanie[5];
}
else {
DrawWindow(ColorChlorine,ColorRed , 20, 5, 40, 15);
DrawSingleLineText(ColorBrightWhite, ColorRed, 21, 7, 38, 1, L"Совпадений не найдено", MiddleCenter);
Sleep(200);
*num=0;
return Grop->raspicanie[0];
}
}
}
Sleep(20);
}
}
void Shedule::Edit(int num,int idPos){
bool clr[4];//массив, указывпющий на наличия введенных данных в каждую графу
int i;
wchar_t buf[100];
int len;
INPUT_RECORD vRecord;
DrawWindow(ColorChlorine,ColorRed , 20, 3, 40, 20);
DrawSingleLineText(ColorBrightWhite, ColorRed, 22, 5, 18, 1, L"Время", BottomLeft);
DrawSingleLineText(ColorBrightWhite, ColorRed, 22, 9, 18, 1, L"Кабинет", BottomLeft);
DrawSingleLineText(ColorBrightWhite, ColorRed, 22, 13, 18, 1, L"Предмет", BottomLeft);
DrawSingleLineText(ColorBrightWhite, ColorRed, 22, 17, 18, 1, L"Преподаватель", BottomLeft);
if(Grop->raspicanie[num][idPos].okno==false) {
DrawSingleLineText(ColorBrightWhite, ColorBlue, 36, 4, 20, 3, Grop->raspicanie[num][idPos].time, MiddleLeft);
DrawSingleLineText(ColorBrightWhite, ColorBlue, 36, 8, 20, 3, Grop->raspicanie[num][idPos].room, MiddleLeft);
DrawSingleLineText(ColorBrightWhite, ColorBlue, 36, 12, 20, 3, Grop->raspicanie[num][idPos].name, MiddleLeft);
DrawSingleLineText(ColorBrightWhite, ColorBlue, 36, 16, 20, 3, Grop->raspicanie[num][idPos].teacher, MiddleLeft);
for(i=0;i<4;i++)
clr[i]=false;
}
else {
DrawSingleLineText(ColorBrightWhite, ColorBlue, 36, 4, 20, 3, L"пусто", MiddleLeft);
DrawSingleLineText(ColorBrightWhite, ColorBlue, 36, 8, 20, 3, L"пусто", MiddleLeft);
DrawSingleLineText(ColorBrightWhite, ColorBlue, 36, 12, 20, 3,L"пусто", MiddleLeft);
DrawSingleLineText(ColorBrightWhite, ColorBlue, 36, 16, 20, 3, L"пусто", MiddleLeft);
Grop->raspicanie[num][idPos].okno=false;
Grop->NUM[num]++;
for(i=0;i<4;i++)
clr[i]=true;
}
DrawButton(ColorBrightWhite, ColorGreen, ColorBlue, 45, 20, 13, 2, L"ОК");
while(1) {
if (InputRecordRead(vRecord))
{
if(Clic(vRecord, 45, 20, 13, 2)){//ок
break;
}
else if (Clic(vRecord, 36, 4, 20, 3)){//время
DialogTextBox( ColorBrightWhite, ColorBlue, 36, 5, 20, 1, buf, 100);
if(clr[0]==false)
delete[] Grop->raspicanie[num][idPos].time;//удаление рание имеющейся записи
clr[0]=false;
len=wcslen(buf);
if(len!=0){
Grop->raspicanie[num][idPos].time= new wchar_t [len+1];
wcscpy(Grop->raspicanie[num][idPos].time,buf);
}else//если вы не ввели строку- записываем слово EMPTY
{
Grop->raspicanie[num][idPos].time= new wchar_t [6];
wcscpy(Grop->raspicanie[num][idPos].time,L"_");
}
}
else if(Clic(vRecord, 36, 8, 20, 3)){//комната
DialogTextBox( ColorBrightWhite, ColorBlue, 36, 9, 20, 1, buf, 100);
if(clr[1]==false)
delete[] Grop->raspicanie[num][idPos].room;
clr[1]=false;
len=wcslen(buf);
if(len!=0){
Grop->raspicanie[num][idPos].room= new wchar_t [len+1];
wcscpy(Grop->raspicanie[num][idPos].room,buf);
}else
{
Grop->raspicanie[num][idPos].room= new wchar_t [6];
wcscpy(Grop->raspicanie[num][idPos].room,L"_");
}
}
else if(Clic(vRecord, 36, 12, 20, 3)){//предмет
DialogTextBox( ColorBrightWhite, ColorBlue, 36, 13, 20, 1, buf, 100);
if(clr[2]==false)
delete[] Grop->raspicanie[num][idPos].name;
clr[2]=false;
len=wcslen(buf);
if(len!=0){
Grop->raspicanie[num][idPos].name= new wchar_t [len+1];
wcscpy(Grop->raspicanie[num][idPos].name,buf);
}else
{
Grop->raspicanie[num][idPos].name= new wchar_t [6];
wcscpy(Grop->raspicanie[num][idPos].name,L"_");
}
}
else if(Clic(vRecord, 36, 16, 20, 3)){//преподаватель
DialogTextBox( ColorBrightWhite, ColorBlue, 36, 17, 20, 1, buf, 100);
if(clr[3]==false)
delete[] Grop->raspicanie[num][idPos].teacher;
clr[3]=false;
len=wcslen(buf);
if(len!=0){
Grop->raspicanie[num][idPos].teacher= new wchar_t [len+1];
wcscpy(Grop->raspicanie[num][idPos].teacher,buf);
}else
{
Grop->raspicanie[num][idPos].teacher= new wchar_t [6];
wcscpy(Grop->raspicanie[num][idPos].teacher,L"_");
}
}
}
Sleep(20);//чтобы не сжирать все мощности пк
}
if (clr[0]==true && clr[1]==true && clr[2]==true && clr[3]==true) {
Grop->raspicanie[num][idPos].okno=true;
} else {
if(clr[0]==true) {
Grop->raspicanie[num][idPos].time= new wchar_t [6];
wcscpy(Grop->raspicanie[num][idPos].time,L"_");
}
if(clr[1]==true) {
Grop->raspicanie[num][idPos].room= new wchar_t [6];
wcscpy(Grop->raspicanie[num][idPos].room,L"_");
}
if(clr[2]==true) {
Grop->raspicanie[num][idPos].name= new wchar_t [6];
wcscpy(Grop->raspicanie[num][idPos].name,L"_");
}
if(clr[3]==true) {
Grop->raspicanie[num][idPos].teacher= new wchar_t [6];
wcscpy(Grop->raspicanie[num][idPos].teacher,L"_");
}
}
}
void Shedule::Output(unsigned int cursor,int num){
int j;
DrawWindow(ColorChlorine,ColorRed , 2, 2, 76, 3);
switch (num){//выбираем дельнедели
case 0:
DrawSingleLineText(ColorBrightWhite, ColorRed, 3, 3, 74, 1,L"Понедельник" , MiddleCenter);
break;
case 1:
DrawSingleLineText(ColorBrightWhite, ColorRed, 3, 3, 74, 1,L"Вторник" , MiddleCenter);
break;
case 2:
DrawSingleLineText(ColorBrightWhite, ColorRed, 3, 3, 74, 1,L"Среда" , MiddleCenter);
break;
case 3:
DrawSingleLineText(ColorBrightWhite, ColorRed, 3, 3, 74, 1,L"Четверг", MiddleCenter);
break;
case 4:
DrawSingleLineText(ColorBrightWhite, ColorRed, 3, 3, 74, 1,L"Пятница" , MiddleCenter);
break;
case 5:
DrawSingleLineText(ColorBrightWhite, ColorRed, 3, 3, 74, 1,L"Суббота" , MiddleCenter);
break;
}
for (j=0;j<7;j++)//для всех скми строк расписания
if(Grop->raspicanie[num][j].okno==false) {//если не окно- выводим инфу
if (j==cursor) {//если здесь стоит курсор- русуем на красном фоне
DrawSingleLineText(ColorBrightWhite, ColorRed, 4, 6+j*2, 9, 1,Grop->raspicanie[num][j].time , MiddleCenter);
DrawSingleLineText(ColorBrightWhite, ColorRed, 14, 6+j*2, 9, 1, Grop->raspicanie[num][j].room, MiddleCenter);
DrawSingleLineText(ColorBrightWhite, ColorRed, 24, 6+j*2, 29, 1, Grop->raspicanie[num][j].name, MiddleCenter);
DrawSingleLineText(ColorBrightWhite, ColorRed, 54, 6+j*2, 21, 1, Grop->raspicanie[num][j].teacher , MiddleCenter);
}
else {//на зеленом
DrawSingleLineText(ColorBrightWhite, ColorGreen, 4, 6+j*2, 9, 1,Grop->raspicanie[num][j].time , MiddleCenter);
DrawSingleLineText(ColorBrightWhite, ColorGreen, 14, 6+j*2, 9, 1, Grop->raspicanie[num][j].room, MiddleCenter);
DrawSingleLineText(ColorBrightWhite, ColorGreen, 24, 6+j*2, 29, 1, Grop->raspicanie[num][j].name, MiddleCenter);
DrawSingleLineText(ColorBrightWhite, ColorGreen, 54, 6+j*2, 21, 1, Grop->raspicanie[num][j].teacher , MiddleCenter);
}
}
else//если окно
if (j==cursor) {//если здесь стоит курсор- русуем красный фон
DrawSingleLineText(ColorBrightWhite, ColorRed, 4, 6+j*2, 9, 1,L" ", MiddleCenter);
DrawSingleLineText(ColorBrightWhite, ColorRed, 14, 6+j*2, 9, 1, L" ", MiddleCenter);
DrawSingleLineText(ColorBrightWhite, ColorRed, 24, 6+j*2, 29, 1,L" ", MiddleCenter);
DrawSingleLineText(ColorBrightWhite, ColorRed, 54, 6+j*2, 21, 1, L" " , MiddleCenter);
}
else {//если здесь не стоит курсор- русуем зеленый фон
DrawSingleLineText(ColorBrightWhite, ColorGreen, 4, 6+j*2, 9, 1,L" ", MiddleCenter);
DrawSingleLineText(ColorBrightWhite, ColorGreen, 14, 6+j*2, 9, 1, L" ", MiddleCenter);
DrawSingleLineText(ColorBrightWhite, ColorGreen, 24, 6+j*2, 29, 1, L" ", MiddleCenter);
DrawSingleLineText(ColorBrightWhite, ColorGreen, 54, 6+j*2, 21, 1, L" " , MiddleCenter);
}
}
void Table(){//чисто рисуем таблицу из псевдографики, ничего интересного
int i;
CHAR_INFO vPoint;
SetCharInfo(&vPoint, L'\x2554', ColorBrightWhite, ColorGreen);
DrawPoint(&vPoint, 3, 5);
SetCharInfo(&vPoint, L'\x255a', ColorBrightWhite, ColorGreen);
DrawPoint(&vPoint, 3, 19);
SetCharInfo(&vPoint, L'\x2557', ColorBrightWhite, ColorGreen);
DrawPoint(&vPoint, 75,5);
SetCharInfo(&vPoint, L'\x255d', ColorBrightWhite, ColorGreen);
DrawPoint(&vPoint, 75,19);
SetCharInfo(&vPoint, L'\x2560', ColorBrightWhite, ColorGreen);
for (i=0;i<6;i++)
DrawPoint(&vPoint, 3, 7+i*2);
SetCharInfo(&vPoint, L'\x2551', ColorBrightWhite, ColorGreen);
for (i=0;i<7;i++)
DrawPoint(&vPoint, 3, 6+i*2);
for (i=0;i<7;i++)
DrawPoint(&vPoint, 13, 6+i*2);
for (i=0;i<7;i++)
DrawPoint(&vPoint, 23, 6+i*2);
for (i=0;i<7;i++)
DrawPoint(&vPoint, 53, 6+i*2);
for (i=0;i<7;i++)
DrawPoint(&vPoint, 75, 6+i*2);
SetCharInfo(&vPoint, L'\x2563', ColorBrightWhite, ColorGreen);
for (i=0;i<6;i++)
DrawPoint(&vPoint, 75, 7+i*2);
SetCharInfo(&vPoint, L'\x2550', ColorBrightWhite, ColorGreen);
for (i=0;i<8;i++)
DrawHorLine(&vPoint, 4, 5+i*2,9);
for (i=0;i<8;i++)
DrawHorLine(&vPoint, 14, 5+i*2,9);
for (i=0;i<8;i++)
DrawHorLine(&vPoint, 24, 5+i*2,29);
for (i=0;i<8;i++)
DrawHorLine(&vPoint, 54, 5+i*2,21);
SetCharInfo(&vPoint, L'\x256c', ColorBrightWhite, ColorGreen);
for (i=0;i<6;i++)
DrawPoint(&vPoint, 13, 7+i*2);
for (i=0;i<6;i++)
DrawPoint(&vPoint, 23, 7+i*2);
for (i=0;i<6;i++)
DrawPoint(&vPoint, 53, 7+i*2);
SetCharInfo(&vPoint, L'\x2556', ColorBrightWhite, ColorGreen);
DrawPoint(&vPoint, 13, 5);
DrawPoint(&vPoint, 23, 5);
DrawPoint(&vPoint, 53, 5);
SetCharInfo(&vPoint, L'\x2569', ColorBrightWhite, ColorGreen);
DrawPoint(&vPoint, 13, 19);
DrawPoint(&vPoint, 23, 19);
DrawPoint(&vPoint, 53, 19);
}
void Shedule::Dell(){//удаление файла
bool i=remove(fName);//этой функцией
if (i==-1) {
DrawWindow(ColorChlorine,ColorRed , 20, 5, 40, 15);
DrawSingleLineText(ColorBrightWhite, ColorRed, 21, 10, 38, 1, L"Удалить не удалось", MiddleCenter);
Sleep(2000);
}
else{
DrawWindow(ColorChlorine,ColorRed , 20, 5, 40, 15);
DrawSingleLineText(ColorBrightWhite, ColorRed, 21, 10, 38, 1, L"Удаление успешно", MiddleCenter);
Sleep(2000);
}
}
Приложение А.5 - Файл «splash.cpp»
#include "Barfic.h"
#include "header.h"
void Splash()
{
// Рисование окна с рамкой
DrawWindow(ColorRed, ColorChlorine, 0, 0, 80, 25);
DrawWindow(ColorChlorine, ColorRed, 13, 9, 52, 7);
// Рисование однострочного текста в прямоугольнике
DrawSingleLineText(ColorBrightWhite, ColorRed, 14, 10, 50, 1, L" ", MiddleCenter);
DrawSingleLineText(ColorBrightWhite, ColorRed, 14, 11, 50, 1, L"Курсовой проект Мишанихиной Анны", MiddleCenter);
DrawSingleLineText(ColorBrightWhite, ColorRed, 14, 12, 50, 1, L"\"РАСПИСАНЫЕ ЗАНЯТИЙ\"", MiddleCenter);
DrawSingleLineText(ColorBrightWhite, ColorRed, 14, 13, 50, 1, L"Пенза 2013", MiddleCenter);
DrawSingleLineText(ColorBrightWhite, ColorRed, 14, 14, 50, 1, L" ", MiddleCenter);
Sleep(3000);
getch();
}
Приложение В
Результаты работы программы
Приложение B.1 - Информационная заставка
Приложение B.2 - Выход
Приложение B.3 - Меню выбора расписания
Приложение B.4 - Меню сохранить
Приложение B.5 -результаты поиска
Приложение С
Пример файла с расписанием
Размещено на Allbest.ru
Подобные документы
Разработка программы на языке Turbo Pascal, обеспечивающей работу пользователя в диалоговом режиме с возможностью выбора функций с помощью одноуровневого меню вертикального типа. Блок-схема и листинг программы, описание руководства пользователя.
курсовая работа [1,5 M], добавлен 17.03.2014Обоснование необходимости разработки программы для игры "Тетрис". Математическая и графическая части алгоритма. Выбор языка и среды программирования. Отладка текста программы, разработка интерфейса пользователя. Тестирование, руководство пользователя.
курсовая работа [1,5 M], добавлен 17.01.2011Осуществление работы разрабатываемой программы на основе алгоритма, использующего Z-буфер. Аналитическое описание программной реализации. Алгоритмы основных функций программы. Содержание руководства пользователя. Файлы программы, пункты главного меню.
курсовая работа [1,7 M], добавлен 15.04.2015Словесное описание алгоритма программы. Открытие файла процедурой Rewrite, его проверка на наличие ошибок при открытии. Особенности построения диаграммы. Листинг программы, ее тестирование и отладка. Выполнение процедуры CloseFile при закрытии файла.
контрольная работа [17,3 K], добавлен 11.06.2010Преимущества использования электронных каталогов. Структурное и функциональное проектирование компьютерной программы. Особенности процесса загрузка базы данных книг, сохранение базы данных. Вывод каталога книг на экран, меню сортировки программы.
контрольная работа [94,5 K], добавлен 24.12.2017Описание математической модели, таблицы истинности. Разработка программы, реализация защитного программирования. Отладка и тестирование программы, инструкция пользователя. Расчет затрат на разработку и коммерческой эффективности проекта от реализации.
дипломная работа [3,2 M], добавлен 18.06.2012Алгоритм написания программы для поиска музыкальных файлов по электронному каталогу магазина на языке программирования С++. Проектирование консольного меню для обеспечения взаимодействия пользователя с компьютером. Тестирование программы на компиляторе.
курсовая работа [548,9 K], добавлен 25.11.2015Содержательная и формальная (математическая) постановка задачи. Разработка алгоритма решения задачи. Структуры программы и алгоритмы программных модулей, их описание. Решение задачи на конкретном примере. Разработка системы тестов и отладка программы.
курсовая работа [882,1 K], добавлен 24.11.2014Создание программы, работающей с набором данных на внешнем устройстве. Описание программного комплекса. Обзор структуры главной программы. Процедура добавления новых элементов, поиска и создания на экране вертикального меню. Проверка работы программы.
курсовая работа [265,6 K], добавлен 28.08.2017Общая характеристика языка программирования С++, его функции и возможности. Создание базы данных "Учет фототехники" для работников магазина. Этапы разработки алгоритма, спецификация, кодирование, отладка и тестирование программы. Руководство пользователя.
курсовая работа [3,2 M], добавлен 15.07.2012