Задача:
Даны две целочисленные квадратные матрицы порядка 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 | Тест пройден |
Исходный код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
#include <iostream> using namespace std; void input( int a[6][6]){ //Решил осуществить ввод данных с помощью функции. for(int i=0; i<6; i++){ // Экономит место, так как мне необходимо ввести данные в два массива. for(int j=0; j<6; j++){ cin >> a[i][j]; } } } void EQ(int a[6][6], int b[6][6], int c[6]){ // Главная функция. Ставим два счетчика, которые будут увеличивать свое значение, как только встретят отрицательный элемент в строках массивов. for(int i=0; i<6; i++){ int t=0, g=0; for(int j=0; j<6; j++){ // Проверка i - той строки первого массива. if( a[i][j] < 0 ){ t++; // Увеличение первого счетчика. } } for(int j=0; j<6; j++){ // Проверка i - той строки второго массива. if( b[i][j] < 0 ){ g++; // Увеличение второго счетчика. } } c[i]= t == g? 1 : 0; // Условие: "Если значение первого счетчика равно значению второго, то записываем в результирующий массив единицу, иначе нуль." } } void output( int a[6]){ // Функция для печати результирующей последовательности for(int i=0; i<6; i++){ cout<< a[i] <<" "; } } int main() { int a[6][6], b[6][6]; // Объявление массивов. int c[6]; input(a); // Применение функций. input(b); EQ(a, b, c); output (c); return 0; //Конец. } |
Код на Java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
import java.util.*; import java.lang.*; import java.io.*; public class Main { private static StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in))); private static PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out)); public static int nextInt() throws IOException{ in.nextToken(); return (int)in.nval; } public static void read(int[][] a) throws IOException{ int n = a.length; int m = a[0].length; for(int i = 0; i < n; i++){ for(int j = 0; j < m; j++){ a[i][j] = nextInt(); } } } public static void print(int[] a){ int m = a.length; for(int j = 0; j < m; j++){ out.print(a[j]); } out.println(); } public static void EQ(int[][] a, int[][] b, int[] c){ for(int i = 0; i < a.length; i++){ int t=0, g=0; for(int j=0; j < a.length; j++){ if( a[i][j] < 0 ){ t++; } } for(int j=0; j < b.length; j++){ if( b[i][j] < 0 ){ g++; } } c[i] = t == g? 1 : 0; } } public static void main (String[] args) throws java.lang.Exception { int [][] a = new int[6][6], b = new int[6][6]; int [] c = new int [6]; read(a); read(b); EQ(a,b,c); print(c); out.flush(); } } |
Описание:
Для решения данной задачи я решил ввести два счетчика, которые считают количество отрицательных чисел. Потом мы сравниваем счетчики каждого массива. Если в соответствующих строках данных массивов равное число отрицательных элементов, то и равное число неотрицательных. В таком случае мы должны напечатать «1», в противном случае «0».
Алгоритм:
- Создаем функцию для ввода данных.
- Создаем первый цикл для перебора строк.
- Создаем вложенный цикл для перебора каждого элемента массива и функцию ввода данных.
- Создаем главную функцию.
- Создаем цикл, перебирающий строки массивов.
- Создаем два счетчика.
- Создаем первый вложенный цикл, для перебора каждого элемента второго массива.
- В случае обнаружения отрицательных элементов, увеличиваем счетчик.
- Создаем первый вложенный цикл, для перебора каждого элемента второго массива.
- В случае обнаружения отрицательных элементов, увеличиваем счетчик.
- Объявляем условие вывода данных. Так как условие находится внутри главного цикла, то будет выведено по одному значению, которое характеризует каждую строку.
- Создаем функцию для печати результата.
- Один цикл для перебора каждого элемента одномерного массива.
- В функции «int main ()»:
- Вводим значения элементов первого массива.
- Вводим значения элементов второго массива.
- Применяем главную функцию к данным массивам.
- Печатаем результат.
- Окончание работы программы.
Функция пересчета отрицательных элементов в заданной строке заданного массива.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
#include <iostream> using namespace std; void check(int **arr, int m, int n, int i){ int k = 0; for(int j = 0; j < n; j++){ if(arr[i][j] < 0){ k++; } } return k; } int main() { int **a = new int*[3]; for(int i=0; i<3; i++){ a[i] = new int[3]; for( int j=0; j<3; j++){ cin >> a[i][j]; } } check(a, 3, 3, 1); return 0; } |
Хорошая работа.
Но есть несколько замечаний.
— Нужно сформировать массив (последовательность) В. Её просят «найти», а не просто напечатать.
— EQ обещает вернуть целое число?
— Вы удачно использовали функции. Может продолжите и сделаете функцию для подсчёта отрицательных чисел в указанной строке указанного массива?
Массив сформировал, теперь печатаю его, а не промежуточные показания функции.
Теперь EQ записывает свои показания в новый массив и ничего не возвращает.
Функцию сделал. К сожалению она не будет работать в коде задачи, поэтому я сделал для нее отдельный пример.
В вышеприведенном коде приведен заголовок функции
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 в Ваших тестах достигается только на равных строках, а ведь в общем случае они могут просто иметь равное количество отрицательных элементов, даже, возможно, на разных позициях в строках.
Недоразумение с третьим массивом в функции EQ исправил. Вариант тернарного оператора заменил на один из рекомендуемых Вами. Также внес инициализацию переменных «t» и «g» в цикл (когда писал программу, не подумал о таком решении). Для наглядности добавил еще один тест, в котором попытался учесть беспокоящие Вас варианты.
А почему для последнего теста не указано пройден ли он?
В общем задание засчитано, 10 баллов, хотя жаль, что Вы не применили функцию подсчета количества отрицательных элементов в строке в основной программе.
Кстати, строки отчета:
«E. Объявляем условие вывода данных. Так как условие находится внутри главного цикла, то будет выведено по одному значению, которое характеризует каждую строку.
F. Обнуление счетчиков.»
по моему, несколько устарели и относятся к прошлому варианту программы.