Федеральное Агентство Связи Ордена Трудового Красного Знамени федеральное государственное бюджетное образовательное учреждение высшего образования «Московский технический университет связи и информатики»
Заочный Общетехнический Факультет
Кафедра информатики
Выполнила: Иванов Иван, студент группы БСТ17хх
Содержание
1. Задание на разработку проекта и вариант задания 3
2. Формализация и уточнение задания 4
3. Разработка приложения 5
3.1. Графический интерфейс пользователя 5
3.2. Составление таблицы используемых объектов и их свойств 5
3.3. Схемы алгоритмов процедур пользователя 7
3.4. Программный код с использованием процедур 10
4. Результаты выполнения проекта с доказательством правильности работы программы 13
5. Выводы 15
Составить схему алгоритма обработки строк в соответствии с индивидуальным заданием и, если необходимо, провести предварительную формализацию задания.
Разработать интерфейс пользователя.
Написать программный код проекта, причем обмен данными между пользовательскими процедурами должен осуществляться через параметры, без использования глобальных переменных. Событийная процедура должна содержать только операторы вызова пользовательских процедур
Подготовить тесты для контрольного решения задачи.
Получить решение.
Задание (Вариант 24):
Из строки, содержащей корректно заданную дату в формате "dd.mm.yy", где dd - день, mm - месяц, yy - год, получить строку с датой, отстоящей от заданной на n дней вперед, в том же формате.
Исходные данные: строка символов, целое число. Строка символов и число будут вводиться с помощью TextBox-ов.
Обработка исходной строки будет происходить следующим образом: поскольку у нас есть условие ввода информации (формат ввода) в поле исходных данных, мы будем обращаться к строке и получать данные с необходимых нам позиций символов.
Разработаем проверку существования введённой даты в реальном календаре.
Используемые элементы:
label - ля поясняющих надписей
textBox - для ввода и вывода данных
button - для запуска и окончания программы
Интерфейс представлен на Рисунок 1.
Рисунок 1 - Графический интерфейс пользователя
Используемые объекты и их свойства приведены в Таблица 1.
Таблица 1- Используемые объекты и их свойства
Объект |
Имя объекта |
Свойство |
Значение свойства |
Форма |
Form1 |
FormBorderStyle |
FixedSingle |
Text |
ЛР-4-09. Обработка строковых данных. |
||
Метка |
label1 |
BackColor |
PaleGreen |
Font |
Microsoft Sans Serif; 8,25pt |
||
Text |
Введите дату в формате (dd.mm.yy) |
||
Метка |
label2 |
BackColor |
PaleGreen |
Font |
Microsoft Sans Serif; 8,25pt |
||
Text |
Результат должен отстоять на
n = дней вперёд |
||
Метка |
label3 |
BackColor |
Info |
Font |
Microsoft Sans Serif; 8,25pt |
||
Text |
Результат работы программы: |
||
Кнопка |
startButton |
Font |
Constantia; 12pt |
Text |
Выполнить |
||
Кнопка |
exitButton |
Font |
Constantia; 12pt |
Text |
Закрыть |
||
Текстовое поле |
dateInputTB |
Font |
Microsoft Sans Serif; 8,25pt |
Текстовое поле |
shiftInputTB |
Font |
Microsoft Sans Serif; 8,25pt |
Текстовое поле |
dateOutputTB |
Font |
Microsoft Sans Serif; 8,25pt |
|
|||
Метод startButton _Cick().
Метод обрабатывает нажатие кнопки “Выполнить”. Блок-схема этого метода представлена на Рисунок 2.
Рисунок 2 - Блок-схема метода startButton _Cick()
Метод checkDate().
Метод осуществляет ввода данных из строки в соответствующие переменные, а так же выполняет проверку существования полученной даты. Блок-схема этого метода представлена на Рисунок 3.
Рисунок 3 - Блок-схема метода checkDate()
Метод TimeMachine().
Метод обрабатывает исходную дату и выполняет условие задания – двигает дату на n дней вперёд. Блок-схема этого метода представлена на Рисунок 4.
Рисунок 4 - Блок-схема метода TimeMachine()
Программный код представлен ниже.
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;
namespace Lab_09
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void startButton_Click(object sender, EventArgs e)
{
int dd = 0, mm = 0, yy = 0, shift;
string str = "";
try
{
str = dateInputTB.Text;
shift = Convert.ToInt32(shiftInputTB.Text);
}
catch
{
MessageBox.Show("Ошибка ввода данных, повторите попытку", "Ошибка!", MessageBoxButtons.OK);
return;
}
if (str.Length > 8)
{
MessageBox.Show("Ошибка ввода данных, повторите попытку", "Ошибка!", MessageBoxButtons.OK);
return;
}
checkDate(str, ref dd, ref mm, ref yy);
int dd2 = dd, mm2 = mm, yy2 = yy;
TimeMachine(ref dd2, ref mm2, ref yy2, shift);
dateOutput(dd2, mm2, yy2, dateOutputTB);
}
private void exitButton_Click(object sender, EventArgs e)
{
Application.Exit();
}
private void checkDate (string str, ref int dd, ref int mm, ref int yy)
{
dd = count(str, 0);
mm = count(str, 3);
yy = count(str, 6);
if (!UniversalCalendar(dd, mm, yy))
{
MessageBox.Show("Ошибка ввода даты, данной даты не существует", "Ошибка!", MessageBoxButtons.OK);
}
}
private int count (string str, int i)
{
try
{
return (Convert.ToInt32(str.Substring(i,1)) * 10 + Convert.ToInt32(str.Substring(i + 1,1)));
}
catch
{
MessageBox.Show("Ошибка ввода даты, проверьте правильность ввода", "Ошибка!", MessageBoxButtons.OK);
return 0;
}
}
private void TimeMachine(ref int dd2, ref int mm2, ref int yy2, int shift)
{
int doc = 0;
dd2 += shift;
while (!UniversalCalendar(dd2, mm2+doc, yy2))
{
dd2 -= HowManyDaysInMonth(mm2+doc, yy2);
doc++;
if (mm2 + doc > 12)
{
mm2 = 1;
doc = 0;
yy2++;
if (yy2 > 99)
yy2 = 0;
}
}
mm2 += doc;
}
private void dateOutput(int dd, int mm, int yy, TextBox t)
{
t.Text = lastCheck(dd) + "." + lastCheck(mm) + "." + lastCheck(yy);
}
private string lastCheck(int xx)
{
if (xx < 10)
return ("0" + xx).ToString();
else
return xx.ToString();
}
private bool UniversalCalendar(int dd, int mm, int yy)
{
if ((mm < 0 | mm > 12) |
(dd < 0 |
((dd > 31 && ((mm == 1) | (mm == 3) | (mm == 5) | (mm == 7) | (mm == 8) | (mm == 10) | (mm == 12))) |
(dd > 30 && (mm == 2) | (mm == 4) | (mm == 6) | (mm == 9) | (mm == 11)) |
((dd > 29) && (mm == 2) && (yy % 4 == 0)) |
((dd > 28) && (mm == 2) && (yy % 4 != 0)))))
{
return false;
}
else
return true;
}
private int HowManyDaysInMonth(int mm, int yy)
{
if ((yy % 4 != 0) && (mm == 2))
return 28;
else if ((yy % 4 == 0) && (mm == 2))
return 29;
else if ((mm == 1) | (mm == 3) | (mm == 5) | (mm == 7) | (mm == 8) | (mm == 10) | (mm == 12))
return 31;
else /*if ((mm == 2) | (mm == 4) | (mm == 6) | (mm == 9) | (mm == 11))*/
return 30;
}
//Функции для реализации подсказки формата записи в текстовом поле
private void dateInputTB_Enter(object sender, EventArgs e)
{
if (dateInputTB.Text == "dd.mm.yy")
{
dateInputTB.Text = "";
dateInputTB.ForeColor = Color.Black;
}
}
private void dateInputTB_Leave(object sender, EventArgs e)
{
if (dateInputTB.Text == "")
{
dateInputTB.Text = "dd.mm.yy";
dateInputTB.ForeColor = Color.Silver;
}
}
}
}
Для проверки работы программы были подготовлены две тестовых строки.
Тест 1.
Исходная строка: ”05.04.98”, сдвиг на 31 день.
Результат выполнения представлен на Рисунок 5.
Рисунок 5 - Результат работы программы
Тест 2.
Исходная строка: “25.02.19”, сдвиг на 1460 дней (4 года).
Результат выполнения представлен на Рисунок 6.
Рисунок 6 - Результат работы программы
Как мы видим, программа верно считает сдвиг даты, и даже учитывает високосные года.
Выводы
Формализовано и уточнено задание.
Разработан графический интерфейс пользователя.
Составлена таблица используемых объектов и их свойств.
Разработана схема алгоритма решения задачи.
Написан программный код на языке C#.
Подготовлены тестовые данные для решения задачи. Протестирована работа приложения (см. Результаты выполнения проекта с доказательством правильности работы программы). Полученные результаты верны.
Москва, 2018