Showing posts with label algoritma sd 1. Show all posts
Showing posts with label algoritma sd 1. Show all posts

Thursday, 24 February 2011

Dasar Teori

Antrian (Queue) dapat diartikan sebagai suatu kumpulan data yang seolah-olah
terlihat seperti ada data yang diletakkan di sebelah data yang lain seperti pada gambar 01.
Pada gambar, data masuk melalui lorong di sebelah kanan dan masuk dari terowongan
sebelah kiri. Hal ini membuat antrian bersifat FIFO (First In First Out), beda dengan
stack yang berciri LIFO.



Antrian dapat dibuat baik dengan array maupun dengan struct. Pada pembuatan
antrian dengan array, antrian yang disajikan bersifat statis. Ini disebabkan oleh jumlah
maksimal array sudah ditentukan sejak deklarasi awal.
QUEUE DENGAN LINIEAR ARRAY
-Terdapat satu buah pintu masuk di suatu ujung dan satu buah pintu keluar diujung Satunya
-Sehingga membutuhkan variabel Head dan Tail


Create()
•Untuk menciptakan dan menginisialisasi Queue

•Dengan cara membuat Head dan Tail = -1

IsEmpty()
•Untuk memeriksa apakah Antrian sudah penuh atau belum

•Dengan cara memeriksa nilai Tail, jika Tail = -1 maka empty

•Kita tidak memeriksa Head, karena Head adalah tanda untuk kepala

•antrian (elemen pertama dalam antrian) yang tidak akan berubah-ubah
Pergerakan pada Antrian terjadi dengan penambahan elemen Antrian kebelakang, yaitu menggunakan nilai Tail



IsFull()
  • Untuk mengecek apakah Antrian sudah penuh atau belum
  • Dengan cara mengecek nilai Tail, jika Tail >= MAX-1 (karena MAX-1 adalah batas elemen array pada C) berarti sudah penuh


Enqueue(data)
  • Untuk menambahkan elemen ke dalam Antrian, penambahan elemen selalu ditambahkan di elemen paling belakang
  • Penambahan elemen selalu menggerakan variabel Tail dengan cara increment counter Tail



  • Untuk menghapus elemen-elemen Antrian dengan cara membuat Tail dan Head = -1
  • Penghapusan elemen-elemen Antrian sebenarnya tidak menghapus arraynya, namun hanya mengeset indeks pengaksesan-nya ke nilai -1 sehingga elemenelemen Antrian tidak lagi terbaca



Perbedaan antara stack dan queue terdapat pada aturan penambahan dan
penghapusan elemen. Pada stack, operasi penambahan dan penghapusan elemen
dilakukan di satu ujung. Elemen yang terakhir kali dimasukkan akan berada paling dekat
dengan ujung atau dianggap paling atas sehingga pada operasi penghapusan, elemen
teratas tersebut akan dihapus paling awal, sifat demikian dikenal dengan LIFO. Pada
queue, operasi tersebut dilakukan di tempat yang berbeda. Penambahan elemen selalu
dilakukan melalui salah satu ujung, menempati posisi di belakang elemen-elemen yang
sudah masuk sebelumnya atau menjadi elemen paling belakang. Sedangkan penghapusan
elemen dilakukan di ujung yang berbeda, yaitu pada posisi elemen yang masuk paling
awal atau elemen terdepan. Sifat yang demikian dikenal dengan FIFO.

Contoh Program:
#include <iostream.h>
#include <stdio.h>
#include <conio.h>
#define MAX 10
typedef struct
{
int data[MAX];
int head;
int tail;
} Queue;
Queue antrian;
void Create()
{
antrian.head=antrian.tail=-1;
}
int IsEmpty()
{
if(antrian.tail==-1)
return 1;
else
return 0;
}
int IsFull()
{
if(antrian.tail==MAX-1) return 1;
else return 0;
}
void Enqueue(int data)
{
if(IsEmpty()==1)
{
antrian.head=antrian.tail=0;
antrian.data[antrian.tail]=data;
cout<<"Data "<<antrian.data[antrian.tail]<<"
Masuk!!";
}
else if(IsFull()==0)
{
antrian.tail++;
antrian.data[antrian.tail]=data;
cout<<"Data "<<antrian.data[antrian.tail]<<"
Masuk!!";
}
else if (IsFull() == 1)
{
cout<<"Ruangan Penuh!!"<<endl;
cout<<data<<" Ga Bisa Masuk!!";
}
}
void Dequeue()
{
int i;
int e = antrian.data[antrian.head];
if (antrian.tail == -1)
{
cout<<"Ga Ada Antrian... Data Kosong"<<endl;
}
else
{
for(i=antrian.head;i<=antrian.tail-1;i++)
{
antrian.data[i] = antrian.data[i+1];
}
antrian.tail--;
cout<<"Data yang Keluar lebih dulu = "<<e<<endl;
}
}
void Clear()
{
antrian.head=antrian.tail=-1;
cout<<"Duh Lega, Ruangan Jadi Ga Sumpek...."<<endl;
cout<<"Data Clear...";
}
void Tampil()
{
if(IsEmpty()==0)
{
cout<<"Data Dalam Antrian"<<endl;
cout<<"==========================="<<endl;
cout<<endl;
for(int i=antrian.head;i<=antrian.tail;i++)
{
cout<<"| "<<antrian.data[i]<<" |";
}
}
else cout<<"Ga Ada Antrian... Data Kosong";
}
void main()
{
int pil;
int data;
Create();
do
{
clrscr();
cout<<"Implementasi Antrian dengan Struct"<<endl;
cout<<"=================================="<<endl;
cout<<endl;
cout<<"1. Enqueue(Push)"<<endl;
cout<<"2. Dequeue(PoP)"<<endl;
cout<<"3. Print"<<endl;
cout<<"4. Clear"<<endl;
cout<<"5. Exit"<<endl;
cout<<"Pilihan Anda= "; cin>>pil;
switch(pil)
{
case 1:
{
cout<<endl;
cout<<"Data = "; cin>>data;
Enqueue(data);
break;
}
case 2:
{
cout<<endl;
Dequeue();
break;
}
case 3:
{
cout<<endl;
Tampil();
break;
}
case 4:
{
cout<<endl;
Clear();
break;
}
}
getch();
} while(pil!=5);
}





Dasar Teori

STACK atau TUMPUKAN adalah suatu struktur data yang seolah-olah terlihat
•Seperti data yang tersusun secara ‘menumpuk’, dimana ada data yang terletak
diatas data yang lainnya.
•Bersifat LIFO (Last In First Out), berarti data yang masuk terakhir akan keluar
pertama.
•Operasi pada Stack :

  1. IsFull :mengecek apakah STACK sudah penuh
  2. IsEmpty : mengecek apakah STACK sudah kosong
  3. Push :menambah data pada STACK pada tumpukan paling atas
  4. Pop :mengambil data pada STACK pada tumpukan paling atas
  5. Print :mencetak semua data dalam tumpukan




Contohnya, karena kita menumpuk Compo di posisi terakhir, maka Compo akan menjadi
elemen teratas dalam tumpukan. Sebaliknya, karena kita menumpuk Televisi pada saat
pertama kali, maka elemen Televisi menjadi elemen terbawah dari tumpukan. Dan jika
kita mengambil elemen dari tumpukan, maka secara otomatis akan terambil elemen
teratas, yaitu Compo juga.


Menambahkan sebuah item pada posisi paling atas dari sebuah tumpukan


Menghapus item yang terakhir ditambahkan ke tumpukan
Implementation Stack with Array of Struct
- Definisikan Stack dengan menggunakan struct
- Definisikan MAX_STACK untuk maksimum isi stack
- Buatlah variabel array data sebagai implementasi stack secara nyata
- Deklarasikan operasi-operasi/function di atas dan buat implemetasinya
Contoh program:
#include <stdio.h>
#include <conio.h>
#include <iostream.h>
//deklarasi 'STACK' dengan struct dan array
struct STACK
{
int data[5];
int atas;
};
//deklarasi variabel 'tumpuk' dari struct
STACK tumpuk;
void main()
{
clrscr();
int pilihan,baru,i;
//inisialisasi awal
tumpuk.atas=-1;
do
{
clrscr();
cout<<"1.Push Data"<<endl;
cout<<"2.Pop Data"<<endl;
cout<<"3.Print Data"<<endl;
cout<<endl;
cout<<"Pilihan = ";
cin>>pilihan;
switch(pilihan)
{
case 1:
{
if(tumpuk.atas==5-1)
{
cout<<"Tumpukan penuh";
getch();
}
else
{
cout<<"Data yang akan di-push = ";
cin>>baru;
tumpuk.atas++;
tumpuk.data[tumpuk.atas]=baru;
}
break;
}
case 2:
{
if(tumpuk.atas==-1)
{
cout<<"Tumpukan kosong";
getch();
}
else
{
cout<<"Data yang akan di-pop =
"<<tumpuk.data[tumpuk.atas]<<endl;
tumpuk.atas--;
getch();
}
break;
}
case 3:
{
if(tumpuk.atas==-1)
{
cout<<"Tumpukan kosong"<<endl;
getch();
}
else
{
cout<<"Data = "<<endl;
for(i=0; i<=tumpuk.atas; i++)
{
cout<<tumpuk.data[i]<<" ";
}
getch();
}
break;
}
default:
{
cout<<" Tidak ada dalam pilihan "<<endl;
}
}
}
while( pilihan >=1 && pilihan <= 3 );
getch();}






Dasar Teori

Pointer sesungguhnya berisi alamat dari suatu data, bukan data sebagaimana pada
variable yang sudah anda kenal. Pointer (variabel penunjuk) adalah suatu variabel yang
berisi alamat memori dari suatu variabel lain. Alamat ini merupakan lokasi dari obyek
lain (biasanya variabel lain) di dalam memori. Contoh, jika sebuah variabel berisi alamat
dari variabel lain, variabel pertama dikatakan menunjuk ke variabel kedua.
Operator Pointer ada dua, yaitu :

1. Operator & (Dereference Operator)
Operator & menghasilkan alamat dari operandnya.

Setiap variabel yang dideklarasikan, disimpan dalam sebuah lokasi

memori dan pengguna biasanya tidak mengetahui di alamat mana data
tersebut disimpan. Dalam C++, untuk mengetahui alamat tempat
penyimpanan data, dapat digunakan tanda ampersand(&) yang dapat
diartikan “alamat”. Contoh :
Bil1 = &Bil2;
dibaca: isi variabel bil1 sama dengan alamat bil2

2. Operator * (Reference Operator)
Operator * menghasilkan nilai yang berada pada sebuah alamat.

Penggunaan operator ini, berarti mengakses nilai sebuah alamat yang

ditunjuk oleh variabel pointer. Contoh :
Bil1 = *Bil2;
dibaca: bil1 sama dengan nilai yang ditunjuk oleh bil2
Mendefinisikan Variabel Pointer
Suatu variabel pointer didefinisikan dengan bentuk sebagai berikut:

tipe_data *nama_variabel;
tipe_data dapat berupa sebarang tipe seperti halnya pada pendefinisian variabel

non-pointer.
nama_variabel adalah nama variabel pointer.

Contoh :
int * pint ; // pointer ke int
char *pch; // pointer ke char
char *pch1, *pch2;

Guided 1.

//contoh program menggunakan pointer
#include
#include
void main()
{
int x, y; // x dan y bertipe int
int *px; // px pointer yang menunjuk objek
clrscr();
x = 87;
px = &x; // px berisi alamat dari x
y = *px; // y berisi nilai yang ditunjuk px
cout<<"Alamat x pd Memori = "<<&x<<<"Isi px = "<<<<"Isi x = "<<<<"Nilai yang ditunjuk oleh px = "<<*px<<<"Alamat y pd Memori = "<<&y<<<"Nilai y = "<<

Guided 2.
//mengubah nilai melalui suatu pointer
#include
#include
void main()
{
int vint = 55; //variabel bukan pointer
int *pint; //variabel pointer
clrscr();
cout<<"vint semula = "<<<<"vint sekarang = "<<

Penjelasan :
Pernyataan *pint = 69;
Menyebabkan yang ditunjuk oleh pint (yaitu vint) berubah menjadi 69

Guided 3.
//operasi aritmatika pada pointer
#include
#include
void main()
{ int nilai[3], *penunjuk;
clrscr();
nilai[0] = 125;
nilai[1] = 345;
nilai[2] = 750;
penunjuk = &nilai[0];
cout<<"Nilai "<<*penunjuk<<" ada di alamat memori "<<<<"Nilai "<<*(penunjuk+1)<<" ada di alamat memori "<<(penunjuk+1)<<<"Nilai "<<*(penunjuk+2)<<" ada di alamat memori "<<(penunjuk+2)<


1. Pointer dan Array

Pointer dan array mempunyai hubungan yang dekat. Secara internal array juga
menyatakan alamat. Misalnya didefinisikan :
char data1[] = {”A”, ”I”, ”U”, “E”, “O”};
dan :
char *pdata;
agar pdata menunjuk ke array, diperlukan pernyataan berupa :
pdata = data1;
Perhatikan dengan seksama program diatas. Tidak ada tanda & di depan data1.
padahal kita ketahui untuk mengakses pointer memerlukan format berikut:
Ptr = &variabel;
Ini disebabkan array sebenarnya sudah menyatakan alamat. Oleh karena itu tanda
& tidak diperlukan. Tanda & digunakan jika variabel tidak berupa array.

//guided 1
//mengakses elemen array via pointer
#include
#include
void main()
{
char data1[] = {'A', 'I', 'U', 'E', 'O'};
clrscr();
char *pdata;
pdata = data1; // pdata menunjuk ke array
for (int i=0; i<5;>

Seluruh elemen array data1 dapat ditampilkan juga melalui pernyataan :
for (int i=0; i<5;><<" "; }

Memberi nilai pada array
//memberi nilai suatu data array
#include
#include
int main()
{
int x[5], *p, k;
clrscr();
p = x;
x[0] = 5; // x[0] diisi dengan 5 sehingga
x[0] = 5
x[1] = x[0]; // x[1] diisi dengan x[0]
sehingga x[1] = 5
x[2] = *p + 2; // x[2] diisi dengan x[0] + 2
sehingga x[2] = 7
x[3] = *(p+1)-3; // x[3] diisi dengan x[1] - 3
sehingga x[3] = 2
x[4] = *(x + 2); // x[4] diisi dengan x[2]
sehingga x[4] = 7
cout<<"Array Stelah diisi = "<<<5;><<"] = "<<


2. Pointer dan String

//pointer menunjuk ke string
#include
#include
void main()
{
clrscr();
char *ptr = "STIKOM";
cout<<


Pada contoh diatas :
char *ptr = "STIKOM";
akan menyebabkan C++ :
Mengalokasikan ptr sebagai variable pointer yang menunjuk ke data

bertipe char dan menempatkan konstanta string “STIKOM” ke suatu
lokasi di memori komputer
Kemudian ptr akan menunjuk ke lokasi string “STIKOM”

Pernyataan di atas menyerupai pernyataan :
Char vptr[] = ”STIKOM”;
Perbedaanya :
ptr adalah pointer yang dengan mudah dapat diatur agar menunjuk ke data

string
vptr adalah array yang menyatakan alamat yang konstan, tidak dapat

dirubah. Yang dapat diubah adalah elemen array-nya.
Perbedaan ini ditunjukkan oleh program berikut :

//pointer menunjuk ke string
#include
#include
void main()
{
clrscr();
char *ptr = "STIKOM";
char vptr[] = "STIKOM";
cout<<"vptr = "<<<<"ptr = "<<<<"ptr sekarang = "<


3. Pointer dan Function

#include
#include
void proses(char *);
void main()
{
char string[] = "characters";
clrscr();
cout<<"String sebelum proses adalah "<<<<"String setelah proses adalah "<<= 'a' && *s <= 'z' ) *s -= 32; ++s; } }






Dasar Teori

Struktur merupakan suatu tipe data yang merupakan kumpulan dari tipe
data lainnya. Struktur terdiri dari data yang disebut suatu field. Filed – filed dapat
berupa tipe data sederhana maupun tipe data turunan, macam tipenya juga tidak
dibatasi, bahkan di dalam struktur juga boleh terdapat tipe data struktur.
Struktur sangat erat hubungannya dengan pola penyimpanan dalam file,
sehingga struktur biasanya digunakan untuk membuat program yang berhubungan
dengan file. File adalah kumpulan dari banyak struktur, sedangkan struktur adalah
kumpulan dari filed – filed.
Dalam C++ untuk membuat tipe struktur menggunakan perintah
struct.
struct nama_struktur
{
tipe nama_field1;
tipe nama_field2;
tipe nama_field3;
.......
};
nama_struktur nama_variabel
struct nama_struktur
{
tipe nama_field1;
tipe nama_field2;
tipe nama_field3;
.......
}nama_variabel;

Untuk mengakses fild – field yang menjadi truktur digunakan tanda titik ( . )
yang mengikuti variabel bertipe struktur. Selain berisi field dengan tipe data yang
berbeda, dalam struktur juga dapat berisi field yang bertipe struktur juga.
Contoh :
struct nilai
{
char pelajaran[5][20];
int nilai[5];
};
struct siswa
{
int nomor;
char nama[20];
nilai nilai_pelajaran;
};

siswa sw;
untuk mengakses nomor siswa gunakan sw.nomor
untuk mengakses nilai siswa gunakan sw.nilai_pelajaran.nilai[1]

III. Latihan

Guided 1
//program guided1.cpp
#include
#include
struct titik {
int absis;
int ordinat;
};
void tampil(titik masuk);
void main()
{
titik test;
clrscr();
cout<<"masukkan koordinat x: "; cin>>test.absis;
cout<<"masukkan koordinat y: "; cin>>test.ordinat;
tampil(test);
getch();
}
void tampil(titik temp)
{
cout<<"koordinat titik sekarang adalah : " <<<","<


Guided 2
//program guided2
#include
#include
struct persegi{
int sisi;
int luas;
};
void tampil(persegi p1);
int luasPersegi(int s);
void main()
{
persegi segi4;
clrscr();
cout<<"masukkan sisi : "; cin>>segi4.sisi;
segi4.luas = luasPersegi(segi4.sisi);
tampil(segi4);
getch();
}

dengan nilai 0 – 50 termasuk dalam kategori less. Siswa dengan nilai 51 – 70
termasuk dalam kategori pass. Siswa dengan nilai 71 – 85 termasuk dalam
kategori good. Siswa dengan nilai 86 – 100 termasuk dalam kategori excellent.
Unguided 2
Buatlah sebuah program menggunakan struct yang menangani kasus penentuan
siswa terpandai pada sebuah kelompok belajar. Kelompok belajar tersebut terdiri
dari 5 orang. Data siswa yang dicatat antara lain NIM, nama dan nilai. Siswa
dengan nilai tertinggi adalah siswa terpandai.

void tampil(persegi p1)
{
cout<<"luas persegi dengan sisi : "<<<" adalah "<
}
int luasPersegi(int s)
{
return (s*s);
}
Tambahkan fungsi untuk menghitung keliling pada guided2.
Unguided 1
Buatlah sebuah program menggunakan struct yang menangani kasus penentuan
predikat siswa apakah siswa tersebut termasuk dalam kategori excellent, good,
pass atau less. Data siswa yang dicatat antara lain NIM, nama dan nilai. Siswa







Dasar Teori

Larik merupakan sekumpulan data yang mempunyai nama dan tipe yang
sama, Larik disebut juga variabel berindeks. Nilai suatu data dalam larik ditentukan
oleh nama dan indeksnya. Larik banyak digunakan pada operasi yang melibatkan
indeks seperti pada statistik
Tipe data larik dapat berupa larik satu dimensi (1D), dua dimensi (2D),
tiga dimensi (3D) atau banyak dimensi. Cara pendeklarasiannya dalam bahasa C++,
yaitu :
Larik satu dimensi :

Tipe_larik nama_larik[ukuran]
Contoh : double larik_1[10]
Larik dua dimensi :

Tipe_larik nama_larik[ukuran1][ukuran2]
Contoh : int larik_2[10][10]
Larik tiga dimensi :

Tipe_larik nama_larik[ukuran1][ukuran2][ukuran3]
Contoh : float larik_3[10][10][10]

Larik dalam bahasa C++ tidak dimulai dari indeks satu, tetapi dimulai
dari indeks 0 (nol). Misalnya dideklarasikan suatu larik satu dimensi : int x[3]
berarti larik yang terjadi adalah : x[0], x[1], x[2], x[3].
Memberi Nilai Pada larik
Untuk memberi nilai pada larik dapat dilakukan dengan mengakses indeksnya,
misal :
larik_1[0] = 10.0;
larik_1[1] = 20.0;
Selain itu, memberi nilai pada larik juga dapat dilakukan dnegan menggunakan
struktur perulangan for yang mana jumlah perulangan yang trjadi disesuaikan
dengan ukuran larik. Misal :
for (int i=0;i<10;i++) i="0;i<10;i++)" k="0;k<5;k++)">
cin>>data[k];
}
//tampil data array
for (int j=0;j<5;j++)>
}
getch();
}

2. Guided 2
//program guided 2
#include "iostream.h"
#include "conio.h"
void main()
{
int data[5];
int rata, total = 0;
//input data ke array
for (int k=0;k<5;k++)>
cin>>data[k];
}
//menghitung total nilai pada array
for (int j=0;j<5;j++) total =" total" rata =" total" array = "<< getch(); } 3. Guided 3 //program guided 3 #include " total =" 0;" k="0;k<3;k++)" j="0;j<3;j++)">
cin>>data[k][j];
}
}
//menghitung total nilai pada array
for (int m=0;m<3;m++) n="0;n<3;n++)">
total = total + data[m][n];
}
cout<<""< } //menghitung rata - rata rata = total / 3; cout<<"rata - rata data pada array = "<<>>nomor;
cout<<"masukkan alamat : "; cin>>alamat;
//cara memberi nilai pada string
strcpy(alamat_lain, alamat);
cout<<"Data yang dimasukkan :"<
cout<<"nama : "<<
cout<<"nomor : "<<
cout<<"alamat : "<<
cout<<"alamat lain : "<<
getch();
}





Iklan

rss


Translate

Chat

Komentar Blog

Iklan