Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ПЗ Набережнев ИТб - 112 v4.0.doc
Скачиваний:
4
Добавлен:
20.09.2019
Размер:
1.56 Mб
Скачать
  1. Г рафический алгоритм

да

нет

да

нет

Нет

Д а

Нет

Да

Нет

Да

Нет

Да

Нет

Да

Нет

Да

Нет

Д а

Нет

Д а

Нет

Д а

Нет

Да

Нет

Да

Нет

Да

Нет

Да

а

Нет

Да

Нет

Да

Нет

Да

Нет

Д а

Нет

Д а

Нет

Да

Нет

Да

Да

Нет

Д а

Нет

Да

Нет

Д а

Да

Нет

Да

Нет

Д а

Да

Нет

Да

Да

  1. Текст программы.

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; //массив для вычисления количества высоких оценок

}

}