Advertisements
Archive | Programming RSS feed for this section

Goldreich-Goldwasser Halevi (GGHAlgorithm) Cryptosystem

5 Oct

Salah satu aspek penting dalam kriptografi adalah menjamin kerahasiaan (confidentiality) suatu pesan. Untuk menjamin bahwa suatu pesan hanya dibaca oleh pihak-pihak yang berkepentingan saja, perlu dilakukan proses enkripsi-dekripsi terhadap pesan tersebut. Enkripsi merupakan proses mengubah teks pesan menjadi teks pesan baru yang tidak mudah dikenali lagi makna aslinya (ciphertext). Dekripsi adalah proses menerjemahkan ciphertext menjadi teks pesan awal.

Dalam kriptografi, terdapat beberapa jenis teknik enkripsi-dekripsi yang dapat digunakan. Pada tugas ini, teknik enkripsi-dekripsi yang digunakan adalah block cipher. Dalam block cipher, teks pesan akan dipotong menjadi beberapa block sebesar n karakter. Setiap block yang terbentuk akan dienkrip dengan suatu algoritma tertentu menggunakan key yang telah dibuat. Kemudian untuk setiap block yang telah dienkrip, digabungkan secara terurut menjadi sebuah ciphertext.

Tidak jauh berbeda dengan proses enkripsi, proses dekripsi dalam block cipher juga akan memotong ciphertext ke dalam block dengan ukuran yang sama ketika proses enkripsi. Setiap block didekrip dengan suatu algoritma menggunakan sebuah key. Teks pesan awal akan terbentuk setelah hasil dekripsi dari setiap block digabung.

Class GGHAlgorithm menyediakan method-method untuk menjalankan proses enkripsi-dekripsi GGH cryptosystem (yang disederhanakan). Menggunakan bantuan class LUDecomposition untuk menyelesaikan sistem persamaan pada proses dekripsi.

Pada kesempatan ini, kita akan membahas algoritma Goldreich-Goldwasser Halevi atau GGHAlgorithm. Lihat di bawah ini:

import java.util.Random;

public class GGHAlgorithm {
/* ------------------------
 Class variables
 * ------------------------ */

 /**
 private key dengan dimensi 20 dengan range nilai -200 s/d 200
 Hadamard ratio sekitar 0.8
 */
 private double[][] privateKey = {
 {17, -6, 2, -1, -7, -2, -8, -7, 1, -3, 0, 6, -4, -3, 2, 3, -1, -7, -7, 0},
 {0, -21, 21, -7, 12, -1, -1, 10, -5, -5, 0, 7, 11, -12, -2, 7, -19, 8, -8, 2},
 {0, -13, -26, 0, 11, -25, -5, 22, -27, -5, -25, 16, 13, 12, 2, -17, -15, 5, 14, -8},
 {0, -1, -2, -9, 54, 6, 9, 6, -13, -13, -3, 0, -21, 18, -21, 21, -10, -16, 21, 22},
 {0, 9, 18, 8, 9, -54, 23, 16, -15, -32, 2, 9, 8, 22, 1, 9, -22, 11, 7, 35},
 {0, -4, -8, -28, -4, 24, 32, -6, 8, -4, 4, -7, -9, 4, -7, -1, 22, 9, 17, 10},
 {0, 0, 0, 3, 0, 0, 3, 7, -48, 36, 22, 2, -25, 0, 0, -26, 37, -16, 31, -5},
 {0, 0, 0, 17, 0, 0, 17, -3, -22, 7, 18, 52, -23, 7, -12, 31, -15, 6, -16, 11},
 {0, 0, 0, 1, 0, 0, 1, -3, -34, 19, -11, -1, 2, -6, -14, 4, 19, -31, -63, -23},
 {0, 0, 0, 13, 0, 0, 13, -35, 10, -18, -3, -13, 4, -26, -11, -4, 2, 21, 4, 2},
 {0, 0, 0, -12, 0, 0, -12, 8, 21, 1, -49, 12, 28, -4, 20, 2, 6, -8, 19, 13},
 {0, 0, 0, 12, 0, 0, 12, -18, 15, 45, 33, -12, 18, 1, -10, -15, -7, -8, 4, -25},
 {0, 0, 0, 16, 0, 0, 16, 16, 0, 0, -16, -16, 8, 24, -17, 8, 23, 17, 9, 14},
 {0, 0, 0, 12, 0, 0, 12, 12, 0, 0, -12, -12, -33, -40, 22, 23, -21, 4, 19, -1},
 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -5, 48, -17, 43, 9, 20, -12, -8},
 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 48, 4, -12, -6, -30, -12},
 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 0, 0, 43, -23, 22, 1, -24},
 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, -15, -40, -16},
 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, -62, -28},
 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 195}
 };

 /* ------------------------
 Constructor
 * ------------------------ */
 public GGHAlgorithm() {

 }

 /** Mengakses privateKey
 @return private key
 */
 public double[][] getPrivateKey() {
 return this.privateKey;
 }

 /** Memberi nilai pada privateKey
 @param privateKey matriks 20x20 yang ingin dijadikan private key
 */
 public void setPrivateKey(double[][] privateKey){
 this.privateKey = privateKey;
 }

 /** Membuat public key
 @param g private key
 @param imax range nilai public key (imax, berarti antara -imax s/d imax, inclusive)
 @param hrat batas atas hadamard ratio untuk public key yang ingin dibuat
 @return public key
 */
 public double[][] generatePublicKey(double[][] g, int imax, double hrat)
 {
 LUDecomposition copyarray = new LUDecomposition();
 double[][] b = copyarray.array2DCopy(g);
 int dim = b.length;
 double[][] v = new double[dim][dim];

 //CONSTRUCT StrassensAlgorithm OBJECT
 StrassensAlgorithm multiply = new StrassensAlgorithm();

 //randomunimodmatrix
 double[][] u = this.generateUnimodularMatrix(dim,imax);

 while(this.hadamardRatio(b) > hrat)
 {
 //B = G*U
 //USING STRASSENS
 b = multiply.strassenMatrixMulti(g,u);

//generate randomunimodmatrix, save to V
 v = this.generateUnimodularMatrix(dim,imax);

 //U = U*V
 //USING STRASSENS
 u = multiply.strassenMatrixMulti(u,v);
 }

 return b;
 }

 /** Mendapatkan public key, menggunakan generatePublicKey untuk membuat public key
 @param privateKey private key
 @return public key
 */
 public double[][] getPublicKey(double[][] privateKey){
 //hadamard ratio of 0.5 is already "bad"
 return this.generatePublicKey(privateKey,200,0.5);
 }

 /** Melakukan proses enkripsi sesuai langkah-langkah pada GGH cryptosystem
 @param blockAscii array yang berisi bagian pesan yang ingin di-enkripsi
 @param publicKey public key
 @return array hasil enkripsi
 */
 public double[] encryptGGH(double[] blockAscii, double[][] publicKey){
 double[] cipherMatrix = new double[blockAscii.length];

 double[] perturbationVector, multMatrix;
 perturbationVector = this.generatePerturbationVector(publicKey.length);
 multMatrix = this.matrixVectorMul(publicKey, blockAscii);

 for(int j = 0; j < multMatrix.length; j++){
 cipherMatrix[j] = multMatrix[j] + perturbationVector[j];
 }

 return cipherMatrix;
 }

/** Melakukan proses dekripsi sesuai langkah-langkah pada GGH cryptosystem
 @param privateKey private key
 @param publicKey public key
 @param cipherText array yang berisi cipher text
 @return array hasil dekripsi
 */
 public double[] decryptGGH(double[][] privateKey, double[][] publicKey, double[] cipherText) {

 //CONSTRUCTING OBJECT FROM LUDecomposition
 LUDecomposition priv = new LUDecomposition(privateKey);

 //SOLVE (privateKey)(cipherLinearCombination) = (cipherText)
 double[] cipherLinearCombination = priv.solveLSE(cipherText);

double[] closestVertex = babaiClosestVertexAlgorithm(
 cipherLinearCombination, privateKey);

//CONSTRUCTING OBJECT FROM LUDecomposition
 LUDecomposition pub = new LUDecomposition(publicKey);

 //SOLVE (publicKey)x = (privateKey*closestVertex)
 return pub.solveLSE(matrixVectorMul(privateKey, closestVertex));
 }

/** Membuat matriks dimensi dimxdim yang diisi dengan integer (random)
 @param imax nilai maksimum elemen matriks
 @param dim dimensi matriks persegi
 @return matriks dimxdim
 */
 public double[][] randomMatrix(int imax, int dim)
 {
 double m[][] = new double[dim][dim];
 Random random = new Random();

for(int i = 0; i < dim; i++) {
 for(int j = 0; j < dim; j++) {
 m[i][j] = (double)(random.nextInt(imax - 1) + 1);
 }
 }

//System.out.println("in randomMatrix");
 //this.printMatrix(m);

return m;
 }

 /** Implementasi proses derangement
 @param n ukuran array (jumlah posisi yang ingin dipermutasi)
 @return array hasil derangement
 */
 public int[] derangement(int n)
 {
 int m[] = new int[n];

for(int i = 0; i < n; i++) {
 m[i] = i;
 }

return this.randperm(m);
 }

 /** Membantu proses derangement, permutasi dimana di hasil akhir tidak ada posisi isi array yg sama dengan posisi awal, e.g 1 != 1'
 @param a array yang ingin di-derangement
 @return array hasil dekripsi
 */
 public int[] randperm(int[] a)
 {
 int m[] = new int[a.length];

for(int i = 0; i < a.length; i++) {
 m[i] = a[i];
 }

Random random = new Random();

for(int i = 0; i < m.length; i++) {
 int rand = random.nextInt(a.length - 1) + 1;

while (rand == i) {
 rand = random.nextInt(a.length - 1) + 1;
 }

int temp = m[i];
 m[i] = m[rand];
 m[rand] = temp;
 }

return m;
 }

/** Membuat perturbation vector
 @param dim ukuran vektor
 @return perturbation vector
 */
 public double[] generatePerturbationVector(int dim) {
 double[] v = new double[dim];

for(int i = 0; i < dim; i++) {
 v[i] = Math.round((Math.random() * 10) - 5);
 }

while(vectorNorm(v) == 0) {
 for(int i = 0; i < dim; i++) {
 v[i] = Math.round((Math.random() * 10) - 5);
 }
 }

 /*
 System.out.println();
 System.out.println("perturbation Vector");
 for(int i = 0; i < dim; i++) {
 System.out.println(v[i]);
 }
 */
 //System.out.println("\nPerturbation Vector");
 //this.printVector(v);
 //System.out.println();
 return v;
 }

 /** Membuat matriks unimodular
 @param dim ukuran matriks, dimxdim
 @param intMax nilai maksimum matriks
 @return matriks unimodular
 */
 public double[][] generateUnimodularMatrix(int dim, int intMax)
 {

 double u[][] = new double[dim][dim];

double A[][] = this.randomMatrix(intMax, dim);
 double Atriangular[][] = new double[dim][dim];

for(int i = 0; i < dim; i++) {
 for(int j = 0; j < dim; j++) {
 if (i>j) {
 Atriangular[i][j] = (double)0;
 }
 else if (i == j) {
 Atriangular[i][j] = (double)1;
 }
 else {
 Atriangular[i][j] = (double)A[i][j];
 }
 }
 }

//System.out.println("in generateUnimodularMatrix, Atriangular:");
 //this.printMatrix(Atriangular);
 //System.out.println();

int p[] = this.derangement(dim);

//System.out.println("in generateUnimodularMatrix, derangement:");
 //this.printVector(p);
 //System.out.println();

for(int i = 0; i < dim; i++) {
 for(int j = 0; j < dim; j++) {
 u[j][i] = Atriangular[j][p[i]];
 }
 }

 //System.out.println("in generateUnimodularMatrix, final matrix:");
 //this.printMatrix(u);

return u;
 }

/** Operasi inner product antara dua vektor
 @param u vektor
 @param v vektor
 @return hasil inner product
 */
 public double innerProduct(double[] u, double[] v) {
 double w = 0;
 for(int i = 0; i < u.length; i++) {
 w += u[i] * v[i];
 }

return w;
 }

/** Perkalian skalar dengan vektor
 @param scalar skalar
 @param v vektor
 @return hasil perkalian skalar dengan vektor
 */
 public double[] scalarVectorMul(double scalar, double[] v) {
 for(int i = 0; i < v.length; i++) {
 v[i] += scalar * v[i];
 }

return v;
 }

/** Penjumlahan antara dua vektor
 @param u vektor
 @param v vektor
 @return vektor hasil penjumlahan
 */
 public double[] vectorAddition(double[] u, double[] v) {
 double[] newVector = new double[u.length];
 for(int i = 0; i < u.length; i++) {
 newVector[i] = u[i] + v[i];
 }

return newVector;
 }

/** Perkalian antara matriks dengan vektor (matriks * vektor = vektor)
 @param a matriks
 @param b vektor
 @return hasil perkalian (vektor)
 */
 public double[] matrixVectorMul(double a[][], double b[]) {
 double c[] = new double[a.length];

for(int i = 0; i < a.length; i++) {
 for(int j = 0; j < b.length; j++) {
 c[i] += a[i][j] * b[j];
 }
 }

return c;
 }

/** Menghitung norm-2 sebuah vektor
 @param v vektor
 @return norm-2 vektor
 */
 public double vectorNorm(double[] v) {
 double norm = 0;

for(int i = 0; i < v.length; i++) {
 norm += Math.pow(v[i], 2);
 }

return Math.sqrt(norm);
 }

/** Meyelesaikan closest vertex problem (CVP) dengan algoritma Babai
 @param w vektor (jadi, solusi CVP adalah vektor terdekat dengan w)
 @param baseVectors matriks yang berisi basis
 @return solusi CVP
 */
 public double[] babaiClosestVertexAlgorithm(double[] w, double[][] baseVectors) {
 double wLinearCombination[] = new double[w.length];
 System.arraycopy(w, 0, wLinearCombination, 0, w.length);

for(int i = 0; i < w.length; i++) {
 wLinearCombination[i] = Math.round(wLinearCombination[i]);
 }

return wLinearCombination;
 }

/** Menghitung hadamard ratio dari key
 @param m matriks/key yang ingin dicari hadamard ratio-nya
 @return hadamard ratio
 */
 public double hadamardRatio(double m[][]) {
 LUDecomposition lu = new LUDecomposition(m);

double detL = Math.abs(lu.computeDeterminant());
 double[] firstVector = new double[m.length];

for(int i = 0; i < firstVector.length; i++) {
 firstVector[i] = m[i][0];
 }

double norms = vectorNorm(firstVector);

for(int i = 1; i < m.length; i++) {
 double baseVector[] = new double[m.length];

for(int j = 0; j < m.length; j++) {
 baseVector[j] = m[j][i];
 }

norms *= vectorNorm(baseVector);
 }
 return Math.pow(detL/norms, (double)1.0/m.length);
 }

/** Mencetak matriks ke output
 @param m matriks
 */
 public static void printMatrix(double m[][]) {
 for(int i = 0; i < m.length; i++) {
 for(int j = 0; j < m[0].length; j++) {
 System.out.print(m[i][j] + " |");
 }
 System.out.println();
 }
 }

 /** Mencetak vektor ke output (dengan isi elemen adalah integer)
 @param m vektor
 */
 public static void printVector(int[] m) {
 for(int i = 0; i < m.length; i++) {
 System.out.print(m[i] + " ");
 System.out.println();
 }
 }

 /** Mencetak vektor ke output (dengan isi elemen adalah double)
 @param m vektor
 */
 public static void printVector(double[] m) {
 for(int i = 0; i < m.length; i++) {
 System.out.print(m[i] + " ");
 System.out.println();
 }
 }
}
Advertisements

Struktur data dan algoritma Tree pada ML (Meta Language)

26 Sep

Konsep struktur data Tree telah dipelajari pada kuliah struktur data dan algoritma. Soal-soal pada latihan tutorial kali ini adalah soal-soal yang relatif pernah dikerjakan secara imperatif. Peserta diharapkan memahami bagaimana algoritma tree direpresentasi dalam pemrograman fungsional. Peserta juga diharapkan dapat membandingkan penyelesaian imperatif dengan fungsional pada setial soal yang diberikan. Tuliskan analisa perbandingan dalam komentar program. Analisa perbandingan dapat meliputi: kompleksitas running time dan alokasi memory, kemudahan pembuatan/perbaikan/modifikasi program, dan kemudahan membaca program. Gunakan sebisa mungkin higher order function pada setiap soal. Bila ada yang kurang jelas pada soal, silahkan tambahkan asumsi anda.

1. Buatlah sebuah fungsi bernama “soal1”. Fungsi tersebut menerima sebuah string, dan menghasilkan list of pair, yang tiap pairnya menyatakan karakter dan jumlah kemunculan karakter tersebut pada string input. Urutan pada pair output tidak penting.

soal1 :  string → (char * int) list

Contoh:

– soal1 “saya makan”

> val it = [(#”s”, 1), (#”a”,4), (#”y”,1), (#”m”,1), (#”k”,1), (#”n”,1)]

(Catatan: soal ini terkait dengan penerapan huffman code untuk kompresi,  harap melanjutkan lagi pengerjaannya hingga sampai encoding dan decoding, tidak perlu  dikumpulkan pada tutorial, tapi sebagai bagian persiapan ujian)

2. Buatlah sebuah fungsi bernama “soal2”. Fungsi tersebut membaca sebuah input dengan struktur data tree dan memeriksa apakah input tree tersebut merupakan binary search tree atau tidak. Struktur data tree didefinisikan dengan:

datatype bst = Leaf | Node of int * bst * bst

soal2 : bst → bool

Contoh:

– val t1 = Node(6, Node(4,Leaf,Leaf),
Node(15, Node(11,Leaf,Leaf), Node(24,Leaf,Leaf)));
– soal2 t1;
> val it = true : bool

3. Buatlah sebuah fungsi bernama “soal3” yang menerima satu argument tree. Fungsi ini akan mencetak isi tree yang diberikan secara inorder. (hint: gunakan perintah “print”);

soal3 : bst → unit

4. Buatlah sebuah fungsi bernama “soal4” yang memiliki dua argumen. Argumen pertama adalah sebuah list bilangan dan argumen kedua adalah sebuah tree. Fungsi ini akan memasukan argumen pertama kedalam tree satu persatu mulai dari elemen pertama pada list, dengan tetap mempertahankan struktur binary search tree namun tidak perlu balance.

soal4 : int list → bst → bst

5. Buatlah sebuah fungsi bernama “soal5”. Fungsi ini serupa dengan “soal4” namun dengan mengimplementasikan AVL Tree. Input tree yang diberikan bila bukan merupakan AVL Tree maka soal5 memberikan output berupa exception “Input bukan AVL Tree”. (hint: gunakan
“raise”)
soal5 : int → bst → bst

JAWABAN:

load "List";
load "Int";

datatype bst = Leaf | Node of int * bst * bst;

val tr = Node (4,
Node (2,
Node (1, Leaf, Leaf),
Node (3, Leaf, Leaf)
),
Node (6,
Node (5, Leaf, Leaf),
Node (7, Leaf, Leaf)
)
);

val ntr = Node (4,
Node (2,
Node (3, Leaf, Leaf),
Node (1, Leaf, Leaf)
),
Node (6,
Node (5, Leaf, Leaf),
Node (7, Leaf, Leaf)
)
);

val soal1 = let
fun calc [] = []
| calc (c::cs)= let
val next = List.filter (fn x => x <> c) cs
in (c,length cs - length next + 1) :: (calc next) end
in calc o explode end;

fun inorder Leaf = []
| inorder (Node (k,l,r)) = inorder l @ [k] @ inorder r;

val soal2 = let
fun sorted [] = true
| sorted [_] = true
| sorted (x1::x2::xs) = x1 <= x2 andalso sorted (x2::xs)
in sorted o inorder end;

val soal3 = (map (print o Int.toString)) o inorder

fun insert (k,Leaf) = Node (k, Leaf, Leaf)
| insert (k, Node (x,l,r))= if k < x
then Node (x, insert (k,l), r)
else Node (x, l, insert (k,r))

exception NotBST;
fun soal4 ls tree = if soal2 tree
then foldl insert tree ls;
else raise NotBST

fun rotateR Leaf = Leaf
| rotateR (Node (k,Leaf,r)) = Node (k,Leaf,r)
| rotateR (Node (k,Node (l,ll,lr),r)) = Node (l,ll,Node (k,lr,r));

fun rotateL Leaf = Leaf
| rotateL (Node (k,l,Leaf)) = Node (k,l,Leaf)
| rotateL (Node (k,l,(Node (r,rl,rr)))) = Node (r,Node (k,l,rl),rr);

fun height Leaf = 0
| height (Node (_,l,r)) = Int.max (height l, height r) + 1

fun balance Leaf = Leaf
| balance (Node (k,l,r)) = if height l > height r
then let
fun rotate' tree = case tree of Leaf => Leaf
| (Node (x,xl,xr)) => if height xr > height xl
then rotateL tree
else tree
val subtree = (k,rotate' l,r)
in rotateR (Node subtree) end
else let
fun rotate' tree = case tree of Leaf => Leaf
| (Node (x,xl,xr)) => if height xl > height xr
then rotateR tree
else tree
val subtree = (k,l,rotate' r)
in rotateL (Node subtree) end;

fun isBalanced Leaf = true
| isBalanced (Node (k,l,r)) = Int.abs (height l - height r) <= 1
andalso isBalanced l
andalso isBalanced r;

fun rebalance Leaf = Leaf
| rebalance (Node (k,l,r)) = let
val tree = Node (k,rebalance l, rebalance r)
in if isBalanced tree
then tree
else balance tree
end;

exception NotAVL;
fun soal5 k tree = if soal2 tree andalso isBalanced tree
then rebalance (insert (k,tree))
else raise NotAVL;

Paradigma Pemrograman

16 Jun

Paradigma adalah sudut pandang atau “sudut serang” tertentu yang diprioritaskan terhadap kelompok problema, realitas, keadaan, dan sebagainya. Dalam pemrograman pun dikenal istilah paradigma pemrograman, yakni sudut pandang atau strategi analisa khusus yang diambil untuk menyelesaikan suatu masalah pemrograman.

Beberapa paradigma pemrograman yang ada sampai saat ini :

1. Paradigma pemrograman prosedural atau imperatif

Paradigma ini didasari oleh konsep mesin Von Newmann (stored program concept), yakni sekelompok tempat penyimpanan/memori, yang dibedakan menjadi memori instruksi dan memori data yang masing-masingnya dapat diberi nama dan harga. Instruksi akan dieksekusi satu persatu secara sekuensial oleh sebuah pemroses tunggal. Beberapa instruksi menentukan instruksi yang selanjutnya akan dieksekusi (percabangan kondisional). Data diperiksa dan dimodifikasi secara sekuensial juga. Program dalam paradigma ini didasari pada strukturasi informasi di dalam memori dan manipulasi dari informasi yang disimpan tersebut. Kata kunci dalam paradigma ini adalah sebuah program dihasilkan oleh algoritma dengan struktur data tertentu.

2. Paradigma pemrograman fungsional

Paradigma ini didasari oleh konsep pemetaan dan fungsi pada matematika. Fungsi dapat berupa fungsi primitif, atau komposisi dari fungsi-fungsi lain yang telah terdefinisi. Pemrogram mengasumsikan bahwa ada fungsi-fungsi lain yang dapat dilakukan. Penyelesaian masalah didasari atas aplikasi dari fungsi-fungsi tersebut dengan dasar pemecahan persoalan adalah transformasional. Semua kelakuan program adalah suatu rantai transformasi dari sebuah keadaan awal menuju ke suatu rantai keadaan akhir, yang mungkin melalui keadaan antara, melalui aplikasi fungsi.

3. Paradigma pemrograman deklaratif, predikatif, atau logik

Paradigma ini didasari oleh pendefinisian relasi antarindividu yang dinyatakan sebagai predikat. Sebuah program logik adalah kumpulan aksioma (fakta dan aturan deduksi).

Pemrogram menguraikan sekumpulan fakta dan aturan-aturan (inference rules). Ketika program dieksekusi, pemakai mengajukan pertanyaan (query), dan program akan menjawab apakah pertanyaan ini dapat dideduksi dari aturan dan fakta yang ada. Program akan memakai aturan deduksi dan mencocokkan pertanyaan dengan fakta-fakta yang ada untuk menjawab pertanyaan.

4. Paradigma pemrograman berorientasi objek

Paradigma ini didasari oleh kelas dan objek. Objek adalah instansiasi dari kelas. Objek mempunyai atribut (kumpulan sifat), dan mempunyai kelakuan (kumpulan reaksi, metode). Objek yang satu dapat berkomunikasi dengan objek yang lain lewat “pesan”, dengan tetap terjaga integritasnya.Kelas mempunyai hirarki, anggota dari sebuah kelas juga mendapatkan turunan atribut dari kelas di atasnya. Paradigma ini menawarkan konsep modularitas, penggunaan kembali, dan kemudahan modifikasi.

5. Paradigma pemrograman konkuren

Paradigma ini didasari pada kenyataan bahwa sebuah sistem komputer harus menangani beberapa program/task yang harus dieksekusi bersama dalam sebuah lingkungan (mono atau multiprosesor). Pemrograman konkuren tidak lagi berpikir sekuensial, melainkan harus menangani komunikasi dan sinkronisasi antartask.

MELODY CONVERTER Assembly Language-Tugas I Pengantar Organisasi Komputer

6 Jun

Pada tugas I, Anda diminta untuk membuat converter lagu dari not angka diterjemahkan menjadi lafal nada tersebut, atau pun sebaliknya. Misalnya, 1 = Do, 2 = Re, dst. Input not angka lagu ini diletakkan di flash / program memory. Kemudian, hasil outputnya harus Anda tampilkan di LCD.

Contoh:

Input di flash : 1 2 3

Output di LCD : c d e

 

Input di Flash : c d e

Output di LCD : 1 2 3

 

Input di Flash : 1 d 3

Output Di LCD : c 2 e

 

Kemudian, program tersebut dapat menggunakan operator #. Operator # ini menaikkan tangga nada setengah kali.

#1 = cis

#(1 2) = cis dis

#(1 2 3) = cis dis es

##(1 2 3) = d e f

Not atau not-not angka yang dikenai operator #, terletak pada satu baris yang sama.

 

C D E F G A B = 1 2 3 4 5 6 7

Kode Programnya:


.include "m8515def.inc"

&nbsp;

.def temp = r16

.def inputR = r17        ; Register that saves input

.def outputR = r18    ; Register that saves output

.def PB = r19                 ; output portB di LCD

.def cKres = r21           ; counter of #

.def lingkup =  r22     ; as a status bit is there are any # next to the local input

&nbsp;

rjmp   START

&nbsp;

INIT_LCD:

cbi PORTA,1

ldi PB,0x38

out PORTB,PB

sbi PORTA,0 ; SETB EN

cbi PORTA,0

rcall WAIT_LCD

&nbsp;

cbi PORTA,1

ldi PB,$0E

out PORTB,PB

sbi PORTA,0

cbi PORTA,0

rcall WAIT_LCD

cbi PORTA,1

ldi PB,$06

out PORTB,PB

sbi PORTA,0 ; SETB EN

cbi PORTA,0

rcall WAIT_LCD

ret

&nbsp;

CLEAR_LCD:

cbi PORTA,1

ldi PB,$01

out PORTB,PB

sbi PORTA,0 ; SETB EN

cbi PORTA,0

rcall WAIT_LCD

ret

&nbsp;

WAIT_LCD:

ldi temp, 4

CONT:

dec temp

brne CONT

ret

&nbsp;

input:

.db "#(12)"

.db                           0                     ; the end of input

&nbsp;

&nbsp;

START:

ldi temp,low(RAMEND)

out SPL,temp

ldi temp,high(RAMEND)

out SPH,temp

&nbsp;

rcall INIT_LCD

rcall CLEAR_LCD

ser temp

&nbsp;

; initilize port outputR n B as output

out DDRA,temp

out DDRB,temp

&nbsp;

ldi ZH,high(2*input)

ldi ZL,low(2*input)

&nbsp;

push cKres                                 ; push the value of cKres which is 0

ldi lingkup,1                             ; set T

rjmp LoadInput

&nbsp;

LoadInput:

lpm                           inputR,Z+

tst      inputR

breq  quit

cpi     inputR,'A'                                               ; if Capital or not (Letter)

brsh   toLetter

cpi     inputR,'1'                                               ; if Number

brsh                          angka

cpi     inputR,'('

breq  bukaKurung

cpi     inputR,')'

breq  tutupKurung

cpi     inputR,'#'

breq  kres

rjmp  LoadInput

&nbsp;

kres:

inc     cKres

ldi      lingkup,1

rjmp  LoadInput

&nbsp;

&nbsp;

bukaKurung:

pop                            temp       ; get the cKres value that will affect this char input

push  temp        ; save the cKres value that maybe will affect the       next   char input

add                         cKres,temp  ;so now the total cKress that will affect just for this char input

push  cKres        ; and save it

ldi       lingkup,0                      ; assign F (to go to the next char input)

ldi       cKres,0   ; assign 0 (to go to the next char input)

rjmp   LoadInput

&nbsp;

tutupKurung:

pop inputR

ldi lingkup,0                             ;assign F (to go to the next char input)

rjmp LoadInput

&nbsp;

write:

sbi PORTA,1       ; SETB RS

out PORTB, outputR

sbi PORTA,0       ; SETB EN

cbi PORTA,0      ; CLR EN

ret

&nbsp;

QUIT :

rjmp QUIT

&nbsp;

toLetter:

rjmp Letter

&nbsp;

toLoadInput:

rjmp LoadInput

&nbsp;

angka:

subi                         inputR,'1'                          ;to get the difference value (0-8) not in asci

add                         inputR,inputR                ;mul (*2) to make it easy in finding the output text whether it is affected with # or not

&nbsp;

pop                         temp    ;get the value of how many "#" that has already been found

push  temp  ;store it in stack again

add                         inputR,temp     ; inputR +=cKres

cpi   lingkup,1           ; cp if there are any single "#" next to the number(of input)

breq  jlhKres

rjmp  cekValue

&nbsp;

JlhKres:

add inputR, cKres

&nbsp;

cekValue:

ldi lingkup,0    ;there's no # next to the input so set F

ldi cKres,0       ;so there's no need push action (no need to update cKres)

tst inputR

&nbsp;

;check the value of inputR

InRangeorNot:

breq cetakC      dec inputR

breq cetakCis   dec inputR

breq cetakD      dec inputR

breq cetakDis  dec inputR

breq cetakE       dec inputR

breq cetakEs     dec inputR

breq cetakF       dec inputR

breq cetakFis   dec inputR

breq cetakG      dec inputR

breq cetakGis  dec inputR

breq cetakA      dec inputR

breq cetakAis   dec inputR

breq cetakB      dec inputR

breq cetakBis   dec inputR

rjmp InRangeorNot  ;if inputs>7 than decrement it until equals with the suitable one

&nbsp;

cetakC:

ldi outputR, 'C'                        rcall write

rjmp toLoadInput

cetakCis:

ldi outputR, 'C'                        rcall write

ldi outputR, 'i' rcall write

ldi outputR, 's'                         rcall write

rjmp toLoadInput

&nbsp;

cetakD:

ldi outputR, 'D'                       rcall write

rjmp toLoadInput

cetakDis:

ldi outputR, 'D'                       rcall write

ldi outputR, 'i' rcall write

ldi outputR, 's'                         rcall write

rjmp toLoadInput

&nbsp;

cetakE:

ldi outputR, 'E'                        rcall write

rjmp toLoadInput

cetakEs:

ldi outputR, 'E'                        rcall write

ldi outputR, 's'                         rcall write

rjmp toLoadInput

&nbsp;

cetakF:

ldi outputR, 'F'                        rcall write

rjmp toLoadInput

cetakFis:

ldi outputR, 'F'                        rcall write

ldi outputR, 'i' rcall write

ldi outputR, 's'                         rcall write

rjmp toLoadInput

&nbsp;

cetakG:

ldi outputR, 'G'                       rcall write

rjmp toLoadInput

cetakGis:

ldi outputR, 'G'                       rcall write

ldi outputR, 'i' rcall write

ldi outputR, 's'                         rcall write

rjmp toLoadInput

&nbsp;

cetakA:

ldi outputR, 'A'                        rcall write

rjmp toLoadInput

cetakAis:

ldi outputR, 'A'                        rcall write

ldi outputR, 'i' rcall write

ldi outputR, 's'

rcall write          rjmp toLoadInput

&nbsp;

cetakB:

ldi outputR, 'B'                        rcall write

rjmp toLoadInput

cetakBis:

ldi outputR, 'B'                        rcall write

ldi outputR, 'i' rcall write

ldi outputR, 's'                         rcall write

rjmp toLoadInput

&nbsp;

sub20:

subi inputR, $20   ; the difference between small caps and capital is $20

rjmp PreValue

&nbsp;

Letter:

cpi inputR,$60                             ;if small caps then convert it to the capital one

brsh sub20

&nbsp;

&nbsp;

PreValue:  ;if the input has already been in Capital Letter so

subi inputR, $12  ;get the value that represents in number

pop temp           ;get the value of cKres

push temp

&nbsp;

cpi lingkup,1    ;check if there are any #next to the input that has already been update

breq jlhKresF

rjmp PreNext

&nbsp;

JlhKresF:                                                                                                                            ;

add temp, cKres  ;temp is filled with the total cKress value that this input get affected

&nbsp;

PreNext:

ldi cKres,0         ;set 0 utk jlh cKres yg hanya berhubungan dgn input sekrg utk tdk mengefek pd input sesudahnya

rjmp loop

&nbsp;

add7:

; if it is A n B then add 7 to it, in intend to gain the correct output that ought to be

ldi r20,7

add inputR,r20

rjmp Output_angka

&nbsp;

loop:

subi temp, $2; is k larger set c flag

in r19, SREG

brsh tambah1 ; maonya clear

&nbsp;

continue:

out SREG, r19  ; get the saved one of status register

brmi cetakKres                       ; if the Negative flag from SREG is 1 go to cetakKres

tst temp              ; jika cKres == 0

breq Value

rjmp loop

&nbsp;

Value:

cpi inputR,'1'   ; for letter A,B compare if the input(that has been represented in number) is lower than 1 or not

brlo add7

&nbsp;

Output_angka:

;if the answer has already been the correct answer then print it

mov outputR,inputR

rcall write

rjmp LoadInput                                              ;check the next character of the input

&nbsp;

tambah1:

inc inputR

rjmp continue

&nbsp;

cetakKres:

inc temp                    ;make temp register not negative

inc temp

cpi temp,$0

breq Value

ldi outputR,'#'        ; jika input yg bersangkutan jumlah # nya ganjil maka ada #

rcall write

rjmp Value

What is “this” ? Java OOP

3 Jun

Dalam setiap methods non static yang dipanggil lewat suatu objek, terdapat secara implicit suatu variable reference yang bernama “this”.

“this” menunjuk ke objek yang memanggil methods itu.
Contoh constructor yang memakai this:


public class Lingkaran {
public double x, y, r ; // pusat dan jari-jari
public Lingkaran (double x, double y, double r){
this.x = x; this.y = y; this.r = r;
public double luas() { return 3.14 * r * r; }
}

Contoh class Lingkaran dengan banyak constructor :


public class Lingkaran {
public double x, y, r;
public Lingkaran(double x, double y, double r){
this.x = x; this.y = y; this.r = r;
}
public Lingkaran (double r){
x = 0.0; y = 0.0; this.r = r;
}
public Lingkaran(Lingkaran lk){
x = lk.x; y=lk.y; r = lk.r;
}
public Lingkaran(){
x=0.0; y = 0.0; r = 1.0;
}
public double luas() { return 3.14*r*r; }
}

Pendefinisian class Lingkaran itu dapat disingkat dengan memakai this sebagai berikut:


public class Lingkaran {
public double x, y, r;
public Lingkaran(double x, double y, double r){
this.x = x; this.y = y; this.r = r;
}
public Lingkaran (double r){ this(0.0, 0.0, r); }
public Lingkaran(Lingkaran lk){ this(lk.x, lk.y, lk.r); }
public Lingkaran(){ this(0.0, 0.0, 1.0); }
public double luas() { return 3.14 * r * r; }
}

Pengunaan this untuk memanggil contructor lain seperti tadi harus muncul sebagai statement pertama dalam body constructor.

Solusi: Struktur Data dan Algoritma – Sortie si Pengurut Email

3 Jun

Deskripsi

Sortie adalah sebuah program yang akan dikembangkan untuk mengurutkan email seseorang. Sortie digunakan terutama untuk membantu orang-orang yang sibuk supaya terbantu dalam membaca email mereka. Diharapkan dengan menggunakan Sortie, orang-orang dapat lebih mudah dalam membaca email yang mereka anggap lebih penting untuk diproses. Setiap email yang diproses oleh Sortie memiliki nama pengirim, waktu, dan subjek email. Sortie memiliki cara kerja yang cukup fleksibel, karena memiliki fitur untuk mengurutkan email sesuai dengan permintaan dari pengguna Sortie. Cara kerja dari Sortie adalah sebagai berikut.

 Pada suatu saat, seorang pengguna Sortie hanya ingin melihat email yang diterimanya pada hari itu, jadi email yang akan diurutkan adalah email-email pada hari yang sama.
 Pengaturan urutan email dilakukan sesuai dengan permintaan pengguna. Ada tiga (3) mekanisme pengurutan email yang dapat dilakukan:

o Nama pengirim. Email dapat diurutkan berdasarkan nama pengirim yang dapat berupa sebuah String nama ataupun String email. Pengurutan berdasarkan nama pengirim email dilakukan berdasarkan abjad.
o Waktu. Email juga dapat diurutkan berdasarkan waktu ketika email diterima oleh pengguna Sortie.
o Subjek Email. Ketika melakukan pengurutan berdasarkan subjek email, maka pengurutan dilakukan berdasarkan abjad.

 Setiap kali melakukan pengurutan, pengguna dapat memberikan prioritas pengurutan yang diinginkan. Misalnya, apabila pengguna memutuskan untuk mengurutkan berdasarkan [nama pengirim, subjek, waktu], maka apabila ada email dari seorang pengirim yang sama, email akan diurutkan berdasarkan subjek, lalu jam.

Format Masukan

Masukan dibaca dari masukan standar. Masukan terdiri dari 2 bagian. Bagian pertama berisi mengenai keterangan prioritas pengurutan email. Bagian kedua berisi data-data email yang masuk di dalam kotak surat pengguna Sortie.

Bagian pertama terdiri dari satu baris string yang terdiri dari tiga buah kata yaitu “[prioritas] [prioritas] [prioritas]”, dimana prioritas menandakan jenis pengurutan yang ingin dilakukan, dan nilai dari ketiganya berbeda, terdiri atas [pengirim], [waktu], dan [subjek]. String menandakan prioritas urutan email yang diinginkan oleh pengguna Sortie.

Bagian kedua berisi data-data email yang masuk ke dalam inbox pengguna Sortie. Bagian ini terdiri dari beberapa baris informasi data-data email yang masuk. Setiap baris terdiri dari tiga bagian yaitu “[pengirim] [waktu] [subyek]”. Data inilah yang nantinya kemudian akan diolah kembali dan akan diurutkan sesuai keinginan pengguna Sortie.

Keterangan:
Dalam mengerjakan tugas ini, Anda sebagai tim pengembang aplikasi Sortie diminta menggunakan metode pengurutan merge sort untuk mengurutkan masukan email untuk Sortie (Anda diharuskan untuk melakukan implementasi merge sort pada masalah ini!). Merge sort diajukan karena memiliki running time yang tidak eksponensial sehingga resource yang digunakan oleh Sortie tidak akan terlalu besar.

Contoh masukan / input:

pengirim waktu subjek
ido@yahuu.com 11:22 laporan penjualan telor ayam
agung@yahuu.com 20:00 astaga!!!
ido@gahoel.com 11:22 saya mau kasih hadiah
mandala@ngemail.com 09:00 minta uang
adi@chanek.com 10:11 penting
agung@yahuu.com 20:03 tolong bantu saya

Contoh keluaran / output:

adi@chanek.com 10:11 penting
agung@yahuu.com 20:00 astaga!!!
agung@yahuu.com 20:03 tolong bantu saya
ido@gahoel.com 11:22 saya mau kasih hadiah
ido@yahuu.com 11:22 laporan penjualan telor ayam
mandala@ngemail.com 09:00 minta uang
Nah, berikut adalah solusi yang bisa kita buat:
import java.util.ArrayList;
import java.util.StringTokenizer;
import java.util.Comparator;
import java.util.Collections;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.BufferedWriter;
import java.io.OutputStreamWriter;
import java.io.IOException;

/**
Class SDA11111 merupakan class utama dalam program ini
*/
public class SDA11111 {
 /**
 * Method main bertipe static void merupakan method utama yang dipanggil untuk menjalankan program
 * Method ini akan menghandle exception yang mungkin terjadi melalui throws IOException
 * @param args yang bertipe array of String
 */
 public static void main(String args[]) throws IOException {
 //tuliskan program anda disini
 InputOutput io = new InputOutput(); // Membuat objek baru bertipe InputOutput bernama io
 io.bacaFile(); // Memanggil method baca File() pada objek io
 io.sort(); // Memanggil method sort() pada objek io
 io.cetakFile(); // Memanggil method cetakFile() pada objek io
 }
 //buatlah method tambahan yang diperlukan disini
}

/**
Class InputOutput merupakan class untuk menerima input, mengolah data, dan menghasilkan output
Class ini mengimplementasi Comparator yang akan digunakan untuk membandingkan email-email yang ada
*/
class InputOutput implements Comparator<Email> {
 ArrayList<Email> arr = new ArrayList<Email>();
 BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
 BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
 String priority1, priority2, priority3;

 /**
 Method bacaFile() bertipe void digunakan untuk melakukan pembacaan file
 */
 public void bacaFile () {
 StringTokenizer input; // Variabel input bertipe StringTokenizer
 try {
 input = new StringTokenizer(br.readLine(), " ");
 priority1 = input.nextToken();
 priority2 = input.nextToken();
 priority3 = input.nextToken();
 while (br.ready()) {
 input = new StringTokenizer(br.readLine(), " ");
 String sender = input.nextToken();
 String clock = input.nextToken();
 String subject = input.nextToken();
 // Jika token lebih dari 3 bagian, akan ditambahkan di Subjek (sesuai soal)
 while (input.hasMoreTokens()) {
 subject += " ";
 subject += input.nextToken();
 }
 arr.add(new Email(sender, new Clock (clock), subject)); //Menambahkan Email baru ke ArrayList arr
 }
 }
 catch (IOException ioe) {}

 }

 /**
 Method sort() bertipe void dan bersifat public untuk melakukan pemanggilan method mergeSort bertipe private
 */
 public void sort () {
 mergeSort(0, arr.size() - 1); // Memanggil method mergeSort
 }

 /**
 * Method mergeSort
 * @param low
 * @param high
 */
 private void mergeSort (int low, int high) {
 if (low < high) {
 // Get the index of the element which is in the middle
 int middle = (low + high) / 2;
 // Sort the left side of the array
 mergeSort(low, middle);
 // Sort the right side of the array
 mergeSort(middle + 1, high);
 // Combine them both
 merge(low, middle, high);
 }
 }

 /**
 * Method merge
 * @param low
 * @param middle
 * @param high
 */
 private void merge (int low, int middle, int high) {
 ArrayList<Email> help = new ArrayList<Email>(arr.size());
 for(Email item: arr) help.add(item);

int i = low;
 int j = middle + 1;
 int k = low;
 // Copy the smallest values from either the left or the right side back
 // to the original array
 while (i <= middle && j <= high) {
 if (compare((help.get(i)), (help.get(j))) <= 0) {
 arr.set(k, help.get(i));
 i++;
 } else {
 arr.set(k, help.get(j));
 j++;
 }
 k++;
 }

 // Copy the rest of the left side of the array into the target array
 while (i <= middle) {
 arr.set(k, help.get(i));
 k++;
 i++;
 }
 help = null;
 }

 /**
 * Method compare merupakan method yang harus dioverride dari Interface Comparator
 * @param email1 bertipe Email
 * @param email2 bertipe Email
 * @return result bertipe int
 */
 public int compare (Email email1, Email email2){
 int result = 0;
 // Jika prioritas yang diinginkan pengguna berupa pengirim waktu subjek
 if ((priority1.startsWith("p")) && (priority2.startsWith("w")) && (priority3.startsWith ("s"))) {
 result = email1.getSender().compareTo(email2.getSender());
 if (result == 0) {
 result = email1.olahClock(email1.getClock()) - email2.olahClock(email2.getClock());
 if (result == 0) {
 result = email1.getSubject().compareTo(email2.getSubject());
 }
 }
 }
 // Jika prioritas yang diinginkan pengguna berupa pengirim subjek waktu
 else if ((priority1.startsWith("p")) && (priority2.startsWith("s")) && (priority3.startsWith ("w"))) {
 result = email1.getSender().compareTo(email2.getSender());
 if (result == 0) {
 result = email1.getSubject().compareTo(email2.getSubject());
 if (result == 0) {
 result = email1.olahClock(email1.getClock()) - email2.olahClock(email2.getClock());
 }
 }
 }
 // Jika prioritas yang diinginkan pengguna berupa subjek pengirim waktu
 else if ((priority1.startsWith("s")) && (priority2.startsWith("p")) && (priority3.startsWith ("w"))) {
 result = email1.getSubject().compareTo(email2.getSubject());
 if (result == 0) {
 result = email1.getSender().compareTo(email2.getSender());
 if (result == 0) {
 result = email1.olahClock(email1.getClock()) - email2.olahClock(email1.getClock());
 }
 }
 }
 // Jika prioritas yang diinginkan pengguna berupa subjek waktu pengirim
 else if ((priority1.startsWith("s")) && (priority2.startsWith("w")) && (priority3.startsWith ("p"))) {
 result = email1.getSubject().compareTo(email2.getSubject());
 if (result == 0) {
 result = email1.olahClock(email1.getClock()) - email2.olahClock(email2.getClock());
 if (result == 0) {
 result = email1.getSender().compareTo(email2.getSender());
 }
 }
 }
 // Jika prioritas yang diinginkan pengguna berupa waktu pengirim subjek
 else if ((priority1.startsWith("w")) && (priority2.startsWith("p")) && (priority3.startsWith ("s"))) {
 result = email1.olahClock(email1.getClock()) - email2.olahClock(email2.getClock());
 if (result == 0) {
 result = email1.getSender().compareTo(email2.getSender());
 if (result == 0) {
 result = email1.getSubject().compareTo(email2.getSubject());
 }
 }
 }
 // Jika prioritas yang diinginkan pengguna berupa waktu subjek pengirim
 else if ((priority1.startsWith("w")) && (priority2.startsWith("s")) && (priority3.startsWith ("p"))) {
 result = email1.olahClock(email1.getClock()) - email2.olahClock(email2.getClock());
 if (result == 0) {
 result = email1.getSubject().compareTo(email2.getSubject());
 if (result == 0) {
 result = email1.getSender().compareTo(email2.getSender());
 }
 }
 }

 return result;
 }
 /** Method cetakFile() untuk mencetak output */
 public void cetakFile () throws IOException{
 for(Email item: arr) {
 bw.write(""+item);
 bw.newLine();
 }
 bw.flush();
 bw.close();
 }

}

/**
Class Email merupakan class representasi dari objek Email
Class ini memiliki field berupa sender, subject, dan clock.
berturut-turut masing-masing field tersebut menandakan informasi mengenai
pengirim dari email, subject dari email, dan waktu dari email
*/
//notes : lakukan perubahan terhadap class ini jika perlu!!
class Email{
 private String sender;
 private String subject;
 private Clock clock;

 Email(String sender, Clock clock, String subject){
 this.sender = sender;
 this.clock = clock;
 this.subject = subject;
 }

 String getSender(){
 return sender;
 }

 void setSender(String sender){
 this.sender = sender;
 }

 String getSubject(){
 return subject;
 }

 void setSubject(String subject){
 this.subject = subject;
 }

 Clock getClock(){
 return clock;
 }

 void setClock(Clock clock){
 this.clock = clock;
 }

 /** Method olahClock digunakan untuk mengolah waktu dalam bentuk menit agar dapat dibandingkan pada untuk melakukan pengurutan
 * @param clock bertipe Clock
 * @return hasil bertipe int
 */
 int olahClock (Clock clock) {
 int hasil = clock.getHour()*60 + clock.getMinute();
 return hasil;
 }

 public String toString(){
 return sender + " " + clock + " " + subject;
 }
}
/**
Class Clock merupakan class representasi dari objek waktu (Clock)
Class ini memiliki field hour dan minute yang menandakan jam dan menit
*/
//notes : lakukan perubahan terhadap class ini jika perlu!!
class Clock{
 private Integer hour;
 private Integer minute;

 Clock(String time){
 StringTokenizer tok = new StringTokenizer(time, ":");
 hour = Integer.parseInt(tok.nextToken());
 minute = Integer.parseInt(tok.nextToken());
 }

 Integer getHour(){
 return hour;
 }

 void setHour(Integer hour){
 this.hour = hour;
 }

 Integer getMinute(){
 return minute;
 }

 void setMinute(Integer minute){
 this.minute = minute;
 }

 public String toString(){
 String out = "";
 if (hour < 10){
 out += "0" + hour;
 } else {
 out += hour;
 }
 out += ":";
 if (minute < 10) {
 out += "0" + minute;
 } else {
 out += minute;
 }
 return out;
 }
}

Algoritma Fibonaci Menggunakan Bahasa C

2 Jun

Kali ini saya akan membahas Algoritma Fibonaci dan tentunya saya ada source code yang dapat kalian coba menggunakan bahasa C. Udah tidak sabar kan?

Okey, langsung ke materi..

Algoritma Fibonaci merupakan deret hitung dengan penulisan seperti berikut:

1 1 2 3 5 8 13 21 34 55 89 dst…

Ada yang bisa melihat polanya? Kalau bagi saya, deret Fibonaci adalah deret hitung yang dimulai dari 1. Tetapi, sebenarnya sebelum angka 1, ada angka bayangan (itu menurut saya :D), yaitu 0 (nol). Mengapa? Ilustrasi di bawah mungkin bisa menjelaskan.

algoritma fibonaci

Selanjutnya, algoritma fibonaci 4

Mau lebih jelas lagi?
algoritma fibonaci 2

Dan sekarang kita masuk ke dalam koding C untuk membuat deret fibonaci, penasaran bagaimana saya membuatnya? Berikut ini adalah kodingnya..

#include
 using namespace std;
 void fibonaci (int n) {
 int num1 = 0, num2 = 1, temp;
 cout << num2 << " ";
 for (int i = 1; i < n; ++i) {
 //temp untuk menyimpan sementara nilai dari num2
 temp = num2;
 //num2 kemudian ditambahkan
 num2 += num1;
 cout << num2 << " ";
 //nilai dari num2 yang sebelumnya di pindahkan ke num1
 num1 = temp;
 }
 cout << "\n";
 }
 void main () {
 int jumlah;
 cout <> jumlah;
 fibonaci (jumlah);
 }

Berdasarkan kode di atas, nilai yang akan dihasilkan adalah deret Fibonaci sesuai dengan jumlah deret yang diminta oleh user. Misalkan, jika deret yang diminta oleh user adalah 2, maka yang tercetak adalah

1   1

Jika user memasukkan 10, maka outputnya akan seperti berikut ini :

algoritma fibonaci 3