Tapi tenang saja, belajar C++ itu tidak rugi kok.
Bahkan–menurut saya–belajar C++ itu menguntungkan. Karena dengan C++ kita bisa membuat berbagaimacam program.
Mari kita mulai Belajar....
1. Struktur Data, Array dan Pointer
A. Konsep Struktur Data
Struktuk data adalah sebuah bagian dari ilmu pemrograman dasar yang mempuyai karakteristik yang terkait dengan sifat dan cara penyimpanan sekaligus pengguna atau pengakses data. Struktuk data bertujuan agar cara mereprentsikan data dalam membuat program dapat dilakuian secara efesien dalam pengolahan di memori dan pengolahan penyimpanan dari program ke storage juga lebih mudah dilakukan.
B. Konsep Array
Array adalah kumpulan elemen-elemen data. Kumpulan elemen tersebut mempunyai susunan yang teratur. Jmlah elemen terbatas, dan semua elemen mempunyai tipe data yang sama. Jenis-jenis array :
1. Array Satu Dimensi
Setruktur array suatu dimensi dapat di deklarasikan dengan bentuk umum berupa: tipe_var nama_var [ukuran];
Dengan:
- Tipe_var: untuk menyatakan jenis elemen array (misalnya int,char,unsigned)
- Nama_var: untuk menyatakan nama variable yang dipakai
- Ukuran: untuk menyatakan jumlah maksimal elemen array.
Contoh : float nilai_ujian [5];
2. Array Dua Dimensi
Tipe data array dua dimensi bisa digunakan ntuk menyimpan, mengolah maupun menampilkan suatu data dalam bentuk table atau matriks. Untuk mendeklarasikan array agar dapat menyimpan data adalah :
Tipe_var_nama_var[ukuran1][ukuran2];
Dimana :
- Ukuran 1 menunjukkan jumlah /nomor baris.
- Ukuran 2 menunukan jumlah /nomor kolom.
Jumlah elemen yang di milki array dua dimensi dapat ditentukan dari hasil perkalian :
Ukuran1 X ukuran2.
Seperti halnya pada array satu dimensi, data array dua dimensi akan ditempatkan pada memori secara berurutan.
3. Array multidimensi/Dimensi Banyak
Array berdimensi banyak atau multidimensi terdiri dari array yang tidak terbatas hanya dua dimensi saja. Bentuk umum pendeklarasian array multi dimensi adalah : tipe_var nama_var [ukuran1][ukuran2]…[ukuran];
Contoh : int data_angka [3][6][6];
Yang merupan array tiga dimensi
C. Konsep Dasar Pointer
Pointer adalah sebuah variable yang berisi alamat variable yang lain. Satu pointer dimksudkan untuk menunjuk kesuatu alamat memori sehingga alamat dari suatu variable dapat diketahui dengan mudah. Deklarasi ponter :
Oprator pointer :
- Oprator ‘&’ ; untuk mendapatkan alamat memori operand/variable ponter.
- Oprator ‘*’ : untuk mengakses nilai data operand/variable pointer.
D. Contoh Program
1. Program Pangkat Dengan Array Dimensi Satu
#include <stdio.h>
#include <iostream>
#include <conio.h>
using namespace std;
int main(){
int square [100];
int i;
int k;
for(i=0; i<10; i++){
k=i+1;
square[i] =k*k;
printf("\n Pangkat dari %d adalah %d", k, square[i]);}
_getch();}
#include <stdio.h>
#include <iostream>
#include <conio.h>
using namespace std;
int main(void){
int v=7, *p;
p= &v;
cout<<"nilai v = "<<v;
cout<<endl;
cout<<endl;
cout<<"nilai *p = "<<*p;
cout<<endl;
cout<<endl;
cout<<"alamatnya = "<<p;
getch();}
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <conio.h>
#include <malloc.h>
using namespace std;
void p(void);
int *a, *b;
int main(){
p();}
void p(void){
a = (int *)malloc(sizeof(int));
b = (int *)malloc(sizeof(int));
*a=19;
*b=5;
a=b;
*b=8;
printf("alamat a = %x\t isi a = %d\n", a,*a);
printf("alamat b = %x\t isi b = %d\n", b,*b);
getch();}
#include <stdio.h>
#include <iostream>
#include <conio.h>
using namespace std;
void printArray(int [][3]);
int main(){
int matrik1[2][3] = {{1,2,3},{4,5,6}},matrik2[2][3]={1,2,3,4,5},matrik3[2][3]={{1,2},{4}};
printArray(matrik1);
printArray(matrik2);
printArray(matrik3);
getch();}
void printArray(int a[][3]){
int i,j;
for(i=0; i<=1; i++){
for (j=0; j<=2; j++)
printf("%d ", a[i][j]);
printf("\n");}}
2. Linked List (Senarai)
Linked
List adalah sejumlah objek atau elemen yang dihubungkan satu dengan lainya
sehingga membentuk suatu list. Sedangkan objek atau elemen itu sendiri adalah
merupakan gabungan beberapa data(variable) yang dijadikan satu kelompok atau structure atau record yang dibentuk dengan perintah struct. Untuk menggabungkan objek satu dengan lainya, diperlukan
paling tidak sebuah variable yang bertipe pointer. Syarat linked list adalah harus dapat diketahui alamat simpul pertama atau
biasa dipakai variable First/Start/Header.
Struktur dasar sebuah list seperti gambar berikut :
Istilah-istilah dalam linked list :
A.
Simpul
Simpul terdiri dari dua bagian yaitu
:
-
Bagian data
-
Bagian pointer yang menunjuk ke simpul
berikutnya
B.
First/Header
Variabel First/Header berisi alamat
(pointer)/acuan (refrence) yang menunjuk lokasi
simpul pertama linked list, digunakan
sebagai awal penelusuran linked list.
C.
Nill/Null
Tidak bernilai, digunakan untuk
menyatakan tidak mengacu ke manapun.
D.
Simpul Terakhir(Last)
Simpul terakhir linked list berarti tidak menunjuk
simpul berikutnya. Tidak terdapat alamat disimpan di field pointer di simpul terakhir.
Jenis-jenis linked list :
1. List kosong
List kosong hanya terdiri dari sebuah
penunjuk elemen yang berisi NULL(kosong), tidak meiliki satu buah elemen pun
sehingga hanya berupa penunjuk awal elemen berisi NULL.
2. List tunggal
List tunggal adalah list yang elemenya hanya menyimpan informasi elemen setelahnya (next), sehingga jalanya pengaksesan list hanya dapat dilakukan secara maju. List tunggal terbagi menjadi tiga jenis yaitu list tunggal dengan kepala (first), list tunggal dengan kepala (first) dan ekor (tail), serta list tunggal yang berputar.
3. List ganda
List ganda adalah sebuah list yang
elemenya menyimpan informasi elemen sebelumnya dan informasi elemen setelahnya,
sehingga proses penelusuran list dapat dilakukan secara maju dan mundur. List
ganda terbagi menjadi tiga jenis yaitu list ganda dengan kepala (first), list ganda dengan kepala (first) dan ekor (tail), serta list ganda yang berputar.
Operasi Dasar pada Lingked List :
IsEmpty
: Fungsi ini menentukan apakah linked list kosong atau tidak.
Size
: operasi untuk mengirim jumlah elemen di linked list.
Create
: operasi untuk penciptaan list baru yang kosong.
Insertfirst
: operasi untuk penyisipan simpul sebagai simpul pertama.
Insertafter
: operasi untuk penyisipan simpul setelah simpul tertentu.
Installaast
: operasi untuk penyisipan simpul setelah simpul terakhir.
Insertbefore
: operasi untuk penyisipan simpul sebelum simpul tertentu.
Deletefirst
: operasi penghapusan simpul pertama.
Deleteafter
: operasi untuk penghapusan setelah simpul tertentu.
Deletelast
: operasi penghapusan simpul terakhir.
#include
<iostream>
#include
<conio.h>
#include <stdio.h>
#include
<stdlib.h>
#include
<malloc.h>
using
namespace std;
typedef
struct nod{
int data;
struct nod *next;
} NOD,
*NODPTR;
void
Ciptasenarai(NODPTR *s){
*s = NULL;}
NODPTR
NodBaru(int m){
NODPTR n;
n = (NODPTR) malloc (sizeof(NOD));
if (n!=NULL){
n->data=m;
n->next=NULL;}
return n;}
void
SisiSeranai(NODPTR *s, NODPTR t, NODPTR p){
if(p==NULL){
t->next=*s;
*s=t;}
else{
t->next=p->next;
p->next=t;}}
void CetakSeranai(NODPTR
s){
NODPTR ps;
for(ps=s; ps!=NULL; ps=ps->next)
printf("%d --> ",ps
->data);
printf("NULL \n");}
int main(){
NODPTR pel;
NODPTR n;
Ciptasenarai(&pel);
n=NodBaru(55);
SisiSeranai(&pel, n, NULL);
n=NodBaru(75);
SisiSeranai(&pel, n, NULL);
CetakSeranai(pel);
getch();}
3. STACK (Tumpukan)
Stack adalah kumpulan
elemen-elemen yang tersimpan dalam suatu
tumpukan. Aturan penyisipan dan penghapusan elemennya tertentu:
-
Penyisipan selalu dilakukan ”di atas” TOP
-
Penghapusan selalu dilakukan pada TOP
Karena aturan
penyisipan dan penghapusan semacam itu, TOP adalah satu-satunya alamat tempat
terjadi operasi, elemen yang ditambahkan paling akhir akan menjadi elemen yang
akan dihapus. Dikatakan bahwa elemen Stack tersusun secara LIFO (Last In First Out).
Seperti halnya
jika kita mempunyai sebuah tumpukan buku, agar tumpukan buku itu tidak ambruk
ketika kita mengambil sebuah buku di dalam tumpukan itu maka harus diambil satu
per satu dari tumpukan yang paling atas dari tumpukan.
Perhatikan bahwa
dengan definisi semaacam ini, representasi tabel sangat tepat untuk mewakili
stack, karena operasi penambahan dan pengurangan hanya dilakukan disalah satu
ujung tabel.
Beberapa contoh
penggunaan stack adalah pemanggilan prosedur, perhitungan ekspresi aritmatika,
rekursifitas, backtracking, penanganan interupsi, dan lain-lain. Karakteristik
penting stack sebagai berikut:
1.
Elemen stack
yaitu item-item data di elemen stack
2.
TOP (elemen puncak dari stack)
3.
Jumlah elemen pada stack
4.
Status/kondisi stack,
yaitu :
-
Penuh
Bila elemen di tumpukan mencapai kapasitas maksimum
tumpukan. Pada kondisi ini, tidak mungkin dilakukan penambahan ke tumpukan.
Penambahan di elemen menyebabkan
kondisi kesalahan Overflow.
-
Kosong
Bila tidak ada elemen tumpukan. Pada
kondisi ini, tidak mungkin dilakukan pengambilan elemen tumpukan. Pengambilan
elemen menyebabkan kondisi kesalahan Underflow.
Stack memiliki operasi-operasi
pokok sebagai berikut :
Push : Untuk menambahka item pada tumpukan paling atas.
void Push (ItemType x, Stack *S)
{
If(Full
(S))
Printf(“Stack
FULL”);
Else
{
--(S->Count);
x=s->Item(s->Count);
}
}
Clear :Untuk mengosongkan stack
Void
intializeStack (Stack S)
{
S->Count=0;
}
IsEmpty
: Untuk memeriksa apakah stack kosong
Int
Empty (Stack *S)
{
Return(S->Count==0);
}
IsFull : Untuk memeriksa apakah stack sudah penuh
Int
Full (Stack S)
{
return
(S->Count==MAXSTACK);
}
Representasi stack:
-
Representasi statis
Stack dengan representasi statis biasanya diimplementasikan dengan menggunakan array. Sebuah array memiliki tempat yang dialokasikan diawal sehingga sebuah elemen yang dimasukkan dalam sebuah array terbatas pada tempat yang ada pada array. Karena menggunakan array maka stack dengan representasi statis dalam mengalami kondisi elemen penuh . Ilustrasi stack dengan representasi statis dapat dilihat pada gambar 3.2 :
-
Representasi dinamis
Stack dengan representasi dinamis
biasanya diimplementasikan dengan menggunakan pointer yang menunjuk pada
elemen-elemen yang dialokasikan pada memori. Ilustrasi stack dengan
representasi dinamis dapat dilihat pada gambar 3.3 :
Karena semua operasi pada sebuah stack
diawali dengan elemen yang paling atas maka jika menggunakan representasi
dinamis saat elemen ditambahkan akan
menggunakan penambahan elemen pada awal stack (addfirst) dan saat pengambilan atau penghapusan elemen menggunakan
penghapusan di awal stack (deffirst).
Contoh Program
1. Program Stack
#include
<stdio.h>
#include
<conio.h>
#include
<iostream>
#define
MAXSTACK 3
typedef
int itemType;
typedef
struct{
int item [MAXSTACK];
int jml;
}
Stack;
void
init(Stack *s){
s->jml=0;}
int
kosong(Stack *s){
return (s->jml==0);}
int
penuh(Stack *s){
return (s->jml==MAXSTACK);}
void
isi(itemType x, Stack *s){
if(penuh(s))
printf("\nMAAF!!! Data
PENUH\n");
else{
s->item[s->jml]=x;
++(s->jml);}}
void
ambil(Stack *s, itemType *x){
if(kosong(s))
printf("\nMAAF Data Kosong\n");
else{
--(s->jml);
*x=s->item[s->jml];
s->item[s->jml]=0;
printf("\Data %i Berhasil
Diambil\n",*x);}}
void
tampil(Stack *s){
if(kosong(s))
printf("\Maaf Data Masih
Kosong\n");
else
printf("\n");
for(int
i=s->jml-1;i>=0;i--){
printf("Data:
%d\n",s->item[i]);}}
void
hapus(Stack *s){
s->jml=0;
printf("\nSemua Data Berhasil
Dihapus\n");}
int
main(){
int pil;
Stack tumpukan;
itemType data;
init(&tumpukan);
do{
printf("\nMENU: \n 1. Isi (Data
Angka)\n 2. Ambil\n 3. Lihat\n 4. Hapus (Hapus Semua Data)\n 5.
Keluar\n");
printf("\n");
printf("Masukkan Pilihan :
"); scanf("%i",&pil);
switch(pil){
case 1:
printf("\nMasukkan
Data Angka : "); scanf("%i",&data);;
isi(data,&tumpukan);
break;
case 2:
ambil(&tumpukan,&data);
break;
case 3 :
tampil(&tumpukan);
break;
case 4 :
hapus(&tumpukan);
break;}
}while(pil!=5);
getch();}
4. QUEUN (Antrian)
Antrian adalah salah satu kumpulan data yang
penambahan elemennya hanya bisa dilakukan pada suatu ujung (disebut sisi
belakang atau REAR), dan penghapusan atau pengambilan elemen dilakukan lewat
ujung yang lain (disebut sisi depan atau front).prinsipyang digunakan dalam
antrian ini adalah FIFO (First in first
out) yaitu elemen yang pertama kali masuk akan keluar pertama kalinya.
Penggunaanantian antara lain simulasi antrian di dunia nyata (antrian pembelian tiket),sistem jaringan komputer (pemrosesan banyak paket yang datang dari banyak koneksi pada suatu host, bridge, gateway),dan lain-lain.
Karakteristik penting antrian sebagai
berikut:
Elemen antrian yaitu item-item data
terdapat dalam antrian.
A.
Heat/font
(elemen terdepan dalam antrian).
B.
Tail/rear
(elemen terakhir antrian).
C.
Jumlah
antrian pada antrian (count).
D.
Status/kondisi
antrian, ada dua yaitu:
-
Penuh
Bila elemen pada antrian mencapai
kapasitas maksimum antrian. Pada kondisi ini, tidak mungkin dilakuakan
penambahan ke antrian. Penambahan di elemen menyebabkan kondisi kesalahan
overflow.
-
Kosong
Bila tidak ada elemen antrian. Pada kondisi ini,
tidak mungkin dilakuakan pengambilan elemen antrian. Pengambilan elemen
menyebabkan kondisi kesalahan underflow.
Operasi-operasi pokok pada antrian diantaranya adalah:
1.
Create
→ Membuat antrian baru.
NOEL(CREATE(Q)) = 0
FRONT(CREATE(Q)) = tidak terdefinisi
REAR(CREATE(Q)) = tidak terdefinisi
2.
IsEmpety
→ Untuk memeriksa apakah Antrian sudah penuh atau belum.
ISEMPETY(Q) = True, jika Q adalah queue kosong.
3.
IsFull→mengecek
apakah Antrian sudah penuh atau belum.
ISFULL(Q) = True, jika Qadalah queue penuh.
4.
Enqueue/Insert
→ menambahkan elemen ke dalam Antrian, penambahan elemen selaluditambahkan di
elemen paling belakang.
REAR(INSERT(A,Q)) =A
ISEMPETY (INSERT(A,Q)) FALSE
Algoritma QINSERT :
A. IF FRONT = 1 AND REAR = N, OR IF FRONT =
REAR + 1, THEN OVERFLOW, RETUN
B. IF FRONT := NULL, THEN
SET FRONT :=
1 AND REAR := 1
ELSE IF REAR
= N, THEN
SET REAR := 1
ELSE
SET REAR :=
REAR+1
C. SET QUEUE[REAR] := ITEM
D. RETURN
5.
Dequeue/Remove
→ untuk menghapus elemen terdepan/pertama dari Antrian
Algoritma QDELETE:
A. IF FRONT := NULL, THEN UNDERFLOW, RETURN
B. SET ITEM := QUEUE[FRONT]
C. [FIND NEW VALUE OF FRONT]
IF FRONT =
REAR, THEN
SET FRONT =
REAR, THEN SET FRONT := NULL AND REAR : NULL
ELSE IF FRONT
= N, THEN
SET FRONT =1
ELSE
SET FRONT :=
FRONT+1
D. RETURN
Representasi queue :
-
Representasi
statis
Queue dengan representasi statis biasasnya
diimplementasikan dengan menngunakan array. Sebuah array memiliki tempat yang
di alokasikan diawal sehingga sebuah elemen yang dimasukkan dalam sebuah array
terbatas pada tempat yang ada pada array. Karena menggunakan array maka queue
representasi statis dalam mengalami kondisi elemen penuh. Ilustrasi queue
dengan representasi statis dapat dilihat pada gambar:
-
Representasi
dinamis
Queue dengan representasi dinamis biasanya diimplementasikan dengan
menggunakan pointer yang menunjuk pada elemen –elemen yang dialokasikan pada
memori. Ilustrasi queue representasi dinamis dapat dilihat pada gambar :
Contoh Program
1. Program Queue Statis:
Contoh Program
1. Program Queue Statis:
#include <iostream>
#include <queue>
#include <conio.h>
using namespace std;
int main(){
queue<int>que;
que.push(10);
que.push(2);
que.push(3);
cout<<"Paling depan :
"<<que.front()<<endl;
cout<<"Paling
Belakang : "<<que.back()<<endl<<endl;
que.pop();
cout<<"10 sudah
dikeluarkan"<<endl;
cout<<"paling depan :
"<<que.front()<<endl;
cout<<"paling belakang
: "<<que.back()<<endl<<endl;
que.push(6);
cout<<"Angka 6
diamsukkan"<<endl;
cout<<"paling depan :
"<<que.front()<<endl;
cout<<"paling belakang :
"<<que.back()<<endl;
5. Rekursif
Fungsi rekursif adalah suatu fungsi yang memanggil dirinya sendiri, artinya fungsi tersebut dipanggil di dalam tubuh fungsi itu sendiri. Contoh menghitung nilai faktorial. Rekursif sangat memudahkan untuk memecahkan permasalahan yang kompleks. Sifat-sifat rekursif:
Contoh Program
Fungsi rekursif adalah suatu fungsi yang memanggil dirinya sendiri, artinya fungsi tersebut dipanggil di dalam tubuh fungsi itu sendiri. Contoh menghitung nilai faktorial. Rekursif sangat memudahkan untuk memecahkan permasalahan yang kompleks. Sifat-sifat rekursif:
-
Dapat
digunakan ketika inti dari masalah terjadi
berulang kali.
-
Sedikit
lebih efisien dari iterasi tapi lebih elegan.
-
Method-methodnya
dimungkinkan untuk memanggil dirinya sendiri.
Data yang berada dalam method tersebut seperti argument disimpan sementara
ke dalam stack sampai method pemanggilnya diselesaikan.
#include
<iostream>
#include
<conio.h>
using
namespace std;
void odd (int
a);
void even(int
a);
int
main(void){
int i;
do {
cout<<"Masukkan bilangan
1-9 (0 untuk keluar) : ";
cin>>i;
odd(i);
cout<<endl;}
while(i!=0);
_getch();}
void odd(int
a){
if((a%2) !=0) cout<<"Bilangan
GANJIL \n";
else
even (a);}
void even(int
a){
if((a%2) ==0) cout<<"Bilangan
GENAP \n";
else
odd (a);}
6. Sorting (Pengurutan)
Pengurutan data (sorting) didefinisikan sebagai suatu proses untuk menyusun
kembali himpunan obyek menggunakan aturan tertentu. Ada dua macam urutan yang
biasa digunakan dalam proses pengurutan yaitu:
- Urutan
naik (ascending) yaitu dari data yang mempunyai nilai paling kecil sampai
paling besar.
- Urutan
turun (descending) yaitu dari data yang mempunyai nilai paling besar sampai
paling kecil.
Contoh : data bilangan 5,2,6, dan 4 dapat diurutkan naik menjadi 2,4,5,6
atau diurutkan turun menjadi 6,5,4,2. Pada data yang bertipe char,nilai data
dikatakan lebih kecil atau lebih besar dari yang lain didasarkan pada urutan
relatif (collating sequence) seperti dinyatakan dalam tabel ASCII. Keuntungan
dari data yang sudah dalam keadaan terurut yaitu :
A. Data mudah dicari, mudah untuk dibetulkan,
dihapus, disisipi atau digabungkan. Dalam keadaan terurutkan, kita mudah
melakukan pengecekan apakah ada data yang hilang.
B. Misalnya kamus bahasa, buku telepon.
C. Mempercepat proses pencarian data yang
harus dilakukan berulang kali.
Contoh Program
1. Program ascending dengan menggunakan
bubble sort
#include <iostream>
#include <conio.h>
#include <iomanip>
using namespace std;
int main(void){
int
dataku[] = {5, 34, 32, 25, 75, 42, 2};
int
adaPertukaran;
int n;
cout<<"Data
Belum Diurutkan : \n";
for
(int ctr =0; ctr<7; ctr++){
cout
<< setw(3) << dataku[ctr];}
cout
<< endl << endl;
//PENGURUTAN
do {
adaPertukaran
= 0;
for
(int i = 0; i < 7-1; i++){
if
(dataku[i+1] < dataku[i]){
n
= dataku[i];
dataku[i]
= dataku[i+1];
dataku[i+1]
= n;
adaPertukaran
= 1;} }
}while
(adaPertukaran == 1);
//MENAMPILKAN
HASIL PENGURUTAN
cout
<< "Data Setelah Diurutkan :
\n";
cout
<< dataku[i];
cout
<< " ";}
getch();}


















No comments:
Post a Comment