Приложение "Гоночный чемпионат"

Пространство имен F1Championship (классы). Текстовый и графический алгоритм работы программы. Текст полученной программы, ее основные элементы и принцип действия, назначение и функциональные особенности. Этапы составления инструкции для пользователя.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 10.06.2011
Размер файла 646,2 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

1. Условие задачи

В гонках Формула 1 участвуют по 2 пилота от каждой команды. В сезоне N этапов. Пилоты получают места на этапе по времени их прохождения. Очки начисляются по схеме 10-8-6-5-4-3-2-1. В кубке конструкторов (командный зачёт) каждая команда получает очки, как сумму очков своих пилотов на каждом этапе. Если очки пилотов равны, то место определяется по наименьшему количеству занятых мест на всех этапах. Провести чемпионат.

2. Список переменных и типов данных

Пространство имен F1Championship (классы)

1. GenericArray - шаблонная обертка над классом System. Collections. ArrayList. Служит для единообразной работы с массивами различных объектов.

2. Pilot - класс, хранящий информацию о пилоте.

3. PilotComparer - класс, реализующий сравнение двух пилотов. Сравнивает пилотов по их результатам. Если результаты равны, то она сравнивает пилотов по их сумме мест (используется при сортировке массива пилотов)

4. CommandComparer - класс, реализующий сравнение команд пилотов. Сравнивает по сумме очков (используется при сортировке массива команд)

5. Command - класс, описывающий команду. Содержит список пилотов (не более 2х человек). Также содержит сумму очков пилотов.

6. Country - класс, описывающий этап гонки. Содержит таблицу результатов гонки для пилотов (для пилота хранится время прохождения этапа) и таблицу мест пилотов (для каждого пилота хранится место в гонке в зависимости от времени).

7. Championship - класс, реализующий логику проведения чемпионата и расчет результатов. Содержит список команд и список этапов чемпионата. В этом массиве так же осуществляется сортировка по местам пилотов в личном зачёте и команд в Кубке Конструкторов.

Класс Pilot. Переменные:

1. Pilot - тип public (класс общего доступа). Включает в себя имя пилота (Name), его номер в команде (Number), команду-владельца(Owner), сумарное количество очков в чемпионате(Scores), общее место в чемпионате(ChampPlace), сумму мест по этапам(Places).

Класс PilotComparer. Методы:

1. Compare - возващаемый тип - int (целочисленная). Метод общего доступа для сравнения результатов пилотов.

Класс Command. Переменные:

1. MAX_PILOTS - тип Int32 (целочисленная константа). Объявляет количество пилотов в команде.

2. Name - тип string (строковая). Переменная общего доступа;

3. GenericArray<Pilot> m_pilots - переменная ограниченого доступа - список пилотов команды. Доступна извне только на чтение при помощи свойства GenericArray< Pilot > Pilots;

Класс CommandComparer. Переменные:

1. Compare - возващаемый тип - int (целочисленная). Метод общего доступа для сравнения результатов команд.

Класс Country. Переменные:

1. Name - тип string (строковая). Переменная общего доступа. Имя команды.

2. scores - тип Int32 [] (массив целых чисел). Переменная устанавливает какие возможны очки для пилотов в чемпионатах.

3. m_timeTable - тип System. Collections. Hashtable. Таблица результатов пилотов на этапе. Ключ хэш таблицы - экземпляр класса Pilot, хранимое значение - время в виде System. DateTime.

4. m_placeTable - тип System. Collections. Hashtable. Таблица мест пилотов на этапе. Ключ хэш таблицы - экземпляр класса Pilot, хранимое значение - мечто в виде целого числа (Int32).

Класс Championship. Переменные:

1. m_commands - тип GenericArray< Command >. Массив, хранящий команды чемпионата. Доступны извне тольео на чтение с помошью свойства Commands.

2. m_countries - тип GenericArray< Country >. Массив, хранящий этапы чемпионата. Доступны извне тольео на чтение с помошью свойства Countries.

3. m_instance - тип Championship. Статическая переменная закрытого доступа, доступна только на чтение при помощи свойства static Championship Instance. Существут все время работы программы.

Пространство имен F1Championship.

Класс MainForm. Методы

1. RefreshPilots - тип void (без возврата значений). Метод используется для ввода, обновления и сохранения имени пилота для каждой команды в классе Command. Так же выполняется оператор сравнения.

2. CountryAdd - тип void (без возврата значений). Метод используется для ввода стран / этапов. Метод заполняет поле lbCountries и выводит сообщение об ошибке если поле ввода не заполнено.

3. btnCountryAdd_Click - тип void (без возврата значений). Это событие на нажатие кнопки «Добавить», которая добавляет страну / этап в поле lbCountries из поля CountryAdd.

4. btnClearCommnad_Click - тип void (без возврата значений). Это событие на нажати кнопки «Очистить список» в поле lbCommands.

5. btnClearCountries_Click - тип void (без возврата значений). Это событие на нажати кнопки «Очистить список» в поле lbCountries.

6. btnDeleteCountry_Click - тип void (без возврата значений). Это событие на нажати кнопки «Удалить» в поле lbCountries при выделенной стране / этапе.

7. CommandAdd - тип void (без возврата значений). Метод заполняет поле lbCommands и выводит сообщение об ошибке если поле ввода не заполнено.

8. btnAddCommand_Click - тип void (без возврата значений). Это событие на нажатие кнопки «Добавить», которая добавляет название команды в поле lbCommands из поля CommandAdd.

9. PilotAdd - тип void (без возврата значений). Метод заполняет поле lbPilots и выводит сообщение об ошибке если поле ввода не заполнено.

10. btnAddPilot_Click - тип void (без возврата значений). Это событие на нажатие кнопки «Добавить», которая добавляет имя пилота в поле lbPilots из поля PilotAdd.

11. btnDeletePilot_Click - тип void (без возврата значений). Это событие на нажатие кнопки «Удалить» в поле lbPilots при выделенном пилоте.

12. btnClearPilots_Click - тип void (без возврата значений). Это событие на нажати кнопки «Очистить список» в поле lbPilots.

13. lbCommands_SelectedIndexChanged - тип void (без возврата значений). Метод обновляет список команд.

14. btnDeleteCommand_Click - тип void (без возврата значений). Это событие на нажатие кнопки «Удалить» в поле lbCommands.

Переменные:

1. m_fixedResults - тип bool. Переменная закрытого доступа. Признак того, что результаты были внесены и больше не будут изменяться.

2. m_results - тип System. Collections. ArrayList. Переменная закрытого доступа. Отсортированный по убыванию мест список пилотов.

3. m_championship - тип F1Championship. Championship. Переменная закрытого доступа.

3. Текстовый алгоритм

1. Запуск программы.

2. Инициализация переменных F1Championship, m_fixedResults, m_results.

3. Ввод страны в поле edtCountryName.

4. Если поле заполнено.

4.1. Нажимается кнопка btnCountryAdd или Enter.

4.2. Создается экземпляр класса Country с заданным именем.

4.3. Добавление в массив m_countries.

4.4. Имя страны сохраняется в lbCountries.

4.5. Если необходимо удалить элемент списка, то нажимается кнопка btnDeleteCountry.

4.6. Если необходимо полностью очистить список, то нажимается кнопка btnClearCountries

5. Если страна не введена.

5.1. Появляется MessageBox с описанной ошибкой.

6. Если необходимо продолжить, то повторяются позиции 3-4.4.

6.1. Если ввод окончен.

7. Переход на следующую закладку tpgCommands с помощью кнопки btnNext.

8. Вод команды в поле edtCommandName.

9. Если поле заполнено.

9.1. Нажимается кнопка btnAddCommand или Enter.

9.2. Создается экземпляр класса Command с заданным именем.

9.3. Добавление в массив m_commands.

9.4. Имя команды сохраняется в lbCommands.

9.5. Если необходимо удалить элемент списка, то нажимается кнопка btnDeleteCommand.

9.6. Если необходимо полностью очистить список, то нажимается кнопка btnClearCommnad.

10. Если команда не введена.

10.1. Появляется MessageBox с описанной ошибкой.

11. Если необходимо продолжить, то повторяются позиции 8-9.4.

11.1. Если ввод окончен.

12. На этой же закладке вводятся имена пилотов команд.

12.1. Для этого необходимо выделить одну команду в поле lbCommands.

13. Если поле edtPilotName заполнено.

13.1. Нажимается кнопка btnAddPilot или Enter.

13.2. Если число пилотов в команде меньше максимального.

13.2.1. Возвращаемся к пункту 12.1.

13.2.2. Продолжаем ввод пилотов.

13.3. Если число пилотов команды больше максимального.

13.4. Создается экземпляр класса Pilot с заданным именем, текущей командой и номером в команде.

13.5. Добавление в массив m-pilots текущей команды.

13.6. Добавление имени пилота в массив lbPilots.

13.7. Если необходимо удалить из списка экземпляр класса, то нажимается кнопка btnDeletePilot.

13.8. Если необходимо очистить весь список, то нажимается кнопка btnClearPilots.

14. Если поле не заполнено.

14.1. Появляется MessageBox с описанной ошибкой.

15. Если необходимо продолжить ввод пилотов, то повторяются позиции 13-13.6.

15.1. Если ввод окончен.

16. Переход на следующую закладку tabControl с помощью кнопки btnNext.

17. Занесение всех стран в список cbCountry.

18. Начало цикла 1 для всех стран в массиве m_commands. Items.

18.1. Добавление узла в дерево tvCommandsPilots с именем команды (node = this.tvCommandsPilots. SelectedNode).

18.2. Начало цикла 2 для всех пилотов в массиве cmd. Pilots. Items.

18.2.1. Добавление к узлу node дочернего узла pilotNode с именем пилота.

18.2.2. Завершение цикла 2.

18.3. Завершение цикла 1.

19. Выбор страны / этапа из списка cbCountry.

20. Выбор команды из дерева tvCommandsPilots.

21. Выбор пилота, принадлежащего команде из того же списка.

22. Ввод времени пилота для данного этапа.

23. Получение выбранной страны Country.

24. Получение экземпляра класса Pilot, соответствующего выбранному пилоту в команде (pilot).

25. Запоминание результата для пилота.

26. Установка времени пилота.

26.1. Если оно еще не установлено.

26.1.1. Добавление времени пилота в таблицу m_timeTable.

26.2. Если время уже установлено.

26.3.1. Изменение имующегося времени в таблице m_timeTable.

27. Продолжение ввода.

27.1. Если продолжать.

27.1.2. Повторение позиций 19-27.

27.2. Если не надо продолжать.

28. Происходит фиксация результатов: m_fixedResult = true и переход на следующую закладку dgTableChamp с помощью нажатия кнопки btnNext.

29. Отображение таблицы.

30. Получение результатов.

30.1. Если результаты не получены.

30.1.2. Подсчитывание очков.

30.2. Если результаты уже получены.

30.2.1. Переход на позицию 36.

31. Переход с позиции 30.2. на позицию 32.

32. Начало цикла 3 для всех стран в массиве m_countries (в чемпионате).

32.1. Подсчитывание очков на данном этапе.

32.2. Начало цикла 4 для всех пилотов с записью в таблице результатов.

32.2.1. Выбор из таблицы m_timeTable времени для пилота (GetResult).

32.2.2. Вычисляем место пилота на этапе в зависимости от времени.

32.2.3. Присваиваем result значение 0.

32.3. Начало цикла 5 для всех результатов в талице m_timeTable.

32.3.1. Сравнивание времени пилота со временем в таблице m_timeTable.

32.3.2. Времмя пилота больше времени в таблице для другого пилота.

32.3.2.1. Если да.

32.3.2.1.1. Присваиваем result значение 1.

32.3.2.2. Если нет.

32.3.2.2.1. Место пилота не изменяется (result).

32.3.2.3. Из позиций 23.3.2.1.1. и 23.3.2.2.1. переходим на позицию 23.3.3.

32.3.3. Увеличиваем result на 1.

32.3.4. Конец цикла 5.

32.2.4. Полученное место заносится в таблицу мест m_timeTable.

32.2.5. Конец цикла 4.

32.3. Начало цикла 6 для всех пилотов в таблице мест m_timeTable.

32.3.1. Добавление к сумме мест пилота в чемпионате вычисленного места на этапе.

32.3.2. Добавление к сумме очков пилота числа очков в зависимости от занятого места.

32.3.3. Пересчет командных очков.

32.3.4 Конец цикла 6.

32.4. Конец цикла 3.

33. Начало цикла 7 для пилотов в чемпионате.

33.1. Занесение пилотов в массив sortedPilots.

33.2. Конец цикла 7.

34. Сортировка списка sortedPilots при помощи класса PilotComparer.

34.1. Условие сортировки: для двух пилотов.

34.2. Очки равны.

34.2.1. Если да.

34.2.1.1. Пилоты сравниваются по сымме мест.

34.2.2. Если нет.

34.2.2.1. Пилоты сравниваются по сумме очков.

34.2.3. Присваивание ii значения 0.

35. Начало цикла 8.

35.1. pilot = sortedPilots [ii]; вычисляется место пилота в чемпионате при помощи pilot. ChampPlace = ii + 1.

35.2. Прибавляем к ii единицу (++ii).

35.3. Конец цикла 8.

36. Получение списка пилотов с вычисленными результатами по чемпионату.

36. Начало цикла 9 для всех пилотов в результатах чемпионата m_results.

36.1. Добавление в таблицу dgTableChamp место пилота, имя, число очков и сумму мест.

36.2. Конец цикла 9.

36.3 Переход на следующую закладку dgCommandTable с помощью кнопки btnNext.

37. Просмотр результатов команд завершен.

37.1. Если нет.

37.1.1. Возврат на позицию 37.

37.2. Если да.

37.2.1. Сортировка команды по уменьшению суммарных очков пилотов команды.

38. Присваивание ii значения 0.

39. Начало цикла 10.

39.1. Для каждой команды command = commands [ii] заносим в таблицу dgCommandTable место команды в чемпионате, имя, сумму очков пилотов команды.

39.2. Конец цикла 10.

40. Просмотреть результаты чемпионата.

40.1. Если да.

40.1.1. Возврат на позицию 29.

40.2. Если нет.

40.2.1. Выход из программы при помощи нижатия кнопки btnExit.

41. Возможен возврат на предыдущие закладки с помощью кнопки btnBack.

42. Конец программы.

4. Графический алгоритм

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

программа инструкция алгоритм пользователь

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

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

namespace F1Championship

{

public class GenericArray< T >

{

private ArrayList m_items = null;

public GenericArray()

{

m_items = new ArrayList();

}

public GenericArray (Int32 num)

{

m_items = new ArrayList(num);

}

public ArrayList Items

{

get {return m_items;}

}

public Int32 Add (T newObject)

{

return m_items. Add(newObject);

}

public void Remove (T obj)

{

m_items. Remove(obj);

}

public void RemoveAt (Int32 index)

{

m_items. RemoveAt(index);

}

public Int32 Count

{

get {return m_items. Count;}

}

public T this [Int32 index]

{

get {return (T) m_items[index];}

set {m_items[index] = value;}

}

public void Clear()

{

m_items. Clear();

}

};

public class Pilot

{

public string Name = String. Empty;

public Int32 Number = 0;

public Command Owner = null;

public Int32 Scores = 0;

public Int32 ChampPlace = 0;

public Int32 Places = 0;

public Pilot (string name, Int32 num, Command command)

{

Name = name;

Number = num;

Owner = command;

}

}

public class PilotComparer: IComparer

{

public virtual int Compare (object x, object y)

{

Pilot pilot1 = x as Pilot;

Pilot pilot2 = y as Pilot;

if (pilot2. Scores == pilot1. Scores)

return (pilot1. Places - pilot2. Places);

return (pilot2. Scores - pilot1. Scores);

}

};

public class CommandComparer: IComparer

{

public virtual int Compare (object x, object y)

{

Command cmd1 = x as Command;

Command cmd2 = y as Command;

return (cmd2. Scores - cmd1. Scores);

}

};

public class Command

{

const Int32 MAX_PILOTS = 2;

public string Name = String. Empty;

private GenericArray< Pilot > m_pilots = null;

private Int32 m_scores = 0;

public Command (string name)

{

m_pilots = new GenericArray< Pilot >();

Name = name;

}

public Pilot AddPilot (string name)

{

if (m_pilots. Count < MAX_PILOTS)

{

Pilot pilot = new Pilot (name, m_pilots. Count, this);

m_pilots. Add(pilot);

return pilot;

}

else throw new ArgumentException («Can't add pilot!!!»);

}

public GenericArray< Pilot > Pilots

{

get {return m_pilots;}

}

public void UpdateScores()

{

m_scores = 0;

foreach (Pilot pilot in m_pilots. Items)

{

m_scores += pilot. Scores;

}

}

public Int32 Scores

{

get {return m_scores;}

}

}

public class Country

{

public string Name = String. Empty;

private System. Collections. Hashtable m_timeTable = null;

private System. Collections. Hashtable m_placeTable = null;

private Int32 [] scores = new Int32 [8] {10, 8, 6, 5, 4, 3, 2, 1};

public Country (string name)

{

Name = name;

m_timeTable = new Hashtable();

}

public void SetResult (Pilot pilot, DateTime time)

{

if (! m_timeTable. ContainsKey(pilot))

m_timeTable. Add (pilot, time);

else

m_timeTable[pilot] = time;

}

public DateTime GetResult (Pilot pilot)

{

return (DateTime) m_timeTable[pilot];

}

private Int32 Place (DateTime time)

{

Int32 result = 0;

foreach (DateTime tableTime in m_timeTable. Values)

{

result += (tableTime < time)? 1: 0;

}

return result + 1;

}

public void CountScores()

{

m_placeTable = new Hashtable();

ArrayList temp = new ArrayList();

Int32 place = 0;

foreach (Pilot pilot in m_timeTable. Keys)

{

place = Place (GetResult(pilot));

m_placeTable. Add (pilot, place);

temp. Add(pilot);

}

foreach (Pilot pilot in m_placeTable. Keys)

{

place = (Int32) m_placeTable[pilot];

pilot. Places += place;

if (place < 9)

pilot. Scores += scores [place - 1];

pilot. Owner. UpdateScores();

}

}

}

public class Championship

{

private static Championship m_instance = new Championship();

private GenericArray< Command > m_commands = null;

private GenericArray< Country > m_countries = null;

private Championship()

{

m_countries = new GenericArray<Country>();

m_commands = new GenericArray< Command >();

}

public static Championship Instance

{

get {return m_instance;}

}

public Country AddCountry (string name)

{

Country newCountry = new Country(name);

m_countries. Add(newCountry);

return newCountry;

}

public GenericArray<Country> Countries

{

get {return m_countries;}

}

public Command AddCommand (string name)

{

Command newComm = new Command(name);

m_commands. Add(newComm);

return newComm;

}

public GenericArray< Command > Commands

{

get {return m_commands;}

}

public ArrayList CountScores()

{

foreach (Country country in m_countries. Items)

{

country. CountScores();

}

ArrayList sortedPlaces = new ArrayList();

foreach (Command cmd in m_commands. Items)

{

foreach (Pilot pilot in cmd. Pilots. Items)

{

sortedPlaces. Add(pilot);

}

}

sortedPlaces. Sort (new PilotComparer());

for (int ii = 0; ii < sortedPlaces. Count; ++ii)

{

Pilot pilot = sortedPlaces[ii] as Pilot;

pilot. ChampPlace = ii + 1;

}

return sortedPlaces;

}

public ArrayList SortCommands()

{

m_commands. Items. Sort (new CommandComparer());

return m_commands. Items;

}

}

}

namespace F1Championship

{

public partial class MainForm: Form

{

private F1Championship. Championship m_championship = F1Championship. Championship. Instance;

private bool m_fixedResults = false;

private System. Collections. ArrayList m_results = null;

public MainForm()

{

InitializeComponent();

}

private void RefreshPilots()

{

if (this.lbCommands. SelectedIndex!= ListBox. NoMatches)

{

Command cmd = m_championship. Commands [this.lbCommands. SelectedIndex];

this.lbPilots. BeginUpdate();

this.lbPilots. Items. Clear();

foreach (Pilot pilot in cmd. Pilots. Items)

{

this.lbPilots. Items. Add (pilot. Name);

}

this.lbPilots. EndUpdate();

}

}

private void CountryAdd()

{

if (this.edtCountryName. Text == String. Empty)

{

MessageBox. Show (

«Имя страны должно быть непустым!»,

«Внимание!»,

MessageBoxButtons.OK,

MessageBoxIcon. Warning);

return;

}

Country country = m_championship. AddCountry (this.edtCountryName. Text);

this.lbCountries. BeginUpdate();

this.lbCountries. Items. Add (country. Name);

this.lbCountries. EndUpdate();

this.edtCountryName. Text = String. Empty;

this.edtCountryName. Focus();

}

private void btnCountryAdd_Click (object sender, EventArgs e)

{

CountryAdd();

}

private void btnClearCommnad_Click (object sender, EventArgs e)

{

m_championship. Commands. Clear();

this.lbCommands. BeginUpdate();

this.lbCommands. Items. Clear();

this.lbCommands. EndUpdate();

}

private void btnClearCountries_Click (object sender, EventArgs e)

{

m_championship. Countries. Clear();

this.lbCountries. BeginUpdate();

this.lbCountries. Items. Clear();

this.lbCountries. EndUpdate();

}

private void btnDeleteCountry_Click (object sender, EventArgs e)

{

if (this.lbCountries. SelectedIndex!= ListBox. NoMatches)

{

m_championship. Countries. RemoveAt (this.lbCountries. SelectedIndex);

this.lbCountries. BeginUpdate();

this.lbCountries. Items. RemoveAt (this.lbCountries. SelectedIndex);

this.lbCountries. EndUpdate();

}

}

private void CommandAdd()

{

if (this.edtCommandName. Text == String. Empty)

{

MessageBox. Show (

«Имя команды должно быть непустым!»,

«Внимание!»,

MessageBoxButtons.OK,

MessageBoxIcon. Warning);

return;

}

Command comm = m_championship. AddCommand (this.edtCommandName. Text);

this.lbCommands. BeginUpdate();

this.lbCommands. Items. Add (comm. Name);

this.lbCommands. EndUpdate();

this.edtCommandName. Text = String. Empty;

this.edtCommandName. Focus();

}

private void btnAddCommand_Click (object sender, EventArgs e)

{

CommandAdd();

}

private void PilotAdd()

{

if (this.lbCommands. SelectedIndex == ListBox. NoMatches)

return;

Command currentCommand = m_championship. Commands [this.lbCommands. SelectedIndex];

if (this.edtPilotName. Text == String. Empty)

{

MessageBox. Show (

«Имя пилота должно быть непустым!»,

«Внимание!»,

MessageBoxButtons.OK,

MessageBoxIcon. Warning);

return;

}

Pilot pilot = null;

try

{

pilot = currentCommand. AddPilot (this.edtPilotName. Text);

}

catch (ArgumentException)

{

return;

}

this.lbPilots. BeginUpdate();

this.lbPilots. Items. Add (pilot. Name);

this.lbPilots. EndUpdate();

this.edtPilotName. Text = String. Empty;

this.edtPilotName. Focus();

}

private void btnAddPilot_Click (object sender, EventArgs e)

{

PilotAdd();

}

private void btnDeletePilot_Click (object sender, EventArgs e)

{

if (this.lbCommands. SelectedIndex == ListBox. NoMatches)

return;

Command currentCommand = m_championship. Commands [this.lbCommands. SelectedIndex];

if (this.lbPilots. SelectedIndex == ListBox. NoMatches)

return;

currentCommand. Pilots. RemoveAt (this.lbPilots. SelectedIndex);

this.lbPilots. BeginUpdate();

this.lbPilots. Items. RemoveAt (this.lbPilots. SelectedIndex);

this.lbPilots. EndUpdate();

}

private void btnClearPilots_Click (object sender, EventArgs e)

{

if (this.lbCommands. SelectedIndex == ListBox. NoMatches)

return;

Command currentCommand = m_championship. Commands [this.lbCommands. SelectedIndex];

currentCommand. Pilots. Clear();

this.lbPilots. BeginUpdate();

this.lbPilots. Items. Clear();

this.lbPilots. EndUpdate();

}

private void lbCommands_SelectedIndexChanged (object sender, EventArgs e)

{

RefreshPilots();

}

private void btnDeleteCommand_Click (object sender, EventArgs e)

{

if (this.lbCommands. SelectedIndex == ListBox. NoMatches)

return;

Command currentCommand = m_championship. Commands [this.lbCommands. SelectedIndex];

currentCommand. Pilots. Clear();

m_championship. Commands. RemoveAt (this.lbCommands. SelectedIndex);

this.lbCommands. BeginUpdate();

this.lbCommands. Items. RemoveAt (this.lbCommands. SelectedIndex);

this.lbCommands. EndUpdate();

}

private void ShowPilotsTablePage()

{

this.cbCountry. BeginUpdate();

this.cbCountry. Items. Clear();

foreach (Country country in m_championship. Countries. Items)

{

this.cbCountry. Items. Add (country. Name);

}

if (this.cbCountry. Items. Count > 0)

this.cbCountry. SelectedIndex = 0;

this.cbCountry. EndUpdate();

this.tvCommandsPilots. BeginUpdate();

this.tvCommandsPilots. Nodes. Clear();

foreach (Command cmd in m_championship. Commands. Items)

{

TreeNode node = this.tvCommandsPilots. Nodes. Add (cmd. Name);

node. Tag = cmd;

foreach (Pilot pilot in cmd. Pilots. Items)

{

TreeNode pilotNode = node. Nodes. Add (pilot. Name);

pilotNode. Tag = pilot;

}

}

this.tvCommandsPilots. EndUpdate();

this.dtpPilotTime. Value = this.dtpPilotTime. MinDate;

}

private void CheckResults()

{

if (! m_fixedResults || (m_results == null))

throw new ArgumentException («Не получены результаты!»);

}

private void ShowChampTable()

{

CheckResults();

this.dgTableChamp. Rows. Clear();

foreach (Pilot pilot in m_results)

{

this.dgTableChamp. Rows. Add (

new string[] {pilot. ChampPlace. ToString(), pilot. Name, pilot. Scores. ToString(), pilot. Places. ToString()}

);

}

}

private void ShowCommandTable()

{

CheckResults();

System. Collections. ArrayList commands = m_championship. SortCommands();

this.dgCommandTable. Rows. Clear();

for (int ii = 0; ii < commands. Count; ++ii)

{

Int32 cmdPlace = ii + 1;

Command cmd = (Command) commands[ii];

this.dgCommandTable. Rows. Add (

new string[] {cmdPlace. ToString(), cmd. Name, cmd. Scores. ToString()}

);

}

}

private void CountScores()

{

if (m_results == null)

{

m_results = m_championship. CountScores();

}

}

private void tabControl_SelectedIndexChanged (object sender, EventArgs e)

{

this.btnNext. Visible = (this.tabControl. SelectedIndex!= this.tabControl. TabPages. Count - 1);

this.btnBack. Visible = (this.tabControl. SelectedIndex!= 0);

if (this.tabControl. SelectedTab == this.tpgPilotsTime)

{

ShowPilotsTablePage();

}

else if (this.tabControl. SelectedTab == this.tpgChampTable)

{

m_fixedResults = true;

CountScores();

ShowChampTable();

}

else if (this.tabControl. SelectedTab == this.tpgCommandTable)

{

m_fixedResults = true;

CountScores();

ShowCommandTable();

}

}

private void dtpPilotTime_ValueChanged (object sender, EventArgs e)

{

TreeNode node = this.tvCommandsPilots. SelectedNode;

if (node!= null && node. Tag is Pilot && this.cbCountry. SelectedIndex >= 0)

{

Country country = m_championship. Countries [this.cbCountry. SelectedIndex];

Pilot pilot = node. Tag as Pilot;

country. SetResult (pilot, this.dtpPilotTime. Value);

}

}

private void tvCommandsPilots_AfterSelect (object sender, TreeViewEventArgs e)

{

TreeNode node = this.tvCommandsPilots. SelectedNode;

if (node. Tag is Pilot && this.cbCountry. SelectedIndex >= 0)

{

Country country = m_championship. Countries [this.cbCountry. SelectedIndex];

Pilot pilot = node. Tag as Pilot;

try

{

this.dtpPilotTime. Value = country. GetResult(pilot);

}

catch

{

this.dtpPilotTime. Value = this.dtpPilotTime. MinDate;

}

}

}

private void edtCountryName_KeyDown (object sender, KeyEventArgs e)

{

if (e. KeyCode == Keys. Enter)

{

CountryAdd();

}

}

private void edtCommandName_KeyDown (object sender, KeyEventArgs e)

{

if (e. KeyCode == Keys. Enter)

{

CommandAdd();

}

}

private void edtPilotName_KeyDown (object sender, KeyEventArgs e)

{

if (e. KeyCode == Keys. Enter)

{

PilotAdd();

}

}

private void btnNext_Click (object sender, EventArgs e)

{

if (this.tabControl. TabPages. Count - 1 == this.tabControl. SelectedIndex)

return;

switch (this.tabControl. SelectedIndex)

{

case 0:

{

if (m_championship. Countries. Count == 0)

{

MessageBox. Show (

«Нужно ввеcти страну!»,

«Внимание!»,

MessageBoxButtons.OK,

MessageBoxIcon. Warning);

return;

}

}

break;

case 1:

{

if (m_championship. Commands. Count == 0)

{

MessageBox. Show (

«Нужно создать команду!»,

«Внимание!»,

MessageBoxButtons.OK,

MessageBoxIcon. Warning);

return;

}

Int32 pilotsCount = 0;

foreach (Command cmd in m_championship. Commands. Items)

{

pilotsCount += cmd. Pilots. Count;

}

if (pilotsCount == 0)

{

MessageBox. Show (

«Нужно создать пилотов!»,

«Внимание!»,

MessageBoxButtons.OK,

MessageBoxIcon. Warning);

return;

}

}

break;

}

this.tabControl. SelectedIndex++;

}

private void btnBack_Click (object sender, EventArgs e)

{

if (0 == this.tabControl. SelectedIndex)

return;

this.tabControl. SelectedIndex -;

}

private void btnExit_Click (object sender, EventArgs e)

{

this. Close();

Application. Exit();

}

private void MainForm_Load (object sender, EventArgs e)

{

this.btnBack. Visible = (this.tabControl. SelectedIndex!= 0);

}

}

}

6. Контрольный пример

В этом окне вводятся все страны (этапы). По завершении ввода нужно нажать кнопку «Далее».

Здесь мы вводим команды и их пилотов.

В этом окне для каждого пилота команды вводится его время на этапе. Затем нажимаем на выпадающий список и выбираем следующую страну (этап).

Далее мы повторяем ввод времени по каждому отдельному этапу.

Это таблица результатов. В ней видно, что Шумахер М. победил, второе место - Барикелло, а третье - Алонсо.

На этой закладке видим, что команда Ferrari заняла первое место с 57-ю очками, а за ней Renault, Mercedes, Toyota.

Таблица чемпионатов

Очки

Европа

Очки

США

Очки

Россия

Очки

Сумма

очков

Сумма мест

Шумахер М.

1:20:00

10

1:30:00

3

1:20:00

8

1:52:44

10

31

10

Барикелло

1:20:01

8

1:28:00

5

1:22:00

5

2:01:00

8

26

12

Шумахер Р.

1:21:00

6

1:25:00

8

1:30:00

3

2:30:00

4

21

16

Трулли

1:21:01

5

1:25:59

6

1:31:00

2

2:25:00

5

18

18

Монтойа

1:22:00

4

1:32:03

2

1:20:01

6

2:01:01

6

18

18

Алонсо

1:22:01

3

1:23:00

10

1:10:00

10

2:31:01

3

26

14

Иде

1:23:00

2

1:29:00

4

1:28:00

4

2:40:00

1

11

25

Такумо Сато

1:23:01

1

1:40:00

1

1:32:00

1

2:31:02

2

5

31

Командный зачёт

Австралия,

очки

Европа,

очки

США,

очки

Россия,

очки

Сумма очков

Ferrari

18

8

13

18

57

Mercedes

11

14

5

9

39

Renault

7

12

16

9

44

Toyota

3

5

5

3

16

7. Инструкция для пользователя

Для запуска программы необходимо нажать на файл с названием «F1Champ.exe». Далее в появившемся окне ввести название стран (этапов), нажать кнопку «Добавить» (если ввод не правильный - «Удалить») и кнопку «Далее» или «Enter». После этого на экране появится следующая закладка. В ней нужно ввести названия команд (дальше выполняется та же процедура, что и на первой вкладке), после этого необходимо ввести имена пилотов команд. Для этого нужно выделить одним нажатием кнопки мыши ту команду, пилотов которой хотите ввести (без этого ввод не будет выполняться). После нажатия кнопки «Далее» появится окно с тремя полями для ввода. Поле вверху - там выбирается этап для гонки; под ним поле с древовидным списком команд - там выбирается пилот команды; справа поле вида «00:00:00» - это поле для ввода времени пилота на этапе. После окончания ввода времени для пилотов жмём на поле сверху и выбираем следующий этап и повторяем всё снова. Жмём на кнопку «Далее» и видим таблицу чемпионата для каждого пилота, ещё раз жмём на «Далее» и переходим на вкладку «Командный зачёт». Здесь видим только команды без пилотов и очки, которые получаются суммированием очков пилотов данной команды.

Приятного проведения чемпионата!!!

Список литературы

1. Эндрю Троелсен. «С# и платформа.NET. Библиотека программиста» - СПб.: Питер, 2004 - 796 с.: ил.

2. Чарльз Педзольд «Программирование для Microsoft Windows на C#». В 2-х томах. Том 1.: Пер. с англ. - М.: Издательско-торговый дом «Русская редакция», 2002. - 624 с.: ил.

3. Герберт Шилдт «C#: учебный курс» - СПб: Питер, 2003. - 512 с.: ил.

4. Библиотека MSDN.

Размещено на Allbest.ru


Подобные документы

  • Методика и основные этапы создания программы, взаимодействующей с пользователем посредствам графического интерфейса и выполняющей помехоустойчивое кодирование информации, ее цели. Алгоритм работы программы, отладка и проверка ее работоспособности.

    курсовая работа [43,1 K], добавлен 12.05.2013

  • Назначение, основные задачи, функциональные возможности программы Project Expert. Входные и выходные данные системы. Инструментальные средства для работы пользователя. Основные программные модули и диалоги. Решение финансовых и транспортных задач в Excel.

    контрольная работа [3,0 M], добавлен 07.08.2013

  • Формулы расчета емкости плоскопараллельного датчика и его чувствительности. Таблица символических имен: макроопределения, абстрактные классы и функции. Текст программы на языке Си. Результаты в виде таблиц и графиков. Анализ работоспособности программы.

    курсовая работа [988,5 K], добавлен 03.11.2012

  • Размещение элементов графического интерфейса, обработка событий в нем. Написание программы "Домино", результатом работы которой будет графический интерфейс, реализующий одноименную настольную игру. Объектная декомпозиция классов. Текст программы.

    курсовая работа [404,3 K], добавлен 13.10.2014

  • Теоретические аспекты среды программирования Delphi. Сущность понятия жизненного цикла, характеристика спиральной модели. Назначение программы "Графический редактор", ее основные функции. Работа с графическим редактором, документирование программы.

    курсовая работа [695,6 K], добавлен 16.12.2011

  • Разработка программы "Калькулятор" для работы с вещественными числами. Алгоритм работы программы. Набор тестов и варианты исполнения программы. Порядок ввода текста, стандартные ошибки в работе программы. Программная документация, текст программы.

    курсовая работа [225,9 K], добавлен 13.10.2013

  • Осуществление работы разрабатываемой программы на основе алгоритма, использующего Z-буфер. Аналитическое описание программной реализации. Алгоритмы основных функций программы. Содержание руководства пользователя. Файлы программы, пункты главного меню.

    курсовая работа [1,7 M], добавлен 15.04.2015

  • Методы обработки информации при решении прикладных задач. Математическая модель задачи. Блок-схема алгоритма программы. Компоненты, которые используются для работы в программе: элементы интерфейса; процедуры; операторы. Текст программы с пояснениями.

    курсовая работа [954,0 K], добавлен 07.01.2011

  • Типы, основные функции, элементы и принцип работы текстового редактора (компьютерной программы). Методы вставки внешних объектов в текст. Особенности текстового процессора Microsoft Word, его специальные возможности. Типовая структура интерфейса.

    реферат [15,8 K], добавлен 07.12.2010

  • Описание преимуществ среды Turbo Pascal. Алгоритм реализации и текст программы, предназначенной для формирования таблицы футбольного чемпионата и определения команды-победителя. Отладка программного продукта. Представление инструкции пользователю.

    курсовая работа [597,2 K], добавлен 15.03.2011

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.