Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package number.set;
- import java.util.Arrays;
- import java.util.NoSuchElementException;
- import java.util.Random;
- import java.util.Scanner;
- public class NumberSet {
- public static int MAX_SIZE = 10;
- private int[] nSet = new int[MAX_SIZE];
- int size;
- /**
- * Metoda dodaje liczbę do zbioru liczb
- * (zezwalamy na dodanie liczby już istniejącej)
- *
- * @param i liczba ktora dodajemy
- * @throws Exception występuje w przypadku przepełnienia zbioru
- */
- public void add(int i) throws Exception {
- assert (size <= MAX_SIZE) : "Zbiór przekroczył maksymalny rozmiar!";
- if (size == MAX_SIZE)
- throw new ArrayIndexOutOfBoundsException("Zbiór jest pełny.");
- nSet[size++] = i;
- assert (nSet[size-1]==i) : "Przypisania wartość nie zgadza się z przechowywaną w pamięci!";
- }
- /**
- * Metoda usuwa liczbę ze zbioru (każde wystąpienie)
- *
- * @param val liczba do usunięcia
- * @throws Exception występuje jeśli zbiór nie posiada liczby którą chcemy usunąć
- */
- public void remove(int i) throws Exception {
- assert (size > 0) : "Zbiór jest pusty!";
- int[] newSet = new int[MAX_SIZE];
- int newSize = 0;
- for(int j = 0; j<size; j++) {
- if(nSet[j]==i)
- continue;
- newSet[newSize++] = nSet[j];
- }
- if(newSize == size) {
- throw new NoSuchElementException("Zbiór nie posiada podanej do usunięcia liczby.");
- }
- assert (newSize < size) : "Ilość elementów w zbiorze nie zmalała mimo usunięcia tych o wskazanej wartości.";
- this.nSet = newSet;
- this.size = newSize;
- }
- /**
- * Metoda losuje jedną liczbę ze zbioru oraz ją usuwa (każde wystąpienie)
- *
- * @return wylosowana liczba
- * @throws Exception występuje jeśli zbiór jest pusty
- */
- public int getRandomValue() throws Exception {
- assert (size >= 0) : "Ilość elementów w zbiorze jest mniejsza niż 0!";
- if (size == 0)
- throw new ArrayIndexOutOfBoundsException("Zbiór jest pusty.");
- Random r = new Random();
- int ri = r.nextInt(size);
- assert (ri<size && ri>=0) : "Wylosowany indeks wykracza poza zakres zestawu!";
- ri = nSet[ri];
- remove(ri);
- return ri;
- }
- /**
- * Metoda zwraca sumę elementów
- *
- * @return Suma liczb.
- * @throws Exception występuje jeśli zbiór jest pusty.
- */
- public int getSumOfElements() throws Exception {
- assert (size >= 0) : "Ilość elementów w zbiorze jest mniejsza niż 0!";
- if (size == 0)
- throw new ArrayIndexOutOfBoundsException("Zbiór jest pusty.");
- int sum = 0;
- for (int i = 0; i < size; i++) {
- int value = nSet[i];
- sum += value;
- }
- //wartości pod indeksami >= size powinny zawsze wynosić 0,
- //ponieważ usuwając elementy tworzona jest nowa tablica inicjalizowana zerami;
- //więc suma po całej tablicy powinna być taka sama jak suma tylko po elementach zbioru:
- int sumArray = 0;
- for (int i : nSet) {
- sumArray += i;
- }
- assert (sum == sumArray) : "Wartości w pamięci spoza zakresu zestawu zostały niespodziewanie ustawione (na wartość inną niż 0)!";
- return sum;
- }
- /**
- * Metoda dzieli każdy element zbioru przez podaną
- * wartość bez reszty
- *
- * @param d liczba przez którą dzielimy
- * @throws Exception występuje w przypadku dzielenia przez 0
- * (można zastąpić asercją)
- */
- public void divideAllElementBy(int i) throws Exception {
- assert (size >= 0) : "Ilość elementów w zbiorze jest mniejsza niż 0!";
- assert (i != 0) : "Dzielenie przez 0!";
- for (int j=0; j<size; j++) {
- int result = nSet[j]/i;
- if(nSet[j]==i)
- assert (result == 1) : "Dzielnik równy dzielnej dał iloraz różny od 1!";
- nSet[j] = result;
- }
- }
- /**
- * Metoda sprawdza czy w zbiorze istnieje podany element
- *
- * @param i element do sprawdzenia
- * @return true w przypadku odnalezienia wartości,
- * false w przeciwnym razie.
- */
- public boolean contains(int i) {
- assert (size >= 0) : "Ilość elementów w zbiorze jest mniejsza niż 0!";
- boolean result = false;
- for (int j=0; j<size; j++) {
- if (nSet[j] == i)
- result = true;
- }
- int foundAt = -1;
- for (int j=0; j<size; j++) {
- if (nSet[j] == i)
- foundAt = j;
- }
- if(result)
- assert (foundAt >= 0) : "Dwa różne sposoby sprawdzania czy zbiór zawiera elemeny dały sprzeczny wynik.";
- else
- assert (foundAt == -1) : "Dwa różne sposoby sprawdzania czy zbiór zawiera elemeny dały sprzeczny wynik.";
- return result;
- }
- /**
- * Metoda zwraca rozmiar zbioru (liczbę elementów)
- *
- * @return rozmiar zbioru
- */
- public int getSize() {
- assert (size >= 0) : "Ilość elementów w zbiorze jest mniejsza niż 0!";
- return size;
- }
- @Override
- public String toString() {
- return "NumberSet [nSet=" + Arrays.toString(nSet) + ", size=" + size + "]";
- }
- public void print() {
- //System.out.println(toString());
- System.out.print("Zbiór: ");
- for (int i=0; i<size; i++) {
- System.out.print(nSet[i] + " ");
- }
- System.out.print(" (size=" + size + ")\n");
- }
- public static void main(String []args){
- NumberSet numberSet = new NumberSet();
- try {
- //bez błędów:
- numberSet.add(5);
- numberSet.add(6);
- numberSet.add(8);
- numberSet.add(1);
- numberSet.add(0);
- numberSet.add(0);
- numberSet.add(6);
- numberSet.add(7);
- numberSet.add(9);
- numberSet.add(13);
- numberSet.print();
- numberSet.remove(0);
- System.out.println("remove(0):");
- numberSet.print();
- int i = numberSet.getRandomValue();
- System.out.println("getRandomValue() == " + i);
- numberSet.print();
- numberSet.divideAllElementBy(2);
- System.out.println("divideAllElementBy(2):");
- numberSet.print();
- Scanner scanner = new Scanner(System.in);
- System.out.println("\nWciśnij enter aby wywołać kod prowokujący asercje...");
- scanner.nextLine();
- scanner.close();
- //z błędami
- numberSet = new NumberSet();
- numberSet.remove(0); //Assercion fail: "Zbiór jest pusty!"
- for(int j=0; j<=NumberSet.MAX_SIZE; j++)
- numberSet.add(j); //Exception: "Zbiór jest pełny." lub Assercion fail: "Zbiór przekroczył maksymalny rozmiar!"
- 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."
- numberSet.remove(11); //Exception: "Zbiór nie posiada podanej do usunięcia liczby."
- if(numberSet.contains(0))
- 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."
- 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!"
- numberSet.divideAllElementBy(0); //Assercion fail: "Dzielenie przez 0!"
- for(int j=0; j<=NumberSet.MAX_SIZE; j++)
- numberSet.getRandomValue(); //Exception: "Zbiór jest pusty." lub Assercion fail: "Ilość elementów w zbiorze jest mniejsza niż 0!"
- numberSet.print();
- } catch(Exception e) {
- e.printStackTrace();
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement