Algoritma Dan Implementasi Alat Bantu Pemecahan Masalah Matematika

(1)

ALGORITMA DAN IMPLEMENTASI ALAT BANTU PEMECAHAN MASALAH MATEMATIKA

SKRIPSI

YOSUA YUDHANATA SEMBIRING 051411014

DEPARTEMEN MATEMATIKA

FAKULTAS MATEMATIKA DAN ILMU PENGETAHUAN ALAM UNIVERSITAS SUMATERA UTARA

MEDAN 2009


(2)

PERSETUJUAN

Judul : ALGORITMA DAN IMPLEMENTASI ALAT BANTU PEMECAHAN PERMASALAHAN MATEMATIKA

Kategori : SKRIPSI

Nama : YOSUA YUDHANATA SEMBIRING

Nomor Induk Mahasiswaa : 051411014

Program Studi : SARJANA (S1) MATEMATIKA

Departemen : MATEMATIKA

Fakultas : MATEMATIKA DAN ILMU PENGETAHUAN ALAM (FMIPA) UNIVERSITAS SUMATERA UTARA

Diluluskan di

Medan, Desember 2009 Komisi Pembimbing :

Pembimbing 1, Pembimbing 2,

Drs. Marihat Situmorang, M.Kom Drs. Halludin Panjaitan

NIP. 131859487 NIP. 130701888

Diketahui/Disetujui oleh

Departemen Matematika FMIPA USU Ketua,

Dr. Saib Suwilo, M.Sc. NIP. 131796149


(3)

PERNYATAAN

ALGORITMA DAN IMPLEMENTASI ALAT BANTU PEMECAHAN MASALAH MATEMATIKA

SKRIPSI

Saya mengakui bahwa skripsi ini adalah hasil kerja saya sendiri, kecuali beberapa kutipan dan ringkasan yang masing-masing disebutkan sumbernya.

Medan, Desember 2009

Yosua Yudhanata Sembiring NIM. 051411014


(4)

PENGHARGAAN

Segala puji dan syukur dipanjatkan kepada Tuhan Yang Maha Kuasa, yang dengan limpahan kuasanya telah membuat penulis berhasil menyelesaikan kajian ini dalam waktu yang telah ditentukan.

Ucapan terima kasih juga saya sampaikan kepada Bapak Drs. Marihat Situmorang, M.Kom, dan Bapak Haluddin Panjaitan, selaku pembimbing pada penyelesaian skripsi ini dan penuh kepercayaan kepada saya untuk menyempurnakan skripsi ini. Panduan padat, ringkas dan professional telah diberikan kepada saya agar penulisan tugas ini dapat diselesaikan.

Ucapan terima kasih juga saya sampikan kepada Ketua Departemen Matematika FMIPA USU Dr.Saib Suwilo, M.Sc dan Sekretaris Jurusan Drs Henry Rani Sitepu, M.Sc, Koordinator Ekstensi Ilmu Komputer FMIPA USU Drs. Marwan Harahap,M.Eng, Dekan dan Pembantu Dekan FMIPA USU, semua dosen pada departemen Matematika FMIPA USU, serta kepada rekan-rekan seperjuangan di bangku kuliah. dan juga ucapan terima kasih yang tak terhingga disampaikan kepada Ayah, Ibu, Abang, dan adik saya, serta seluruh keluarga besar yang terus memberikan dorongan untuk penyelesaian skripsi ini. Semoga tuhan terus memberikan limpahan berkat yang tak terhingga pada kita semua.


(5)

ABSTRAKSI

Pada Jurusan Informatika semester awal, kita mendapatkan mata kuliah Logika dan Algoritma. Dalam mata kuliah ini kita akan mempelajari tentang algoritma beserta penerapannya dalam pemrograman. Dari permasalahan diatas penulis ingin membantu dalam mempermudah pembelajaran mata kuliah Logika dan Algoritma dengan membuat perangkat lunak alat bantu dan algoritma. Penulis akan menjelaskan bagaimana cara membuat aplikasi yang dapat menjadi alat bantu Algoritma, menjelaskan faktor baik buruknya visualisasi, dan menjelaskan bagaimana membuat algoritma dengan baik dan benar. Teori-teori yang dapat menunjang serta menjadi acuan dalam pembuatan proyek akhir ini dikelompokkan menjadi beberapa subbab yaitu teori – teori Logika dan Algoritma, masalah masalah beserta algoritmanya, Struktur data, Flowchart, dan sekilas tentang Pemrograman C++ . Model pembuatan aplikasi yang digunakan adalah model Waterfall. Model waterfall berisi rangkaian aktivitas proses yang disajikan dalam proses yang terpisah, seperti spesifikasi kebutuhan, implementasi desain perangkat lunak, ujicoba. Kesimpulan yang dapat ditarik adalah langkah langkah dalam pembuatan perangkat lunak alat bantu logika dan algoritma adalah Analisa, Desain, Implementasi dan Pengujian. Yang mempengaruhi baik buruknya visualisasi adalah resolusi visualisasi, struktur data yang divisualisasikan, interaktifitas dari visualisasi, dan Computational infrastructure.


(6)

DAFTAR ISI

Hal

LEMBARAN PENGESAHAN... i

LEMBAR PERNYATAAN... ii

LEMBARAN PENGHARGAAN... iii

ABSTRAKSI... iv

DAFTAR ISI... v

BAB I Pendahuluan... 1

1.1.Latar Belakang... 1

1.2.Rumusan Masalah... 2

1.3.Batasan Masalah... 2

1.4.Tujuan Penelitian... 2

1.5.Kontribusi Penelitian... 3

1.6.Metode Penelitian... 3

1.7.Tinjauan Pustaka... 3

BAB II Landasan Teori...,... 5

2.1. Algoritma... 5

2.2. Bahasa Pemrograman C++... 7

2.2.1. Tipe Data Dasar... 10

2.2.2. Variabel... 11

2.2.3. Mendeklarasikan Variabel... 11

2.2.4. Tipe daftar Variabel... 12

2.2.5. memberikan Nilai ke Variabel... 12

2.2.6. Inisialisasi Variabel... 12


(7)

2.2.8. Operator... 13

2.2.9. Operator Aritmetika... 14

BAB III Metodologi Penelitian... 19

3.1. Penentuan Bilangan Ganjil dan Bilangan Genap... 19

3.2. Penentuan diskriminan dan aar-akar persamaan kuadrat... 20

BAB IV Pembahasan Dan Pengujian... 27

4.1. Pembahasan... 27

4.2. Pengujian... 28

BAB V Kesimpulan dan Saran... 31

5.1. Kesimpulan... 31

5.2. Saran ... 31

Daftar Pustaka... 32


(8)

ABSTRAKSI

Pada Jurusan Informatika semester awal, kita mendapatkan mata kuliah Logika dan Algoritma. Dalam mata kuliah ini kita akan mempelajari tentang algoritma beserta penerapannya dalam pemrograman. Dari permasalahan diatas penulis ingin membantu dalam mempermudah pembelajaran mata kuliah Logika dan Algoritma dengan membuat perangkat lunak alat bantu dan algoritma. Penulis akan menjelaskan bagaimana cara membuat aplikasi yang dapat menjadi alat bantu Algoritma, menjelaskan faktor baik buruknya visualisasi, dan menjelaskan bagaimana membuat algoritma dengan baik dan benar. Teori-teori yang dapat menunjang serta menjadi acuan dalam pembuatan proyek akhir ini dikelompokkan menjadi beberapa subbab yaitu teori – teori Logika dan Algoritma, masalah masalah beserta algoritmanya, Struktur data, Flowchart, dan sekilas tentang Pemrograman C++ . Model pembuatan aplikasi yang digunakan adalah model Waterfall. Model waterfall berisi rangkaian aktivitas proses yang disajikan dalam proses yang terpisah, seperti spesifikasi kebutuhan, implementasi desain perangkat lunak, ujicoba. Kesimpulan yang dapat ditarik adalah langkah langkah dalam pembuatan perangkat lunak alat bantu logika dan algoritma adalah Analisa, Desain, Implementasi dan Pengujian. Yang mempengaruhi baik buruknya visualisasi adalah resolusi visualisasi, struktur data yang divisualisasikan, interaktifitas dari visualisasi, dan Computational infrastructure.


(9)

BAB I PENDAHULUAN

I.1. LATAR BELAKANG

Dalam matematika dan komputasi, algoritma merupakan kumpulan perintah untuk menyelesaikan suatu masalah. Perintah-perintah ini dapat diterjemahkan secara bertahap dari awal hingga akhir. Masalah tersebut dapat berupa apa saja, dengan syarat untuk setiap permasalahan memiliki kriteria kondisi awal yang harus dipenuhi sebelum menjalankan sebuah algoritma. Algoritma akan selalu berakhir untuk semua kondisi awal yang memenuhi criteria, hal ini berbeda dengan heuristik. Algoritma juga memiliki pengulangan proses (iterasi), dan juga memiliki keputusan hingga keputusan selesai.

Desain dan analisis algoritma merupakan suatu cabang khusus dalam ilmu computer yang mempelajari karakteristik dan performa dari suatu algoritma dalam penyelesaian masalah, terlepas dari implementasi algoritma tersebut. Dalam cabang disiplin ini, algoritma dipelajari secara abstrak, terlepas dari system komputer atau bahasa pemrograman yang dipergunakan. Algoritma yang berbeda dapat diterapkan untuk suatu permasalahan dengan kriteria yang sama. Kompleksitas dari suatu algoritma merupakan ukuran seberapa banyak komputasi yang diterapkan algoritma tersebut untuk menyelesaikan permasalahannya. Secara informal, algoritma yang dapat menyelesaikan permasalahan dalam waktu yang relative singkat memiliki tingkat kompleksitas yang rendah, semetara algoritma yang menyelesaikan permasalahan dalam waktu yang lebih lama memiliki tingkat kompleksitas yang lebih tinggi pula.

Dalam mata kuliah Logika dan Algoritma, kita telah mempelajari tentang algoritma dan penerapannya dalam pemrograman computer. Kesulitan yang dihadapi dalam permasalahan ini adalah susahnya kita mengerti algoritma dan penyelesaian dari permasalahan yang dihadapi, serta sulitnya membayangkan struktur data yang akan digunakan. Dalam memahami penyelesaian suatu


(10)

permasalahan, kita akan lebih mudah untuk mengingat dan memahaminya apabila permasalahan itu dapat ditampilkan dalam bentuk visual dan gambar, sehingga penyajian nya menjadi lebih menarik. Dari permasalahan diatas, penulis ingin membantu mempermudah penyelesaian Algoritma untuk mempermudah penyelesaian matematika dengan membuat perangkat lunak alat bantu logika dan algoritma.

I.2 Rumusan Masalah.

Agar pembahasan pada bab pembahasan dapat menjadi lebih terarah, maka penulis merumuskan permasalahan mendaji seperti berikut :

1. Bagaimana langkah membuat aplikasi yang dapat menjadi alat bantu penyelesaian permasalahan Algoritma.

2. Apa saja yang dapat mempengaruhi bentuk visualisasi yang ditampilkan. 3. Bagaimana menyusun algoritma yang baik dan benar.

I.3. Batasan Masalah

Pada pembahasan ini penulis membatasi permasalahan yang difokuskan pada pembuatan visualisasi dan flowchart dari algoritma yang sudah ditentukan.

1. Penentuan bilangan ganjil dan bilangan genap

2. Penentuan nilai diskriminan dari persamaan kuadrat.

I.4. Tujuan Penelitian

Penelitian ini bertujuan untuk memudahkan pengerjaan permasalahan-permasalahan matematika dan juga mencoba untuk membuat penyelesaiannya menjadi menarik dengan menampilkan bentuk penyelesaian dalam program komputer.

I.5. Kontribusi Penelitian

Selain untuk menambah pemahaman dan pengetahuan penulis mengenai algoritma dan pemrograman komputer, penelitian ini juga bermanfaat untuk


(11)

membuat matematika menjadi menarik dan mempermudah penyelesaian permasalahan matematika.

I.6. Metode Penelitian

Secara umum penelitian diselesaikan dalam beberapa tahapan yaitu :

1. Membahas bentuk penyelesaian permasalahan matematika secara umum dengan menggunakan metode yang ada.

2. Membuat bentuk algoritma tahapan-tahapan penyelesaian permasalahan matematika.

3. Merancang program untuk penyelesaian permasalahan matematika tersebut dengan menggunakan bahasa pemrograman C++.

4. Menjalankan program dan mencoba menganalisa hasil outputnya.

5. Membandingkan hasil penyelesaian yang dikerjakan secara manual dan secara otomatis dengan menggunakan program.

I.7. Tinjauan Pustaka

Algoritma merupakan suatu metode khusus yang tepat dan terdiri dari serangkaian langkah yang terstruktur dan dituliskan secara sistematis, yang akan dikerjakan untuk menyelesaikan suatu masalah dengan bantuan komputer.

Kata algoritma berasal dari nama Abu Ja’far Mohammed Ibnu Musa Alkhowarizmi, seorang ilmuwan Persia yang menulis buku berjudul Kitab Al Jbr W’almuqabala (rules of restoration and reduction) sekitar tahun 825 sampai tahun 1950 istilah algorithm selalu diasosiasikan dengan Euclid’s Algorithm, yaitu suatu proses yang menjelaskan cara mencari pembagi terbesar untuk dua buah bilangan.

Pada Merriam-Webster Collegiate Dictionary, istilah algoritma dapat diartikan sebagai prosedur langkah demi langkah untuk memecahkan masalah atau menyelesaikan suatu tugas. Kamus Besar Bahasa Indonesia (KBBI) mendefinisikan algoritma sebagai urutan logis pengambilan keputusan untuk pemecahan permasalahan.


(12)

Menurut Donald E.Knuth, sebuah algoritma harus memenuhi persayaratan :

1. Finiteness, Algoritma harus berakhir (terminate) setelah melakukan beberapa langkah proses.

2. Definiteness, Setiap langkah harus didefinisikan dengan tepat sehingga tidak menimbulkan makna yang ambigu.

3. Input, setiap algoritma memiliki data untuk diolah

4. Output, setiap algoritma memberikan suatu output setelah proses.

5. Effectiveness, langkah-langkah algoritma dikerjakan dalam waktu yang wajar

Langkah langkah yang membentuk suatu algoritma dapat dibagi menjadi 3 kelompok proses yaitu :

1. Sequence Process, Instruksi dkerjakan secara berurutan satu persatu mulai dari yang pertama sampai yang terakhir.

2. Selection Process, suatu instruksi adakalanya baru boleh dikerjakan apabila telah memenuhi persyarata tertentu, misalnya bila pembayaran dlakukan secara tunai, maka diberikan diskon 10%, sedangkan pembelian secara kredit tidak diberikan diskon. Dalam hal ini hanya boleh melakukan 1 instruksi dari 2 alternatif instruksi.

3. Iteration Process, suatu instruksi adakalanya perlu dilakukan berulang-ulang selama beberapa kali selama masih memenuhi suatu kondisi.


(13)

BAB II LANDASAN TEORI 2.1. Algoritma

Algoritma adalah : Cara yang dapat ditempuh oleh komputer dalam mencapai suatu tujuan, terdiri atas langkah-langkah yang terdefinisi dengan baik, menerima input, melakukan proses, dan menghasilkan output. Meskipun tidak selalu, biasanya sebuah algoritma memiliki sifat bisa dihitung (computable) atau bisa dihitung. Sebuah algoritma dikatakan benar (correct), jika algoritma tersebut berhasil mengeluarkan output yang benar untuk semua kemungkinan input. Jika sebuah algoritma dikatakan 99% benar, algoritma tersebut tetap salah (incorrect). Agar algoritma tersebut dikatakan benar, algoritma tersebut harus benar 100%.

Sebagai contoh, ketika kita menulis surat, maka kita perlu melakukan beberapa langkah sebagai berikut:

1. Mempersiapkan kertas dan amplop.

2. Mempersiapkan alat tulis, seperti pena atau pensil. 3. Mulai menulis.

4. Memasukkan kertas ke dalam amplop.

5. Pergi ke kantor pos untuk mengeposkan surat tersebut.

Dengan algoritma, kita dapat mengatasi masalah dari yang sederhana sampai yang kompleks sekalipun. Namun, seorang user harus mampu membuat suatu program dengan menggunakan bahasa yang difahami oleh komputer. Sebelum disajikan dalam bentuk bahasa pemrogaman, sebaiknya kita membuat diagram alir (Flow Chart) dan Pseudocode. Hal ini dimaksudkan agar dapat

mempermudah kerja atau mempermudah dalam membuat program. Selain itu, algoritma dapat mengatasi masalah logika dan masalah matematika dengan cara berurutan, tetapi kadang-kadang algoritma tidak selalu berurutan, hal ini dikenal dengan proses percabangan.

Pada dasarnya, komputer adalah mesin digital, artinya komputer hanya bisa mengenal kondisi ada arus listrik (biasanya dilambangkan dengan 1) dan


(14)

tidak ada arus listrik (biasanya dilambangkan dengan 0). Dengan kata lain, kita harus menggunakan sandi 0 dan 1 untuk melakukan pemrogaman komputer. Bahasa pemrogaman yang menggunakan sandi 0 dan 1 ini disebut bahasa mesin. Karena bahasa mesin sangat susah, maka muncul ide untuk melambangkan untaian sandi 0 dan 1 dengan singkatan kata yang lebih mudah difahami manusia biasa disebut dengan mnemonic code. Bahasa pemrogaman yang menggunakan singkatan kata ini disebut bahasa assembly. Program algoritma harus komplit, nyata, dan jelas. Meskipun tugas algoritma tidak menghasilkan solusi, tetapi proses harus berakhir hal ini disebut dengan semi algorithm (prosedur akan berjalan terus atau biasa disebut dengan perulangan). Intinya kita tidak boleh menambah masalah, akan tetapi kita harus mampu menyelesaikan masalah untuk mendapat hasil yang tepat.

Bilangan adalah suatu konsep mewakili suatu bilangan disebut sebagai matematika, konsep bilangan selama bertahun-tahun lamanya telah diperluas untuk meliputi bilangan

Prosedur-prosedur tertentu yang mengambil bilangan sebagai masukan dan menghasil bilangan lainnya sebagai keluran, disebut sebagai numeris. keluaran bilangan. Operasi yang lebih umumnya ditemukan adalah yang mengambil dua bilangan sebagai masukan dan menghasilkan satu bilangan sebagai keluaran. Contoh operasi biner adalah operasi numeris disebut sebagai

Pemrograman merupakan proses mengimplementasikan urutan langkah untuk menyelesaikan suatu masalah dengan menggunakan suatu bahasa


(15)

pemrograman. Bahasa pemrograman, atau sering diistilahkan juga dengan memungkinkan seorang programmer dapat menentukan secara persis data mana yang akan diolah oleh komputer, bagaimana data ini akan disimpan/diteruskan, dan jenis dalam berbagai situasi.

2.2. Bahasa Pemrograman C++.

Bahasa Pemrograman merupakan mendeskripsikan komputer dan manusia. Proses komputasi umumnya didefinisikan secara formal menggunakan konsep matematika dari Pemrograman dirancang untuk memfasilitasi komunikasi antara manusia dengan komputer.

Sebuah bahasa pemrograman disebut dipergunakan untuk mendeskripsikan semua komputasi yang dapat dilakukan Mesin Turing, yaitu memiliki

Berikut ini adalah daftar bahasa pemrograman komputer:

1.

2.

o

o

o

o


(16)

o

3.

4.

5. UNIX

o

o

o

o

6.

o

o

o

Dan dalam penyelesaian permasalahan ini penulis mencoba menggunakan bahasa pemrograman C++.

C++ adalah salah satu adalah dukungan terhadap konsep pemrograman berorientasi objek

Bahasa pemrograman C merupakan salah satu Dibuat pada tahun 1972 oleh Dennis Ritchie untuk Telephone Laboratories.

Meskipun C dibuat untuk memprogram sistem dan jaringan komputer namun bahasa ini juga sering digunakan dalam mengembangkan software aplikasi. C juga banyak dipakai oleh berbagai jenis platform sistem operasi dan arsitektur komputer, bahkan terdapat beberepa compiler yang sangat populer telah


(17)

tersedia. C secara luar biasa mempengaruhi bahasa populer lainnya, terutama C++ yang merupakan extensi dari C.

a. Kelompok pertama

C++ mempunyai 32 buah kata yang dipesan (reserved words). Kata kunci kelompok pertama merupakan turunan dari

auto const double float int short struct unsigned

break continue else for long signed switch void

case default enum goto register sizeof typedef volatile

char do extern if return static union while

b. Kelompok kedua

Kata yang dipesan kelompok kedua berjumlah 30. Kata-kata ini adalah baru dan hanya ada di bahasa C++.

asm dynamic_cast namespace reinterpret_cast try

bool explicit new static_cast typeid

catch false operator template typename


(18)

const_cast inline public throw virtual

delete mutable protected true wchar_t

Kata-kata yang dipesan tersebut di atas tidak boleh dipakai sebagai nama variable, class, enum, macro, dan struct.

2.2.1. Tipe data dasar

Untuk menyimpan suatu variabel diperlukan tempat khusus di dalam memori komputer. Besar dan tipe dari variabel-variabel di dalam standar program C++ dispesifikasikan sebagai berikut.

Nama Keterangan Ukuran Jangkauan

char Abjad/karakter atau untuk

bilangan bulat kecil 1 byte

signed: -128 to 127 unsigned: 0 to 255 short int

(short)

Bilangan bulat dengan jangkauan

pendek 2 byte

signed: -32768 to 32767 unsigned: 0 to 65535

int Bilangan bulat 4 byte

signed: -2147483648 to 2147483647

unsigned: 0 to 4294967295

long int

(long) Integer dengan jangkauan panjang 4 byte

signed: -2147483648 to 2147483647

unsigned: 0 to 4294967295 bool Boolean, dapat bernilai benar

atau salah (true or false) i byte true or false float Angka dengan titik mengambang


(19)

double Bilangan cacah dengan ketelitian

ganda 8 byte 1.7e +/- 308 (15 digits)

long double Bilangan cacah dengan ketelitian

ganda panjang 8 byte 1.7e +/- 308 (15 digits) wchar_t Karakter lebar, biasa dipakai

untuk 2 byte 1 karakter lebar

2.2.2. Variabel

Aturan penulisan pengenal untuk sebuah variabel, konstanta atau fungsi yang di definisikan oleh pemrogram adalah sebagai berikut :

• Pengenal harus di awali dengan huruf (A..Z, atau a..z ) atau karakter garis bawah (_)

• Selanjutnya dapat berupa huruf, digit ( 0..9 ) atau karakter garis bawah atau tanda dollar ($).

• Panjang pengenal boleh lebih dari 31 karakter, tetapi hanya 31 karakter pertama yang akan di anggap berarti.

• Pengenal tidak boleh menggunakan nama yang tergolong sebagai kata-kata cadangan ( reserved words ) seperti int, if , while dan sebagainya.

2.2.3. Mendeklarasikan Variabel

Variabel digunakan dalam program untuk menyimpan suatu nilai, dan nilai yang ada padanya dapat di ubah-ubah selama eksekusi program berlangsung. Variabel yang akan digunakan dalam program haruslah dideklaraasikan terlebih dahulu. Pengertian deklarasi di sini berarti memesan memori dan menentukan jenis data yang bisa di simpan di dalamnya.

2.2.4. Tipe daftar-variabel

Pada pendeklarasian variabel, daftar variabel dapat berupa sebuah variabel atau beberapa variabel yang dipisahkan dengan koma.


(20)

Contoh: int var_bulat1;

float var_pecahan1, var_pecahan2;

2.2.5. Memberikan Nilai Ke Variabel

Untuk memberikan nilai ke variabel yang telah di deklarasikan, maka bentuk umum pernyataan yang digunakan adalah :

nama_variabel = nilai ;

contoh :

int var_bulat = 10 ;

double var_pecahan = 10.5; 2.2.6. Inisialisasi Variabel

Adakalanya dalam penulisan program, setelah dideklarasikan, variabel langsung diberi nilai awal. Sebagai contoh yaitu variabel nilai :

int nilai; nilai = 10 ;

Dua pernyataan diatas sebenarnya dapat di singkat melalui pendeklarasian yang di sertai penugasan nilai, sebagai berikut :

int nilai = 10;

Cara seperti ini banyak dipakai dalam program C, disamping menghemat penulisan pernyataan, juga lebih memberikan kejelasan, khususnya untuk variabel yang perlu diberi nilai awal (diinisialisasi ).

2.2.7. Konstanta.

Konstanta menyatakan nilai yang tetap. Berbeda dengan variabel, suatu konstanta tidak di deklarasikan. Namun seperti halnya variabel, konstanta juga memiliki tipe. Penulisan konstanta mempunyai aturan tersendiri, sesuai dengan tipe masing-masing.


(21)

• Konstanta karakter misalnya ditulis dengan diawali dan di akhiri dengan tanda petik tunggal, contohnya : 'A' dan '@'.

• Konstanta integer ditulis dengan tanda mengandung pemisah ribuan dan tak mengandung bagian pecahan.

• Konstanta real (float dan double) bisa mengandung pecahan ( dengan tanda berupa titik ) dan nilainya bisa di tulis dalam bentuk eksponensial ( menggunakan tanda e ), contohnya : 27.5f ( untuk tipe float ) atau 27.5 ( untuk tipe double ) dan 2.1e+5 .

• Konstanta string merupakan deretan karakter yang diawali dan diakhiri dengan tanda petik ganda (") contohnya :"Pemrograman Dasar C ".

2.2.8. Operator

Operator merupakan simbol atau karakter yang bisa dilibatkan dalam program untuk melakukan sesuatu operasi atau manipulasi, seperti menjumlahkan dua buah nilai, memberikan nilai ke suatu variabel, membandingkan kesamaan dua buah nilai.

Simbol + merupakan operator untuk melakukan operasi penjumlahan dari kedua operandnya (yaitu a dan b). Karena operator penjumlahan melibatkan dua operator ini tergolong operator binary. Simbol - (minus) juga merupakan operator. Simbol ini termasuk sebagai operator unary, yaitu operator yang hanya memiliki sebuah operand ( yaitu c pada contoh ini ).

2.2.9. Operator Aritmatika.

Operator untuk operasi aritmatika yang tergolong sebagai operator binary adalah :

* artinya perkalian / artinya pembagian % artinya sisa pembagian + artinya penjumlahan


(22)

Adapun operator yang tergolong sebagai operator binary - artinya tanda minus

+ artinya tanda plus

Contoh pemakaian operator aritmatika misalnya untuk memperoleh nilai diskriminan dari suatu persamaan kuadrat dan juga penentuan bilangan ganjil dan bilangan genap.

Dalam bab ini akan dibahas mengenai teori-teori yang dapat menunjang serta menjadi acuan dalam pembuatan skripsi ini. Bagian tersebit dikelompokkan menjadi beberapa bab yaitu : Logika dan algoritma, masalah-masalah dan algoritmanya, struktur data dan flowchart.

Dalam perumusan algoritma yang dibahas adalah beberapa bentuk permasalahan matematika yaitu :

1. Penentuan bilangan ganjil dan bilangan genap

bilangan-bilangan yang paling dikenal adalah bilangan bulat yaitu : ..., -2, -1, 0, 1, 2, …. Dan bilangan-bilangan asli yaitu : 1, 2, 3, …. Keduanya sering digunakan untuk behitung dalam aritmetika algoritma untuk menentukan suatu bilangan termasuk bilangan genap atau bilangan ganjil.

Bilangan genap adalah bilangan bulat yang habis (tidak bersisa) jika dibagi 2. Sedangkan bilangan ganjil adalah bilangan bulat yang tidak bisa habis dibagi 2.

2. Penentuan diskriminan dan akar-akar persamaan kuadrat

Matriks adalah suatu kumpulan besaran (variabel dan konstanta) yang dapat dirujuk melalui indeknya, yang menyatakan posisinya dalam representasi umum yang digunakan, yaitu sebuah tabel persegipanjang. Matriks merupakan suatu cara visualisasi variabel yang merupakan kumpulan dari angka-angka atau variabel lain, misalnya vektor. Dengan representasi matriks, perhitungan dapat dilakukan dengan lebih


(23)

terstruktur. Pemanfaatannya misalnya dalam menjelaskan persamaan linier, transformasi koordinat, dan lainnya. Matriks seperti halnya variabel biasa dapat dimanipulasi, seperti dikalikan, dijumlah, dikurangkan dan didekomposisikan.

Persamaan kuadrat adalah suatu persamaan polynomial berorde 2. Bentuk umum dari persamaan kuadrat adalah :

Y = ax2 + bx + c ; dimana a≠0

Huruf a, b, dan c disebut sebagai koefisien. Koefisien kuadrat a adalah koefisien dari x2, koefisien linier b adalah koefisien dari x, dan c adalah koefisien konstan atau koefisien bebas.

Rumus kuadrat dikenal pula dengan nama rumus abc, karena digunakan untuk menghitung akar-akar pesamaan kuadrat yang tergantu dari nilai a, b, dan c dari suatu persamaan kuadrat. Rumus yang dimaksud memiliki bentuk :

Algoritma untuk menghitung determinan dan akar-akar persamaan disajikan dalam bentuk :

Masukkan koefisien-koefisien dan konstanta persamaan kuadrat a,b, dan c . Harga. a tidak sama dengan nol.

1. Mulai

2. Baca data a,b,c

3. Hitung diskriminan persamaan D = b^2 – 4 x a x c

4. Cek harga diskriminan IF D > 0 Jika ya, hitung akar-akar persamaan

X1 = ((-b) + SQRT(D)) / (2 x a) X2 = ((-b) - SQRT(D)) / (2 x a)


(24)

Lanjutkan ke langkah-5 Cek harga diskriminan

IF D = 0

Jika ya, hitung akar-akar persamaan X1X2 = ( -b ) / (2 x a)

5. Cetak hasil X1 dan X2 atau X12 atau pesan (“akar-akar imajiner”)

6. Selesai

Gambar1. Flowchart penentuan nilai diskriminan start

a b c D x1 x2

Input a b c

D=b2+4ac

D=C? D>C ?

Print x1 x2

X1=b/2a

X2=X1

X1=(-b + sqrt(D)) / 2a

X2 (b t(D)) /

X1=-b2/a + sqrt(D)) / 2a X2 = -b2/a – sqrt(D)) / 2a

Print “x1i” “x2i”


(25)

Determinan adalah nilai yang berada dalam akar (sqrt) pada rumus abc. Dalam hal ini diskriminan menentukan jumlah dan sifat dari akar-akar persamaan kuadrat. Terdapat tiga kasus yang mungkin terjadi :

1. J

ika diskriminan bersifat nol, terdapat eksak satu akar, dan akar yang dimaksud merupakan bilangan riil. Hal ini kadang disebut sebagai akar ganda, dimana nilainya adalah :

X1 = X2 = -b/2a

2. J

ika diskriminan bersifat positif, akan terdapat dua akar berbeda yang kedua-duanya berupa bilangan riil.

X1 = (-b – sqrt(D)) / 2a X2 = (-b – sqrt(D)) / 2a


(26)

BAB III

METODOLOGI PENELITIAN

3.1. Penentuan bilangan ganjil dan bilangan genap.

Bilangan-bilangan yang paling dikenal adalah bilangan bulat yaitu : -2, -1, 0, 1, 2, …. Dan bilangan-bilangan asli yaitu : 1, 2, 3, …. Bilangan genap adalah bilangan bulat yang habis (tidak bersisa) jika dibagi 2. Sedangkan bilangan ganjil adalah bilangan bulat yang tidak bisa habis dibagi 2.

Berikut ditampilkan bentuk langkah-langkah yang diperlukan untuk penyesaian masaklah tersebut dalam bentuk flowchart.

Algoritma untuk penyelesaian permasalahan ini diselesaikan dengan cara sebagai berikut :

1. Start

2. Masukan bilangan, 3. Bagi dengan 2

4. Hasil bilangan = n ; keluaran Bilangan genap 5. Hasil bagi = n+1 ; keluaran bilangan ganjil 6. Selesai.


(27)

Gambar 2. Flowchart Penentuan bilangan ganjil dan genap

3.2. Penentuan diskriminan dan akar-akar persamaan kuadrat Dalam rumus kuadrat, terdapat istilah yang berada dalam tanda akar:

yang disebut sebagai

persamaan kuadrat. Dapat dituliskan sebagai D.

Suatu persamaan kuadrat dengan koefisien-koefisien riil dapat memiliki hanya sebuah akar atau dua buah dapat berbentuk menentukan jumlah dan sifat dari akar-akar persamaan kuadrat. Terdapat tiga kasus yang mungkin:

start

Bilangan, hasil bagi, sisa bagi

Input bilangan

Hasil bagi = bilangan /2 Sisa bagi = bilangan-(hasil bagi*2)

Sisa bagi=0?

“bilangan ganjil “

“bilangan genap” end


(28)

Jika dikriminan bersifat duanya merupakan bilangan riil. Untuk persamaan kuadrat dengan koefisien berupa maka akar-akarnya merupakan merupakan

Jika diskriminan bernilai merupakan bilangan riil. Hal ini kadang disebut sebagai nilainya adalah:

Jika diskriminan bernilai tidak terdapat akar riil. Sebagai gantinya, terdapat dua buah akar kompleks (tidak-real), yang satu sama lain merupakan

dan

Jadi akar-akar akan berbeda, jika dan hanya jika diskriminan bernilai bernilai

Perlu diperhatikan, bahwa dalam bentuk umum persamaan kuadrat tersebut harga koefisien A tidak boleh sama dengan 0 (nol). Hal ini dapat dipahami, karena jika A bernilai 0 (nol), maka persamaan tersebut bukan lagi disebut persamaan kuadrat tetapi merupakan persamaan linier. Sedangkan harga koefisien B dan konstanta C dimungkinkan mempunyai harga negatif, positif, atau 0 (nol).

Ada tiga kemungkinan yang dapat terjadi pada hasil penyelesaian pada suatu persamaan kuadrat. Kemungkinan pertama, persamaan kuadrat mempunyai dua harga akar-akar persamaan real dan berbeda. Kemungkinan kedua, persamaan


(29)

kuadrat mempunyai dua akar persamaan real dimana keduanya mempunyai nilai yang sama / kembar. Kemungkinan ketiga, persamaan kuadrat tersebut mempunyai akar-akar imajiner (akar bilangan negatif). Ketiga kondisi tersebut ditentukan oleh nilai disikriminan pada persamaan kuadrat yang akan dihitung akar-akar persamaannya. Nilai disikriminan pada suatu persamaan kuadrat adalah dihitung dengan formula sebagai berikut ini :

Diskriminan = b2 – 4ac

Dalam kemungkinan kondisi yang pertama, apabila disikriminan persamaan kuadrat berharga positif, maka akan diperoleh akar-akar persamaan kuadrat yang real dan nilainya berbeda. Masing-masing akar persamaan adalah dihitung dengan formula sebagai berikut :

X1 = X2 =

Berikut diberikan contoh persamaan dimana diskriminannya bernilai positif, sehingga mempunyai dua harga akar-akar persamaan real dan berbeda.

Contoh : 2x2 + 5x + 2 = 0

Dari persamaan tersebut, diketahui harga koefisien A = 2, koefisien B = 5, dan konstanta C = 2. Harga diskriminan pada persamaan tersebut dapat dihitung sebagai berikut :

Diskriminan = b2 – 4ac = 5 - 4 x 2 x 2

= 25 – 16 = 9

Karena diskriminan persamaan berharga positif, maka harga akar-akar persamaannya adalah dua bilangan real yang berbeda yaitu sebagai berikut :

X1 =


(30)

= - 0,5 X2 = = = - 2

Dari hasil perhitungan di atas, maka harga akar-akar persamaan kuadrat yang diperoleh adalah x1 = -0,5 dan x2= -2 .

Dalam kemungkinan kondisi yang kedua, apabila diskriminan persamaan kuadrat berharga 0 (nol), maka akar-akar persamaan kuadratnya adalah dua bilangan real dengan harga yang sama / kembar. Dengan kalimat lain berarti persamaan tersebut hanya mempunyai satu harga saja yaitu X1 = X2 = X12. Dalam kasus ini harga akar-akar persamaan kuadratnya adalah dihitung dengan formula sebagai berikut ini :

x1,x2 =

Berikut diberikan contoh sebuah persamaan kuadrat dimana diskriminannya bernilai nol sehingga mempunyai akar-akar persamaan real dan harganya sama / kembar.

x2 + 6x + 9 = 0

Dari persamaan tersebut, diketahui harga koefisien A = 1, koefisien B = 6, dan konstanta C = 9. Harga diskriminan pada persamaan tersebut adalah sebagai berikut :

Diskriminan = b2 – 4ac = 62 – 4 x 1 x 9 = 36 – 36 = 0

Karena diskriminan persamaan kuadrat berharga nol, maka harga akar-akar persamaannya adalah dua bilangan real yang sama yaitu sebagai berikut :


(31)

= = -3

Jadi harga akar-akar persamaan kuadrat tersebut adalah x1= x2 = -3

Dalam kemungkinan ketiga, apabila harga diskriminan persamaan kuadrat bernilai negatif, maka maka akar- akar persamaan kuadrat bersifat imaginer . Berikut diberikan contoh sebuah persamaan kuadrat dimana diskriminannya bernilai negatif, sehingga mempunyai akar-akar persamaan yang bersifat imaginer.

Contoh :

2X2 + X + 2 = 0

Dari persamaan tersebut, diketahui harga koefisien A = 1, koefisien B = 1, dan konstanta C = 2. Harga diskriminan pada persamaan tersebut adalah sebagai berikut :

Diskriminan = b2 – 4ac = 12 – 4 x 1 x 2 = 1 - 8

= -7

Karena diskriminan persamaan berharga negatif, maka harga akar-akar persamaannya adalah imaginer. Hal ini dapat dipahami karena untuk menghitung akar-akar persamaan kuadrat selalu melibatkan hasil perhitungan yang diperoleh dari harga akar kuadrat dari diskriminan pada persamaan kuadratnya. Sedangkan nilai dari akar suatu bilangan negatif adalah bilangan imaginer, sehingga akar-akar pada persamaan kuadrat yang mempunyai diskriminan negatif akan menghasilkan suatu bilangan imaginer.

Secara logika, penyelesaian permasalahan untuk menghitung akar-akar persamaan kuadrat adalah dimulai dengan membaca data-data masukan untuk koefisien-koefisien pada a dan b dan konstanta persamaan pada c. Jika harga koefisien a bernilai nol, maka pembacaan data-data masukan harus diulangi karena jika a bernilai nol, maka bukan merupakan persamaan kuadrat. Langkah


(32)

selanjutnya adalah menghitung harga diskriminan persamaan. Harga diskriminan yang diperoleh akan menentukan harga pada akar-akar persamaannya.

Jika diskriminan bernilai positif, maka proses dilanjutkan untuk menghitung akar-akar persamaan kuadrat yang berupa dua bilangan real yang berbeda. Jika diskriminan bernilai nol, maka proses dilanjutkan untuk menghitung akar-akar persamaan kuadrat yang berupa dua bilangan real yang sama / kembar. Namun jika diskriminan bernilai negatif, maka proses dilanjutkan untuk memberikan pesan bahwa harga akar-akar persamaan kuadrat adalah bilangan imaginer. Harga-harga akar persamaannya adalah dihitung dengan menggunakan formula-formula sebagaimana telah dijelaskan pada uraian di atas.

Proses selanjutnya adalah tinggal mencetak hasil-hasil perhitungan yang diperoleh tersebut. Proses logik seperti ini dapat digambarkan dalam flowchart prosedur sebagaimana ditunjukkan pada Gambar . Pada Gambar 4.1 , a, b, dan c merupakan variabel-variabel untuk menyimpan data-data masukan untuk koefisien-koefisien dan konstanta pada persamaan kuadrat. D digunakan sebagai variabel untuk menyimpan harga diskriminan. Sedangkan x1, x2, dan x1x2 adalah variabel-variabel yang digunakan untuk menyimpan harga akar-akar persamaan kuadrat hasil perhitungan yang dilakukan.

• Masukkan koefisien-koefisien dan konstanta persamaan kuadrat a,b, dan c . Harga a tidak sama dengan nol.

1. Mulai

2. Baca data a,b,c

3. Hitung diskriminan persamaan D = b^2 – 4 x a x c

4. Cek harga diskriminan IF D > 0 Jika ya, hitung akar-akar persamaan X1 = ((-b) + SQRT(D)) / (2 x a)

X2 = ((-b) - SQRT(D)) / (2 x a) 5. Lanjutkan ke langkah-5

6. Cek harga diskriminan IF D = 0


(33)

X1X2 = ( -b ) / (2 x a)

7. Cetak hasil X1 dan X2 atau X12 atau pesan (“akar-akar imajiner”) 8. Selesai

Gambar 3 . Flowchart menghitung akar-akar persamaan kuadrat.

Mulai

Baca

D = b2 – 4ac

D > 0

D = 0 X1 = ((-b) + SQRT(DISK)) /(2xa)

X2 = ((-b) - SQRT(DISK)) /(2xa)

X1X2 = (-b) / 2xa

Akar X12 X1, X2


(34)

BAB IV PEMBAHASAN

4.1. PEMBAHASAN

Suatu persoalan matematika dapat dkerjakan dalam beberapa metode namun memiliki hasil perhitungan yang sama. Dan dalam hal ini percobaan penyelesaian matematika tersebut diselesaikan dengan perhitungan algoritma dan program computer.

Kebutuhan system dari visualisasi dari Algoritma penentuan bilangan ganjil dan bilangan genap dan penentuan nilai diskriminan adalah :

1. Visualisasi menampilkan definisi umum dari algoritma menghitung diskriminan matriks dan penentuan bilangan ganjil dan bilangan genap.

2. Visualisasi menampilkan flowchart dari algoritma menghitung diskriminan matriks dan penentuan bilangan ganjil dan bilangan genap.

3. Setiap bagian dari flowchart akan berubah warna menjadi merah jika dituju.

4. User dapat memberikan input bil untuk divisualisasikan sebagai input dari flowchart.

5. Visualisasi hanya dapat menerima masukan berupa angka saja, selain angka, flowchart tidak dapat berjalan ke state selanjutnya. 6. Visualisasi hanya menerima bilangan bulat positif saja, karena

dalam algoritma faktorial dijelaskan bahwa nilai diskriminan adalah hasil dari perhitungan rumus yang telah ditentukan dan output bilangan genap apabila hasil dari bilangan di bagi 2 = 0 dan output bilangan ganjil apabila hasil bagi bilangan dibagi 2 =1

7. Output dari visualisasi adalah hasil dari bilangan ganjil atau bilangan 27


(35)

genap dan nilai diskriminan.

8. Visualisasi bisa mencetak tampilan lewat printer

4.2. Pengujian

Pengujian Algoritma Determinan dan Akar Persamaan kuadrat X2 + 6X + 9 = 0

Dari persamaan tersebut, diketahui harga koefisien A = 1, koefisien B = 6, dan konstanta C = 9. Harga diskriminan pada persamaan tersebut adalah sebagai berikut :

Diskriminan = B2 – 4ac = 62 – 4 x 1 x 9 = 36 – 36 = 0

Karena diskriminan persamaan kuadrat berharga nol, maka harga akar-akar persamaannya adalah dua bilangan real yang sama yaitu sebagai berikut :

X1X2 = = = -3

Jadi harga akar-akar persamaan kuadrat tersebut adalah X1X2 = -3


(36)

Gambar 4 : pengujian program penentuan diskriminan

Pengujian penentuan bilangan ganjil dan bilangan genap Input : 39

39 / 2 = 19, sisa bilangan tidak habis di bagi 2, 39 = bilangan ganjil

Gambar 5: pengujian penentuan bilangan ganjil dan bilangan genap

Dari pembahasan pada bab – bab sebelumnya dapat ditarik kesimpulan : 1. Langkah langkah dalam pembuatan perangkat lunak alat

bantu logika dan algoritma adalah Analisa, Desain, Implementasi dan Pengujian.

1

6

X1 = 3

X2 = 3

9

X1 =3 X2 =3

Input : Hasil :

39


(37)

2. Yang mempengaruhi baik buruknya visualisasi adalah resolusi visualisasi, struktur data yang divisualisasikan, interaktifitas dari visualisasi, dan Computational infrastructure.

3. Dalam menyusun algoritma yang baik dan benar harus memenuhi Finiteness (Algoritma harus berakhir atau terminate), Definiteness (algoritma harus didefinisikan dengan tepat), Input (algoritma harus mempunyai input), Output( alagoritma harus mempunyai Output), Effectiveness (langkah-langkah algoritma dikerjakan dalam waktu yang wajar).


(38)

BAB V

KESIMPULAN DAN SARAN

5.1. KESIMPULAN

Berdasarkan hasil penelitian yang telah dilakukan maka dapat disimpulkan :

1. Penyelesaian permasalahan matematika yang dilakukan dengan menggunakan metode algoritma dapat dikerjakan dengan lebih cepat dan menarik.

2. Perintah-perintah dalam ahasa pemrograman C++ untuk penyelesaian permasalahan matematika berdasarkan penelitian dapat efektif dengan pemilihan algoritma yang tepat.

5.2. SARAN

1. Penelitian yang dilakukan hanya sebatas beberapa permasalahan saja, sementara banyak sekali permasalahan yang dapat timbul dalam pengerjaan permasalahan matematika, sehingga diharapkan adanya pengembangan lebih lanjut sehingga aplikasi dan metode yang digunakan dapat menyelesaikan lebih banyak lagi permasalahan matematika.

2. Aplikasi bahasa pemrograman bahasa C++ hanya salah satu dari banyak bahasa pemrograman, sehingga kedepannya banyak penelitian-penelitian yang menggunakan bahasa pemrograman yang berbeda, sehingga nantinya lebih banyak aplikasi-aplikasi untuk permasalahan matematika dan mempermudah pembelajaran dan pengerjaan permasalahan matematika.


(39)

DAFTAR PUSTAKA

Aiman, Muchammad, Open Source Programming dengan Bahasa C/C++,

2009,

Anton Howard. Aljabar Linear Elementer, 1988. Edisi kelima. Penerbit Erlangga.

http://www.belajar-sendiri.com/2009/10/definisi-dan-pengertian-algoritma.html

Knuth, E Donald.E. 1997, The Art of Computer Programming. Addison Wesley

Kristianto, Andri. 2003, Algoritma dan Pemrograman C++. Penerbit Graha Ilmu.

Munir, Rinaldi. 1999. Algoritma dan pemrograman dalam bahasa Pascal dan C. Bandung Informatika.

Ngoen, Thompson Susabda. 2004. Pengantar Algoritma dengan Bahasa C.

Jakarta, Penerbit Salemba Grafika.

Wikipedia bahasa Indonesia, ensiklopedia bebas. 2004. Sistem Persamaan Kuadrat. http://www. wikipedia.org/wiki/Persamaan_kuadrat


(40)

LAMPIRAN

#include <algorithm>

#include "Penghitungan Diskriminan matriks dan penentuan Bilangan Ganjil dan Bilangan Genap"

using namespace std;

static void initMinorMatriks (const Matriks &mat, Matriks &minor, int x, int y) {

double *data_minor = minor.dataMatriks(); int kolom_min = minor.jumlahKolom();

double *data_mat = mat.dataMatriks(); int baris_mat = mat.jumlahBaris(); int kolom_mat = mat.jumlahKolom();

for (int matY = 0, minY = 0; matY < baris_mat; ++matY) { if (matY != y) {

for (int matX = 0, minX = 0; matX < kolom_mat; ++matX) { if (matX != x) {

data_minor[minY * kolom_min + minX] = data_mat[matY * kolom_mat + matX];

++minX; }

}

++minY; }

} }


(41)

Matriks::Matriks () {

baris = 0; kolom = 0; dataInternal = 0; }

Matriks::Matriks (int n) {

if (n > 1) { baris = n; kolom = n;

dataInternal = new double[baris * kolom]; } else {

baris = kolom = 0; dataInternal = 0; }

}

Matriks::Matriks (int bar, int kol) {

// cek apakah bar dan kol lebih besar dari 0 if (bar > 0 && kol > 0) {

baris = bar; kolom = kol;

dataInternal = new double[bar * kol]; } else {

baris = 0; kolom = 0;


(42)

dataInternal = 0; }

}

Matriks::Matriks (const Matriks &mat) {

baris = mat.jumlahBaris(); kolom = mat.jumlahKolom(); delete [] dataInternal; dataInternal = 0;

if (mat.matriksKosong() == false) { double *tmp = mat.dataMatriks();

dataInternal = new double[baris * kolom]; copy(tmp, tmp + (baris * kolom), dataInternal); }

}

Matriks::~Matriks () {

baris = kolom = 0; delete [] dataInternal; dataInternal = 0; }

double *Matriks::dataMatriks () const {

return dataInternal; }


(43)

bool Matriks::isiElemen (int x, int y, double val) const {

if (matriksKosong() == false && x < kolom && y < baris) { dataInternal[y * kolom + x] = val;

return true; }

return false; }

double Matriks::elemen (int x, int y, bool *ok) const {

double hasil = 0.0;

if (matriksKosong() == false && x < kolom && y < baris) { hasil = dataInternal[y * kolom + x];

if (ok) { *ok = true; }

} else { if (ok) { *ok = false; }

}

return hasil; }


(44)

{

if (this == &mat) { return *this; }

this->baris = mat.jumlahBaris(); this->kolom = mat.jumlahKolom(); delete [] this->dataInternal;

this->dataInternal = new double[baris * kolom];

copy(mat.dataMatriks(), mat.dataMatriks() + (baris * kolom), this->dataInternal);

return *this; }

Matriks &Matriks::operator+ (const Matriks &mat) const {

Matriks *hasil = new Matriks();

if (matriksKosong() == false && baris == mat.jumlahBaris() && kolom == mat.jumlahKolom()) {

Matriks tmp(baris, kolom);

double *tmp_ptr = tmp.dataMatriks(); double *mat_ptr = mat.dataMatriks();

for (int cnt = 0, max = baris * kolom; cnt < max; ++cnt) { tmp_ptr[cnt] = dataInternal[cnt] + mat_ptr[cnt]; }

*hasil = tmp; }


(45)

return *hasil; }

Matriks &Matriks::operator- (const Matriks &mat) const {

Matriks *hasil = new Matriks();

if (matriksKosong() == false && baris == mat.jumlahBaris() && kolom == mat.jumlahKolom()) {

Matriks tmp(baris, kolom);

double *tmp_ptr = tmp.dataMatriks(); double *mat_ptr = mat.dataMatriks();

for (int cnt = 0, max = baris * kolom; cnt < max; ++cnt) { tmp_ptr[cnt] = dataInternal[cnt] - mat_ptr[cnt]; }

*hasil = tmp; }

return *hasil; }

Matriks &Matriks::operator* (double val) const {

Matriks *hasil = new Matriks();

if (matriksKosong() == false) { Matriks tmp(baris, kolom);


(46)

double *tmp_ptr = tmp.dataMatriks();

for (int cnt = 0, max = baris * kolom; cnt < max; ++cnt) { tmp_ptr[cnt] = dataInternal[cnt] * val;

}

*hasil = tmp; }

return *hasil; }

Matriks &Matriks::operator* (const Matriks &mat) const {

Matriks *hasil = new Matriks();

if (matriksKosong() == false && kolom == mat.jumlahBaris()) { Matriks tmp(baris, mat.jumlahKolom());

double *tmp_ptr = tmp.dataMatriks(); double *mat_ptr = mat.dataMatriks(); int barisHasil = baris;

int kolomHasil = mat.jumlahKolom();

for (int y = 0; y < barisHasil; ++y) { for (int x = 0; x < kolomHasil; ++x) { double tmp_result = 0;

for (int c = 0; c < kolom; ++c) {

tmp_result += dataInternal[y * kolom + c] * mat_ptr[c * kolomHasil + x];


(47)

}

tmp_ptr[y * kolomHasil + x] = tmp_result; }

}

*hasil = tmp; }

return *hasil; }

Matriks &Matriks::transpos () const {

Matriks *hasil = new Matriks();

if (matriksKosong() == false && (baris > 1 || kolom > 1)) { Matriks tmp(kolom, baris);

double *tmp_ptr = tmp.dataMatriks();

for (int kol = 0; kol < kolom; ++kol) { for (int bar = 0; bar < baris; ++bar) {

tmp_ptr[kol * baris + bar] = dataInternal[bar * kolom + kol]; }

}

*hasil = tmp; }

return *hasil; }


(48)

Matriks &Matriks::invers () const {

Matriks *hasil = new Matriks();

if (matriksBujurSangkar() && kolom > 1) { double det = determinan();

if (kolom == 2) {

Matriks tmp(baris, kolom);

double *tmp_ptr = tmp.dataMatriks();

tmp_ptr[0] = dataInternal[3] / det; tmp_ptr[1] = -dataInternal[1] / det; tmp_ptr[2] = -dataInternal[2] / det; tmp_ptr[3] = dataInternal[0] / det; *hasil = tmp;

} else {

Matriks matKof = this->kofaktor(); double *kof_ptr;

matKof = matKof.transpos(); kof_ptr = matKof.dataMatriks(); for (int y = 0; y < baris; ++y) { for (int x = 0; x < kolom; ++x) {

kof_ptr[y * kolom + x] = kof_ptr[y * kolom + x] / det; }

}

*hasil = matKof; }


(49)

}

return *hasil; }

Matriks &Matriks::kofaktor () const {

Matriks *hasil = new Matriks();

if (matriksBujurSangkar() && kolom > 2) { const double sign[2] = { 1.0, -1.0 }; Matriks kof(baris);

Matriks minor(baris - 1);

double *kof_ptr = kof.dataMatriks();

for (int y = 0, cnt = 0; y < baris; ++y) { for (int x = 0; x < kolom; ++x) {

initMinorMatriks(*this, minor, x, y);

kof_ptr[y * kolom + x] = minor.determinan() * sign[cnt % 2]; ++cnt;

} }

*hasil = kof;

}

return *hasil; }

double Matriks::determinan (bool *ok) const {


(50)

double hasil = 0.0;

if (matriksBujurSangkar() && kolom > 1) { if (kolom == 2) {

hasil = (dataInternal[0] * dataInternal[3]) - (dataInternal[1] * dataInternal[2]);

} else {

const double sign[2] = { 1.0, -1.0 }; Matriks minor(baris - 1);

double tmp_det;

for (int kol = 0; kol < kolom; ++kol) { initMinorMatriks(*this, minor, kol, 0); tmp_det = minor.determinan();

hasil = hasil + (dataInternal[kol] * sign[kol % 2] * tmp_det); }

}

if (ok) { *ok = true; }

} else { if (ok) { *ok = false; }

}

Matriks &Matriks::transpos () const {

Matriks *hasil = new Matriks();


(51)

Matriks tmp(kolom, baris);

double *tmp_ptr = tmp.dataMatriks();

for (int kol = 0; kol < kolom; ++kol) { for (int bar = 0; bar < baris; ++bar) {

tmp_ptr[kol * baris + bar] = dataInternal[bar * kolom + kol]; }

}

*hasil = tmp; }

return *hasil; }

Matriks &Matriks::invers () const {

Matriks *hasil = new Matriks();

if (matriksBujurSangkar() && kolom > 1) { double det = determinan();

if (kolom == 2) {

Matriks tmp(baris, kolom);

double *tmp_ptr = tmp.dataMatriks();

tmp_ptr[0] = dataInternal[3] / det; tmp_ptr[1] = -dataInternal[1] / det; tmp_ptr[2] = -dataInternal[2] / det; tmp_ptr[3] = dataInternal[0] / det;


(52)

*hasil = tmp; } else {

Matriks matKof = this->kofaktor(); double *kof_ptr;

matKof = matKof.transpos(); kof_ptr = matKof.dataMatriks(); for (int y = 0; y < baris; ++y) { for (int x = 0; x < kolom; ++x) {

kof_ptr[y * kolom + x] = kof_ptr[y * kolom + x] / det; }

}

*hasil = matKof; }

}

return *hasil; }

Matriks &Matriks::kofaktor () const {

Matriks *hasil = new Matriks();

if (matriksBujurSangkar() && kolom > 2) { const double sign[2] = { 1.0, -1.0 }; Matriks kof(baris);

Matriks minor(baris - 1);

double *kof_ptr = kof.dataMatriks();


(53)

for (int x = 0; x < kolom; ++x) {

initMinorMatriks(*this, minor, x, y);

kof_ptr[y * kolom + x] = minor.determinan() * sign[cnt % 2]; ++cnt;

} }

*hasil = kof; }

return *hasil; }

double Matriks::determinan (bool *ok) const {

double hasil = 0.0;

if (matriksBujurSangkar() && kolom > 1) { if (kolom == 2) {

hasil = (dataInternal[0] * dataInternal[3]) - (dataInternal[1] * dataInternal[2]);

} else {

const double sign[2] = { 1.0, -1.0 }; Matriks minor(baris - 1);

double tmp_det;

for (int kol = 0; kol < kolom; ++kol) { initMinorMatriks(*this, minor, kol, 0); tmp_det = minor.determinan();

hasil = hasil + (dataInternal[kol] * sign[kol % 2] * tmp_det); }


(54)

} if (ok) { *ok = true; }

} else {

return hasil; }

end sub end


(1)

}

return *hasil; }

Matriks &Matriks::kofaktor () const {

Matriks *hasil = new Matriks();

if (matriksBujurSangkar() && kolom > 2) { const double sign[2] = { 1.0, -1.0 }; Matriks kof(baris);

Matriks minor(baris - 1);

double *kof_ptr = kof.dataMatriks();

for (int y = 0, cnt = 0; y < baris; ++y) { for (int x = 0; x < kolom; ++x) {

initMinorMatriks(*this, minor, x, y);

kof_ptr[y * kolom + x] = minor.determinan() * sign[cnt % 2]; ++cnt;

}

}

*hasil = kof;

}

return *hasil; }

double Matriks::determinan (bool *ok) const {


(2)

double hasil = 0.0;

if (matriksBujurSangkar() && kolom > 1) { if (kolom == 2) {

hasil = (dataInternal[0] * dataInternal[3]) - (dataInternal[1] * dataInternal[2]);

} else {

const double sign[2] = { 1.0, -1.0 }; Matriks minor(baris - 1);

double tmp_det;

for (int kol = 0; kol < kolom; ++kol) { initMinorMatriks(*this, minor, kol, 0); tmp_det = minor.determinan();

hasil = hasil + (dataInternal[kol] * sign[kol % 2] * tmp_det);

}

}

if (ok) { *ok = true;

}

} else { if (ok) { *ok = false; }

}

Matriks &Matriks::transpos () const {

Matriks *hasil = new Matriks();


(3)

Matriks tmp(kolom, baris);

double *tmp_ptr = tmp.dataMatriks();

for (int kol = 0; kol < kolom; ++kol) { for (int bar = 0; bar < baris; ++bar) {

tmp_ptr[kol * baris + bar] = dataInternal[bar * kolom + kol]; }

}

*hasil = tmp; }

return *hasil; }

Matriks &Matriks::invers () const {

Matriks *hasil = new Matriks();

if (matriksBujurSangkar() && kolom > 1) { double det = determinan();

if (kolom == 2) {

Matriks tmp(baris, kolom);

double *tmp_ptr = tmp.dataMatriks();

tmp_ptr[0] = dataInternal[3] / det; tmp_ptr[1] = -dataInternal[1] / det; tmp_ptr[2] = -dataInternal[2] / det; tmp_ptr[3] = dataInternal[0] / det;


(4)

*hasil = tmp; } else {

Matriks matKof = this->kofaktor(); double *kof_ptr;

matKof = matKof.transpos(); kof_ptr = matKof.dataMatriks(); for (int y = 0; y < baris; ++y) { for (int x = 0; x < kolom; ++x) {

kof_ptr[y * kolom + x] = kof_ptr[y * kolom + x] / det; }

}

*hasil = matKof; }

}

return *hasil; }

Matriks &Matriks::kofaktor () const {

Matriks *hasil = new Matriks();

if (matriksBujurSangkar() && kolom > 2) { const double sign[2] = { 1.0, -1.0 }; Matriks kof(baris);

Matriks minor(baris - 1);

double *kof_ptr = kof.dataMatriks();


(5)

for (int x = 0; x < kolom; ++x) {

initMinorMatriks(*this, minor, x, y);

kof_ptr[y * kolom + x] = minor.determinan() * sign[cnt % 2]; ++cnt;

} }

*hasil = kof; }

return *hasil; }

double Matriks::determinan (bool *ok) const {

double hasil = 0.0;

if (matriksBujurSangkar() && kolom > 1) { if (kolom == 2) {

hasil = (dataInternal[0] * dataInternal[3]) - (dataInternal[1] * dataInternal[2]);

} else {

const double sign[2] = { 1.0, -1.0 }; Matriks minor(baris - 1);

double tmp_det;

for (int kol = 0; kol < kolom; ++kol) { initMinorMatriks(*this, minor, kol, 0); tmp_det = minor.determinan();

hasil = hasil + (dataInternal[kol] * sign[kol % 2] * tmp_det); }


(6)

} if (ok) { *ok = true; }

} else {

return hasil; }

end sub end