PASCAL

PASCAL


Percabangan

 Kodesumber
Perhatikan kode-sumber percabangan di bawah ini:

  {

    demo penggunaan begin didalam if, 

    perhatikan juga bahwa 

      sebelum else TIDAK ADA tanda titik_koma [;]

  }

  var

   cinta:boolean;

  begin

  cinta:=true;

  

  if(cinta) then

     begin

       writeln('''''''');

       writeln('Alhamdulillah ...!!!');

     end

  else

     writeln('dukun bertindak!');

  

  end.

Penjelasan:

Kodesumber program pascal di atas berguna untuk menampilkan tulisan Alhamdulillah ... !!! di layar jika variable cinta bernilai TRUE dan menampilkan di layar tulisan dukun bertindak! jika variable cinta bernilai false.
………………………………………………………………………………………………………….
Nested FOR
Kode sumber berikut mencontohkan bagaimana mencetak tanda plus ( + ) dan tanda pagar ( # ) seperti terlihat di bawah ini.

+ # # # # # # # # #
+ + # # # # # # # #
+ + + # # # # # # #
+ + + + # # # # # #
+ + + + + # # # # #
+ + + + + + # # # #
+ + + + + + + # # #
+ + + + + + + + # #
+ + + + + + + + + #
+ + + + + + + + + +

Tahap-tahapnya terlihat, mulai dari
nstdfor0.pas yang hanya menampilkan tanda  tambah sepuluh kali
+ + + + + + + + + +

nstdfor1.pas sudah dapat menampilkan tanda tambah yang berbentuk segitiga seperti dibawah ini
+
+ +
+ + +
+ + + +
+ + + + +
+ + + + + +
+ + + + + + +
+ + + + + + + +
+ + + + + + + + +
+ + + + + + + + + +

hingga
nstdfor2.pas yang bisa menampilkan yang kita harapkan:
+ # # # # # # # # #
+ + # # # # # # # #
+ + + # # # # # # #
+ + + + # # # # # #
+ + + + + # # # # #
+ + + + + + # # # #
+ + + + + + + # # #
+ + + + + + + + # #
+ + + + + + + + + #
+ + + + + + + + + +
……………………………………………………………………………………………………………………………………………..

Lopis

Permasalahan

Kita ingin menampilkan sebuah lopis (atau segitiga) dengan tinggi 17 baris seperti dibawah ini:


                 *
                ***
               *****
              *******
             *********
            ***********
           *************
          ***************
         *****************
        *******************
       *********************
      ***********************
     *************************
    ***************************
   *****************************
  *******************************
 *********************************

Kode Sumber


  {

    solusi untuk tugas praktikum 01

    Algoritma dan Pemrograman 1

    Materi: FOR..DO

  }

  

  uses crt;

  const

  tinggi=17;

  var

  baris,spasi,bunga:byte;

  begin

  for baris:= 1 to tinggi do

    begin

    for spasi:=baris to tinggi do

      write(' ');{spasi}

    for bunga:=1 to 2*baris-1 do

      write('*');{bunga}

    writeln;

    end;

  end.

Analisis

Kodesumber di atas sebenarnya mendemokan penggunaan FOR dua lapis dan penggunaan CONST. Mahasiswa yang dapat menemukan sendiri solusi permasalahan ini tanpa melihat kodesumber biasanya mereka yang akan mendapatkan nilai A, dan biasanya hanya mereka yang akan dapat mendapatkan nilai C ke atas yang akan mengerti dengan kode sumber (jawaban/solusi) ini. Jika Anda setelah membaca penjelasan ini tapi masih juga tidak mengerti, perbanyaklah berlatih, karena Anda dikhawatirkan akan gagal kuliah ini.

CONST

Perhatikan, pada kode sumber terdapat perintah
const
  tinggi=17;
yang berfungsi untuk membuat sebuah konstanta bernama tinggi yang isinya bilangan bulat 17.
Konstanta itu seperti variable, tapi dia tidak dapat diubah oleh program.

Penggunaan konstanta biasanya untuk
  • membuat program kita lebih mudah dibaca dan
  • membuat kita lebih mudah mengubah nilai suatu tetapan, jadi tidak harus mengganti semua nilai, tapi cukup mengganti isi konstanta saja di awal program.
Dengan adanya konstanta ini, kita dapat mengubah-ubah tinggi lopis (segitiga) kita.

Cara Memecahkan Permasalahan

Perhatikan setiap baris lopis/segitiga yang akan ditampilkan, terdapat spasi yang banyaknya 17 dan kemudian diikuti sebuah karakter bunga/asterik.
 Baris
Spasi
Asterik
 1
 17
1
 2
 16
3
 3
 15
5
 4
 14
7

Coba amati bahwa untuk setiap barisnya, jumlah spasi berkurang satu persatu mulai dari 17 (dibaris ke-1), 16 dibaris ke-2 hingga nantinya cuma tinggal 1 di baris terakhir, baris 17.

Setelah dicetak spasi, kita harus mencetak bunga atau karakter asterik ( * ) sebanyak 1 dibaris ke-1, 3 dibaris ke-2, 5 dibaris ke-3, 7 dibaris ke-4 ... begitu terus sehingga banyak bunga/asterik yang dicetak adalah (2*baris - 1)

Jangan lupa, bahwa setelah itu, kita harus mencetak sebuah garis baru, newline, makanya kita akan menambahkan writeln di sana.

Untuk mencetak baris ke-1

  • cetak spasi 17kali
    • perintah write(' '); sebanyak 17kali

write(' ');write(' ');write(' ');write(' ');write(' ');write(' ');write(' ');write(' ');write(' ');write(' ');write(' ');write(' ');write(' ');write(' ');write(' ');write(' ');write(' ');
    • dengan for, kita dapat menyederhanakan perintah diatas menjadi
   
for spasi:= 1 to 17 do

      write(' ');

  • cetak bunga 1 kali
    • write('*');

  • cetak barisbaru /newline dengan writeln;
    • writeln;


Untuk mencetak baris ke-2


  • cetak spasi 16kali
    • perintah write(' '); sebanyak 16kali

write(' ');write(' ');write(' ');write(' ');write(' ');write(' ');write(' ');write(' ');write(' ');write(' ');write(' ');write(' ');write(' ');write(' ');write(' ');write(' ');
    • dengan for, kita dapat menyederhanakan perintah diatas menjadi
   
for spasi:= 1 to 16 do

      write(' ');

  • cetak bunga 3 kali
    • write('*');write('*');write('*');
    • atau dapat disederhanakan dengan for
o    for bunga:=1 to 3 do

      write('*');
  • cetak barisbaru /newline dengan writeln;
    • writeln;

Untuk mencetak setiap baris selanjutnya

Begitu seterusnya untuk_setiap_baris dengan algoritma
  • Cetak spasi sebanyak baris
  • Cetak bunga sebanyak 2*baris -1
  • Cetak barisbaru (writeln;)

Sedangkan karena baris itu sendiri juga perulangan, yang akan berulang mulai dari 1 hingga 17 (tinggi lopis kita adalah 17), maka kita juga dapat melakukan FOR terhadap baris, sehingga algoritma untuk permasalahan kita adalah:


for baris:=1 to 17 do
  • cetak untuk_setiap_baris
sehingga, jika untuk_setiap_barisnya diganti dengan senarai diatas, algoritmanya menjadi:

for baris:=1 to 17 do
  • Cetak spasi sebanyak baris
  • Cetak bunga sebanyak 2*baris -1
  • Cetak barisbaru (writeln;)

Wajik

Wajik atau diamond adalah pengembangan lopis, dimana terdapat dua lopis yang saling tumpang tindih. Perhatikan contoh tampilan wajik di bawah ini:

C:\>diamond 5
     *
    ***
   *****
  *******
 *********
  *******
   *****
    ***
     *

Prosedur

bandingkan prosedur diamond a.k.a wajik di bawah ini dengan prosedur lopis

  procedure diamond(tinggi:integer);

  var

  i,j,k:integer;

  begin

    {lopis bagian atas}

  for i:= 1 to tinggi do

    begin

    for j:=i to tinggi do

      write(' ');

    for k:=1 to 2*i-1 do

      write('*');

    writeln;

    end;

    {tambahan : lopis bagian bawah}

  for i:= tinggi-1 downto 1 do

    begin

    for j:=i to tinggi do

      write(' ');

    for k:=1 to 2*i-1 do

      write('*');

    writeln;

    end;

  end;
……………………………………………………………………………………………………………………………………………………………

repeat-until

REPEAT pacaran UNTIL putus

blok program REPEAT xxx UNTIL(yyy) berguna untuk perulangan yang akan dilakukan paling tidak sekali, lalu diulang lagi hingga kondisi xxx bernilai TRUE. Oleh karena itu, kondisi yyy harus tidak boleh selamanya FALSE, harus ada sesuatu yang akan menyebabkan yyy bernilai true agar komputernya tidak "hang" 

repeat1.pas

 
var
  i:integer;
begin
  i:=1;
  Repeat
    writeln(i);
    i:=i+1;
  Until i>5;
end.
 
repeat1.exe jika dijalankan akan menampilkan tulisan 1 sampai 5 di layar.

repeat2.pas

 
var
  i:integer;
begin
  i:=5;
  Repeat
    writeln(i);
    i:=i+1;
  Until i=5;
end.
 


repeat3.pas

 
var
  i:integer;
begin
  i:=10;
  Repeat
    writeln(i);
    i:=i+1;
  Until i>5;
end.
 

Perhatikan baik-baik pada contoh kode sumber repeat2.pas! Pada repeat2, hati-hatilah dengan penulisan bagian UNTIL pada perulangan REPEAT..UNTIL, jika Anda salah, maka komputer akan terus melakukan perulangan. Anda beruntung kali ini karena integer tidaklah terlalu besar, maka masih bisa berhenti setelah mencapai MAX_INTEGER, lalu overflow, menjadi MIN_INTEGER, lalu terus bertambah hingga kembali nol dan berhenti di lima.
Perhatikan repeat3.pas, dimana walaupun i bernilai 10, repeat..until tetap dipanggil.
………………………………………………………………………………………………………..

TYPE

Intro

Untuk membuat tipe data bentukan, kita menggunakan perintah TYPE. Perhatikan dua contoh pertama, mhs01.pas dan mhs02.pas.

mhs01.pas

type
  Mahasiswa =
record
    nama :
string[30];
    alamat: string[40];
    umur : byte;
end;

begin

end.

Penjelasan mhs01.pas

Pada contoh pertama ini, kita dapat membuat sebuah tipe baru, yaitu Mahasiswa, yang merupakan gabungan dari nama, alamat, dan umur. Dengan membuat tipe-data baru ini, akan memudahkan dan menyederhanakan kita dalam membuat sebuah variable yang merepresentasikan Mahasiswa, karena tidak harus membuat banyak nama dan alamat serta umur apabila Mahasiswanya telah banyak. Perhatikan contoh kedua, mhs02.pas untuk lebih mengerti.

Seperti terlihat di contoh, untuk membuat tiga mahasiswa, kita cukup dengan mengetikkan:
var

  anto,budi,citra : mahasiswa;
Coba bandingkan jika Anda harus membuat variable seperti ini
var

  mhs1nama:string[30];

    mhs1alamat:string[40];

    mhs1umur:byte;
  mhs2nama:string[30];

    mhs2alamat:string[40];

    mhs2umur:byte;
 
  mhs3nama:string[30];

    mhs3alamat:string[40];

    mhs3umur:byte;
 
tentu akan lebih ribet, kan???

mhs02.pas


  type 

  Mahasiswa = record

    nama  : string[30];

    alamat: string[40];

    umur  : byte;

  end;

  var

  anto,budi,citra : mahasiswa;

  begin

  

  anto.nama   := 'Anto';

  anto.alamat := 'Jl. Jalan, Gg. Guin No.10';

  anto.umur   := 19;

  writeln(anto.nama);

  writeln(anto.alamat);

  writeln(anto.umur);

  

  with budi do

  begin

    nama  := 'Budi Putra';

    alamat:= 'Jl. Jujur';

    umur  := 18;

    writeln;

    writeln(nama,#10,alamat,#10,umur);

    {karakter #10 adalah LF (Line Feed), atau baris baru}

  end;

  

  with CiTrA do

  begin

    nAmA  := 'Citra Bersahaja';

    aLamAt:= 'Gg. Al@Y';

    umur  := 16;

    writeln(#10,#10,'Nama:',#9,nama,#10,'Alamat:',#9,alamat,#10,'Umur:',#9,umur);

    {karakter #9 adalah HT, Horizontal Tab}

  end;

  end.
…………………………………………………………………………………………………………………………………….

Rekursif

Contents
  1. 1 Faktorial
    1. factrl.pas
    2. Penjelasan factrl.pas
    3.  Penjelasan Range Tipedata Integer pada TurboPascal 7
    4. 1.4 Alternatif Lain: Faktorial dalam LongInt
  2. 2 Fibonacci
Fungsi rekursif adalah fungsi yang memanggil dirinya sendiri. Dikarenakan dia  memanggil dirinya sendiri, kita harus hati-hati agar program kita harus benar-benar menuju stopping conditions (kondisi dimana fungsi tersebut akan berakhir) agar komputer tidak "hang."

Contoh sederhana yang sering digunakan untuk fungsi rekursif adalah menghitung bilangan faktorial dan menentukan bilangan Fibonacci.

Faktorial

Faktorial dari suatu bilangan adalah hasil kali semua angka mulai dari satu hingga bilangan tersebut. Faktorial suatu bilangan dituliskan dengan tanda seru setelah bilangan tersebut.
Faktorial 0 adalah 1.
Faktorial 1 adalah 1.
Faktorial 2 adalah 2x1.
Faktorial 3 adalah 3! = 3 x 2 x 1.
...

Faktorial 10 adalah 10! = 10 x 9 x ... x 1

Faktorial n adalah n x n-1 x n-2 x ...  x 1
atau, Faktorial (n) adalah n x faktorial(n-1)

factrl.pas



  function factorial(x:integer):integer;

  begin

  if x = 0 then factorial:=1

  else

    factorial := x*factorial(x-1);

  end;

  

  var i:integer;

  begin

  for i:=0 to 10 do

    writeln(i,'!=',factorial(i));

  end.

Penjelasan factrl.pas

Perhatikan batas nilai yang bisa disimpan oleh integer
0!=1
1!=1
2!=2
3!=6
4!=24
5!=120
6!=720
7!=5040
8!=-25216
9!=-30336
10!=24320

8! seharusnya adalah 40320, tapi mengapa disana adalah -25216?

Penjelasan Range Tipedata Integer pada TurboPascal 7

  Integer types
  ▀▀▀▀▀▀▀▀▀▀▀▀▀▀
 Turbo Pascal provides five predefined Integer types. Each type denotes a
 specific subset of the whole numbers, as shown here:

    Type       Range                     Format
    Shortint   -128..127                 Signed 8-bit
    Integer    -32768..32767             Signed 16-bit
    Longint    -2147483648..2147483647   Signed 32-bit
    Byte       0..255                    Unsigned 8-bit
    Word       0..65535                  Unsigned 16-bit

 All Integer types are ordinal types.

Pelajari integer.pas untuk lebih lanjut.
8! - maxint = 7553
40320 - 32767 = 7553
berarti ada 7553 bilangan lagi yang overflow.
Jika overflow 1 adalah -32768, ==> 1 - 32769 = -32768
overflow 2 adalah -32767,
overflow 3 adalah -32766,
berapa overflow 7553?
jawaban: 7553 - 32769 = -25216

Sekarang tugas Anda untuk menentukan kenapa 9! disana hasilnya adalah -30336, padahal, 9! seharusnya adalah 362880

Alternatif Lain: Faktorial dalam LongInt

0!=1
1!=1
2!=2
3!=6
4!=24
5!=120
6!=720
7!=5040
8!=40320
9!=362880
10!=3628800


  function factorial(x:integer):longint;

  begin

  if x = 0 then factorial:=1

  else

    factorial := x*factorial(x-1);

  end;

  

  var i:integer;

  begin

  for i:=0 to 10 do

    writeln(i,'!=',factorial(i));

  end.

Comments

  1. Casinos Near Me (ALT) - MapYRO
    Find Casinos 나주 출장안마 Near Me (ALT) location in Downtown 시흥 출장안마 Las Vegas, NV and other American 거제 출장샵 cities. Casinos 순천 출장안마 near me · 1. LAS VEGAS (NV) - Hotels near 동해 출장안마 me · 2. JERSEY CITY (WYNN).

    ReplyDelete

Post a Comment

Popular posts from this blog

contact person

aplikasi pianika pc