Część 3.6. Przykłady programów Javy
1. Parametry metody main Zaczniemy od prostego programu, którego jedynym zadaniem będzie wyświetlenie parametrów. Zastanawiałeś się zapewne po co zawsze w metodzie main podajemy parametr String args[]? Jest to tablica parametrów przekazanych do programu podczas jego uruchamiania. Każdy łańcuch znaków, zakończony spacją, podany po nazwie uruchamianego programu wstawiany jest do tej tablicy na kolejną pozycję. W ten sposób możemy uruchamianemu programowi przekazać pewne dane już w momencie uruchomienia. class Parametry { public static void main (String args[]) { for (int i = 0; i < args.length; i++) System.out.println ("args[" + i + "] = " + args[i]); } } Po napisaniu tego programu uruchom go w następujący sposób: java Parametry ala ola ela Program powinien na ekranie wyświetlić: args[0] = ala args[1] = ola args[2] = ela 2. Wczytywanie liczb całkowitych i rzeczywistych z klawiatury Kolejny program pokazuje, jak w Javie można wczytywać dane z klawiatury. Program służy do wczytywania pary liczb: najpierw całkowitej, a następnie rzeczywistej. Wczytywanie powtarzane jest do moment, gdy choć jedna z wprowadzonych liczb będzie zerem.Wczytywanie danych z klawiatury nie należy do czynności prostych. Wymaga użycia aż trzech klas: InputStreamReader, której instancją jest System.in, oraz BufferedReader i StreamTokenizer. Wzzystkie one zadeklarowane sa w pakiecie java.io, stąd konieczność dołączenia tego pakietu do naszego programu. //dołączenie pakietu java.io import java.io.*; public class CzytanieLiczb { public static void main (String args[]) { int a = 1; double b = 1; // deklaracja obiektów niezbędnych do wczytywania danych z klawiatury Reader r = new BufferedReader (new InputStreamReader(System.in)); StreamTokenizer inp = new StreamTokenizer(r); // blok try jest konieczny ze względu na użycie metody nextToken() // bez użycia tego bloku wystąpiłby błąd kompilacji try { while (a != 0 && b != 0) { System.out.print("\nPodaj liczbę całkowitą: "); while (inp.nextToken() != StreamTokenizer.TT_NUMBER) // wczytywanie do momentu otrzymania poprawnej liczby całkwitej { System.out.println("Blad wprowadzania\nPodaj liczbe całkowita:"); } a = (int) inp.nval; // konwersja danych na typ całkowity System.out.print("Podaj liczbe rzeczywista: "); while (inp.nextToken() != StreamTokenizer.TT_NUMBER) // wczytywanie do momentu otrzymania poprawnej liczby rzeczywistej { System.out.println("Blad wprowadzania\nPodaj liczbe rzeczywista:"); } b = (double) inp.nval; // konwersja danych na typ rzeczywisty System.out.println("Liczba calkowita = " + a + ", liczba rzeczywista = " + b); } } // konieczne jako zamkniecie bloku try catch (IOException e) { ; } } } Zobacz kilka przykładów działania tego programu. Zwróć uwagę na różne możliwości wpisywania danych. Program zawsze czyta cały wiersz, a potem dopiero dzieli go na tokeny (element, liczby, ...). 3. Obliczanie silni Napiszemy teraz program obliczający i wyświetlający silnię (n! = 1*2*3*...*n) liczb od 0 do 20. Program sam w sobie dość banalny. Zwróć jednak uwagę na rekurencyjne wywołanie metody silnia.class Silnia { public static void main (String args[]) { long x; for (int n=0 ; n<=20 ; n++) { x = silnia(n); System.out.println (n + "! = " + x); } } static long silnia (int n) { long wynik; // metoda wywołuje sama siebie ze zmniejszoną o 1 wartością argumentu // aż do momentu, dgy przekazany argument będzie <= 1 if (n > 1) wynik = silnia( n-1) * n; else wynik = 1; return wynik; } } 4. Największy wspólny podzielnik i najmniejsza wspólna wielokrotność Ten program wczytuje parę liczb naturalnych i oblicza ich największy wspólny podzielnik i najmniejszą wspólną wielokrotność. Zwróć uwagę, że do wczytania obu liczb naturalnych wykorzystywana jest jedna i ta sama metoda: czyni to program bardziej zwięzłym, czytelnym i efektywniejszym.import java.io.*; class NwwNwp { public static void main (String args[]) { int n1, n2, n; n1 = LiczbaNaturalna(); n2 = LiczbaNaturalna(); if (n1 > n2) { n = n1; n1 = n2; n2 = n; } n = n2; while (n % n1 !=0) { n += n2; } System.out.println("NWW = " + n); while (n1 != n2) { if (n1 > n2) n1 -= n2; else n2 -= n1; } System.out.println("NWP = " + n1); } static int LiczbaNaturalna() { int n = 0; Reader r = new BufferedReader(new InputStreamReader(System.in)); StreamTokenizer inp = new StreamTokenizer(r); try { while (n <= 0) { System.out.print("Podaj liczbe naturalna: "); while (inp.nextToken() != StreamTokenizer.TT_NUMBER) { System.out.println("Liczba musi byc > 0\nPodaj liczbe naturalna:"); } n = (int) inp.nval; } } catch (IOException e) { ; } return n; } } 5. Sortowanie tablicy jednowymiarowej Zadaniem kolejnego programu jest posortowanie wektora (tablicy jedno wymiarowej) liczb całkowitych. Program najpierw wczytuje rozmiar wektora, a następnie wszystkie jego elementy. Po zakończeniu wczytywania następuje sortowanie wektora i wyswietlenie wszystkich jego elementów.Program wykorzystuje znaną już metodę rekurencyjną w metodzie sort oraz metodę służącą do wczytywania danych z klawiatury. Zwróć szczególną uwagę na dynamiczne przydzielanie pamięci dla wektora danych: przydział pamięci następuje dopiero po wczytaniu ilości elementów wektora, a tworzony wektor będzie zajmował dokładnie tyle pamięci, ile jest konieczne do przechowania podanej ilości elementów. import java.io.*; class SortowanieTablicy { static int Len; static int T[]; public static void main (String args[]) { Len = CzytajLiczbe(-1); T = new int [Len]; System.out.println("Podaj elementy tablicy"); for (int i=0 ; i<Len ; i++) { T[i] = CzytajLiczbe(i); } sort(0, Len-1); System.out.println("\n\nPosortowana tablica:"); for (int i=0 ; i<Len ; i++) { System.out.print(T[i] + ", "); } } static int CzytajLiczbe(int i) { int n = 0; String s; Reader r = new BufferedReader(new InputStreamReader(System.in)); StreamTokenizer inp = new StreamTokenizer(r); // ustawienie wyświetlanego komunikatu w zależności od tego, co jest wczytywane: // inny dla rozmiaru wektora i inny dla jego elementów if (i == -1) s = new String("Podaj ilosc elementów w tablicy: "); else s = new String("Podaj " + i + " element tablicy: "); try { while (true) { System.out.print(s); while (inp.nextToken() != StreamTokenizer.TT_NUMBER) { System.out.println("Blad! " + s); } n = (int) inp.nval; // dla rozmiaru wektora wartość musi być dodatnia // dla elementów wektora - może być dowolną liczbą całkowitą if (i == -1 && n > 0 || i >= 0) break; } } catch (IOException e) {;} return n; } static void sort(int min, int max) { int i = min , j = max, x, y = (int)((min+max)/2); x = T[y]; do { while (T[i] < x && i < max) i++; while (x < T[j] && j > 0 ) j--; if (i <= j) { y = T[i]; T[i] = T[j]; T[j] = y; i++; j--; } } while (i <= j); // rekurencyjne wywoływanie metody, aż do zakończenia sortowania if (min < j) sort(min, j); if (i < max) sort(i, max); } } 6. Sumowanie wierszy i kolumn tablicy dwuwymiarowej Na zakończenie program operujący na macierzy (tablicy dwuwymiarowej). Aby uniknąć wprowadzania wielu danych elementy macierzy są generowane losowo: służy do tego metoda Math.random(), która generuje liczby losowe z zakresu [0, 1>. Po wygenerowaniu wszystkich elementów macierzy następuje jej wyświetlenie z jednoczesnym sumowaniem wartości w każdym wierszu i każdej kolumnie.public class Tablica2D { public static void main (String args[]) { int x, y, T[][] = new int [5][5]; String txt; int suma; // generowanie elementów macierzy: liczb losowych z przedziału [0, 500] for (y = 0 ; y <= 4 ; y++) for (x = 0 ; x <= 4 ; x++) T[x][y] = (int) (Math.round(Math.random() * 500)); // wyświetlanie macierzy z sumowaniem wartości w wierszach for (y = 0 ; y <= 4 ; y++) { suma = 0; for (x = 0 ; x <= 4 ; x++) { suma += T[x][y]; txt = Integer.toString (T[x][y]); // konwersja liczby na łańcuch znaków // pętla uzupełniająca wyświetlany tekst spacjami z przodu: // ma to zagwarantować jednakową ilość miejsc dla każdej liczby while (txt.length() < 5) { txt = " " + txt; } System.out.print (txt); } txt = Integer.toString (suma); // konwersja liczby na łańcuch znaków // pętla uzupełniająca wyświetlany tekst spacjami z przodu: // ma to zagwarantować jednakową ilość miejsc dla każdej liczby while (txt.length() < 5) { txt = " " + txt; } System.out.println ("| " + txt); } System.out.println ("--------------------------"); // sumowanie wartości w kolumnach macierzy for (x = 0 ; x <= 4 ; x++) { suma = 0; for (y = 0 ; y <= 4 ; y++) { suma += T[x][y]; } txt = Integer.toString (suma); // konwersja liczby na łańcuch znaków // pętla uzupełniająca wyświetlany tekst spacjami z przodu: // ma to zagwarantować jednakową ilość miejsc dla każdej liczby while (txt.length() < 5) {txt = " " + txt;} System.out.print (txt); } } }
|