Advertisement
Guest User

Untitled

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