Advertisement
SashkoKlincharov

[Java][НП] - Матрица од реални броеви

Aug 26th, 2021
150
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 16.34 KB | None | 0 0
  1.  
  2.  
  3. Да се напише класа која чува матрица од double вредности DoubleMatrix. Класата треба да е immutable, односно откако еднаш ќе се инстанцира да не може да се менува состојбата на објектот, односно да не може да се менуваат податоците зачувани во него. За потребите на класата треба да се имплементираат следните методи:
  4.  
  5. DoubleMatrix(double a[], int m, int n) - конструктор кој прима низа од реални броеви каде што m и n се димензиите на матрицата. Од елементите на низата треба да се креира матрица. Доколку нема доволно елементи во низата тогаш да се фрли исклучок InsufficientElementsException, а доколку има повеќе елементи да се земат последните m x n вредности и со нив се потполнува матрицата, т.е. да се игнорираат вишокот на броеви од почетокот на низата
  6. getDimensions():String - метод кој враќа стринг во формат [m x n]
  7. rows():int - метод кој враќа број на редови
  8. columns():int - метод кој враќа број на колони
  9. maxElementAtRow(int row):double- метод кој го враќа максималниот елемент во дадениот ред, доколку вредноста е ред кој не постои да се фрли исклучок InvalidRowNumberException (row има вредност [1, m])
  10. maxElementAtColumn(int column):double- метод кој го враќа максималниот елемент во дадената колона, доколку вредноста е колона кој не постои да се фрли исклучок InvalidColumnNumberException (column има вредност [1, n])
  11. sum() : double - метод кој ја враќа сумата на сите елементи од матрицата
  12. toSortedArray():double[] – метод кој враќа еднодимензионална низа каде вредностите се сортирани во опаѓачки редослед
  13. toString() - методот, каде броевите се заокружени на 2 децимални места, меѓу себе се одделени со табулаторско место \t а редовите на матрицата се одделени со нов ред
  14. да се преоптоварат equals() и hashCode() методите
  15.  
  16. Забелешка: Исклучоците не треба да се фаќаат, треба само да се фрлаат
  17.  
  18. Да се дефинира класаInsufficientElementsException која што наследува од класата Exception и при фрлање на исклучок се добива порака"Insufficient number of elements"
  19.  
  20. Да се дефинира класа InvalidRowNumberExceptionкоја што наследува од класата Exception и при фрлање на исклучок се добива порака "Invalid row number"
  21.  
  22. Да се дефинира класа InvalidColumnNumberException која што наследува од класата Exception и при фрлање на исклучок се добива порака "Invalid column number"
  23.  
  24. Покрај класата DoubleMatrix треба да напишете дополнително уште една класа која ќе служи за вчитување на матрица од реални броеви од влезен тек на податоци. Оваа класа треба да се вика MatrixReader и во неа треба да имате еден public static метод за вчитување на матрица од реални броеви од InputStream
  25.  
  26. read(InputStream input):DoubleMatrix - вчитува матрица од реални броеви од input зададена во следниот формат: Во првата линија има два цели броеви кои кажуваат колку редови и колони има матрицата, а во наредните редови се дадени елементите на матрицата по редови, одделени со едно или повеќе празни места
  27. import java.util.Arrays;
  28. import java.util.Objects;
  29. import java.io.ByteArrayInputStream;
  30. import java.util.Scanner;
  31. import java.text.DecimalFormat;
  32. import java.io.InputStream;
  33. import java.io.InputStreamReader;
  34. class InvalidRowNumberException extends Throwable {
  35. public InvalidRowNumberException() {
  36. super("Invalid row number");
  37. }
  38. }
  39.  
  40. class InvalidColumnNumberException extends Throwable {
  41. public InvalidColumnNumberException() {
  42. super("Invalid column number");
  43. }
  44. }
  45. class InsufficientElementsException extends Exception {
  46.  
  47. public InsufficientElementsException() {
  48. super("Insufficient number of elements");
  49. }
  50. }
  51.  
  52. class MatrixReader {
  53. private static double[] matrix;
  54.  
  55. public static DoubleMatrix read(ByteArrayInputStream inputStream) throws InsufficientElementsException {
  56. Scanner s = new Scanner(inputStream);
  57. int m,n;
  58. int k = 0;
  59. m = s.nextInt();
  60. n = s.nextInt();
  61. matrix = new double[m*n];
  62. for (int i = 0; i < m; i++) {
  63. for (int j = 0; j < n; j++) {
  64. matrix[k++] = s.nextDouble();
  65. }
  66. s.nextLine();
  67.  
  68. }
  69. return new DoubleMatrix(matrix,m,n);
  70. }
  71. }
  72.  
  73. final class DoubleMatrix {
  74. private double [][] matrix;
  75. private int rows;
  76. private int columns;
  77.  
  78. public DoubleMatrix(double a[], int m, int n) throws InsufficientElementsException {
  79. if(m * n > a.length)
  80. throw new InsufficientElementsException();
  81.  
  82. matrix = new double[m][n];
  83. rows = m;
  84. columns = n;
  85. int zemiOdKojDaPocnam = 0;
  86. if(m * n < a.length)
  87. zemiOdKojDaPocnam = a.length - (m * n);
  88.  
  89. for (int i = 0; i < m; i++) {
  90. for (int j = 0; j < n; j++) {
  91. matrix[i][j] = a[zemiOdKojDaPocnam++];
  92. }
  93. }
  94. }
  95.  
  96. public String getDimensions(){
  97. return String.format("[%d x %d]",rows,columns);
  98. }
  99.  
  100. public int rows() {
  101. return rows;
  102. }
  103.  
  104. public int columns() {
  105. return columns;
  106. }
  107.  
  108. public double maxElementAtRow(int row) throws InvalidRowNumberException {
  109. if(row>rows || row <= 0)
  110. throw new InvalidRowNumberException ();
  111. double max = -999.0;
  112. for (int i = 0; i < columns; i++) {
  113. if(matrix[row-1][i] > max){
  114. max = matrix[row-1][i];
  115. }
  116. }
  117. return max;
  118. }
  119.  
  120. public double maxElementAtColumn(int column) throws InvalidColumnNumberException {
  121. if(column>columns || column <= 0)
  122. throw new InvalidColumnNumberException();
  123. double max = -9999.0;
  124. for (int i = 0; i < rows; i++) {
  125. if(matrix[i][column-1] > max){
  126. max = matrix[i][column-1];
  127. }
  128. }
  129. return max;
  130. }
  131.  
  132. public double sum(){
  133. double sum = 0;
  134. for (int i = 0; i < rows; i++) {
  135. for (int j = 0; j < columns; j++) {
  136. sum+=matrix[i][j];
  137. }
  138. }
  139. return sum;
  140.  
  141. //Stream
  142.  
  143. }
  144. public double [] toSortedArray(){
  145. // return Arrays.stream(matrix).sorted().toArray();
  146. double [] array = new double[rows*columns];
  147. int k = 0;
  148. for(int i=0;i<rows;i++){
  149. for (int j = 0; j < columns; j++) {
  150. array[k++] = matrix[i][j];
  151. }
  152. }
  153.  
  154. for (int i = 1; i < array.length; i++) {
  155. for (int j = 0; j < i; j++) {
  156. if(array[i]>array[j]){
  157. double s = array[i];
  158. array[i] = array[j];
  159. array[j] = s;
  160. }
  161. }
  162. }
  163. return array;
  164. }
  165.  
  166. public String toString() {
  167. StringBuilder sb = new StringBuilder();
  168. for (int i = 0; i < rows; i++) {
  169. for (int j = 0; j < columns; j++) {
  170. if(!(j+1 >= columns))
  171. sb.append(String.format("%.2f\t",matrix[i][j]));
  172. else
  173. sb.append(String.format("%.2f",matrix[i][j]));
  174. }
  175. if(!(i+1 >=rows))
  176. sb.append("\n");
  177. }
  178. return sb.toString();
  179. }
  180.  
  181. @Override
  182. public boolean equals(Object obj) {
  183. if(this==obj)
  184. return true;
  185. if(obj==null)
  186. return false;
  187. if(obj.getClass() != this.getClass())
  188. return false;
  189. DoubleMatrix pom = (DoubleMatrix) obj;
  190. if(pom.columns!=this.columns)
  191. return false;
  192. if(pom.rows!=this.rows)
  193. return false;
  194.  
  195. return Arrays.deepEquals(this.matrix, pom.matrix);
  196.  
  197. }
  198.  
  199. @Override
  200. public int hashCode() {
  201. int prime = 7;
  202. prime = prime * 31 + Arrays.deepHashCode(this.matrix);
  203. return prime;
  204. }
  205. }
  206.  
  207.  
  208.  
  209. public class DoubleMatrixTester {
  210.  
  211. public static void main(String[] args) throws Exception {
  212. Scanner scanner = new Scanner(System.in);
  213.  
  214. int tests = scanner.nextInt();
  215. DoubleMatrix fm = null;
  216.  
  217. double[] info = null;
  218.  
  219. DecimalFormat format = new DecimalFormat("0.00");
  220.  
  221. for (int t = 0; t < tests; t++) {
  222.  
  223. String operation = scanner.next();
  224.  
  225. switch (operation) {
  226. case "READ": {
  227. int N = scanner.nextInt();
  228. int R = scanner.nextInt();
  229. int C = scanner.nextInt();
  230.  
  231. double[] f = new double[N];
  232.  
  233. for (int i = 0; i < f.length; i++)
  234. f[i] = scanner.nextDouble();
  235.  
  236. try {
  237. fm = new DoubleMatrix(f, R, C);
  238. info = Arrays.copyOf(f, f.length);
  239.  
  240. } catch (InsufficientElementsException e) {
  241. System.out.println("Exception caught: " + e.getMessage());
  242. }
  243.  
  244. break;
  245. }
  246.  
  247. case "INPUT_TEST": {
  248. int R = scanner.nextInt();
  249. int C = scanner.nextInt();
  250.  
  251. StringBuilder sb = new StringBuilder();
  252.  
  253. sb.append(R + " " + C + "\n");
  254.  
  255. scanner.nextLine();
  256.  
  257. for (int i = 0; i < R; i++)
  258. sb.append(scanner.nextLine() + "\n");
  259.  
  260. fm = MatrixReader.read(new ByteArrayInputStream(sb
  261. .toString().getBytes()));
  262.  
  263. info = new double[R * C];
  264. Scanner tempScanner = new Scanner(new ByteArrayInputStream(sb
  265. .toString().getBytes()));
  266. tempScanner.nextDouble();
  267. tempScanner.nextDouble();
  268. for (int z = 0; z < R * C; z++) {
  269. info[z] = tempScanner.nextDouble();
  270. }
  271.  
  272. tempScanner.close();
  273.  
  274. break;
  275. }
  276.  
  277. case "PRINT": {
  278. System.out.println(fm.toString());
  279. break;
  280. }
  281.  
  282. case "DIMENSION": {
  283. System.out.println("Dimensions: " + fm.getDimensions());
  284. break;
  285. }
  286.  
  287. case "COUNT_ROWS": {
  288. System.out.println("Rows: " + fm.rows());
  289. break;
  290. }
  291.  
  292. case "COUNT_COLUMNS": {
  293. System.out.println("Columns: " + fm.columns());
  294. break;
  295. }
  296.  
  297. case "MAX_IN_ROW": {
  298. int row = scanner.nextInt();
  299. try {
  300. System.out.println("Max in row: "
  301. + format.format(fm.maxElementAtRow(row)));
  302. } catch (InvalidRowNumberException e) {
  303. System.out.println("Exception caught: " + e.getMessage());
  304. }
  305. break;
  306. }
  307.  
  308. case "MAX_IN_COLUMN": {
  309. int col = scanner.nextInt();
  310. try {
  311. System.out.println("Max in column: "
  312. + format.format(fm.maxElementAtColumn(col)));
  313. } catch (InvalidColumnNumberException e) {
  314. System.out.println("Exception caught: " + e.getMessage());
  315. }
  316. break;
  317. }
  318.  
  319. case "SUM": {
  320. System.out.println("Sum: " + format.format(fm.sum()));
  321. break;
  322. }
  323.  
  324. case "CHECK_EQUALS": {
  325. int val = scanner.nextInt();
  326.  
  327. int maxOps = val % 7;
  328.  
  329. for (int z = 0; z < maxOps; z++) {
  330. double work[] = Arrays.copyOf(info, info.length);
  331.  
  332. int e1 = (31 * z + 7 * val + 3 * maxOps) % info.length;
  333. int e2 = (17 * z + 3 * val + 7 * maxOps) % info.length;
  334.  
  335. if (e1 > e2) {
  336. double temp = work[e1];
  337. work[e1] = work[e2];
  338. work[e2] = temp;
  339. }
  340.  
  341. DoubleMatrix f1 = fm;
  342. DoubleMatrix f2 = new DoubleMatrix(work, fm.rows(),
  343. fm.columns());
  344. System.out
  345. .println("Equals check 1: "
  346. + f1.equals(f2)
  347. + " "
  348. + f2.equals(f1)
  349. + " "
  350. + (f1.hashCode() == f2.hashCode()&&f1
  351. .equals(f2)));
  352. }
  353.  
  354. if (maxOps % 2 == 0) {
  355. DoubleMatrix f1 = fm;
  356. DoubleMatrix f2 = new DoubleMatrix(new double[]{3.0, 5.0,
  357. 7.5}, 1, 1);
  358.  
  359. System.out
  360. .println("Equals check 2: "
  361. + f1.equals(f2)
  362. + " "
  363. + f2.equals(f1)
  364. + " "
  365. + (f1.hashCode() == f2.hashCode() && f1
  366. .equals(f2)));
  367. }
  368.  
  369. break;
  370. }
  371.  
  372. case "SORTED_ARRAY": {
  373. double[] arr = fm.toSortedArray();
  374.  
  375. String arrayString = "[";
  376.  
  377. if (arr.length > 0)
  378. arrayString += format.format(arr[0]) + "";
  379.  
  380. for (int i = 1; i < arr.length; i++)
  381. arrayString += ", " + format.format(arr[i]);
  382.  
  383. arrayString += "]";
  384.  
  385. System.out.println("Sorted array: " + arrayString);
  386. break;
  387. }
  388.  
  389. }
  390.  
  391. }
  392.  
  393. scanner.close();
  394. }
  395. }
  396.  
  397.  
  398.  
  399.  
  400.  
  401. Sample input
  402.  
  403. 5
  404. INPUT_TEST
  405. 3 5
  406. 9.778627 -4.119295 -3.454750 2.467065 0.508486
  407. 3.291531 7.843563 -6.448950 -3.498762 8.526385
  408. 6.859716 1.669290 -8.034459 9.211680 5.779856
  409. DIMENSION
  410. SUM
  411. DIMENSION
  412. SORTED_ARRAY
  413.  
  414. Sample output
  415.  
  416. Dimensions: [3 x 5]
  417. Sum: 30.38
  418. Dimensions: [3 x 5]
  419. Sorted array: [9.78, 9.21, 8.53, 7.84, 6.86, 5.78, 3.29, 2.47, 1.67, 0.51, -3.45, -3.50, -4.12, -6.45, -8.03]
  420.  
  421.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement