Kamis, 21 Maret 2013

Algoritma dan Pemogramman (Penerapan Algoritma dalam Pemogramman)


DEKLARASI TIPE DATA BENTUKAN DI C++

Pendeklarasian tipe data bentukan dilakukan untuk menyatukan atribut-atribut yang terdapat pada suatu entitas. Meski terkesan mirip seperti pendeklarasian suatu kelas, tetapi tipe data bentukan belumlah termasuk suatu kelas. Hal ini dikarenakan pada saat pendeklarasian tipe data bentukan tidak ada operasi atau method yang dapat dicantumkan sebagaimana sebuah kelas. Sesuai namanya, yakni tipe data, jadi hanya kumpulan atribut-atribunya saja; yang berjenis tipe data primitif atau tipe data lainnya.
Berikut adalah kode tipe data bentukan untuk entitas mahasiswa pada bahasa C++
typedef struct{ char nama[150];
char nim[10];
float nTugas;
float nUTS;
float nUAS;
}Mahasiswa;
pada kode di atas, Mahasiswa memiliki 5 atribut yaitu nama, nim, nTugas, nUTS, dan nUAS dengan berbagai tipe data primitif yang menyertainya. Pendeklarasian tipe data bentukan ditandai dengan klausa typedef struct{}.
Bagaimanakah apabila ingin menambahkan larik?
apabila ingin menambahkan larik, cukup menambahkan kembali klausa typedeftersebut sebagai berikut:

typedef Mahasiswa arrayMahasiswa[100];
Namun, arrayMahasiswa pun belum dapat digunakan, karena itu perlu ada kembali pendeklarasian variabel yang bertipe data arrayMahasiswa semisal:
arrayMahasiswa mhs;
Bagaimana cara memanggilnya?
misalnya ingin memasukkan nama. variabel mhs yang bertipe array mahasiswa dipanggil dan diberi indek, kemudian dengan pemanggilan attribut dengan tanda baca titik, kita memanggil atrribut yang bersangkutan. seperti pada potongan kode program di bawah ini:

cin >> mhs[i].nama;

Semoga Bermanfaat

ALGORITMA REKURSIF

Pemrograman rekursif adalah sebuah cara meringkaskan suatu algoritma dengan memanggil dirinya sendiri. Dalam contoh kasus, biasanya kita menggunakan perulangan untuk mendefinisikan suatu fungsi yang berulang-ulang. Namun dalam hal ini, perulangan tidak dilakukan. Konon dengan memakai pemrograman rekursif, algoritma yang dihasilkan lebih ringkas s.
Dalam pemrograman rekursif, terdapat dua istilah penting yaitu basis dan rekurens. Basis adalah suatu keadaan yang terdefinisi yang akan menghentikan kondisi rekursif, sementara rekurans adalah sebuah
Berikut adalah contoh program rekursif:
public class Rekursif {
public static void main(String[] args) {
System.out.println(""+faktorial(3));
}
public static double faktorial (int angka){
if(angka == 1){
return 1;
}else
return angka * faktorial(angka-1);
}


}
pada algoritma di atas, yang menjadi basis adalah ketika angka = 1, maka akan mengembalikan angka 1. Hal ini kelak akan menjadi pengenti dari fungsi rekursif tersebut. Sementara rekurens mengembalikan nilai angka * faktorial(angka-1); yang memang sudah dikenal sebagai rumur rekursif (n! = n (n-1)(n-2) …..). Pada rekurens terdapat pemanggilan fungsi ini kembali: faktorial(angka-1).
Bila dilakukan dengan iterasi biasa, kode program akan seperti berikut
public class Perulangan {
public static void main(String[] args) {
System.out.println(""+faktorial(3));
}
public static double faktorial(int angka){
double jumlah = 0;
for(int i=1; i<=angka; i++){
jumlah = jumlah * angka;
}
return jumlah;
}

}
}
Bila dibandingkan, algoritma rekursif memang lebih mempersingkat; yang berasal dari penggunaan perulangan.
Semoga Bermanfaat.
Referensi: Munir, Rinaldi. (2007). Algoritma dan Pemrograman dalam Bahasa Pascal dan C. Bandung: Informatika

ALGORITMA KONVERSI BILANGAN DESIMAL KE BINER

Konversi bilangan desimal ke biner banyak dilakukan untuk keperluan komputasi pada komputer. Misalnya untuk mengetahui IP address pada jaringan internet Anda. Namun karena ini berupa algoritma, ada beberapa cara untuk menyelesaikan kasus konversi bilangan ini. Ada yang cara praktis, teoritis, maupun penuh logika. Berikut adalah perbandingan algoritma tersebut bila dituliskan dalam bahasa Java.
Algoritma 1
public String getKonversiBasis2(long bilangan){
String karakter=" ";
int angka;
if(bilangan == 0){
karakter="0";
}else{
while(bilangan > 0){
angka = (int) (bilangan % 2);
switch(angka){
case 0 : karakter="0"+karakter;
break;
case 1 : karakter="1"+karakter;
break;
}
bilangan = bilangan / 2;
}
}
return karakter;
}
Algoritma di atas adalah algortima secara umum untuk melakukan konversi bilangan, dengan membagi angka yang diinginkan oleh 2 hingga angka tersebut habis: bernilai nol. Sisa bilangan tersebut akan menjadi bilangan biner dari angka tersebut. Method di atas akan mengembalikan variabel karakter berupa String yang tak lain adalah angka-angka biner yang dihasilkan.
Algoritma ke 2
public String getBilanganBiner(String input){
int hasil = integer.parseInt(input);
String bilBiner = Integer.toBinaryString(hasil);
return bilBiner;
}
Kalau yang ini menggunakan “cara praktis” karena tinggal memanggil methodtoBinaryString(var) yang sudah tersedia pada library Java; bawaan dari kelas Integer. Hasil dari konversi method toBinaryString(var) akan langsung dikonversi menjadi String. Cara ini tidak membuat pemrogram tahu alur konversinya karena hanya menggunakan library.
Algoritma 3

public Convert() {
}
final static char[] dig = {
'0' , '1' , '2' , '3' , '4' , '5' ,
'6' , '7' , '8' , '9' , 'a' , 'b' ,
'c' , 'd' , 'e' , 'f' , 'g' , 'h' ,
'i' , 'j' , 'k' , 'l' , 'm' , 'n' ,
'o' , 'p' , 'q' , 'r' , 's' , 't' ,
'u' , 'v' , 'w' , 'x' , 'y' , 'z'
};
public String konversi(long i,int shift){
char[] buf = new char[64];
int charPos = 64;
int radix = 1 << shift;
long mask = radix - 1;
do {
buf[--charPos] = dig[(int)(i & mask)];
i >>>= shift;
} while (i != 0);
return new String(buf, charPos, (64 - charPos));
}
Nah kalau yang ini, algoritmanya cukup menyulitkan untuk ditelusuri karena menggunakan fasilitas buffer yang tersedia pada java. semoga bila ada waktu algoritma ini dapat dibahas pada posting selanjutnya. Jujur penulis pun belum mengetahui alur dari algoritma ini :) .
algoritma manapun yang digunakan sebenarnya tidak ada masalah. Hal terpenting dari algoritma (yang penulis tahu) adalah efektivitas dan kebenaran logikanya. Mungkin algoritma tersebut akan mangkus ketika menggunakan cara-cara yang sederhana

DEKLARASI VEKTOR

Deklarasi vektor pada pemrograman bertujuan untuk menyimpan nilai dari objek atau variabel. Sifat ini hampir sama dengan deklarasi sebuah array. Dalam artikel ini akan dibahas mengenai deklarasi vektor di c++. Apabila menemukan kesalahan pada artikel ini dapat memberikan komentar pada kolom komentar. :)
Untuk mendeklarasikan vektor di c++, terlebih dulu untuk melakukan sebuah #includedari library vector:
#include <vector>
Sementara untuk pendeklarasian awal dari vector tersebut bisa dilakukan dengan cara berikut:
vector < pair< tipedata1,  tipedata2> > namaVector (ukuran vector);
misalnya kita ingin mendeklarasikan vektor berukuran 500 dengan nama sto, tipe data yang akan disimpan adalah tipe data integer. Berikut adalah pendeklarasiannya.
vector < pair <int, int> > sto(500);
untuk mengisinya kita dapat menggunakan fungsi berikut;
<nama vector>[indeks].first; untuk mengisi pasangan (pair) yang pertama; dan
<nama vector>[indeks].second; untuk mengisi pasangan (pair) yang kedua.
untuk lebih jelasnya bisa melihat kode program berikut:
Fungsi sto.size(); berfungsi untuk mengetahui ukuran dari vector tersebut
Semoga bermanfaat.


PROGRAM SEGITIGA PASCAL

Segitiga pascal tentu sudah tidak asing lagi didengar. Segitiga ‘ajaib’ ini memang memiliki banyak fungsi untuk komputasi matematika, salah satunya adalah untuk menentukan koefisien binomial newton. Permasalahannya, bila pengguna ingin mencari koefisien binomial yang pangkatnya lebih dari enam, mungkin agak lama untuk mencarinya. Dengan adanya program ini, pencarian segitiga pascal diharapkan bisa lebih mudah. Berikut kode programnya:
#include <cstdlib>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
int myArr[100][100];
int angka;
cin >> angka;
for(int i = 0; i < angka+1; i++){
for(int j = 0; j < i; j++){
myArr[i][j] = myArr[i-1][j-1] + myArr[i-1][j];
}
}

for(int i = 0; i < angka+1; i++){
for(int h = angka+1; h >= i; h--){
cout << " ";
}
for(int j = 0; j < i; j++){
cout << myArr[i][j]/angka;
cout << " ";
}
cout << "\n";
}
system("PAUSE");
return EXIT_SUCCESS;
}
Bila kode program dieksekusi hasilnya adalah sebagai berikut
Masukkan adalah banyaknya baris yang diinginkan oleh user. Sementara itu, program langsung menampilkan banyaknya baris segitiga pascal tersebut dengan perhitungan yang tepat.
Semoga bermanfaat.

PREPROCESSOR PADA C++

Pernah mendengar kata preprocessor? Apa itu preprocessor? Mungkin dalam benak kita langsung tertuju pada tempat memproses data dalam computer. Sebenarnya kata preprocessor sendiri memang berhubungan dengan proses-memproses. Namun tidak serta merta merupakan benda/alat yang konkret. Preprocessor yang dibahas disini adalah preprocessor yang terdapat pada bahasa pemrograman, khususnya bahasa C++; berikut adalah pembahasannya.
Preprocessor adalah sebuah cara untuk menggantikan perintah-perintah yang umum digunakan pada bahasa pemrograman sebelum dieksekusi. Sebelum dieksekusi, compiler akan membaca preprocessor yang ada di dalam kode tersebut. Preprocessor ditandai dengan notasi # (hash) Di dalam bahasa pemrograman C++, dikenal ada empat sintaks preprocessor yakni
#define, #undef, #ifdef, #ifndef.
Preprocessor #define dan #undef
Preprocessor #define digunakan untuk mengganti setiap keberadaan kata pada source code dengan kata lain. Sintaksnya adalah sebagai berikut:
#define kata_pengganti kata_yang_diganti
dengan:
Kata_Pengganti: adalah kata yang akan menggantikan kata_yang_diganti/perintah awal pada source code
Kata_yang_diganti : adalah perintah awal pada source code yang akan diganti
Berikut adalah contoh source code nya:

#include <cstdlib>
#include <iostream>
#define MASUK cin
#define TAMPILKAN cout
using namespace std;
int main(int argc, char *argv[])
{
string nama;
TAMPILKAN << "MASUKKAN NAMA ANDA :  ";
MASUK >> nama;
TAMPILKAN << "NAMA ANDA :  "<< nama<< endl
system("PAUSE");
return EXIT_SUCCESS;
}
Berikut adalah hasil dari kompilasi program
terlihat bahwa perintah cin yang berfungsi untuk memasukkan inputan ke dalam variabel dari user digantikan dengan kata MASUK. Begitu juga dengan kata cout yang digantikan dengan kata TAMPILKAN.
Sementara itu, untuk membatalkan/menghilangkan preprocessor dapat dengan membubuhkan sintaks

#undef kata_pengganti
Preprocessor #ifdef dan #ifndef
preprocessor #ifdef adalah preprocessor yang memiliki syarat apabila preprocessor tersebut telah didefinisikan, maka bernilai benar. Sebaliknya untuk preprocessor#ifndef, apabila preprocessor tersebut belum didefinisikan maka akan bernilaibenar.
contoh kode program:

#include <cstdlib>
#include <iostream>
#define MASUK cin
#define TAMPILKAN cout
using namespace std;
int main(int argc, char *argv[])
{
#ifdef MASUK
cout << "TERDEFINISI" << endl;
#else
cout << "TAK TERDEFINISI" << endl;
#endif
#undef MASUK#ifndef MASUK
cout << "TAK TERDEFINISI" << endl;
#else
cout << "TERDEFINISI" << endl;
#endif

system("PAUSE");
return EXIT_SUCCESS;
}
keluaran program adalah sebagai berikut
Dari gambar diatas terlihat bahwa sintaks #ifdef bernilai benar dan menampilkan tulisan “TERDEFINISI” pada layar, karena preprocessor MASUK telah terdefinisi sebelumnya. Namun ketika terdapat sintaks #undef MASUK, maka akan menghilangkan preprocessor tersebut. Ketika diuji dengan sintaks #ifndef MASUK, nilai #ifndef adalah benar karena preprocessor MASUK tidak terdefinisi lagi.
prepocessor bisa digunakan untuk mempersingkat fungsi masukkan atau keluaran yang biasanya panjang dan kerap dipanggil, sehingga tidak harus menulis ulang perintah tersebut.
Semoga Bermanfaat






PROGRAM KRIPTOGRAFI SEDERHANA

Kriptografi adalah sebuah ilmu atau seni yang dipergunakan untuk menjaga kerahasiaan informasi. Sebuah sistem yang telah memiliki fasilitas enkripsi harus memiliki fungsi-fungsi seperti keamanan data, keabsahan data, integritas data, dan kerahasiaan data. Semua fungsi tersebut dipergunakan untuk mencegah kebocoran informasi–informasi penting.
Fasilitas enkripsi banyak ditemukan dalam kehidupan sehari-hari. Sebagai contoh adalah ketika kita login di sebuah jejaring sosial. Sebelum kita bisa mengakses akun jejaring sosial yang kita miliki, kita harus memasukkan username ‘nama pengguna’ danpassword ‘kata sandi’ dengan tepat. Apabila kita mengisi kombinasi kata sandi dan nama pengguna yang salah, secara otomatis sistem jejaring sosial tersebut tidak mempersilakan kita untuk mengakses akun tersebut. Pada kasus tersebut, enkripsi data terletak pada penjaminan kerahasiaan kombinasi kata sandi dan nama pengguna. Selain untuk kasus diatas, enkripsi juga digunakan untuk menjaga kerahasiaan nomor pin kartu kredit, transaksi e-banking, dan penggunaan kata-kata sandi militer. Bahkan virus  pada komputer pun menggunakan program enkripsi untuk mengelabui antivirus yang terdapat di komputer tersebut.
Nah, Bagaimana cara membuat sebuah program enkripsi sederhana ?. Dalam artikel ini dilampirkan source code program enkripsi sederhana. Pengkodean program ini menggunakan bahasa pemrograman C++. Enkripsi ini menggunakan rumus: bila a menjadi z dan bila z menjadi a (berkebalikan). Rumus ini berlaku untuk semua huruf.  Berikut adalah source code program enkripsi sederhana yang dibuat oleh penulis :
#include <iostream>
using namespace std;
int main(int argc, char *argv[]){
    char kalimat[1000];
    int kode_ascii;
    cin.getline(kalimat,sizeof(kalimat));
    for(int i = 0; kalimat[i]; i++){
    kode_ascii = int(kalimat[i]);
    if(kode_ascii != 32)
    {
    if((kode_ascii >= 97) && (kode_ascii <= 122))
    {
    kode_ascii = 122 - (kode_ascii - 97 + 26) % 26;
    printf("%c", char(kode_ascii));
    }
    else
    if((kode_ascii >= 65) && (kode_ascii <= 90))
    {
    kode_ascii = 90 - (kode_ascii - 65 + 26) % 26;
    printf("%c", char(kode_ascii));
    }
    else
    printf("%c", char(kode_ascii));
    }
    else
    printf("%c", char(kode_ascii));
    }
    printf("\n");
     
    }
Berikut adalah penjelasan singkat mengenai variabel, fungsi,  dan method dari source code di atas :
Variabel, fungsi, dan methodPenjelasan
#include <iostream>berfungsi sebagai fungsi untuk membaca masukan dari pengguna maupun keluaran yang akan dicetak pada layar.
Method int main(int argc, char *argv[]){}Semua perintah yang terdapat pada method tersebut (di dalam tanda kurung kurawal) akan dieksekusi atau dijalankan.
Variabel char kalimat[1000]Berfungsi untuk menampung kalimat yang dimasukkan oleh user ke layar. Variable ini mempunyai tipe data char(karakter) yang berupa array yang bisa menampung hingga 1000 karakter.
Variabel  int kode_asciiBerfungsi untuk menampung nilaiAmerican Standard Code for Information Interchange (ASCII) dari setiap karakter yang dimasukkan. Nilai ASCII adalah suatu standard internasional untuk mengkonversi huruf maupun simbol ke dalam bilangan. Variable ini mempunyai tipe data int (integer).
Fungsicin.getline(kalimat,sizeof(kalimat));Berfungsi untuk menginputkan huruf ke dalam program. Apabila tidak ada fungsi ini maka pengguna program ini tidak bisa memasukkan huruf apapun.
Fungsi 
for(int i = 0; kalimat[i]; i++){}
Fungsi perulangan ini digunakan untuk memindai karakter demi karakter yang dimasukkan oleh user.
Fungsi 
kode_ascii = int(kalimat[i])
Fungsi ini digunakan untuk mengkonversikan simbol atau huruf ke dalam kode ASCII yang berbentuk numerik.
Fungsi 
printf("%c", char(kode_ascii));
Fungsi ini berguna untuk menampilkan huruf-huruf yang telah berhasil di enkripsi oleh program.
Bila program di-compile dan diberkan sebuah data (masukkan) maka akan tampil sebagai berikut:
1. Referensi kode program: http://yanuaradji.wordpress.com/2011/05/27/program-enkripsi-menggunakan-c
compiler menggunakan Dev-Cpp