Advertisement
kubpica

Asercje Java

May 20th, 2019
117
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 7.37 KB | None | 0 0
  1. package number.set;
  2.  
  3. import java.util.Arrays;
  4. import java.util.NoSuchElementException;
  5. import java.util.Random;
  6. import java.util.Scanner;
  7.  
  8. public class NumberSet {
  9.  
  10.     public static int MAX_SIZE = 10;
  11.     private int[] nSet = new int[MAX_SIZE];
  12.     int size;
  13.  
  14.     /**
  15.      * Metoda dodaje liczbę do zbioru liczb
  16.      * (zezwalamy na dodanie liczby już istniejącej)
  17.      *
  18.      * @param i liczba ktora dodajemy
  19.      * @throws Exception występuje w przypadku przepełnienia zbioru
  20.      */
  21.     public void add(int i) throws Exception {
  22.         assert (size <= MAX_SIZE) : "Zbiór przekroczył maksymalny rozmiar!";
  23.         if (size == MAX_SIZE)
  24.              throw new ArrayIndexOutOfBoundsException("Zbiór jest pełny.");
  25.        
  26.         nSet[size++] = i;
  27.         assert (nSet[size-1]==i) : "Przypisania wartość nie zgadza się z przechowywaną w pamięci!";
  28.     }
  29.  
  30.     /**
  31.      * Metoda usuwa liczbę ze zbioru (każde wystąpienie)
  32.      *
  33.      * @param val liczba do usunięcia
  34.      * @throws Exception występuje jeśli zbiór nie posiada liczby którą chcemy usunąć
  35.      */
  36.     public void remove(int i) throws Exception {
  37.         assert (size > 0) : "Zbiór jest pusty!";
  38.        
  39.         int[] newSet = new int[MAX_SIZE];
  40.         int newSize = 0;
  41.         for(int j = 0; j<size; j++) {
  42.             if(nSet[j]==i)
  43.                 continue;
  44.             newSet[newSize++] = nSet[j];           
  45.         }
  46.        
  47.         if(newSize == size) {
  48.             throw new NoSuchElementException("Zbiór nie posiada podanej do usunięcia liczby.");
  49.         }
  50.        
  51.         assert (newSize < size) : "Ilość elementów w zbiorze nie zmalała mimo usunięcia tych o wskazanej wartości.";
  52.        
  53.         this.nSet = newSet;
  54.         this.size = newSize;
  55.     }
  56.  
  57.     /**
  58.      * Metoda losuje jedną liczbę ze zbioru oraz ją usuwa (każde wystąpienie)
  59.      *
  60.      * @return wylosowana liczba
  61.      * @throws Exception występuje jeśli zbiór jest pusty
  62.      */
  63.     public int getRandomValue() throws Exception {
  64.         assert (size >= 0) : "Ilość elementów w zbiorze jest mniejsza niż 0!";
  65.         if (size == 0)
  66.             throw new ArrayIndexOutOfBoundsException("Zbiór jest pusty.");
  67.  
  68.         Random r = new Random();
  69.         int ri = r.nextInt(size);
  70.        
  71.         assert (ri<size && ri>=0) : "Wylosowany indeks wykracza poza zakres zestawu!";
  72.        
  73.         ri = nSet[ri];
  74.         remove(ri);
  75.         return ri;
  76.     }
  77.  
  78.     /**
  79.      * Metoda zwraca sumę elementów
  80.      *
  81.      * @return Suma liczb.
  82.      * @throws Exception występuje jeśli zbiór jest pusty.
  83.      */
  84.     public int getSumOfElements() throws Exception {
  85.         assert (size >= 0) : "Ilość elementów w zbiorze jest mniejsza niż 0!";
  86.         if (size == 0)
  87.             throw new ArrayIndexOutOfBoundsException("Zbiór jest pusty.");
  88.        
  89.         int sum = 0;
  90.         for (int i = 0; i < size; i++) {
  91.             int value = nSet[i];
  92.             sum += value;
  93.         }
  94.        
  95.         //wartości pod indeksami >= size powinny zawsze wynosić 0,
  96.         //ponieważ usuwając elementy tworzona jest nowa tablica inicjalizowana zerami;
  97.         //więc suma po całej tablicy powinna być taka sama jak suma tylko po elementach zbioru:
  98.         int sumArray = 0;
  99.         for (int i : nSet) {
  100.             sumArray += i;
  101.         }
  102.         assert (sum == sumArray) : "Wartości w pamięci spoza zakresu zestawu zostały niespodziewanie ustawione (na wartość inną niż 0)!";
  103.  
  104.         return sum;
  105.     }
  106.  
  107.     /**
  108.      * Metoda dzieli każdy element zbioru przez podaną
  109.      * wartość bez reszty
  110.      *
  111.      * @param d liczba przez którą dzielimy
  112.      * @throws Exception występuje w przypadku dzielenia przez 0
  113.      * (można zastąpić asercją)
  114.      */
  115.     public void divideAllElementBy(int i) throws Exception {
  116.         assert (size >= 0) : "Ilość elementów w zbiorze jest mniejsza niż 0!";
  117.         assert (i != 0) : "Dzielenie przez 0!";
  118.  
  119.         for (int j=0; j<size; j++) {
  120.             int result = nSet[j]/i;
  121.            
  122.             if(nSet[j]==i)
  123.                 assert (result == 1) : "Dzielnik równy dzielnej dał iloraz różny od 1!";
  124.            
  125.             nSet[j] = result;
  126.         }
  127.     }
  128.  
  129.     /**
  130.      * Metoda sprawdza czy w zbiorze istnieje podany element
  131.      *
  132.      * @param i element do sprawdzenia
  133.      * @return true w przypadku odnalezienia wartości,
  134.      *         false w przeciwnym razie.
  135.      */
  136.     public boolean contains(int i) {
  137.         assert (size >= 0) : "Ilość elementów w zbiorze jest mniejsza niż 0!";
  138.  
  139.         boolean result = false;
  140.         for (int j=0; j<size; j++) {
  141.             if (nSet[j] == i)
  142.                 result = true;
  143.         }
  144.        
  145.         int foundAt = -1;
  146.         for (int j=0; j<size; j++) {
  147.             if (nSet[j] == i)
  148.                 foundAt = j;
  149.         }
  150.        
  151.         if(result)
  152.             assert (foundAt >= 0) : "Dwa różne sposoby sprawdzania czy zbiór zawiera elemeny dały sprzeczny wynik.";
  153.         else
  154.             assert (foundAt == -1) : "Dwa różne sposoby sprawdzania czy zbiór zawiera elemeny dały sprzeczny wynik.";
  155.        
  156.         return result;
  157.     }
  158.  
  159.     /**
  160.      * Metoda zwraca rozmiar zbioru (liczbę elementów)
  161.      *
  162.      * @return rozmiar zbioru
  163.      */
  164.     public int getSize() {
  165.         assert (size >= 0) : "Ilość elementów w zbiorze jest mniejsza niż 0!";
  166.         return size;
  167.     }
  168.  
  169.     @Override
  170.     public String toString() {
  171.         return "NumberSet [nSet=" + Arrays.toString(nSet) + ", size=" + size + "]";
  172.     }
  173.  
  174.     public void print() {
  175.         //System.out.println(toString());
  176.         System.out.print("Zbiór: ");
  177.         for (int i=0; i<size; i++) {
  178.             System.out.print(nSet[i] + " ");
  179.         }
  180.         System.out.print(" (size=" + size + ")\n");
  181.     }
  182.    
  183.     public static void main(String []args){
  184.         NumberSet numberSet = new NumberSet();
  185.        
  186.         try {
  187.             //bez błędów:
  188.             numberSet.add(5);
  189.             numberSet.add(6);
  190.             numberSet.add(8);
  191.             numberSet.add(1);
  192.             numberSet.add(0);
  193.             numberSet.add(0);
  194.             numberSet.add(6);
  195.             numberSet.add(7);
  196.             numberSet.add(9);
  197.             numberSet.add(13);
  198.             numberSet.print();
  199.             numberSet.remove(0);
  200.             System.out.println("remove(0):");
  201.             numberSet.print();
  202.             int i = numberSet.getRandomValue();
  203.             System.out.println("getRandomValue() == " + i);
  204.             numberSet.print();
  205.             numberSet.divideAllElementBy(2);
  206.             System.out.println("divideAllElementBy(2):");
  207.             numberSet.print();
  208.            
  209.             Scanner scanner = new Scanner(System.in);
  210.             System.out.println("\nWciśnij enter aby wywołać kod prowokujący asercje...");
  211.             scanner.nextLine();
  212.             scanner.close();
  213.            
  214.             //z błędami
  215.             numberSet = new NumberSet();
  216.             numberSet.remove(0); //Assercion fail: "Zbiór jest pusty!"
  217.             for(int j=0; j<=NumberSet.MAX_SIZE; j++)
  218.                 numberSet.add(j); //Exception: "Zbiór jest pełny." lub Assercion fail: "Zbiór przekroczył maksymalny rozmiar!"
  219.             if(!numberSet.contains(11)) //W przypadku błędu w programie może wystąpić Assercion fail: "Dwa różne sposoby sprawdzania czy zbiór zawiera elemeny dały sprzeczny wynik."
  220.                 numberSet.remove(11); //Exception: "Zbiór nie posiada podanej do usunięcia liczby."
  221.             if(numberSet.contains(0))
  222.                 numberSet.remove(0); //W przypadku błędu w programie może wystąpić Assercion fail: "Ilość elementów w zbiorze nie zmalała mimo usunięcia tych o wskazanej wartości."
  223.             numberSet.getSumOfElements(); //W przypadku błędu w programie może wystąpić Assercion fail: "Wartości w pamięci spoza zakresu zestawu zostały niespodziewanie ustawione!"
  224.             numberSet.divideAllElementBy(0); //Assercion fail: "Dzielenie przez 0!"
  225.             for(int j=0; j<=NumberSet.MAX_SIZE; j++)
  226.                 numberSet.getRandomValue(); //Exception: "Zbiór jest pusty." lub Assercion fail: "Ilość elementów w zbiorze jest mniejsza niż 0!"
  227.             numberSet.print();
  228.         } catch(Exception e) {
  229.             e.printStackTrace();
  230.         }
  231.     }
  232. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement