Advertisement
Nikolovska

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

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