Задача: Дана действительная квадратная матрица порядка [latex]n[/latex]. В строках с отрицательным элементом на главной диагонали найти наибольший из всех элементов.
Тесты:
n | matrix | results the biggest element in line | ||||||||||||||||||||||||||||||
4 |
|
|
||||||||||||||||||||||||||||||
5 |
|
|
||||||||||||||||||||||||||||||
0 | — | error: wrong value of n | ||||||||||||||||||||||||||||||
3 |
|
|
Код програмы:
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 |
#include <stdio.h> #include <float.h> // назначение макросов #define MAX 10 #define X_INIT (-DBL_MAX) int main(void) { // рабочие переменные int n; int i; int j; double x; double arr[MAX][MAX]; // проверка ввода порядка n if( scanf("%d", &n ) <= 0 ) { printf("error: incomplete input of n\n"); return 0; } if( n <= 1 || n > MAX ) { printf("error: wrong value of n\n"); return 0; } // ввод матрицы с проверкой for( i = 0; i < n; i++) { for( j = 0; j < n; j++) { if( scanf("%lf", &arr[i][j] ) < 1 ) { printf("error: incomplete input of array\n"); return 0; } } } // печать введённой матрицы для отладки printf("input array:\n"); for( i = 0; i < n; i++) { for( j = 0; j < n; j++) { printf("\t%2.2lf", arr[i][j]); } printf("\n"); } // вывод результата, содержит номер строки, где необходимо было искать наибольший элемент printf("result:\n"); for( i = 0; i < n; i++) { x = X_INIT; if( arr[i][i] < 0 ) { for( j = 0; j < n; j++) { if( arr[i][j] > x ) x = arr[i][j]; } printf("line = %d, max = %2.2lf\n", i, x); } } 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 71 72 73 74 75 76 77 78 79 80 |
import java.util.*; import java.lang.*; import java.io.*; class MatrixApp { private static final int X_INIT = -Integer.MAX_VALUE; public static Integer scanInteger( Scanner in ) { return ( ( in.hasNextInt() ) ? in.nextInt() : null ); } public static Double scanDouble( Scanner in ) { return ( ( in.hasNextDouble() ) ? in.nextDouble() : null ); } public static void main( String[] args ) { // проверка ввода порядка n Scanner in = new Scanner(System.in); int n = scanInteger( in ); if( n <= 0 ) { System.out.printf("error: incomplete input of n\n"); return; } if( n <= 1 ) { System.out.printf("error: wrong value of n\n"); return; } // создаем массив нужной размерности double arr[][] = new double[n][n]; // ввод матрицы с проверкой for( int i = 0; i < n; i++ ) { for( int j = 0; j < n; j++ ) { arr[i][j] = scanDouble( in ); } } in.close(); // печать введённой матрицы для отладки System.out.printf("input array:\n"); for( int i = 0; i < n; i++ ) { for( int j = 0; j < n; j++ ) { System.out.printf("\t%2.2f", arr[i][j]); } System.out.printf("\n"); } // вывод результата, содержит номер строки, где необходимо было искать наибольший элемент System.out.printf("result:\n"); for( int i = 0; i < n; i++ ) { if( arr[i][i] < 0 ) { double x = arr[i][0]; for( int j = 1; j < n; j++ ) { if( arr[i][j] > x ) x = arr[i][j]; } System.out.printf("line = %d, max = %2.2f\n", i, x); } } } } |
Ссылка:https://ideone.com/kCDer9
План программы:
- Назначение макросов
- Назначение рабочих переменных
- Проверка ввода порядка n
- Проверка ввода матрицы
- Печать введённой матрицы для отладки
- Вывод результата, содержит номер строки, где необходимо было искать наибольший элемент
Программе задаётся квадратная матрица порядка [latex]n[/latex]. На тех строках, где на главную диагональ попадает отрицательный элемент, программа отыскивает наибольший элемент в строке и выводит его.
Для поиска наибольшего значения в строке используется макрос X_INIT. Он используется в качестве начального значения максимума. Этим наименьшим значением является взятый с отрицательным знаком макрос DBL_MAX из библиотеки float.h , обозначающий наибольшее значение.
Ссылка на ideone.com: http://ideone.com/toMrOv
А вам не кажется, что один из циклов for( j = 0; j < n; j++) в строках 57 и 61 лишний?
Поясните, пожалуйста в отчете, что такое X_INIT и зачем мы изначально его записываем в переменную x. И вообще, правильно что X_INIT определен как DBL_MIN (а что такое тогда DBL_MIN)? Для того, чтобы определить правильно ли Вы написали этот фрагмент в программе, предлагаю ввести тест, где в какой-то строке будут только отрицательные числа (пока что такого теста у Вас нет).
Уже исправил и добавил пояснения. Ожидаю проверки.
DBL_MIN использовался неправильно, заменён на DBL_MAX с отрицательным знаком.
«Для поиска наименьшего значения в строке используется » -исправьте на «Для поиска наибольшего значения в строке используется «, а то смысл меняется на противоположный. Также советую все же в отчете указать, что X_INIT используется в качестве начального значения максимума.
Зачтено, 10 баллов.
По Java.
— MIN_VALUE не совпадает с -MAX_VALUE. И они оба Вам не нужны.
— ARRSIZE_MAX и все проверки вокруг него излишне. Введите размер матрицы и создайте массив этого размера.
Понял, уже переделываю.