POINTER
Pointer adalah suatu variabel penunjuk yang menunjuk pada suatu alamat memori komputer tertentu. Pointer merupakan variabel level rendah yang dapat digunakan untuk menunjuk nilai integer, character, float, double, atau single, dan bahkan tipe-tipe data lain yang didukung oleh bahasa C. Variabel biasa, sifatnya statis dan sudah pasti, sedangkan pada pointer sifatnya dinamis dan dapat lebih fleksibel. Variabel pointer yang tidak menunjuk pada nilai apapun berarti memiliki nilai NULL, dan disebut sebagai dangling pointer karena nilainya tidak diinisialisasi dan tidak dapat diprediksi.
Pendeklarasian variabel pointer menggunakan tanda * sebelum nama variabelnya, sedangkan untuk menampilkan nilai yang ditunjuk oleh suatu variabel pointer, juga digunakan operator * (tanda asterisk). Jika diinginkan untuk menampilkan alamat tempat penyimpanan nilai yang ditunjuk oleh suatu variabel pointer, digunakan operator & (tanda ampersand).
Pada suatu tipe data array, variabel pointer hanya perlu menunjuk pada nama variabel arraynya saja tanpa perlu menggunakan tanda ampersand, atau menunjuk pada nama variabel array pada indeks yang ke nol nya. Untuk lebih jelasnya, silahkan lihat contoh berikut:
Pendeklarasian variabel biasa dan pointer:
//variabel biasa
int nilai1 = 4;
float nilai2 = 3.5;
char nama[10] = “anton”; //array of char (string)
//variabel pointer
int *nilai_p1; //dangling pointer
int *nilai_p2 = &nilai1; //menunjuk ke tipe data int
char *nilai_p3 = nama; //menunjuk ke tipe data array of char
char *nilai_p4 = &nama[0];
Ilustrasi Pointer:
Contoh program untuk dicoba:
#include
#include
int main(){
int nilai1 = 4;
int nilai2 = 5;
float nilai3 = 3.5;
char nama[11] = "abcdefghij";
int *nilai_p1 = &nilai1;
int *nilai_p2 = &nilai2;
char *nilai_p4 = nama;
float *nilai_p3= &nilai3;
printf("nilai 1=%d, alamat1=%p, ukuran %d\n",*nilai_p1,&nilai_p1, sizeof(nilai1));
printf("nilai 2 = %d, alamat2 = %p, ukuran %d\n",*nilai_p2,&nilai_p2,sizeof(nilai2));
printf("nilai 3 = %f, alamat3 = %p, ukuran %d\n",*nilai_p3,&nilai_p3,sizeof(nilai3));
printf("nilai 4 = %s, alamat4 = %p, ukuran %d\n",nama,&nilai_p4,sizeof(nama));
getch();
return 0;
}
Operasi pointer.
Operasi Pemberian nilai
Contoh 1:
#include
#include
int main(){
float nilai,*p1,*p2;
nilai = 14.54;
printf("nilai = %2.2f, alamatnya %p\n",nilai,&nilai);
p1 = &nilai;
printf("nilai p1 = %2.2f, p1 menunjuk alamat %p\n",*p1,p1);
//pada awalnya p2 masih dangling pointer
printf("mula-mula nilai p2 = %2.2f, p2 menunjuk alamat %p\n",*p2,p2);
p2 = p1; //operasi pemberian nilai, berarti alamat x2 sama dengan x1
printf("sekarang nilai p2 = %2.2f, p2 menunjuk alamat %p\n",*p2,p2);
getch();
}
Contoh 2:
#include
#include
int main(){
int *p,a=25,b;
//p masih dangling
printf("nilai a = %d di alamat a = %p,\n",a,&a);
printf("nilai p di alamat = %p\n",p);
p = &a;
printf("nilai p = %d di alamat %p\n",*p,p);
//b diisi dengan nilai yang berasal dari nilai
//variabel a yang ditunjuk oleh pointer p
b = *p;
printf("nilai b = %d di alamat %p\n",b,&b);
getch();
}
Contoh 3:
#include
#include
int main(){
int a=25,b=12,t;
int *p,*q;
p = &a;
q = &b;
printf("nilai yang ditunjuk p = %d di alamat %p\n",*p,p);
printf("nilai yang ditunjuk q = %d di alamat %p\n",*q,q);
//Contoh kasus, penukaran nilai 2 variabel dengan pointer
t = *p;
*p = *q;
*q = t;
printf("nilai yang ditunjuk p sekarang = %d di alamat %p\n",*p,p);
printf("nilai yang ditunjuk q sekarang = %d di alamat %p\n",*q,q);
getch();
}
Contoh 4:
#include
#include
int main(){
int a,*p;
p=&a;
*p=25;
printf("nilai a = %d",a);
}
Operasi Aritmatika
#include
#include
int main(){
int a,b=10,*p,*q;
p=&a;
*p=25;
printf("nilai a = %d\n",a);
printf("alamat p = %p\n",p);
q=&b;
printf("alamat q = %p\n",q);
printf("nilai a + b = %d\n",(*p+*q));
//posisi alamat p menjadi bergeser, nilai berubah
p=p+1;
printf("nilai p = %d, alamat = %p\n",*p,&p);
q=q-1;
printf("nilai q = %d, alamat = %p\n",*q,&q);
getch();
}
Pointer pada array 1 dimensi:
#include
#include
int main(){
char S[] = "anton";
char *p;
//cara 1
//langsung menunjuk nama array.
p=S;
for(int i=0;i<5;i++){
printf("%c",*p);
p++;
}
printf("\n");
//cara 2
p=&S[0];
for(int i=0;i<5;i++){
printf("%c",*p);
p++;
}
printf("\n");
//Membalik kalimat
p--;
for(int i=0;i<5;i++){
printf("%c",*p);
p--;
}
printf("\n");
getch();
}
Pointer pada Struct:
#include
#include
typedef struct{
int nim;
int umur;
float ipk;
} Mahasiswa;
Mahasiswa m;
Mahasiswa *p = &m;
int main(){
//struct biasa
m.nim=123;
m.ipk=3.2;
m.umur=23;
printf("nim = %d\n",m.nim);
printf("ipk = %f\n",m.ipk);
printf("umur = %d\n",m.umur);
//struct pointer
p->ipk = 3.5;
p->nim = 321;
p->umur = 32;
printf("nim = %d\n",p->nim);
printf("ipk = %f\n",p->ipk);
printf("umur = %d\n",p->umur);
//mengacu pada variabel aslinya
printf("nim = %d\n",m.nim);
printf("ipk = %f\n",m.ipk);
printf("umur = %d\n",m.umur);
getch();
}
Pengembangan:
Buatlah sebuah program untuk mengecek apakah suatu kata palindrom atau bukan, tanpa memperhatikan spasi dan huruf besar/kecilnya. Program dibuat dengan menggunakan template struct sebagai berikut:
typedef struct{
char elemen[30];
int jml_kata;
} Kata;
Kata kata;
Kata *p_kata=&kata;
Lanjutkanlah program berikut agar hasilnya sesuai dengan soal di atas:
#include
#include
typedef struct{
char elemen[30];
int jml_kata;
} Kata;
Kata kata;
Kata *p_kata=&kata;
int main(){
char kalimat[30];
p_kata->jml_kata=0;
char *p = p_kata->elemen;
printf("Masukkan kata : ");gets(kalimat);
fflush(stdin);
printf("Kalimat : %s\n",kalimat);
for(int i=0;i
*p=kalimat[i];
p_kata->jml_kata++;
p++;
}
p=p_kata->elemen;
//tampilkan kembali kalimat tersebut
for(int i=0;i<=p_kata->jml_kata;i++){
printf("%c ",*p);
p++;
}
//kembangkan….
getch();
}
Soal:
Buatlah program data KTP, dengan menggunakan pointer pada struct KTP sebagai berikut:
typedef struct
{
int tgl;
int bln;
int th;
}Tanggal;
typedef struct
{
char noID[5];
char nama[30];
char jenis_kelamin; //’L’ atau ‘P’
Tanggal t;
}KTP;
typedef struct
{
KTP ktp;
int jml;
}Data_KTP;
Data_KTP data_ktp;
Data_KTP *p;
Buatlah fungsi untuk:
Menambah data
Mencari data berdasarkan tahun kelahiran tertentu
Menampilkan data berdasarkan L dan P
Mengedit data
Semua pengaksesan dilakukan dengann menggunakan pointer.
PENDAHULUAN
Pengurutan data dalam struktur data sangat penting terutama untuk data yang bertipe data numerik ataupun karakter. Pengurutan dapat dilakukan secara ascending (urut naik) dan descending (urut turun). Pengurutan (Sorting) adalah proses pengurutan data yang sebelumnya disusun secara acak sehingga tersusun secara teratur menurut aturan tertentu
Contoh:
Data Acak : 5, 6, 8, 1, 3, 25, 10
Ascending : 1, 3, 5, 6, 8, 10, 25
Descending : 25, 10, 8, 6, 5, 3, 1
Deklarasi Array Untuk Sorting
Deklarasikan secara global:
int data[100];
int n; //untuk jumlah data
Prosedur Tukar 2 Buah Data
void tukar(int a,int b){
int tmp;
tmp = data[a];
data[a] = data[b];
data[b] = tmp;
}
BUBBLE SORT
Metode sorting termudah. Diberi nama “Bubble” karena proses pengurutan secara berangsur-angsur bergerak/berpindah ke posisinya yang tepat, seperti gelembung yang keluar dari sebuah gelas bersoda. Bubble Sort mengurutkan data dengan cara membandingkan elemen sekarang dengan elemen berikutnya. Jika elemen sekarang lebih besar dari elemen berikutnya maka kedua elemen tersebut ditukar, jika pengurutan ascending. Jika elemen sekarang lebih kecil dari elemen berikutnya, maka kedua elemen tersebut ditukar, jika pengurutan descending. Algoritma ini seolah-olah menggeser satu per satu elemen dari kanan ke kiri atau kiri ke kanan, tergantung jenis pengurutannya. Ketika satu proses telah selesai, maka bubble sort akan mengulangi proses, demikian seterusnya. Kapan berhentinya? Bubble sort berhenti jika seluruh array telah diperiksa dan tidak ada pertukaran lagi yang bisa dilakukan, serta tercapai perurutan yang telah diinginkan.
Proses 1
22 10 15 3 8 2
22 10 15 3 2↔ 8
22 10 15 2↔ 3 8
22 10 2↔15 3 8
22 2↔10 15 3 8
2 ↔22 10 15 3 8
Pada proses diatas, pegecekan dimulai dari data yang paling akhir, kemudian dibandingkan dengan data di depannya, jika data di depannya lebih besar maka akan ditukar.
Proses 2
2 22 10 15 3 8 à Tidak ada penukaran, karena 3 <8
2 22 10 15 3 8
2 22 10 3↔15 8
2 22 3↔10 15 8
2 3↔22 10 15 8 à Pengurutan berhenti di sini!
2 3 22 10 15 8
Pada proses kedua, pengecekan dilakukan sampai dengan data ke-2 karena data pertama pasti sudah paling kecil.
Proses 3
2 3 22 10 15 8
2 3 22 10 8↔15
2 3 22 8↔10 15
2 3 8↔22 10 15 à Pengurutan berhenti di sini!
2 3 8 22 10 15
2 3 8 22 10 15
Proses 4
2 3 8 22 10 15 à Tidak ada penukaran, karena 10 < 15
2 3 8 22 10 15
2 3 8 10↔22 15 à Pengurutan berhenti di sini!
2 3 8 10 22 15
2 3 8 10 22 15
2 3 8 10 22 15
Proses 5
2 3 8 10 22 15
2 3 8 10 15↔22 à Pengurutan berhenti di sini!
2 3 8 10 15 22
2 3 8 10 15 22
2 3 8 10 15 22
2 3 8 10 15 22
Prosedur Bubble Sort
void bubble_sort(){
for(int i=1;i
if(data[j]}
}
}
Dengan prosedur diatas, data terurut naik (ascending), untuk urut turun (descending), silahkan ubah bagian:
if (data[j]
Menjadi:
if (data[j]>data[j-1]) tukar(j,j-1);
“The bubble sort is an easy algorithm to program, but it is slower than many other sorts”
EXCHANGE SORT
Sangat mirip dengan Bubble Sort. Banyak yang mengatakan Bubble Sort sama dengan Exchange Sort.
Pebedaannya adalah dalam hal bagaimana membandingkan antar elemen-elemennya. Exchange sort membandingkan suatu elemen dengan elemen-elemen lainnya dalam array tersebut, dan melakukan pertukaran elemen jika perlu. Jadi ada elemen yang selalu menjadi elemen pusat (pivot). Sedangkan Bubble sort akan membandingkan elemen pertama/terakhir dengan elemen sebelumnya/sesudahnya, kemudian elemen sebelum/sesudahnya itu akan menjadi pusat (pivot) untuk dibandingkan dengan elemen sebelumnya/sesudahnya lagi, begitu seterusnya.
Contoh Data :
84, 69, 76, 86, 94, 91
Pivot (Pusat)
Proses 1
84 69 76 86 94 91
84 69 76 86 94 91
84 69 76 86 94 91
86 69 76 84 94 91
94 69 76 84 86 91
84 69 76 86 94 91
Pivot (Pusat)
Proses 2
94 69 76 84 86 91
94 76 69 84 86 91
94 84 69 76 86 91
94 86 69 76 84 91
94 91 69 76 84 86
Pivot (Pusat)
Proses 3
94 91 69 76 84 86
94 91 76 69 84 86
94 91 84 69 76 86
94 91 86 69 76 84
Pivot (Pusat)
Proses 4
94 91 86 69 76 84
94 91 86 76 69 84
94 91 86 84 69 76
Pivot (Pusat)
Proses 5
94 91 86 84 69 76
94 91 86 84 76 69
Prosedur Exchange Sort
void exchange_sort() {
for (int i=0; i
}
}
SELECTION SORT
Merupakan kombinasi antara sorting dan searching .Untuk setiap proses, akan dicari elemen-elemen yang belum diurutkan yang memiliki nilai terkecil atau terbesar akan dipertukarkan ke posisi yang tepat di dalam array. Misalnya untuk putaran pertama, akan dicari data dengan nilai terkecil dan data ini akan ditempatkan di indeks terkecil (data[0]), pada putaran kedua akan dicari data kedua terkecil, dan akan ditempatkan di indeks kedua (data[1]). Selama proses, pembandingan dan pengubahan hanya dilakukan pada indeks pembanding saja, pertukaran data secara fisik terjadi pada akhir proses.
Proses 1
0 1 2 3 4 5
32 75 69 58 21 40
Pembanding Posisi
32 < 75 0
32 < 69 0
32 < 58 0
32 > 21 (tukar idx) 4
21 < 40 4
Tukar data ke-0 (32) dengan data ke-4 (21)
0 1 2 3 4 5
21 75 69 58 32 40
Proses 2
0 1 2 3 4 5
21 75 69 58 32 40
Pembanding Posisi
75 > 69 (tukar idx) 2
69 > 58 (tukar idx) 3
58 > 32 (tukar idx) 4
32 < 40 4
Tukar data ke-1 (75) dengan data ke-4 (32)
0 1 2 3 4 5
21 32 69 58 75 40
Proses 3
0 1 2 3 4 5
21 32 69 58 75 40
Pembanding Posisi
69 > 58 (tukar idx) 3
58 < 75 3
58 > 40 5
Tukar data ke-2 (69) dengan data ke-5 (40)
0 1 2 3 4 5
21 32 40 58 75 69
Proses 4
0 1 2 3 4 5
21 32 40 58 75 69
Pembanding Posisi
58 < 75 3
58 < 69 3
Tukar data ke-3 (58) dengan data ke-3 (58)
0 1 2 3 4 5
21 32 40 58 75 69
Proses 5
0 1 2 3 4 5
21 32 40 58 75 69
Pembanding Posisi
75 > 69 5
Tukar data ke-4 (75) dengan data ke-5 (69)
0 1 2 3 4 5
21 32 40 58 69 75
Prosedur Selection Sort
void selection_sort(){
for(int i=0;i
for(int j=i+1;j
}
if(pos != i) tukar(pos,i);
}
}
INSERTION SORT
Mirip dengan cara orang mengurutkan kartu, selembar demi selembar kartu diambil dan disisipkan (insert) ke tempat yang seharusnya. Pengurutan dimulai dari data ke-2 sampai dengan data terakhir, jika ditemukan data yang lebih kecil, maka akan ditempatkan (diinsert) diposisi yang seharusnya. Pada penyisipan elemen, maka elemen-elemen lain akan bergeser ke belakang.
Proses 1
0 1 2 3 4 5
22 10 15 3 8 2
Temp Cek Geser
10 Temp<22? Data ke-0 ke posisi 1
Temp menempati posisi ke -0
0 1 2 3 4 5
10 22 15 3 8 2
Proses 2
0 1 2 3 4 5
10 22 15 3 8 2
Temp Cek Geser
15 Temp<22 Data ke-1 ke posisi 2
15 Temp>10 -
Temp menempati posisi ke-1
0 1 2 3 4 5
10 15 22 3 8 2
Proses 3
0 1 2 3 4 5
10 15 22 3 8 2
Temp Cek Geser
3 Temp<22 Data ke-2 ke posisi 3
3 Temp<15 Data ke-1 ke posisi 2
3 Temp<10 Data ke-0 ke posisi 1
Temp menempati posisi ke-0
0 1 2 3 4 5
3 10 15 22 8 2
Proses 4
0 1 2 3 4 5
3 10 15 22 8 2
Temp Cek Geser
8 Temp<22 Data ke-3 ke posisi 4
8 Temp<15 Data ke-2 ke posisi 3
8 Temp<10 Data ke-1 ke posisi 2
8 Temp>3 -
Temp menempati posisi ke-1
0 1 2 3 4 5
3 8 10 15 22 2
Proses 5
0 1 2 3 4 5
3 8 10 15 22 2
Temp Cek Geser
2 Temp<22 Data ke-4 ke posisi 5
2 Temp<15 Data ke-3 ke posisi 4
2 Temp<10 Data ke-2 ke posisi 3
2 Temp<8 Data ke-1 ke posisi 2
2 Temp<3 Data ke-0 ke posisi 1
Temp menempati posisi ke-0
0 1 2 3 4 5
2 3 8 10 15 22
Prosedur Insertion Sort
void insertion_sort(){
int temp;
for(int i=1;i
j = i -1;
while(data[j]>temp && j>=0){
data[j+1] = data[j];
j--;
}
data[j+1] = temp;
}
}
Program Lengkapnya :
#include
#include
int data[10],data2[10];
int n;
void tukar(int a,int b){
int t;
t = data[b];
data[b] = data[a];
data[a] = t;
}
void bubble_sort(){
for(int i=1;i
if(data[j]}
}
printf("bubble sort selesai!\n");
}
void exchange_sort(){
for (int i=0; i
}
}
printf("exchange sort selesai!\n");
}
void selection_sort(){
int pos,i,j;
for(i=0;i
for(j = i+1;j
}
if(pos != i) tukar(pos,i);
}
printf("selection sort selesai!\n");
}
void insertion_sort(){
int temp,i,j;
for(i=1;i
j = i -1;
while(data[j]>temp && j>=0){
data[j+1] = data[j];
j--;
}
data[j+1] = temp;
}
printf("insertion sort selesai!\n");
}
void Input(){
printf("Masukkan jumlah data = ");scanf("%d",&n);
for(int i=0;i
(i+1));scanf("%d",&data[i]);
data2[i] = data[i];
}
}
void AcakLagi(){
for(int i=0;i
}
Printf("Data sudah teracak!\n");
}
void Tampil(){
printf("Data : ");
for(int i=0;i
}
printf("\n");
}
void main(){
clrscr();
int pil;
do{
clrscr();
printf("1. Input Data\n");
printf("2. Bubble Sort\n");
printf("3. Exchange Sort\n");
printf("4. Selection Sort\n");
printf("5. Tampilkan Data\n");
printf("6. Acak\n");
printf("7. Exit\n");
printf("Pilihan = ");scanf("%d",&pil);
switch(pil){
case 1:Input();break;
case 2:bubble_sort();break;
case 3:exchange_sort();break;
case 4:selection_sort();break;
case 5:Tampil();break;
case 6:AcakLagi();break;
}
getch();
}while(pil!=7);
}
Tabel Perbandingan Kecepatan Metode Pengurutan Data
Untuk data sejumlah 10.000 data pada komputer Pentium II 450 MHz
Metode Waktu (detik)
Data Acak Data Ascending Data Descending
Bubble Sort 11,2 1,32 19,77
Insertion Sort 1,09 0,00 2,25
Selection Sort 1,32 1,32 19,77
SEARCHING
Binary Search
Adalah teknik pencarian data dalam array dengan cara membagi array menjadi dua bagian setiap kali terjadi proses pengurutan. Prinsip pencarian biner adalah:
· Data diambil dari posisi 1 sampai posisi akhir N
· Kemudian cari posisi data tengah dengan rumus (posisi awal + posisi akhir) / 2
· Kemudian data yang dicari dibandingkan dengan data yang di tengah, apakah sama atau lebih kecil, atau lebih besar?
· Jika lebih besar, maka proses pencarian dicari dengan posisi awal adalah posisi tengah + 1
· Jika lebih kecil, maka proses pencarian dicari dengan posisi akhir adalah posisi tengah – 1
· Jika data sama, berarti ketemu.
Contoh Data:
Misalnya data yang dicari 17
0 1 2 3 4 5 6 7 8
3 9 11 12 15 17 23 31 35
A B C
Karena 17 > 15 (data tengah), maka: awal = tengah + 1
0 1 2 3 4 5 6 7 8
3 9 11 12 15 17 23 31 35
A B C
Karena 17 < 23 (data tengah), maka: akhir = tengah – 1
0 1 2 3 4 5 6 7 8
3 9 11 12 15 17 23 31 35
A=B=C
Karena 17 = 17 (data tengah), maka KETEMU!
Programnya:
int binary_search(int cari){
int l,r,m;
l = 0;
r = n-1;
int ktm = 0;
while(l<=r && ktm==0){
m = (l+r)/2;
if(data[m] == cari) ktm=1;
else if (cari < data[m]) r=m-1;
else l=m+1;
}
if(ktm==1) return 1; else return 0;
}
Operasi“dasar“file“pada“prinsipnya“terbagi“menjadi“I“tahap+“yaituJ membuka“atau“mengaktifkan“file melaksanakan“pemrosesan“file menutup“dile
A.(Membuka(file
Sebelum“suatu“file“dapat“diproses+“file“harus“dibuka“terlebih“dahuluF“Sebelum“file
ibuka+“terlebih“dahulu“obyek“file“harus“didefinisikanF“SintaksnyaJ
ofstream{nama_obyek;
erintah“ofstream“dapat“dijalankan“dengan“menyertakan“file“header“fstream.h
Setelah“itu+“suatu“file“dapat“dibuka“dengan“perintah
nama_obyekwopen,ìnama{file{dan{pathî-;
B.(Menulis(ke(File
Salah“satu“jenis“pemrosesan“pada“file“adalah“menulis“atau“merekam“data“ke“fileF
SintaknyaJ
nama_obyek{<<{www{;
C.(Menutup(File
Setelah“pemrosesan“file“selesai+“file“dapat“ditutup“menggunakan“perintah
nama_obyekwclose,-;
Xontoh“5Frogram“berikut“ini“untuk“menulis“teks“ke“dalam“file
/include
/include
void{main,-
{
{ofstream{fileteks;
{filetekswopen,ìC:zalgowtxtî-;
{fileteks{<<{ìUntuk{mencapai{tujuan{yg{besarA{maka{tujuan{ituî
{{{{{{{{{{<<{endl;
{fileteks{<<{ìharus{dibagiKbagi{menjadi{tujuan{kecilî<<{endl;
{fileteks{<<{ìsampai{tujuan{itu{merupakan{tujuan{yg{dapat{ì
{{{{{{{{{{<<{ìdicapaiî{<<{endl;
{fileteks{<<{ìberdasarkan{kondisi{dan{potensi{yg{dimiliki{saat{ì
{{{{{{{{{{<<{itu{ì{<<{endl;
{filetekswclose,-;
}
perintah“fileteksFopencìXJMalgoFtxtî2K“akan“membuka“file“algoFtxt“yang“ada“di“XJ\“
Vpabila“file“tersebut“belum“ada“maka“akan“dibuat“secara“otomatis+“dan“apabila
sudah“ada“isi“file“algoFtxt“akan“terhapusF
D.(Menambah(Data(pada(File
Suatu“file“yang“sudah“ada“sebelumnya“dapat“ditambah“data“yang“baru“ctidak
menghapus“data“lama2F““Xaranya“dengan“menambahkan“perintah“ios::app“pada
openc2F
nama_obyekwopen,ìnama{fileîA{ios::app-;
Xontoh“BF
/include
/include
void{main,-
{
{ofstream{fileteks;
{filetekswopen,ìC:zalgowtxtîA{ios::app-;
{fileteks{<<{endl;
{fileteks{<<{ìOleh:{Al{Khowarizmi{<<{endl;
{filetekswclose,-;
}
E.(Memeriksa(Keberhasilan(Operasi(File
Tidak“selamanya“jalan“yang“mulus“ditemuiF“Vda“kemungkinan“terjadi“saat“file
dibuka+“ternyata“file“tidak“adaF“Yalam“XDD“tersedia“function“untuk“memeriksa
kondisi-kondisi “ pada “ operasi “ file+ “ sehingga “ kesalahan “ saat “ eksekusi “ dapa
dikendalikanF
Function“yang“dimaksud“adalah“fail()F
Xontoh“IJ
/include
/include
void{main,-
{
{ifstream{fileteks;{{{ifstream{digunakan{uz{membaca{file{}
{filetekswopen,ìC:zalgowtxtî-;
{if{,filetekswfail,--{cout{<<{ìMaaf{file{takdapat{dibukazî{{
{{{{{{{{{{{{{{{{{{{{{{{{{{{<<{ìtidak{ditemukanî;
{filetekswclose,-;
}
F.(Operasi(Berbasis(Karakter
Operasi “ file “ dapat “ dilakukan “ dalam “ bentuk “ karakterF “ Misalnya “ proses
penyimpanan“data“ke“file“dilakukan“setiap“karakter+“atau“membaca“data“file
karakter“per“karakterF“Operasi“ini“didukung“oleh“function“put()“dan“get()F
Xontoh“‘J
Program“untuk“menyimpan“data“karakter“per“karakter“ke“dalam“fileF
/include
/include
void{main,-
{
{ofstream{fileteks;
{filetekswopen,ìC:zcontohwtxtî-;
{filetekswput,ëAí-;
{filetekswput,ëBí-;
{filetekswput,ëCí-;
{filetekswclose,-;
}
Xontoh“’F
Program“untuk“membaca“file“karakter“per“karakter
/include
/include
void{main,-
{
{{char{karakter;
{{ifstream{fileteks;{{}
{{filetekswopen,ìC:zcontohwtxtî-;
{
{{while,Cfileteksweof,--{
{{{
{{{{filetekswget,karakter-;
{{{{cout{<<{karakter;
{{}
{{filetekswclose,-;
}
Latihan.
5F Wuatlah“program“XDD“untuk“menghitung“jumlah“karakter“dalam“suatu“fileF
Inputnya“adalah“nama“file“dan“pathnyaF
BF Wuatlah“program“XDD“untuk“menghitung“jumlah“karakter“tertentu+“misalnya
karakter“ëVíF“Input“berupa“nama“file“dan“karakter“yang“akan“dihitungF
IF Misalkan“suatu“file“teks“berisi“listing“program“XDDF“Wuatlah“program“untuk
menghitung“pasangan“kurung“kurawal“yang“ada“pada“file“teks“tersebutF
‘F Wuatlah“program“XDD“untuk“melakukan“enkripsi“shift“chiper“suatu“file“teks
cdengan“asumsi“semua“karakter“huruf“adalah“huruf“kapital2F“Inputnya“adalah
file“teks“yang“akan“dienkripsi“dan“besar“pergeseran“cinteger2F“Outputnya
adalah“file“teks“hasil“enkripsiF
HintJ
Ide“dasar“shift“chiper“adalah“mengubah“setiap“karakter“huruf“ke“karakter
huruf“lainF“Misalkan“pergeserannya“B+“maka“berikut“ini“karakter“hasil“enkripsi
awal V W X Y Z F G H I J K L M N O P Q R S T U V W X Y Z
hasil X Y Z F G H I J K L M N O P Q R S T U V W X Y Z V W
Sehingga“misal“diberikan“suatu“teks“XDD“IS“ZVSY+“maka“hasil“enkripsinya
adalah“ZDD“KU“GXUV
1. Linear search
Syarat
Tabel : Sort / bebas
Data masukan banyak : sort / bebas
Tabel Data
A D
C B
D
B
E
Ciri : Selalu kembali keasal pencarian untuk data berikutnya.
2. Sequential search
Syarat
Tabel : Sort
Data masukan banyak : Sort
Tabel Data
A B
B D
C
D
E
Ciri : pencarian data kedua mulai dari data pertama yang telah dite
Misal:
3. Binary search
Batas bawah = 0
Syarat
Batas atas = 7, jika ganjil + 1
Tabel : Sort
Indeks = (BB + BA)/2=4
Data masukan banyak : Bebas
Lanjut……..
Tabel Data
Batas bawah = 4
A D
Batas atas = tetap
B B
Indeks = (BB + BA)/2=6……t
C
bagi sampai ketemu
D
E
Ciri : pencarian data memba
F
menjadi dua, kemudian mem
G
hasil baginya terus sampai k
Potongan Algor binary
Array tabel[8], Input(data)
nt kiri=1, kanan=n, Cari=0;
While (cari <> 0 and kiri<=kanan)
Lokasi=(kiri+kanan)/2;
F tabel[lokasi]=cari then
Cari=1;
ELSE
If tabel[lokasi] <>
Kiri = lokasi + 1;
Else
Kanan = lokasi -1;
Endif
Endif
IF Cari=1 then
Idx=lokasi;
Else
Output(tidak ditemukan);
Endif
#include
#include
int BinarySearch(int [], int, int);
int main()
{
clrscr();
const int NUMEL = 10;
int nums[NUMEL] = {5,10,22,32,45,67,73,98,99,101};
int item, location;
cout << "Enter the item you are searching for: ";
cin >> item;
location = BinarySearch(nums, NUMEL, item);
if (location > -1)
cout << "The item was found at index location "<< location <<
endl;
else
cout << "The item was not found in the list\n";
getch();
return 0;
}
// this function returns the location of key in the list
// a -1 is returned if the value is not found
int BinarySearch(int list[], int size, int key)
{
int left, right, midpt;
left = 0;
right = size - 1;
while (left <= right)
{
midpt = (int) ((left + right) / 2);
if (key == list[midpt])
{
return midpt; //data is found
}
D:\My Documents\algor\algor2\Search.doc Created by Yokivox
else if (key > list[midpt])
left = midpt + 1;
else
right = midpt - 1;
}
return -1; //return indicate that data is’t found
}
REFRESH!
- Function yang telah kita pelajari adalah kumpulan instruksi yang digunakan untuk
melaksanakan suatu maksud tertentu dan diberi nama yang unik.
- Function ada yang mengembalikan nilai (non-void) dan ada yang tidak mengembalikan
nilai (void)
Contoh:
int Kali(int a,int b){
return a*b;
}
Atau seperti ini:
void ShowError(){
printf(“Error on line %d: %s”,Error.line,Error.message);
}
- Variabel-variabel yang ada di dalam function bersifat lokal untuk fungsi tersebut saja,
sedangkan nilai kembalian fungsi akan dikenal pada fungsi yang memanggil fungsi
tersebut.
#include
#include
int d=3,e=1;
void coba_lokal(int a,int b){
int c = 0;
int d = 10;
int e;
e = (a+b) * (c+d);
printf("lokal a = %d\n",a);
printf("lokal b = %d\n",b);
printf("lokal c = %d\n",c);
printf("lokal d = %d\n",d);
printf("lokal e = %d\n",e);
}
void main(){
int a=2;
int b;
b = 4;
int c=0;
printf("main a = %d\n",a);
printf("main b = %d\n",b);
coba_lokal(a,b);
printf("main c = %d\n",c);
printf("global d = %d\n",d);
printf("global e = %d\n",e);
getch();
}
- Function boleh memiliki parameter ataupun tidak memiliki parameter satupun
- Parameter dalam function terdiri dari 2 jenis:
o Parameter Formal: yaitu parameter yang tertulis dalam definisi fungsi.
o Parameter Aktual: yaitu parameter yang merupakan inputan langsung pada
saat penggunakan fungsi tersebut. Dapat berupa variabel maupun langsung
berupa value.
Contoh:
#include
int JUMLAH(int X, int Y);
X, Y disebut parameter formal
void main(){
int A,B,T;
Variabel A,B,C lokal dalam main
A=5; B=2;
T = JUMLAH(A,B);
A dan B disebut parameter aktual
printf(“%d”,T);
}
X, Y disebut parameter formal
int JUMLAH(int X, int Y){
int H;
Variabel X,Y lokal dalam JUMLAH
H = X + Y;
return(H);
}
Pengiriman Parameter ke suatu Function secara nilai (By Value)
- Yang dikirimkan ke fungsi adalah nilainya, bukan alamat memori letak dari datanya
- Fungsi yang menerima kiriman nilai ini akan menyimpannya di alamat terpisah dari
nilai aslinya yang digunakan oleh program yang memanggil fungsi tersebut
- Karena itulah pengubahan nilai di dalam fungsi tidak akan berpengaruh pada nilai
asli di program yang memanggil fungsi walaupun keduanya menggunakan nama
variabel yang sama
Contoh
#include
#include
int a=4;
void getAGlobal(){
printf("A Global adalah %d alamatnya %p\n",a,&a);
}
void fungsi_by_value(int a){
a = a * 3;
printf("A by value adalah = %d alamatnya adalah %p\n",a,&a);
}
Pengiriman
satu arah
void main(){
int a = 5;
getAGlobal();
printf("A main adalah = %d alamatnya adalah %p\n",a,&a);
fungsi_by_value(a);
printf("A main setelah fungsi dipanggil adalah = %d
alamatnya adalah %p\n",a,&a);
getch();
}
Hasil:
Di dalam Memori:
a di global a di main a di a di main after
nilai 4 nilai 5
fungsi_by_value function
nilai 15 nilai 5
alamat 252F:0076 alamat 252F:2294
alamat alamat
252F:2292 252F:2294
- Pengiriman by value adalah pengiriman searah, dari program pemanggil fungsi ke
fungsi yang dipanggilnya
- Pengiriman by value dapat dilakukan untuk suatu statement, tidak hanya untuk suatu
variabel, value, array atau konstanta saja.
...
void fungsi_by_value(int a){
a = a * 3;
printf("A by value adalah = %d alamatnya adalah %p\n",a,&a);
}
void main(){
int a = 5;
getAGlobal();
printf("A main adalah = %d alamatnya adalah %p\n",a);
fungsi_by_value(5*a+1);
Statement
getch();
}
...
- Secara default, C menggunakan parameter by value untuk pembuatan fungsi-
fungsinya.
Contoh lain:
#include
#include
void Secara_Nilai(float a,float b,char c){
float *Alamat_A;
Alamat_A = &a;
a = 7;
printf("Lokal A = %f, alamat A = %p\n",a,Alamat_A);
printf("Lokal B = %f\n",b);
printf("Lokal C = %c\n",c);
}
void main(){
float a=25,*Alamat_A;
char c = 'a';
Alamat_A = &a;
Secara_Nilai(a,a/3,c);
printf("Main A = %f, alamat A = %p\n",a,Alamat_A);
printf("Main A/3 = %f\n",(a/3));
printf("Main C = %c\n",c);
getch();
}
Hasil:
Dapat disimpulkan sebagai berikut:
1. Parameter aktual yang dikirimkan adalah datanya, yaitu Secara_Nilai(a,a/3,c)
2. Alamat nilai a pada main dan a pada fungsi Secara_Nilai berbeda, yaitu
2447:2456 dan 2447:2466
3. Perubahan nilai a dalam fungsi Secara_Nilai menjadi 7 tidak mengubah nilai a
pada main yaitu tetap 25
4. Pengirimannya satu arah
Secara_Nilai(a,a/3,c)
Secara_Nilai(float a,float b,char c)
5. Pengiriman parameter dapat berupa ungkapan (statement) yaitu a/3
Pengiriman Parameter secara Acuan (by Reference)
1. Yang dikirimkan adalah alamat memori letak dari nilai datanya, bukan nilai datanya
2. Fungsi yang menerima parameter ini akan menggunakan alamat yang sama dengan
alamat nilai datanya
3. Karena itulah pengubahan nilai di fungsi akan mengubah juga nilai asli di program
pemanggil fungsi tersebut
4. Pengiriman parameter by reference adalah pengiriman dua arah, yaitu dari program
pemanggil fungsi ke fungsi dan sebaliknya dari fungsi ke program pemanggilnya
5. Pengiriman parameter by reference tidak dapat digunakan untuk suatu ungkapan,
hanya bisa untuk variabel, konstanta atau elemen array saja
Contoh1:
#include
#include
int a=4;
void getAGlobal(){
printf("A Global adalah %d alamatnya %p\n",a,&a);
}
Menggunakan
void fungsi_by_ref(int *a){
asteris/bintang (*)
*a = *a * 3;
printf("A by ref adalah = %d alamatnya adalah %p\n",*a,a);
}
Menggunakan
void main(){
asteris/bintang (*)
int a = 5;
getAGlobal();
printf("A main adalah = %d alamatnya adalah %p\n",a,&a);
fungsi_by_ref(&a);
printf("A main setelah fungsi dipanggil adalah = %d alamatnya
adalah %p\n",a,&a);
getch();
}
Hasil1:
Di dalam Memori:
a di global a di main a di a after
nilai 4 nilai 5
fungsi_by_value fungsi_by_ref
nilai 15 nilai 15
alamat 2487:0076 alamat 2487:2292
alamat alamat
2487:2292 2487:2292
Contoh lain:
Menggunakan
#include
asteris/bintang (*)
#include
void Secara_Acuan(float *a,float b,char *c){
float *Alamat_A;
Tanpa
Alamat_A = a;
asteris/bintang (*)
*a = 7;
printf("Lokal A = %f, alamat A = %p\n",*a,Alamat_A);
printf("Lokal B = %f\n",b);
printf("Lokal C = %c\n",*c);
}
void main(){
float a=25,*Alamat_A;
char c = 'a';
Alamat_A = &a;
Secara_Acuan(&a,a/3,&c);
printf("Main A = %f, alamat A = %p\n",a,Alamat_A);
printf("Main A/3 = %f\n",(a/3));
printf("Main C = %c\n",c);
getch();
}
Hasil:
Kesimpulan:
1. Operator pada pengiriman parameter by reference adalah menggunakan operator ‘&’
yang berarti mengacu pada alamat memori dari variabel tersebut.
2. Parameter aktual yang dikirimkan adalah alamat memori, yaitu
Secara_Acuan(&a,a/3,&c)
3. Alamat nilai a pada main dan a pada fungsi Secara_Acuan sama, yaitu 23C7:2466
4. Perubahan nilai a dalam fungsi Secara_Acuan menjadi 7 juga mengubah nilai a pada
main yang semula 25 menjadi 7
5. Pengirimannya dua arah
Secara_Acuan (&a,a/3,&c)
Secara_Nilai(float *a,float b,char *c)
6. Pengiriman parameter tidak dapat berupa ungkapan (statement), sehingga untuk
statement a/3 harus berupa parameter by value
Pengiriman Parameter berupa Array berdimensi satu
- Pengiriman ini adalah pengiriman by reference, karena yang dikirimkan sebenarnya
adalah alamat dari elemen pertama array yang digunakan sebagai parameter, bukan
seluruh nilai elemen-elemennya.
- Alamat elemen pertama array dapat ditulis dengan menyebutkan nama array tanpa
menuliskan indeksnya.
Contoh1:
#include
#include
Tanpa parameter
void Cetak_Mundur(char S[]){
int n;
//menghitung panjang string dimasukkan ke n
for(n=0;S[n]!='\0';n++);
for(int i=n-1;i>=0;i--) printf("%c",S[i]);
}
void main(){
char S[] = "universitas kristen duta wacana";
printf("String mula-mula = %s\n",S);
printf("String terbalik = ");
Parameter aktual
Cetak_Mundur(S);
getch();
}
Hasil:
Contoh2:
#include
#include
void Balik_Huruf(char S[]){
int n;
//menghitung panjang string dimasukkan ke n
for(n=0;S[n]!='\0';n++);
for(int i=0;i
//diubah menjadi huruf besar
else if(S[i]>='A' && S[i]<='Z') S[i] = S[i] - 'A' + 'a';
//diubah menjadi huruf kecil
}
}
void main(){
char S[] = "UniVersiTas KriSteN DutA WaCanA";
printf("String mula-mula = %s\n",S);
printf("String hasil = ");
Balik_Huruf(S);
printf("%s",S);
getch();
}
Hasil:
Contoh3:
#include
#include
void Masukkan_Data(int data[],int jml){
for(int i=0;i
}
}
int Hitung_Total(int data[],int jml){
int t = 0;
for(int i=0;i
}
return t;
}
void main(){
int n;
int total;
int data[10];
printf("Jumlah data = ");scanf("%d",&n);
Masukkan_Data(data,n);
total = Hitung_Total(data,n);
printf("Total data = %d",total);
getch();
}
Hasil:
Pengiriman Parameter berupa Array dua dimensi
- Pengiriman parameter berupa array 2 dimensi hampir sama dengan pengiriman
parameter array satu dimensi
- Perbedaannya: menyebutkan baris dan kolom array dimensi dua tersebut
- Mendeklarasikan MAX_ROWS dan MAX_COLS yang digunakan untuk pengiriman
parameter array dua dimensi
- Pada saat pengiriman parameter formal array dua dimensi, kita harus menyebutkan
banyaknya dimensi array untuk kolom, sehingga ukuran kolom dapat diketahui. Hal ini
berkaitan dengan pemesanan variabel array di memori
Contoh:
#include
#include
#define MAX_COLS 10
#define MAX_ROWS 10
void Masukkan_Data(int data[][MAX_COLS],int m,int n){
for(int i=0;i
",i+1,j+1);scanf("%d",&data[i][j]);
}
}
}
int Hitung_Total(int data[][MAX_COLS],int m,int n){
int t = 0;
for(int i=0;i
}
}
return t;
}
void main(){
int m,n;
int total;
int data[MAX_ROWS][MAX_COLS];
printf("Jumlah baris = ");scanf("%d",&m);
printf("Jumlah kolom = ");scanf("%d",&n);
Masukkan_Data(data,m,n);
total = Hitung_Total(data,m,n);
printf("Total data = %d",total);
getch();
}
REFRESH ARRAY
- Selama ini kita menggunakan satu variabel untuk menyimpan 1 buah nilai
dengan tipe data tertentu.
- Misalnya :
int a1, a2, a3, a4, a5;
Deklarasi variabel diatas digunakan untuk menyimpan 5 data integer
dimana masing-masing variabel diberi nama a1, a2, a3, a4, dan a5.
- Jika kita memiliki 10 data, 100 data integer bahkan mungkin data yang
ingin kita proses tidak kita ketahui atau bersifat dinamis? Kita tidak
mungkin menggunakan variabel seperti diatas.
- Di dalam C dan pemrograman yang lain, terdapat suatu fasilitas untuk
menyimpan data-data yang bertipe data sama dengan suatu nama
tertentu.
DEFINISI ARRAY
- Array adalah suatu tipe data terstuktur yang berupa sejumlah data sejenis
(bertipe data sama) yang jumlahnya bisa statis ataupu dinamis dan diberi
suatu nama tertentu.
- Elemen-elemen array tersusun secara berderet dan sekuensial di dalam
memori sehingga memiliki alamat yang besebelahan/berdampingan.
- Array dapat berupa array 1 dimensi, 2 dimensi, bahkan n-dimensi.
- Elemen-elemen array bertipe data sama tapi bisa bernilai sama atau
berbeda-beda.
HANDOUT STRUKTUR DATA
PRODI TEKNIK INFORMATIKA UKDW
0 1 2 3 4 5 6 7
indeks
8 10 6 -2 11 7 1 100
value
alamat
ffea ffeb ffec ffed ffef fffa fffb fffc
CARA PENGAKSESAN ELEMEN ARRAY
- Elemen-elemen array dapat diakses oleh program menggunakan suatu
indeks tertentu
- Pengaksesan elemen array dapat dilakukan berurutan atau random
berdasarkan indeks tertentu secara langsung.
- Pengisian dan pengambilan nilai pada indeks tertentu dapat dilakukan
dengan mengeset nilai atau menampilkan nilai pada indeks yang
dimaksud.
- Dalam C, tidak terdapat error handling terhadap batasan nilai indeks,
apakah indeks tersebut berada di dalam indeks array yang sudah
didefinisikan atau belum. Hal ini merupakan tanggung jawab programmer.
Sehingga jika programmer mengakses indeks yang salah, maka nilai yang
dihasilkan akan berbeda atau rusak karena mengakses alamat memori
yang tidak sesuai.
DEKLARASI ARRAY 1 DIMENSI
tipe_data nama_var_array[ukuran];
tipe_data : menyatakan jenis tipe data elemen larik (int, char, float, dll)
nama_var_array : menyatakan nama variabel yang dipakai.
ukuran : menunjukkan jumlah maksimal elemen larik.
HANDOUT STRUKTUR DATA
PRODI TEKNIK INFORMATIKA UKDW
Contoh:
char huruf[9];
int umur[10];
int kondisi[2] = {0,1}
int arr_dinamis[] = {1,2,3}
char huruf[9]: berarti akan memesan tempat di memori komputer sebanyak 9 tempat
dengan indeks dari 0-8, dimana semua elemennya bertipe data karakter
semuanya. Kalau satu karakter berukuran 1 byte, berarti membutuhkan
memori sebesar 9 byte.
int umur[10]: berarti akan memesan tempat di memori komputer sebanyak 10 tempat
dengan indeks dari 0-9, dimana semua elemennya bertipe data integer
semuanya. Kalau satu integer berukuran 4 bytes, berarti membutuhkan
memori sebesar 4 x 10 = 20 bytes.
int kondisi[2]: berarti akan memesan tempat di memori komputer sebanyak 2 tempat
dengan indeks 0-1, dimana semua elemennya bertipe data integer
semuanya. Dan pada contoh di atas isi elemen-elemennya yang
sebanyak 2 buah diisi sekaligus (diinisialisasi) yaitu pada elemen
kondisi[0] bernilai 0, dan elemen kondisi[1] bernilai 1.
int arr_dinamis[]:berarti mendeklarasikan array dengan ukuran maksimum array tidak
diketahui, namun ukuran tersebut diketahui berdasarkan inisialisasi yaitu
sebanyak 3 elemen, yang isinya 1,2, dan 3.
Kita tidak dapat mendeklarasikan array dinamis tanpa inisialisasi!
PENJELASAN ARRAY 1 DIMENSI
- Tanda [] disebut juga “elemen yang ke- ... Misalnya kondisi[0] berarti
elemen yang ke nol.
- Array yang sudah dipesan, misalnya 10 tempat tidak harus diisi
semuanya, bisa saja hanya diisi 5 elemen saja, baik secara berurutan
maupun tidak. Namun pada kondisi yang tidak sepenuhnya terisi
HANDOUT STRUKTUR DATA
PRODI TEKNIK INFORMATIKA UKDW
tersebut, tempat pemesanan di memori tetap sebanyak 10 tempat, jadi
tempat yang tidak terisi tetap akan terpesan dan dibiarkan kosong.
Contoh 1 (variabel array dan variabel biasa)
//Dengan variabel biasa:
int x1=3,x2=5,x3=2,x4=7,x5=9;
//Dengan larik:
int x[5]={3,5,2,7,9};
Bagaimana jika kita ingin menghitung total dari variabel biasa?
total = x1 + x2 + x3 + x4 + x5;
Contoh 2 (menginputkan dan menampilkan array)
#include
#include
void main()
{ int nilai[5], x;
clrscr();
printf(“Memasukkan nilai :\n”);
for(x=0;x<5;x++)
{
printf(“Nilai Angka : “); scanf(“%d”,&nilai[x]);
}
printf(“\n”);
printf(“Membaca nilai :\n”);
for(x=0;x<5;x++)
{
printf(“Nilai Angka : %d“,nilai[x]);
}
getch();
Hasilnya
}
HANDOUT STRUKTUR DATA
PRODI TEKNIK INFORMATIKA UKDW
Contoh 3 (manipulasi array 1 dimensi)
#include
#include
int main(){
int bil[7],i;
printf("elemen 1 ? ");scanf("%d",&bil[0]);
bil[1] = 5;
bil[2] = bil[1] + 20;
for(i=4;i<7;i++) bil[i] = i*10;
bil[3] = bil[bil[1]];
for(i=0;i<7;i++) printf("bil[%d] = %d dan alamatnya: %X\n",i,bil[i],&bil[i]);
getch();
return 0;
}
Hasilnya:
Terlihat bahwa alamat array berurutan dengan jarak antar alamat adalah 4
bytes (integer berukuran 4 bytes)
Contoh 4 (tanpa inisialisasi langsung ditampilkan)
#include
#include
int main(){
int bil[7]; //tanpa inisialisasi
for(int i=0;i<7;i++){
printf("Elemen ke-%i = %d\n",i,bil[i]);
}
getch();
return 0;
}
HANDOUT STRUKTUR DATA
PRODI TEKNIK INFORMATIKA UKDW
Hasilnya:
Contoh 5 (inisialisasi dengan 0)
#include
#include
int main(){
int bil[7] = {0}; //inisialisasi 0
for(int i=0;i<7;i++){
printf("Elemen ke-%i = %d\n",i,bil[i]);
}
getch();
return 0;
}
Hasilnya:
Contoh 6 (inisialisasi hanya 2 elemen pertama)
#include
#include
int main(){
int bil[7] = {2,5};
for(int i=0;i<7;i++){
printf("Elemen ke-%i = %d\n",i,bil[i]);
}
getch();
return 0;
}
HANDOUT STRUKTUR DATA
PRODI TEKNIK INFORMATIKA UKDW
Hasilnya:
Contoh 7 (karakter yang tidak diinisialisasi)
#include
#include
int main(){
char h[5];
for(int i=0;i<5;i++){
printf("Elemen ke-%i = %c\n",i,h[i]);
}
getch();
return 0;
}
Hasilnya:
Operasi Elemen-elemen Array
- Penambahan elemen array
- Menampilkan elemen array
- Pencarian elemen array
o Jika ditemukan, katakan KETEMU!
- Penghapusan elemen array
o Cari, jika ditemukan baru dihapus.
HANDOUT STRUKTUR DATA
PRODI TEKNIK INFORMATIKA UKDW
o Penghapusan elemen array pada dasarnya tidak ada!
o Yang ada adalah pe-replace-an isi elemen array yang akan dihapus
oleh elemen-elemen berikutnya.
Ilustrasi penghapusan data 11 (elemen ke-4), n = 8:
0 1 2 3 4 5 6 7
indeks
8 10 6 -2 11 7 1 100
value
alamat
ffea ffeb ffec ffed ffef fffa fffb fffc
Pengeseran elemen, n = 7:
0 1 2 3 4 5 6 7
indeks
value
alamat
ffea ffeb ffec ffed ffef fffa fffb fffc
- Pengeditan elemen array
o Cari, jika ditemukan baru diedit dengan elemen yang baru.
o Pengisian elemen baru sama saja melakukan pe-replace-an data
pada indeks elemen yang diedit.
Pengertian Searching
- Pada suatu data seringkali dibutuhkan pembacaan kembali informasi
(retrieval information) dengan cara searching.
- Searching adalah pencarian data dengan menelusuri tempat pencarian
data tersebut.
- Tempat pencarian data tersebut dapat berupa array dalam memori, bisa
juga pada file pada external storage.
Teknik-teknik Searching
1. Sequential Search
HANDOUT STRUKTUR DATA
PRODI TEKNIK INFORMATIKA UKDW
2. Binary Search
3. Interpolation Search
4. Quick Search
Sequential Search
- Adalah suatu teknik pencarian data dalam array ( 1 dimensi ) yang akan
menelusuri semua elemen-elemen array dari awal sampai akhir, dimana
data-data tidak perlu diurutkan terlebih dahulu.
- Kemungkinan terbaik (best case) adalah jika data yang dicari terletak di
indeks array terdepan (elemen array pertama) sehingga waktu yang
dibutuhkan untuk pencarian data sangat sebentar (minimal).
- Kemungkinan terburuk (worst case) adalah jika data yang dicari terletak di
indeks array terakhir (elemen array terakhir) sehingga waktu yang
dibutuhkan untuk pencarian data sangat lama (maksimal).
Misalnya terdapat array satu dimensi sebagai berikut:
0 1 2 3 4 5 6 7
indeks
8 10 6 -2 11 7 1 100
value
alamat
ffea ffeb ffec ffed ffef fffa fffb fffc
Kemudian program akan meminta data yang akan dicari, misalnya 6.
Jika ada maka akan ditampilkan tulisan “ADA”, sedangkan jika tidak ada
maka akan ditampilkan tulisan “TIDAK ADA”.
#include
#include
HANDOUT STRUKTUR DATA
PRODI TEKNIK INFORMATIKA UKDW
void main(){
clrscr();
int data[8] = {8,10,6,-2,11,7,1,100};
int cari;
int flag=0;
printf("masukkan data yang ingin dicari = ");scanf("%d",&cari);
for(int i=0;i<8;i++){
if(data[i] == cari) flag=1;
}
if(flag==1) printf("Data ada!\n");
else printf("Data tidak ada!\n");
- Dari program diatas, terlihat bahwa dilakukan perulangan untuk
mengakses semua elemen array data satu persatu berdasarkan
indeksnya.
- Program menggunakan sebuah variabel flag yang berguna untuk menadai
ada atau tidaknya data yang dicari dalam array data. Hanya bernilai 0
atau 1.
- Flag pertama kali diinisialiasasi dengan nilai 0.
- Jika ditemukan, maka flag akan diset menjadi 1, jika tidak ada maka flag
akan tetap bernilai 0.
- Semua elemen array data akan dibandingkan satu persatu dengan data
yang dicari dan diinputkan oleh user.
Question: Bagaimana jika data yang dicari ditemukan maka data tersebut
ditampilkan terletak di indeks ke berapa?
Hint: Gunakan indeks array!
Problem: Apakah cara di atas efisien? Jika datanya ada 10000?
HANDOUT STRUKTUR DATA
PRODI TEKNIK INFORMATIKA UKDW
Solution: Untuk meningkatkan efisiensi, seharusnya jika data yang dicari sudah
ditemukan maka perulangan harus dihentikan!
Hint: Gunakan break!
Question: Bagaimana cara menghitung ada berapa data dalam array yang
nilainya sama dengan data yang dicari oleh user?
Hint: Gunakan variabel counter yang nilainya akan selalu bertambah jika ada
data yang ditemukan!
Penggunaan Sentinel (Penjaga)
Perhatikan array data berikut ini:
indeks
0 1 2 3 4 5 6
value
3 12 9 -4 21 6
alamat
ffea ffeb ffec ffed ffef fffa fffb
- Terdapat 6 buah data dalam array (dari indeks 0 s/d 5) dan terdapat 1
indeks array tambahan (indeks ke 6) yang belum berisi data (disebut
sentinel)
- Array pada indeks ke 6 berguna untuk menjaga agar indeks data berada
pada indeks 0 s/d 5 saja. Bila pencarian data sudah mencapai array
indeks yang ke-6 maka berarti data TIDAK ADA, sedangkan jika
pencarian tidak mencapai indeks ke-6, maka data ADA.
#include
#include
void main(){
clrscr();
int data[7] = {3,12,9,-4,21,6};
int cari,i;
printf("masukkan data yang ingin dicari = ");scanf("%d",&cari);
HANDOUT STRUKTUR DATA
PRODI TEKNIK INFORMATIKA UKDW
data[6] = cari;
i=0;
while(data[i] != cari) i++;
if(i<6) printf("Data ada!\n"); else printf("Data tidak ada!\n");
}
KESIMPULAN: sangat efisien!
Binary Search
- Data yang ada harus diurutkan terlebih dahulu berdasarkan suatu urutan
tertentu yang dijadikan kunci pencarian.
- Adalah teknik pencarian data dalam dengan cara membagi data menjadi
dua bagian setiap kali terjadi proses pengurutan.
- Prinsip pencarian biner adalah:
o Data diambil dari posisi 1 sampai posisi akhir N
o Kemudian cari posisi data tengah dengan rumus (posisi awal +
posisi akhir) / 2
o Kemudian data yang dicari dibandingkan dengan data yang di
tengah, apakah sama atau lebih kecil, atau lebih besar?
o Jika lebih besar, maka proses pencarian dicari dengan posisi awal
adalah posisi tengah + 1
o Jika lebih kecil, maka proses pencarian dicari dengan posisi akhir
adalah posisi tengah – 1
o Jika data sama, berarti ketemu.
Contoh Data:
Misalnya data yang dicari 17
HANDOUT STRUKTUR DATA
PRODI TEKNIK INFORMATIKA UKDW
0 1 2 3 4 5 6 7 8
3 9 11 12 15 17 23 31 35
A B C
Karena 17 > 15 (data tengah), maka: awal = tengah + 1
0 1 2 3 4 5 6 7 8
3 9 11 12 15 17 23 31 35
A B C
Karena 17 < 23 (data tengah), maka: akhir = tengah – 1
0 1 2 3 4 5 6 7 8
3 9 11 12 15 17 23 31 35
A=B=C
Karena 17 = 17 (data tengah), maka KETEMU!
Programnya:
int binary_search(int cari){
int l,r,m;
l = 0;
r = n-1;
int ktm = 0;
while(l<=r && ktm==0){
m = (l+r)/2;
if(data[m] == cari) ktm=1;
else if (cari < data[m]) r=m-1;
else l=m+1;
}
if(ktm==1) return 1; else return 0;
}
Interpolation Search
- Teknik ini dilakukan pada data yang sudah terurut berdasarkan kunci
tertentu
- Teknik searching ini dilakukan dengan perkiraan letak data.
HANDOUT STRUKTUR DATA
PRODI TEKNIK INFORMATIKA UKDW
o Contoh ilustrasi: jika kita hendak mencari suatu nama di dalam buku
telepon, misal yang berawalan dengan huruf T, maka kita tidak akan
mencarinya dari awal buku, tapi kita langsung membukanya pada
2/3 atau ¾ dari tebal buku.
- Jadi kita mencari data secara relatif terhadap jumlah data.
- Rumus posisi relatif kunci pencarian dihitung dengan rumus:
lowdatakunci - ][
lowlowhighxPosisi +-= )(
lowdatahighdata - ][][
Misal terdapat data sebagai berikut:
Kode Judul Buku Pengarang
025 The C++ Programming James Wood
034 Mastering Delphi 6 Marcopolo
041 Professional C# Simon Webe
056 Pure JavaScript v2 Michael Bolton
063 Advanced JSP & Servlet David Dunn
072 Calculus Make it Easy Gunner Christian
088 Visual Basic 2005 Express Antonie
096 Artificial Life : Volume 1 Gloria Virginia
Kunci Pencarian ? 088
Low ? 0
High ? 7
Posisi = (088 - 025) / (096 - 025) * (7 - 0) + 0 = [6]
Kunci[6] = kunci pencarian, data ditemukan : Visual Basic 2005
Kunci Pencarian ? 060
Low ? 0
High ? 7
HANDOUT STRUKTUR DATA
PRODI TEKNIK INFORMATIKA UKDW
Posisi = (060 – 025) / (096 – 025) * (7 – 0) + 0 = [3]
Kunci[3] < kunci pencarian, maka teruskan
Low = 3 + 1 = 4
High = 7
Ternyata Kunci[4] adalah 063 yang lebih besar daripada 060.
Berarti tidak ada kunci 060.
Programnya:
int interpolationsearch(int key,int n){
int low,high,pos,i;
low=0;
high=n-1;
do{
pos = (key – data[low]) * (high – low) / data[high] –
data[low] + low;
if (data[pos] == key] return pos;
if (data[pos] > key) high = pos-1;
else
if (data[pos] < key) low = pos + 1;
} while(key >= data[low] && key <= data[high]);
return -1
}
AlassbmiripbdenganbstructHbSalahbsatubperbedaaannyabadalahbìsifatbdasarîbdaribclassb
adalahbprivateHbPrivatebadalahbjenisbaksesbdaribsebuahbstrukturbdatab“sepertibstructbdanb
class”HbPembagianbtingkatbaksesbinibdibagibmenjadibBbbagianJ
? Public:bmemberbbisablangsungbdiaksesbdaribluarbolehbobjectnya
? Private:bmemberbhanyabbisabdiaksesbdaribmemberblainnyabdalambclassbdanbdarib
friendnya
? Protected:bsepertibprivate:btapibjugabbisabdibaksesbdaribmemberbdaribturunanbclassb
tersebut
Untukbmenentukanbjenisbñbjenisbaksesbinibdapatbjugabdibuatbsendiribdenganb
menuliskanbkeywordnya:bmasingbñbmasingbsesuaibdenganbnamanyaHbEefaultbdaribsebuahb
classbadalahbbersifatbprivateHbAontohJ
class(my_class({
((int(aW
((int(bW
((void(my_function(\int(arg~3(int(arg0f({
yydefinisi(fungsi
((}
}W
Jikabdefinisibdaribclassbsepertibdibatas:bmakabsemuabmembernyabbersifatbprivateHb
&edakanbdenganbcontohbdibbawahbiniJ
class(my_class({
((void(my_function(\int(arg~3(int(arg0f({
yydefinisi(fungsi
((}
((public:
((int(aW
((int(bW
}W
Eefinisibdibatasbbisabdiartikanbbahwabfungsibmy_functionbbersifatbprivateb
sedangkanbvariabelbabdanbbbyangbbersifatbpublicH
Constructor
Kegunaanbdaribconstructorbadalahbuntukbmelaksanakanbhalbñbhalbtertentubketikab
objectbdaribsebuahbclassbdideklarasikanHbNamabdaribconstructorbharusbsamabdenganbnamab
classnyaH
Destructor
EestructorbadalahbkebalikanbdaribconstructorHbKalaubconstructorbdipanggilbpadab
waktubobjectbdaribsuatubclassbdideklarasikan:bmakabdestructorbdipanggilbketikabobjectbdarib
classbtersebutbìdihancurkanî:bscopebpadabsebuahbfungsibsudahbberakhirb“misalnyabfungsib
tempatbobjectbitubdigunakanbtelahbsampaibpadabbatasbscopenya”HbEestructorbditandaib
denganbtandabì~îb“tilde”bdanbnamabdaribdestructorbharusbsamabdenganbnamabclassnyaH
Aonstructorbdanbdestructor:btidakbmengembalikanbnilaibapapunbjuga:bbahkanbvoidHb
Mengambilbcontohbdaribkodebyangbtelahbkitabgunakanbdibatas:bmakabcontohbdarib
constructorbdanbdestructorbadalahJ
=include(Ciostream>
using(namespace(stdW
=
KomunitasbeLearningbIlmuKomputerHAom
Aopyrightb©bO11BwO11=bIlmuKomputerHAom
class(my_class({
((((int(umurW
((((publicA
((((my_class}*intj;(yyconstructor
((((int(show_age\f({
((((((((return(umurW
((((}
((((~my_class*j;(yydestructor
((((
}W
my_classAAmy_class(\int(agef({
(((((yydefinisi
(((((umur(=(ageW
}
my_classAA~my_class\f({
((((yydefinisi
((((umur(=(!W
}
void(main(\f({
((((my_class(first\*&fW
((((cout(CC(first6show_age\f(CC(.\n.W
}
Tidak ada komentar:
Posting Komentar