Monday, December 20, 2010
Wednesday, December 15, 2010
Monday, November 29, 2010
Monday, November 22, 2010
laporan praktikum instrumentasi minggu 4
laporan tentang program labview error handling, case, formula, dan array serta tugas faktorial
download
pembahasan
READ MORE - laporan praktikum instrumentasi minggu 4
download
pembahasan
Tuesday, November 2, 2010
kumpulan tugas instrumentasi 1 mid semester
kumpulan tugas tentang karakteristik instrumen yang dinamis, contoh error zero drift dan sensitivity drift, dan hasil pengerjaan latihan soal error pada pembacaan suatu rangkaian listrik
download
READ MORE - kumpulan tugas instrumentasi 1 mid semester
download
Monday, October 18, 2010
Wednesday, October 13, 2010
Tugas Praktikum Mikrokontroller Timer
Tugas Praktikum mikrokontroller Timer berupa file proteus dan file bascom dapat didownload
disini
harap digunakan sebagai referensi saja :)
READ MORE - Tugas Praktikum Mikrokontroller Timer
disini
harap digunakan sebagai referensi saja :)
Monday, October 11, 2010
Simulasi Stopwatch Dengan Proteus
Kita dapat membuat stopwatch sederhana dengan menggunakan mikrokontoller AVR. Dalam simulasi ini digunakan mikrokontroller ATMEGA32 dan program dibuat dengan menggunakan BASCOM.
program menggunakan listing sederhana menggunakan interrupt timer0
listing:
'Program Stopwatch
$regfile = "m32def.dat"
$crystal = 12000000
'deklarasi LCD
Config Lcdpin = Pin , Db4 = Portc.5 , Db5 = Portc.4 , Db6 = Portc.3 , Db7 = Portc.2 , E = Portc.6 , Rs = Portc.7
Config Lcd = 16 * 2
Cursor Off
Cls
'Deklarasi variabel
Dim Pengali As Word
Dim Detik_1 As Byte
Dim Detik As Byte
Dim Menit As Byte
Dim Jam As Word
Dim Status As Byte
Dim Status2 As Byte
'konfigurasi timer
Config Timer0 = Timer , Prescale = 256
'setting porta
Ddra = 0
Porta = 255
'pengaktifan interupsi timer
On Ovf0 Int_timer0
'penggantian nama variabel
Pin_reset Alias Pina.2
Pin_on_off Alias Pina.1
Pin_capture Alias Pina.0
'setting nilai awal variabel
Pin_reset = 1
Pin_on_off = 1
Pin_capture = 1
Status = 0
Status2 = 1
'pengaktifan timer0
Enable Timer0
Do
If Pin_capture = 0 Then
Bitwait Pin_capture , Set
Incr Status2
Cls
Locate 1 , 5
Lcd "CAPTURE"
Locate 2 , 4
Lcd Jam ; ":" ; Menit ; ":" ; Detik ; ":" ; Detik_1 ; " " ; Capture1
End If
If Pin_on_off = 0 Then
Bitwait Pin_on_off , Set
Incr Status
End If
If Pin_reset = 0 Then
Pengali = 0
Detik_1 = 0
Detik = 0
Menit = 0
Jam = 0
End If
If Status > 2 Then
Status = 1
End If
If Status2 > 2 Then
Status2 = 1
Cls
End If
If Status = 1 Then Enable Interrupts
If Status = 2 Then Disable Interrupts
If Status2 < 2 Then
Locate 1 , 5
Lcd "STOPWATCH"
Locate 2 , 4
Lcd Jam ; ":" ; Menit ; ":" ; Detik ; ":" ; Detik_1 ; " "
End If
Loop
Int_timer0:
Incr Pengali
If Pengali > 0 Then
Pengali = 0
Incr Detik_1
End If
If Detik_1 > 99 Then
Detik_1 = 0
Incr Detik
End If
If Detik > 59 Then
Detik = 0
Incr Menit
End If
If Menit > 59 Then
Menit = 0
Incr Jam
End If
Return
karena masih pemula dalam pemrograman AVR maka program yang dibuat masih banyak kelemahan diantaranya fungsi start/stop yang masih kurang akurat saat penekanan tombol(telat beberapa milidetik) lalu pada fungsi lap(pause layar) terdapat angka nol yang entah darimana tiba2 muncul di pojok kiri bawah LCD.
bagi para pembaca yang sudah mahir tolong share apa yang kurang dari program diatas :)
Tugas Praktikum Intrumentasi 1 Minggu 2
Tugas Praktikum instrumentasi 1 minggu ke 2 dapat didownload
disini
tugas berupa file vi labview 8.2 beserta file msword
untuk tugas 1 dapat dimodifikasi dengan bilangan random yang berbeda
untuk tugas 2 nilai perhitungan waktu pengulangan sangat variatif(tergantung komputer) jadi nilainya tidak pasti
Harap digunakan sebagai referensi saja :)
READ MORE - Tugas Praktikum Intrumentasi 1 Minggu 2
disini
tugas berupa file vi labview 8.2 beserta file msword
untuk tugas 1 dapat dimodifikasi dengan bilangan random yang berbeda
untuk tugas 2 nilai perhitungan waktu pengulangan sangat variatif(tergantung komputer) jadi nilainya tidak pasti
Harap digunakan sebagai referensi saja :)
Wednesday, October 6, 2010
Tugas Praktikum Mikrokontroller I/O
Tugas Praktikum Mikrokontroller tentang Input Output Mikrokontoller AVR(ATMEGA32) dapat didownload
disini
file berisi program bascom(.bas) dan file hexa(.hex) yang dapat langsung diload ke simulasi proteus(.dsn)
Harap digunakan hanya sebagai referensi :)
READ MORE - Tugas Praktikum Mikrokontroller I/O
disini
file berisi program bascom(.bas) dan file hexa(.hex) yang dapat langsung diload ke simulasi proteus(.dsn)
Harap digunakan hanya sebagai referensi :)
Monday, October 4, 2010
Laporan & Tugas Instrumentasi 1 bab 1
laporan dan tugas praktikum instrumentasi 1 bab 1 tentang contoh sederhana dalam labview
disertai file hasil percobaan dan tugas
download
update pembahasan
download
mohon digunakan sebagai referensi saja jgn cuma copas :)
READ MORE - Laporan & Tugas Instrumentasi 1 bab 1
disertai file hasil percobaan dan tugas
download
update pembahasan
download
mohon digunakan sebagai referensi saja jgn cuma copas :)
Friday, August 27, 2010
Wednesday, June 2, 2010
Laporan Memori (2)
laporan praktikum organisasi dan arsitektur komputer tentang memori 2 dengan IC CMOS 6116
file download
simulasi proteus memori dan ALU adder subtract 2 bit
READ MORE - Laporan Memori (2)
file download
simulasi proteus memori dan ALU adder subtract 2 bit
Tuesday, May 25, 2010
Laporan ISA(Instruction Set Architecture)
Laporan mengenai mikro instruksi dalam level ISA dapat didownload disini
READ MORE - Laporan ISA(Instruction Set Architecture)
Thursday, May 20, 2010
Mikroinstruksi ISA (MIC-1)
Dalam mikro instruksi ini kita dapat memahami prinsip dan cara kerja mikro instruksi pada level arsitektur mikro, dalam sebuah mikroprosesor.
Level arsitektur mikro berada diatas level logika digital, arsitektur ini akan mengimplementasikan level ISA(Instruction Set Architecture). Pada level ISA akan ditemukan kumpulan register yang membentuk memori lokal, serta rangkaian ALU(Aritmethmetic Logic Unit) yang mampu menjalankan operasi-operasi aritmatika sederhana.
Secara umum bentuk dari data flow arsitektur mikro adalah
Untuk mengetahui langkah-langkah dalam ISA dapat digunakan simulasi dengan java platform yaitu mic-1
untuk pemakaiannya:
- Extract file rar
- Atur posisi dari folder mic-1 dan folder JVM pada directory C:
- Buka folder mic-1 dan jalankan simulator-mic1win.exe
- Setelah extrack buka file env.bat dengan notepad
- Edit isi file untuk directorinya seperti berikut:
@echo off
rem
rem env.bat
rem
rem This batch file sets the environment variables necessary for running
rem the mic1 software.
rem 1) comment out the following 4 commands
echo NOTE: YOU NEED TO EDIT THE FILE ENV.BAT BEFORE YOUR mic1
echo SOFTWARE will WORK CORRECTLY.
pause
goto end
rem 2) Set the path to point to the bin directory of the JDK
path c:\JVM\bin;%path%
rem 3) Set the classpath to point to the classes.zip file from the mic1
rem distribution
set CLASSPATH=c:\mic-1\classes.zip
:end
Download mic-1
Java development kit 1.1.8
READ MORE - Mikroinstruksi ISA (MIC-1)
Level arsitektur mikro berada diatas level logika digital, arsitektur ini akan mengimplementasikan level ISA(Instruction Set Architecture). Pada level ISA akan ditemukan kumpulan register yang membentuk memori lokal, serta rangkaian ALU(Aritmethmetic Logic Unit) yang mampu menjalankan operasi-operasi aritmatika sederhana.
Secara umum bentuk dari data flow arsitektur mikro adalah
Untuk mengetahui langkah-langkah dalam ISA dapat digunakan simulasi dengan java platform yaitu mic-1
untuk pemakaiannya:
- Extract file rar
- Atur posisi dari folder mic-1 dan folder JVM pada directory C:
- Buka folder mic-1 dan jalankan simulator-mic1win.exe
- Setelah extrack buka file env.bat dengan notepad
- Edit isi file untuk directorinya seperti berikut:
@echo off
rem
rem env.bat
rem
rem This batch file sets the environment variables necessary for running
rem the mic1 software.
rem 1) comment out the following 4 commands
echo NOTE: YOU NEED TO EDIT THE FILE ENV.BAT BEFORE YOUR mic1
echo SOFTWARE will WORK CORRECTLY.
pause
goto end
rem 2) Set the path to point to the bin directory of the JDK
path c:\JVM\bin;%path%
rem 3) Set the classpath to point to the classes.zip file from the mic1
rem distribution
set CLASSPATH=c:\mic-1\classes.zip
:end
Download mic-1
Java development kit 1.1.8
Sunday, May 16, 2010
Laporan Memori (1)
Laporan Organisasi dan Arsitektur Komputer tentang memori (1)
download
READ MORE - Laporan Memori (1)
download
Monday, May 10, 2010
Know your Self To Get What you Want
Emotion is created by motion
– anthony robbius
Emosi yang ada pada manusia dan tergambarkan dalam perilaku sehari-hari merupakan hasil dari aktivitas yang dilakukan. Dan untuk mengendalikan dan mengatur emosi maka kita juga perlu untuk mengatur dan mengendalikan aktivitas sehari-hari agar dapat membuat emosi yang positif.
Your outer world is the reflection of your inner world
– joe vitule
– joe vitule
Sesuatu yang terlihat dari seseorang(perilaku, sikap, sifat) adalah cerminan pribadi diri yang telah terbentuk akibat aktivitas dan informasi yang telah masuk ke dalam pikiran.
Cara kerja pikiran manusia
RAS(reticular activating system) adalah filter dari informasi yang masuk ke pikiran sehingga tidak semua informasi masuk begitu saja ke dalam pikiran.
Pikiran manusia mampu memilah informasi yang masuk memalui filter yaitu moral dan kesadaran diri. Sehingga tidak semua informasi dapat masuk begitu saja ke dalam otak, sehingga kadang kita begitu mudahnya melupakan suatu hal. Selain itu pikiran memiliki kapasitas memori bawah sadar yang lebih besar dibandingkan memori sadar. Sering kali kita belajar untuk melakukan sesuatu dengan menggunakan pikiran sadar kita namun amat mudah untuk terlupakan. Namun begitu informasi tentang apa yang kita pelajari itu masuk ke dalam memori pikiran bawah sadar kita maka informasi itu akan tersimpan dan kita tanpa sadar dapat menggunakan informasi itu begitu saja tanpa perlu berpikir terlebih dahulu. Contoh saat belajar mengendarai motor/ mobil akan sangat sulit tapi begitu bisa maka akan sangat mudah dilakukan.
The most important part of your prayer is what you fell not is what you say
–pence pillgrim
Saat berdoa dan menginginkan sesuatu kita harus benar-benar menginginkannya dan bersungguh-sungguh disertai perasaan yang kuat sehingga akan menimbulkan semangat untuk dapat benar-benar mendapatkan apa yang kita ingikan
Fokus pada solusi bukan fokus pada masalah
Untuk dapat menyelesaikan suatu permasalahan yang terjai haruslah fokus pada solusi bukan pada masalah. Pikirkan bagaimana mengatasi masalah bukannya berpikir masalah yang semakin berlarut-larut dan akan menjerumuskan diri.
The law of attract = like attract like
Dalam kehidupan manusia berlaku hukum diatas dimana sesuatu yang sama akan cenderung bersama-sama atau menarik yang sama untuk berkumpul dan berinteraksi.
FEAR = False Evidence Appear Real
Khawatir terhadap sesuatu yang tidak terjadi(tidak nyata). Khawatir seperti ini hendaknya dihilangkan agar dapat berpikir cerah untuk masa depan tanpa menghawatirkan sesuatu yang tidak nyata/ hanya kekhawatiran semata. Orang akan berhasil jika mampu dan berani mengalahkan ketakutan dan kekhawatiran dalam dirinya.
Untuk mencapai tujuan/ keinginan
Do'a + yakin
Do'a disertai usaha(inspire action), ikhlas, dan tawakal
Yakin yaitu tenang, sabar, fokus, dan bersyukur
Source : kuliah kewirausahaan
Monday, May 3, 2010
IMPROVING QUICKSORT(HOURS 14)
Quicksort emang dapat mengurutkan data dengan cepat namun quicksort akan kurang efisien jika dihadapkan pada data yang ter-invers(terbalik) ataupun dengan data yang jumlahnya sedikit, karena itu diperlukan peningkatan kinerja dari quicksort agar dapat menangani masalah tersebut serta mempercepat kinerja quicksort.
Data terbalikMasalah pada data terbalik adalah pada pivot. Pada bab sebelumnya pivot yang dipilih adalah indeks terbesar dari array data, masalah ini dapat ditangani dengan memilih pivot pada median(tengah) data. Sehingga diperoleh 2 bagian yang lebih mudah dalam pembagian selanjutnya.
Median-of-Three Partitioning - Pilih nilai indeks awal, tengah, dan akhir
- Urutkan ketiga nilai tersebut
- Pilih median dari 3 nilai tersebut sebagai pivot
- Lakukan quicksort
//quickSort2.cpp
//demonstrates quick sort with median-of-three partitioning
#include <iostream>
#include <vector>
#include <cstdlib> //for random numbers
#include <ctime> //for random numbers
using namespace std;
////////////////////////////////////////////////////////////////
class ArrayIns
{
private:
vector<double>(theVect); //vector of doubles
int nElems; //number of data items
public:
//--------------------------------------------------------------
ArrayIns(int max) : nElems(0) //constructor
{
theVect.resize(max); //size the vector
}
//--------------------------------------------------------------
void insert(double value) //put element into array
{
theVect[nElems] = value; //insert it
nElems++; //increment size
}
//--------------------------------------------------------------
void display() //displays array contents
{
cout << "A=";
for(int j=0; j<nElems; j++) //for each element,
cout << theVect[j] << " "; //display it
cout << endl;
}
//--------------------------------------------------------------
void quickSort() //sort array
{
recQuickSort(0, nElems-1); //call recursive sort
}
//--------------------------------------------------------------
void recQuickSort(int left, int right) //recursive sort
{
int size = right-left+1;
if(size <= 3) //manual sort if smallmanualSort(left, right);
else //quicksort if large
{
double median = medianOf3(left, right);
int partition = partitionIt(left, right, median);
recQuickSort(left, partition-1);
recQuickSort(partition+1, right);
}
} //end recQuickSort()
//--------------------------------------------------------------
double medianOf3(int left, int right)
{
int center = (left+right)/2;
//order left & center
if( theVect[left] > theVect[center] )
swap(left, center);
//order left & right
if( theVect[left] > theVect[right] )
swap(left, right);
//order center & right
if( theVect[center] > theVect[right] )
swap(center, right);
swap(center, right-1); //put pivot on right
return theVect[right-1]; //return median value
} //end medianOf3()
//--------------------------------------------------------------
void swap(int dex1, int dex2) //swap two elements
{
double temp = theVect[dex1]; //A into temp
theVect[dex1] = theVect[dex2]; //B into A
theVect[dex2] = temp; //temp into B
} //end swap(
//--------------------------------------------------------------
//partition a range
int partitionIt(int left, int right, double pivot)
{
int leftMark = left; //right of first elem
int rightMark = right - 1; //left of pivot
while(true)
{
while( theVect[++leftMark] < pivot ) //find bigger
; // (nop)
while( theVect[--rightMark] > pivot ) //find smaller
; // (nop)
if(leftMark >= rightMark) //if pointers cross, break; // partition done
else //not crossed, so
swap(leftMark, rightMark); //swap elements
} //end while(true)
swap(leftMark, right-1); //restore pivot
return leftMark; //return pivot location
} //end partitionIt()
//--------------------------------------------------------------
void manualSort(int left, int right)
{
int size = right-left+1;
if(size <= 1)
return; //no sort necessary
if(size == 2)
if( theVect[left] > theVect[right] )
swap(left, right);
return;
}
else //size==3, so 3-sort left, center (right-1) & right
{
if( theVect[left] > theVect[right-1] )
swap(left, right-1); //left, center
if( theVect[left] > theVect[right] )
swap(left, right); //left, right
if( theVect[right-1] > theVect[right] )
swap(right-1, right); //center, right
}
} //end manualSort()
//--------------------------------------------------------------
}; //end class ArrayIns
////////////////////////////////////////////////////////////////
int main()
{
time_t aTime;
int maxSize = 16; //array size
ArrayIns arr(maxSize); //create the array
srand( static_cast<unsigned>(time(&aTime)) ); //seed randoms
for(int j=0; j<maxSize; j++) //fill array with
{ //random numbers
double n = rand() % 99;
arr.insert(n);
}
arr.display(); //display items
arr.quickSort(); //quicksort them
arr.display(); //display them again
return 0;
} //end main()
Algoritma quicksort standar tidak dapat bekerja mengurutkan bagian dengan 3 data atau lebih sedikit dari itu. Dalam hal ini jumlah tersebut disebut dengan cutoff point
Menggunakan insertion sort untuk bagian data yang kecil
Insertion sort dapat dipakai untuk menangani bagian data yang kecil dimana insertion sort akan dipakai saat bertemu dengan cutoff point.
- Insertion sort dilakukan sebagai bagian dari quicksort setelah mencapai data sedikit(cutoff point)
- Metode:
- Quicksort dilanjutkan insertion sort untuk data sedikit
- Quicksort kemudian sort dihentikan untuk data sedikit( mencapai cutoff point). Lalu dilakukan insertion sort secara keseluruhan
//quickSort3.cpp
//demonstrates quick sort; uses insertion sort for cleanup
#include <iostream>
#include <vector>
#include <cstdlib> //for rand()
#include <ctime> //for rand()
using namespace std;
////////////////////////////////////////////////////////////////
class ArrayIns
{
private:
vector<double> theArray; //array theArray
int nElems; //number of data items
public:
//--------------------------------------------------------------
ArrayIns(int max) //constructor
{
theArray.reserve(max); //change size of vector
nElems = 0; //no items yet
}
//--------------------------------------------------------------
void insert(double value) //put element into array
{
theArray[nElems] = value; //insert it
nElems++; //increment size
}
//--------------------------------------------------------------
void display() //displays array contents
{
cout << "A=";
for(int j=0; j<nElems; j++) //for each element,
cout << theArray[j] << " "; //display it
cout << endl;
}
//--------------------------------------------------------------
void quickSort() //sort the array
{
recQuickSort(0, nElems-1);
// insertionSort(0, nElems-1); //(another option)
}
//--------------------------------------------------------------
void recQuickSort(int left, int right) //recursive quicksort
{
int size = right-left+1;
if(size < 10) //insertion sort if small
insertionSort(left, right);
else //quicksort if large
{
double median = medianOf3(left, right);
int partition = partitionIt(left, right, median);
recQuickSort(left, partition-1);
recQuickSort(partition+1, right);
}
} //end recQuickSort()
//--------------------------------------------------------------
double medianOf3(int left, int right)
{
int center = (left+right)/2;
//order left & center
if( theArray[left] > theArray[center] )
swap(left, center);
//order left & right
if( theArray[left] > theArray[right] )
swap(left, right);
//order center & right
if( theArray[center] > theArray[right] )
swap(center, right);
swap(center, right-1); //put pivot on right
return theArray[right-1]; //return median value
} //end medianOf3()
//--------------------------------------------------------------
void swap(int dex1, int dex2) //swap two elements
{
double temp = theArray[dex1]; //A into temp
theArray[dex1] = theArray[dex2]; //B into A
theArray[dex2] = temp; //temp into B
} //end swap(
//--------------------------------------------------------------
int partitionIt(int left, int right, double pivot)
{
int leftMark = left; //right of first elem
int rightMark = right - 1; //left of pivot
while(true)
{
while( theArray[++leftMark] < pivot ) //find bigger
; // (nop)
while( theArray[--rightMark] > pivot ) //find smaller; // (nop)
if(leftMark >= rightMark) //if pointers cross,
break; // partition done
else //not crossed, so
swap(leftMark, rightMark); //swap elements
} //end while(true)
swap(leftMark, right-1); //restore pivot
return leftMark; //return pivot location
} //end partitionIt()
//--------------------------------------------------------------
void insertionSort(int left, int right) //insertion sort
{
int in, out;
//sorted on left of out
for(out=left+1; out<=right; out++)
{
double temp = theArray[out]; //remove marked item
in = out; //start shifts at out
//until one is smaller,
while(in>left && theArray[in-1] >= temp)
{
theArray[in] = theArray[in-1]; //shift item to right
--in; //go left one position
}
theArray[in] = temp; //insert marked item
} //end for
} //end insertionSort()
//--------------------------------------------------------------
}; //end class ArrayIns
////////////////////////////////////////////////////////////////
int main()
{
int maxSize = 16; //array size
ArrayIns arr(maxSize); //create array
time_t aTime; //seed random numbers
srand(static_cast<unsigned>( time(&aTime) ));
for(int j=0; j<maxSize; j++) //fill array with
{ //random numbers
double n = rand() % 99;
arr.insert(n);
}
arr.display(); //display items
arr.quickSort(); //quicksort them
arr.display(); //display them again
return 0;
} //end main()
Sumber : Kuliah Logika dan Pemrograman Sistem II
QUICKSORT (HOURS13)
Pada bab sebelumnya telah dibahas mergesort dimana dapat mengurutkan dengan cepat namun memerlukan ruang lebih banyak untuk melakukan pengkopian array-array yang akan diurutkan. Sehingga memerlukan banyak memori. Sementara quicksort sama cepat dengan mergesort hanya keunggulannya memerlukan sedikit memori.
Inti dari quicksort- data dibagi 2 bagian dengan 1 titik bagi
- mengulangi pembagian pada masing masing bagian
- bagi data menjadi 2 dengan jumlah sama
- urutkan masing-masing bagian
- lakukan penggabungan(merge)
quicksort bekerja dengan membagi data menjadi bagian-bagian(partition) dan proses ini dilakukan berulang-ulang pada masing-masing bagian. Untuk melakukan partition dimulai dengan memilih titik/nilai acuan(pivot) untuk kemudian membandingkan data dengan pivot tersebut sehingga diperoleh 2 bagian data yaitu data yang lebih besar dari pivot dan data yang lebih kecil dari pivot.
Setelah didapat 2 bagian seperti pada gambar diatas maka masing-masing bagian akan dibagi lagi dengan menentukan pivot pada masing masing bagian sehingga data akan terurut.
- tentukan pivot sebagai index bagain terbesar
- Ki(data bagian terkiri) digeser ke kanan sampai ki > pivot
- Ka(data bagian terkanan) digeser ke kiri sampai ka < pivot
- Jika ka > ki maka nilai di ka dan ki ditukar
- pivot array 70, data dibandingkan
- diambil bagian kiri pivot 50, data dibandingkan
- diambil pivot 40, data dibandingkan
- diambil pivot 20, data dibandingkan
- diambil bagian kanan
- diambil pivot 110, data dibandingkan
- diambil pivot 100, data dibandingkan
- diambil pivot 80, data dibandingkan
- didapatkan array yang terurut
//quickSort1.cpp
//demonstrates simple version of quick sort
#include <iostream>
#include<vector>
#include<cstdlib> //for random numbers
#include<ctime> //for random numbers
using namespace std;
////////////////////////////////////////////////////////////////
class ArrayIns
{
private:
vector<double>(theVect); //vector of doubles
int nElems; //number of data items
public:
//--------------------------------------------------------------
ArrayIns(int max) : nElems(0) //constructor
{
theVect.resize(max); //size the vector
}
//--------------------------------------------------------------
void insert(double value) //put element into array
{
theVect[nElems] = value; //insert it
nElems++; //increment size
}
//--------------------------------------------------------------
void display() //displays array contents
{
cout << "A=";
for(int j=0; j<nElems; j++) //for each element,
cout << theVect[j] << " "; //display it
cout << endl;
}
//--------------------------------------------------------------
void quickSort() //sort array
{
recQuickSort(0, nElems-1); //call recursive sort
}
//-------------------------------------------------------------- void
recQuickSort(int left, int right) //recursive sort
{
if(right-left <= 0) //if size <= 1, return; // already sorted
else //size is 2 or larger
{
double pivot = theVect[right]; //rightmost item
//partition range
int partition = partitionIt(left, right, pivot);
recQuickSort(left, partition-1); //sort left side
recQuickSort(partition+1, right); //sort right side
}
} //end recQuickSort()
//--------------------------------------------------------------
int partitionIt(int left, int right, double pivot)
{
int leftMark = left-1; //left (after ++)
int rightMark = right; //right-1 (after --)
while(true)
{ //find bigger item
while( theVect[++leftMark] < pivot )
; // (nop)
//find smaller item
while(rightMark > 0 && theVect[--rightMark] > pivot)
; // (nop)
if(leftMark >= rightMark) //if pointers cross,
break; // partition done
else //not crossed, so
swap(leftMark, rightMark); // swap elements
} //end while(true)
swap(leftMark, right); //restore pivot
return leftMark; //return pivot location
} //end partitionIt()
//--------------------------------------------------------------
void swap(int dex1, int dex2) //swap two elements
{
double temp = theVect[dex1]; //A into temp
theVect[dex1] = theVect[dex2]; //B into A
theVect[dex2] = temp; //temp into B
} //end swap(
//--------------------------------------------------------------
}; //end class ArrayIns
////////////////////////////////////////////////////////////////
int main()
{
time_t aTime;
int maxSize = 16; //array size
ArrayIns arr(maxSize); //create array
srand( static_cast<unsigned>(time(&aTime)) ); //seed randoms
for(int j=0; j<maxSize; j++) //fill array with{ //random numbers
double n = rand() % 99;
arr.insert(n);
}
arr.display(); //display items
arr.quickSort(); //quicksort them
arr.display(); //display them again
return 0;
} //end main()
Output
A=69 0 70 6 38 38 24 56 44 26 73 77 30 45 97 65
A=0 6 24 26 30 38 38 44 45 56 65 69 70 73 77 97
sumber : Kuliah Logika dan Pemrograman Sistem II
Applied Recursion(Hours 12) part 2
Mergesort
Teknik pengurutan mergesort lebih cepat dan efisien dibandingkan dengan bubble sort dan insertion sort. Insertion sort dan bubble sort memerlukan waktu O(N2) sedangkan mergesort memerlukan waktu O(N*logN). Sebagai contoh jika N adalah 10.000 data yang diurutkan maka N2 adalah 100.000.000 sementara N*logN hanya 40.000. jika sorting data ini memerlukan waktu 40 detik dengan mergesort maka dengan insertion sort akan memerlukan waktu hampir 28 jam.
Penggabungan 2 array
Inti dari mergesort adalah menggabungkan 2 buah array yang telah terurut dimana array A dan B akan digabungkan menjadi array C dengan data yang telah terurut
Langkah-langkah mergesort
Langkah ke 9 dan ke 10 kosong karena array B telah habis untuk dibandingkan dengan array A. Maka setelahnya sisa array A hanya langsung dipindah ke array C.
Listing mergesort
//merge.cpp
//demonstrates merging two arrays into a third
#include <iostream>
using namespace std;
//––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
void merge( int[], int, int[], int, int[] );
void display(int[], int); //prototypes
//––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
int main()
{
int arrayA[] = {23, 47, 81, 95}; //source A
int arrayB[] = {7, 14, 39, 55, 62, 74}; //source B
int arrayC[10]; //destination
merge(arrayA, 4, arrayB, 6, arrayC); //merge A+B––>C
display(arrayC, 10); //display result
return 0;
} //end main()
//––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
void merge( int arrayA[], int sizeA, //merge A and B into C
int arrayB[], int sizeB,
int arrayC[] )
{
int aDex=0, bDex=0, cDex=0;
while(aDex < sizeA && bDex < sizeB) //neither array empty
if( arrayA[aDex] < arrayB[bDex] )
arrayC[cDex++] = arrayA[aDex++];
else
arrayC[cDex++] = arrayB[bDex++];
while(aDex < sizeA) //arrayB is empty,
arrayC[cDex++] = arrayA[aDex++]; //but arrayA isn't
while(bDex < sizeB) //arrayA is empty,
arrayC[cDex++] = arrayB[bDex++]; //but arrayB isn't
} //end merge()
//––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-
void display(int theArray[], int size) //display array
{
for(int j=0; j<size; j++)
cout << theArray[j] << " ";
cout << endl;
}
Output
7 14 23 39 47 55 62 74 81 95
Sorting dengan penggabungan
Ide dari mergesort adalah membagi array menjadi 2 bagian, kemudian tiap bagian diurutkan lalu dilakukan merge atau penggabungan sehingga didapatkan array terurut
Pada gambar diatas array dibagi menjadi masing-masing 2 bagian untuk kemudian urutkan dan digabungkan menjadi 4 bagian kemudian array terurut 4 bagian tersebut digabungkan kembali menjadi array yang terurut. dengan kata lain cara diatas adalah menggunakan pembagian kelipatan 2 yaitu dengan urutan 2,4,8,...dst hingga pada akhirnya array akhir terurut dengan N data.
Program mergesort dengan rekursif
//mergeSort.cpp
//demonstrates recursive merge sort
#include <iostream>
#include <vector>
using namespace std;
////////////////////////////////////////////////////////////////
class DArray
{
private:
vector<double>(theVect); //vector of doubles
int nElems; //number of data items
void recMergeSort(vector<double>, int, int);
void merge(vector<double>, int, int, int);
public:
//––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
DArray(int max) : nElems(0) //constructor
{
theVect.resize(max); //size vector
}
//––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
void insert(double value) //put element into array
{
theVect[nElems] = value; //insert it
nElems++; //increment size
}
//––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
void display() //displays array contents
{
for(int j=0; j<nElems; j++) //for each element,
cout << theVect[j] << " "; //display it
cout << endl;
}
//––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
void mergeSort() //called by main()
{ //provides workspace
vector<double>(workSpace);
workSpace.resize(nElems);
recMergeSort(workSpace, 0, nElems-1);
}
}; //end class DArray
//––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
void DArray::recMergeSort(vector<double> workSpace,
int lowerBound, int upperBound)
{
if(lowerBound == upperBound) //if range is 1,
return; //no use sorting
else
{ //find midpoint
int mid = (lowerBound+upperBound) / 2;
//sort low half
recMergeSort(workSpace, lowerBound, mid);
//sort high half
recMergeSort(workSpace, mid+1, upperBound);
//merge them
merge(workSpace, lowerBound, mid+1, upperBound);
} //end else
} //end recMergeSort()
//––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
void DArray::merge(vector<double> workSpace, int lowPtr,
int highPtr, int upperBound)
{
int j = 0; //workspace index
int lowerBound = lowPtr;
int mid = highPtr-1;
int n = upperBound-lowerBound+1; //# of items
while(lowPtr <= mid && highPtr <= upperBound)
if( theVect[lowPtr] < theVect[highPtr] )
workSpace[j++] = theVect[lowPtr++];
else
workSpace[j++] = theVect[highPtr++];
while(lowPtr <= mid)
workSpace[j++] = theVect[lowPtr++];
while(highPtr <= upperBound)
workSpace[j++] = theVect[highPtr++];
for(j=0; j<n; j++)
theVect[lowerBound+j] = workSpace[j];
} //end merge()
////////////////////////////////////////////////////////////////
int main()
{
const int maxSize = 100; //array size
DArray arr(maxSize); //create "array"
arr.insert(64); //insert items
arr.insert(21);
arr.insert(33);
arr.insert(70);
arr.insert(12);
arr.insert(85);
arr.insert(44);
arr.insert(3);
arr.insert(99);
arr.insert(0);
arr.insert(108);
arr.insert(36);
arr.display(); //display items
arr.mergeSort(); //merge-sort the array
arr.display(); //display items again
return 0;
} //end main()
Output
64 21 33 70 12 85 44 3 99 0 108 36
0 3 12 21 33 36 44 64 70 85 99 108
Jumlah operasi yang dilakukan jika N adalah kelipatan dari 2
Jumlah maksimum dan minimum pembandingan jika digunakan array yang sudah terurut dan array yang tidak terurut dalam mergesort
sumber : Kuliah Logika dan Pemrograman Sistem II
Sunday, May 2, 2010
Applied Recursion(Hours 12) part 1
Pemakaian rekursi pada bab ini ada 2 macam yaitu
Urutan pemindahan disk
jumlah langkah = 2n-1
dengan n adalah jumlah piringan disk
implementasi dalam pemrograman C++
//towers.cpp
//solves Towers of Hanoi puzzle
#include <iostream>
using namespace std;
void doTowers(int, char, char, char); //prototype
//––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
int main()
{
int nDisks; //number of disks
cout << "Enter number of disks: "; //get # of disks
cin >> nDisks;
doTowers(nDisks, 'A', 'B', 'C'); //solve it
return 0;
}
//––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
void doTowers(int topN, char src, char inter, char dest)
{
if(topN==1) //display
cout << "Disk 1 from " << src << " to " << dest << endl;
else
{
doTowers(topN-1, src, dest, inter); //src to inter
cout << "Disk " << topN //display
<< " from " << src << " to " << dest << endl;
doTowers(topN-1, inter, src, dest); //inter to dest
}
}
Output
Enter (3 disks): s=A, i=B, d=C
Enter (2 disks): s=A, i=C, d=B
Enter (1 disk): s=A, i=B, d=C
Base case: move disk 1 from A to C
Return (1 disk)
Move bottom disk 2 from A to B
Enter (1 disk): s=C, i=A, d=B
Base case: move disk 1 from C to B
Return (1 disk)
Return (2 disks)
Move bottom disk 3 from A to C
Enter (2 disks): s=B, i=A, d=C
Enter (1 disk): s=B, i=C, d=A
Base case: move disk 1 from B to A
Return (1 disk)
Move bottom disk 2 from B to C
Enter (1 disk): s=A, i=B, d=C
Base case: move disk 1 from A to C
Return (1 disk)
Return (2 disks)
Return (3 disks)
Disk 1 from A to C
Disk 2 from A to B
Disk 1 from C to B
Disk 3 from A to C
Disk 1 from B to A
Disk 2 from B to C
Disk 1 from A to C
Berlanjut ke part 2
sumber : Kuliah Logika dan Pemrograman Sistem II
READ MORE - Applied Recursion(Hours 12) part 1
- The Towers of Hanoi puzzle
- Mergesort
Adalah sebuah puzze kuno dimana terdiri dari piringan silinder(disk) yang berbeda diameter yang disusun menjadi piramid dalam 1 kolom. Diharuskan untuk memindahkan kolom disk ke kolom lain dengan syarat bahwa disk yang lebih besar tidak boleh berada diatas disk yang lebih kecil. Pada gambar ditunjukkan semua disk berawal dari kolom A. Diharuskan memindahkan semua disk ke kolom C. Hanya 1 disk yang dapat di pindah dalam 1 waktu dan tidak boleh ada menempatkan disk yang lebih besar diatas disk yang lebih kecil.
Langkah untuk menyelesaikan puzzle ini adalahUrutan pemindahan disk
- Disk 1: A ke B
- Disk 2: A ke C
- Disk 1: B ke C
- Disk 3: A ke B
- Disk 1: C ke A
- Disk 2: C ke B
- Disk 1: A ke B
- Disk 4: A ke C
- Disk 1: B ke C
- Disk 2: B ke A
- Disk 1: C ke A
- Disk 3: B ke C
- Disk 1: A ke B
- Disk 2: A ke C
- Disk 1: B ke C
Setelah diketahui untuk memindahkan 4 disk diperlukan 15 langkah maka untuk memindahkan 5 disk dapat dilakukan seperti pada gambar diatas yaitu dengan memindahkan 4 disk ke kolom B(15 langkah) lalu memindahkan disk terbesar(disk ke 5) ke kolom C (1 langkah) lalu memindahkan 4 disk dari kolom B ke kolom C(15 langkah). Jadi untuk memindahkan 5 disk dari kolom A ke kolom C diperlukan 15+1+15 = 31 langkah
rumus umum jumlah langkah yang diperlukan untuk menyelesaikan puzzle ini adalahjumlah langkah = 2n-1
dengan n adalah jumlah piringan disk
implementasi dalam pemrograman C++
//towers.cpp
//solves Towers of Hanoi puzzle
#include <iostream>
using namespace std;
void doTowers(int, char, char, char); //prototype
//––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
int main()
{
int nDisks; //number of disks
cout << "Enter number of disks: "; //get # of disks
cin >> nDisks;
doTowers(nDisks, 'A', 'B', 'C'); //solve it
return 0;
}
//––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
void doTowers(int topN, char src, char inter, char dest)
{
if(topN==1) //display
cout << "Disk 1 from " << src << " to " << dest << endl;
else
{
doTowers(topN-1, src, dest, inter); //src to inter
cout << "Disk " << topN //display
<< " from " << src << " to " << dest << endl;
doTowers(topN-1, inter, src, dest); //inter to dest
}
}
Output
Enter (3 disks): s=A, i=B, d=C
Enter (2 disks): s=A, i=C, d=B
Enter (1 disk): s=A, i=B, d=C
Base case: move disk 1 from A to C
Return (1 disk)
Move bottom disk 2 from A to B
Enter (1 disk): s=C, i=A, d=B
Base case: move disk 1 from C to B
Return (1 disk)
Return (2 disks)
Move bottom disk 3 from A to C
Enter (2 disks): s=B, i=A, d=C
Enter (1 disk): s=B, i=C, d=A
Base case: move disk 1 from B to A
Return (1 disk)
Move bottom disk 2 from B to C
Enter (1 disk): s=A, i=B, d=C
Base case: move disk 1 from A to C
Return (1 disk)
Return (2 disks)
Return (3 disks)
Disk 1 from A to C
Disk 2 from A to B
Disk 1 from C to B
Disk 3 from A to C
Disk 1 from B to A
Disk 2 from B to C
Disk 1 from A to C
Berlanjut ke part 2
sumber : Kuliah Logika dan Pemrograman Sistem II
Friday, April 30, 2010
CARA KERJA ALU 1 BIT
ALU(Arithmetic and Logic Unit) adalah sebuah kumpulan gerbang logika yang disatukan untuk dapat mengerjakan beberapa fungsi tertentu tergantung kontrol yang diberikan. Artinya ALU dapat mengerjakan berbagai jenis fungsi sekaligus dengan memilih jenis fungsi mana yang akan dilakukan pada ALU tersebut. Contohnya adalah ALU 1 bit yang dapat mengerjakan fungsi logika(AND, OR, NOT) dan fungsi Full Adder sekaligus. ALU ini menggunakan Gerbang logika untuk operasinya yaitu AND, OR, dan NOT, serta sebuah IC Full Adder(7483). Untuk melakukan kontrol digunakan multiplexer 4 to 1 dengan 2 selector.
Seperti terlihat pada rangkaian diatas, A, B, dan Cin adalah input data utama yang berhubungan langsung dengan 4 operasi dasar yang dapat dilakukan ALU tersebut. Kemudian output dari operasi- operasi dasar itu dimasukkan ke input dari multiplexer 4 to 1. Seperti yang kita ketahui multiplexer hanya akan mengeluarkan 1 output tergantung dari nilai selectornya. Karena itulah F0, dan F1 digunakan sebagai selector pada multiplexer sehingga selector ini dapat berfungsi sebagai kontrol operasi terhadap ALU tersebut.
Selector (F0,F1) bernilai 00 untuk operasi Not dengan input A sehingga B dan Cin tidak berpengaruh pada output
Selector (F0,F1) bernilai 01 untuk operasi OR dengan input A dan B sehingga Cin tidak berpengaruh pada output
Selector (F0,F1) bernilai 10 untuk operasi AND dengan input A dan B sehingga Cin tidak berpengaruh pada output
Selector (F0,F1) bernilai 11 untuk operasi Full Adder dengan input A, B dan Cin dengan output hasil Q dan output tambahan Cout.
Tabel Hasil Output
Khusus untuk full adder dibutuhkan output tambahan yaitu Cout. Cout hanya digunakan saat fungsi Full adder yang dipilih karena itu digunakan gerbang AND untuk membuat output Cout bernilai 0(tidak berfungsi) saat mengerjakan fungsi yang bukan Full adder. Selector digabungkan dengan gerbang AND sehingga hanya akan bernilai 1 saat mengerjakan fungsi full adder(F0,F1 = 11)dan hasil output selector ini di masukkan gerbang AND lagi bersama dengan output dari IC Full Adder(7483).
ALU yang telah dibahas adalah ALU 1 bit karena outputnya hanya 1 bit saja meskipun ada nilai Cout. Untuk ALU yang lebih dari 1 bit misal ALU 4 bit dapat dirancang sedemikian rupa sehingga dapat mengerjakan fungsi lain misal subtractor. ALU semacam ini menggunakan prinsip detak(Clock) seperti pada register. Tentang ALU 4 bit dan selanjutnya akan dibahas di lain waktu. Semoga bermanfaat :)
Sumber: praktikum organisasi dan arsitektur komputer
Thursday, April 29, 2010
Program Searching Data
Program untuk serching data dengan metode biner dan sequensial. dibuat dengan delphi 7
source codenya dapat didownload disini
READ MORE - Program Searching Data
source codenya dapat didownload disini
Tuesday, April 27, 2010
14 RAHASIA USAHA
- Penuhi kebutuhan konsumen
- Kenali kebutuhan konsumen
- Penuhi kebutuhan tersebut dengan harga, kualitas produk, dan pelayanan yang lebih baik
- Product centric = membuat banyak produk sekaligus berdasarkan analisa pasar
- Costumer centric = membuat produk hanya saat ada pesanan dari konsumen
- Jual keunikan(ultimate advantage)
- Produk Kreatif dan inovatif
- Penemuan jenis produk, teknologi, sistem, dan program baru
- Jangan ragu mematenkan penemuan baru
- Penemuan baru yang memiliki ultimate advantage sangat berpeluang menembus pasar
- Duplikasi usaha lain
- Terkadang ide usaha tersebar dimana-mana
- Perlu membaca peluang, mengukur potensi dan berani mengambil resiko
- Plus memberikan nilai tambah(harga, pelayanan, kecepatan, keramahan)
- Beri fasilitas tambahan
- Agar unggul produk dapat diubah dan atau ditambah
- Kuncinya dalah keunggulan produk dibanding yang lain
- Jual ketrampilan
- Jeli dengan bakat yang dimiliki orang
- Manfaatkan orang berbakat pada hal yang dapat dijadikan nilai jual
- Jadi agen
- membuka keagenan atau biro jasa
- Perlu pengalaman dan relasi
- Dapat ditangani sendiri atau mempekerjakan orang berbakat
- Jual barang second
- Barang memiliki nilai historis
- Barang memiliki merk asli dan bagus
- Barang memiliki harga yang spesial
- Barang milik orang terkenal
- Tidak akan kekurangan barang
- Buka kantor
- Coba merintis kantor sendiri, ajak kolega atau teman seprofesi untuk patungan modal
- Jual skill dan pengalaman anda, reputasi dan relasi akan mempengaruhi jumlah klien
- Jalankan DS/MLM
- Bisnis prospektif
- Direst selling(DS) dan multi-level marketing(MLM) sering juga disebut personal franchise
- Modal relatif murah
- Didukung produk yang bagus
- Memiliki sistem pendukung pemasaran
- Ada pelatihan dan seminar
- Jenjang karier
- Kesempatan untuk mendirikan perseroan sendiri(authorized distributor)
- Hindari bisnis skema piramid atau money game berkedok MLM
- Beli waralaba
- Modal lumayan besar tapi bagus untuk yang tak mau repot memikirkan jenis usaha baru
- Waralaba usahanya relatif terstandarisasi
- Jeli memilih waralaba yang bagus dan berpotensi
- Banyak pilihan waralaba dengan modal besar atau yang sedang-sedang saja
- Beli usaha prospektif
- Punya keunikan dan SDM bagus
- Prospeknya cerah
- Beli usaha sekarat
- Usaha sekarat karena manajemen yang amburadul
- Jeli dalam merekayasa ulang usaha dengan strategi yang tepat
- Biaya pemolesan(pemulihan) harus dikontrol
- Dapat dibeli dengan harga murah
- Buka lokasi
- Usaha cepat berkembang karena faktor lokasi
- Daerah perumahan akan memicu perkembangan ekonomi
- Usaha bersama
- Melakukan kerjasama saling menguntungkan
Monday, April 26, 2010
Game Tebak Angka Dengan Pascal
bahasa pemrograman pascal atau basic dapat dimanfaatkan untuk membuat game sederhana. berikut ini adalah listing program untuk membuat game tebak angka dengan program delphi atau pascal
program game;{$APPTYPE CONSOLE}
uses
SysUtils;
Var a,b,jawab, tanya,langkah : integer;
begin
langkah:=0;
a:=0;
repeat
a:= a +1;
jawab := random(100);
until a = 5;
repeat
write('Coba tebak angka dari 1 sampai 100 : ');readln(tanya);
if(tanya>jawab)then
writeln('Angka terlalu besar') ;
if(tanya
writeln('Angka terlalu kecil');
langkah:=langkah+1;
until jawab=tanya;
writeln('Selamat! Anda menjawab dalam ',langkah,' langkah');
readln
end.
program ini sebenarnya menggunakan prinsip dasar dari binary search yaitu membandingkan sebuah bilangan apakah lebih besar atau lebih kecil dari bilangan yang dijadikan acuan sehingga pada akhirnya dengan pemindahan atau penukaran bilangan akan diperoleh bilangan yang terurut. Semoga info ini berguna bagi pembaca untuk pengembangan berikutnya ^^
REKURSI (HOURS 11)
Rekursi adalah teknik pemrograman dimana sebuah fungsi atau anggota yang dapat memanggil dirinya sendiri untuk menyelesaikan sebuah permasalahan.
Contoh rekursi dalam penggunaan penambahan segitiga phytagoras dimana didapatkan hasil berupa deret 1, 3, 6, 10, 15, 21, …dst
Digunakan loop atau perulangan untuk mendapatkan nilai jumlah dari setiap segitiga
int triangle(int n) {
int total = 0;
while(n > 0) // until n is 1
{
total = total + n; // add n (column height) to total
--n; // decrement column height
}
return total;
}
Dengan menggunakan rekursi rumusnya dapat disederhanakan menjadi
int triangle(int n) {
if(n==1)
return 1;
else
return( n + triangle(n-1) );
}
Secara matematis dapat dihitung nilai dari hasil return fungsi triangle yaitu dengan rumus (n2+n)/2
Cara kerja fungsi triangle
Listing
int triangle(int n){
cout << "Entering: n=" << n << endl;
if(n==1){
cout << "Returning 1" << endl;
return 1;
}
Else {
int temp = n + triangle(n-1);
cout << "Returning " << temp << endl;
return temp;
}
}
Output
Enter a number: 5
Entering: n=5
Entering: n=4
Entering: n=3
Entering: n=2
Entering: n=1
Returning 1
Returning 3
Returning 6
Returning 10
Returning 15
Triangle = 15
Analisa
Terlihat jelas urutan saat fungsi triangle memproses input dan memulai rekursi dengan memanggil dirinya sendiri hingga nilai yang dikembalikan(return) terus berubah hingga didapat nilai akhir yaitu nilai yang sebenarnya
Karakteristik dari fungsi rekursif
- memanggil dirinya sendiri
- ketika memanggil dirinya sendiri maka akan menyelesaikan masalah yang lebih kecil/sederhana terlebih dahulu
- ada beberapa versi dari rekursi dimana proses yang dilakukan terlalu mudah sehingga tidak perlu melakukan pemanggilan fungsi diri sendiri dan langsung memberikan nilai return
Rekursi dipakai bukan karena efisien
tapi karena kemudahan dalam listing serta sederhana. Rekursi memakan banyak memori dan dapat mengakibatkan overflow jika permasalahan yang diberikan terlalu banyak
tapi karena kemudahan dalam listing serta sederhana. Rekursi memakan banyak memori dan dapat mengakibatkan overflow jika permasalahan yang diberikan terlalu banyak
Pembuatan program anagram/kombinasi dengan rekursi
Konsepnya adalah menyimpan 1 karakter dan menukar-nukar posisi karakter yang lain sehingga didapat kombinasi yang berbeda-beda
Listing anagram
//anagram.cpp
//creates anagrams
#include <iostream>
#include <string>
using namespace std;
////////////////////////////////////////////////////////////////
class word {
private:
int size; //length of input word
int count; //numbers in display
string workStr; //workspace
void rotate(int); //rotate part of workStr
void displayWord(); //display workStr
public:
word(string); //constructor
void anagram(int); //anagram ourselves
};
//--------------------------------------------------------------
//constructor
word::word(string inpStr) : workStr(inpStr), count(0) { //initialize workStr
size = inpStr.length(); //number of characters
}
//--------------------------------------------------------------
void word::anagram(int newSize) {
if(newSize == 1) //if too small,
return; //go no further
for(int j=0; j<newSize; j++) //for each position,
{
anagram(newSize-1); //anagram remaining
if(newSize==2) //if innermost,
displayWord(); // display it
rotate(newSize); //rotate word
}
}
//--------------------------------------------------------------
//rotate left all chars from position to end
void word::rotate(int newSize) {
int j;
int position = size - newSize;
char temp = workStr[position]; //save first letter
for(j=position+1; j<size; j++) //shift others left
workStr[j-1] = workStr[j];
workStr[j-1] = temp; //put first on right
}
//--------------------------------------------------------------
void word::displayWord() {
if(count < 99) //spaces before onecout
<< " "; //or two-digit numbers
if(count < 9)
cout << " ";
cout << ++count << " "; //number
cout << workStr << " ";
if(count%6 == 0)
cout << endl;
}
////////////////////////////////////////////////////////////////
int main() {
string input;
int length;
cout << "Enter a word: "; //get word
cin >> input;
length = input.length(); //get its length
word theWord(input); //make a word object
theWord.anagram(length); //anagram it
return 0;
} //end main()
Output
Enter a word: cats
1 cats 2 cast 3 ctsa 4 ctas 5 csat 6 csta
7 atsc 8 atcs 9 asct 10 astc 11 acts 12 acst
13 tsca 14 tsac 15 tcas 16 tcsa 17 tasc 18 tacs
19 scat 20 scta 21 satc 22 sact 23 stca 24 stac
Pembuatan fungsi rekursif
- Menentukan nilai henti(terminate)
- Melakukan penyederhanaan pada langkah rekursi
Contoh
Program faktorial dengan fungsi fak(n)
- Nilai henti 1!=1 fak(1)=1
- Penyederhanaan n! = n*(n-1)!
Program fibonacci dengan fungsi fib(n)
- Nilai henti fib(1) = 1
fib(2) = 1 - Penyederhanaan fib(n) = fib(n-1) + fib(n-2)
Program pangkat an dengan fungsi pangkat(a,n)
- Nilai henti pangkat(a,n) n=0;a=1
- Penyederhanaan return(a*pangkat(a,n-1))
Program tes 1
Int tes(int n) {
If (n>0) {
Cout <<n<<" ";
Tes(n-1);
}
}
Int main(){
Tes(5);
Cout<<endl;
Return 0;
}
Output 54321
Program tes 2
Int tes(int n) {
If (n>0) {
Tes(n-1);
Cout <<n<<" ";
}
}
Int main(){
Tes(5)
Cout<<endl;
Return 0;
}
Output 12345
sumber : kuliah logika dan pemrograman sistem II