Friday, October 24, 2014

Persamaan Kuadrat Menggunakan Rumus ABC Dengan Input Melalui Dialog Box



Persamaan kuadrat menggunakan rumus ABC dengan menggunakan input dialog box


Berikut adalah listing untuk Persamaan kuadrat menggunakan rumus ABC dengan menggunakan input dialog box :

import javax.swing.*;
 
public class SquareEquationToy {
                private double a;
                private double b;
                private double c;
                private double x1;
                private double x2;
               
                private boolean fValid = false;
               
                public SquareEquationToy(){                    
                                String input = JOptionPane.showInputDialog("masukan nilai a");
                                double a = Double.parseDouble(input);
                                System.out.println("nilai a = " + a);
                                String Input = JOptionPane.showInputDialog("masukan nilai b");
                                double b = Double.parseDouble(Input);
                                System.out.println("nilai b = " + b);
                                String iNput = JOptionPane.showInputDialog("masukan nilai c");
                                double c = Double.parseDouble(iNput);
                                System.out.println("nilai c = " + c);
                                this.a = a;
                                this.b = b;
                                this.c = c;
                                calcX();
                }
               
                private double calcDiscriminant(){
                                return b*b - 4*a*c;
                }
               
                private void calcX(){
                                double d = calcDiscriminant();
                                if (d > 0) {
                                                x1 = (-b + Math.sqrt(d))/(2*a);
                                                x2 = (-b - Math.sqrt(d))/(2*a);
                                                fValid = true;
                                }
                }
               
                public boolean isValid(){
                                return fValid;
                }
               
                public double getA(){
                                return a;
                }
               
                public double getB(){
                                return b;
                }
               
                public double getC(){
                                return c;
                }
               
                public double getX1(){
                                return x1;
                }
               
                public double getX2(){
                                return x2;
                }
               
                static void test(){
                                SquareEquationToy s = new SquareEquationToy ();
                                if (s.isValid()){
                                                System.out.println("Persamaan "+s.getA()+"X^2 "+s.getB()+"X "+s.getC() + " mempunyai akar "+s.getX1()+"dan"+s.getX2());
                                                }
                                                else {
                                                System.out.println("Persamaan "+s.getA()+"X^2 "+s.getB()+"X "+s.getC() + " Tidak mempunyai akar-akar riil");
                                                }
                                }
                               
                               
                public static void main (String[]args){
                               
                                test();
                                System.exit(0);

                }
}

Output yang keluar adalah seperti berikut :
Output pertama saat melakukan penginputan untuk nilai a

Output kedua saat melakukan penginputan untuk nilai b

Output yang ketiga untuk menginput nilai c



Output hasil akhir untuk menentukan persamaan kuadrat




Penjelasan mengenai listing program :
Untuk menampilkan penginputan pada java harus diawali dengan import javax.swing.*; dan juga dengan memasukan perintah JOptionPane.showInputDialog();  hanya saja jika kita hanya menuliskan ini maka yang bisa kita input berupa string bukan numerik sehingga kita harus menambahkan Double.parseDouble(); agar bisa merubah string ke double sehingga inputan yang dimasukan bisa berupa numerik.
Pada string input di listing ini saya membuat 3 bentuk berbeda yaitu String input , String Input dan String iNput. Ini dilakukan karena jika di tuliskan String input maka yang akan di cetak setelah penginputan adalah nilai inputan yang pertama kali di input sehingga pada inputan ke-2 dan ke-3 nilai akan sama dengan nilai ke-1. Ketika program memanggil JOptionPane.showInputDialog(); kita perlu mengakhiri program dengan memanggil System.exit(0); karena saat memanggil dialog box berarti sistem memulai satu tread kendali baru. Ketika metode tread main() berakhir tread baru tidak berakhir secara otomatis. Untuk mengakhiri semua tread kita perlu memanggil metode System.exit(0); .
Lalu jika listing this.a = a;  sampai c tidak di tulis maka program tidak ada kesalahan hanya saja pada nilai akhir persamaan inputan yang sudah dimasukan tidak akan memiliki nilai atau samadengan nol, seperti gambar dibawah ini



Silahkan dicoba dan semoga bermanfaat

Sunday, October 19, 2014

Pengujian kelas Math yang disediakan oleh Java



Pengujian merupakan aktivitas yang sering diabaikan dalam pengembangan karena dapat menghindari peluang kerugian akibat kesalahan yang ditemukan saat pengembangan buakan saat operasi produktif. Kesalahan program dapat berakibat sangat fatal bahkan sampai pada kematian atau kerugian sampai berjuta dollar. Contoh kesalahan yang diakibatkan perangkat lunak, yaitu Ariane-5, roket pengangkut satelit milik masyarakat Eropa malfanction setelah 50 detik peluncuran yang disebabkan overflow pemroses 32 bit yang memperoleh data dari 64 bit.

Pengujian sebaiknya dilakukan secara otomatis bukan secara interaktif. Setelah perbaikan program kita dapat mengulangi pengujian tanpa harus berulang kali memasukkan kasus pengujian lewat keyboard secara interaktif.

Berikut adalah contoh program kelas Math yang disediakan oleh java dan diuji apakah benar berfungsi dengan baik atau tidak.

Program :
public class MathExploreToy {
                public MathExploreToy() {
                }

                static void test(){
                                testE();
                                testPI();
                                testAbs();
                }
                static void betterTest(){
                                testIntAbs();
                }
                static void testE(){
                                System.out.println("Testing untuk Math.E");
                                System.out.println("Math.E = "+Math.E);
                                System.out.println("");
                }
                static void testPI(){
                                System.out.println("Testing untuk Math.PI");
                                System.out.println("Math.PI = "+Math.PI);
                                System.out.println("");
                }
                static void testAbs(){
                                System.out.println("Testing untuk Math.abs()");
                                System.out.println("Math.abs(-23.7) ="+Math.abs(-23.7));
                                System.out.println("Math.abs(0.0) ="+Math.abs(0.0));
                                System.out.println("Math.abs(23.7) ="+Math.abs(23.7));
                                System.out.println("Double.MIN_VALUE = "+Double.MIN_VALUE);
                                System.out.println("Math.abs(Double.MIN_VALUE) = " +Math.abs(Double.MIN_VALUE));
                                System.out.println("Math.abs(-Double.MIN_VALUE) = " +Math.abs(-Double.MIN_VALUE));
                                System.out.println("Double.MAX_VALUE ="+Double.MAX_VALUE);
                                System.out.println("Math.abs(Double.MAX_VALUE) = "+Math.abs(Double.MAX_VALUE));
                                System.out.println("Math.abs(-Double.MAX_VALUE) = "+Math.abs(-Double.MAX_VALUE));
                                System.out.println("");
                }
                static void testIntAbs(){
                                System.out.println("Cara pengujian yang baik - mendukung otomatisasi:");
                                System.out.println("Testing untuk Math.abs() bagi bilangan bulat");
                                if (Math.abs(-23) !=23) System.out.println("Math(-23) :: Error! Hasil harus 23");
                                else System.out.println("Math(-23) :: Correct!");
                                if (Math.abs(23) !=23) System.out.println("Math(23) :: Error! Hasil harus 23");
                                else System.out.println("Math(23) :: Correct!");
                                System.out.println("Integer.MIN_VALUE ="+Integer.MIN_VALUE);
                                System.out.println("Math.abs(Integer.MIN_VALUE) ="+Math.abs(Integer.MIN_VALUE));
                                System.out.println("Integer.MAX_VALUE ="+Integer.MAX_VALUE);
                                if (Math.abs(Integer.MIN_VALUE) != (-Integer.MIN_VALUE)) System.out.println("Math(Integer.MIN_VALUE) :: Error!");
                                else System.out.println("Math(Integer.MIN_VALUE) :: Correct!");
                                if (Math.abs(Integer.MIN_VALUE) < 0) System.out.println("Math(Integer.MIN_VALUE) :: Erro! Hasil harus > 0");
                                else System.out.println("Math(Integer.MIN_VALUE) :: Correct!");
                                if (Math.abs(Integer.MAX_VALUE) != Integer.MAX_VALUE) System.out.println("Math(Integer>MAX_VALUE) :: Error!");
                                else System.out.println("Math(Integer.MAX_VALUE) :: Correct!");
                                System.out.println("\n\nPERHATIAN!");
                                System.out.println(
                                                "Pengujian menunjukkan hasil yang tidak sesuai dengan matematika!!!\n"+
                                                "Pada kondisi batas sangat sulit diprediksi, untuk itu kita harus mengacu dokumentasi bahasa\n"+
                                                "Pengujian otomatis terkadang tidak dapat menemukannya dengan benar karena dibatasi juga\n"+
                                                "oleh kemampuan bahasa itu sendiri bila kesalahan adalah pada spesifikasi bahasa itu sendiri!\n"+
                                                "Pengujian otomatis akan benar ditangani oleh yang ahli , penguji dapat ditambah sbb:\n"+
                                                "Berdasarkan kenyataan bahwa hasil fungsi abs tidak boleh kurang dari nol"
                                );
                                System.out.println(
                                                "\n"+
                                                "Di Java, Math.abs(Integer.MIN_VALUE) justru menghasilkan bilangan negatif. \n"+
                                                "Melanggar rumus matematika dimana hasil fungsi absolut selalu bernilai positif.\n"+
                                                "Hasil ini dapat ditelusuri karena representasi int adalah two's complement\n"+
                                                "Versi yang dipakai penulis :: JDK 1.4"
                                );
                }
                static void testAcos(){
                                System.out.println("Math.acos(0.9) = " + Math.acos(0.9));
                }
                static void testCeil(){
                }
                static void testCos(){
                }
                static void testExp(){
                }
                static void testFloor(){
                }
                static void testLog(){
                }
                static void testMax(){
                }
                static void testMin(){
                }
                static void testPow(){
                }
                static void testSin(){
                }
                static void testSqrt(){
                }
                static void testTan(){
                }
                public static void main(String[] args){
                                test();
                                betterTest();
                }
}
Output :


Penjelasan mengenai program diatas.

static void testE(){
                                System.out.println("Testing untuk Math.E");
                                System.out.println("Math.E = "+Math.E);
                                System.out.println("");
                }
                static void testPI(){
                                System.out.println("Testing untuk Math.PI");
                                System.out.println("Math.PI = "+Math.PI);
                                System.out.println("");
                }
                static void testAbs(){
                                System.out.println("Testing untuk Math.abs()");
                                System.out.println("Math.abs(-23.7) ="+Math.abs(-23.7));
                                System.out.println("Math.abs(0.0) ="+Math.abs(0.0));
                                System.out.println("Math.abs(23.7) ="+Math.abs(23.7));
                                System.out.println("Double.MIN_VALUE = "+Double.MIN_VALUE);
                                System.out.println("Math.abs(Double.MIN_VALUE) = " +Math.abs(Double.MIN_VALUE));
                                System.out.println("Math.abs(-Double.MIN_VALUE) = " +Math.abs(-Double.MIN_VALUE));
                                System.out.println("Double.MAX_VALUE ="+Double.MAX_VALUE);
                                System.out.println("Math.abs(Double.MAX_VALUE) = "+Math.abs(Double.MAX_VALUE));
                                System.out.println("Math.abs(-Double.MAX_VALUE) = "+Math.abs(-Double.MAX_VALUE));
                                System.out.println("");
                }


Metode diatas apabila dipanggil akan memperlihatkan hasil program dilayar dimana kita dapat memeriksa kebenaran antarmuka (yaitu konstanta E dan PI setra metode-metode di kelas).
Pada testAbs() terhadap double , kita harus menerapkan prinsip “equivalence partitions” dimana kita harus memperoleh kelompok-kelompok dimana satu anggota kelompok dapat dipandang mewakili kelompok itu. Dalam persoalan abs() adalah :


  • < 0 , diwakili oleh -23.7 mewakili seluruh anggota kelompok < 0

  • 0 , diwakili oleh 0 yang merupakan satu-satunya anggota kelompok

  • > 0 , diwakili oleh 23.7 mewakili seluruh anggota kelompok > 0

Persoalan berikutanya adalah masalah batas-batas domain. Bila kita membaca dokumentasi java , maka double mengikuti spesifikasi IEEE dalam jangkauan bilangan neagtif dan positif.

Dengan metode test() kita melakukan pengujian namun kita harus mengamati hasil dan membandingkannya sendiri dari hasli yang diperoleh di layar komputer.

Metode betterTest() adalah satu kemajuan berikutnya:

static void testIntAbs(){
                                System.out.println("Cara pengujian yang baik - mendukung otomatisasi:");
                                System.out.println("Testing untuk Math.abs() bagi bilangan bulat");
                                if (Math.abs(-23) !=23) System.out.println("Math(-23) :: Error! Hasil harus 23");
                                else System.out.println("Math(-23) :: Correct!");
                                if (Math.abs(23) !=23) System.out.println("Math(23) :: Error! Hasil harus 23");
                                else System.out.println("Math(23) :: Correct!");
                                System.out.println("Integer.MIN_VALUE ="+Integer.MIN_VALUE);
                                System.out.println("Math.abs(Integer.MIN_VALUE) ="+Math.abs(Integer.MIN_VALUE));
                                System.out.println("Integer.MAX_VALUE ="+Integer.MAX_VALUE);
                                if (Math.abs(Integer.MIN_VALUE) != (-Integer.MIN_VALUE)) System.out.println("Math(Integer.MIN_VALUE) :: Error!");
                                else System.out.println("Math(Integer.MIN_VALUE) :: Correct!");
                                if (Math.abs(Integer.MIN_VALUE) < 0) System.out.println("Math(Integer.MIN_VALUE) :: Erro! Hasil harus > 0");
                                else System.out.println("Math(Integer.MIN_VALUE) :: Correct!");
                                if (Math.abs(Integer.MAX_VALUE) != Integer.MAX_VALUE) System.out.println("Math(Integer>MAX_VALUE) :: Error!");
                                else System.out.println("Math(Integer.MAX_VALUE) :: Correct!");


Sulitnya pengujian tampak pada metode tersebut :
Kita telah dibantu kode pengujian dimana akan tampil dilayar : “Error :: “ bila terdapat kesalahan di program (metode) yang diuji. Namun kita dapat terjebak bila menggunakan fasilitas bahasa pada kasus diatas. Dimana di Java pada kasus batas tidak sesuai definisi matematika untuk fungsi absolut. Penguji harus pintar agar sesuai dengan konstrain yang berlaku di matematika, tidak hanya mengandalkan yang disediakan oleh bahasa.