Г рафический алгоритм
да
нет
да
нет
Нет
Д а
Нет
Да
Нет
Да
Нет
Да
Нет
Да
Нет
Да
Нет
Д а
Нет
Д а
Нет
Д а
Нет
Да
Нет
Да
Нет
Да
Нет
Да
а
Нет
Да
Нет
Да
Нет
Да
Нет
Д а
Нет
Д а
Нет
Да
Нет
Да
Да
Нет
Д а
Нет
Да
Нет
Д а
Да
Нет
Да
Нет
Д а
Да
Нет
Да
Да
Текст программы.
using System;
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 NewWinApp2802
{
public partial class MainForm : Form
{
int NumSportsmen; //количество спортсменов
int NumScores = 4; //количество стрел за подход
int Numpodhod = 6; //количество подходов
int currentSportsmenIndex; //использовать для ввода данных вместо цикла
int currentpodhodIndex; //использовать для ввода данных вместо цикла
TestSportsmen[] allSportsmen; //массив спортсменов
TestSportsmen[] sortSportsmen; //массив промежуточных итоговых сортированных спортсменов
int Temp=0; //переменная для задания оценок
int sorted; //переменная для сортировки
int sorthod; //переменная для запоминания подхода в цикле сортировки
string Tempstring; //переменная для обмена имен, "Temp для строк"
int k1; //переменная для оператора while
public MainForm()
{
InitializeComponent();
}
private void addToListButton_Click(object sender, EventArgs e)
{
string clearText = nameBox.Text.Trim();
if (clearText != "")
{
if (namesListBox.Items.Count >= 1)
{
sorted = 0;
k1 = 0;
while (sorted == 0)
{
if (clearText == namesListBox.Items[k1].ToString())
{
MessageBox.Show("Нельзя вводить одинаковые имена");
nameBox.Clear();
sorted = 1;
}
else if ((namesListBox.Items.Count - 1) == k1)
{
namesListBox.Items.Add(clearText);
nameBox.Clear();
sorted = 2;
}
else k1++;
}
}
else
{
namesListBox.Items.Add(clearText);
nameBox.Clear();
}
}
nameBox.Focus();
}
private void nameBox_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == (char)Keys.Enter)
addToListButton_Click(sender, e); //нажатие Enter используем как действие клика на кнопку добавления
}
private void next1Button_Click(object sender, EventArgs e)
{
//создадим и заполним начальными данными массив спортсменов
next1Button.Enabled = false;
NumSportsmen = namesListBox.Items.Count;
allSportsmen = new TestSportsmen[NumSportsmen]; //создаём массив ссылок
sortSportsmen = new TestSportsmen[NumSportsmen]; //создаём массив ссылок
for (int i = 0; i < NumSportsmen; i++)
for(int j=0;j<Numpodhod;j++)
{
allSportsmen[i] = new TestSportsmen(); //с каждой ссылкой обязательно связываем объект
allSportsmen[i].Scores = new int[Numpodhod, NumScores]; //выделяем память внутренним массивам
allSportsmen[i].VisScores = new int[Numpodhod, 11]; //выделяем память внутренним массивам
allSportsmen[i].Summapodhod = new int[Numpodhod]; //выделяем память внутренним массивам
allSportsmen[i].Name = new string[Numpodhod];
}
for (int i = 0; i < NumSportsmen; i++)
for (int j = 0; j < Numpodhod; j++)
allSportsmen[i].Name[j] = namesListBox.Items[i].ToString(); //каждому заполним имя по номеру из списка
for (int i = 0; i < NumSportsmen; i++)
{
sortSportsmen[i] = new TestSportsmen(); //с каждой ссылкой обязательно связываем объект
sortSportsmen[i].Summapodhod = new int[Numpodhod]; //выделяем память внутренним массивам
sortSportsmen[i].Name = new string[Numpodhod];
sortSportsmen[i].Summa = new int[Numpodhod];
}
//начинаем с первого спортсмена и его первого подхода
currentSportsmenIndex = 0;
currentpodhodIndex = 0;
SportsmenTextBox.Text = allSportsmen[currentSportsmenIndex].Name[currentpodhodIndex];
podhodTextBox.Text = (currentpodhodIndex + 1).ToString();
mainTabs.SelectedIndex++; //на след. закладку
}
private void nextpodhodButton_Click_1(object sender, EventArgs e)
{
//сохраняем данные текущего спортсмена и подхода
allSportsmen[currentSportsmenIndex].Scores[currentpodhodIndex, 0] = (int)score1Box.Value;
allSportsmen[currentSportsmenIndex].Scores[currentpodhodIndex, 1] = (int)score2Box.Value;
allSportsmen[currentSportsmenIndex].Scores[currentpodhodIndex, 2] = (int)score3Box.Value;
allSportsmen[currentSportsmenIndex].Scores[currentpodhodIndex, 3] = (int)score4Box.Value;
//если следующий подход последний, блокируем кнопку следующий подход, и разблокируем следующего спортсмена
if ((currentpodhodIndex + 1) == Numpodhod)
{
nextpodhodButton.Enabled = false;
nextSportsmenButton.Enabled = true;
}
//переходим к следующему подходу
if ((currentpodhodIndex+1) < Numpodhod)
{
currentpodhodIndex++;
podhodTextBox.Text = (currentpodhodIndex + 1).ToString();
}
}
private void nextSportsmenButton_Click(object sender, EventArgs e)
{
//если следующий cпортсмен последний, блокируем кнопку следующий спортсмен, и разблокируем далее
if ((currentSportsmenIndex + 1) == NumSportsmen)
{
nextSportsmenButton.Enabled = false;
nextpodhodButton.Enabled = false;
next2Button.Visible = true;
}
else
{
//переходим к следующему спортсмену
currentSportsmenIndex++;
currentpodhodIndex = 0;
nextpodhodButton.Enabled = true;
nextSportsmenButton.Enabled = false;
}
if (currentSportsmenIndex < NumSportsmen)
{
SportsmenTextBox.Text = allSportsmen[currentSportsmenIndex].Name[currentpodhodIndex];
podhodTextBox.Text = (currentpodhodIndex + 1).ToString();
}
}
private void next2Button_Click(object sender, EventArgs e)
{
next2Button.Enabled = false;
//выполним расчёт необходимых данных
//заполняем массивы нулями
for (int i = 0; i < NumSportsmen; i++)
{
for (int j = 0; j < Numpodhod; j++)
{
allSportsmen[i].Summapodhod[j] = 0;
for (int k = 0; k <= 10; k++)
allSportsmen[i].VisScores[j, k] = 0;
}
}
//считаем количество выбитых за подход "10", "9" и т.д.
for (int i = 0; i < NumSportsmen; i++)
{
for (int j = 0; j < Numpodhod; j++)
{
for (int k = 0; k < NumScores; k++)
{
Temp = allSportsmen[i].Scores[j, k];
allSportsmen[i].VisScores[j, Temp] = allSportsmen[i].VisScores[j, Temp] + 1;
}
}
}
//посчитаем сумму для каждого подхода
for (int i = 0; i < NumSportsmen; i++)
for (int j = 0; j < Numpodhod; j++)
for (int k = 0; k < NumScores; k++)
allSportsmen[i].Summapodhod[j] = allSportsmen[i].Summapodhod[j] + allSportsmen[i].Scores[j, k];
//найдем сумму очков после каждого подхода
//отсортируем спортсменов для вывода результата каждого подхода
//сперва сравним по сумме
while (sorthod < NumSportsmen)
{
for (int i = 1; i < NumSportsmen; i++) //проверяем каждого спортсмена
{
for (int j = 0; j < Numpodhod; j++) //проверяем каждый подход у каждого спортсмена
{
if (allSportsmen[i].Summapodhod[j] > allSportsmen[i - 1].Summapodhod[j]) //если сумма первого взятого больше, чем у предыдущего
{
Temp = allSportsmen[i].Summapodhod[j];
allSportsmen[i].Summapodhod[j] = allSportsmen[i - 1].Summapodhod[j];
allSportsmen[i - 1].Summapodhod[j] = Temp;
for (int l = 0; l < NumScores; l++)
{
Temp = allSportsmen[i].Scores[j, l];
allSportsmen[i].Scores[j, l] = allSportsmen[i - 1].Scores[j, l];
allSportsmen[i - 1].Scores[j, l] = Temp;
}
for (int l = 0; l <= 10; l++)
{
Temp = allSportsmen[i].VisScores[j, l];
allSportsmen[i].VisScores[j, l] = allSportsmen[i - 1].VisScores[j, l];
allSportsmen[i - 1].VisScores[j, l] = Temp;
}
Tempstring = allSportsmen[i].Name[j];
allSportsmen[i].Name[j] = allSportsmen[i - 1].Name[j];
allSportsmen[i - 1].Name[j] = Tempstring;
}
else if (allSportsmen[i].Summapodhod[j] == allSportsmen[i - 1].Summapodhod[j]) //если суммы равны, то
//смотрим по количеству высоких оценок
{
k1 = 10;
sorted = 0;
while (sorted == 0)
{
if (allSportsmen[i].VisScores[j, k1] > allSportsmen[i - 1].VisScores[j, k1]) //если количество 10,9,8 и т.д. у выбранного спортсмена меньше, то
{
//меняем нужные данные о спортсменах местами
Temp = allSportsmen[i].Summapodhod[j];
allSportsmen[i].Summapodhod[j] = allSportsmen[i - 1].Summapodhod[j];
allSportsmen[i - 1].Summapodhod[j] = Temp;
for (int l = 0; l < NumScores; l++)
{
Temp = allSportsmen[i].Scores[j, l];
allSportsmen[i].Scores[j, l] = allSportsmen[i - 1].Scores[j, l];
allSportsmen[i - 1].Scores[j, l] = Temp;
}
for (int l = 0; l <= 10; l++)
{
Temp = allSportsmen[i].VisScores[j, l];
allSportsmen[i].VisScores[j, l] = allSportsmen[i - 1].VisScores[j, l];
allSportsmen[i - 1].VisScores[j, l] = Temp;
}
Tempstring = allSportsmen[i].Name[j];
allSportsmen[i].Name[j] = allSportsmen[i - 1].Name[j];
allSportsmen[i - 1].Name[j] = Tempstring;
sorted = 1;
}
else if (allSportsmen[i].VisScores[j, k1] < allSportsmen[i - 1].VisScores[j, k1]) //если количество 10,9,8 и т.д. у выбранного спортсмена больше, то
{
//спортсмены стоят на своих местах
sorted = 1;
}
if (k1 != 0)
k1--;
else sorted = 1;
}
}
}
}
sorthod++;
}
//теперь произведем расчеты для промежуточных результатов
//заполним массив allSportsmen[i].Summa[0] соответствующими результатами с allSportsmen[i].Summapodhod[0]
for (int i = 0; i < NumSportsmen; i++)
{
sortSportsmen[i].Name[0] = allSportsmen[i].Name[0];
sortSportsmen[i].Summa[0] = allSportsmen[i].Summapodhod[0];
}
//скопируем имена и суммы из allStudents в sortStudents
//вычислим сумму очков после каждого подхода
for (int i = 0; i < NumSportsmen; i++)
{
for (int j = 1; j < Numpodhod; j++) //j=1, т.к. сумма очков после первого подхода равна сумме очков первого подхода
//сумма очков после текущего подхода равна сумме очков текущего подхода и предыдущего подхода
for (int k = 0; k < NumSportsmen; k++) //проверяем сходство по имени sortSportsmen и allSportsmen
if (sortSportsmen[i].Name[j - 1] == allSportsmen[k].Name[j])
{
sortSportsmen[i].Summa[j] = sortSportsmen[i].Summa[j - 1] + allSportsmen[k].Summapodhod[j];
sortSportsmen[i].Name[j] = allSportsmen[k].Name[j];
}
}
//сравним спортсменов по сумме очков после каждого подхода
sorthod = 0;
while (sorthod < NumSportsmen)
{
for (int i = 1; i < NumSportsmen; i++)
for (int j = 0; j < Numpodhod; j++)
{
if (sortSportsmen[i].Summa[j] > sortSportsmen[i - 1].Summa[j]) //если сумма текущего спортсмена больше, чем у предыдущего
{
Tempstring = sortSportsmen[i].Name[j];
sortSportsmen[i].Name[j] = sortSportsmen[i - 1].Name[j];
sortSportsmen[i - 1].Name[j] = Tempstring;
Temp = sortSportsmen[i].Summa[j];
sortSportsmen[i].Summa[j] = sortSportsmen[i - 1].Summa[j];
sortSportsmen[i - 1].Summa[j] = Temp;
}
else if (sortSportsmen[i].Summa[j] == sortSportsmen[i - 1].Summa[j]) //если суммы равны, то
//смотрим по более высокому месту на раннем подходе
{
for (int k = 0; k < NumSportsmen; k++)
{
if (j != 0)
k1 = j - 1;
else continue;
if (sortSportsmen[k].Name[k1] == sortSportsmen[i].Name[j]) //ищем данного спортсмена по отсортированному массиву на предыдущем подходе
for (int l = 0; l < NumSportsmen; l++)
if (sortSportsmen[l].Name[k1] == sortSportsmen[i - 1].Name[j]) //ищем другого спортсмена по отсортированному массиву на предыдущем подходе
//сравниваем места
{
if (k < l) //если место текущего спортсмена меньше, чем предыдущего, т.е. ВЫШЕ, то производим обмен значениями
{
Tempstring = sortSportsmen[i].Name[j];
sortSportsmen[i].Name[j] = sortSportsmen[i - 1].Name[j];
sortSportsmen[i - 1].Name[j] = Tempstring;
Temp = sortSportsmen[i].Summa[j];
sortSportsmen[i].Summa[j] = sortSportsmen[i - 1].Summa[j];
sortSportsmen[i - 1].Summa[j] = Temp;
}
}
}
}
}
sorthod++;
}
//выведем элементы массива спортсменов в DataGridView
//построчно
for (int i = 0; i < NumSportsmen; i++)
resultsGrid.Rows.Add(i+1,
allSportsmen[i].Name[0],
allSportsmen[i].Summapodhod[0],
allSportsmen[i].Scores[0, 0],
allSportsmen[i].Scores[0, 1],
allSportsmen[i].Scores[0, 2],
allSportsmen[i].Scores[0, 3]);
for (int i = 0; i < NumSportsmen; i++)
resultsGrid2.Rows.Add(i + 1,
sortSportsmen[i].Name[0],
sortSportsmen[i].Summa[0]);
//установим на WinnerName имя победителя
WinnerName.Text = sortSportsmen[0].Name[Numpodhod-1];
//установим на WinnerScore результат победителя
WinnerScore.Text = sortSportsmen[0].Summa[Numpodhod - 1].ToString();
//выведем места, имена и результаты спортсменов, занявших не первое место, в DataGridView
for (int i = 1; i < NumSportsmen; i++)
resultsGrid3.Rows.Add(i + 1,
sortSportsmen[i].Name[Numpodhod-1],
sortSportsmen[i].Summa[Numpodhod - 1]);
//переключаемся на след. закладку
mainTabs.SelectedIndex++;
}
private void ShowResultsButton_Click(object sender, EventArgs e)
{
resultsGrid.Rows.Clear();
currentpodhodIndex = Convert.ToInt32(podhodResultsNum.Text)-1;
for (int i = 0; i < NumSportsmen; i++)
resultsGrid.Rows.Add(i+1,
allSportsmen[i].Name[currentpodhodIndex],
allSportsmen[i].Summapodhod[currentpodhodIndex],
allSportsmen[i].Scores[currentpodhodIndex, 0],
allSportsmen[i].Scores[currentpodhodIndex, 1],
allSportsmen[i].Scores[currentpodhodIndex, 2],
allSportsmen[i].Scores[currentpodhodIndex, 3]);
}
private void ShowResultsButton2_Click(object sender, EventArgs e)
{
resultsGrid2.Rows.Clear();
currentpodhodIndex = Convert.ToInt32(podhodResultsNum2.Text) - 1;
for (int i = 0; i < NumSportsmen; i++)
resultsGrid2.Rows.Add(i + 1,
sortSportsmen[i].Name[currentpodhodIndex],
sortSportsmen[i].Summa[currentpodhodIndex]);
}
}
class TestSportsmen
{
public string[] Name; //переменная для имен
public int[] Summapodhod; //массив для суммы оценок подхода
public int[] Summa; //массив для суммы оценок после подходов
public int[,] Scores; //массив для оценок
public int[,] VisScores; //массив для вычисления количества высоких оценок
}
}