Upload
ingin-tau
View
205
Download
30
Embed Size (px)
Citation preview
MODUL PRAKTIKUM
PRAKTEK ALGORITMA DAN PEMROGRAMAN II
Modul Praktikum Algoritma dan Pemrograman II
1
MODUL I
ARRAY DIMENSI I
(1 x pertemuan)
I. TUJUAN
- Mempelajari tipe terstruktur Array dimensi satu.
II. TEORI SINGKAT
Array atau Larik adalah Type data terstruktur yang terdiri dari sejumlah elemen
dimana setiap elemennya mempunyai tipe data yang sama atau sejenis (setype). Larik
dimanipulasikan dengan memanfaatkan index (subscript) dari tiap elemen larik tersebut.
Array dapat dideklarasikan pada bagian deklarasi type atau bagian deklarasi Var.
Bentuk 1 :
Var NamaArray : Array[TypeIndex] Of TypeLarik;
Bentuk 2 :
Type NamaType = Array[TypeIndex] Of Type Larik;
Var NamaVarArray : NamaType;
NamaLarik : Nama Variable bertype Array.
Type Larik : Type datanya. Type larik dapat berupa integer, real, char, string atau record.
TypeIndex : data bertype ordinal seperti char, byte, integer atau enumerated. Type Index
dapat berupa NamaType atau Sub Range Langsung.
Contoh deklarasi :
Type Daftar_nilai : array [1..5] of integer;
Var Nilai : daftar_nilai;
Atau dapat ditulis pada bagian var saja :
Var Nilai : array [1..5] of integer;
Dari deklarasi diatas mempunyai arti :
Variable array yang bernama Nilai mempunyai 5 buah elemen (dengan indeks 1 sampai
5) dan masingmasing elemen bertipe integer. Dari deklarasi Array diatas dapat
direpresentasikan didalam memori sebagai berikut :
Tiap kotak disebut dengan elemen array, berfungsi seperti halnya variable, dapat diisi
dengan sebuah data dari type tertentu sesuai yang dideklarasikan. Tiap kotak mempunyai
nomor / alamat yang disebut dengan index yang berfungsi untuk memberi identitas
kotak tersebut.
Modul Praktikum Algoritma dan Pemrograman II
2
Cara mengakses elemen array dimensi satu
Elemen array bisa diakses dengan cara menyebutkan nama array diikuti nilai
indeksnya didalam kurung siku.
Nilai [1], ini berarti mengakses nilai elemen pertama. Untuk memberikan nilai ke
array, bisa menggunakan 2 cara, yaitu :
Dengan operator penugasan (:=)
Nilai [1] := 0 , elemen pertama dari nilai diberi nilai 70
Dengan statemen Read/readln
Read (nilai[1]);
Read (nilai[2]);
Jika menggunakan perintah ini banyaknya perintah yang diberikan harus sebanyak
elemen yang dideklarasikan pada deklarasi array, sehingga bias digunakan perintah
perulangan seperti berikut :
For I := 1 to 5 do
Begin
Readln(nilai[I]);
End;
Untuk mengambil nilai/membaca elemen dari array dimensi satu digunakan
statemen Write, contoh : Write (nilai[1]). Untuk mempersingkat program dipergunakan
perintah berikut :
For I := 1 to 5 do
Begin
Writeln(nilai[I]);
End;
III. PRAKTEK
Program pas11;
uses crt;
const max_test = 4;
type data_nilai = array[1..max_test] of integer;
var i,jum : integer;
rata : real;
nilai_test : data_nilai;
begin
clrscr;
{memasukkan data}
for i := 1 to max_test do
begin
write ('masukkan nilai test ke ',i,' = ');
readln (nilai_test[i]);
end;
{menhitung total nilai dan rata-rata}
jum := 0;
for i := 1 to max_test do
begin
jum := jum + nilai_test[i];
end;
Modul Praktikum Algoritma dan Pemrograman II
3
rata := jum / max_test;
{mencetak}
writeln ('Total nilai = ',jum);
writeln ('Rata-rata nilai = ',rata:5:2);
readln;
end.
Program pas12;
Uses Crt;
Const N = 10;
Var Nim : Array[1..N] Of integer;
Nama : Array[1..N] Of String[20];
IP : Array[1..N] Of real;
I : Integer;
Begin
Clrscr;
{Baca Data}
Writeln(Masukkan,N,buah data); For I := 1 to N Do
Begin
Write(No.Mhs : );Readln(NIM[I]); Write(Nama Mhs : );Readln(Nama[I]); Write(IP Mhs : );Readln(IP[I]);
End;
{Cetak Hasil}
Writeln(Daftar Nilai); Writeln(No NIM NAMA IP); For I := 1 to N Do
Writeln(I:2, Nim[I]:10, Nama[I]:15, IP[I]:6:2); Readln
End.
Tugas :
Buat program dengan output :
No Nama Test1 Test2 Test3
Modul Praktikum Algoritma dan Pemrograman II
4
MODUL II
ARRAY DIMENSI II
(1 x pertemuan)
I. TUJUAN
- Mempelajari tipe terstruktur Array dimensi dua.
II. TEORI SINGKAT
Array berdimensi dua mempunyai bentuk table yang menpunyai 2 indeks, baris dan
kolom. Format deklarasi array dimensi dua dapat ditempatkan pada bagian type ataupun
Var seperti halnya array dimensi satu.
Bentuk 1:
Var NamaLarik : Array[TipeIndexBaris,TypeIndexCol] Of TypeLarik;
Bentuk 2 :
Type NamaType = Array[TipeIndexBaris,TypeIndexCol] Of TypeLarik;
Var NamaVarArray : NamaType;
Indeks1 biasa disebut indeks baris yang menunjukkan banyaknya baris, sedang
indeks2 disebut indeks kolom yang menunjukkan banyaknya kolom. Contoh :
Var Nilai_mhs : array [1..100,1..3] of integer;
Cara mengakses elemen array dimensi dua
Untuk mengakses elemen pada array dimensi 2 bisa disebutkan nama array
diikuti dengan indeks baris dan indeks kolomnya.
Nama array [indeks_baris, indeks_kolom]
Untuk memberi nilai ke array, bisa dengan dua cara
Dengan operator penugasan (:=)
Nilai_mhs[4, 1] := 80;
Berarti memberikan nilai 80 langsung kedalam elemen array baris ke 4 kolom
ke 1.
Dengan pernyataan masukan (read/readln)
Read (Nilai_mhs [4, 1]);
Berarti memberikan nilai kedalam elemen array baris ke 4 kolom ke 1 melalui
keyboard. Banyaknya perintah yang diberikan dengan statemen diatas sesuai dengan
banyaknya elemen array, yaitu jumlah baris dikalikan jumlah kolomnya. Untuk
mempersingkat perintah bias dipergunakan perintah perulangan, untuk deklarasi diatas
bias dipergunakan perintah berikut :
For I := 1 to 100 do
Begin
For J := 1 to 3 do
begin
Readln(Nilai_mhs[I,J);
End;
End;
Dengan variable I mewakili baris dan variable J mewakili kolom.
Modul Praktikum Algoritma dan Pemrograman II
5
Untuk mengambil atau mencetak nilai dari array, digunakan pernyataan
keluaran (write/writeln)
Write (Nilai_mhs [4, 1]);
Untuk mempersingkat perintah bisa dipergunakan perintah perulangan, untuk
deklarasi diatas bias dipergunakan perintah berikut :
For I := 1 to 100 do
Begin
For J := 1 to 3 do
begin
Writeln(Nilai_mhs[I,J);
End;
End;
Dengan variable I mewakili baris dan variable J mewakili kolom.
III. PRAKTEK
Program pas21;
uses crt;
type data_nilai = array[1..100,1..3] of integer;
var max_siswa,i,j,jum : integer;
rata : real;
nilai_test : data_nilai;
begin
clrscr;
{memasukkan data}
write ('masukkan jumlah siswa = ');
readln (max_siswa);
for i := 1 to max_siswa do
begin
writeln ('data Mahasiswa ke ',i,' = ');
for j := 1 to 3 do
begin
write ('masukkan nilai test ke ',i,' = ');
readln (nilai_test[i,j]);
end;
end;
{menhitung total nilai dan rata-rata}
clrscr;
writeln ('DAFTAR NILAI');
write ('No ');
for i := 1 to 3 do
write ('nilai ke-',i,' ');
writeln ('rata-rata');
writeln;
for i := 1 to max_siswa do
begin
jum := 0;
for j := 1 to 3 do
jum := jum + nilai_test[i,j];
rata:= jum / 3;
write (i:2);
for j := 1 to 3 do
write (' ',nilai_test[i,j],'':7);
writeln(rata:5:2);
Modul Praktikum Algoritma dan Pemrograman II
6
end;
readln;
end.
Tugas :
Buat program dengan output :
No Nama Test1 Test2 Test3 Total Rerata Huruf
Total = test1+ test 2 + test3
Rata = total / 3
Jika rata >= 80 maka nilai huruf = A
Jika rata >= 70 maka nilai huruf = B
Jika rata >= 60 maka nilai huruf = C
Jika rata >= 50 maka nilai huruf = D
Jika rata < 50 maka nilai huruf = E
Modul Praktikum Algoritma dan Pemrograman II
7
MODUL III
PROCEDURE
(1 x pertemuan)
I. TUJUAN
- Mempelajari pemecahan program ke dalam modul-modul program dalam bentuk
prosedur.
II. TEORI SINGKAT
Procedure standard adalah suatu routine yang juga siap pakai dan dipanggil dengan
menyebutkan nama procedure dengan memberikan argumen yang sesuai. Berikut adalah
procedure-procedure standard yang sering kita pakai.
A. Procedure Input / Output
Write, writeln : sudah dibahas
Read, Readln : sudah dibahas
B. Procedure Operasi String
Delete(x,i,n) : Membuangn buah character mulai dari i dari string x.
Insert(s1,s2,i) : Menyisipkan string s1 dalam string s2 di posisi i.
Str(n:w:d,s) : Merubah Numerik lebar w decimal d dalam string s.
Val(s,n,c) : Merubah s string menjadi numeric dalam n.
FillChar(x,n,ch) : Mengisi variable x dengan character ch sebanyak n.
C. Procedure Lain-lain
Clrscr : Hapus layar.
ClrEol : Hapus baris mulai posisi cursor.
DelLine : Menghapus 1 baris di posisi cursor dan menggeser naik tampilan-tampilan di
bawahnya.
InsLine : Menyisipi sebuah baris pada posisi cursor.
Gotoxy(x,y) : Memposisikan cursor pada baris y, kolom x.
Delay(n) : Menunda proses n integer yang menunjukkan lama tunda.
Halt : Menghentikan eksekusi program.
Sound(f) : Menghasilkan nada suara dengan frequensi f.
NoSound : Mematikan nada.
TextColor(x) : Memesan warna tulisan dengan konstanta warna x. x dapat berupa angka
0, 1, 2, atau Black, Red, White,
TextBackGround(x) : Memesan warna latar belakang dengan konstanta warna x.
Untuk procedure dan fungsi standard yang sudah disediakan oleh pascal
semuanya terdapat pada unit-unit yang harus disertakan pemakaiannya pada USES
(pada kepala program).
D. Menciptakan Procedure
Berapa hal yang harus diperhatikan dalam penggunaan prosedur, antara lain :
Deklarasi prosedur terletak pada bagian deklarasi program.
Modul Praktikum Algoritma dan Pemrograman II
8
Sembarang tipe statemen pascal bisa digunakan dalam prosedur.
Parameter dalam prosedur bersifat optional, boleh ada boleh tidak.
Suatu prosedur bisa memanggil prosedur lain yang sudah didefinisikan terlebih
dahulu.
Pemberian nama prosedur mengikuti aturan pemberian nama pengenal atau
perubah.
Mendeklarasikan prosedur
Struktur prosedur hampir sama dengan struktur program pascal, yaitu :
Bagian kepala prosedur
Procedure nama_prosedur (dafatar parameter formal);
Bagian deklarasi
Digunakan untuk mendeklarasikan semua variabel lokal yang digunakan
dalam prosedur.
Bagian pernyataan.
Digunakan untuk menuliskan semua statemen, yang diawali dengan
begin dan diakhiri dengan end diikuti tanda titik koma (;).
Begin
(statement)
end.
Pemanggilan prosedur dilakukan dengan cara menyebutkan nama prosedurnya
diikuti dengan parameter (parameter aktual) jika memakai parameter formal pada saat
mendeklarasikan.
III. PRAKTEK
Program pas31;
uses crt;
type larik = array[1..100] of real;
var vektor : larik;
n,i,bantu : integer;
m,rerata,jum : real;
procedure baca;
begin
clrscr;
write('masukkan banyak data = ');
readln(n);
writeln('masukkan datanya =');
bantu := 1;
for I := 1 to n do
begin
read(vektor[I]);
gotoxy(whereX+(I mod 8) * 8,whereY-1);
if I mod 8 = 0 then
writeln;
end;
end;
procedure cetak(X:larik;p:integer);
var i : integer;
Modul Praktikum Algoritma dan Pemrograman II
9
begin
writeln;
for I := 1 to P do
begin
write(X[I]:6:2);
if I mod 8 = 0 then
writeln;
end;
writeln;
end;
procedure urut (var X : larik; P:integer);
var i,j,lokasi : integer;
bantu : real;
begin
for i := 1 to p-1 do
begin
lokasi := i;
for j := i+1 to p do
if x[lokasi] > x[j] then
lokasi := j;
bantu := x[i];
x[i] := x[lokasi];
x[lokasi] := bantu;
end;
end;
procedure medu(var x : larik; n :integer);
begin
if (n mod 2 = 0) then
m := (x[n div 2] + x[(n div 2) +1])/2
else
m := x[(n+1)div 2];
end;
procedure rata (x:larik; n :integer);
var i : integer;
begin
jum := 0.0;
for i := 1 to n do
jum := jum + x[i];
rerata := jum / n;
end;
begin
clrscr;
baca; clrscr;
writeln('data sebelum diurutkan =');
cetak(vektor,n);
writeln;
urut(vektor,n);
writeln('data urut =');
cetak(vektor,n);
rata(vektor,n);
writeln;
writeln('banyaknya data = ',n);
writeln('total data = ',jum:6:2);
writeln('nilai rata-rata = ',rerata:6:2);
medu(vektor,n);
writeln('nilai median = ',m:6:2);
readln; readln;
end.
Modul Praktikum Algoritma dan Pemrograman II
10
MODUL IV
FUNCTION
(1 x pertemuan)
I. TUJUAN
- Mempelajari pemecahan program ke dalam modul-modul program dalam bentuk
fungsi.
II. TEORI SINGKAT
Fungsi adalah suatu routine yang terdefinisi, baik di definisikan oleh PASCAL
(fungsi standard) maupun didefinisikan oleh pemakai (user define function). Fungsi dapat
kita bedakan dari hasil fungsinya, yang dapat berupa String, Numeric atau Boolean. Berikut
ini adalah fungsi-fungsi pustaka ynag sudah terdefinisi dalam PASCAL.
1. Fungsi Standard Aritmatika
Abs(x) : Menghasilkan nilai mutlak dari x, x real atau integer.
Exp(x) : Menghasilkan x e , x real atau integer.
Ln(x) : Menghasilkan logaritma natural x.
Int(x) : Menghasilkan nilai integer dari x, x real.
Frac(x) : Menghasilkan bagian pecah dari x yang real.
Sqr(x) : Menghasilkan nilai kuadrat dari x, x real atau integer.
Sqrt(x) : Menghasilkan akar kuadrat dari x, x real.
Sin(x) : Sinus x, x real.
Cos(x) : Cosinus x, x real.
ArcTan(x) : Arch Tg x.
Random(x) : Menghasilkan bilangan bulat acak dari 0 x.
2. Fungsi Standard String
Copy(s,I,n) : Menyalin n buah character mulai dari posisi i dari string x.
Pos(s1,s2) : Menghasilkan posisi suatu string s1 dalam string s2.
Length(s) : Menghasilkan panjang suatu string s.
Readkey : Menghasilkan satu character yang diketik dari keyboard. Bersifat menunggu
masukkan satu character.
3. Fungsi Standard Transfer
Ord(x) : Menghasilkan KODE ASCII dari x, x bertype Char.
Chr(x) : Menghasilkan character yang berkode ASCII x.
Round(x) : Menghasilkan nilai longint yang terdekat dari x real sesuai dengan aturan
pembulatan.
Trunc(x) : Menghasilkan nilai longint yang terkecil dari x real.
Upcase(x) : Menghasilkan huruf besar.
A. Menciptakan Fungsi
Fungsi merupakan sebuah subprogram yang apabila dipanggil akan menghasilkan
sebuah nilai. Ciri-ciri suatu fungsi :
Modul Praktikum Algoritma dan Pemrograman II
11
1. Fungsi hanya memberikan sebuah hasil
2. Nama fungsi selain digunakan untuk memanggil fungsi tersebut, juga dianggap sebagai
suatu variable sehingga bias digunakan sebagai bagian dari ungkapan.
3. Dalam fungsi tidak digunakan parameter variable, semua parameter dianggap sebagai
parameter nilai.
4. Semua parameter digunakan sebagai masukan pada fungsi tersebut dengan keluarannya
nama fungsi yang bertindak sebagai satu variable.
Deklarasi fungsi :
Function pengenal [(daftar parameter formal)]: tipe;
Function, adalah kata tercadang pascal yang memberi tanda bahwa deklarasi fungsi
dimulai. Pengenal, adalah nama fungsi. Daftar parameter formal, adalah nama parameter
yang akan dioperasikan dalam fungsi. Tipe, adalah tipe data dari nilai fungsi. (yang
diperbolehkan hanya tipe skalar, subjangkauan atau terbilang). Kemudian untuk memanggil
fungsi yang sudah dideklarasikan, digunakan bentuk sebagai berikut :
Pengenal(daftar parameter aktual);
Pengenal adalah nama fungsi yang akan dipanggil. Beberapa hal penting yang perlu
diperhatikan berkaitan dengan pemakaian fungsi, adalah :
1. Tipe hasil fungsi harus bertipe sederhana (integer, real, boolean, char atau string), karena
fungsi hanya bisa mengembalikan nilai bertipe sederhana.
2. Jika fungsi tidak memiliki daftar parameter formal, maka tanda kurung buka ( dan
kurung tutup ) tidak ditulis.
Fungsi didefinisikan didalam blok program pemanggil (setelah kata tercadang var)
III. PRAKTEK
program pas41;
uses crt;
var pil,i,k,j : integer; tinggi : array[1..100] of real; mahasiswa : array[1..100] of string;
function menu(var pilih:integer):integer;
begin
clrscr;
gotoxy(20,5);writeln('**********************************');
gotoxy(20,6);writeln(' M E N U');
gotoxy(20,7);writeln('**********************************');
gotoxy(20,8);writeln;
gotoxy(20,9);writeln(' 1. Tambah Data');
gotoxy(20,10);writeln(' 2. Urutkan Data');
gotoxy(20,11);writeln(' 3. Tampilkan Data');
gotoxy(20,12);writeln(' 4. Hapus Data');
gotoxy(20,13);writeln(' 5. Edit Data');
gotoxy(20,14);writeln(' 6. Statistik');
gotoxy(20,15);writeln(' 0. Keluar');
gotoxy(20,16);writeln('**********************************');
gotoxy(20,18);writeln('**********************************');
gotoxy(20,17);write('Pilihan = ');readln(pilih);
end;
function tambah:string;
begin
clrscr;
Modul Praktikum Algoritma dan Pemrograman II
12
writeln('******************');
writeln(' Tambah Data');
writeln('******************');
writeln;
write('Banyak data yg ditambahkan = ');readln(j);
for i:=1 to j do
begin
k:=k+1;
writeln('-----------');
writeln(' Data ke-',k);
writeln('-----------');
write('Nama Mahasiswa : ');readln(mahasiswa[k]);
write('Tinggi Badan : ');readln(tinggi[k]);
end;
end;
function urutkan:integer;
var pil2,x,y : integer;
temp2: string;
temp : real;
begin
clrscr;
writeln('******************');
writeln(' Urutkan Data');
writeln('******************');
writeln;
if k=0 then
begin
write('Data masih kosong, ENTER untuk ke MENU');
readln;
end
else
begin
writeln('Urutan berdasarkan :');
writeln('1. Nama Mahasiswa');
writeln('2. Tinggi Badan');
write('Pilihan = ');readln(pil2);
if (pil2=1) then
begin
for i:=1 to k-1 do
for j:=i+1 to k do
begin
if
length(mahasiswa[i])>length(mahasiswa[j]) then
x:=length(mahasiswa[i])
else x:=length(mahasiswa[j]);
for y:=1 to x do
begin
if
((mahasiswa[i,y])>(mahasiswa[j,y])) then
begin
temp:=tinggi[i];
temp2:=mahasiswa[i];
tinggi[i]:=tinggi[j];
mahasiswa[i]:=mahasiswa[j];
tinggi[j]:=temp;
Modul Praktikum Algoritma dan Pemrograman II
13
mahasiswa[j]:=temp2;
y:=x;
end
else if
((mahasiswa[i,y])tinggi[j] then
begin
temp:=tinggi[i];
temp2:=mahasiswa[i];
tinggi[i]:=tinggi[j];
mahasiswa[i]:=mahasiswa[j];
tinggi[j]:=temp;
mahasiswa[j]:=temp2;
end;
end;
write('Data telah terurutkan, ENTER untuk ke
MENU');readln;
end
else
begin
write('Data GAGAL diurutkan, ENTER untuk ke
MENU');readln;
end;
end;
end;
function tampilkan(pos: byte; teks : string):string;
begin
clrscr;
writeln('******************');
gotoxy(pos,2);writeln(teks);
writeln('******************');
writeln;
writeln('Terdapat ',k,' data ');
for i:=1 to k do
begin
writeln('-----------');
writeln(' Data ke-',i);
writeln('-----------');
writeln('Nama Mahasiswa : ',mahasiswa[i]);
writeln('Tinggi Badan : ',tinggi[i]:0:2,' cm');
writeln;
end;
writeln;
write('ENTER untuk melanjutkan');readln;
end;
Modul Praktikum Algoritma dan Pemrograman II
14
function editkan:string;
var bil : integer;
begin
tampilkan(5,'Edit Data');
if (k>0) then
begin
write('Data yang di edit urutan ke-');readln(bil);
if (bil>0) and (bil0) then
begin
write('Data yang di hapus urutan ke-');readln(bil);
if (bil>0) and (bil
Modul Praktikum Algoritma dan Pemrograman II
15
temp,jum : real;
temp2 : string;
begin
clrscr;
writeln('******************');
writeln(' Statistik Data');
writeln('******************');
if (k>0) then
begin
jum:=0;
writeln;
writeln('Banyak data yang ada = ',k);
for i:=1 to k-1 do
begin
for j:=i+1 to k do
begin
if tinggi[i]>tinggi[j] then
begin
temp:=tinggi[i];
temp2:=mahasiswa[i];
tinggi[i]:=tinggi[j];
mahasiswa[i]:=mahasiswa[j];
tinggi[j]:=temp;
mahasiswa[j]:=temp2;
end;
end;
jum:=jum+tinggi[i];
end;
writeln('Rata-rata tinggi mahasiswa = ',((jum+tinggi[k])/k):0:2);
writeln('Mahasiswa yang memiliki tinggi badan terrendah =
',mahasiswa[1],' (',tinggi[1]:0:2,')');
writeln('Mahasiswa yang memiliki tinggi badan tertinggi =
',mahasiswa[k],' (',tinggi[k]:0:2,')'); writeln;
end
else
begin
writeln;
write('Data masih kosong, ');
end;
write('ENTER untuk ke MENU');readln;
end;
{ program utama }
begin
repeat
menu(pil);
case pil of
0 : exit;
1 : tambah;
2 : urutkan;
3 : tampilkan(3,'Tampilkan Data');
4 : hapuskan;
5 : editkan;
6 : statistik;
else
gotoxy(20,19);write('Pilihan salah, ENTER untuk ke MENU');readln;
end;
until pil=0;
end.
Modul Praktikum Algoritma dan Pemrograman II
16
MODUL V
REKURSIF
(1 x pertemuan)
I. TUJUAN
- Mempelajari proses rekursi dalam penggunaan prosedur dan fungsi
II. TEORI SINGKAT
Rekursi adalah suatu prosedur atau fungsi yang dapat memanggil dirinya sendiri.
Contoh dari rekursi adalah proses menghitung faktorial dan proses menghitung bilangan
fibonacci. Program berikut menunjukkan contoh penggunaan rekursi yang identik dengan
suatu perulangan.
Program 51;
var
i : integer;
procedure ulang;
begin
writeln(i,'. Tulisan ini akan tercetak 10 kali');
if i < 10 then
begin
i := i + 1;
ulang;
end;
end;
begin
i := 1;
ulang;
readln
end.
Perhatikan hasil dari eksekusi program diatas. Terlihat bahwa di dalam prosedur
ulang terdapat baris perintah yang berfungsi untuk memanggil dirinya sendiri sebelum i
=10.
III. PRAKTEK
Dibawah ini program untuk mengetahui nilai pemangkatan bilangan :
program pas52;
uses crt;
var x : real;
n : integer;
Function pkt(x :real; n : integer):real;
var t : real;
m : integer;
Begin
m:=abs(n);
if (x0) and (n=0) then pkt:=1
else if n >0 then pkt:=x*pkt(x,n-1)
else if (n < 0) then pkt := 1/(x*pkt(x,m-1));
end;
begin
clrscr;
write('Bilangan yang dipangkatkan : ');readln(x);
Modul Praktikum Algoritma dan Pemrograman II
17
write('Bilangan pangkat : ');readln(n);
writeln(x:5:2,' Pangkat ',n,' = ',pkt(x,n):8:3);
readln;
end.
Contoh dibawah ini merupakan program untuk mencari bilangan fibo :
program pas53;
uses crt;
var x:array[1..100] of integer;
i,n:integer;
lagi:char;
function fibo(n:integer):integer;
begin
if (n = 1) or (n=2) then
fibo:=1
else
fibo:=fibo(n-1)+fibo(n-2);
end;
begin
repeat
clrscr;
write('Suku deret Fibonacci keberapa :');readln(n);
writeln('Suku ke ', n,' =', fibo(n));
write('Lagi ......[Y/T]');lagi:=upcase(readkey);
writeln(lagi);
until lagi 'Y';
end.
Tugas :
Ubahlah ketiga contoh program diatas tanpa menggunakan rekursi, tetapi menghasilkan
output yang sama.
Modul Praktikum Algoritma dan Pemrograman II
18
MODUL VI
RECORD
(1 x pertemuan)
I. TUJUAN
- Mempelajari penggunaan tipe data terstruktur record pada pascal
II. TEORI SINGKAT
Record merupakan tipe berstruktur yang memiliki beberapa komponen atau elemen
dengan masing-masing elemen boleh memiliki tipe data yang berlainan. Bentuk deklarasi
variabel record :
RECORD
Daftar_field_1 : tipe_1;
Daftar_field_2 : tipe_2;
Daftar_field_n : tipe_n;
END;
Masing-masing elemen dari record disebut dengan field. Masing-masign field dapat
berupa tipe apa saja termasuk array. Contoh deklarasi :
Type
RecBarang = RECORD
Nama : string;
Banyak : integer;
Harga : LongInt;
End;
Var Barang : RecBarang;
Cara Mengakses field
Bentuk : Variabel.field
Contoh :
Barang.Nama;
Berarti field nama dari variabel record benama barang.
Contoh lain :
Barang.Nama := Sabun Mandi;
Field Nama pada record Barang diisi string Sabun Mandi
Pernyataan WITH
Untuk menyederhanakan pernyataan seperti
DataPeg.TgLahir.Tgl
Pascal menyediakan pernyataan WITH, dengan bentuk :
WITH nama_record Do
III. PRAKTEK
Program pas61;
Type
Modul Praktikum Algoritma dan Pemrograman II
19
Recbarang = RECORD
Nama_B : string[8];
Jumlah : Integer;
Harga_b : LongInt;
End;
Var
Barang : Recbarang;
Begin
{Memasukan data ke dalam record barang}
Barang.Nama_b := 'Baju koko';
Barang.Jumlah := 10;
Barang.Harga_b := 200000;
{Menampilkan isi field record}
Writeln('Nama Barang : ',Barang.Nama_b);
Writeln('Jumlah Barang : ',Barang.Jumlah);
Writeln('Harga Barang : ',Barang.Harga_b);
End.
Program pas62;
Type
RecTgl = RECORD
Tgl, Bln,Thn : Integer;
End;
RecPegawai = RECORD
Nmr : Integer;
Nama : String[35];
TgLahir : RecTgl;
Gaji : LongInt;
End;
Var
DataPeg : RecPegawai;
Begin
{Mengisikan nilai terhadap field-field}
DataPeg.Nmr := 123;
DataPeg.Nama := 'Joko Bodho';
DataPeg.TgLahir.Tgl := 13;
DataPeg.TgLahir.Bln := 10;
DataPeg.TgLahir.Thn := 1975;
{menampilkan isi field}
Writeln('Nomor : ',DataPeg.Nmr);
Writeln('Nama : ',DataPeg.Nama);
Writeln('Tanggal Lahir : ',DataPeg.TgLahir.Tgl,
'/',DataPeg.TgLahir.Bln,'/',DataPeg.TgLahir.Thn);
readln;
End.
Program pas63;
Type
Recbarang = RECORD
Nama_B : string[10];
Jumlah : Integer;
Harga_b : LongInt;
End;
Var Barang : Recbarang;
Begin
{Memasukan data ke dalam record barang}
Barang.Nama_b := 'Baju koko';
Modul Praktikum Algoritma dan Pemrograman II
20
Barang.Jumlah := 10;
Barang.Harga_b := 200000;
{Menampilkan isi field record}
WITH Barang Do
begin
Writeln('Nama Barang : ',Nama_b);
Writeln('Jumlah Barang : ',Jumlah);
Writeln('Harga Barang : ',Harga_b);
End;
readln;
End.
Tugas :
Buatlah progam untuk memasukkan sejumlah data nilai mahasiswa dalam bentuk
record. Data yang dimasukkan adalah Nim, Nama, Nilai UTS, Nilai UAS, Nilai Tugas. Setelah
semua data dimasukkan, semua data ditampilkan dalam bentuk tabel yang diurutkan secara
descending berdasarkan nilai rata-rata tiap mahasiswa, kemudian konversi nilai rata-rata ke
dalam nilai angka dengan aturan.
Rata-rata >= 80 nilai huruf A keterangan Lulus
Rata-rata >= 70 nilai huruf B keterangan Lulus
Rata-rata >= 60 nilai huruf C keterangan Lulus
Rata-rata >= 50 nilai huruf D keterangan Tidak Lulus
Rata-rata < 50 nilai huruf E keterangan Tidak Lulus
Contoh output program :
Jumlah Data : 2
Data ke-1
N I M : 11010001
N a m a : Jono
Nilai UTS : 50
Nilai UAS : 50
Nilai TUGAS : 50
Data ke-1
N I M : 11010002
N a m a : Hari
Nilai UTS : 90
Nilai UAS : 90
Nilai TUGAS : 90
H A S I L P R O S E S
No NIM Nama Rata Huruf Keterangan
1 11010002 Jana 90 A Lulus
2 11010001 Jono 50 D Tidak Lulus
Modul Praktikum Algoritma dan Pemrograman II
21
MODUL VII
UNIT
(1 x pertemuan)
I. TUJUAN
- Mempelajari pembuatan unit dengan mengunakan pascal
II. TEORI SINGKAT
Unit merupakan group dari prosedur atau fungsi (untuk berbagai deklarasi/definisi
seperti variabel dan tipe) yang dpat dikompilasi terpisah terhadap program turbo pascal.
Keuntungan dengan adanya unit, program yang memakai fasilitas dalam unit akan
dikompilasi lebih cepat, sebab bagian dari unit tidak ikut dikompilasi lagi.
Struktur Unit
Unit terdiri dari tiga buah bagian :
Bagian Interface
Bagian Implementation
Bagian Inisialisasi
Struktur Sebuah Unit :
UNIT nama_unit;
INTERFACE
USES daftar_nama_unit; {optional}
{bagian deklarasi yang bersifat global}
IMPLEMENTATION
{Bagian deklarasi yang bersifat lokal dan implementasi dari subprogram yang
terdapat pada bagian interface}
BEGIN {opsional}
(* bagian inisialisasi *) {opsional}
END.
Bagian Interface
Bagian interface merupakan bagian penghubung antara unit dengan unit lain
atau program. Jika unit mengandung prosedur atau fungsi yang dapat diakses oleh
program atau unit lain, hanya kepala/judul prosedur/fungsi yang berada pada bagian
interface. Adapun tubuh fungsi berada pada bagian implementation.
UNIT TambKur;
INTERFACE
USES CRT;
PROCEDURE Tambah(x, y : integer);
PROCEDURE Kurang(x, y : integer);
PROCEDURE Hapuslayar;
PROCEDURE TUNDA;
Bagian Implementation
Bagian implementation berisi :
Bagian tubuh dari fungsi atau prosedur yang kepalanya dideklarasikan pada
bagian interface
Deklarasi konstanta, tipe, variabel, prosedurdan fungsi yang bersifat lokal
(hanya dikenal dibagian implementation)
Modul Praktikum Algoritma dan Pemrograman II
22
Bagian ini dapat menggunakan semua fasilitas yang ada pada bgian interface
(seperti deklarasi variabel dan tipe) dan juga fasilitas yang terdapat pada unit yang
dilibatkan pada bagian interface.
IMPLEMENTATION
PROCEDURE HAPUSLAYAR;
Begin
ClrScr;
End;
PROCEDURE Tunda;
Begin
Readln;
End;
PROCEDURE Tambah(x, y : integer);
VAR
Total : integer;
begin
total := x + y;
writeln(x,' + ',y,' = ',total);
End;
PROCEDURE Kurang(x, y : integer);
VAR
Total : integer;
begin
total := x - y;
writeln(x,' - ',y,' = ',total);
End;
Bagian Inisialisasi
Bagian ini bisa terdiri kata tercadang END saja yang diakhiri dengan titik. Dan
menyatakan unit tidak mengandung kode inisialisasi.
Begin
End.
Dari contoh contoh pada bagian diatas anda ketikkan menjadi sebuah program
dan beri nama TambKur Kemudian Compile program diatas dengan menekan tobol
Alt+F9 atau dari menu Compile pilih Compile. Jika program anda tidak mengandung
kesalahan maka anda akan mendapatkan sebuah file baru dengan nama TambKur.tpu.
yaitu file TPU yang anda bisa sisipkan pada program utama anda dengan menggunakan
perintah Uses.
Ketikkan program dibawah ini kemudian simpan dengan nama Test
uses tambkur;
var n,m : integer;
begin
Hapuslayar;
Write(Masukan Nilai 1 : ); readln(n); Write(Masukan Nilai 2 : ); readln(m); Tambah(n,m);
Kurang(n,m);
Tunda;
end.
Modul Praktikum Algoritma dan Pemrograman II
23
III. PRAKTEK
Salin berikut ini :
unit cekpas;
interface
function CekSandi(Kata, Password: string): Boolean;
implementation
function CekSandi(Kata, Password: string): Boolean;
begin
if Kata=Password then
CekSandi := True
Else
CekSandi := False;
end;
end.
Kemudian simpan program tersebut di atas dengan nama yang sama dengan
nama unitnya. Untuk pemanggilan unit di ketikkan setelah kata kunci Uses. Kompilasi
unit tersebut di atas (ingat, selalu kompilasi unit ke pengingat tambahan (compile to
disk)). Kemudian setelah dikompilasi, salin program berikut ini :
program pas71;
uses crt, cekpas;
var
Kata_sandi : string;
begin
Clrscr;
repeat
Write('Masukkan Password Anda !! : ');
Readln(Kata_sandi);
until CekSandi (Kata_sandi, 'praktikan');
Writeln;
Write('Password Anda Benar !!');
Readln;
end.
Jalankan program tersebut dan amati hasilnya. Program tersebut menggunakan
unit cekpas dan unit cekpas itu harus sudah terkompilasi pada berkas. Bila dijalankan,
pernyataan-pernyataan antara repeat dengan until pada program tersebut akan diulang
terus hingga kata sandi yang diketikkan adalah 'praktikan' dan CekSandi bernilai True.
Tugas :
Buatlah sebuah program pascal yang memanfaatkan fasilitas unit untuk menghitung jumlah
huruf hidup dan huruf mati dari suatu string yang diinputkan dari keyboard.
Modul Praktikum Algoritma dan Pemrograman II
24
MODUL VIII
POINTER
( 2 x pertemuan)
I. TUJUAN
- Mempelajari tipe pointer dan penerapannya dalam program
II. TEORI SINGKAT
Pointer adalah suatu tipe data yang dapat digunakan untuk mengalokasikan dan
mendealokasikan (mengambil / mengurangi) pengingat secara dinamis, yaitu sesuai dengan
kebutuhan pada saat suatu program dieksekusi.
Data bertipe pointer merupakan suatu fasilitas yang dimiliki pernrograrnan bahasa
Pascal untuk mengatasi tipe data yang bersifat statis, misaInya data bertipe larik yang
penyimpanannya dalam pengingat terbatas, data yang tersimpan dalam perubah tidak boleh
melebihi pesanan yang telah dideklarasikan. Gambar 3. menunjukkan ilustrasi perubah
statis dan dinamis.
Gambar diatas bisa dijelaskan sebagai berikut. Pada gambar a perubah A adalah
perubah statis. Dalam hal ini 1000 adalah nilai data yang sesungguhnya dan disimpan pada
perubah (lokasi) A. Pada gambar b perubah A adalah perubah dinamis. Nilai perubah ini
misalnya adalah 10. Nilai ini bukan nilai data yang sesungguhnya, tetapi lokasi dimana data
yang sesunggulmya berada. Jadi dalam hal ini nilai data yang sesungguhnya tersimpan pada
lokasi 10.
Dari ilustrasi di atas bisa dilihat bahwa nilai perubah dinamis akan digunakan untuk
menunjuk ke lokasi lain yang befisi data sesungguhnya yang akan diproses. Karena alasan
inilah perubah dinamis lebih dikenal dengan sebutan pointer yang artinya kira-kira
menunjuk ke sesuatu.
Dalam perubah dinamis, nilai data yang ditunjuk oleh suatu pointer biasanya disebut
sebagai simpul/node.
A. Struktur Data.
Struktur data yang dimaksud disini adalah struktur data yang digunakan dalam data
bertipe pointer. Data bertipe pointer ditandai dengan meletakkan tanda ^ didepan nama
simpul pada deklarasinya. Simpul bisa dideklarasikan sebagai sebuah record yang berisi
field-field data yang bertipe selain pointer dan field-field yang bertipe pointer.
a b
A
1000
A
10
10
1000
Modul Praktikum Algoritma dan Pemrograman II
25
Field bertipe pointer dalam sebuah record bisa satu buah (untuk single link list), bisa
dua buah (untuk double link list) dan sebagainya. Single link list hanya bisa menunjuk ke
satu arah, sedang double link list bisa menunjuk ke dua arah. Dalam pemrograman bahasa
Pascal, struktur data bertipe pointer yang bersifat dinamis berbeda dengan tipe data lainnya
yang besifat statis. Bentuk umum deklarasi pointer adalah sebagai berikut:
Type pengenal = ^simpul;
simpul = tipe;
dengan pengenal: nama pengenal yang menyatakan data bertipe pointer.
Simpul : nama simpul.
Tipe : tipe dari simpul.
Tanda ^ didepan nama simpul harus ditulis apa adanya dan menunjukkan bahwa
pengenal adalah suatu tipe data pointer. Tipe data simpul yang dinyatakan dalam tipe bisa
berupa sembarang tipe data, misainya char, integer, real, rekaman (record) dan sebagainya.
Contoh:
Type patkiang = string [301;
pegawai=.^simpul;
simpul = record
Nama : panjang;
Alamat : panjang;
pekerjaan: patkiang;
End;
Var P1,P2: pegawai;
Deklarasi pada contoh diatas sifat kedinamisannya masih tersamar, karena jika
dfinginkan sejumlah simpul aktif dalam pengingat, maka kita perlu menyediakan sejumlah
pointer yang sesuai. Dengan demikian seolah-olah tidak ada perbedaan yang nyata antara
perubah statis dengan dinamis. Gambar diatas menunjukkan medan informasi pada simpul
pointer P1 dan P2. Dari gambar diatas terlihat ada kemiripan dengan perubah statis tanpa
larik.
Jika benar-benar diinginkan mempunyai perubah yang bersifat dinamis, harus
ditarnbalikan satu medan lagi dalarn rekaman yang mampu menunjuk simpul lain, yang
disebut dengan medan penyambung dengan tipenya sama dengan tipe pointer awal (P1).
Deklarasinya struktur data untuk single-link-list dapat diubah menjadi:
Type panjang = string[30];
pegawai= 'I simpul;
simpul = record
Nama : panjIang;
Alamat : panjang;
Pekerjaan : panjang;
P1 P2
Medan informasi Medan informasi
Nama Alamat Pekerjaan Nama Alamat Pekerjaan
Modul Praktikum Algoritma dan Pemrograman II
26
berikut : pegawai;
End;
Var PI : pegawai;
Gambar dibawah ini menunjukkan ilustrasi simpul dengan medan informasi, medan
penyambung dan senarai berantai dari single-link-list.
Gambar a menunjukkan suatu simpul dengan medan informasi berisi nama, alamat,
pekerjaan dan medan penyambung yang bertipe pointer. Gambar b menunjukkan senarai
berantai yang dapat dibentuk dari deklarasi diatas, ada kemiripan dengan data yang bertipe
larik.
Demikian pula untuk deklarasi struktur data doubly-link-list dapat diubah menjadi:
Type panjang = string [301;
pegawai= Simpul;
simpul = record
Nama : panjang;
Alamat : panjang;
pekerjaan : panjang;
kiri,kanan : pegawai;
End;
Var P1 : pegawai;
Gambar dibawah ini menunjukkan ilustrasi simpul dengan medan informasi,
medan penyambung dan senarai berantai dari doubly-link-list.
Gambar a menunjukkan suatu simpul dengan medan penyambung kiri, medan
informasi berisi nama, alamat, pekedaan dan medan penyambung kanan yang bertipe
pointer. Gambar b menunjukkan senarai berantai yang dapat dibentuk dari deklarasi
struktur data doubly-link-list.
Kegunaan.
Kegunaan yang utarna dari data bertipe pointer adalah untuk mengatasi kekurangan
yang terdapat pada data yang bertipe larik. Misalnya ada deklarasi sebagai berikut (dalam
bahasa Pascal): var Tabel : array [ 1.. 100, 1.. 50] of integer;
P1
Medan Informasi Medan Penyambung
(a) P2
(b)
Nama Alamat Pekerjaan
? ? ? ? ? ? ? ? ?
Modul Praktikum Algoritma dan Pemrograman II
27
Perubah tabel di atas hanya mampu untuk menyimpan data sebanyak 5000 buah
data, tidak boleh lebih, proses akan terhenti jika perubah tabel digunakan lebih dari 5000
buah data. Sebaliknya, pengingat/penyimpan mengalami banyak kekosongan jika perubah
tabel hanya sedikit yang digunakan, misalnya yang digunakan hanya 10 buah data, maka
sisanya sebanyak 4990 pengingat dibiarkan kosong.
Penggunaan data bertipe pointer adalah untuk mengolah data yang banyaknya tidak
bisa dipastikan sebelumnya, bisa lebih dari 5000 buah data atau kurang dari 10 buah data.
Pengingat yang digunakan data yang bertipe pointer bisa sebanyak-banyaknya
tergantung dari kemampuan pengingat komputer yang digunakan dan tidak ada pengingat
yang dibiarkan kosong jika jumlah data yang diolah hanya sedikit.
Teknik.
Teknik pengoperasian pointer secara umum dibagi kedalam kelompok-kelompok
sebagai berikut:
1. Baru
2. Tambah:
a. Awal (depan)
b. Tengah
c. Akhir
3. Hapus:
a. Awal (depan)
b. Tengah
c. Akhir
Ketiga teknik pengoperasian pointer diatas diberlakukan untuk ilustrasi-ilustrasi:
1. Senarai berantai tunggal tanpa kepala, yaitu kumpulan komponen yang
disusun secara berurutan dengan bantuan pointer. Masing-masing komponen
dinamakan dengan simpul (node).
2. Senarai berantai tunggal bekepala, yaitu senarai berantai yang diawali
sebuah simpul sebagai kepala dengan bantuan pointer menyambung ke
sekumpulan simpul yang disusun secara berurutan.
P1
Medan Penyambung kiri Medan Informasi Medan Penyambung Kanan
(a)
P2
(b)
Nama Alamat Pekerjaan
? ? ? ? ? ? ? ? ?
Modul Praktikum Algoritma dan Pemrograman II
28
3. Senarai berantai tunggal berkepala dan memutar, yaitu sama seperti no. 2.
Diatas, tetapi simpul terakhir menyambung kembali ke simpul kepala.
4. Senarai berantai ganda bekepala, yaitu senarai berantai yang diawali sebuah
simpul sebagai kepala dengan bantuan pointer menyambung kiri tidak
menunjuk ke simpul yang lain (nil) dan pointer penyambung kanan
menunjuk ke sekumpulan simpul yang disusun secara berurutan. Pointer
penyambung kiri dari simpul yang ditunjuk pointer penyambung kanan
simpul kepala kembali menunjuk ke simpul sebelumnya. Pointer
penyambung kanan simpul terakhir tidak menunjuk ke simpul yang lain
(nil).
5. Senarai berantai ganda berkepala dan memutar, yaitu sama seperti no. 4.
diatas, tetapi pointer penyambung kiri simpul kepala menunjuk ke simpul
terakhir dan pointer menyambung kanan simpul terakhir menunjuk ke
simpul kepala, jadi tidak ada pointer yang bernilai nil.
Selain ketiga teknik pengoperasian pointer diatas, ditambah lagi teknik menukar
posisi simpul yang sering diterapkan pada pengurutan data (sortir) dan teknik penelusuran
yang sering diterapkan pada pohon (tree).
Contoh-contoh dasar operasi pointer:
Apabila dideklarasikan tipe pointer sebagai berikut:
type simpul = Data;
Data = record
Nama : string;
alamat : string;
berikut : simpul;
end;
var
T1J2 : simpul;
B. Senarai berantai (linked list)
Pada penjelasan tentang pointer diatas telah dijelaskan bahwa senarai berantai
bersifat dinamis yang dapat mengatasi kekurangan yang terdapat pada data bertipe larik
yang bersifat statis.
Penyajian Senarai berantai:
Penyambung pada setiap simpul digunakan untuk menunjuk kesimpul lain, jika
pointer (penunjuk) bemilai nill, berarti suatu simpul tidak menunjuk ke simpul lain.
Contoh senarai berantai dapat dilihat pada gambar dibawah ini:
Dari diatas dapat dijelaskan sebagai berikut:
Awal
A B C D E
Modul Praktikum Algoritma dan Pemrograman II
29
Pointer awal menunjuk simpul pertama yang berisi info A, dari medan penunjuk
simpul pertama menunjuk simpul kedua yang berisi info B dan seterusnya hingga
akhirnya simpul terakhir tidak menunjuk ke simpul yang lain lagi (nil).
Operasi pada senarai berantai:
1. Operasi pointer pada senarai berantai tunggal
Sebelum membicarakan operasi pointer pada senarai berantai tunggal
(single link list) yang diberlakukan untuk semua operasi-operasi data bertipe
pointer terlebih dahulu disampaikan deklarasi umum sebagai berikut:
type Simpul = ^Data;
Data = record
info : char;
berikut : simpul;
end;
var
elemen : char;
awal, akhir, haru : Simpul;
a. Simpul baru
Simpul baru dapat ditambahkan pada senarai berantai dengan
perintahperintah:
Readln(elemen);
new(baru);
baru^.info := elemen;
baru^.berikut := nil;
awal := baru;
akhir := baru;
b. Tambah simpul
Untuk sernua proses penambahan baris pertama dan kedua dari
program simpul baru diatas selalu digunakan. Penambahan Simpul pada
senarai berantai tunggal dibagi kedalam beberapa cara, yaitu:
Tambah di belakang:
Untuk menambah di akhir senarai, terlebih dahulu ditinjau apakah
senarai sudah ada atau belum, jika belum ada (awal := nil), maka program
simpul baru diatas bisa digunakan, jika sudah ada (berarti simpul yang
ditunjuk pointer akhir sudah ada), maka program berikut ini dikedakan
(gambaran urutan hasilnya dapat dilihat pada garnbar 10:
Akhir^.berikut := baru;
akhir := baru;
akhir^.berikut:=nil;
Tambah di depan
Sama seperti tambah simpul di belakang, terlebih dahulu tinjau
apakah senarai sudah ada atau belum, jika belum lakukan perintah yang
sama dengan tambah dibelakang, jika sudah ada lakukan perintah berikut
baru^.berikut:= awal;
Modul Praktikum Algoritma dan Pemrograman II
30
awal:=baru;
Penambahan di tengah
Sama dengan operasi penambahan simpul di belakang dan di depan,
operasi penambahan simpul ditengah diawali dengan membuat simpul
baru, mengkopi nilai elemen ke info pada simpul, meninjau apakah senarai
sudah ada atau belum.
Jika pada operasi penambahan di belakang atau di depan dengan
cepat ditemukan posisi peletakan simpul (karena awal dan akhir simpul
sudah diketahui), tetapi pada penambahan simpul di tengah harus dicari
dahulu posisi peletakan simpul baru tersebut.
Untuk proses pencarian ini dibutuhkan pointer bantuan (pada
deklarasi Var ditambahkan. nama pointer, misaInya bantu yang bertipe
pointer) yang berfungsi untuk penunjuk simpul pada posisi schelum
(didepan) simpul baru disisipkan. Berikut ini adalah program untuk
meletakkan posisi bantu:
bantu := awal;
while elemen > bantu^.berikut^.info do
bantu := bantu^.berikut;
Program diatas mengandung pengertian bahwa selama nilai elemen
lebih besar dari nilai info pada simpul setelah simpul yang ditunjuk oleh
bantu maka pointer bantu menunjuk simpul berikutnya. Jika penunjuk
bantu berhenti pada suatu simpul, programnya adalah sebagai berikut:
Baru^.berikut:=bantu^.berikut;
Bantu^.berikut := baru;
Perintah diatas jangan dibalik.
c. Hapus simpul
Seperti operasi pada penambahan simpul, operasi menghapus simpul
juga bisa dibagi menjadi:
1. hapus simpul pertarna.
2. hapus simpul akhir
3. hapus simpul di tengah
Untuk operasi penghapusan simpul nilai elemen tidak perlu di kopikan
ke variabel simpul (untuk deklarasi diatas, variabelnya adalah info), karena
hanya berfungsi untuk pembanding. Kemudian untuk operasi penghapusan
simpul ini, selain pointer awal dan akhir dibutuhkan beberapa pointer
bantuan untuk menunjuk pointeryang akan dihapus dan pointer pencari posisi
simpul.
Yang terpenting dalam menghapus simpul adalah usahakan bahwa
senarai jangan sampai terputus terutama, pada saat menghapus simpul
ditengah.
Modul Praktikum Algoritma dan Pemrograman II
31
Ilustrasi penghapusan simpul:
1. Menghapus simpul di awal
Gambar dibawah mengilustrasikan penghapusan simpul yang
terdapat di awal senarai, yang pada mulanya pointer awal menunjuk ke
simpul terdepan dari senarai berantai.
Program penghapusan simpul di awal senarai dapat ditulis
sebagai berikut:
hapus:= awal;
awal:=hapus^.berikut; {gambarl3}
dispose (hapus);
2. Menghapus simpul di tengah
Penghapusan simpul yang terdapat di tengah senarai berantai,
apabila lokasi simpul yang akan dihapus sudah diketemukan (setelah
simpul yang ditunjuk oleh pointer bantu), maka program penghapusan
tersebut adalah sebagai berikut:
hapus:=bantu^.berikut;
bantu^.berikut:=hapus^.berikut;
dispose (hapus);
3. Menghapus simpul di akhir
Menghapus simpul di akhir senarai dapat dilakukan dengan
program berikut Oika memenuffi if hapus = akhir):
akhir := bantu;
akhir^.berikut:= nil;
dispose(hapus);
III. PRAKTEK
program tambah_hapus_pointer;
type Simpul = ^Data;
Data = record
info : char;
berikut : Simpul;
end;
var
Elemen : char;
Awal,Akhir,Baru : Simpul;
procedure inisialisasi(var awal,akhir: Simpul);
begin
awal := nil;
akhir := nil;
end;
procedure tambah_belakang(var awal,akhir : Simpul;elemen : char);
var
baru: Simpul;
Hapus Awal Akhir
A B C D
Modul Praktikum Algoritma dan Pemrograman II
32
begin
new(baru);
baru^.info=elemen;
if awal = nil then
awal := baru
else
akhir^.betikut := baru;
akhir := baru;
akhir^.berikut := nil;
end;
procedure tambah_depan(var awal,akhir : Simpul;elemen : char);
var
baru : Simpul;
begin
new(baru);
baru^.info := elemen;
if awal = nil then
akhir := baru
else
baru^.berikut := awal;
awal := baru;
end;
procedure tambah_tengah(var awal,akhir : Simpul;elemen : char);
var
baru,bantu : Simpul;
begin
new(haru);
baru^.info := elemen;
if awal = nil then
begin
awal:=baru;
akhir:=baru;
end
else
begin
{ mencari lokasi yang sesuai }
bantu:=awal;
while elemen > bantu^.berikut^.info do
bantu:=bantu^. berikut;
{menyisipkan simpul baru} baru^.berikut:=bantu^. berikut;
bantu^. berikut:=baru;
end;
end;
procedure hapus_simpul (var awal,akhir : simpul;elemen : char);
var
bantu,hapus : simpul;
begin
if awal=nil then { senarai masih kosong}
writeln(Senarai masih kosong) else
if awal^.info = elemen then {simpul pertama dihapus}
begin
hapus:=awal;
awal:=hapus^.berikut;
dispose(hapus);
end
else {menghapus tengah atau terakhir}
Modul Praktikum Algoritma dan Pemrograman II
33
begin
bantu:=awal; {mencari simpul yang akan dihapus}
while (elemen bantu^.berikut^.info) and (hantu^. berikutnil) do
bantu:=bantu^.berikut;
hapus:=bantu^.berikut;
if hapusnil then {simpul yang akan dihapus ketemu}
begin
if hapus akhir then {simpul tengah dihapus}
bantu^.berikut:=hapus^.berikut
else {simpul terakkir dihapus}
begin
akhir:=bantu;
akhir^. berikut:=nil;
end;
dispose(hapus);
end else
{ simpul yang akan dihapus tidak ketemu }
writeln(Simpul yang akan dihapus tidak ketemu');
readln;
end;
end;
procedure baca_tambah;
var
menu : integer;
begin
repeat
clrscr;
gotoxy (10,5);write(Masukkan karakter : );readln(elemen); gotoxy (10,7);write('1. Tambah depan);
gotoxy (10,8);write('2. Tambah tengah');
gotoxy (10,9);write('3. Tambah akhir');
gotoxy (10,10);write('4. Selesai);
gotoxy (10,12); write('Pilihan : ');readln(menu);
case menu of
1 : tambah_depan(awal,akhir,elemen);
2 : tambah_tengah(awal,akhir,elemen);
3 : tambah_belakang(awal,akhir,elemen);
end;
until menu = 4;
end;
procedure baca_hapus;
begin
clrscr;
gotoxy (10,11); write('Masukkan karakter : ');readln(elemen);
hapus_simpul (awal,akhir,elemen);
end;
procedure cetak(var awal : simpul);
var
bantu : simpul;
begin
bantu := awal;
repeat
write(bantu^.info:2,');
bantu:=bantu^. berikut;
until bantu = nil;
Modul Praktikum Algoritma dan Pemrograman II
34
readln;
end;
{ program utama }
begin
repeat
clrscr;
gotoxy (10,5); write('1. Tambah');
gotoxy (10,6); write(2. Cetak); gotoxy (10,7); write(3. Hapus); gotoxy (10,8); wiite('4. Selesai);
gotoxy (10,10); write('Pilihan : ');readin(pil);
case pil of
'1' : baca_tambah;
'2 : cetak(awal); 3 : baca_hapus; end;
until Pil =4; end.
Tugas :
Buatlah program antrian untuk pembehan karcis Bioskop, setiap ada tambahan pembeli
diletakkan di akhir antrian, pembeli yang selesai dilayani dihapus dari antrian (hapus di
depan) dan bagi pembeli yang batal (keluar dad antrian) segera dihapus.
Modul Praktikum Algoritma dan Pemrograman II
35
MODUL IX
GRAFIK DAN SUARA
(1 x pertemuan)
I. TUJUAN
- Mempelajari pembuatan program untuk membangkitkan suara dan mode grafik
II. TEORI SINGKAT
A. SUARA
Bunyi speaker dapat dibangkitkan dengan menggunakan prosedur Sound.
PROCEDURE Sound(frek:Word);
Frek menyatakan frekuensi bunyi dalam herzt. Bunyi yang dihasilkan hanya dapat
dihentikan dengan prosedur NoSound. Lama suara diatur dengan delay.
B. MODE GRAFIK
Pada mode grafik memungkinkan kita menggambar apapun, karena elemen terkecil
penyusun grafik adalah titik (pixsel).
Mengaktifkan Mode Grafik
Untuk memilih mode grafik anda harus melakukan inisialisasi terlebih dahulu
terhadap sistem grafik. Hal ini dilakukan dengan memanggil prosedur bernama Initgraph.
Bentuk deklarasi :
PROCEDURE InitGraph(Var DriverGrafik : Integer;
Var ModeGrafik : Integer;
PathDriver : String);
Contoh program untuk membentuk lingkaran :
GraphResult dipakai untuk memeriksa keberhasilan mode grafik anda.
CloseGraph dipakai untuk menutup mode grafik ke mode teks.
GetMaxX memberi nilai bertipe integer yang menyatakan nomor kolom terbesar
pada mode grafik sekarang.
GetMaxY memberi nilai bertipe integer yang menyatakan nomor baris terbesar
pada mode grafik sekarang.
PutPixel(x, y, w); menggambar sebuah titik pada baris yang, kolom x dan warna w
GetPixel(x, y); memberi kode warna pixel yang berada pada koordinat x kolom
yang
MoveTo(x, y); meletakkan penunjuk sekarang ke kolom x baris yang
MoveRel(dx, dy); meletakkan penunjuk sekarang ke kolom x+dx, baris yang+dy
dengan (x,y) adalah posisi semula dari penunjuk sekarang.
GetX menghasilkan posisi kolom dari penunjuk sekarang
GetY menghasilkan posisi baris dari penunjuk sekarang
LineTo(x,y); Menggambar dari posisi penunjuk sekarang ke koordinat (x, y).
setelah dibuat penunjuk sekarang ada di koordinat (x,y).
Modul Praktikum Algoritma dan Pemrograman II
36
LineRel(dx,dy) Menggambar dari posisi penunjuk sekarang ke koordinat (x+dx,
y+dy)., dengan (x,y) adalah posisi semula dari penunjuk sekarang . setelah dibuat
penunjuk sekarang ada di koordinat (x+dx,y+dy).
Line dipakai untuk menggambar garis tetapi tidak mengubah penunjuk sekarang.
Setcolor(x) memberikan warna x pada palete sekarang
III. PRAKTEK
A. Suara
Program pas91;
Uses Crt,graph3;
Begin
Repeat
Sound(1000); {frekuensi pertama}
Delay(200); {tunda sebentar}
Sound(400); {frekuensi kedua}
Delay(200); {tunda sebentar}
Until Keypressed;
NoSound; {menghentikan suara}
End.
Program pas92;
Uses Crt, Graph3;
Const
Escape=#27;
Var
Tombol : Char;
Frek : Word;
Bunyi : Boolean;
Begin
ClrScr;
GotoXY(30,07);Write(' SIMULASI PIANO ');
GotoXY(30,09);Write('===================');
GotoXY(30,10);Write('| W E T Y U |');
GotoXY(30,11);Write('| A S F G H J K |');
GotoXY(30,12);Write('===================');
Repeat
Tombol := ReadKey;
Tombol := UpCase(Tombol);
Bunyi := True;
Case Tombol Of
'A' : Frek := 131;
'W' : Frek := 191;
'S' : Frek := 147;
'E' : Frek := 156;
'F' : Frek := 175;
'T' : Frek := 185;
'G' : Frek := 196;
'Y' : Frek := 208;
'H' : Frek := 220;
'U' : Frek := 233;
'J' : Frek := 247;
'K' : Frek := 262;
Else
Modul Praktikum Algoritma dan Pemrograman II
37
Bunyi := False
End;
If Bunyi Then
Begin
Sound(frek);
Delay(200);
NoSound;
End;
Until Tombol = Escape;
End.
B. Grafik
program pas93;
uses graph;
var
DriverGrafis, ModeGrafis : integer;
Begin
DriverGrafis := Detect;
InitGraph(DriverGrafis,ModeGrafis,'c:\tp\bgi\');
If GraphResult GrOk then
Begin
Writeln(Mode grafik tidak berhasil); Halt(1); {Berhenti}
End;
Circle(GetMaxX div 2, GetMaxY div 2, GetMaxY div 4);
Readln;
Closegraph;
End.
program pas94;
uses graph;
var
DriverGrafis,ModeGrafis : integer;
FrekDasar,FrekMod,Amp,Sudut,SumbuX : integer;
Tinggi : real;
Begin
DriverGrafis := Detect;
InitGraph(DriverGrafis,ModeGrafis,'c:\tp\bgi\');
If GraphResult GrOk then
Begin
Writeln('Mode grafik tidak berhasil');
Halt(1); {Berhenti}
End;
FrekDasar := 3;
FrekMod:= 10;
Amp := GetmaxX div 4;
SumbuX := GetMaxY div 2;
For Sudut := 1 To GetMaxX do
Begin
Tinggi := Amp * (Sin(FrekDasar * PI * Sudut/180)) *
(Sin(FrekDasar * PI * Sudut/180));
PutPixel(Sudut, SumbuX - Round(Tinggi), GetMaxColor);
End;
Readln;
Closegraph;
End.
program pas95;
Modul Praktikum Algoritma dan Pemrograman II
38
uses graph;
var
DriverGrafis,ModeGrafis : integer;
FrekDasar,FrekMod,Amp,Sudut,SumbuX : integer;
Tinggi : real;
Begin
DriverGrafis := Detect;
InitGraph(DriverGrafis,ModeGrafis,'c:\tp\bgi\');
If GraphResult GrOk then
Begin
Writeln('Mode grafik tidak berhasil');
Halt(1); {Berhenti}
End;
SetColor(4);
Line(320, 100, 200, 200);
Line(320, 100, 440, 200);
SetColor(7);
Line(250, 300, 250, 160);
Line(390, 300, 390, 160);
SetColor(6);
Line(150, 300, 490, 300);
Readln;
Closegraph;
End.
Tugas :
Buatlah tampilan gambar grafik dengan bentuk :