МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ “ЛЬВІВСЬКА ПОЛІТЕХНІКА”
/
Кафедра ЕОМ
Звіт
З лабораторних роботи №1, 2, 3, 4
з дисципліни: «Інженерія програмного забезпечення ч.2»
на тему: «Створення проекту в Visual Studio 2010 та командного проекту в TFS. Розробка архітектури програмної системи та створення діаграм»
Виконали:
Прийняв: Цигилик Л,О
Львів
2013р.
Індивідуальне завдання:
Створення клієнт-серверної системи згідно теми
“ Програмне забезпечення обліку,видачі та нарахування стипендії”.
Мета:
Розробити ПЗ згідно обраної теми для коректної роботи системи,
розробити діаграми, які описуватимуть систему та комплекс тестів.
Розподіл повноважень:
Хомік Володимир— розробник серверної частини
Михалевич Максим — розробник клієнтної частини
Лабораторна робота №1
Тема: Створення проекту в Visual Studio 2010 та командного проекту в TFS
/
Рис .1 головне вікно створеного проекта в TFS
На даному рисунку (рис.1) зображено головне вікно проекту в TFS, з якого ми здійсьнюєм навігацію по функціях керування проектом (перегляд\додавання\видалення учасників, перегляд\відміна змін проекту, задання завдань учасникам і т.д.)
/
Рис.2 Відображення файлової структури проекту
На рис.2 відображено файловий вміст проекту. За допомогою даного вікна ми можем переглянути «історію» будь-якого файла (дату створення\змінення, яким учасником був створений\змінений певний файл…), здійснити настройки безпеки, а також скачати копію на жорсткий диск.
/
Рис.3 Відображення змін проекту
В даному вікні (рис.3) ми можем здійснювати перегляд змін проекту, дату коли відбулась зміна, коментар та яким учасником було здійснено відповідні зміни.
Лабораторна Робота №2
Тема:Розробка програмної системи та створення діаграм
/
Рис 1 . Діаграма Випадків
Створення UML – діаграм з поясненням.Перша діаграма – це діаграма випадків.
Діаграма на рис 1. Включає в себе 2 актори (Бухгалтерія-банк(север), та студент (клієнт)), та 8 дій.(Увійти в систему, рейтинг студентів,нарахування стипендії,перевірка балансу,знаття коштів,додавання отримувача,видалення отримувача,вихід з системи).
Бухгалтерія при умові якщо студент витягнув на стипендію , нараховує гроші. Після нарахування студент має можливість перевірити баланс ,якщо кошти прийшли , студент може зняти гроші , і вийти із системи.
Лабораторна робота №3
Розробка коду програми на мові C# та підтримки в TeamFoundationServer
Дане програмнезабезпеченнярозроблене на мовіпрограмуванняC# в середовищіVisualStudio 2010. Входірозробки, за допомогоюMicrosoftSQLServer 2008буларозробленабаза даних.
/
В данійформі ми заносимо в нашу базу студентів, які отримують стипендію з тієї чи іншої групи.
/
Заносимо в базу даних інститути, до яких входять групи, які в наявності мають студентів, та додаєм дату отримання стипендії, і її розмір.
/
Форма для входу адміністратора, який виконує основні дії над визначенням хто отримує стипендію в якому розмірі.
/
Наша отримана база даних.
/
Вікно роботи сервера, показує які дії виконуються адміністратором
/
Форма для входу адміністратора. Загальний вид програми Сервера
/
Ввійшли в середовище. Вікно виконання дій сервера показує, що було виконано. Загальний вигляд вікна Сервера
/
Вказали Інститут, Групу, вибрали студентів, які будуть отримувати стипендію, та зазначили дату видач та розмір стипендії.
/
На етапі розробки програми Сервера. Конструктор форми
/
Вікно сервера показує виконані адміністратором дії в середовищі адміністрування.
/
Вибір групи в якій будем проводити визначення та розмір нарахування стипендії
/
Список студентів які будуть отримувати стипендію
/
Amout – розмір стипендії. Setnew – задали новий розмір стипендії
/
Визначення дати нарахування стипендії.
/
Зміна дати нарахування стипендії
/
Параметри таблиці Студенти.
/
Параметри таблиці входу.
/
Параметри таблиці Інститути.
Висновок:В результаті виконання даного проекту(лабораторних робіт). Ми розробила та створили концептуальну модель середовища Обліку та Нарахування стипендії для студентів. В ході роботи, була розроблена форма, для адміністрування, за допомогою цієї форми ми маємо можливість визначати яким студентам буде нарахована стипендія, в якому розмірі, та в який час(дата). Було створено базу даних студентів, які входять до тих чи інших груп, того чи іншого інституту. В результаті виконання ми отримали досить просту форму адміністрування, та управління щодо нарахування та виплати стипендії, це забезпечує нам надто простий і зрозумілий інтерфейс програми.
Додаток
Лістинг програми Сервера
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
using System.IO;
using System.Net;
usingSystem.Net.Sockets;
usingSystem.Threading;
usingSystem.Data;
usingSystem.Data.SqlClient;
usingSystem.Data.SqlServerCe;
namespaceExampleTcpListener_Console
{
classExampleTcpListener
{
staticStringTranscent;
staticvoid Main(string[] args)
{
TcpListener server = null;
//Connection to database
try
{
intMaxThreadsCount = Environment.ProcessorCount * 4;
Console.WriteLine(MaxThreadsCount.ToString());
// Установим максимальное количество рабочих потоков
ThreadPool.SetMaxThreads(MaxThreadsCount, MaxThreadsCount);
// Установим минимальное количество рабочих потоков
ThreadPool.SetMinThreads(2, 2);
// Устанавливаем порт для TcpListener = 9595.
Int32 port = 9595;
IPAddresslocalAddr = IPAddress.Parse("127.0.0.1");
int counter = 0;
server = newTcpListener(localAddr, port);
// Запускаем TcpListener и начинаем слушать клиентов.
server.Start();
// Принимаем клиентов в бесконечном цикле.
while (true)
{
Console.WriteLine(counter.ToString()+"\tWaiting for a connection... ");
// Припоявленииклиентадобавляемвочередьпотоковегообработку.
ThreadPool.QueueUserWorkItem(ObrabotkaZaprosa, server.AcceptTcpClient());
counter++;
// Выводим информацию о подключении.
}
}
catch (SocketException e)
{
//В случае ошибки, выводим что это за ошибка.
Console.WriteLine("SocketException: {0}", e);
}
finally
{
// ОстанавливаемTcpListener.
server.Stop();
}
Console.WriteLine("\nHit enter to continue...");
Console.Read();
}
staticvoidObrabotkaZaprosa(objectclient_obj)
{
AuthA_obj = newAuth();
MydateD_obj = newMydate();
AmountM_obj = newAmount();
mListL_obj = newmList();
// Буфер для принимаемых данных.*
Byte[] bytes = newByte[256];
//Можно раскомментироватьThread.Sleep(1000);
//Запустить несколько клиентов
//и наглядно увидеть как они обрабатываются в очереди.
//Thread.Sleep(1000);
TcpClient client = client_objasTcpClient;
Transcent = null;
// Получаем информацию от клиента
NetworkStream stream = client.GetStream();
DataTableBufferTable = newDataTable();
int i;
// Принимаем данные от клиента в цикле пока не дойдём до конца.
while ((i = stream.Read(bytes, 0, bytes.Length)) != 0)
{
// Преобразуем данные в ASCII string.
Transcent = System.Text.Encoding.ASCII.GetString(bytes, 0, i);
String[] bar = Transcent.Split(newchar[] { '|' });
if (bar[0]=="ID0")
{
Console.WriteLine("ID0\tAuthorization request");
Transcent = null;
Transcent ="ID0|"+ A_obj.m_check(bar[1],bar[2]).ToString();
}
if (bar[0]=="ID1")
{
Console.WriteLine("ID1\tLogin/Password modification");
Transcent = null;
A_obj.Set_new_LP(bar[1], bar[2]);
Transcent = "ID1|";
}
if (bar[0]=="ID2")
{
Console.WriteLine("ID2\tDate request");
Transcent = null;
Transcent = "ID2|" + D_obj.Get_ac_d();
}
if (bar[0]=="ID3")
{
Console.WriteLine("ID3\t Set new Date");
D_obj.Set_ac_d(Int32.Parse(bar[1]));
Transcent = "ID3|";
}
if (bar[0]=="ID4")
{
Console.WriteLine("ID4\tAmount Request");
Transcent = "ID4|"+ M_obj.Get_amount_val().ToString();
}
if (bar[0]=="ID5")
{
Console.WriteLine("ID5\tSet new amount");
M_obj.Set_amount_val(bar[1]);
Transcent = "ID5";
}
if (bar[0]=="ID6")
{
Console.WriteLine("ID6\tRequest for institutes list");
L_obj.mGet_institutes();
Transcent = null;
Transcent = "ID6";
foreach (stringstinL_obj.institute)
{
if(st!=null) Transcent += "|" + st;
}
}
if (bar[0]=="ID7")
{
Console.WriteLine("ID7\tRequest for groups (having inst)");
Transcent = null;
Transcent = "ID7";
L_obj.mGet_group(bar[1]);
foreach (stringstinL_obj.group)
{
if (st != null) Transcent += "|" + st;
}
}
if (bar[0]=="ID8")
{
Console.WriteLine("ID8\t Request for List");
Transcent = null;
Transcent = "ID8";
L_obj.mList_Open(bar[1], bar[2]);
foreach (stringstinL_obj.list_all)
{
if (st != null) Transcent += "|" + st;
}
}
if(bar[0]=="ID9")
{
Console.WriteLine("ID9\t Conitnue...");
Transcent = null;
Transcent = "ID9";
L_obj.mList_Open(bar[1],bar[2]);
Int32 j = 0;
for (; j <L_obj.list_all.Length - 1;j++)
{
if (L_obj.list_g[j] != null)
{
Transcent += "|" + L_obj.list_g[j].ToString();
}
else j = L_obj.list_g.Length + 1;
}
}
if (bar[0]=="ST1")
{
Console.WriteLine("ST1\tUpdating list text");
L_obj.mList_Modification(bar);
}
//if (bar[0]=="ST2")
//{
// Console.WriteLine("ST2\tUpdating list bool");
// L_obj.mList_Modification1(bar);
//}
// Преобразуем полученную строку в массив Байт.
byte[] msg = System.Text.Encoding.ASCII.GetBytes(Transcent);
// Отправляем данные обратно клиенту (ответ).
stream.Write(msg, 0, msg.Length);
}
// Закрываемсоединение.
client.Close();
}
classAuth
{
string password;
string login;
DataTable table;
myDatabaseStudentDB = newmyDatabase();
publicboolm_check(string l, string p)
{
StudentDB.Open();
table = StudentDB.SendSqlCommand("SELECT * FROM LogInfo WHERE (Login='"+l+"') AND (Password = '"+p+"')");
password = p;
login = l;
if( table.Rows.Count>0) returntrue;
StudentDB.Close();
returnfalse;
}
publicvoidSet_new_LP(string l, string p)
{
StudentDB.Open();
StudentDB.ModifyDatabase("UPDATE LogInfo SET Password="+"'"+p+"' WHERE Login ='"+l+"'");
StudentDB.Close();
}
}
classMydate
{
publicintac_d=0;
myDatabaseStudentDB = newmyDatabase();
publicintGet_ac_d()
{
string buffer= StudentDB.SendSqlCommandToString("SELECT Date FROM INSTITUTES");
ac_d = Int32.Parse(buffer);
StudentDB.Close();
returnac_d;
}
publicvoidSet_ac_d(intn_d)
{
StudentDB.Open();
ac_d = Int32.Parse(StudentDB.SendSqlCommandToString("SELECT Date FROM INSTITUTES"));
StudentDB.ModifyDatabase("UPDATE INSTITUTES SET Date= '" + n_d.ToString() + "' WHERE Date ='"+ac_d.ToString()+"'");
StudentDB.Close();
// to DB
}
}
classAmount
{
publicfloatm_val = 650.38F;
myDatabaseStudentDB = newmyDatabase();
publicfloatGet_amount_val()
{
m_val = Convert.ToSingle(StudentDB.SendSqlCommandToString("SELECT Sum FROM INSTITUTES"));
// sent request for value
returnm_val;
}
publicvoidSet_amount_val(stringn_val)
{
stringbuf = StudentDB.SendSqlCommandToString("SELECT Sum FROM INSTITUTES");
StudentDB.ModifyDatabase("UPDATE INSTITUTES SET Sum = '"+n_val+"'WHERE Sum='"+buf.ToString()+"'");
// sent new val to server
}
}
classmList
{
publicstringstr_INST;
publicstringstr_GR;
publicstring[] institute;
publicstring[] group;
publicstring[] list_all;
publicbool[] list_g;
myDatabaseStudentDB = newmyDatabase();
publicvoidmList_Open(stringstr, string str1)
{
str_INST = str;
str_GR = str1;
//sent request to DB for list using str_INST and str_GR
list_all = StudentDB.SendSqlStringArray("SELECT Name FROM Student WHERE Faculty='"+str1+"'"); //just for example
list_g = StudentDB.SendSqlBoolArray("SELECT MoneyForBeer FROM Student WHERE Faculty='" + str1 + "'"); // just for example
}
publicvoidmList_Modification(string[] arr)
{
//str_INST = arr[1];
//str_GR = arr[2];
Int32 x = Convert.ToInt32(arr[1]);
Int32 y = x + 2;
list_all = newstring[x];
for (Int32 j = 2; j < y; j++)
{
list_all[j - 2] = arr[j];
}
list_g = newbool[x];
for (Int32 j=0; j < x; j++)
{
//list_g[j] = Convert.ToBoolean(arr[y+j]);
StudentDB.ModifyDatabase("UPDATE Student SET MoneyForBeer = '"+arr[y+j]+"' WHERE Name= '"+list_all[j]+"'");
}
// sending list_g to db
}
publicstring[] mGet_institutes()
{
//sent request for institutes
//institute = response; //get list of institutes
institute = StudentDB.SendSqlStringArray("SELECT DISTINCT institutes FROM INSTITUTES");
return institute;
}
publicvoidmGet_group(stringstr)
{
str_INST = str;
//sent request for list of groups with str_INST
group = StudentDB.SendSqlStringArray("SELECT Faculty FROM INSTITUTES WHERE institutes='" + str + "'"); // this just for example
}
}
classmyDatabase
{
conststringDatabasePath = @"C:\Users\aaa\Desktop\Стипендія\TcpServer\TcpServer\Student.sdf";
SqlCeConnection connection = newSqlCeConnection(@"Data Source=|DataDirectory|"+DatabasePath);
bool opened=false;
publicmyDatabase()
{
this.Open();
opened = true;
}
~myDatabase(){
this.Close();
}
///<summary>
/// Function to generate simple Sql requests
///</summary>
///<param name="mySqlCommand"></param>
///<returns></returns>
publicDataTableSendSqlCommand(stringmySqlCommand)
{
if (opened)
{
try
{
DataTable table = newDataTable();
SqlCeCommand command = newSqlCeCommand(mySqlCommand, connection);
SqlCeDataReader reader = command.ExecuteReader();
table.Load(reader);
return table;
}
catch
{
returnnewDataTable();
}
}
returnnewDataTable();
}
publicstringSendSqlCommandToString(stringmySqlCommand)
{
if (opened)
{
try
{
SqlCeCommand command = newSqlCeCommand(mySqlCommand, connection);
SqlCeDataReader reader = command.ExecuteReader();
reader.Read();
returnreader.GetString(0);
}
catch
{
return"";
}
}
return"";
}
publicintSendSqlCommandToInt(stringmySqlCommand)
{
if (opened)
{
try
{
SqlCeCommand command = newSqlCeCommand(mySqlCommand, connection);
SqlCeDataReader reader = command.ExecuteReader();
reader.Read();
return reader.GetInt32(0);
}
catch
{
return 0;
}
}
return 0;
}
publicstring[] SendSqlStringArray(stringmySqlCommand)
{
if (opened)
{
try
{
string[] myArray = newstring[15];
inti = 0;
SqlCeCommand command = newSqlCeCommand(mySqlCommand, connection);
SqlCeDataReader reader = command.ExecuteReader();
while (reader.Read())
{
myArray[i] = reader.GetString(0);
i++;
}
returnmyArray;
}
catch
{
returnnull;
}
}
returnnull;
}
publicbool[] SendSqlBoolArray(stringmySqlCommand)
{
if (opened)
{
try
{
bool[] myArray = newbool[15];
inti = 0;
SqlCeCommand command = newSqlCeCommand(mySqlCommand, connection);
SqlCeDataReader reader = command.ExecuteReader();
while (reader.Read())
{
myArray[i] = reader.GetBoolean(0);
i++;
}
returnmyArray;
}
catch
{
returnnull;
}
}
returnnull;
}
///<summary>
///
///</summary>
///<returns></returns>
publicboolModifyDatabase(stringSqlRequest)
{
if(opened)
try{
//string mySqlCommand = "UPDATE " + Table + "SET " + ColumnToModify + "=" +"'"+newValue+"'"+" WHERE " + ParamColumn + "='"+oldValue+"'";
SqlCeCommand command = newSqlCeCommand(SqlRequest, connection);
command.ExecuteNonQuery();
returntrue;
}
catch{
returnfalse;
}
returnfalse;
}
///<summary>
/// Function to open connection with Database
///</summary>
publicvoid Open()
{
if (!opened) connection.Open();
}
///<summary>
/// Function to close connection with Database
///</summary>
publicvoid Close()
{
if (opened) connection.Close();
}
}
}
}