Вывести список фамилий участников в порядке убывания набранных ими очков - QBasic (27353)
Формулировка задачи:
Всем привет!
Имеется таблица результатов шахматного турнира с N участниками.(Выигрыш-1 очко,ничья -0.5 очка,проигрыш -
0 очков )Вывести список фамилий участников в порядке убывания набранных ими очков,сопроводив его указанием
для каждого участника суммы очков,занятого места и числа побед.Исходная информация вводится с клавиатуры .
Есть также программа.
Если есть возможность ,то можете описать ход решения для того,чтобы проще ориентироваться и читать программу ?
Листинг программы
- CLS
- TYPE ChessTable 'Создем тип для таблицы:
- Uchastnik AS STRING * 10 'Фамилия участника
- Ochki AS SINGLE 'Число очков
- Pobed AS SINGLE 'Число побед
- END TYPE
- INPUT "Vvedite chislo uchastnikov: ", n 'Ввод числа участников
- DIM Table(n) AS ChessTable 'Наша таблица
- FOR i = 1 TO n
- INPUT "Vvedite familiyu uchastnika: ", Table(i).Uchastnik 'Ввод фамилий участников
- NEXT i
- 'Цикл для ввода набранных очков
- FOR i = 1 TO n - 1 'i - первый участник в партии,
- FOR j = i + 1 TO n 'j - второй
- flag = 0 'Обнуляем флаг
- DO
- IF flag = 1 THEN COLOR 4: PRINT "Nevernij vvod": COLOR 7 'Если цикл повторяется не в перый раз, сообщаем о неверном вводе
- PRINT "Skolko ochkov nabral uchastnik "; RTRIM$(Table(i).Uchastnik); " v partii s uchastnikom "; RTRIM$(Table(j).Uchastnik);
- INPUT Ochki 'Собственно, ввод числа очков
- flag = 1
- LOOP UNTIL Ochki = 0 OR Ochki = .5 OR Ochki = 1 'Проверка валидности введенных очков
- Table(i).Ochki = Table(i).Ochki + Ochki 'Присуждаем первому участнику его очки
- Table(j).Ochki = Table(j).Ochki + (1 - Ochki) 'А второму - разность между единицей и очками первого
- IF Ochki = 1 THEN Table(i).Pobed = Table(i).Pobed + 1 'Если у первого 1 очко, присуждаем ему победу
- IF Ochki = 0 THEN Table(j).Pobed = Table(j).Pobed + 1 'А если 0 - значит победил второй, и победу присуждаем ему
- NEXT j
- NEXT i
- 'Цикл для упорядочения участников по очкам
- FOR i = 1 TO n - 1
- max = 0: jmax = 0 'Обнуляем максимальное число очков
- FOR j = i TO n 'Начиная с i-ого участника ищем участника с максимальным числом очков
- IF Table(j).Ochki > max THEN max = Table(j).Ochki: jmax = j
- IF Table(j).Ochki = max AND Table(j).Pobed > Table(jmax).Pobed THEN jmax = j 'Если у участников равное число очков, присуждаем
- 'преимущество тому, у кого больше побед
- NEXT j
- SWAP Table(i), Table(jmax) 'Меняем i-ого участника с тем, у кого максимальное число очков
- NEXT i 'Увеличиваем i на единицу и повторяем цикл, пока не дойдем до последнего участника
- 'Вывод упорядоченной таблицы на экран
- CLS
- PRINT "Mesto", "Uchastnik", "Ochki", "Chislo pobed"
- FOR i = 1 TO n
- IF i <= 3 THEN COLOR 2 ELSE COLOR 7 'Первую тройку выделим зеленым цветом
- PRINT i, Table(i).Uchastnik, Table(i).Ochki, Table(i).Pobed
- NEXT i
- PRINT "Press any key to continue..."
- DO
- LOOP WHILE INKEY$ = ""
Решение задачи: «Вывести список фамилий участников в порядке убывания набранных ими очков»
textual
Листинг программы
- CLS
- TYPE ChessT
- Uchas AS STRING * 10 ' имена участников
- Ochki AS SINGLE ' число очков
- Pobed AS SINGLE ' число побед
- END TYPE
- INPUT "N = "; n ' Ввод числа участников
- DIM Table(n) AS ChessT ' Наша таблица
- DIM Turn(n, n) ' Турнирная таблица
- FOR i = 1 TO n
- INPUT "NAME = "; Table(i).Uchas ' Ввод имён участников
- NEXT i
- REM Заполнение турнирной таблицы
- REM ---------------------------------------------
- FOR i = 1 TO n ' i - первый участник в партии
- FOR j = i TO n ' j - второй
- IF i >= j THEN 100
- PRINT "CHISLO Ochkov Uchastnika"; i; "s"; j;
- INPUT Ochki '
- IF Ochki = .5 THEN
- Turn(i, j) = Ochki
- Turn(j, i) = Ochki
- ELSE
- Turn(i, j) = Ochki
- Turn(j, i) = 1 - Ochki
- END IF
- 100
- NEXT j, i
- REM Подсчет очков и побед
- FOR i = 1 TO n
- FOR j = 1 TO n
- Table(i).Ochki = Table(i).Ochki + Turn(i, j) ' подсчет очков
- IF Turn(i, j) = 1 THEN ' подсчет побед
- Table(i).Pobed = Table(i).Pobed + Turn(i, j)
- END IF
- NEXT j, i
- REM Сортировка участников по количеству очков
- REM -------------------------------------------
- FOR i = 1 TO n - 1
- FOR j = i + 1 TO n
- IF Table(i).Ochki < Table(j).Ochki THEN
- SWAP Table(i), Table(j)
- END IF
- NEXT j, i
- REM Вывод на экран
- CLS
- FOR i = 1 TO n
- IF i <= 3 THEN COLOR 11 ELSE COLOR 13
- PRINT Table(i).Uchas; USING "#.# #"; Table(i).Ochki; Table(i).Pobed
- NEXT i
- END
Объяснение кода листинга программы
- Объявление переменных и типа данных:
n
- количество участников (целое число)Table
- массив структур типаChessT
(имена участников и их очки)Turn
- матрица для турнирной таблицы
- Ввод данных:
- Задается количество участников (
n
) - Вводятся имена участников и их очки
- Задается количество участников (
- Заполнение турнирной таблицы:
- Происходит расчет значений для матрицы
Turn
на основе введенных очков
- Происходит расчет значений для матрицы
- Подсчет очков и побед:
- Происходит подсчет общего количества очков и побед для каждого участника
- Сортировка участников по количеству очков:
- Применяется алгоритм сортировки пузырьком для сортировки участников по убыванию очков
- Вывод на экран:
- Выводится список участников, отсортированный по убыванию очков
- Для каждого участника выводится его имя, количество очков и побед, разделенные символом
#
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д