ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 05.12.2023
Просмотров: 108
Скачиваний: 2
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
Из-за наличия большого числа минусов в данном варианте был разработан новый графический и пользовательский интерфейс (Рис. 6).
Рис. 5. Вариант графического и пользовательского интерфейса
Рис. 6. Выбранный графический и пользовательский интерфейс
-
технологический раздел
-
Определение структуры и состава программной системы
-
В программе использованы глобальные и локальные переменные, стандартные и пользовательские методы. Рассмотрим состав программной системы подробнее.
Диаграмма классов представлена на Рис. 7.
Рис. 7. Диаграмма классов
Глобальные переменные:
-
List- отвечает за запись в коллекцию.
Локальные переменные:
-
text – принимает данные о расходах, доходах; -
dt – принимает данные о дате време расходов; -
summa –принимает данные о деньгах в расходах, доходах; -
flag-принимает данные о количестве записей в коллекции; -
summa_dohoda-принимает данные о суммарных доходах; -
summa_rashoda-принимает данные о суммарных расход.
Пользовательские методы:
-
public void unvizible() – метод скрывающий все кнопки; -
private void save_zap_Click – метод добавляющий запись в коллекцию после ввода и нажатие мыши; -
private void Form1_Load(object sender, EventArgs e)- метод открывающий нужное окно; -
private void show_zap_Click(object sender, EventArgs e)- метод показывающий все записи в выбранной коллекции; -
private void button3_Click(object sender, EventArgs e)- метод удающий записи.
-
Разработка алгоритмов отдельных подзадач
В ходе разработки программного продукта был создан метод для поиска необходимой информации: private void show_zap_Click. Рассмотрим его алгоритм (Рис. 8).
Рис. 8. Алгоритм метода
После объявления и присвоения начальных значений необходимым переменным в работу включается цикл «for». Условия для цикла «if» задаются пользователем вручную через рабочие поля. Как только метод находит нужные данные, цикл прекращает свою работу. Если искомая информация не найдена, на экран выводится соответствующее сообщение.
-
Руководство пользователя
-
Общие сведения о программе
-
Программа «Cемейный бюджет» разработана так, что любой пользователь смог разобраться в работе с приложением. В данной программе можно хранить следующие данные: название покупки, стоимость, дата покупки, дату получения доходов и в каком количестве. Приложение может использоваться для контроля финансов семьи, и планирования покупок..
-
Инструкция по работе
Данная программа не требует установки на жесткий диск компьютера. Для того чтобы ее открыть, достаточно запустить файл программы. Приложение имеет 3 рабочих окна (рис 9)
Взаимодействие пользователя с программной средой осуществляется с помощью 4 кнопок для добавления доходов, расходов, построение диаграммы, очищение всех данных.
Рис. 9. Поле ввода дохода
Рис 10 Поле ввода расходов
Рис11 Поле построения графика
После нажатия клавиш при вводе данных, они запоминаются в специально отведенный файл
-
Экспериментальный раздел
-
Виды контроля качества разрабатываемого ПО
-
Виды контроля качества разрабатываемого ПО
Тестирование программы – это этап, на котором проверяется, как ведет себя программа на как можно большем количестве входных наборов данных, в том числе и на заведомо неверных.
Основные принципы организации тестирования:
-
необходимой частью каждого теста должно являться описание ожидаемых результатов работы программы, чтобы можно было быстро выяснить наличие или отсутствие ошибки в ней; -
следует по возможности избегать тестирования программы ее автором, т.к. кроме уже указанной объективной сложности тестирования для программистов здесь присутствует и тот фактор, что обнаружение недостатков в своей деятельности противоречит человеческой психологии (однако отладка программы эффективнее всего выполняется именно автором программы); -
по тем же соображениям организация - разработчик программного обеспечения не должна “единолично ” его тестировать (должны существовать организации, специализирующиеся на тестировании программных средств); -
должны являться правилом доскональное изучение результатов каждого теста, чтобы не пропустить малозаметную на поверхностный взгляд ошибку в программе; -
необходимо тщательно подбирать тест не только для правильных (предусмотренных) входных данных, но и для неправильных (непредусмотренных); -
следует сохранять использованные тесты (для повышения эффективности повторного тестирования программы после ее модификации или установки у заказчика); -
тестирования не должно планироваться исходя из предположения, что в программе не будут обнаружены ошибки (в частности, следует выделять для тестирования достаточные временные и материальные ресурсы); -
следует учитывать так называемый “принцип скопления ошибок”: вероятность наличия не обнаруженных ошибок в некоторой части программы прямо пропорциональна числу ошибок, уже обнаруженных в этой части;
-
.Методика проведения и результаты тестирования
Тестирование является важным этапом в разработке программы. Требовалось добиться взаимосвязи таких составляющих, как надёжность, практичность, эффективность, мобильность, функциональность. Тем не менее, при разработке программного продукта допускались различные ошибки:
-
применение переменных без преобразований типа данных; -
при работе с индексами строк были допущены ошибки, которые приводили к неправильной работе программы. -
некорректные условия в циклах; -
использовались несколько циклов подряд, вместо одного, что требовало оптимизации программного кода;
Для нахождения такого рода ошибок применялось модульное тестирование, особенностью которого является разбиение всего программного кода на минимально возможный для тестирования компонент, например, отдельный класс или метод. Цель модульного тестирования – изолировать отдельные части программы и показать, что по отдельности эти части работоспособны. Такое тестирование облегчает обнаружение и устранение ошибок.
-
Методы и способы устранения ошибок
Отладка программы – самый трудоемкий этап. Его цель – проверка синтаксической и логической правильности программы, а также определение того, что программа функционирует на всем диапазоне допустимых данных.
В процессе отладки программы выделяются следующие этапы.
-
Трансляция. При трансляции выполняется перевод программы, понятной человеку, на язык, понятный компьютеру. Если цель трансляции – преобразование всего исходного текста на внутренний язык компьютера (т.е. получение некоторого нового кода) и только, то такая трансляция называется также компиляцией. Исходный текст называется также исходной программой или исходным модулем, а результат компиляции – объектным кодом или объектным модулем. Если же трансляции подвергаются отдельные операторы исходных текстов и при этом полученные коды сразу выполняются, такая трансляция называется интерпретацией. Поскольку трансляция выполняется специальными программными средствами – компиляторами или интерпретаторами соответственно. -
Тестирование. Целью является определение работоспособности программы на всем требуемом диапазоне исходных данных. Программистом составляется представительная выборка исходной информации, которая позволит определить корректность программы при любых входных параметрах. -
Выполнение программы с целью нахождения логических ошибок. Осуществляется после успешной компоновки или по ходу интерпретации каждого оператора. При этом выявляются такие ошибки, как, например, деление на ноль или вычисление логарифма отрицательного числа. Здесь же проверяется корректность описания используемых переменных, а также законченность циклов.
-
Отладка выявленных ошибок, обнаруженных при тестировании
Во время выполнения отладки, были использованы следующие методы:
• unit тестирование;
• анализ кода без исполнения программы;
• запуск программы из под отладчика.
Все синтаксические ошибки были исправлены при компиляции проекта, учитывая синтаксические особенности среды программирования .NET.
Отладка ряда ошибок прошла успешно, были внесены изменения в интерфейс программы, а также были предусмотрены некоторые исключительные ситуации.В результате тестирования и отладки программы были обнаружены и исправлены следующие ошибки:
-
переменные, требующие изменения типа данных, были преобразованы; -
была проведена оптимизация программного кода для каждого из методов в отдельности.
Заключение
Работа выполнена в языке С#, прочно вошедшем в мир программирования в 1998 году являющийся хорошим языком программирования, к которому обращаются как прикладные программисты, так и системные.
В описании работы присутствует руководство программиста по запуску программы, а также руководство пользователя по эксплуатации программы.
Выполненный в процессе выполнения курсового проекта программный продукт, был проверен на соответствие требованиям технического задания, и готов к эксплуатации.
Результаты работы можно использовать в контроле бюджета семьи.
При разработке курсового проекта был приобретен опыт работы с языком программирования, изучен синтаксис данного языка, основные конструкции.
Список использованных источников
-
Павловская Т. А. C#. Программирование на языке высокого уровня. Изд.: Питер, 2009. – 432 с. -
Дейтел Х. C# в подлиннике. Наиболее полное руководство. – Изд.: БХВ-Петербург, 2008. – 1056 с. -
Троелсен Э. Язык программирования C# 2010 и платформа .NET 4. – Изд.: Вильямс, 2011. – 1392 с. -
Нейгел К., Ивьен Б., Глинн Д., Уотсон К., Скиннер М. C# 4.0 и платформа .NET 4 для профессионалов. – Изд.: Питер, 2011. – 1440 с.
Приложения
Приложение 1
Листинг программы
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
namespace sasha_kursach_egednev
{
public partial class Form1 : Form
{
[SerializableAttribute] //говорим что будем серриализовать
struct zapis_rashoda//стурктура отвечающая за расход
{
public string text;//наименовние расхода
public DateTime dt;//дата время расхода
public double summa;//сколько денег ушло
}
[SerializableAttribute]
struct zapis_dohoda//доход
{
public double summa;//сколько денег пришло
public DateTime dt;//когда
}
//для доходов и расходов свои коллекции
List
zapis_rashoda zp;//переменная для текущего расхода
List
zapis_dohoda zp_d;//текущий доход
public void unvizible()//своя процедура крывваем все гроупбоксы
{
groupBox1.Visible = groupBox2.Visible = groupBox3.Visible =
groupBox4.Visible = groupBox5.Visible = groupBox6.Visible = groupBox7.Visible = false;
}
public Form1()
{
InitializeComponent();
}
private void save_zap_Click(object sender, EventArgs e)
{
//будем серриализовать
BinaryFormatter bf = new BinaryFormatter();
FileStream fs = new FileStream("zapis_rashoda.zap",FileMode.OpenOrCreate, FileAccess.ReadWrite);
zp.text = richTextBox1.Text;//в поле текст текущей коробки вносим значение которое ввели в текст боксе
zp.dt = dateTimePicker1.Value;//считали значение даты времени
zp.summa = Convert.ToDouble(richTextBox3.Text);//считываем поле сумма
zapisi_rashoda.Add(zp);//добавили эту записть в колеекцию
bf.Serialize(fs, zapisi_rashoda);//серриализация
fs.Flush();//запись в файл
fs.Close();//закрытие файла
//очищаем поля ввода
richTextBox1.Clear();
richTextBox3.Clear();
}
private void Form1_Load(object sender, EventArgs e)//при закрузке формы
{
//начальная позиция всех гроуп боксов
//верх
groupBox1.Top = groupBox2.Top = groupBox3.Top =
groupBox4.Top = groupBox5.Top = groupBox6.Top = groupBox7.Top =
label3.Top + label3.Height + 10;
//лево
groupBox1.Left = groupBox2.Left = groupBox3.Left =
groupBox4.Left = groupBox5.Left = groupBox6.Left = groupBox7.Left = 15;
if (File.Exists("zapis_rashoda.zap"))//если уже существует файл с записями то считываем из него
{
//дессериалтзация
BinaryFormatter bf = new BinaryFormatter();
FileStream fs = new FileStream("zapis_rashoda.zap", FileMode.OpenOrCreate, FileAccess.ReadWrite);
// записываем преобразованные 0 и 1 в бесконечный массив
zapisi_rashoda = (List
fs.Close();//закрываем файл
}
if (File.Exists("zapis_dohoda.zap"))//если уже существует файл с записями то считываем из него
{
//тоже самое
BinaryFormatter bf = new BinaryFormatter();
FileStream fs = new FileStream("zapis_dohoda.zap", FileMode.OpenOrCreate, FileAccess.ReadWrite);
zapisi_dohoda = (List
fs.Close();
}
}
private void show_zap_Click(object sender, EventArgs e)
{
//очищаем поля вывода
richTextBox2.Clear();
richTextBox4.Clear();
//идём по массиву коробок(по коллекции)
for (int i = 0; i < zapisi_rashoda.Count; i++)
{
//берём каждый элемент коллекции и проеряем совпадает ли его значение даты с текущей
if (zapisi_rashoda[i].dt.Date == dateTimePicker3.Value.Date)
{
//добавляем в поля вывода
richTextBox2.Text +=zapisi_rashoda[i].text + "\n";
richTextBox4.Text += Convert.ToString(zapisi_rashoda[i].summa) + " руб.\n";
}
}
}
private void button3_Click(object sender, EventArgs e)
{
bool flag;//отвечает за наличие записей в колеекции
do//удаляем пока есть что удалять
{
flag = true;
for (int i = 0; i < zapisi_rashoda.Count; i++)
{
if (zapisi_rashoda[i].dt.Date == dateTimePicker2.Value.Date)//если дата совпадает с текущей
{
zapisi_rashoda.RemoveAt(i);//удаляем запись
flag = false;
}
}
} while (flag == false);
//серриализуем и записываем в файл
BinaryFormatter bf = new BinaryFormatter();
FileStream fs = new FileStream("zapis_rashoda.zap", FileMode.OpenOrCreate, FileAccess.ReadWrite);
bf.Serialize(fs, zapisi_rashoda);
fs.Flush();
fs.Close();
}
private void создатьЗаписьToolStripMenuItem1_Click(object sender, EventArgs e)
{
unvizible();
label3.Left = 137;
groupBox1.Visible = true;
CenterToScreen();
}
private void удалитьЗаписьToolStripMenuItem1_Click(object sender, EventArgs e)
{
unvizible();
label3.Left = 137;
groupBox3.Visible = true;
CenterToScreen();
}
private void очиститьВсеЗаписиToolStripMenuItem_Click(object sender, EventArgs e)
{
richTextBox2.Clear();
richTextBox4.Clear();
richTextBox6.Clear();
zapisi_dohoda.Clear();
zapisi_rashoda.Clear();
BinaryFormatter bf = new BinaryFormatter();
FileStream fs = new FileStream("zapis_rashoda.zap", FileMode.OpenOrCreate, FileAccess.ReadWrite);
bf.Serialize(fs, zapisi_rashoda);
fs.Flush();
fs.Close();
BinaryFormatter bf2 = new BinaryFormatter();
FileStream fs2 = new FileStream("zapis_dohoda.zap", FileMode.OpenOrCreate, FileAccess.ReadWrite);
bf2.Serialize(fs2, zapisi_dohoda);
fs2.Flush();
fs2.Close();
}
private void показатьЗаписьToolStripMenuItem1_Click(object sender, EventArgs e)
{
unvizible();
label3.Left = 137;
groupBox2.Visible = true;
CenterToScreen();
}
private void button4_Click(object sender, EventArgs e)
{
//подготавливаем для серииализации
BinaryFormatter bf = new BinaryFormatter();
FileStream fs = new FileStream("zapis_dohoda.zap", FileMode.OpenOrCreate, FileAccess.ReadWrite);
zp_d.dt = dateTimePicker6.Value;//заполняем поле даты охода
zp_d.summa = Convert.ToDouble(richTextBox7.Text);//поле количество дохода(Сколько денег_
zapisi_dohoda.Add(zp_d);//записываем в коллекцию
bf.Serialize(fs, zapisi_dohoda);
fs.Flush();
fs.Close();
richTextBox7.Clear();
}
private void создатьЗаписьToolStripMenuItem_Click(object sender, EventArgs e)
{
unvizible();//скрываются все гроупбоксы
groupBox6.Visible = true;//окрывается нужный
label3.Left = 25;//сдвигается поле приглашения
CenterToScreen();//форма помещается в центре экрана
}
private void показатьЗаписьToolStripMenuItem_Click(object sender, EventArgs e)
{
unvizible();
groupBox5.Visible = true;
label3.Left = 25;
CenterToScreen();
}
private void удалитьЗаписьToolStripMenuItem_Click(object sender, EventArgs e)
{
unvizible();
groupBox4.Visible = true;
label3.Left = 25;
CenterToScreen();
}
private void button2_Click(object sender, EventArgs e)
{
richTextBox6.Clear();//очищаем поле вывода
//проходим по коллекции и выводим только те элементы у которых дата совпадает с нужной
for (int i = 0; i < zapisi_dohoda.Count; i++)
{
if (zapisi_dohoda[i].dt.Date == dateTimePicker5.Value.Date)
{
richTextBox6.Text += Convert.ToString(zapisi_dohoda[i].summa) + " руб.\n";
}
}
}
private void button1_Click(object sender, EventArgs e)
{
bool flag;//уудаление записей тоже самое
do
{
flag = true;
for (int i = 0; i < zapisi_dohoda.Count; i++)
{
if (zapisi_dohoda[i].dt.Date == dateTimePicker4.Value.Date)
{
zapisi_dohoda.RemoveAt(i);
flag = false;
}
}
} while (flag == false);
//сохранение изменений в файл
BinaryFormatter bf = new BinaryFormatter();
FileStream fs = new FileStream("zapis_dohoda.zap", FileMode.OpenOrCreate, FileAccess.ReadWrite);
bf.Serialize(fs, zapisi_dohoda);
fs.Flush();
fs.Close();
}
private void графикДоходыРасходыToolStripMenuItem_Click(object sender, EventArgs e)
{
unvizible();
label3.Left = 25;
groupBox7.Visible = true;
CenterToScreen();
}
private void button5_Click(object sender, EventArgs e)
{
double summa_dohoda=0;
double summa_rashoda = 0;
//считается суммарные доходы
for (int i = 0; i < zapisi_dohoda.Count; i++)
{
if (zapisi_dohoda[i].dt.Date == dateTimePicker7.Value.Date)
{
summa_dohoda += zapisi_dohoda[i].summa;
}
}
//суммарные расходы за день
for (int i = 0; i < zapisi_rashoda.Count; i++)
{
if (zapisi_rashoda[i].dt.Date == dateTimePicker7.Value.Date)
{
summa_rashoda += zapisi_rashoda[i].summa;
}
}
Form fr = new Form2();//переменная для открытия новой формы
fr.Text = Convert.ToString(summa_dohoda) + " " + Convert.ToString(summa_rashoda);//в поле заголовка новой формы передаю суммарный расход и доход
fr.Show();//показать новую форму
}
}
}