Список работ

C#: построение диаграммы

Содержание

Введение

Создается C#-приложение, в котором выводится диаграмма прихода пассажиров на остановку трамвая, например, на остановку Авиамоторная.
На практике такая диаграмма создается в результате сбора статистических данных о прибытии пассажиров на остановку в разные промежутки времени. Для каждого временного интервала на диаграмме указывается математическое ожидание числа пассажиров, приходящих на остановку.
Такие диаграммы создаются для каждой остановки маршрута.
В программе диаграмма генерируется автоматически по следующим данным:

Определение числа приходящих пассажиров (pasCome) для каждого временного интервала следующий:

Если интервал входит в часы пик, то
    pasCome = случайное число из "диапазона пик";
иначе
    pasCome = случайное число из "диапазона прочий";

Это число определяется для каждого интервала диаграммы и заносится в массив arrPasCome; начало временного интервала записывается в массив arrTimeInt.
Эти массивы используются для построения диаграммы и определения числа пассажиров, приходящих в заданный временной промежуток.
В частности, таким промежутком может быть интервал между прибытием на остановку трамваев j и j + 1. В этом случае вычисленное число – это количество пассажиров, которые хотели бы сесть в трамвай j + 1.
Они сядут в этот трамвай, если позволит его вместимость.
Форма, обеспечивающая задание входных данных, выбор типа диаграммы и отображение результата, показана на рис. 1.

Ступенчатая или столбцовая диаграмма

Рис. 1. Диаграмма прихода пассажиров

Доступные типы диаграмм:

Тип проекта - Windows Form Application.

Реализация

using System;
using System.Drawing;
using System.Windows.Forms;

namespace WindowsFormsApplicationChart
{
    public partial class FormDiag : Form
    {
        private Random rnd = new Random();
        public FormDiag()
        {
            InitializeComponent();
            // Параметры диаграммы
            chartIn.ChartAreas[0].AxisX.Title = "Временной интервал, мин";
            chartIn.ChartAreas[0].AxisY.Title = "Число пассажиров";
            // Шрифт для координатных осей диаграммы
            Font fnt = new System.Drawing.Font("Microsoft Sans Serif", 10.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
            chartIn.ChartAreas[0].AxisX.TitleFont = fnt;
            chartIn.ChartAreas[0].AxisY.TitleFont = fnt;
            chartIn.ChartAreas[0].BackColor = Color.WhiteSmoke; // Фон диаграммы
            chartIn.Series[0].LegendText = "Пассажиры";
            chartIn.Series[0].IsVisibleInLegend = false;
            chartIn.Series[0].Color = Color.Red; // Цвет диаграммы
            chartIn.Series[0].BorderWidth = 2; // Ширина линий диаграммы
            ShowDiag(); // Показываем диаграмму
        }
        private void buttonClose_Click(object sender, EventArgs e)
        {
            this.Close();
        }
        // Показывает диаграмму
        private void ShowDiag()
        {
            // Очищаем диаграмму (серию 0)
            chartIn.Series[0].Points.Clear();
            // Тип диаграммы
            if (radioButtonStepLine.Checked)
                // Столбцы
                chartIn.Series[0].ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.StepLine;
            else
                // Столбцы
                chartIn.Series[0].ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Column;
            // Начало и конец движения (в мин)
            int moveStart = (int)numericUpDownMove.Value * 60;
            int moveEnd = (int)numericUpDownMove2.Value * 60;
            // Длина интервала
            int intLen = (int)numericUpDownInt.Value;
            // Число интервалов
            int n = (moveEnd - moveStart) / intLen;
            // Начало и конец утреннего интервала часов пик (в мин)
            int morn = (int)numericUpDownMorn.Value * 60;
            int morn2 = (int)numericUpDownMorn2.Value * 60;
            // Проверка
            if (morn2 <= morn) morn2 = morn + 60;
            // Начало и конец вечернего интервала часов пик (в мин)
            int ev = (int)numericUpDownEv.Value * 60;
            int ev2 = (int)numericUpDownEv2.Value * 60;
            // Проверка
            if (ev2 <= ev) ev2 = ev + 60;
            // Диапазон пассажиров, приходящих в часы пик
            int pasPeak = (int)numericUpDownPasPeak.Value;
            int pasPeak2 = (int)numericUpDownPasPeak2.Value;
            // Проверка
            if (pasPeak2 <= pasPeak) pasPeak2 = pasPeak + 1;
            // Диапазон пассажиров, приходящих в прочие часы
            int pasOth = (int)numericUpDownPasOth.Value;
            int pasOth2 = (int)numericUpDownPasOth2.Value;
            // Проверка
            if (pasOth2 <= pasOth) pasOth2 = pasOth + 1;
            // Массив приходящих пассажиров
            int[] arrPasCome = new int[n];
            // Массив временных интервалов диаграммы
            int[] arrTimeInt = new int[n];
            int t = moveStart, pasCome;
            for (int k = 0; k < n; k++)
            {
                // Время может быть в одном из трех интервалов: утреннем, вечернем и прочем
                if (t >= morn && t <= morn2 || t >= ev && t <= ev2)
                    // Пассажиры, пришедшие в часы пик в текущем интервале
                    pasCome = rnd.Next(pasPeak, pasPeak2);
                else
                    // Пассажиры, пришедшие в прочие часы в текущем интервале
                    pasCome = rnd.Next(pasOth, pasOth2);
                arrPasCome[k] = pasCome;
                arrTimeInt[k] = t;
                t += intLen; // Время текущего интервала
            }
            for (int k = 0; k < n; k++) chartIn.Series[0].Points.AddXY(arrTimeInt[k], arrPasCome[k]);
            numericUpDownMorn2.Value = Convert.ToDecimal(morn2 / 60);
            numericUpDownEv2.Value = Convert.ToDecimal(ev2 / 60);
            numericUpDownPasPeak2.Value = Convert.ToDecimal(pasPeak2);
            numericUpDownPasOth2.Value = Convert.ToDecimal(pasOth2);
        }
        private void buttonShow_Click(object sender, EventArgs e)
        {
            ShowDiag(); // Показываем диаграмму
        }
        private void radioButtonDiagType_CheckedChanged(object sender, EventArgs e)
        {
            ShowDiag(); // Показываем диаграмму
        }
        private void checkBoxLegend_CheckedChanged(object sender, EventArgs e)
        {
            chartIn.Series[0].IsVisibleInLegend = checkBoxLegend.Checked;
            ShowDiag(); // Показываем диаграмму
        }
        private void numericUpDown_ValueChanged(object sender, EventArgs e)
        {
            ShowDiag(); // Показываем диаграмму
        }
    }
}

Список работ

Рейтинг@Mail.ru