Автоматизована система тестування в системах дистанційного навчання

Дослідження теоретичних аспектів проектування автоматизованих систем тестування знань. Розробка програми, яка призначена для забезпечення автоматизації процесу формування тестів та всього процесу контролю знань у дистанційній навчальній системі.

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

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

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

Рис. 3.2 Всі компілятори, орієнтовані на .NET, генерують IL-інструкції й метадані

Двійкові файли .NET, для яких використовуються стандартні розширення DLL і ЕХЕ, по своєму внутрішньому вмісту не мають абсолютно нічого спільного із звичайними виконуваними файлами. Наприклад, файли DLL не надають свої методи в розпорядження додатків на комп'ютері. На відміну від компонентів СОМ двійкові файли .Net не описуються за допомогою коду IDL і реєструються в системному реєстрі. Проте, мабуть, найважливіша відзнака полягає в тому, що двійкові файли NET не містять залежних від платформи команд. Вміст двійкових файлів .NET -- це платформено-незалежний «проміжна мова», яка офіційно називається Microsoft Intermediate Language (MSIL, проміжна мова Microsoft), або просто IL.

3.2.1 Огляд двійкових файлів.NET

Коли за допомогою компілятора для платформи .NET створюється модуль DLL або ЕХЕ, вміст цього модуля -- це так звана збірка (assembly) на мові IL. Зборка містить код на «проміжній мові» -- IL. Призначення IL концептуально аналогічно байт-коду Java -- він компілюється в платформено-специфічні інструкції, лише коли це абсолютно необхідно. «Абсолютна необхідність» виникає тоді, коли до блоку інструкцій IL (наприклад, реалізації методу) звертається для використання середа виконання .NET.

Окрім інструкцій IL двійкові модулі .NET містять також метадані, які детально описують всіх типів, використаних в модулі. Наприклад, якщо усередині збірки є клас те в метаданих цієї збірки міститиметься інформація про базовий клас для Foo, які інтерфейси передбачені для Foo (якщо вони взагалі передбачені), а також повний опис всіх методів, властивостей і подій цього класу.

У багатьох відношеннях метадані .NET є значним удосконаленням в порівнянні з класичною інформацією про типів в СОМ. Класичні двійкові файли СОМ зазвичай описуються за допомогою асоційованої бібліотеки типів (яка дуже схожа на двійкову версію коду IDL). Проблема з інформацією про типів в СОМ полягає в тому, що ніхто не може гарантувати, що ця інформація виявиться повною. Код IDL може створити повний каталог зовнішніх серверів, які можуть бути необхідні для нормальної роботи тих, що містяться в модулі СОМ класів. Існування метадані .NET, навпаки, забезпечується тим, що метадані автоматично генеруються компілятором, що створює додаток .NET.

Метадані описують не лише типи, використовуванів збірці, але і саму збірку. Ця частина метаданих називається маніфестом (manifest). У маніфесті міститься інформація про поточну версію збірки, про використані обмеження по безпеці, про підтримувану природну мову (англійському, російському і т. д.), а також список всіх зовнішніх бібліотек, які буде потрібно для нормального виконання.

3.3.2 Мова програмування C#

Спеціально для платформи .NET Microsoft була розроблена нова мова програмування С#. С# -- це мова програмування, синтаксис якої дуже схожий на синтаксис Java (але не ідентичний йому). Наприклад, в С# (як в Java) визначення класу складається з одного файлу (*.cs), на відміну від C, де визначення класу розбите на заголовок (*.h) і реалізацію (*.срр). Проте називати С# клоном Java було б невірно. Як С#, так і Java засновані на синтаксичних конструкціях C . Якщо Java у багатьох відношеннях можна назвати очищеною версією С, то С# можна охарактеризувати як очищену версію Java.

Синтаксичні конструкції С# успадковані не лише від C, але і від Visual Basic. Наприклад, в С#, як і в Visual Basic, використовуються властивості класів. Як C, С# дозволяє проводити перевантаження операторів для створених вами типів (Java не підтримує ні ту, ні іншу можливість). С# -- це фактично гібрид різних мов. При цьому С# синтаксично не менш (якщо не більш) чистий, чим Java, також простий, як Visual Basic, і володіє практично тією ж потужністю і гнучкістю, що і C . Основні особливості С#:

· Покажчики більше не потрібні! У програмах на С#, як правило, немає необхідності в роботі з ними, проте, якщо є необхідність в їх використанні, то С# надає для цього всі необхідні засоби.

· Управління пам'яттю проводиться автоматично.

· У С# передбачені вбудовані синтаксичні конструкції для роботи з перерахуваннями, структурами і властивостями класів.

· У С# залишилася можливість перенавантажувати операторів, успадкованих від C . При цьому значна частина складнощів, що виникали при цьому, ліквідована.

· Передбачена повна підтримка використання програмних інтерфейсів. Проте на відміну від класичного СОМ вживання інтерфейсів -- це не єдиний спосіб роботи з типами, використовуючи різні двійкові модулі. .NET дозволяє передавати об'єкти (як заслання або як значення) через кордони програмних модулів.

· Також передбачена повна підтримка аспектно-орієнтірованних програмних технологій (таких як атрибути). Це дозволяє привласнювати типам характеристики (що багато в чому нагадує COM IDL) для опису в майбутньому поведінки даної суті.

Можливо, найважливіше, що необхідно сказати про мову С#, -- це те, що він генерує код, призначений для виконання лише в середі виконання .NET. Наприклад, немає можливості використовувати С# для створення класичного Сом-сервера. Згідно термінології Microsoft код, призначений для роботи в середі виконання .NET, -- це керований код (managed code). Двійковий файл, який містить керований файл, називається збіркою (assembly).

Версія 1.0

Проект C# був початий в грудні 1998 і отримав кодову назву COOL (C-style Object Oriented Language). Версія 1.0 була анонсована разом з платформою .NET у червні 2000 року, тоді ж з'явилася і перша загальнодоступна бета-версия; C# 1.0 остаточно вийшов разом з Microsoft Visual Studio .NET у лютому 2002 року.

Перша версія C# нагадувала по своїх можливостях Java 1.4, декілька їх розширюючи: так, в C# були властивості (що виглядають в коді як поля об'єкту, але що на ділі викликають при зверненні до них методи класу), індексатори (подібні до властивостей, але що приймають параметр як індекс масиву), події, делегати, цикли foreach, структури, що передаються за значенням, автоматичне перетворення вбудованих типів в об'єкти при необхідності (boxing), атрибути, вбудовані засоби взаємодії з неуправляємим кодом (DLL, COM) і інше.

Крім того, в C# вирішено було перенести деякі можливості C, відсутні в Java: беззнакові типи, перевизначення операцій (з деякими обмеженнями, на відміну від C ), передача параметрів в метод по засланню, методи із змінним числом параметрів, оператор goto. Також в C# залишили обмежену можливість роботи з покажчиками -- в місцях коду, спеціально позначених словом unsafe і при вказівці спеціальній опції компілятору.

Версія 2.0

Проект специфікації C# 2.0 вперше був викладений Microsoft в жовтні 2003 року; у 2004 році виходили бета-версиі (проект з кодовою назвою Whidbey), C# 2.0 остаточно вийшов 7 листопада 2005 року разом з Visual Studio 2005 і .NET 2.0.

Нові можливості в версії 2.0

Часткові типи (розділення реалізації класу більш ніж на один файл). Узагальнені, або типи, що параметризуються (generics). На відміну від шаблонів C, вони підтримують деякі додаткові можливості і працюють на рівні віртуальної машини. В той же час, параметрами узагальненого типа не можуть бути вирази.

Нова форма ітегратора, що дозволяє створювати співпрограми за допомогою ключового слова yield, подібно Python і Руби.

Анонімні методи замикання, що забезпечують функціональність.

Оператор '??': return obj1 ?? obj2; означає (в нотації C# 1.0) return obj1!=null ? obj1 : obj2;.

Типи-значення (що позначаються знаком питання, наприклад, int? i = null;), що обнуляються ('nullable'), є ті ж самі типи-значення, лише можуть набувати також значення null. Такі типи дозволяють поліпшити взаємодію з базами даних через мову SQL.

Версія 3.0

У червні 2004 року Андерс Хейлсберг вперше розповів на сайті Microsoft про плановані розширення мови в C#3.0. У вересні 2005 року вийшли проект специфікації C# 3.0 і бета-версия C# 3.0, що встановлюється у вигляді доповнення до існуючих Visual Studio 2005 і .NET 2.0.

Нові можливості у версії 3.0В C# 3.0 з'явилися наступні радикальні додавання до мови:

· Ключові слова select, from, where, що дозволяють робити запр си з SQL, XML, колекцій і тому подібне (запит, інтегрований в мову, LINQ)

· Ініціалізація об'єкту разом з його властивостями:

Customer c = new Customer(); c.Name = "James";

перетвориться в

Customer c = new Customer { Name = "James" };

· Ламбда-висловлення:

listOfFoo.Where(delegate(Foo x) { return x.size > 10; });

перетвориться в

listOfFoo.Where(x => x.size > 10);

· Тип локальної змінної, що мається на увазі: var x = "hello"; замість string x ="hello";

· Безіменні типи: var x = new { Name = "James" };

· Методи-розширення -- додавання методу в існуючий клас за допомогою ключового слова this при першому параметрі статичної функції.

C# 3.0 буде сумісний з C# 2.0 по Msil-коду, що генерується; поліпшення в мові -- чисто синтаксичні і реалізуються на етапі компіляції. Наприклад, багато з інтегрованих запитів LINQ можна вже зараз здійснити, використовуючи безіменні делегати у поєднанні з предикативними методами над контейнерами начеб List.FindAll и List.RemoveAll.

3.3 Мова XML

XML (англ. eXtensible Markup Language -- розширювана мова розмітки; рекомендована Консорціумом Усесвітньої павутини мова розмітки, що фактично є зводом спільних синтаксичних правил. XML призначена для зберігання структурованих даних (замість існуючих файлів баз даних), для обміну інформацією між програмами, а також для створення на його основі більш спеціалізованих мов розмітки (наприклад, XHTML), інколи званих словниками. XML є спрощеною підмножиною мови SGML.

Метою створення XML було забезпечення сумісності при передачі структурованих даних між різними системами обробки інформації, особливо при передачі таких даних через інтернет. Словники, засновані на XML (наприклад, RDF, RSS, MATHML, XHTML, SVG), самі по собі формально описані, що дозволяє програмно змінювати і перевіряти документи на основі цих словників, не знаючи їх семантики, тобто не знаючи смислового значення елементів. Важливою особливістю XML також є вживання так званих просторів імен (англ. namespace).

3.3.1 Короткий огляд синтаксису

Нижче наведений приклад простого кулінарного рецепту, розміченого з допомогою XML:

<?xml version="1.0" encoding="UTF-8"?>

<recipe name="хліб" prep_time="5 мин" cook_time="3 час">

<title>Простий хліб</title>

<ingredient amount="3" unit="стакан">Мука</ingredient>

<ingredient amount="0.25" unit="грам">Дрожи</ingredient>

<ingredient amount="1.5" unit="стакан">Тепла вода</ingredient>

<ingredient amount="1" unit="чайна ложка">Сіль</ingredient>

<Instructions>

<step> Змішати всі інгредієнти і ретельно замісити.</step>

<step> Закрити тканиною і залишити на одну годину в теплому приміщенні.</step>

<step> Замісити ще раз, покласти на деко і поставити в духовку.</step>

</Instructions>

</recipe>

Перший рядок Xml-документа називається оголошенням XML -- це необязательная рядок, вказуючий версію стандарту XML (звичайно це 1.0), так-же тут може бути вказана кодування символів і зовнішні залежності. Остання частина цього Xml-документа складається з вкладених елементів, деякі з яких мають атрибути і вміст. Елемент зазвичай складається з того, що відкриває і закриваючого тегов (міток), що обрамували текст і інших елементів. Відкриваючий тег складається з імені елементу в кутових дужках, наприклад «step»; закриваючий тег складається з того ж імені в кутових дужках, але перед ім'ям ще додається коса межа, наприклад «/step». Вмістом елементу називається все, що розташоване між тим, що відкриває і закриваючим тегамі, включаючи текст і інші (вкладені) елементи. Нижче наведений приклад Xml-елемента, який містить відкриваючий тег, закриваючий тег і вміст елементу:

<step> Замісити ще раз, покласти на деко і поставити в духовку.</step>

Окрім вмісту в елементу можуть бути атрибути -- пари імя-значення, що додаються у відкриваючий тег після назви елементу. Значення атрибутів завжди полягають в лапки (одинарні або подвійні), одне і те ж ім'я атрибуту не може зустрічатися двічі в одному елементі. Не рекомендується використовувати різних типів лапок для значень атрибутів одного тега.

<ingredient amount="3" unit="стакан">Мука</ingredient>

У наведеному прикладі в елементу «ingredient» є два атрибути: «amount», що має значення «3», і «unit», що має значення «стакан». З точки зору Xml-разметки, приведені атрибути не несуть жодного сенсу, а є просто набором символів. Окрім тексту елемент може містити інші елементи:

<Instructions>

<step> Змішати всі інгредієнти і ретельно замісити.</step>

<step> Закрити тканиною і залишити на одну годину в теплому приміщенні.</step>

<step> Замісити ще раз, покласти на деко і поставити в духовку.</step>

</Instructions>

В даному випадку елемент «Instructions» містить три елементи «step». XML не допускає елементів, що перекриваються. Наприклад, приведений нижче фрагмент некорректен, оскільки елементи «em» і «strong» перекриваються.

<!-- УВАГА! Некоректний XML! -->

<p>Звичайний <em>акцентований <strong> виділений і акцентований </em> виділений</strong></p>

Кожен Xml-документ повинен містити в точності один кореневий елемент, таким чином, наступний фрагмент не може вважатися коректним Xml-документом.

<!-- УВАГА! Некоректний XML! -->

<thing>Cущність №1</thing>

<thing>Cущність №2</thing>

Для позначення елементу без вмісту, званого порожнім елементом, допускається застосовувати особливу форму запису, що складається з одного тега, в якому після імені елементу ставиться коса межа. Наступні фрагменти повністю рівнозначні:

<foo></foo>

<foo />

<foo/>

У XML визначено два методи запису спеціальних символів: заслання на суть і заслання по номеру символу. Суттю в XML називаються іменовані дані, зазвичай текстові, зокрема спецсимволи. Заслання на суть вказується в тому місці, де має бути суть і складається з амперсанда («»), імені суті і крапки з комою («;»). У XML є декілька зумовленої суті, таких як «lt» (посилатися на неї можна написавши «<») для лівої кутової дужки і «amp» (заслання -- «») для амперсанда, можливо також визначати власну суть. Окрім запису за допомогою суті окремих символів, їх можна використовувати для запису текстових блоків, що часто зустрічаються. Нижче наведений приклад використання зумовленої суті для уникнення використання знаку амперсанда в назві:

<company-name>AT&amp;T</company-name>

Повний список зумовленої суті складається з («») < («<»), > («>»), apos; («'»), і " ("") -- останні дві корисні для запису роздільників усередині значень атрибутів. Визначити свою суть можна в Dtd-документі. Інколи буває необхідно визначити неразривний пропуск, який в HTML позначається як в XML його записують &#160;

Посилання по номеру символу виглядає як заслання на суть, але замість імені суті вказується символ # і число (у десятковому або шестнадцатерічному запису), що є номером символу в кодовій таблиці Юнікод. Це звичайно символи, які неможливо закодувати безпосередньо, наприклад буква арабського алфавіту в Ascii-кодірованном документі. Амперсанд може бути представлений таким чином:

<company-name>AT&#038;T</company-name>

Існує ще безліч правив, що стосуються складання коректного XML-документа, але метою даного короткого огляду було лише показати основи, необхідні для розуміння структури XML-документа.

Переваги:

· XML(людино-орієнтирований) -- це формат, одночасно зрозумілий і людині і комп'ютеру;

· XML підтримує Юнікод;

· в форматі XML можуть бути описані основні структури даних -- такі як записи, списки і дерева;

· XML -- це самодокументований формат, який описує структуру і імена полів також як і значення полів;

· XML має строго певний синтаксис і вимоги до аналізу, що дозволяє йому залишатися простим, ефективним і несуперечливим;

· XML також широко використовуєтся для зберігання й обробки документів;

· XML -- формат, заснований на міжнародних стандартах;

· ієрархічна структура XML личить для опису практично будь-яких типів документів;

· XML є простим текстом, вільним від ліцензування і яких-небудь обмежень;

· XML не залежить від платформи;

· XML є підмножиною SGML (який використовується з 1986 року). Вже накопичений великий досвід роботи з мовою і створені спеціалізовані застосування;

· XML не накладує вимоги на розташування символів на строці.

Недоліки

· Синтаксис XML надлишковий.

o Розмір XML документа істотно більше бінарного представлення тих же даних. У грубих оцінках величину цього чинника приймають за 1 порядок (у 10 разів).

o Розмір XML документа істотно більший, ніж документа в альтернативних текстових форматах передачі даних і особливо у форматах даних оптимізованих для конкретного випадку використання.

o Надлишковість XML може вплинути на ефективність додатка. Зростає вартість зберігання, обробки і передачі даних.

o Для великої кількості завдань не потрібна вся потужність синтаксису XML і можна використовувати значно простіші і продуктивніші вирішення.

· XML не містить вбудованої в мову підтримки типів данних. В нёму нема понять «цеілих чисел», «строк», «дат», «булевих значень» і т.і.

· Іерархічна модель даних, пропонована XML, обмежена в порівнянні з реляційною моделлю і об'єктно-орієнтованими графами.

o Вираження не ієрархічних даних (наприклад графів) вимагає додаткових зусиль.

o Крістофер Дейт відзначав, що «XML є спробою заново винайти ієрархічні бази даних …».

· Простори імен XML складно використовувати і їх складно реалізовувати в XML парсерах;

· Існують інші, що володіють схожими з XML можливостями, текстові формати даних, які володіють вищою зручністю читання людиною.

4. ОПИС ФУНКЦІОНАЛЬНИХ МОЖЛИВОСТЕЙ ТА ПРОГРАМНОЇ РЕАЛІЗАЦІЇ СИСТЕМИ

4.1 Мінімальні системні вимоги і технічна характеристика

Метою даної дипломної роботи є створення комп'ютеризованого комплексу контролю знань.

Як мова програмування для реалізації поставленого завдання була обрана C#.

Склад розробленого програмного комплексу:

· TestServer.exe: сервер і редактор тестів, в якому створюватимуться тести, що містять питання і варіанти правильних відповідей;

· TestServerLib.dll: серверна бібліотека видаленої взаємодії клієнтської і серверної частини тестової програми.

· tests.mdf: файл бази даних тестів.

· TestClient.exe: оболонка, яка дозволяє завантажувати і використовувати створені тести;

· ClientLib.dll: клієнтська бібліотека видаленої взаємодії.

Мінімальні системні вимоги:

· IBM-сумісний комп'ютер, не нижче Pentium I-200ММХ, RAM-32Mb, SVGA-800*600*16bit

· Операційна система Windows 95/98/ME/2000/XP;

· Вільний простір на жорсткому диску не менше 2Мб.

Технічні характеристики програми:

· програма не вимагає інсталяції;

· програму можна запускати з будь-якого зручного користувачу каталога, оскільки при запуску програма робить каталог, в якому знаходиться, поточним.

4.2 Розробка логіко-функціональної схеми системи

Логіко-функціональна схема системи наведена на рис. 4.1. та рис. 4.2.

Рис. 4.1 Логіко-функціональна схема роботи редактору тестів (серверна частина)

Рис. 4.2 Логіко-функціональна схема роботи тестової оболонки (клієнтська частина)

4.3 Опис функціональних можливостей і інтерфейсу користувача програмного комплексу

4.3.1 Опис інтерфейсу серверної частини

Інтерфейс користувача програмного комплексу, що представляється, максимально адаптований для користувача. Він інтуїтивно зрозумілий і забезпечений всіма необхідними коментарями і підказками. Розглянемо поетапно інтерфейс двох складових частин програмного комплексу - редактора тестів і тестової оболонки. Почнемо розгляд інтерфейсу програмного комплексу з його основної частини - серверної.

Рис 4.3 Головна форма серверної частини програми

На рисунку 4.3 представлена головна форма серверної частини тесту. Вона включає список вже створених тестів і просту форму для запуску сесії тесту. Після вибору потрібного тесту із списку і завдання імені сесії, яка потрібна для подальшої ідентифікації конкретного тесту при прогляданні результатів тестування, за допомогою натиснення кнопки «Запустити тест» в оперативну пам'ять комп'ютера завантажується вся необхідна інформація по тесту з бази даних і відкривається порт, для підключення до поточної сесії тестування клієнтської частини програми, при цьому, клієнтська частина програми може знаходитися як на тому ж комп'ютері, так і на будь-якому іншому ПК що має доступ по локальній мережі або ж по глобальній мережі Інтернет до комп'ютера на якому запущений сервер тестуючої програми. Після запуску тесту форма прийме вигляд, приведений на рисунку 4.4. Кнопка «Запустити тест» стане неактивною, щоб уникнути запуску повторного сеансу тестування на тому ж комп'ютері під час вже створеної сесії тесту.

Рис 4.4 Головна форма серверної частини програми після запуску тесту

Після проходження всіма учасниками тестування, тест можна буде зупинити і запустити повторно або ж вибрати новий.

4.3.2 Опис інтерфейсу редактора тестів

Для того що б створити новий тест, необхідно вибрати відповідний пункт меню головної форми серверної частини тестової програми (рис. 4.5).

Рис. 4.5 Головне меню тестової програми

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

На рисунку 4.6 приведений перший крок майстра, який дозволяє задати ім'я майбутнього тесту.

Рис 4.6 Перший крок майстра для створення тесту

Після завдання імені тесту і натисненні кнопки «Далі» майстер переходить до другого кроку, і форма приймає наступний вигляд:

Рис 4.7 Другий крок майстра для створення тесту

Тут з'являється можливість створити необхідну кількість питань і відповідей для них. Після введення тексту питання і натиснення на кнопку «Додати відповідь» відкривається ще одна форма (рис 4.8) в якій дається можливість задати відповідь і кількість балів за відповідь. Правильна відповідь повинна мати кількість балів 0 і бути єдиним оскільки по цих балах, згодом, обчислюватиметься кількість вірних відповідей на питання тесту.

Рис. 4.8 Форма для завдання відповіді на питання тесту

Задавши необхідної кількості відповідей і натиснувши кнопку «Вихід» управління повертається до попередньої форми (рис 4.7), де можна буде додати ще питань з відповідями, або ж завершити створення тесту.

Якщо з'являється необхідність видалити тест або ж додати в той, що вже існує питання, необхідно скористатися пунктом меню «Редагування тесту».

Редактор тесту є окремою формою зовнішній вигляд якої приведений на малюнку 4.9.

Рис. 4.9 Форма редагування створених тестів

Форма редагування тестів, також представлена у формі майстра, після вибору елементу стає активним наступний і так далі від вибору конкретного тесту для редагування до варіантів відповідей на питання (рис.4.10).

Рис. 4.10 Повний вид форми редагування тестів

4.3.3 Проглядання результатів

Проглядання результатів тестування можливе в окремій формі серверної частини програми, яка активізується після вибору відповідного пункту меню.

Рис 4.11 Повний вид форми проглядання результатів тестування

4.3.4 Опис інтерфейсу клієнтської частини

Відразу після запуску клієнтської частини, перед проходженням тесту, тестованому необхідно ввести інформацію про себе (Рис. 4.12). Це необхідно для подальшого перегляду результату пройденого тесту.

Рис. 4.12 Вікно реєстрації клієнтської частини тестуючої програми

Потім відбувається перехід безпосередньо до питань тесту.

Рис. 4.13 Основна форма клієнтської частини тестуючої програми

По натисненню на кнопку «Далі» відбувається або перехід до наступного питання або ж, якщо питання останній, повідомляється кількість набраних балів, а потім відбувається вихід з програми.

Рис 4.14 Результат тестування

4.4 Програмна реалізація та опис основних процедур і функцій розробленої системи

4.4.1 Опіс функціональної частини роботи сервера

Для роботи сервер тестуючої програми використовує таблиці users, tests

tests_sessions, а і q структура яких приведена на рисунках 4.15, 4.16, 4.17, 4.18 і 4.19.

Рис. 4.15 Структура таблиці users

Рис. 4.16 Структура таблиці tests

Рис. 4.17 Структура таблиці tests_sessions

Рис. 4.18 Структура таблиці а

Рис 4.19 Структура таблиці q

Таблиця «users» потрібна для зберігання інформації про тих, що пройшли тест і має поля:

Поле Id - аутоинкрементное поле що є унікальним ідентифікатором за допомогою якого можна дістати доступ до будь-якого запису таблиці незатрагувая всі інші.

Поле name - текстове поле, що містить ім'я того, що проходить тест.

Поле gr - текстове поле, що містить групу того, що проходить тест.

Поле test_id - містить id тесту.

Поле points - кількість набраних очок.

Таблиця test призначена для зберігання імен створених тестів:

Поле id - автоінкриментне поле що є унікальним ідентифікатором за допомогою якого можна дістати доступ до будь-якого запису таблиці незатрагувая всі інші.

Поле name - текстове поле ім'я тесту, що містить.

Таблиця «tests_sessions» необхідна для збереження сесій тестування і містить наступні поля:

Поле id - автоінкриментне поле що є унікальним ідентифікатором за допомогою якого можна дістати доступ до будь-якого запису таблиці незатрагувая всі інші.

Поле test_id - ідентифікатор тесту, узятий з таблиці test.

Поле name - ім'я сесії тестування.

Поле closed - по суті, булевий поле, що використовується для визначення того який тест запущений в даний момент.

Таблиця «q» містить всі питання всіх створених тестів і складається з наступних полів:

Поле id - автоінкриментне поле що є унікальним ідентифікатором за допомогою якого можна дістати доступ до будь-якого запису таблиці не торкаючись всіх інші.

Поле test_id - ідентифікатор тесту, якому належить питання.

Поле q - текстове поле, що містить текст питання.

Поле type - зарезервовано для можливості розширення.

Таблиця «а» містить відповіді на питання тестів і складається з наступних полів:

Поле id - автоінкриментне поле що є унікальним ідентифікатором за допомогою якого можна дістати доступ до будь-якого запису таблиці незатрагувая всі інші.

Поле а - текстове поле, що містить текст відповіді

Поле weight - кількість балів за відповідь, величина характеризуюча правильність відповіді.

q_id - ідентифікатор питання, якому належить відповідь.

test_id - ідентифікатор тесту.

Запуск сервера

Відразу після запуску програми і ініціалізації всіх елементів інтерфейсу, виконується закриття всіх незакритих сесій тестування для запобігання колізіям, оскільки в одну одиницю часу може бути запущена тільки одна сесія. Очищення виконується за допомогою функції flush_sess бібліотеки slib.

public void flush_sess(){

using (SqlConnection cn = new SqlConnection(connStr))

{

using (SqlCommand cmd = cn.CreateCommand())

{

cmd.CommandType = CommandType.Text;

cmd.CommandText = "UPDATE test_sessions SET closed=1";

cn.Open();

cmd.ExecuteNonQuery();

cn.Close();

}

}

}

Потім виконується заповнення списку готових тестів за допомогою функції fill_test_list:

private void fill_test_list()

{

slib l = new slib(Application.StartupPath);

Dictionary<int, List<string>> tests = l.get_tests();

foreach (KeyValuePair<int,List<string>> item in tests)

{

ListViewItem li = new ListViewItem();

li.Tag = item.Key.ToString();

li.Text = item.Value[0];

li.SubItems.Add(item.Value[1]);

li.SubItems.Add(item.Value[2]);

listView1.Items.Add(li);

}

}

Функція fill_test_list одержує інформацію про тести за допомогою функції get_tests() бібліотеки slib, яка повертає словник, що містить необхідну інформацію про тести:

public Dictionary<int, List<string>> get_tests()

{

Dictionary<int, List<string>> tests = new Dictionary<int, List<string>>();

using (SqlConnection cn = new SqlConnection(connStr))

{

using (SqlCommand cmd = cn.CreateCommand())

{

cmd.CommandType = CommandType.Text;

cmd.CommandText = "SELECT * FROM tests as t ORDER by t.id";

cn.Open();

SqlDataReader dr = (SqlDataReader)cmd.ExecuteReader();

while (dr.Read())

{

List<string> l = new List<string>();

l.Add(dr["name"].ToString());

SqlConnection cn2 = new SqlConnection(connStr);

SqlCommand cmd2 = cn2.CreateCommand();

cmd2.CommandText = "select count(*) from q where test_id=@test_id";

cmd2.Parameters.Add("@test_id", dr["id"].ToString());

cn2.Open();

string sum_q = cmd2.ExecuteScalar().ToString();

l.Add(sum_q);

cn2.Close();

SqlConnection cn3 = new SqlConnection(connStr);

SqlCommand cmd3 = cn3.CreateCommand();

cmd3.CommandText = "select sum(weight) from а WHERE test_id=@test_id";

cmd3.Parameters.Add("@test_id", dr["id"].ToString());

cn3.Open();

string sum_weight = cmd3.ExecuteScalar().ToString();

cn3.Close();

l.Add(sum_weight);

tests.Add(Convert.ToInt32(dr["id"].ToString()), l);

}

cn.Close();

}

}

return tests;

}

Створення нового тесту

Додавання нового тесту в базу даних проводиться поетапно. Спершу записується ім'я тесту в таблицю test. Цим займається функція addTest бібліотеки slib, яка приймає як параметр строкове значення ім'я тесту, що містить, і що повертає як результат роботи ідентифікатор створеного тесту.

public int addTest(string name){

int id = 0;

using (SqlConnection cn = new SqlConnection(connStr))

{

using (SqlCommand cmd = cn.CreateCommand())

{

cmd.CommandType = CommandType.Text;

cmd.CommandText = "INSERT INTO tests (name) VALUES (@name)";

cmd.Parameters.Add("@name", name);

cn.Open();

cmd.ExecuteNonQuery();

cmd.CommandText = "SELECT MAX(id) FROM tests";

id = (int)cmd.ExecuteScalar();

cn.Close();

}

}

return id;

}

Функція q_insert() бібліотеки slib служить для додавання питань тесту. Вхідними значеннями для неї є ідентифікатор тесту, і сам текст питання, а результатом її роботи - числовий ідентифікатор поміщеного в таблицю «q» питання.

public int q_insert(int test_id, string q, int type)

{

int q_id = -1;

using (SqlConnection cn = new SqlConnection(connStr))

{

using (SqlCommand cmd = cn.CreateCommand())

{

cmd.CommandType = CommandType.Text;

cmd.CommandText = "INSERT INTO q (test_id, q, type) VALUES (@test_id, @q, @type)";

cmd.Parameters.Add("@test_id" test_id.ToString());

cmd.Parameters.Add("@q", q);

cmd.Parameters.Add("@type", type.ToString());

cn.Open();

cmd.ExecuteNonQuery();

cmd.CommandText = "SELECT max(id) FROM q";

q_id = (int)cmd.ExecuteScalar();

cn.Close();

}

}

return q_id;

}

a_insert() - ще одна необхідна для створення тесту функція бібліотеки slib, службовка для додавання відповідей до питань, які зберігаються в таблиці «а».

public int a_insert(int q_id, string а, string weight, int test_id)

{

int a_id = -1;

using (SqlConnection cn = new SqlConnection(connStr))

{

using (SqlCommand cmd = cn.CreateCommand())

{

cmd.CommandType = CommandType.Text;

cmd.CommandText = "INSERT INTO а (q_id, а, weight test_id) VALUES (@q_id, @a, @weight, @test_id)";

cmd.Parameters.Add("@q_id" q_id.ToString());

cmd.Parameters.Add("@a", а);

cmd.Parameters.Add("@weight", weight);

cmd.Parameters.Add("@test_id" test_id);

cn.Open();

cmd.ExecuteNonQuery();

cmd.CommandText = "SELECT max(id) FROM а";

a_id = (int)cmd.ExecuteScalar();

cn.Close();

}

}

return a_id;

}

Редактор тестів

У редакторі тестів використовуються ще декілька функцій бібліотеки slib, які здійснюють не вставку нових даних в базу даних, а редагування тих, що вже існують. Так, наприклад, функція set_test_name(), що приймає як вхідні значення цифровий ідентифікатор тесту і нове ім'я, змінює запис name в таблиці tests по вказаному ідентифікатору.

public void set_test_name(int test_id, string name)

{

using (SqlConnection cn = new SqlConnection(connStr))

{

using (SqlCommand cmd = cn.CreateCommand())

{

cmd.CommandType = CommandType.Text;

cmd.CommandText = "UPDATE tests SET name=@name WHERE id=@test_id";

cmd.Parameters.Add("@name", name);

cmd.Parameters.Add("@test_id" test_id.ToString());

cn.Open();

cmd.ExecuteNonQuery();

cn.Close();

}

}

}

А функція set_q_name робить теже дії, але тільки для питання тесту. Приймаючи як вхідні параметри числовий ідентифікатор питання і його новий текст.

public void set_q_name(int q_id, string name)

{

using (SqlConnection cn = new SqlConnection(connStr))

{

using (SqlCommand cmd = cn.CreateCommand())

{

cmd.CommandType = CommandType.Text;

cmd.CommandText = "UPDATE q SET q=@name WHERE id=@q_id";

cmd.Parameters.Add("@name", name);

cmd.Parameters.Add("@q_id" q_id.ToString());

cn.Open();

cmd.ExecuteNonQuery();

cn.Close();

}

}

}

Також в бібліотеці slib присутні функції для видалення вже існуючих записів в таблицях бази даних тестів. Наприклад функція test_del() що приймає як вхідний параметр числовий ідентифікатор тесту, здійснює очищення відразу трьох таблиць бази даних.

public void test_del(int id)

{

using (SqlConnection cn = new SqlConnection(connStr))

{

using (SqlCommand cmd = cn.CreateCommand())

{

cmd.CommandType = CommandType.Text;

cmd.CommandText = "DELETE FROM а WHERE test_id=@id";

cmd.Parameters.Add("@id", id.ToString());

cn.Open();

cmd.ExecuteNonQuery();

cmd.CommandText = "DELETE FROM q WHERE test_id=@id";

cmd.ExecuteNonQuery();

cmd.CommandText = "DELETE FROM tests WHERE id=@id";

cmd.ExecuteNonQuery();

cn.Close();

}

}

}

Програмна реалізація запуску сесії тесту

Після натиснення кнопки «Запустити тест» і ініціалізації об'єкту видаленої взаємодії відбувається запис поточної сесії із заданим ім'ям в базу за допомогою функції create_session() бібліотеки slib.

public int create_session(int test_id, string name)

{

int test_session = -1;

using (SqlConnection cn = new SqlConnection(connStr))

{

using (SqlCommand cmd = cn.CreateCommand())

{

cmd.CommandType = CommandType.Text;

cmd.CommandText = "Insert into test_sessions (test_id, name, closed) VALUES(@test_id, @name,0)";

cmd.Parameters.Add("@test_id" test_id.ToString());

cmd.Parameters.Add("@name", name);

cn.Open();

cmd.ExecuteNonQuery();

cmd.CommandText = "SELECT max(id) FROM test_sessions";

test_session = (int)cmd.ExecuteScalar();

cn.Close();

}

}

return test_session;

}

Це оставная і єдина функція необхідна для коректної роботи серверної і клієнтської частини програми.

Програмна реалізація проглядання результатів

Проглядання результатів організоване в окремій формі, яка стає активною при виборі відповідного пункту меню. Відразу після запуску відбувається вибірка всіх існуючих сесій коли-небудь проведених тестів і заповнюється спеціальний combobox. Всім цим займається функція get_sess_list() бібліотеки slib, яка повертає структуру вигляду List<List<string>> що містить всю необхідну інформацію для організації списку.

public List<List<string>> get_sess_list()

{

List<List<string>> sess = new List<List<string>>();

using (SqlConnection cn = new SqlConnection(connStr))

{

using (SqlCommand cmd = cn.CreateCommand())

{

cmd.CommandType = CommandType.Text;

cmd.CommandText = "SELECT * FROM test_sessions ORDER by id DESC";

cn.Open();

SqlDataReader dr = (SqlDataReader)cmd.ExecuteReader();

while (dr.Read())

{

List<string> l = new List<string>();

l.Add(dr["id"].ToString());

l.Add(dr["name"].ToString());

sess.Add(l);

}

cn.Close();

}

}

return sess;

}

Для того, щоб безпосередньо подивитися результати тієї або іншої сесії тестування, необхідно вибрати необхідне ім'я сесії з наданого списку. Після вибору відбувається заповнення ListView форми результатами, це робиться за допомогою функції get_sess_info(), яка як вхідний параметр приймає цифровий ідентифікатор сесії.

public List<List<string>> get_sess_info(int sess_id)

{

List<List<string>> users = new List<List<string>>();

using (SqlConnection cn = new SqlConnection(connStr))

{

using (SqlCommand cmd = cn.CreateCommand())

{

cmd.CommandType = CommandType.Text;

cmd.CommandText = "SELECT * FROM users WHERE sess_id=@sess_id ORDER by id DESC";

cmd.Parameters.Add("@sess_id" sess_id.ToString());

cn.Open();

SqlDataReader dr = (SqlDataReader)cmd.ExecuteReader();

while (dr.Read())

{

List<string> l = new List<string>();

l.Add(dr["name"].ToString());

l.Add(dr["gr"].ToString());

l.Add(dr["points"].ToString());

l.Add(dr["max_points"].ToString());

l.Add(dr["test_id"].ToString());

l.Add(dr["id"].ToString());

users.Add(l);

}

cn.Close();

}

}

return users;

}

Програмна реалізація клієнтської частини програми

Відразу після запуску клієнтської частини тестової програми користувачу надається можливість ввести інформацію про себе, без якої запуск сесії тесту для конкретного користувача, буде неможливий. Після успішного введення інформації, клієнтська частина одержує від серверної числовий ідентифікатор поточного тесту за допомогою функції start_test() беблиотеки видаленої взаємодії.

public int start_test(){

int test_id = -1;

using (SqlConnection cn = new SqlConnection(connStr))

{

using (SqlCommand cmd = cn.CreateCommand())

{

cmd.CommandType = CommandType.Text;

cmd.CommandText = "SELECT test_id FROM test_sessions WHERE closed=0";

cn.Open();

test_id = Convert.ToInt32(cmd.ExecuteScalar().ToString());

cn.Close();

}

}

return test_id;

}

Повернення функцією start_test() позитивного значення означає успішний запуск сесії, після чого відбувається отримання списку питань з допомога функції get_all_q() бібліотеки видаленої взаємодії.

public List<List<string>> get_all_q(int test_id) {

List<List<string>> q = new List<List<string>>();

using (SqlConnection cn = new SqlConnection(connStr))

{

using (SqlCommand cmd = cn.CreateCommand())

{

cmd.CommandType = CommandType.Text;

cmd.CommandText = "SELECT * FROM q WHERE test_id=@test_id ORDER by id";

cmd.Parameters.Add("@test_id" test_id.ToString());

cn.Open();

SqlDataReader dr = (SqlDataReader)cmd.ExecuteReader();

while (dr.Read())

{

List<string> l = new List<string>();

l.Add(dr["id"].ToString());

l.Add(dr["q"].ToString());

q.Add(l);

}

cn.Close();

}

}

return q;

}

Відповіді, на відміну від питань, виходять не одноразово. А при переході від одного питання до іншого. Відповідає за це функція get_a(), яка як вхідний параметр приймає числовий ідентифікатор поточного питання, а вдалим результатом її роботи є список відповідей.

public List<List<string>> get_a(int q_id){

List<List<string>> а = new List<List<string>>();

using (SqlConnection cn = new SqlConnection(connStr))

{

using (SqlCommand cmd = cn.CreateCommand())

{

cmd.CommandType = CommandType.Text;

cmd.CommandText = "SELECT * FROM а WHERE q_id=@q_id ORDER by id";

cmd.Parameters.Add("@q_id" q_id.ToString());

cn.Open();

SqlDataReader dr = (SqlDataReader)cmd.ExecuteReader();

while (dr.Read())

{

List<string> l = new List<string>();

l.Add(dr["id"].ToString());

l.Add(dr["а"].ToString());

l.Add(dr["weight"].ToString());

а.Add(l);

}

cn.Close();

}

}

return а;

}

Після відповідей на всі питання тесту і висновку на екран результату тестування, за допомогою функції insert_result() бібліотеки видаленої взаємодії результати передаються на сервер, де і зберігаються в базу даних.

public void insert_result(string name, string gr, int points, int max_points, int test_id)

{

using (SqlConnection cn = new SqlConnection(connStr))

{

using (SqlCommand cmd = cn.CreateCommand())

{

cmd.CommandType = CommandType.Text;

cmd.CommandText = "SELECT id FROM test_sessions WHERE closed=0";

cn.Open();

int sess_id = Convert.ToInt32(cmd.ExecuteScalar().ToString());

cmd.CommandText = "Insert into users (test_id, name gr,points,max_points, sess_id) VALUES(@test_id, @name,@gr,@points,@max_points,@sess_id)";

cmd.Parameters.Add("@test_id" test_id.ToString());

cmd.Parameters.Add("@name", name);

cmd.Parameters.Add("@gr", gr);

cmd.Parameters.Add("@points", points.ToString());

cmd.Parameters.Add("@max_points" max_points.ToString());

cmd.Parameters.Add("@sess_id" sess_id.ToString());

cmd.ExecuteNonQuery();

cn.Close();

}

}

}

5. ЕКОНОМІЧНЕ ОБҐРУНТУВАННЯ ДОЦІЛЬНОСТІ РОЗРОБКИ ПРОГРАМНОГО ПРОДУКТУ

Визначення витрат на створення програмного продукту

Визначення витрат на створення програмного продукту.

Оскільки середа розробки є безкоштовною, витрати на створення програмного продукту складаються з витрат по оплаті праці розробника програми і витрат по оплаті машинного часу при відладці програми:

Зспп=Ззпспп мвсппобщ,

де

Зспп - витрати на створення програмного продукту;

Ззпспп - витрати на оплату праці розробника програми;

Змвспп - витрати на оплату машинного часу;

Зобщ - загальні витрати.

Витрати на оплату праці розробника програми (Ззпспп) визначаються шляхом множення трудомісткості створення програмного продукту на середню годинну оплату програміста (з урахуванням коефіцієнта відрахувань на соціальні потреби):

Ззпспп=t*Tчас.

Розрахунок трудомісткості створення програмного продукту.

Трудомісткість розробки програмного продукту можна визначити таким чином:

t= to+ tа+ tб+ tп+ tд+ tот,

де

to - витрати праці на підготовку опису завдання;

tа - витрати праці на розробку алгоритму рішення задачі;

tб - витрати праці на розробку блок-схеми алгоритму рішення задачі;

tп - витрати праці на складання програми по готовій блок-схемі;

tд - витрати праці на підготовку документації завдання;

tот - витрати праці на відладку програми на ЕОМ при комплексній відладці завдання.

Складові витрат можна виразити через умовне число операторів Q. У нашому випадку число операторів у відлагодженій програмі Q=350.

Розрахунок витрат праці на підготовку опису завдань.

Оцінити витрати праці на підготовку опису завдання не можливо, оскільки це пов'язано з творчим характером роботи, натомість оцінимо витрати праці на вивчення опису завдання з урахуванням уточнення опису і кваліфікації програміста:

to= Q*B/(75…85*K),

где

B - коефіцієнт збільшення витрат праці унаслідок недостатнього опису завдання, уточнень і деякої недоробки, B=1,2…5;

K - коефіцієнт кваліфікації розробника, для тих, що працюють до 2 років K=0,8;

Коефіцієнт В приймаємо рівним 2.

Таким чином отримаємо

to= 350*2/(78*0,8) = 11,23 (люд-год).

Розрахунок витрат праці на розробку алгоритму.

Витрати праці на розробку алгоритму рішення задачі:

tа = Q/(60…75*K)

tа = 350/70*0.8=6,25 (люд-год).

Розрахунок витрат праці на розробку блок-схеми.

Витрати праці на розробку блок-схеми алгоритму рішення задачі обчислимо таким чином:

tб= Q/(60…75*K)

tб = 350/71*0.8=6,16 (люд-год).

Розрахунок витрат праці на складання програми.

Витрати праці на складання програми по готовій блок-схемі обчислимо таким чином:

tп= Q/(60…75*K)

tп = 350/72*0.8=6,18 (люд-год).

Розрахунок витрат праці на відладку програми.

Витрати праці на відладку програми на ЕОМ при комплексній відладці завдання:

tот=1.5* tAот,

де tAот - витрати праці на відладку програми на ЕОМ при автономній відладці одного завдання;

tAот= Q/(40…50*K)

tAот = 350/(48*0.8)=9,12 (люд-год)

Звідси tот=1.5*9,12=13,68 (люд-год).

Розрахунок витрат праці на підготовку документації.

Витрати праці на підготовку документації по завданню визначаються:

tд= tдр+ tдо,

де

tдр - витрати праці на підготовку матеріалів в рукопису;

tдо - витрати на редагування, друк і оформлення документації;

tдр= Q/(150…200*K)

tдр = 350/(180*0.8) = 2,43 (люд-год)

tдо=0.75*tдр

tдо =0.75*2,43=1,82 (люд-год)

Звідси

tд=2,43+1,82=4,25 (люд-год).

Отже, загальну трудомісткість програмного продукту можна розрахувати:

t = 11,23 +6,25 +6,16 +6,18 +13,68+4,25 =47.75(люд-год).

Розрахунок середньої зарплати програміста.

Середня зарплата програміста в сучасних ринкових умовах може варіюватися в широкому діапазоні. Для розрахунку візьмемо середню годинну оплату праці, яка складає Тчас.=8 грн/година, що означає 1408 грн/мес при 8-ми годинному робочому дні і 5-ти денному робочому тижню.

Витрати на оплату праці програміста складаються із зарплати програміста і нарахувань на соціальні потреби. Нарахування на соціальні потреби включають:

33,2% - пенсійний фонд;

1,4% - соціальне страхування;

1.6% - відрахування до державного фонду зайнятості на випадок безробіття;

1% - на соціальне страхування від нещасного випадку на виробництві і професійних захворювань, які спричинили втрату працездатності.

Разом нарахування на соціальні потреби складають 37,2%.

Тобто 1408грн*37,2%=520,96 грн

Звідси витрати на оплату праці програміста складають:

Ззпспп= 1408+520,96=1928,96 грн.

Витрати на оплату машинного часу. Витрати на оплату машинного часу при відладці програми визначаються шляхом множення фактичного часу відладки програми на ціну машино-години орендного часу:

Змвспп час*tэвм,

де

Счас - ціна машино-години орендного часу, грн/год;

tэвм - фактичний час відладки програми на ЕОМ;

Розрахунок фактичного часу відладки.

Фактичний час відладки обчислимо за формулою:

tеом = tп + tдо + tот ;

tеом =6,18 +1,82 +13,68 = 21,68 часа

Розрахунок ціни машино-години.

Ціну машино-години знайдемо по формулі:

Сгод = Зеомеом,

де

Зеом - повні витрати на експлуатацію ЕОМ на протязі року;

Теом - дійсний річний фонд часу ЕОМ, год/рік.

Розрахунок річного фонду часу роботи ПЕОМ.

Загальна кількість днів в році - 365. Число святкових і вихідних днів - 114(10 святкових і 52*2- вихідні).

Час простою в профілактичних роботах визначається як щотижнева профілактика по 3 години.

Разом річний фонд робочого часу ПЕОМ складає:

Теом = 8*(365-114)-52*3=1852 год.

Розрахунок повних витрат на експлуатацію ЕОМ.

Повні витрати на експлуатацію можна визначити по формулі:

Зеом = (Ззп+ Зам+ Зэл+ Здм+ Зпр+ Зін),

де,

Ззп - річні витрати на заробітну плату обслуговуючого персоналу, грн/рік;

Зам - річні витрати на амортизацію, грн/рік;

Зэл - річні витрати на електроенергію, споживану ЕОМ, грн/рік;

Здм - річні витрати на допоміжні матеріали, грн/рік;

Зпр - витрати на поточний ремонт комп'ютера, грн/рік;

Зін - річні витрати на інші і накладні витрати, грн/рік.

Амортизаційні відрахування.

Річні амортизаційні відрахування визначаються по формулі:

Замбал*Нам,

де Сбал - балансова вартість комп'ютера, грн/шт.;

Нам - норма амортизації, %;

Нам =25%.

Балансова вартість ПЕОМ включає відпускну ціну, витрати на транспортування, монтаж устаткування і його відладку:

Сбал = Срин +Зуст ;

де

Срин - ринкова вартість комп'ютеру, грн/шт.,

Зуст - витрати на доставку і установку комп'ютера, грн/шт;

Комп'ютер, на якому велася робота, був придбаний за ціною

Срин =5000 грн, витрати на установку і наладку склали приблизно 10% від вартості комп'ютера.

Зуст = 10%* Срин

Зуст =0.1*5000=500 грн.

Звідси, Сбал = 5000 +500 =5500 грн./шт.;

а Зам=5500*0,25= 1375 грн/год.

Розрахунок витрат на електроенергію.

Вартість електроенергії, споживаної за рік, визначається по формулі:

Зэл = Реом * Теом * Сел * А,

де

Реом - сумарна потужність ЕОМ,

Теом - дійсний річний фонд часу ЕОМ, год/рік;

Сел - вартість 1кВт*год електроенергії;

А - коефіцієнт інтенсивного використання потужності машини.

Згідно технічному паспорту ЕОМ Реом =0.22 кВт, вартість 1кВт*год електроенергії для споживачів Сел =0,2436 грн., інтенсивність використання машини А=0.98.

Тоді розрахункове значення витрат на електроенергію:

Зел = 0.22 * 1852* 0.2436* 0.30 = 29,78 грн.

Розрахунок витрат на поточний ремонт.

Витрати на поточний і профілактичний ремонт приймаються рівними 5% від вартості ЕОМ:

Зтр = 0.05* Сбал

Зтр = 0.05* 5500 = 275 грн.

Розрахунок витрат на допоміжні матеріали.

Витрати на матеріали, необхідні для забезпечення нормальної роботи ПЕВМ, складають близько 1 % від вартості ЕОМ:

Звм =0,01* 5500 =55 грн.

Інші витрати по експлуатації ПЕОМ.

Інші непрямі витрати, пов'язані з експлуатацією ПЕОМ, складаються з вартості послуг сторонніх організацій і складають 5% від вартості ЕОМ:

Зпр = 0,05* 5500 =275 грн.

Річні витрати на заробітну плату обслуговуючого персоналу.

Витрати на заробітну плату обслуговуючого персоналу складаються з основної заробітної плати, додаткової і відрахувань на заробітну плату:


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

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