MODUL I
TIPE ARRAY
I.      
TUJUAN
Mempelajari tipe
terstruktur Array dimensi satu dan dimensi dua.
II.   
TEORI SINGKAT
Array merupakan tipe data
terstruktur yang dapat menyimpan banyak data yang bertipe sama, dimana
masing-masing elemen array dapat diakses melalui indek array.
Arrray
Dimensi Satu
Adalah array yang hanya
memiliki satu tipe indek.
Deklarasi variabel bertipe
array dimensi :
               Var
                
NamaArray : Array{tipeIndek] of TypeArray;
NamaArray
adalah
nama variabel bertipe array dan TypeArray
adalah tipenya. TypeArray dapat
berupa Integer, real, char, string atau record. Sedangkan tipeIndek dari array merupakan tipe ordinal seperti char, byte,
integer, atau enumerasi.
Contoh deklarasi tipe array
:
     Nilai :
Array [1 .. 100] of integer;
Contoh diatas berarti
dilakukan pemesanan tempat dimemori sebanyak 100 elemen yang akan ditampung
dalam variabel Nilai yang tiap-tiap elemen hanya dapat menampung data bertipe
integer (bilangan bulat)
Contoh Program :
| 
Program
  Array_Dimensi_satu; 
uses
  Crt; 
Const 
  max = 100; 
Var 
  Nilai : Array[1..max] of integer; 
  i, j : integer; 
Begin 
   ClrScr; 
   {Menciptakan angka random} 
   Randomize; 
   for i := 1 To Max do 
      Nilai[i] := random(Max); 
   j := 0; 
   for i := 1 to max do 
      Begin 
         Write(i,'  '); 
         j := j + 1; 
         if J >= 10 Then 
            Begin 
               Writeln; 
               J := 0; 
            End; 
      End; 
   Readln 
End. | 
Perhatikan output dari
program tersebut dilayar komputer anda. Perhatikan hasilnya bahwa setiap kali
anda menjalankan program maka angka yang ditampilkan akan selalu berubah.
Arrray
Dimensi Dua
Adalah array yang memiliki
dua tipe indek.
Deklarasi variabel bertipe
array dimensi dua :
               Var
                
NamaArray : Array{tipeIndek1,tipeIndek2] of TypeArray;
Contoh program :
| 
Prog
  Matrik2Dimensi; 
Use
  Crt; 
var 
  Matrik     
  : Array[1..10,1..10] Of integer; 
  Baris,Kolom : Integer; 
Begin 
  ClsRcr; 
  {-Memasukkan data matrik-} 
  For Baris := 1 to 2 Do 
   Begin 
     For kolom := 1 to 2 Do 
       Begin 
         Write('Baris ',Baris,' Kolom
  ',Kolom,' : '); 
         Readln(Matrik(Baris,Kolom)); 
       End; 
   End 
  {--Menampilkan Hasil--} 
  For Baris := 1 to 2 Do 
    Begin 
      For kolom := 1 to 2 Do 
        Begin 
          Write(Matrik(Baris,Kolom):5); 
        End; 
    End; 
  Readln 
End. | 
Latihan
Soal
Buatlah algoritma, flowchart
dan program untuk menghitung perkalian dua buah matrik.
 MODUL II
PROCEDURE DAN FUNGSI
(2x pertemuan)
I.       Tujuan
Mempelajari pemecahan program ke dalam modul-modul
program dalam bentuk prosedur dan fungsi
II.    Teori Singkat
a.     
PROCEDURE
Procedure
merupakan sub program yang berdiri sendiri yang dapat dipanggil dari program
utama. 
Deklarasi
prosedur :
   PROCEDURE
<Nama_prosedur> (<Daftar_parameter_formal>);
   <Bagian_deklarasi>
   Begin
      <Bagian _pernyataan>
   End;
Dalam prosedur
atau fungsi dikenal adanya parameter. Parameter adalah suatu nilai atau
variabel yang akan dilewatkan dalam prosedur atau fungsi. Pengiriman paramter
dalam prosedur atau fungsi dibedakan menjadi 2 yaitu parameter nilai dan
parameter referensi. Pelewatan parameter secara nilai dimaksudkan jika
parameter yang dileatkan dimasudkan tidak unutk diubah oleh prosedur atau
fungsi sekalipun perubahan telah terjadi di dalam prosedur atau fungsi
tersebut. Sedangkan parameter referensi dimasudkan unutk mengubah nilai atau
variabel sekeluarnya dari prosedur atau fungsi. Perbedaan cara pengiriman
parameter didalam prosedur atau fungsi terletak pada deklarasi prosedur atau
fungsinya. Contoh deklarasi prosedur dengan pengiriman parameter secara refensi
:
      Procedure Tukar(var x,y :
real);
Untuk mengubah
sifat pengiriman parameter secara nilai, tinggal diubah deklarasi prosedur
dengan menghilangkan var dalam kepala prosedur sehingga menjadi :
      Procedure Tukar(x,y :
real);
Berikut contoh
program pemakaian untuk menukarkan dua nilai memakai prosedure :
Contoh :
PROG3_01.PAS contoh program menukarkan
data dengan prosedur
| 
program
  tukar_data; 
var 
  a, b : real;          {deklarasi variabel global} 
procedure
  info; 
begin 
  writeln('****************************'); 
  writeln('**   Program Tukar Data   **'); 
  writeln('**    Dengan Procedure    **'); 
  writeln('**        Oleh  
  :        **'); 
  writeln('**     Ki Joko Bodho      **'); 
  writeln('****************************'); 
end; 
{Prosedur
  penukaran data} 
procedure
  tukar(var x,y : real); 
var 
   tamp : real; 
begin 
   tamp := x; 
   x   
  := y; 
   y   
  := tamp; 
end; 
{Program
  utama} 
Begin 
   info; 
   a := 12.33; 
   b := 67.98; 
   writeln('Sebelum memanggil prosedur
  Tukar'); 
   writeln('a = ',a:7:2,'   b = ',b:7:2); 
   tukar(a,b); 
   writeln('Setelah memanggil prosedur
  Tukar'); 
   writeln('a = ',a:7:2,'   b = ',b:7:2); 
   readln; 
End. | 
Contoh diatas
pengiriman parameter dilakukan secara referensi, cobalah program diatas diubah
pengiriman parameter dalam prosedur secara nilai!
b.     
FUNCTION
Fungsi memiliki
struktur yang hampir sama dengan procedure, bedanya fungsi memiliki tipe hasil
sedangkan procedure tidak.
Deklarasi fungsi
:
   FUNCTION
<Nama_fungsi> (<Daftar_parameter>): tipe;
   <Bagian_deklarasi>
   Begin
      <Bagian _pernyataan>
   End;
Contoh :
PROG2_02.PAS contoh program perkalian
dengan fungsi
| 
program
  kali_data; 
var 
  a, b : integer;          {deklarasi variabel global} 
procedure
  info; 
begin 
  writeln('****************************'); 
  writeln('**   Program Tukar Data   **'); 
  writeln('**    Dengan Procedure    **'); 
  writeln('**        Oleh  
  :        **'); 
  writeln('**     Ki Joko Bodho      **'); 
  writeln('****************************'); 
end; 
{Prosedur
  peerkalian data} 
function
  kali(x,y : integer):integer; 
begin 
   kali := x * y; 
end; 
{Program
  utama} 
Begin 
   info; 
   a := 12; 
   b := 67; 
   writeln(a,' x ',b,' = ',kali(a,b)); 
   writeln('12 x 13 = ',kali(12,13)); 
   readln; 
End. | 
c.     
LATIHAN SOAL :
(Program yang anda buat harus dipecah dalam prosedur
dan fungsi!!!!!!)
1.      Buatlah program
dengan menggunakan prosedur untuk membalik suatu angka
Misalnya
:
Masukkan
angka  : 12309
Hasil
pembalikan : 90321
2.    Buatlah program dengan menggunakan fungsi
untuk mencari jumlah dan rata-rata dari sejumlah data yang dimasukkan.
MODUL III
REKURSI
(1 x pertemuan)
I.       Tujuan
Mempelajari proses rekursi dalampenggunaan 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.
Prog4_01.pas
| 
Program
  rekursi; 
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.
Contoh program berikut
merupakan contoh rekursi untuk perhitungan suatu nilai faktorial.
Prog4_02.prg
| 
Var 
 i : byte; 
function
  Faktorial(m:byte):longint; 
begin 
   if m = 0 then 
      faktorial := 1 
   else 
      faktorial := m * Faktorial(m - 1) 
end; 
begin 
   for i := 1 to 8 do 
      writeln(i:2,'! = ',Faktorial(i)); 
   readln 
end. | 
Perhatikan hasil tampilan
dari program diatas, modifikasi program dengan bilangan yang akan
difaktorialkan diinputkan dari keyboard, sehingga menghasilkan tampilan seperti
berikut :
               Masukkan anngka             :
5
               Hasi faktorial :
2  x 4 x 3 x 2 x 1 =
120
Contoh program berikut
merupakan contoh rekursi untuk menghitungan bilangan fibonnaci Prog4_03.prg
| 
Var 
  suku, nilai : integer; 
function
  fibo(n:integer):longint; 
begin 
  if (n=1) or (n=2) then 
    fibo:=1 
  else 
    fibo := fibo(n-1)+fibo(n-2); 
end; 
begin 
  for suku := 1 to 10 do 
   writeln(suku:3,fibo(suku):8); 
  readln 
end. | 
Soal
latihan :
Ubahlah ketiga contoh
program diatas tanpa menggunakan rekursi, tetapi menghasilkan output yang sama.
MODUL IV
RECORD
(2 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; 
                   Banayk : 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’
Contoh program :
| 
Program
  contoh_record; 
Type 
 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. | 
Record di dalam record.
Mungkin saja sebuah record
berisikan record saja. Sebagai contoh :
| 
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. | 
Pernyataan WITH
Untuk menyederhanakan
pernyataan seperti 
               DataPeg.TgLahir.Tgl
Pascal
menyediakan pernyataan WITH, dengan bentuk :
| 
WITH nama_record Do 
           <pernyataan> | 
Pada bentuk ini field-field
yang terletak pada pernyataan dapat disebutkan tanpa menyertakan lagi nama
recordnyadan tanda titik. Untuk jelasnya pada contoh program pertama akan
dimodifikasi dengan pernyataan WITH :
![Text Box: Program contoh_record;
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';
  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.](file:///C:%5CUsers%5CSONY%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_image001.gif)
Latihan Soal :
Buatlah algoritma, flowchart
dan 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 | 
Hari | 
90 | 
A | 
Lulus | 
| 
2 | 
11010001 | 
Jono | 
50 | 
D | 
Tidak Lulus | 
MODULL V
MEMBUAT UNIT
(1 x pertemuan)
I. TUJUAN
Mempelajari
pembuatan unit dengan mengunakan pascal
II. TEORI 
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)
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.prg. 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.prg
| 
uses
  tambkur; 
begin 
  Hapuslayar; 
  Tambah(2,3); 
  Kurang(10,4); 
  Tunda; 
end. | 
Perhatikan hasilnya dan
pelajari !!!!!!!!!!!!!!!!!!!
Latihan
Soal :
Buatlah sebuah program pascal yang memanfaatkan fasilitas unit untuk
menghitung jumlah huruf hidup dan huruf mati dari suatu string yang diinputkan
dari keyboard.
MODUL VI
POINTER
(2 x pertemuan)
I. TUJUAN
Mempelajari tipe
pointer dan penerapannya dalam program
II. TEORI 
Pengertian
pointer (Santoso, 1992) 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 3.
llustrasi perubah statis dan dinamis
Gambar diatas
bisa dijelaskan sebagai berikut. Pada gambar 3.a. perubah A adalah perubah
statis. Dalam hal ini 1000 adalah nilai data yang sesungguhnya dan disimpan
pada perubah (lokasi) A. Pada gambar 3.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.
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.
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 4.
menunjukkan medan informasi pada simpul pointer P1 dan P2.
Dari gambar 4. terlihat ada
kemiripan dengan perubah statis tanpa larik.
|  | 
Gambar 4.
ilustrasi medan informasi pada simpul pointer P I dan P2.
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;
                      berikut   : pegawai;
                 End;
Var PI : pegawai;
Gambar 5. menunjukkan
ilustrasi simpul dengan medan informasi, medan penyambung dan senarai berantai
dari single‑link‑list.
|  | 
Gambar 5.
Ilustrasi simpul dengan medan informasi, medan penyambung dan
senarai berantai
Gambar 5.a. menunjukkan
suatu simpul dengan medan informasi berisi nama, alamat, peke~aan dan medan
penyambung yang bertipe pointer. Garnbar 5.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 6. menunjukkan
ilustrasi simpul dengan medan informasi, medan penyambung dan senarai berantai
dari doubly‑link‑list.
Gambar 6. a.
menunjukkan suatu simpul dengan medan penyambung kiri, medan informasi berisi
nama, alamat, pekedaan dan medan penyambung kanan yang bertipe pointer. Gambar
6.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;
|  | 
Gambar 6.
Ilustrasi simpul dengan medan penyambung kiri, medan informasi,
medan penyambung
kanan dan senarai berantai
             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.
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;
1. 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 8. berikul ini:
|  | 
Gambar 8. Contoh senarai berantai tunggal (single link list)
Dari gambar 8.
diatas dapat dijelaskan sebagai berikut:
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:
1. 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; 
2. 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; 
awal:=baru; 
3. 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.
Gambar 12.
menunjukkan ilustrasi penyisipan simpul baru di tengah, 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 
pada senarai
berantai. 
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.
Bustrasi penghapusan simpul:
1. Menghapus simpul di awal
 Gambar 13.
dibawah mengilustrasikan penghapusan simpul yang terdapat di awal senarai, yang
pada mulanya pointer awal  menunjuk ke
simpul terdepan dari senarai berantai.
|  | 
Gambar 13.
llustrasi penghapusan simpul di awal
Program
penghapusan simpul di awal senarai dapat ditulis sebagai
berikut:
hapus:= awal; 
awal:=hapus^.berikut; {gambarl3} 
dispose (hapus);
2. Menghapus simpul di tengah
Gambar 14. dibawah
menunjukkan flustrasi 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);
Contob program:
| 
{ contoh program pointer}  
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;  
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}
   
        begin  
            bantu:=awal; {mencari simpul yang
  akan dihapus} 
            while (elemen <>
  bantu^.berikut^.info) and (hantu^. berikut<>nil) do  
               bantu:=bantu^.berikut; 
    
           hapus:=bantu^.berikut;  
             if hapus<>nil 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;  
  
  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. | 
Soal:
1.    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 VII
GRAFIK DAN SUARA
(1 x pertemuan)
I. TUJUAN
Mempelajari
pembuatan program untuk membangkitkan suara dan mode grafik
II. TEORI 
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.
| 
Program
  Suara; 
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
  Piano; 
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 
         Bunyi := False 
      End; 
      If Bunyi Then 
         Begin 
            Sound(frek); 
            Delay(200); 
            NoSound; 
         End; 
   Until Tombol = Escape; 
End. | 
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);
Conoth program untuk membentuk lingkaran :
| 
program
  grap; 
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. | 
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
Contoh program :
| 
program
  Frekw; 
uses
  g 
raph; 
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. | 
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).
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
Contoh program :
| 
program
  rumah; 
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. | 
Soal :
Buatlah tampilan gambar
grafik dengan bentuk :
|  | |||
|  | |||
 
No comments:
Post a Comment