Translate

Thursday, April 25, 2013

pemograman terstruktur


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.
























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