А413б

Задача

Таблица футбольного чемпионата задана квадратной матрицей порядка [latex]n[/latex], в которой все элементы, принадлежащие главной диагонали, равны нулю, а каждый элемент, не принадлежащий главной диагонали, равен  [latex]2[/latex],  [latex]1[/latex]  или  [latex]0[/latex] (числу очков, набранных в игре:  [latex]2[/latex]- выигрыш,  [latex]1[/latex]- ничья,   [latex]0[/latex]- проигрыш).

б) Определить номера команд, прошедших чемпионат без поражений.

Количество команд. Турнирная таблица.

Номера команд, прошедшие турнир без поражений.

Комментарий.
4
0 2 0 1
0 0 1 2
2 1 0 1
1 0 1 0
3 Пройдено.
4
0 1 2 2
1 0 2 2
0 0 0 1
0 0 1 0
1 2 Пройдено.
3
0 2 0
0 0 2
2 0 0
Ни одна из команд не прошла турнир без поражений. Пройдено.
4
0 2 1 1
0 0 1 2
1 1 0 2
1 2 2 0
1 3 4 Пройдено.

От нас требуют определить номера команд, прошедших чемпионат без поражений. Турнирная таблица, которую нам следует проверить, имеет вид матрицы, где строки- это очки набранные командой, а столбцы- сами команды. Всего у нас столько команд, сколько элементов в столбце. Т.к команда  не может играть сама с собой, диагональные элементы равны [latex]0[/latex].

Для начала вводим двумерный массив. Далее, в циклах, проверяем на наличие у команды поражения: для не диагональных элементов ([latex]i\neq j[/latex]), если команда хотя бы один раз проиграла, цикл обрывается и команда в дальнейшей проверке не участвует.

Если ни одна команда не прошла турнир без поражений, то для этого заводим счетчик [latex]k[/latex]. Если [latex]k>0[/latex], то хотя бы одна команда прошла турнир без поражений. Если [latex]k=0[/latex], то ни одна из команд не прошла без поражений.

Ниже представлен сам код (C++).

Код на Java:

 

Также, вы можете воспользоваться ссылкой (C++)/ссылкой (Java) на саму программу.

Related Images:

13 thoughts on “А413б

    • В массивах элементы нумеруются с 0 по умолчанию (от 0 до n, не включая n). Ничего не изменится если элементы будут нумероваться от 1 до n, включая n.
      Команд с «нулевым» номером нету. Есть первая, вторая, третья и т. д.

    • А почему тогда не обратиться к миллионному элементу? Тоже же ничего не поменяется. Вот только массив Вы выделяете определенного размера и у каждой его ячейки есть свой номер. Это не map.

    • Я, честно говоря, не понимаю в чем ошибка. Программа работает, за пределы массива не выходит, команды выводит адекватно. В чем ошибка?

    • Вот так вот программисты не понимают, что допустили ошибку, пока их программа не вылетает внезапно с Access violation или не глючит загадочным образом. Вы обращаетесь к элементам n-той строки и n-того столбца, которых в массиве int A[n][n]; попросту нет. Но Вы ведь записываете в такие ячейки какие-то значения, куда же они попадают? В чужую область памяти — область занятую чем-то еще.

    • Бывает забавнее, когда вместо Access Violation программист получает вердикт Wrong Answer и долго ищет ошибку в правильном, казалось бы, решении. И удивляется: как же так, я записал сюда 3, почему здесь стало -10?

  1. Как же исправить ошибку с индексами массивов?
    Возможные пути:
    1) в данном случае самый простой — использовать индексы от 0 до n-1, как принято в сишных массивах,
    2) если первый способ неудобен, есть очень простое, но грязноватое решение — объявить массив размерности на единицу больше и нулевой элемент просто игнорировать — для матрицы int A[n+1][n+1]; — к сожалению упрется еще в большие расходы памяти.
    3) использовать индексы от 1 до n, но при обращении к массиву каждый раз вычитать единицу из индексов, например, так: A[i-1][j-1]

    А теперь вопрос к Илье — по моему, я это подробно рассказывал Вашей группе. По крайней мере, я люблю об этом рассказывать. Неужели я забыл это рассказать?

  2. Теперь программа правильная, отлично! Единственное, есть замечания по стилю кодирования. Вместо if(win==true) лучше писать if(win), кроме того переменной win не присваивается начальное значение, если команда всего одна, в переменной будет мусор. Кроме того, переменная win объявлена немного не там, лучше всего делать переменные как можно более локальными. Так как условие «пройти без поражений» проверяется для каждой команды (команды для проверки перебираются в цикле по i), логично внести переменную win в цикл по i, и там заодно ей присвоить изначальное значение. Начальное значение — это очевидно true (до того как мы начали проверять команду, поражений у нее еще нет изначально), заодно еще одно присваивание true можно убрать, т.к. если нашлась победа или ничья ситуация не меняется, команда все так же является претендентом на прохождение без поражений, как и раньше. Условие меняется, если найдено поражение — команда немедленно выбывает из претендентов на беспроигрышное прохождение — это часть у Вас написана абсолютно верно.
    Ну и последнее: cout<<" ни одна из команд не прошла турнир."; выводимое сообщение странно выглядит, как будто ни одна из команд турнир не закончила вообще, забыли дописать «без поражений».

    Четвертый тест некорректен — как у Вас в нем 4-я команда сыграла с 3-ей и 2-ой? Обоим командам в этих парах зачислено по 2 очка за матч.

    • В ideone-не нету отладчика, и по-этому нельзя посмотреть, что хранится в различных переменных. Я старался записывать все наглядно.
      «Если команда всего одна, в переменной будет мусор.»- где Вы видели турнирную таблицу, состоящею из одной команды? 🙂
      «Ну и последнее: cout< <" ни одна из команд не прошла турнир.""- согласен, смотрится странно, исправлено.
      "Четвертый тест некорректен — как у Вас в нем 4-я команда сыграла с 3-ей и 2-ой? Обоим командам в этих парах зачислено по 2 очка за матч."- я знаю. Я не старался записать правильно очки команд. Я хотел показать, что программа ищет проигравшие команды корректно.

  3. Засчитано, 10 баллов.

    Тем не менее, насчет стиля программирования можно спорить очень долго. Одни и те же действия можно запрограммировать по разному и наша задача научить студентов это делать более-менее оптимально и надежно. Просто я указал, что переменная win не самым логичным и оптимальным способом обрабатывается, хотя и правильным (на правильных тестах).

    «Я не старался записать правильно очки команд. Я хотел показать, что программа ищет проигравшие команды корректно.» — тогда желательно отметить в отчете, что этот тест некорректный, но тем не менее , программа корректно его обрабатывает.

Добавить комментарий