Статистика фигурного катания
Введение
Данное приложение было разработано для подсчета
статистики фигурного катания. В качестве примера были выбраны статистики
олимпийских игр 2006 в Турине и 2010 в Ванкувере.
Постановка задачи
Необходимо разработать приложение для Windows,
реализующее расчет и визуализацию статистики фигурного катания, с
использованием интегрированной среды разработки Microsoft Visual Studio C#.
Подход к решению
В этом проекте использовались реальные расчетные
данные статистики олимпиад и вычислялись они следующим образом: общий результат
является сумой баллов короткой и произвольной программ. В свою очередь,
короткая и произвольная программы получаются в результате суммирования
технических результатов и оценок компонентов.
Технический результат - это результат, полученный
судьями за техничное исполнение (точность, синхронность, качество движений и
т.д.) всех элементов программы и получается в результате суммирования всех
средних оценок судей за каждый элемент.
Оценка компонентов - это оценка, полученная
судьями за каждый элемент программы с точки зрения артистичности, ритмики,
музыкальности исполнения и т.д. Она вычисляется путем суммирования всех средних
оценок судей за каждый элемент.
Теоретическая часть
В графическом представлении расчеты выглядят
следующим образом:
Рис. 1
Для реализации интерфейса пользователя
предлагается следующее решение:
Проект включает в себя три графические формы.
Первая форма представляет собой главное меню программы, в котором
осуществляется отображение результатов расчетов. Вторая форма выводит помимо
рассчитанных данных еще и исходные. Третья форма осуществляет графическую
визуализацию данных в виде гистограмм.
Форма «Form1»
Рис. 2
В главном меню приложения расположены:
Выплывающий список выбора олимпийских игр (1)
Выплывающий список выбора разновидности катания
(2)
Ссылка открытия окна графической визуализации
(3)
Таблица статистики (4)
Форма «Form2»
Рис. 3
На данной форме расположены:
Таблица исходных данных(1).
Форма «Form3» (2D)
Рис. 4
На данной форме расположены:
Кнопка перевода графики в 3-х мерное измерение
Элемент графической визуализации
Форма «Form3» (3D)
Рис. 5
На данной форме расположены: см. «Форма «Form3»
(3D)»
Диаграмма классов
Рис. 6
Экспериментальная часть
Тестирование
Таблица 1 - «Запуск приложения»
Процедура
проверки
|
Ожидаемый
результат
|
Запустить
исполняемый файл проекта Курсовая работа (Фигурное катание).exe
|
Приложение
запускается, открывается окно главного меню (Рисунок №1)
|
Таблица 2 - «Просмотр общих сведений статистики»
Процедура
проверки
|
Ожидаемый
результат
|
Выбрать
олимпийские игры и тип катания из выплывающих списков
|
Таблица
заполняется данными статистики, ссылка «Графическое представление данных»
разблокируется (П1.1)
|
Таблица 3 - «Просмотр подробных сведений
статистики»
Процедура
проверки
|
Ожидаемый
результат
|
Выполнить
действия таблицы №2
|
Таблица
заполняется данными статистики, ссылка «Графическое представление данных»
разблокируется (П1.1)
|
Дважды
кликнуть на любого фигуриста из таблицы
|
Открывается
окно с подробной информацией о каждом выступлении фигуриста (П1.2)
|
Таблица 4 - «Просмотр графического представления
статистики в 2D»
Процедура
проверки
|
Ожидаемый
результат
|
Выполнить
действия таблицы №2
|
Таблица
заполняется данными статистики, ссылка «Графическое представление данных»
разблокируется (П1.1)
|
Кликнуть
на ссылку «Графическое представление данных»
|
Открывается
окно с построенной гистограммой (П1.3)
|
Таблица 5 - «Просмотр графического представления
статистики в 3D»
Процедура
проверки
|
Ожидаемый
результат
|
Выполнить
действия таблицы №3
|
Открывается
окно с построенной гистограммой (П1.3)
|
Гистограмма
представит данные в 3-х мерной плоскости (П1.4)
|
Протокол тестирования
Процедура
проверки
|
Ожидаемый
результат
|
Запуск
приложения
|
Выполнено.
Замечаний нет
|
Просмотр
общих сведений статистики
|
Выполнено.
Замечаний нет
|
Просмотр
подробных сведений статистики
|
Выполнено.
Замечаний нет
|
Просмотр
графического представления статистики в 2D
|
Выполнено.
Замечаний нет
|
Просмотр
графического представления статистики в 3D
|
Выполнено.
Замечаний нет
|
Руководство пользователя
Запуск приложения
Запустите файл «Курсовая работа (Фигурное
катание).exe» в директории приложения.
Просмотр общих сведений статистики
Выберите олимпийские игры и вид катания из
выплывающих списков
Просмотр подробных сведений статистики
Выведите общие сведения статистики
Дважды кликните на какого либо фигуриста в
таблице
Просмотр графического представления статистики в
2D
Выведите общие сведения статистики
Нажмите ссылку «Графическое представление
данных»
Просмотр графического представления статистики в
3D
Выведите данные в графическом представлении
Установите галочку на кнопке «3D»
Выход из приложения
Нажмите кнопку «X» в верхнем правом углу
главного меню
Примеры работы программы приведены в приложении
№1.
Заключение
В результате выполнения данного курсового
проекта были реализованы следующие пункты:
Разработано программное обеспечение, реализующее
расчет и визуализацию фигурного катания
Разработана программная документация
Проведена отладка и тестирование приложения
По результатам испытаний было выявлено:
Ограничение на работу приложения в системах с
отсутствием установленной программной платформы Microsoft .NET Framework 4
Неудобная работа на мониторах с низким
разрешением.
Таким образом, разработанная программа полностью
соответствует требованиям, изложенным в задании на курсовую работу.
Приложение
программа листинг приложение
статистика
using
System;System.Collections.Generic;System.ComponentModel;System.Data;System.Drawing;System.IO;System.Linq;System.Text;System.Windows.Forms;Курсовая_работа__Фигурное_катание_
{
public partial class Form1 : Form
{Form1()
{();
}Lenght = 90;void
comboBox1_SelectedIndexChanged (object sender, EventArgs e)
{(comboBox2.Text != "")
{.Enabled = true;.Rows.Clear();cl =
new Calculation();<List<string>> Data;(comboBox1.Text == "Олимпийские
игры
2006 (Турин)")
{= cl.ReadData("2006",
comboBox2.Text);
}
{= cl.ReadData("2010",
comboBox2.Text);
}[] a = new string[8];(int i = 0; i
< Data[1].Count; i++)
{[0] = Data[0][i];[1] =
Data[1][i];[2] = Data[2][i];[3] = Data[3][i];[4] = Data[4][i];[5] =
Data[5][i];[6] = Data[6][i];[7] = Data[7][i];.Rows.Add(a);
}
}
}void
comboBox2_SelectedIndexChanged(object sender, EventArgs e)
{(comboBox1.Text != "")
{.Enabled = true;.Rows.Clear();cl =
new Calculation();<List<string>> Data;(comboBox1.Text == "Олимпийские
игры
2006 (Турин)")
{= cl.ReadData("2006",
comboBox2.Text);
}
{= cl.ReadData("2010",
comboBox2.Text);
}[] a = new string[8]; (int i = 0; i
< Data[1].Count; i++)
{[0] = Data[0][i];[1] =
Data[1][i];[2] = Data[2][i];[3] = Data[3][i];[4] = Data[4][i];[5] =
Data[5][i];[6] = Data[6][i];[7] = Data[7][i];.Rows.Add(a);
}.Sort(dataGridView1.Columns[0],
ListSortDirection.Ascending);
}
}void
dataGridView1_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
{f = new Form2();Year;
if (comboBox1.Text == "Олимпийские игры
2006 (Турин)")
}
{= "2010";
}sr = File.OpenText("Олимпиада
" + Year + ".txt");s = "";(s !=
this.dataGridView1.CurrentRow.Cells[2].Value.ToString())
{= sr.ReadLine();
}[] row = { "Имя",
s };.dataGridView1.Rows.Add(row);[0] = "Тип
катания";[1]
= comboBox2.Text;.dataGridView1.Rows.Add(row);[0] = "Страна";[1]
=
this.dataGridView1.CurrentRow.Cells[1].Value.ToString();.dataGridView1.Rows.Add(row);[0]
= "Занятое
место";[1]
= this.dataGridView1.CurrentRow.Cells[0].Value.ToString();.dataGridView1.Rows.Add(row);
row[0] = "Занятое место в короткой
программе";
row[1] =
this.dataGridView1.CurrentRow.Cells[3].Value.ToString();.dataGridView1.Rows.Add(row);
row[0] = "Занятое место в произвольной программе";
row[1] =
this.dataGridView1.CurrentRow.Cells[5].Value.ToString();.dataGridView1.Rows.Add(row);[0]
= "Общие
баллы";[1]
=
this.dataGridView1.CurrentRow.Cells[7].Value.ToString();.dataGridView1.Rows.Add(row);[0]
= "Баллы
короткой
программы";[1]
= this.dataGridView1.CurrentRow.Cells[4].Value.ToString();.dataGridView1.Rows.Add(row);[0]
= "Баллы
произвольной
программы";[1]
=
this.dataGridView1.CurrentRow.Cells[6].Value.ToString();.dataGridView1.Rows.Add(row);.ReadLine();.ReadLine();.ReadLine();
s = sr.ReadLine();[0] = "Короткая
программа, технический результат";
row[1] =
"";.dataGridView1.Rows.Add(row);
int i = 1;(s != "Оценка компонентов")
{[0] = "Средний балл элемента
№"+i+"";
row[1] =
s;.dataGridView1.Rows.Add(row);
s = sr.ReadLine();++;
}[0] = "Короткая программа, оценки
компонентов";
row[1] =
"";.dataGridView1.Rows.Add(row);= sr.ReadLine();= 1;(s != "Произвольная
программа")
{[0] = "Средний балл элемента №" + i +
"";
row[1] =
s;.dataGridView1.Rows.Add(row);= sr.ReadLine();++;
}= sr.ReadLine();
s = sr.ReadLine();[0] = "Произвольная
программа, технический результат";
row[1] =
"";.dataGridView1.Rows.Add(row);
i = 1;(s != "Оценка компонентов")
{[0] = "Средний балл элемента №" + i +
"";
row[1] =
s;.dataGridView1.Rows.Add(row);
s = sr.ReadLine();++;
}[0] = "Произвольная программа, оценки
компонентов";
row[1] =
"";.dataGridView1.Rows.Add(row);= sr.ReadLine();=
1;((s.IndexOf("***") == -1) && (s.IndexOf("///") ==
-1) &&
(s.IndexOf("|||") == -1)
&& (s.IndexOf("\\") == -1) && (s != "11"))
{[0] = "Средний балл элемента №" + i +
"";
row[1] =
s;.dataGridView1.Rows.Add(row);++;= sr.ReadLine();(s == null)
{= "11";
}
}.ShowDialog();
}void timer1_Tick(object sender,
EventArgs e)
{
}void linkLabel1_LinkClicked(object
sender, LinkLabelLinkClickedEventArgs e)
{f = new Form3();(int i = 0; i <
8; i++)
{
f.chart1.Series["Общий результат"]. Points.AddXY(this.dataGridView1.Rows[i].Cells[2].Value.ToString(),
.ToDouble(this.dataGridView1.Rows[i].Cells[7].Value.ToString()));
f.chart1.Series["Короткая программа"].
Points.AddXY(this.dataGridView1.Rows[i].Cells[2].Value.ToString(),.ToDouble(this.dataGridView1.Rows[i].Cells[4].Value.ToString()));.chart1.Series["Произвольная
программа"]. Points.AddXY(this.dataGridView1.Rows[i].Cells[2].Value.ToString(),.ToDouble(this.dataGridView1.Rows[i].Cells[6].Value.ToString()));
}.ShowDialog();
}
}Calculation
{List<List<string>>
ReadData(string YearOlympic, string Type)
{sr = File.OpenText("Олимпиада
" + YearOlympic + ".txt");s1 =
"";<List<string>> Data = new
List<List<string>>();.Add(new List<string>());.Add(new
List<string>());.Add(new List<string>());.Add(new
List<string>());.Add(new List<string>());.Add(new
List<string>());.Add(new List<string>());.Add(new
List<string>());(s1 != null)
{= sr.ReadLine();(s1 != null)
{(s1 == Type)
{= sr.ReadLine();[2].Add(s1);=
sr.ReadLine();[1].Add(s1);
s1 = sr.ReadLine();
s1 = sr.ReadLine();=
sr.ReadLine();EstimatesComponents = 0, TechnicalResult = 0, ShortProgram,
FreeSkating;(s1 != "Оценка компонентов")
{= CalculationData(TechnicalResult,
Convert.ToDouble(s1));= sr.ReadLine();
}= Math.Round(TechnicalResult, 2);=
sr.ReadLine();(s1 != "Произвольная
программа")
{=
CalculationData(EstimatesComponents, Convert.ToDouble(s1));= sr.ReadLine();
}= Math.Round(EstimatesComponents,
2);= TechnicalResult + EstimatesComponents;= Math.Round(ShortProgram, 2);= 0;
EstimatesComponents = 0;= sr.ReadLine();= sr.ReadLine();(s1 != "Оценка
компонентов")
{= CalculationData (TechnicalResult,
Convert.ToDouble (s1));= sr.ReadLine();
}= Math.Round(TechnicalResult, 2);=
sr.ReadLine();
while ((s1.IndexOf("***")
== -1) && (s1.IndexOf("///") == -1) &&
(s1.IndexOf("|||") == -1)
&& (s1.IndexOf("\\") == -1) && (s1 !=
"11"))
{=
CalculationData(EstimatesComponents, Convert.ToDouble(s1));= sr.ReadLine();(s1
== null)
{= "11";
}
}= Math.Round(EstimatesComponents,
2);= TechnicalResult + EstimatesComponents;= Math.Round(FreeSkating,
2);[4].Add(ShortProgram.ToString());[6].Add(FreeSkating.ToString());Total =
ShortProgram + FreeSkating;[7].Add(Total.ToString());
}
{((s1.IndexOf("***") ==
-1) && (s1.IndexOf("///") == -1) &&
(s1.IndexOf("|||") == -1)
&& (s1.IndexOf("\\") == -1) && (s1 !=
"11"))
{= sr.ReadLine();(s1 == null)
{= "11";
}
}
}
}.Close();<List<double>>
point = Points(Data);= Ranks(point, Data);Data;
}double CalculationData(double Summ,
double Assessment)
{Summ + Assessment;
}List<List<double>>
Points(List<List<string>> Data)
{<List<double>> point =
new List<List<double>>();.Add(new List<double>());.Add(new
List<double>());.Add(new List<double>());(int i = 0; i <
Data[1].Count; i++)
{[0].Add(Convert.ToDouble(Data[4][i]));[1].Add(Convert.ToDouble(Data[6][i]));
point[2].Add(Convert.ToDouble(Data[7][i]));
}point;
}List<List<string>>
Ranks(List<List<double>> point, List<List<string>>
Data)
{<List<double>> rank =
new List<List<double>>();.Add(new List<double>());.Add(new
List<double>());.Add(new List<double>());.Add(new
List<double>());[2].Sort();[2].Reverse();(int i = 0; i <
Data[1].Count; i++)
{[0].Add((Search(point[2],
Convert.ToDouble(Data[7][i])) + 1).ToString());
}[0].Sort();[0].Reverse();(int i =
0; i < Data[1].Count; i++)
{[3].Add((Search(point[0],
Convert.ToDouble(Data[4][i])) + 1).ToString());
}[1].Sort();[1].Reverse();(int i =
0; i < Data[1].Count; i++)
{[5].Add((Search(point[1], Convert.ToDouble(Data[6][i]))
+ 1). ToString());
}Data;
}int Search(List<double> mass,
double element)
{(int i = 0; i < mass.Count; i++)
{(mass[i] == element)
{i;
}
}0;
}
}