Разработка тематического чата

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

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 20.12.2017
Размер файла 1,2 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

Разработка тематического чата

Введение

программа информационный скрипт сервер

Тематический чат предназначен для общения пользователей проекта «Celestia в России». Программа использует системное программное обеспечение, необходимое для её функционирования, т.е. операционную систему Windows. Программа написана на языке высокого уровня в среде программирования Borland C++ Builder 6.0.

1. Разработка эскизного и технического проекта программы

1.1 Назначение и область применения

Назначение тематического чата - быстрый способ обмена сообщениями с пользователями проекта «Celestia в России». Так как программный продукт разработан под операционную систему Windows в среде 32х системы, то он может использоваться в Windows 98/ME/NT/2000/XP/7.

Цель создания - облегчение жизни пользователей проекта, путем предоставления им способа быстрого обмена сообщениями, касающимися проекта.

1.2 Технические характеристики

Постановка задачи

Цель работы заключается в создании программного продукта для быстрого обмена сообщениями, обмена опытом и помощи друг другу, пользователями проекта «Celestia в России». Для этого была поставлена задача реализовать следующие функции:

· авторизация пользователей, зарегистрировавших Celestia EP v2.0;

· просмотр списка пользователей онлайн;

· просмотр профилей пользователей онлайн;

· обмен текстовыми сообщениями.

Описание алгоритма

Словесно алгоритм можно описать как следующую последовательность действий:

· Авторизация пользователя;

· Опциональное сохранение данных для автологина;

· Получение истории сообщений и списка пользователей онлайн;

· Ожидание действия;

o Отправка сообщения в чат;

o Просмотр профиля любого из пользователей онлайн;

o Изменение своего профиля;

· Обновление истории сообщений и списка пользователей онлайн.

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

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

Рис. 1. Общая структура алгоритма тематического чата.

Организация входных и выходных данных

Входные данные в программе представляют собой текстовую информацию, которую вводим с клавиатуры (компоменты Memo и Edit) и выбираемую в списке пользователей (компонент TreeView). Выходные данные представляют собой текстовую информацию, представляющую собой текстовые сообщения и профили пользователей (компоненты RichEdit и Edit).

Выбор состава технических и программных средств

Технические и программные средства, требуемые для оптимальной работы программы:

· Процессор Intel Pentium II или выше;

· Оперативной памяти не менее 64 Mb;

· Видео память не менее 128Mb. Ускоритель графики не требуется;

· Объем свободного места на жестком диске не менее 1 Mb;

· Манипулятор типа - мышь;

· ОС Microsoft Windows 95 и выше.

Для работы программы, администратор должен иметь сервер с поддержкой PHP и MySQL. На стороне пользователя устанавливать что-либо дополнительно не требуется.

2. Разработка рабочего проекта

2.1 Разработка базы данных и PHP скриптов для обмена информацией с сервером

Для обеспечения работы программы необходим сервер с поддержкой PHP и MySQL.

База данных MySQL

На сервере создана база данных, структура которой представлена в таблице 1.

Таблица 1. Структура базы данных

Таблица

Поле

Тип поля

Примечание

chat_users

id

int(11)

Порядковый номер пользователя в базе данных

email

varchar(50)

E-Mail пользователя

pass

varchar(50)

Пароль пользователя

nick

varchar(10)

Ник

name

varchar(50)

Имя

surname

varchar(50)

Фамилия

city

varchar(50)

Город

online

int(1)

Статус «в сети»

chat_messages

id

int(11)

Порядковый номер сообщения в базе данных

nick

varchar(10)

Ник отправителя

date_time

varchar(16)

Дата и время

message

varchar(255)

Текст сообщения

PHP скрипты для обмена информацией с сервером

1. dbconfig.php

Данный скрипт содержит параметры соединения с базой данных. Текст скрипта:

<? php

// Данные подключения к БД

$dblocation= «localhost»;

$dbname= «chat»;

$dbuser= «Alexell»;

$dbpasswd= «gTjf6TbgFd3LbnDs»;

?>

2. client.php

Данный скрипт отвечает за авторизацию пользователя и смену его онлайн / оффлайн статуса. Текст скрипта:

<? php

include_once («dbconfig.php»);

/*

act'ы:

login - вход

off - статус оффлайн

*/

$act=»»;

// Вход

if ($_GET['act']== «login» && $_GET['email']!=»» && $_GET['pass']!=»»)

{

global $dblocation,$dbname,$dbuser,$dbpasswd;

$connection=@mysql_connect ($dblocation,$dbuser,$dbpasswd) or die («Ошибка соединения с сервером. Попробуйте повторить позднее.»);

mysql_select_db ($dbname,$connection) or die («Ошибка базы данных.»);

mysql_query («SET NAMES 'utf8';»);

mysql_query («SET CHARACTER SET 'utf8';»);

mysql_query («SET SESSION collation_connection = 'utf8_general_ci';»);

$query = «SELECT email FROM chat_users WHERE email = '».$_GET['email']. «'»;

$result = mysql_query($query) or die («Ошибка при выполнении запроса:».mysql_error());

if ($result)

{

if (mysql_num_rows($result)>0)

{

// Юзер есть. Проверяем пароль

$query = «SELECT email FROM chat_users WHERE email = '».$_GET['email']. «' AND pass = '».$_GET['pass']. «'»;

$result = mysql_query($query) or die («Ошибка при выполнении запроса:».mysql_error());

if ($result)

{

if (mysql_num_rows($result)>0)

{

// Вошел. Статус в сети

$query = «UPDATE chat_users SET online = 1 WHERE email = '».$_GET['email']. «'»;

$result = mysql_query($query) or die («Ошибка при выполнении запроса:».mysql_error());

mysql_close($connection);

echo «Вход успешен.»;

}

else

{

// Не вошел. Проверяем наличие ника и пароля

$query = «SELECT email FROM chat_users WHERE email = '».$_GET['email']. «' AND nick = '' AND pass = «»;

$result = mysql_query($query) or die («Ошибка при выполнении запроса:».mysql_error());

if ($result)

{

if (mysql_num_rows($result)>0)

{

mysql_close($connection);

echo «Вход успешен. Вы зашли впервые.»;

}

else

{

mysql_close($connection);

echo «Неверный пароль!»;

}

}

}

}

}

else

{

mysql_close($connection);

echo «Пользователь не найден.»;

}

}

}

// Статус OFF

if ($_GET['act']== «off» && $_GET['email']!=»» && $_GET['pass']!=»»)

{

global $dblocation,$dbname,$dbuser,$dbpasswd;

$connection=@mysql_connect ($dblocation,$dbuser,$dbpasswd) or die («Ошибка соединения с сервером. Попробуйте повторить позднее.»);

mysql_select_db ($dbname,$connection) or die («Ошибка базы данных.»);

mysql_query («SET NAMES 'utf8';»);

mysql_query («SET CHARACTER SET 'utf8';»);

mysql_query («SET SESSION collation_connection = 'utf8_general_ci';»);

$query = «UPDATE chat_users SET online = 0 WHERE email = '».$_GET['email']. «' AND pass = '».$_GET['pass']. «' LIMIT 1»;

$result = mysql_query($query) or die («Ошибка при выполнении запроса:».mysql_error());

}

?>

3. profile.php

Данный скрипт отвечает за изменение профиля пользователя и за просмотр профилей пользователей онлайн. Текст скрипта:

<? php

include_once («dbconfig.php»);

/*

act'ы:

change: - изменить анкету

get - получить анкету

*/

$act=»»;

// Изменение анкеты

if ($_GET['act']== «change» && $_GET['email']!=»» && $_GET['pass']!=»» && $_GET['nick']!=»»)

{

global $dblocation,$dbname,$dbuser,$dbpasswd;

$connection=@mysql_connect ($dblocation,$dbuser,$dbpasswd) or die («Ошибка соединения с сервером. Попробуйте повторить позднее.»);

mysql_select_db ($dbname,$connection) or die («Ошибка базы данных.»);

mysql_query («SET NAMES 'utf8';»);

mysql_query («SET CHARACTER SET 'utf8';»);

mysql_query («SET SESSION collation_connection = 'utf8_general_ci';»);

$query = «SELECT email FROM chat_users WHERE email = '».$_GET['email']. «'»;

$result = mysql_query($query) or die («Ошибка при выполнении запроса:».mysql_error());

if ($result)

{

if (mysql_num_rows($result)>0)

{

$query = «UPDATE chat_users SET pass = '».$_GET['pass']. «', nick = '».$_GET['nick']. «'»;

if ($_GET['name']!=»»)

{

$query = $query.», name = '».$_GET['name']. «'»;

}

if ($_GET['surname']!=»»)

{

$query = $query.», surname = '».$_GET['surname']. «'»;

}

if ($_GET['city']!=»»)

{

$query = $query.», city = '».$_GET['city']. «'»;

}

$query = $query.», online = 1 WHERE email = '».$_GET['email']. «' LIMIT 1»;

// Проверка на занятость ника

$query2 = «SELECT nick FROM chat_users WHERE nick = '».$_GET['nick']. «' AND email!= '».$_GET['email']. «'»;

$result = mysql_query($query2) or die («Ошибка при выполнении запроса:».mysql_error());

if (mysql_num_rows($result)>0)

{

// Ник занят

mysql_close($connection);

echo «Выбранный вами ник уже занят. Попробуйте другой.»;

}

else

{

$result = mysql_query($query) or die («Ошибка при выполнении запроса:».mysql_error());

mysql_close($connection);

echo «Профиль успешно обновлен!»;

}

}

}

}

// Получение анкеты

if ($_GET['act']== «get»)

{

global $dblocation,$dbname,$dbuser,$dbpasswd;

$connection=@mysql_connect ($dblocation,$dbuser,$dbpasswd) or die («Ошибка соединения с сервером. Попробуйте повторить позднее.»);

mysql_select_db ($dbname,$connection) or die («Ошибка базы данных.»);

mysql_query («SET NAMES 'utf8';»);

mysql_query («SET CHARACTER SET 'utf8';»);

mysql_query («SET SESSION collation_connection = 'utf8_general_ci';»);

if ($_GET['email']!=»»)

{

$query = «SELECT * FROM chat_users WHERE email = '».$_GET['email']. «'»;

$result = mysql_query($query) or die («Ошибка при выполнении запроса:».mysql_error());

if ($result)

{

if (mysql_num_rows($result)>0)

{

while ($row = mysql_fetch_array($result))

{

echo $row['email']. «<br>»;

echo $row['pass']. «<br>»;

echo $row['nick']. «<br>»;

echo $row['name']. «<br>»;

echo $row['surname']. «<br>»;

echo $row['city']. «<br>»;

}

mysql_close($connection);

}

}

}

else

{

$query = «SELECT * FROM chat_users WHERE nick = '».$_GET['nick']. «'»;

$result = mysql_query($query) or die («Ошибка при выполнении запроса:».mysql_error());

if ($result)

{

if (mysql_num_rows($result)>0)

{

while ($row = mysql_fetch_array($result))

{

echo $row['email']. «<br>»;

echo $row['pass']. «<br>»;

echo $row['nick']. «<br>»;

echo $row['name']. «<br>»;

echo $row['surname']. «<br>»;

echo $row['city']. «<br>»;

}

mysql_close($connection);

}

}

}

}

// Получение списка пользователей онлайн

if ($_GET['act']== «getonline»)

{

global $dblocation,$dbname,$dbuser,$dbpasswd;

$connection=@mysql_connect ($dblocation,$dbuser,$dbpasswd) or die («Ошибка соединения с сервером. Попробуйте повторить позднее.»);

mysql_select_db ($dbname,$connection) or die («Ошибка базы данных.»);

mysql_query («SET NAMES 'utf8';»);

mysql_query («SET CHARACTER SET 'utf8';»);

mysql_query («SET SESSION collation_connection = 'utf8_general_ci';»);

$query = «SELECT nick FROM chat_users WHERE online = 1»;

$result = mysql_query($query) or die («Ошибка при выполнении запроса:».mysql_error());

if ($result)

{

if (mysql_num_rows($result)>0)

{

while ($row = mysql_fetch_array($result))

{

echo $row['nick']. «<br>»;

}

mysql_close($connection);

}

}

}

?>

4. chat.php

Данный скрипт отвечает за отправку и получение сообщений. Текст скрипта:

<? php

include_once («dbconfig.php»);

/*

act'ы:

send - отправить сообщение

get - получить сообщения

*/

$act=»»;

// Отправить сообщение

if ($_GET['act']== «send» && $_GET['email']!=»» && $_GET['pass']!=»» && $_GET['nick']!=»» && $_GET['msg']!=»»)

{

global $dblocation,$dbname,$dbuser,$dbpasswd;

$connection=@mysql_connect ($dblocation,$dbuser,$dbpasswd) or die («Ошибка соединения с сервером. Попробуйте повторить позднее.»);

mysql_select_db ($dbname,$connection) or die («Ошибка базы данных.»);

mysql_query («SET NAMES 'utf8';»);

mysql_query («SET CHARACTER SET 'utf8';»);

mysql_query («SET SESSION collation_connection = 'utf8_general_ci';»);

$query = «SELECT email FROM chat_users WHERE email = '».$_GET['email']. «' AND pass = '».$_GET['pass']. «'»;

$result = mysql_query($query) or die («Ошибка при выполнении запроса:».mysql_error());

if ($result)

{

if (mysql_num_rows($result)>0)

{

// Юзер есть. Отправляем сообщение

$dt=date ('d.m.Y H:i');

$query = «INSERT INTO chat_messages (nick, date_time, message) VALUES ('».$_GET['nick']. «', '».$dt. «', '».$_GET['msg']. «')»;

$result = mysql_query($query) or die («Ошибка при выполнении запроса:».mysql_error());

}

}

}

// Получение сообщений

if ($_GET['act']== «get» && $_GET['email']!=»» && $_GET['pass']!=»»)

{

global $dblocation,$dbname,$dbuser,$dbpasswd;

$connection=@mysql_connect ($dblocation,$dbuser,$dbpasswd) or die («Ошибка соединения с сервером. Попробуйте повторить позднее.»);

mysql_select_db ($dbname,$connection) or die («Ошибка базы данных.»);

mysql_query («SET NAMES 'utf8';»);

mysql_query («SET CHARACTER SET 'utf8';»);

mysql_query («SET SESSION collation_connection = 'utf8_general_ci';»);

$query = «SELECT email FROM chat_users WHERE email = '».$_GET['email']. «' AND pass = '».$_GET['pass']. «'»;

$result = mysql_query($query) or die («Ошибка при выполнении запроса:».mysql_error());

if ($result)

{

if (mysql_num_rows($result)>0)

{

// Юзер есть. Получаем сообщения

$query = «SELECT * FROM chat_messages LIMIT 50»;

$result = mysql_query($query) or die («Ошибка при выполнении запроса:».mysql_error());

if (mysql_num_rows($result)>0)

{

while ($row = mysql_fetch_array($result))

{

echo $row['nick']. «<br>»;

echo $row ['date_time']. «<br>»;

echo $row['message']. «<br>»;

echo «<p>»;

}

mysql_close($connection);

}

}

}

}

?>

2.2 Разработка программы

Для обеспечения корректной работы программного продукта в его состав входят 3 формы:

· Форма входа (LoginForm);

· Главная форма (MainForm);

· Форма профиля (ProfileForm).

Форма входа (LoginForm)

При первоначальном открытии форма входа имеет вид, представленный на рис. 2.

Рис. 2 Форма входа

На этом этапе доступны следующие поля (Edit):

· Ваш E-Mail

· Пароль

Чекбокс (CheckBox) «Запомнить пароль», предназначенный для сохранения данных авторизации в файл, для последующего автологина.

Кнопка (Image) «Войти», которая осуществляет авторизацию пользователя в чате.

Главная форма программы (MainForm)

После успешной авторизации появляется главная форма, имеющая вид, представленный на рис. 3.

Рис. 3 Главная форма программы

На этом этапе доступны следующие компоненты:

Надписи (Label):

· ProfTitle - содержит заголовки полей профиля

· ProfData - содержит данные профиля авторизованного пользователя

Поля:

· Поле Inbox (RichEdit), в которое с сервера загружаются последние 50 сообщений чата.

· Поле OutBox (Memo), в которое с клавиатуры вводится сообщение для последующей отправки.

Кнопки (Image):

· Изменить - открывает форму профиля для его редактирования

· Отправить - отправляет сообщение в чат

На форме находится таймер UpdateChat (Timer), который выполняет обновление списка пользователей онлайн и сообщений каждые 10 секунд.

Также на форме присутствует список пользователей онлайн (TreeView), который имеет возможность отображения контекстного меню при нажатии правой кнопкой мыши на определенного пользователя. Пункты контекстного меню изображены на рис. 4.

Рис. 4 Контекстное меню списка пользователей онлайн

При нажатии «Обратиться» (соответствует также двойному клику левой кнопкой мыши по нику пользователя), в поле ввода сообщения (Memo) появляется надпись, представленная на рис. 5.

Рис. 5. Обращение к конкретному пользователю

Форма просмотра / изменения профиля (ProfileForm)

На данной форме находятся следующие компоненты:

· Картинка-логотип прогаммы (Image);

· Надписи ProfLabel (Label), являющиеся заголовками полей профиля;

· Поля (Edit), отображающие информацию профиля

· Чекбокс (CheckBox) показа / скрытия пароля, появляется только при изменении профиля авторизованного профиля.

· Кнопка «Сохранить» (Image), появляется только при изменении профиля авторизованного профиля.

При выборе в контекстном меню пункта «Просмотреть профиль», откроется форма, представленная на рис. 6.

Рис. 6. Форма просмотра профиля выбранного из списка пользователя

При нажатии на главной форме кнопки «Изменить», откроется эта же форма профиля, но уже с информацией авторизованного пользователя и возможностью ее изменения, представленная на рис. 7.

Рис. 7. Форма изменения профиля

2.3 Спецификация программы

Исполняемый файл программы имеет название Celestia_Messenger.exe. Помимо исполнимого файла в проект включены файлы представленные в

Таблица 2. Файлы, входящие в проект

Celestia_Messenger.bpr

Файл проекта

Связывает все файлы приложения

Celestia_Messenger.cpp

Файл модуля

Текст программы

Celestia_Messenger.res

Файл ресурсов

Содержит пиктограммы, версию и т.д.

Unit1.cpp

Программный модуль для MainForm

Определяет функциональность формы

Unit1.dfm

Файл для MainForm

Список свойств компонентов формы

Unit1.h

Файл модуля для MainForm

Текст модулей с MainForm

Unit2.cpp

Программный модуль для ProfileForm

Определяет функциональность формы

Unit2.dfm

Файл для ProfileForm

Список свойств компонентов формы

Unit2.h

Файл модуля для ProfileForm

Текст модулей с ProfileForm

Unit3.cpp

Программный модуль для LoginForm

Определяет функциональность формы

Unit3.dfm

Файл для LoginForm

Список свойств компонентов формы

Unit3.h

Файл модуля для LoginForm

Текст модулей с LoginForm

images\Change1.bmp

Файл рисунка

Изображение кнопки «Изменить»

images\Change2.bmp

Файл рисунка

Изображение кнопки «Изменить» при событии MouseMove

images\Login1.bmp

Файл рисунка

Изображение кнопки «Войти»

images\Login2.bmp

Файл рисунка

Изображение кнопки «Изменить» при событии MouseMove

images\Save1.bmp

Файл рисунка

Изображение кнопки «Сохранить»

images\Save2.bmp

Файл рисунка

Изображение кнопки «Сохранить» при событии MouseMove

images\Send1.bmp

Файл рисунка

Изображение кнопки «Отправить»

images\Send2.bmp

Файл рисунка

Изображение кнопки «Отправить» при событии MouseMove

2.4 Текст программы

// -

#include <vcl.h>

#pragma hdrstop

// Файл, содержащий глобальные переменные

#include «var.cpp»

#include «jpeg.hpp»

#include «httpapp.hpp»

#include «Unit1.h»

#include «Unit2.h»

#include «Unit3.h»

// -

#pragma package (smart_init)

#pragma resource «*.dfm»

TMainForm *MainForm;

TWndMethod OldProcSend;

TWndMethod OldProcProfile;

// -

__fastcall TMainForm:TMainForm (TComponent* Owner)

: TForm(Owner)

{

// Отлавливаем события MouseMove и MouseLeave при помощи WinAPI

OldProcSend=SendButton->WindowProc;

SendButton->WindowProc=NewProcSend;

OldProcProfile=ProfileButton->WindowProc;

ProfileButton->WindowProc=NewProcProfile;

// Добавляем заголовки к профилю

ProfTitle->Caption= «Ваш логин:\n\nВаш ник:\n\nВаше имя:\n\nВаша фамилия:\n\nВаш город:»;

}

// -

// Функция отправки сообщения

void TMainForm: SendMsg()

{

if (MainForm->OutBox->Text!=»»)

{

Temp2=OutBox->Text;

Act= «send»;

// Расшифровываем адрес до PHP файла, отправляем логин, пароль и сообщение

Send=crypt(Chat)+Act+ "&email="+LoginForm->MailEdit->Text+ "&pass="+LoginForm->PassEdit->Text+ "&nick="+Prof->Strings[2]+ "&msg="+Temp2;

Send=StringReplace (Send, «», «%20», TReplaceFlags() << rfReplaceAll);

Temp=UTF8Decode (MainForm->Web->Get (UTF8Encode(Send)));

OutBox->Clear();

OutBox->SetFocus();

// Обновляем чат

LoginForm->GetChat();

}

}

// -

// Отрисовка кнопки Изменить

void __fastcall TMainForm: NewProcProfile (TMessage &Message)

{

if (Message. Msg==CM_MOUSEENTER&&z)

{

z=0;

ProfileButton->Picture->LoadFromFile (ExtractFilePath(Application->ExeName)+«images\\«+ «Change2.bmp»);

}

if (Message. Msg==CM_MOUSELEAVE&&! z)

{

z=1;

ProfileButton->Picture->LoadFromFile (ExtractFilePath(Application->ExeName)+«images\\«+ «Change1.bmp»);

}

OldProcProfile(Message);

}

void __fastcall TMainForm: ProfileButtonMouseMove (TObject *Sender,

TShiftState Shift, int X, int Y)

{

ProfileButton->Picture->LoadFromFile (ExtractFilePath(Application->ExeName)+«images\\«+ «Change2.bmp»);

}

// -

// Отрисовка кнопки Отправить

void __fastcall TMainForm: NewProcSend (TMessage &Message)

{

if (Message. Msg==CM_MOUSEENTER&&z)

{

z=0;

SendButton->Picture->LoadFromFile (ExtractFilePath(Application->ExeName)+«images\\«+ «Send2.bmp»);

}

if (Message. Msg==CM_MOUSELEAVE&&! z)

{

z=1;

SendButton->Picture->LoadFromFile (ExtractFilePath(Application->ExeName)+«images\\«+ «Send1.bmp»);

}

OldProcSend(Message);

}

void __fastcall TMainForm: SendButtonMouseMove (TObject *Sender,

TShiftState Shift, int X, int Y)

{

SendButton->Picture->LoadFromFile (ExtractFilePath(Application->ExeName)+«images\\«+ «Send2.bmp»);

}

// -

// -

void __fastcall TMainForm: FormClose (TObject *Sender, TCloseAction &Action)

{

// При закрытии программы, меняем статус на оффлайн

Act= «off»;

Send=crypt(Client)+Act+ "&email="+LoginForm->MailEdit->Text+ "&pass="+LoginForm->PassEdit->Text;

Temp=UTF8Decode (MainForm->Web->Get (UTF8Encode(Send)));

Application->Terminate();

}

// -

void __fastcall TMainForm: ProfileButtonClick (TObject *Sender)

{

// Получаем свой профиль для изменения

Act= «get»;

Send=crypt(Profile)+Act+ "&email="+LoginForm->MailEdit->Text;

Temp=UTF8Decode (MainForm->Web->Get (UTF8Encode(Send)));

Prof->Clear();

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

{

Temp2=Temp. SubString (0, Temp. Pos («<br>») - 1);

Prof->Add(Temp2);

Temp. Delete (1, Temp. Pos («<br>»)+3);

}

ProfileForm->Caption= «Изменение профиля»;

ProfileForm->Height=358;

ProfileForm->ProfLabel->Caption= «Логин:\n\nПароль:\n\n\n\nНик:\n\nИмя:\n\nФамилия:\n\nГород:»;

ProfileForm->LoginLabel->Visible=true;

ProfileForm->PassEdit->Visible=true;

ProfileForm->ShowPass->Visible=true;

ProfileForm->NickEdit->ReadOnly=false;

ProfileForm->NameEdit->ReadOnly=false;

ProfileForm->SurnameEdit->ReadOnly=false;

ProfileForm->CityEdit->ReadOnly=false;

ProfileForm->SaveButton->Visible=true;

ProfileForm->Avatar->Top=8;

ProfileForm->Prof=Prof;

ProfileForm->loginfirst=false;

ProfileForm->ShowModal();

}

// -

void __fastcall TMainForm:N1Click (TObject *Sender)

{

// Нажимаем Обратиться, в контекстном меню пользователя

int sel;

sel=UsersOnline->Selected->AbsoluteIndex;

OutBox->Text=OutBox->Text+UsersOnline->Items->Item[sel]->Text+»,»;

MainForm->FocusControl(OutBox);

}

// -

void __fastcall TMainForm: UsersOnlineDblClick (TObject *Sender)

{

// Выполняем функцию обращения

N1->Click();

}

// -

void __fastcall TMainForm: UsersOnlineMouseDown (TObject *Sender,

TMouseButton Button, TShiftState Shift, int X, int Y)

{

// Отлавливаем нужный пункт в компоненте TreeView

if (Button==mbRight)

{

TTreeNode* node=UsersOnline->GetNodeAt (X, Y);

if(node)

{

UsersOnline->Selected=node;

}

}

}

// -

void __fastcall TMainForm:N2Click (TObject *Sender)

{

// Получаем для просмотра профиль выбранного пользователя

Act= «get»;

Send=crypt(Profile)+Act+ "&nick="+UsersOnline->Selected->Text;

Temp=UTF8Decode (MainForm->Web->Get (UTF8Encode(Send)));

Prof->Clear();

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

{

Temp2=Temp. SubString (0, Temp. Pos («<br>») - 1);

Prof->Add(Temp2);

Temp. Delete (1, Temp. Pos («<br>»)+3);

}

ProfileForm->Caption=«Профиль пользователя «+Prof->Strings[2];

ProfileForm->Height=314;

ProfileForm->ProfLabel->Caption=»\n\n\n\n\n\nНик:\n\nИмя:\n\nФамилия:\n\nГород:»;

ProfileForm->LoginLabel->Visible=false;

ProfileForm->PassEdit->Visible=false;

ProfileForm->ShowPass->Visible=false;

ProfileForm->NickEdit->ReadOnly=true;

ProfileForm->NameEdit->ReadOnly=true;

ProfileForm->SurnameEdit->ReadOnly=true;

ProfileForm->CityEdit->ReadOnly=true;

ProfileForm->SaveButton->Visible=false;

ProfileForm->Avatar->Top=56;

ProfileForm->Prof=Prof;

ProfileForm->loginfirst=false;

ProfileForm->ShowModal();

}

// -

void __fastcall TMainForm: FormShow (TObject *Sender)

{

UpdateChat->Enabled=true;

OutBox->SetFocus();

AboutLabel->Caption= «Этот чат предназначен для небольших переписок с другими пользователями Celestia EP v2.0. Обновление данных происходит раз в 10 секунд, чтобы не нагружать сервер, на котором находится наш сайт.»;

}

// -

// Обновление чата и списка пользователей онлайн раз в 15 секунд

void __fastcall TMainForm: UpdateChatTimer (TObject *Sender)

{

if (UsersOnline->Selected->Index==-1)

{

LoginForm->GetOnline();

LoginForm->GetChat();

}

else

{

int v;

v=UsersOnline->Selected->Index;

LoginForm->GetOnline();

LoginForm->GetChat();

UsersOnline->Select (UsersOnline->Items->Item[v]);

}

}

// -

void __fastcall TMainForm: OutBoxKeyPress (TObject *Sender, char &Key)

{

// при нажатии Enter в поле отправки сообщения, оно отправится

if (Key==VK_RETURN)

{

Key=0;

SendMsg();

}

}

// -

void __fastcall TMainForm: SendButtonClick (TObject *Sender)

{

// Отправка сообщения

SendMsg();

LoginForm->GetOnline();

}

// -

void __fastcall TMainForm: ForumLinkClick (TObject *Sender)

{

// Зашифрофанная ссылка на форум

ShellExecute (Handle, NULL, crypt («jvvr8-uuu, agngqvkcrpmhgav, pw-dmpwo-tkguvmrka, rjr=d? 3:$v? 5:1»).c_str(), NULL, NULL, SW_SHOWNORMAL);

}

// -

// -

#include <vcl.h>

#pragma hdrstop

// Файл, содержащий глобальные переменные

#include «var.cpp»

#include «Unit2.h»

#include «Unit1.h»

#include «Unit3.h»

// -

#pragma package (smart_init)

#pragma resource «*.dfm»

TProfileForm *ProfileForm;

TWndMethod OldProcSave;

// -

__fastcall TProfileForm:TProfileForm (TComponent* Owner)

: TForm(Owner)

{

// Отлавливаем события MouseMove и MouseLeave при помощи WinAPI

OldProcSave=SaveButton->WindowProc;

SaveButton->WindowProc=NewProcSave;

}

// -

// Отрисовка кнопки Сохранить

void __fastcall TProfileForm: NewProcSave (TMessage &Message)

{

if (Message. Msg==CM_MOUSEENTER&&z)

{

z=0;

SaveButton->Picture->LoadFromFile (ExtractFilePath(Application->ExeName)+«images\\«+ «Save2.bmp»);

}

if (Message. Msg==CM_MOUSELEAVE&&! z)

{

z=1;

SaveButton->Picture->LoadFromFile (ExtractFilePath(Application->ExeName)+«images\\«+ «Save1.bmp»);

}

OldProcSave(Message);

}

void __fastcall TProfileForm: SaveButtonMouseMove (TObject *Sender,

TShiftState Shift, int X, int Y)

{

SaveButton->Picture->LoadFromFile (ExtractFilePath(Application->ExeName)+«images\\«+ «Save2.bmp»);

}

// -

void __fastcall TProfileForm: NickEditChange (TObject *Sender)

{

// Снятие красного цвета после предупреждений

NickEdit->Color=clNone;

}

// -

void __fastcall TProfileForm: NickEditClick (TObject *Sender)

{

// Снятие красного цвета после предупреждений

NickEdit->Color=clNone;

}

// -

void __fastcall TProfileForm: PassEditChange (TObject *Sender)

{

// Проверка длины пароля

PassEdit->Color=clNone;

if (PassEdit->Text. Length()>=4)

SaveButton->Enabled=true;

else

SaveButton->Enabled=false;

}

// -

void __fastcall TProfileForm: PassEditClick (TObject *Sender)

{

// Снятие красного цвета после предупреждений

PassEdit->Color=clNone;

}

// -

void __fastcall TProfileForm: FormShow (TObject *Sender)

{

// Записываем данные профиля в Label

LoginLabel->Caption=Prof->Strings[0];

if (loginfirst==false)

{

// Если пользователь зашел впервые, то кнопка Сохранить будет доступна

PassEdit->Text=Prof->Strings[1];

NickEdit->Text=Prof->Strings[2];

NameEdit->Text=Prof->Strings[3];

SurnameEdit->Text=Prof->Strings[4];

CityEdit->Text=Prof->Strings[5];

}

else

{

SaveButton->Enabled=false;

}

}

// -

void __fastcall TProfileForm: ShowPassClick (TObject *Sender)

{

// Функция показа пароля по желанию

if (ShowPass->Checked)

PassEdit->PasswordChar='\x0';

else

PassEdit->PasswordChar='*';

}

// -

void __fastcall TProfileForm: FormClose (TObject *Sender,

TCloseAction &Action)

{

// Обновляем список пользователей онлайн и сообщения из БД

LoginForm->GetOnline();

LoginForm->GetChat();

}

// -

void __fastcall TProfileForm: PassEditKeyPress (TObject *Sender, char &Key)

{

// Запрет пробела в пароле

if (Key==VK_SPACE)

Key=0;

}

// -

void __fastcall TProfileForm: NickEditKeyPress (TObject *Sender, char &Key)

{

// Запрет пробела в нике

if (Key==VK_SPACE)

Key=0;

}

// -

void __fastcall TProfileForm: NameEditKeyPress (TObject *Sender, char &Key)

{

// Запрет пробела в имени

if (Key==VK_SPACE)

Key=0;

}

// -

void __fastcall TProfileForm: SurnameEditKeyPress (TObject *Sender,

char &Key)

{

// Запрет пробела в фамилии

if (Key==VK_SPACE)

Key=0;

}

// -

void __fastcall TProfileForm: CityEditKeyPress (TObject *Sender, char &Key)

{

// Запрет пробела в городе

if (Key==VK_SPACE)

Key=0;

}

// -

void __fastcall TProfileForm: SaveButtonClick (TObject *Sender)

{

// Сохраняем измененный профиль в БД на сервере

Act= «change»;

if (PassEdit->Text!=»»)

{

Pass=PassEdit->Text;

Send=crypt(Profile)+Act+ "&email="+LoginForm->MailEdit->Text+ "&pass="+PassEdit->Text;

}

else

{

Application->MessageBox («Поле \ «Пароль\» обязательно для заполнения!», «Celestia Messenger», MB_OK | MB_ICONSTOP);

PassEdit->Color=clRed;

return;

}

if (NickEdit->Text!=»»)

{

Nick=NickEdit->Text;

Send=Send+ "&nick="+Nick;

}

else

{

Application->MessageBox («Поле \ «Ник\» обязательно для заполнения!», «Celestia Messenger», MB_OK | MB_ICONSTOP);

NickEdit->Color=clRed;

return;

}

if (NameEdit->Text!=»»)

{

UName=NameEdit->Text;

Send=Send+ "&name="+UName;

}

if (SurnameEdit->Text!=»»)

{

Surname=SurnameEdit->Text;

Send=Send+ "&surname="+Surname;

}

if (CityEdit->Text!=»»)

{

City=CityEdit->Text;

Send=Send+ "&city="+City;

}

Temp=UTF8Decode (MainForm->Web->Get (UTF8Encode(Send)));

if (Temp== «Профиль успешно обновлен!»)

{

// Отображаем измененный профиль

Application->MessageBox (Temp.c_str(), «Celestia Messenger», MB_OK | MB_ICONINFORMATION);

MainForm->Prof=Prof;

MainForm->ProfData->Caption=Prof->Strings[0]+»\n\n»+NickEdit->Text+»\n\n»+NameEdit->Text+»\n\n»+SurnameEdit->Text+»\n\n»+CityEdit->Text;

MainForm->ProfileButton->Visible=true;

MainForm->SendButton->Visible=true;

MainForm->OutBox->Visible=true;

// Сохраняем автологин, если пользователь зашел впервые

if (loginfirst==true)

{

Prof->Clear();

Prof->Add (crypt(LoginForm->MailEdit->Text));

Prof->Add (crypt(PassEdit->Text));

Prof->SaveToFile («Login.dat»);

Prof->Strings[1]=PassEdit->Text;

Prof->Add (NickEdit->Text);

Prof->Add (NameEdit->Text);

Prof->Add (SurnameEdit->Text);

Prof->Add (CityEdit->Text);

LoginForm->PassEdit->Text=PassEdit->Text;

LoginForm->Hide();

MainForm->Show();

}

MainForm->Show();

ProfileForm->Close();

}

else

{

Application->MessageBox (Temp.c_str(), «Celestia Messenger», MB_OK | MB_ICONSTOP);

}

}

// -

// -

#include <vcl.h>

#pragma hdrstop

// Файл, содержащий глобальные переменные

#include «var.cpp»

#include «Unit3.h»

#include «Unit1.h»

#include «Unit2.h»

// -

#pragma package (smart_init)

#pragma resource «*.dfm»

TLoginForm *LoginForm;

TWndMethod OldProcLogin;

TStringList *Auth = new TStringList;

TStringList *Prof = new TStringList;

TStringList *Msg = new TStringList;

// -

__fastcall TLoginForm:TLoginForm (TComponent* Owner)

: TForm(Owner)

{

// Отлавливаем события MouseMove и MouseLeave при помощи WinAPI

OldProcLogin=LoginButton->WindowProc;

LoginButton->WindowProc=NewProcLogin;

}

// Отрисовка кнопки Войти

void __fastcall TLoginForm: NewProcLogin (TMessage &Message)

{

if (Message. Msg==CM_MOUSEENTER&&z)

{

z=0;

LoginButton->Picture->LoadFromFile (ExtractFilePath(Application->ExeName)+«images\\«+ «Login2.bmp»);

}

if (Message. Msg==CM_MOUSELEAVE&&! z)

{

z=1;

LoginButton->Picture->LoadFromFile (ExtractFilePath(Application->ExeName)+«images\\«+ «Login1.bmp»);

}

OldProcLogin(Message);

}

void __fastcall TLoginForm: LoginButtonMouseMove (TObject *Sender,

TShiftState Shift, int X, int Y)

{

LoginButton->Picture->LoadFromFile (ExtractFilePath(Application->ExeName)+«images\\«+ «Login2.bmp»);

}

// -

// Получаем список пользователей онлайн

void TLoginForm: GetOnline()

{

Act= «getonline»;

// Составляем URL, который будет передан серверу.

// Функция crypt (шифратор) подключена в файле var.cpp

Send=crypt(Profile)+Act;

// Отправляем данные PHP файлу, находящемуся на сервере

Temp=UTF8Decode (MainForm->Web->Get(Send));

MainForm->UsersOnline->Items->Clear();

// Обновляем список пользователей онлайн

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

{

Temp2=Temp. SubString (0, Temp. Pos («<br>») - 1);

if (Temp2!=»»)

{

MainForm->UsersOnline->Items->Add (NULL, Temp2);

}

Temp. Delete (1, Temp. Pos («<br>»)+3);

}

}

// Красим текст (ник по условию, остальное белым)

String TLoginForm: ColorText (String Text1, TColor Color, String Text2)

{

MainForm->Inbox->SelAttributes->Color=Color;

MainForm->Inbox->SelText=Text1;

MainForm->Inbox->SelAttributes->Color=clWhite;

MainForm->Inbox->SelText=Text2;

}

// -

// Получаем сообщения из БД на сервере

void TLoginForm: GetChat()

{

Act= «get»;

Send=crypt(Chat)+Act+ "&email="+MailEdit->Text+ "&pass="+PassEdit->Text;

Temp=UTF8Decode (MainForm->Web->Get(Send));

MainForm->Inbox->Clear();

// Парсим полученную от сервера информацию

for (i=0; i<=Temp. Length(); i++)

{

Temp2=Temp. SubString (0, Temp. Pos («<p>») - 1);

if (Temp2!=»»)

{

for (int j=0; j<3; j++)

{

Temp3=Temp2. SubString (1, Temp2. Pos («<br>») - 1);

if (Temp3!=»»)

{

Msg->Add(Temp3);

}

Temp2. Delete (1, Temp2. Pos («<br>»)+3);

}

// Красим свой ник одним цветом, а ники остальных пользователей другим цветом

if (Msg->Strings[0]==Prof->Strings[2])

MainForm->Inbox->Lines->Add (ColorText(Msg->Strings[0]+»:», clHighlight, Msg->Strings[2]));

else

MainForm->Inbox->Lines->Add (ColorText(Msg->Strings[0]+»:», clTeal, Msg->Strings[2]));

Msg->Clear();

Temp. Delete (1, Temp. Pos («<p>»)+2);

}

}

// Устанавливаем каретку в конце последнего сообщения

SendMessage (MainForm->Inbox->Handle, EM_SCROLLCARET, 0, 0);

}

// -

void __fastcall TLoginForm: FormShow (TObject *Sender)

{

// Проверка файла для автологина

if (FileExists («Login.dat»))

{

Auth->LoadFromFile («Login.dat»);

if (Auth->Count==2)

{

// Подготовка автологина

Mail=crypt (Auth->Strings[0]);

Pass=crypt (Auth->Strings[1]);

MailEdit->Text=Mail;

PassEdit->Text=Pass;

AutoLogin->Enabled=true;

}

else

{

Mail=crypt (Auth->Strings[0]);

MailEdit->Text=Mail;

}

}

}

// -

void __fastcall TLoginForm: AutoLoginTimerTimer (TObject *Sender)

{

// Реализуем автологин

Act= «login»;

Send=crypt(Client)+Act+ "&email="+Mail+ "&pass="+Pass;

Temp=UTF8Decode (MainForm->Web->Get(Send));

if (Temp== «Вход успешен.»)

{

// Получаем свой профиль

Act= «get»;

Send=crypt(Profile)+Act+ "&email="+Mail;

Temp=UTF8Decode (MainForm->Web->Get (UTF8Encode(Send)));

Auth->Clear();

// Парсим данные профиля

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

{

Temp2=Temp. SubString (0, Temp. Pos («<br>») - 1);

Prof->Add(Temp2);

Temp. Delete (1, Temp. Pos («<br>»)+3);

}

MainForm->Prof=Prof;

// Записываем данные в Label

MainForm->ProfData->Caption=Prof->Strings[0]+»\n\n»+Prof->Strings[2]+»\n\n»+Prof->Strings[3]+»\n\n»+Prof->Strings[4]+»\n\n»+Prof->Strings[5];

MainForm->ProfileButton->Visible=true;

MainForm->SendButton->Visible=true;

MainForm->OutBox->Visible=true;

// Получаем список пользователей онлайн

GetOnline();

// Получаем сообщения

GetChat();

MainForm->Auth=Auth;

MainForm->Show();

AutoLogin->Enabled=false;

LoginForm->Hide();

}

else

{

// Если в файле автологина содержатся неверные данные

AutoLogin->Enabled=false;

Application->MessageBox (Temp.c_str(), «Celestia Messenger», MB_OK | MB_ICONSTOP);

}

}

// -

void __fastcall TLoginForm: LoginButtonClick (TObject *Sender)

{

// нажатие кнопки Войти

if (MailEdit->Text!=»»)

{

Mail=MailEdit->Text;

if (PassEdit->Text!=»»)

{

Pass=PassEdit->Text;

Act= «login»;

Send=crypt(Client)+Act+ "&email="+Mail+ "&pass="+Pass;

// Посылаем введенные данные PHP файлу для проверки

Temp=UTF8Decode (MainForm->Web->Get (UTF8Encode(Send)));

if (Temp== «Вход успешен.»)

{

// Сохраняем логин в файл для автологина

Auth->Clear();

Auth->Add (crypt(Mail));

Auth->SaveToFile («Login.dat»);

// Если пользователь поставил галочку «Сохранить пароль»,

// то сохраняем пароль в файл для автологина

if (RememberPass->Checked)

{

Auth->Add (crypt(Pass));

Auth->SaveToFile («Login.dat»);

}

// Получаем свой профиль

Act= «get»;

crypt(Send)=Profile+Act+ "&email="+Mail;

Temp=UTF8Decode (MainForm->Web->Get (UTF8Encode(Send)));

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

{

Temp2=Temp. SubString (0, Temp. Pos («<br>») - 1);

Prof->Add(Temp2);

Temp. Delete (1, Temp. Pos («<br>»)+3);

}

MainForm->Prof=Prof;

MainForm->UsersOnline->Items->Add (NULL, Prof->Strings[2]);

MainForm->ProfData->Caption=Prof->Strings[0]+»\n\n»+Prof->Strings[2]+»\n\n»+Prof->Strings[3]+»\n\n»+Prof->Strings[4]+»\n\n»+Prof->Strings[5];

MainForm->ProfileButton->Visible=true;

MainForm->SendButton->Visible=true;

MainForm->OutBox->Visible=true;

GetOnline();

GetChat();

MainForm->Auth=Auth;

MainForm->Show();

}

else

{

// Если пользователь зашел впервые, он должен заполнить профиль и придумать пароль

Auth->Clear();

if (Temp== «Вход успешен. Вы зашли впервые.»)

{

Application->MessageBox («Вы впервые зашли в чат, поэтому сначала заполните ваш профиль.», «Celestia Messenger», MB_OK | MB_ICONINFORMATION);

Prof->Clear();

Prof->Add (MailEdit->Text);

ProfileForm->Prof=Prof;

ProfileForm->loginfirst=true;

ProfileForm->ProfLabel->Caption= «Логин:\n\nПароль:\n\n\n\nНик:\n\nИмя:\n\nФамилия:\n\nГород:»;

MainForm->Auth=Auth;

ProfileForm->ShowModal();

}

else

{

Application->MessageBox (Temp.c_str(), «Celestia Messenger», MB_OK | MB_ICONSTOP);

}

}

}

else

{

// Вход впервые, но при другом условии

Mail=MailEdit->Text;

Act= «login»;

Send=crypt(Client)+Act+ "&email="+Mail+ "&pass=none»;

Temp=UTF8Decode (MainForm->Web->Get (UTF8Encode(Send)));

if (Temp== «Вход успешен. Вы зашли впервые.»)

{

Auth->Clear();

Application->MessageBox («Вы впервые зашли в чат, поэтому сначала заполните ваш профиль.», «Celestia Messenger», MB_OK | MB_ICONINFORMATION);

Prof->Clear();

Prof->Add(Mail);

ProfileForm->Prof=Prof;

ProfileForm->loginfirst=true;

ProfileForm->ProfLabel->Caption= «Логин:\n\nПароль:\n\n\n\nНик:\n\nИмя:\n\nФамилия:\n\nГород:»;

MainForm->Auth=Auth;

ProfileForm->ShowModal();

}

else

{

Application->MessageBox (Temp.c_str(), «Celestia Messenger», MB_OK | MB_ICONSTOP);

}

}

}

else

{

if (PassEdit->Text!=»»)

{

Application->MessageBox («Сначала ведите ваш E-Mail.», «Celestia Messenger», MB_OK | MB_ICONSTOP);

MailEdit->Color=clRed;

}

else

{

Application->MessageBox («Сначала введите E-Mail и пароль.», «Celestia Messenger», MB_OK | MB_ICONSTOP);

MailEdit->Color=clRed;

PassEdit->Color=clRed;

}

}

}

// -

// Снятие красного цвета полей после предупреждения

void __fastcall TLoginForm: MailEditChange (TObject *Sender)

{

MailEdit->Color=clBlack;

}

// -

void __fastcall TLoginForm: MailEditClick (TObject *Sender)

{

MailEdit->Color=clBlack;

}

// -

void __fastcall TLoginForm: PassEditChange (TObject *Sender)

{

PassEdit->Color=clBlack;

}

// -

void __fastcall TLoginForm: PassEditClick (TObject *Sender)

{

PassEdit->Color=clBlack;

}

// -

2.5 Описание программы

Общие сведения

Программа разработана в среде Borland C++ Builder 6.0 Имеет четкий понятный интерфейс. Легка в использовании, проста при освоении. Ей могут пользоваться все без исключения пользователи.

Функциональное назначение

Программа предназначена для авторизации и быстрого обмена текстовыми сообщениями пользователей, зарегистрировавших Celestia EP v2.0.

Используемые технические средства

· Процессор Intel Pentium II или выше;

· Оперативной памяти не менее 64 Mb;

· Видео память не менее 128Mb. Ускоритель графики не требуется;

· Объем свободного места на жестком диске не менее 1 Mb;

· Манипулятор типа - мышь;

· ОС Microsoft Windows 95 и выше.

Для работы программы, администратор должен иметь сервер с поддержкой PHP и MySQL. На стороне пользователя устанавливать что-либо дополнительно не требуется.

Вызов и загрузка

Программа запускается при нажатии двойным щелчком левой кнопки мыши по файлу Celestia_Messenger.exe в проводнике Windows, либо по ярлыку программы на рабочем столе.

2.6 Тестирование программы

В процессе тестирования программы ставилась цель проверить работоспособность программы, отсутствие логических ошибок, возникновение ошибок.

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

Было проведено комплексное тестирование программного продукта, для этого был разработан контрольный пример, состоящий из следующих пунктов:

· Для запуска программы необходимо выбрать файл с названием Celestia_Messenger.exe двойным щелчком левой кнопки мыши его запустить;

· В открывшемся окне вводим тестовый логин example@example.ru, затем нажимаем кнопку «Войти» (для пользователей, зарегистрировавших Celestia EP v2.0 при первом входе необходима дорегистрация в чате). Рис. 8.

Рис. 8. Авторизация пользователя

· После нажатия кнопки «ОК» в появившемся сообщении (Рис. 9), появится форма профиля, где необходимо заполнить все поля своими данными (Рис. 10).

Рис. 9. Уведомление о необходимости дорегистрации

Рис. 10 Форма профиля

· После сохранения профиля открывается главная форма, рис. 11.

Рис. 11 Главная форма программы

· Изменим некоторые поля своего профиля, рис. 12.

Рис. 12. Форма профиля

· После сохранения, на главной форме мы увидим изменившийся профиль, рис. 13.

Рис. 13. Главная форма программы

· Просмотрим профиль пользователя Sun_Person, рис. 14.

Рис. 14. Форма профиля при просмотре профиля другого пользователя

· На главной форме двойным кликом левой кнопкой мыши по пользователю Sun_Person, выполним обращение к нему, рис. 15.

Рис. 15. Главная форма программы. Обращение к пользователю

· Напишем и отправим сообщение в чат, результат отправки на рис. 16.

Рис. 16. Главная форма программы после отправки сообщения

В результате выполнения контрольного примера программа ошибок не выявила.

3. Оценка программы

Затраты на создание программного продукта складываются из расходов по оплате труда разработчика программы и расходов по оплате машинного времени при отладке программы:

ЗСПП= ЗЗПСПП+ ЗМЕСПП+ ЗОБЩ,

где

ЗСПП - затраты на создание программного продукта;

ЗЗПСПП - затраты на оплату труда разработчика программы;

ЗМЕСПП - затраты на оплату машинного времени;

ЗОБЩ - общие затраты.

Таким образом, получим:

ЗСПП= 389,8 +1,6+2062,5+3 238,6 =5 692,5 руб.

Расходы на оплату труда разработчика программы.

Расходы на оплату труда разработчика программы определяются путем умножения трудоёмкости создания программного продукта на среднюю часовую оплату программиста (с учётом коэффициента отчислений на социальные нужды):

ЗЗПСПП = tчас.

Таким образом, получим:

ЗЗПСПП = 38,98*10=389,8 руб.

Расчёт трудоёмкости создания программного продукта.

Трудоёмкость разработки программного продукта можно определить следующим образом:

t = tИ+ tА+ tБ+ tП+ tД+ tОТ

где

tИ - затраты труда на подготовку описания задачи;

tА - затраты труда на разработку алгоритма решения задачи;

tБ - затраты труда на разработку структурной схемы алгоритма решения задачи;

tП - затраты труда на составление программы по готовой структурной схеме;

tД - затраты труда на подготовку документации задачи;

tОТ - затраты труда на отладку программы на ЭВМ при комплексной отладке задачи;

Составляющие затрат, в свою очередь можно вычислить через условное число операторов Q. Например, в нашем случае число операторов в отлаженной программе Q = 432.

Таким образом, получим:

t = 8,64+2,7+2,7+2,7+2,52+8,1=27,36 чел./час.

Расчёт затрат труда на подготовку описания

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

tИ = Q*B / (250…350*K),

tАОТ - затраты труда на отладку программы на ЭВМ при автономной отладке одной задачи;

B - коэффициент увеличения затрат труда вследствие недостаточного описания задачи, уточнений и некоторой не доработки, 1, 2…5;

K - коэффициент квалификации разработчика, для работающих до 2 лет, K = 0, 8;

В связи с тем, что при изучении описания данной задачи потребовалось много уточнений и доработок в описании коэффициент B принимаем равным 4.

Таким образом, получим:

tИ = 432*4/(250*0,8)=8,64 чел./час.

Расчёт затрат труда на разработку алгоритма.

Затраты труда на разработку алгоритма решения задачи:

tА = 432/(250*0,8)=2,16 чел./час.

Расчёт затрат труда на разработку структурной схемы.

Затраты труда на разработку структурной схемы алгоритма решения задачи вычислим следующим образом:

tБ =432/(200*0,8)=2,7 чел./час.

Расчёт затрат труда на составление программы.

Затраты труда на составление программы по готовой структурной схеме:

tП = 432/(200*0,8)=2,7 чел./час.

Расчёт затрат труда на отладку программы.

Затраты труда на отладку программы на ЭВМ при комплексной отладке задачи:

tАОТ = 432/(100*0,8)=5,4 чел./час.

Отсюда

tОТ = 1,5*36,84 = 1,5*5,4 = 8,1 чел./час.

Расчёт затрат труда на подготовку документации.

Затраты труда на подготовку документации по задаче определяются:

tД = tДP+ tДO,

где

tДP - затраты труда на подготовку материалов в рукописи;

tДО - затраты на редактирование, печать и оформление документации.

Таким образом, получим:

tД = 1,08+1,44=2,52 чел./час.

tДР = 432 / (500*0,8) =1,08 чел./час;

tДО = 0,75*1,08 = 0,81 чел./час.

Итак, общую трудоёмкость программного продукта можем рассчитать:

t = 8,64+2,7+2,7+2,7+2,52+8,1=27,36 чел./час.

Расчёт средней зарплаты программиста.

Средняя зарплата программиста в современных рыночных условиях может варьироваться в широком диапазоне. Для примера расчёта возьмём среднюю часовую оплату труда, которая Tчас =составляет 10 руб. /час, что составляет 1660 руб. /мес. при 8-ми часовом рабочем дне и 5-ти дневной рабочей неделе. Затраты на оплату труда программиста состоят из зарплаты программиста и отчислений на социальные нужды. Отчисления на социальные нужды включают в себя: пенсионный фонд, медстрах, соцстрах, фонд занятости, сбор на образование.

Итого отчисления на социальные нужды составляют 34%. Отсюда затраты на оплату труда программиста составляют:

ЗЗПСПП = 27,36*10*1,34 = 366,624 руб.

Затраты на оплату машинного времени.

Затраты на оплату машинного времени при отладке программы определяются путём умножения фактического времени отладки программы на цену машино-часа арендного времени:

ЗМЕСПП = Счас * tЭВМ.

Таким образом, получим:

ЗМЕСПП = 0,18*8,91=1,6 руб.

Расчёт фактического времени отладки.

Фактическое время отладки вычислим по формуле:

tЭВМ = tП+ tДО+ tОТ;

Таким образом, получим:

tЭВМ = 2,7+0,81+5,4=8,91 часа.

Расчёт цены машино-часа.

Цену машино-часа найдём по формуле:

Счас = ЗЭВМ / ТЭВМ

Таким образом, получим:

Счас = 325,87/1784=0,18 руб.

Расчёт годового фонда времени работы ПЭВМ IBM PC AT.


Подобные документы

  • Разработка эскизного и технического проектов программы, ее назначение и область применения, технические характеристики. Организация входных и выходных данных, выбор состава технических и программных средств. Текст программы, ее описание и тестирование.

    курсовая работа [1,3 M], добавлен 15.11.2009

  • Разработка эскизного и технического проекта программы игры "Собери картинку". Назначение и область применения, основные технические характеристики. Разработка рабочего проекта, разработка и спецификация программы игры. Описание и тестирование программы.

    курсовая работа [22,6 K], добавлен 10.06.2010

  • Разработка эскизного и технического проектов программы, ее назначение и область применения, описание алгоритма, организация входных и выходных данных. Выбор состава технических и программных средств, разработка рабочего проекта, спецификация программы.

    курсовая работа [700,6 K], добавлен 26.01.2010

  • Обоснование необходимости разработки виртуального магазина. Описание форм программы. Требования к аппаратному и программному обеспечению. Тестирование и выявление ошибок. Область применения программы. Расчет экономического эффекта проекта. Охрана труда.

    дипломная работа [1,7 M], добавлен 20.12.2012

  • Разработка эскизного и технического проектов программы, ее назначение и область применения, описание алгоритма, организация входных и выходных данных. Выбор состава технических и программных средств, разработка рабочего проекта, спецификация программы.

    курсовая работа [159,8 K], добавлен 26.01.2010

  • Разработка эскизного и технического проектов компьютерной игры "Скачки". Назначение и область применения программы. Выбор состава технических и программных средств. Составление текста программы, ее спецификация, тестирование и условия выполнения.

    курсовая работа [681,4 K], добавлен 18.10.2014

  • Клиент-серверная архитектура проектируемой программы по проверке знаний студентов, структура базы данных. Разработка ее программно-интерфейсной реализации в среде Delphi. Установка и запуск приложения, информация для пользователя, листинг программы.

    дипломная работа [2,1 M], добавлен 20.06.2011

  • Назначение и область применения, технические характеристики, постановка задачи, описание алгоритма и организация входных и выходных данных для программы. Разработка, описание логической структуры, используемые технические средства и условия выполнения.

    курсовая работа [969,3 K], добавлен 26.03.2009

  • Общая характеристика организации Муниципального автономного учреждение "Хоккейная команда Кузбасс". Разработка программы регистрации в системе программирования Delphi. Тестирование разработанной программы. Руководства пользователю и администратору.

    дипломная работа [1,3 M], добавлен 07.06.2012

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

    дипломная работа [1,2 M], добавлен 03.07.2015

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.