A412г

Задача:

Даны две целочисленные квадратные матрицы порядка 6. Найти последовательность из нулей и единиц  [latex]b_{1} , … , b_{6}[/latex] такую, что [latex]b_{i} = 1[/latex], когда:

г) количество отрицательных и неотрицательных элементов [latex] i [/latex]- строки первой матрицы совпадает соответственно с количеством отрицательных и неотрицательных элементов [latex] i[/latex]-строки второй матрицы.

 

  Матрица [latex]A[/latex]

    Матрица [latex]B[/latex]

     Ожидаемый      результат

 Комментарий

   1 1 1 1 1 1
1 1 1 1 1 1
1 1 1 1 1 1
1 1 1 1 1 1
1 1 1 1 1 1
1 1 1 1 1 1
1 1 1 1 1 1
1 1 1 1 1 1
1 1 1 1 1 1
1 1 1 1 1 1
1 1 1 1 1 1
1 1 1 1 1 1
                  1 1 1 1 1 1          Тест пройден
1 1 1 1 1 1
1 1 1 1 1 1
1 1 1 1 1 1
1 1 1 1 1 1
1 1 1 1 1 1
1 1 1 1 1 1
-1 -1 -1 -1 -1 -1
-1 -1 -1 -1 -1 -1
-1 -1 -1 -1 -1 -1
-1 -1 -1 -1 -1 -1
-1 -1 -1 -1 -1 -1
-1 -1 -1 -1 -1 -1
                    0 0 0 0 0 0          Тест пройден
 0 2 2 3 4 4
1 3 3 4 5 5
2 4 4 5 6 6
3 5 5 6 7 7
4 6 6 7 8 8
5 7 7 8 9 9
0 2 2 3 4 4
-1 3 1 4 3 5
-2 4 0 5 2 6
-3 5 -1 6 1 7
-4 6 -2 7 0 8
-5 7 -3 8 -1 9
                    1 0 0 0 0 0          Тест пройден
0 2 2 3 4 4
1 3 3 -4 5 5
2 4 -4 5 6 6
3 -5 5 6 7 -7
4 6 -6 -7 8 8
5 -7 7 -8 9 -9
0 2 2 3 4 4
-1 3 1 4 3 5
-2 4 0 5 2 6
-3 5 -1 6 1 7
-4 6 -2 7 0 8
-5 7 -3 8 -1 9
                   1 1 1 1 1 1          Тест пройден

Исходный код:

Код на Java

 

Описание:

Для решения данной задачи я решил ввести два счетчика, которые считают количество отрицательных чисел. Потом мы сравниваем счетчики каждого массива. Если в соответствующих строках данных массивов равное число отрицательных элементов, то и равное число неотрицательных.  В таком случае мы должны напечатать «1», в противном случае «0».

 Алгоритм:

  1. Создаем функцию для ввода данных.
    1. Создаем первый цикл для перебора строк.
    2. Создаем вложенный цикл для перебора каждого элемента массива и функцию ввода данных.
  2. Создаем главную функцию.
    1. Создаем цикл, перебирающий строки массивов.
    2. Создаем два счетчика.
    3. Создаем первый вложенный цикл, для перебора каждого элемента второго массива.
      • В случае обнаружения отрицательных элементов, увеличиваем счетчик.
    4. Создаем первый вложенный цикл, для перебора каждого элемента второго массива.
      • В случае обнаружения отрицательных элементов, увеличиваем счетчик.
    5. Объявляем условие вывода данных. Так как условие находится внутри главного цикла, то будет выведено по одному значению, которое характеризует каждую строку.
  3. Создаем функцию для печати результата.
    1. Один цикл для перебора каждого элемента одномерного массива.
  4. В функции «int main ()»:
    1. Вводим значения элементов первого массива.
    2. Вводим значения элементов второго массива.
    3. Применяем главную функцию к данным массивам.
    4. Печатаем результат.
    5. Окончание работы программы.

Ссылка на Ideone.

 Функция пересчета отрицательных элементов в заданной строке заданного массива.

Рабочий образец.

 

 

5 thoughts on “A412г

  1. Хорошая работа.
    Но есть несколько замечаний.
    — Нужно сформировать массив (последовательность) В. Её просят «найти», а не просто напечатать.
    — EQ обещает вернуть целое число?
    — Вы удачно использовали функции. Может продолжите и сделаете функцию для подсчёта отрицательных чисел в указанной строке указанного массива?

  2. Массив сформировал, теперь печатаю его, а не промежуточные показания функции.
    Теперь EQ записывает свои показания в новый массив и ничего не возвращает.
    Функцию сделал. К сожалению она не будет работать в коде задачи, поэтому я сделал для нее отдельный пример.

  3. В вышеприведенном коде приведен заголовок функции
    void EQ(int a[6][6], int b[6][6])
    — какое c тогда в ней используется? И как это соответствует вызову EQ(a, b, c);? Разгадка проста — видимо код на ideone правильный и Вы забыли последнюю версию скопировать в отчет.

    Есть две серьезные претензии по стилю. Т.е. фрагменты верные, но так лучше не писать.

    1) Вместо t == g? c[i]= 1 : c[i]=0; пишите или if (t == g) c[i]= 1; else c[i]=0; или c[i]= t==g?1:0; (можно c[i]= (t==g)?1:0;). Т.е. тернарный оператор предназначен для вычисления различных значений выражения в зависимости от истинности условия , а не для выполнения различных действий.

    2) int t=0, g=0; — переменные локальны в итерации цикла по i, значит в теле цикла по i их и нужно объявить, заодно исчезнет корявая конструкция t=0;                             // Обнуляем переменные.        g=0;                             //
    в конце тела цикла.

    Теперь по поводу «Функцию сделал. К сожалению она не будет работать в коде задачи, поэтому я сделал для нее отдельный пример.»
    Для начала отмечу, что функция должна возвращать, а не печатать число отрицательных чисел в строке. Иначе применить ее в Вашей задаче не получится, ведь Вам не нужно печатать это число?
    Поэтому исправим ее заголовок

    Заодно я исправил имя на более информативное. Беда в том, что ни массив a, ни массив b Вы в нее не передадите, т.к. она ожидает массив указателей (на динамически выделенные массивы) — а не статический двумерный массив. Предлагаю Вам два способа исправить тип параметров:

    или

    или

    или даже

    Первые два варианта не универсальны, в третьем приходится использовать шаблоны функций, которые Вы еще не учили, самый интересный четвертый: в нем функция применяется просто к одномерному массиву размера n — в качестве этого массива и нужно передать i-тую строку матрицы (т.е. count_negative(a[i],6))

    И уж напоследок о тестах. У вас ответ 1 в Ваших тестах достигается только на равных строках, а ведь в общем случае они могут просто иметь равное количество отрицательных элементов, даже, возможно, на разных позициях в строках.

  4. Недоразумение с третьим массивом в функции EQ исправил. Вариант тернарного оператора заменил на один из рекомендуемых Вами. Также внес инициализацию переменных «t» и «g» в цикл (когда писал программу, не подумал о таком решении). Для наглядности добавил еще один тест, в котором попытался учесть беспокоящие Вас варианты.

  5. А почему для последнего теста не указано пройден ли он?

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

    Кстати, строки отчета:
    «E. Объявляем условие вывода данных. Так как условие находится внутри главного цикла, то будет выведено по одному значению, которое характеризует каждую строку.
    F. Обнуление счетчиков.»
    по моему, несколько устарели и относятся к прошлому варианту программы.

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