Wonderwall

Just another Binusian blog site

Bab 12, Logic Programming Languages

December14

Program program bahasa-bahasa logika diungkapkan dalam bentuk logika simbolik

Proposition adalah Sebuah pernyataan logis yang mungkin atau mungkin tidak benar. Terdiri dari benda-benda, dan hubungan-hubungan objek-objek untuk masing-masing.

Symbolic Logic adalah Logika yang dapat digunakan untuk kebutuhan-kebutuhan dasar logika formal seperti :

  • Proposisi Express
  • Express proposisi hubungan antara
  • menerangkan bagaimana proposisi baru dapat disimpulkan dari proposisi lain

Bentuk tertentu logika simbolik digunakan untuk pemrograman logika yang disebut predicate kalkulus

Object Representation adalah objek dalam proposisi  diwakilkan dengan cara yang simpel:

  • Constant : simbol yang diwakilkan oleh objek
    • Example : x=5;
  • Variabel : simbol yang mewakili objek yang berbeda pada waktu yang berbeda
    • Example : x=a,b;

Compound Terms

  • Proposisi atomic terdiri dari istilah-istilah gabungan
  • istilah gabungan: satu elemen hubungan matematika, ditulis seperti fungsi matematika fungsi matematik
  • fungsi dapat ditulis dengan table

Bagian dari Compound Term:

  • Functor : simbol fungsi yang menghubungkan functor dengan parameter
  • Parameter : sebuah fungsi adalah variabel yang menyertai fungsi tersebut baik saat deklarasi maupun saat pemanggilan fungsi. Dalam bahasa C dikenal dua jenis parameter, yaitu parameter formal dan aktual. Parameter formal adalah  parameter yang berupa variabel yang ada dalam definisi fungsi saat dideklarasikan. Sedangkan parameter aktual adalah parameter yang bisa berupa variabel atau konstanta yang dipakai saat pemanggilan fungsi.

Parameter formal sebuah fungsi harus berupa variabel karena dia bersifat kerangka yang nanti nilainya bisa berubah selama proses program. Tata cara penulisan parameter formal tampak jelas pada saat pembahasan tentang prototipe fungsi. Parameter formal bisa berupa satu atau beberapa variabel yang ditulis setelah nama fungsi, ditaruh didalam kurung dengan masing-masing variabel dipisahkan tanda koma.

Contoh : float hitung_luas_persegi_panjang(float panjang, float lebar)

             float hitung_luas_lingkaran(float diameter)

Pada prototipe masing-masing fungsi terdapat parameter formal yaitu pada fungsi hitung_luas_persegi_panjang terdapat parameter panjang dan lebar serta pada fungsi hitung_luas_lingkaran terdapat parameter diameter.

Parameter aktual merupakan parameter yang dipakai ketika sebuah fungsi dipanggil didalam program. Parameter aktual dapat berupa variabel atau konstanta. Penulisan dan tipe data parameter aktual sebuah fungsi harus mengikuti aturan yang telah ditetapkan oleh parameter formal. Selain itu, parameter aktual juga bisa merupakan hasil dari sebuah operasi bilangan.

Contoh :luas = hitung_luas_persegi_panjang(panjang,lebar);

             luas = hitung_luas_lingkaran(8.5).

Kemudian pada main rutin terdapat contoh pemanggilan fungsi dengan parameter aktual berupa variabel yaitu pada perintah luas = hitung_luas_persegi_panjang (panjang,lebar). Dan contoh pemanggilan fungsi dengan parameter aktual berupa konstanta pada perintah luas = hitung_luas_lingkaran(8.5).

Form of a Preposition :

Proposisi dapat dinyatakan dalam 2 bentuk :

  • Fact : proposisi diandaikan untuk menjadi “benar”
  • Query : kebenaran proposisi yang akan “ditentukan”

Compound Proposition :

  • Mempunyai dua atau lebih proposisi atomik (proposisi sederhana)
  • Proposisi terhubung dengan operator

Logical Operators

aaa1

Quantifiers

aaa2

 

Dua cara yang paling umum pembilang adalah quantifier universal dan quantifier eksistensial. Simbol tradisional untuk quantifier universal adalah “∀”, sebuah berotasi huruf “A”, yang merupakan singkatan dari “untuk semua” atau “semua”. Simbol yang bersangkutan untuk quantifier eksistensial adalah “∃”, sebuah berotasi huruf “E”, yang merupakan singkatan dari “ada” atau “ada”.

EXAMPLE PROGRAM FOR LOGICAL OPERATORS IN C:

  • #include <stdio.h>
  • int main()
  • {
  •    int m=40,n=20;
  •    int o=20,p=30;
  •    if (m>n && m !=0)
  •    {
  •       printf(“&& Operator : Both conditions are true\n”);
  •    }
  •    if (o>p || p!=20)
  •    {
  •       printf(“|| Operator : Only one condition is true\n”);
  •    }
  •    if (!(m>n && m !=0))
  •    {
  •       printf(“! Operator : Both conditions are true\n”);
  •    }
  •    else
  •    {
  •       printf(“! Operator : Both conditions are true. ” \
  •       “But, status is inverted as false\n”);
  •    }
  • }

Outputnya:

  • && Operator : Both conditions are true
    || Operator : Only one condition is true
    ! Operator : Both conditions are true. But, status is inverted as false

Note:

  • In this program, operators (&&, || and !) are used to perform logical operations on the given expressions.
  • && operator – “if clause” becomes true only when both conditions (m>n and m! =0) is true. Else, it becomes false.
  • || Operator – “if clause” becomes true when any one of the condition (o>p || p!=20) is true. It becomes false when none of the condition is true.
  • ! Operator – It is used to reverses the state of the operand.
  • If the conditions (m>n && m!=0) is true, true (1) is returned. This value is inverted by “!” operator.
  • So, “! (m>n and m! =0)” returns false (0).

LOGIKA SECARA UMUM

Logika adalah bahasa. Dengan demikian memiliki sintaks dan semantik. Lebih dari satu bahasa, memiliki kesimpulan aturan.

Sintaks: aturan tentang penulisan rumus dengan format yang benar; Hal ini biasanya merupakan bagian termudah dari logika

Semantik: tentang arti yang dibawa oleh rumus; Ada berbagai cara untuk menjelaskan makna ini, yang paling tradisional disebut “model-teori”, hal ini biasanya konsep yang sulit bagi orang awam.

Secara kasar, semantik menjelaskan semua konsekuensi logis dari formula, misalnya, Misalkan kita memiliki sebuah formula, dilambangkan (“F”).

  • A & B

Di mana & menandakan penghubung logika “dan”, sebuah a dan b adalah dua atom-atom. Kemudian kita tahu bahwa a merupakan konsekuensi logis dari F,  maka juga b. Ini adalah karena a dan b harus benar kapanpun F adalah benar

Perhatikan bahwa ada banyak cara yang berbeda namun setara untuk berbicara tentang gagasan tentang konsekuensi logis:

  • B merupakan konsekuensi logis dari F;
  • B logis () dari F;
  • F menyiratkan B;
  • F melibatkan B;
  • setiap kali F benar maka B benar

Aturan kesimpulan: mengingat kumpulan rumus yg telah diberikan, aturan kesimpulan memungkinkan seseorang untuk mendapatkan formula baru. Misalnya, berbagai aturan yang digunakan dalam sistem pengurangan alami Anda pelajari di Cmput 272. Ingat bahwa salah satu seperti aturan, disebut PENGHAPUSAN HUBUNGANNYA, dan ditulis :

diberikan a & b, memperoleh a

diberikan a & b, memperoleh b

Kita melihat beberapa kebetulan antara kesimpulan dan konsekuensi; merupakan konsekuensi dari & b (semantik), dan dapat berasal dari a & b. Memang, fokus utama dalam logika apapun adalah apa aturan kesimpulan yang setia kepada mendasari semantik. Sebagai contoh, jika aturan kesimpulan

Memperoleh a & b dari a V b, dimana V menunjukkan kata penghubung disjungsi. Kita tahu hal ini salah, karena a & b bukanlah merupakan konsekuensi logis dari a V b. Di sini adalah bukti: menganggap A adalah benar dan b adalah salah, dan dengan demikian a V b benar; Tapi a & b salah. Jadi, pernyataan, “setiap kali a V b benar, maka a & b” belum tentu benar.

Jadi, satu set aturan kesimpulan harus sejalan terhadap semantik. Hal ini diinginkan jika hal ini juga lengkap dalam segala konsekuensi logis dapat diturunkan.

Aspek yang ketiga dari kesimpulan aturan adalah mereka harus efisien. Aturan kesimpulan berdasarkan pemotongan alami jauh terlalu kompleks untuk digunakan; mereka sulit untuk diterapkan. Untuk menjadi lengkap, Anda tidak dapat menghilangkan pengurangan apapun, tidak peduli bagaimana sepele mereka, misalnya dari formula A kami memperoleh A & A, A v A, dll. Hal ini karena pada umumnya tidak ada cara kita akan tahu, di tengah-tengah membuktikan sesuatu, derivation(s) yang akan mengarah pada kesimpulan bahwa kita berusaha untuk mendapatkan dan yang tidak. Kita harus mencoba segala kemungkinan agar tidak kehilangan bukti. Prolog didasarkan pada aturan satu kesimpulan, disebut RESOLUSI. Ini adalah alasan utama mengapa Prolog dapat diimplementasikan relatif efisien.

PENGENALAN PROLOG

Ingat atom, atau formula atom, dalam kalkulus predikat adalah bentuk.

p (t1,…, tn)

Dimana p adalah sebuah predikat simbol dan ti yang disebut persyaratan. Istilah ini didefinisikan sebagai:

  • Variabel atau konstan adalah istilah
  • Jika s1,…, sk persyaratan, dan f adalah simbol k-nary fungsi, maka f(s1,…,sk)
    adalah istilah

Nomor diwakili dalam Prolog seperti biasa. Variabel dalam Prolog adalah sebuah identifier yang dimulai dengan huruf huruf besar; konstan, serta simbol-simbol predikat dan fungsi, mulai dengan huruf kecil. Konstan menandakan sesuatu yang tetap, sementara variabel dapat terikat ke suatu nilai.

Sebagai contoh:

  • likes (mary, john)
  • Greater(3, 2)
  • append (X, Y, Z)
  • p (X, f(Y), g(Z))

Prolog program adalah kumpulan dari apa yang disebut persyaratan program dalam sebuah bentuk:

            A:-B1, B2,…, Bn.

Dimana A dan Bi adalah atom. Perhatikan bahwa simbol “.” pada akhir program klausul adalah bagian dari sintaks Prolog. A disebut kepala klausa dan B’s disebut tubuh. Sebuah klausul bentuk ini setara dengan formula akrab Universal diukur dalam bentuk logika

B1 & B2 &… & Bn-> A

Makna :

  • untuk semua X1,…, Xm, B1 dan B2 dan… dan Bn menyiratkan A
  • (dengan asumsi X1,…, Xm adalah variabel yang muncul dalam klausa)
  • Yang dikatakan setiap kali Bi setiap benar maka A harus benar.
  • Sebuah klausul yang mungkin memiliki tubuh yang kosong

A.

artinya untuk semua variabel a, A benar tanpa kondisi.

Untuk alasan yang jelas, kedua jenis klausul disebut oleh pernyataan-pernyataan BERSYARAT dan tanpa KECUALI programmer Prolog, pernyataan, dll. Tanpa syarat yang juga disebut FAKTA.

Prolog program biasanya berisi pernyataan bersyarat serta fakta.

Contoh. Misalkan kita memiliki informasi tentang hubungan ayah dan ibu, dari mana kita ingin menulis sebuah program yang menentukan hubungan kakek-nenek.

  • grandparent(X,Z) :- parent(X,Y), parent(Y,Z).
  •     parent(X,Y) :- father(X,Y).
  •     parent(X,Y) :- mother(X,Y).
  •     father(ken, marry).
  •     mother(lily, marry).
  •     mother(marry, john).

Ada tiga pernyataan bersyarat:

1) untuk X, Y, Z,

  • Jika X adalah orang tua dari Y dan Y adalah orang tua dari Z, maka xadalah  kakek nenek dari Z

2) untuk setiap X, Y,

  •  Jika X adalah ayah dari Y, maka X adalah orang tua dari Y;

3) untuk setiap X, Y,

  • Jika X adalah ibu dari Y, maka X adalah orang tua dari Y.

 Sekarang, untuk meminta Prolog untuk melakukan sesuatu untuk Anda, Anda perlu memberikan Prolog query (juga disebut tujuan), dalam bentuk :

  • ?-C1, C2,…, Ck.

Dimana C adalah atom. Ini meminta pertanyaan apakah C1 dan C2 dan… dan Ck berikut dari program, yaitu, dengan asumsi semua pernyataan dalam program Anda benar, konjungsi C1 dan C2 dan… dan Ck juga benar. Masing-masing Ci di atas kadang-kadang disebut subgoal. Sebagai contoh, kita dapat meminta

?-grandparent(ken,john).

Itu adalah, Anda meminta Prolog untuk menjawab Apakah ken adalah kakek nenek dari John, berdasarkan program yang Anda berikan kepada Prolog.

Mesin eksekusi Prolog dapat kira-kira digambarkan sebagai:

  • untuk menyelesaikan tujuan, masing-masing subgoals (seperti C individu di atas)  harus diselesaikan;
  • untuk memecahkan subgoal, menemukan sebuah klausa dalam program yang kepalanya bisa menjadi “cocok” dengan subgoal; Ganti subgoal oleh tubuh  klausa, menerapkan binding kalau ada;
  • Jika semua subgoals akhirnya diselesaikan, tujuan asli diselesaikan.

Eksekusi query di atas berjalan sebagai berikut:

  • untuk menunjukkan grandparent(ken,john), memanggil klausa
    • Grandparent(X,Z):-parent(X,Y), parent(Y,Z).
  • dengan X terikat ken dan Z terikat kepada John, kita memiliki :
    • Grandparent(Ken,John):-parent(ken,Y), parent(Y,john).
  • Oleh makna ayat ini, kita tahu bahwa semua yang diperlukan untuk ditunjukkan adalah :
    • Parent(Ken,Y) dan parent(Y,john) untuk beberapa  Y
  • Untuk menunjukkan parent(ken,Y), meminta
  • Parent(X,Y):-father(X,Y).
    • Kita kemudian harus menunjukkan
  • Father(Ken,Y) dan parent(Y,john) untuk beberapa Y,
    • Untuk mengatasi father(ken,Y), memohon
  • Father(Ken, Marry).
    • Kemudian kita berakhir dengan pemecahan
  • Parent(Marry,John)
    • Dengan menerapkan
  • Parent(X,Y):-mother(X,Y).
    • kita berakhir dengan pemecahan
  • Mother(Marry,John)
    • yang langsung diselesaikan oleh klausa
  • Mother(Marry, John).
    • Dengan demikian, permintaan
  • ?-grandparent(ken,john).
    • mendapatkan menjawab ya.

Apa perbedaan utama antara Mizar (yang anda gunakan dalam cmput 272) dan Prolog? Mizar adalah pemeriksa bukti. Anda memiliki premis-premis F dan formula A, dan Anda menulis sebuah bukti yang menunjukkan sebuah berikut dari F dan mempunyai diperiksa oleh Mizar. Dalam pemrograman logika, anda menulis F sebagai satu set klausa dan sebagai sebuah query, dan anda meminta Prolog untuk coba untuk membangun sebuah bukti untuk menjawab pertanyaan apakah berikut dari F. Jika Prolog menemukan bukti, jawabannya adalah ya. Bila jawaban Prolog Tidak, yang sederhana yang berarti tidak ada bukti yang ditemukan. Tentu saja, seperti bahasa pemrograman, Prolog dapat menjalankan ke loop yang tak terbatas.

Bab 11, Functional Programming Languages

December14

Functional programming adalah program serba fungsi, yang artinya setiap persoalan diselesaikan dengan menggunakan fungsi. Functional programming sendiri mulai dikembangkan tahun 1960an, dimotivasi oleh peneliti bidang artificial intelligence, symbolic computation, theorem proving, rule-based system, dan NLP. Bahasa fungsional pertama adalah Lisp (McCarthy, 1960) yang memodelkan masalah komputasi sebagai suatu fungsi matematika, yang mempunyai input (domain) dan hasil atau output (range).

Design dari functional languages berdasarkan fungsi matematika, yang merupakan mapping dari anggota suatu set yang dinamakan domain set, ke set lainnya yang dinamakan range set.

 Ekspresi lambda menspesifikasi parameter dan mapping dari fungsi:

            l(x) x * x * x

   for the function  cube(x) = x * x * x

Lambda digunakan untuk mendeskripsikan fungsi yang tidak bernama dan di aplikasikan dengan menaruh parameter setelah ekspresi, misalnya (l(x) x * x * x)(2) yang menghasilkan angka 8

Bentuk Fungsional adalah bentuk fungsi yang lebih tinggi yang mengambil fungsi sebagai parameter atau menghasilkan fungsi sebagai hasilnya, ataupun kedua-duanya.

Bentuk fungsi yang membutuhkan dua funsgi sebagai parameternya dan menghasilkan fungsi yang valuenya adalah fungsi pertama yang diaplikasikan kepada fungsi kedua. Contohnya:

  •  Form: h º f ° g
  •  Yang berarti h (x) º f ( g ( x))
  • For f (x) º x + 2  dan  g (x) º 3 * x,
  • h º f ° g menghasilkan (3 * x)+ 2

Data object types secara original hanya merupakan atom dan lists (List form: koleksi yang berada di dalam kurung yang berisi sublists atau atom, conthnya (A B (C D) E) ). LISP dulunya merupakan bahasa yang tidak bertipe dan di strore secara internal ke single-linked lists.

LISP Interpretation

Notasi lambda digunakan untuk menspesifikasi fungsi dan definisinya. Ekspresinya disusun dalam notasi Cambridge-prefix. Contoh:

Operasi aritmatika:

  • (+)  0
  • (+ 5)  5
  • (+ 5 4 3 2 1)  15 // maksud nya 5+4+3+2+1 = 15
  • (*) 1
  • (*5)  5
  • (* 1 2 3 4 5)  120 // maksud nya 1*2*3*4*5 = 120

Contoh lain: (+ (* 5 4) (− 6 2) //maka akan menghasilkan (5 * 4) + (6 − 2) = 24

Didefinisikan dengan variable global

Contoh: (define f 120)

  • Evaluasi ekspresi
  • f120
  • (+ f 5) 125
  • (f)error, karena memiliki kurung tapi tidak melakukan sebuah operasi
  • 5 5
  • #ffalse
  • #ttrue

Special Form Function: Define

Example:

  • (define warna (quote (merah kuning hijau)))
  •  (define warna ’(merah kuning hijau))
  • (define x f)                                          120
  • (define x ’f)                                          x berisi simbol f
  • (define warna ’ merah)
  • (define warna merah)                         error, karena merah bukanlah suatu variable yang memiliki suatu isi

Evaluasi proses dari DEFINE berbeda, parameter pertama tidak akan di evaluasi. Paramete kedua akan di evaluasi, dan terikat pada parameter pertama.

Untuk dapat menuliskan discriminated union syntax pada C maka header yang dibutuhkan adalah

  • #include <glib.h>
  • #include <stdio.h>
  • #include <assert.h>
  • #include <stdbool.h>
  • #include <signal.h>
  • #include <string.h>
  • //Penulisan syntax union_type sama seperti penulisan struct declaration yaitu:
  • union_decl (Car, Volvo, Fiat, Ferrari)
  • union_type (Volvo, int x; double y) ;
  • union_type (Fiat, char* brand, *model) ;
  • union_type (Ferrari, char* brand, *model);
  • union_end (Car)
  • static void printCar(Car*);
  • static void testUnion() {
  • Car c;
  • union_set (&c, Volvo, .x = 3, .y = 4);
  • printCar (&c);
  • union_set (&c, Ferrari, .brand = “Ferrari”);
  • printCar (&c);
  • union_set (&c, Fiat, .brand = “Fiat”, .model = “234”);
  • printCar (&c);
  • }

Discriminated Union yang telah ditulis dapat diakses dengan pernyataan if

  • static void testCar(Car*, char const *);
  • static void printCar(Car* c) {
  • if(c->kind == Volvo)
  • {
    • int x = c->Volvo.x;
    • g_assert_cmpint(x, ==, 3);
  • }
  • static void testCar(Car* c, char const * value)
  • {
    • if(c->kind == Volvo) g_assert_cmpstr(value, ==, “3”);
    • else if (c->kind == Fiat) g_assert_cmpstr(value, ==, “234”);
    • else if (c->kind == Ferrari) g_assert_cmpstr(value, ==, “Ferrari”);
    • else g_assert_not_reached();
  • }

Output Tools biasa nya tidak dibutuhkan, karena interpreter selalu menampilkan hasil dari fungsi yang di evaluasi pada top level (tidak nested). Explicit input dan output bukan bagian dari fungsional programming model murni, karena input operasi merubah kondisi program dan output operasi adalah side effects. PLT Scheme memiliki dua tools utama

MzScheme : the core compiler, interpreter, and run-time system

DrScheme : the programming environment DrScheme memiliki beberapa variant.

Untuk menggunakan Scheme standar: pilih Module (Choose Language— Module) Definisikan #lang scheme pada definition area.

List Function, mengambil satu parameter dan mengembalikan parameter tersebut tanpa evaluasi dan selalu dibutuhkan sebab interpreter Sceheme yang bernama Eval, akan selalu mengevaluasi parameters ke aplikasi fungsi sebelu mengaplikasikan fungsi tersebut. Dapat ditulis : ‘ ( A B) sama dengan (quote (A B) )

Predicate terdiri dari beberapa macam jenis

EQ

Mengambil dua ekspresi sebagai parameter, akan mengembalikan true apabila kedua parameter memiliki pointer value yang sama dan false apabila tidak.

  • (EQ? ‘A ‘A) yields #T
  • (EQ? ‘A ‘B) yields #F
  • (EQ? ‘A ‘(A B)) yields #F
  • (EQ? ‘(A B) ‘(A B)) yields #T or #F
  •  (EQ? 3.4 (+ 3 0.4))) yields #T or #F

EQV

Hampir serupa dengan EQ hanya saja ini dapat digunakan oleh simbolik maupun nmerik atom dan berfungsi unduk membandingkan value.

  • EQV? 3 3) yields #T
  • (EQV? ‘A 3) yields #F
  • (EQV 3.4 (+ 3 0.4)) yields #T
  • (EQV? 3.0 3) yields #F  (floats and integers are different)

List? Dan Null?

List? Mengambil satu parameter dan mengembalikan false apabila parameter sebuah list dan true bila sebaliknya.

(LIST? ‘()) yields #T

Null? Mengambil satu parameter dan mengembalikan true apabila parameter merupakan list yang kosong, dan false bila sebaliknya.

(NULL? ‘(())) yields #F

Scheme Function pada C ada beberapa macam yaitu:

Member

Mengambil sebuah atom dan simple list, mengembalikan true apabila atom ada di dalam list dan false bila sebaliknya.

DEFINE (member atm a_list)

            (COND

                        ((NULL? a_list) #F)

                        ((EQ? atm (CAR lis)) #T)

                        ((ELSE (member atm (CDR a_list)))

            ))   

Equalsimp

Mengambil dua simple list sebagai parameter dan mengembalikan true apabila kedua list setara dan false bila sebaliknya.

(DEFINE (equalsimp list1 list2)

            (COND

                        ((NULL? list1) (NULL? list2))

                        ((NULL? list2) #F)

                        ((EQ? (CAR list1) (CAR list2))

                                    (equalsimp(CDR list1)(CDR list2)))

                        (ELSE #F)

            ))

Equal

Mengambil dua general list sebagai parameternya dan mengemalikan true bila kedua list setara dan false bila sebaliknya.

(DEFINE (equal list1 list2)

              (COND

                        ((NOT (LIST? list1))(EQ? list1 list2))

                        ((NOT (LIST? lis2)) #F)

                        ((NULL? list1) (NULL? list2))

                        ((NULL? list2) #F)

                        ((equal (CAR list1) (CAR list2))

                                    (equal (CDR list1) (CDR list2)))

                        (ELSE #F)

            ))

Append

Mengambil dua list sebagai parameternya dan mengembalikan parameter pertama dengan elemen dari parameter kedua yang di tambahkan di bagian akhir.

(DEFINE (append list1 list2)

              (COND

                        ((NULL? list1) list2)

                        (ELSE (CONS (CAR list1)

                                      (append (CDR list1) list2)))

            ))

Let

Let merupakan kependekan dari ekspresi lambda yang diaplikasikan ke dalam sebuah parameter.

            (LET ((alpha 7))(* 5 alpha))

Sama artinya dengan

             ((LAMBDA (alpha) (* 5 alpha)) 7)

Operasi disebut tail recursion jika di panggil reculsive dan pada akhir dari fungsi operasi. Fungsi Tail reculsive dapat di convert secara otomatis oleh compiler untuk iterasi dengan membuat nya cepat. Scheme language definisi membutuhkan konversi scheme language system all tail reculsive fungsi untuk menggunakan iterasi. Contoh penulisan untuk membuatnya recursive

Original:         (DEFINE (factorial n)

                      (IF (<= n 0)

                         1

                         (* n (factorial (- n 1)))

                    ))

   Tail recursive:  (DEFINE (facthelper n factpartial)

                      (IF (<= n 0)

                         factpartial

                         facthelper((- n 1) (* n factpartial)))

                    ))

                   (DEFINE (factorial n)

                      (facthelper n 1))

Bab 10, Exception Handling and Event Handling

December14

Exception Handling  dalam Bahasa C

Bahasa C tidak memberikan cara langsung untuk Exception Handling atau disebut Error Handling dalam C, tapi ada cara lainnya untuk melakukan error handling. Dalam Bahasa C, programmer itu diminta untuk mencegah error-error yang terjadi, dan menguji nilai return dari fungsi. Misalnya, banyak panggilan return -1 atau NULL pada beberapa fungsi kalau terjadi error seperti socket() (Unix Socket Programming) atau malloc() untuk mengindikasikan masalah yang perlu diketahui oleh si programmer. Jadi, pengujian yang cepat pada nilai return ini akan lebih mudah dilakukan misalnya dengan ‘if statement’.

Misalnya, kalau suatu program berhasil itu karena nilai return programnya itu nol. Kalau programnya error, biasanya dikarenakan angka yang lebih besar dari nol itu dikembalikan (misalnya 1). (Dengan command ‘echo $?’ di command line, kita bisa menampilkan kode return program yang sebelumnya dijalankan). Jadi, yang perlu diingat adalah, kita sebagai programmer bertanggung jawab atas error handling.

Fungsi errno, perror() dan strerror()

Bahasa C menyediakan fungsi perror() dan strerror() yang bisa digunakan untuk menampilkan pesan teks yang dihubungkan dengan errno.

Variabel Global errno digunakan oleh fungsi C dan integer ini telah ditentukan kalau ada error saat pemanggilan fungsi. Untuk menggunakan errno, kita perlu header file errno.h dan memanggil ‘extern int errno;

Fungsi perror() menampilkan string yang kita lempar kedalamnya, diikuti tanda kurung kurawal dan pesan teks nilai errno saat itu.

Fungsi strerror() mengembalikan pointer ke representasi teks nilai errno saat itu.

Mari coba menstimulasikan kondisi error dan coba buka file yang tidak ada. Pada contoh dibawah ini, kita akan mencoba menggunakan kedua fungsi tersebut, yaitu perror() dan strerror() untuk menampilkan penggunaannya. Kita bisa juga menggunakan salah satu atau lebih cara mengeluarkan atau mem-print kan error-error tersebut. Perlu diingat, kalau kita harus menggunakan file stream stderr untuk mengeluarkan atau menampilkan semua error-error tersebut.

Contoh:

  • #include <stdio.h>
    #include <errno.h>
    #incude <string.h>
  • extern int errno;
  • int main()
    {
    FILE * fp;
    fp = fopen(“not_exist_file.txt”, “rb”);
  •             if (fp == NULL)
    {
    fprintf(stderr, “Value of errno: %d\n”, errno);
    fprintf(stderr, “Error opening the file: %s\n”, strerror(errno));
    perror(“Error printed by perror”);
  •             }
  •             else
    fclose (fp);
  •             return 0;
    }

Outputnya:

  • Value of errno: 2
  • Error opening the file: No such file or directory
  • Error printed by perror: No such file or directory

Untuk menggenerasikan error, kita membuka file yang tidak ada. Kalau file pointer (fp) sama dengan NULL, maka akan di print nilai errno. Kalau mendapatkan file pointer (kalau file nya ada) file nya akan ditutup.

Disini, pertama-tama kita memprint errno, kemudian menggunakan fungsi strerror() untuk memberikan pesan kita sendir dan menampilkan teks errno. Kemudian fungsi perror digunakan untuk memberikan pesan kita sendiri, diikuti dengan tanda kurung kurawal dan representasi teks errno.

Error Divide by Zero

Divide by Zero adalah salah satu error yang sering ditemukan. Error ini dikarenakan ada bilangan yang dibagi nol dalam program yang dibuat.  Contoh kode dibawah inilah yang akan menampilkan runtime error dan keluar dari program.

int dividen = 10;
int pembagi = 0;
int hasil;

hasil = dividen / pembagi; // Ini akan menampilkan runtime error!

 

Hal ini terjadi karena programmer  tidak mengecek kalau ada pembilang yang sama dengan nol dan hal ini akhirnya membuat runtime error. Karena itu, programmer harus memastikan kalau pembagi tidak pernah boleh nol. Kode dibawah ini memperbaiki error diatas dengan mengecek kalau pembagi nya itu nol atau bukan sebelum dilakukan pembagiannya:

  • #include <stdio.h> //untuk fprintf dan stderr
    #include <stdlib.h>
  • int main(void)
    {
    int dividen = 10;
    int pembagi = 0;
    int hasil;
  •             if (pembagi == 0)
    {
    fprintf(stderr, “Pembaginya nol! Exit program. . .\n”);
    exit(-1);
    }
  •             hasil = dividen / pembagi;
    fprintf(stderr, “Hasil bagi : %d\n”, hasil);
    exit(0);
    }

Program Exit Status

Akan lebih baik untuk keluar dari program dengan nilai EXIT_SUCCESS dimana program keluar setelah operasi nya berhasil. Disini, EXIT_SUCCESS adalah macro yang didefinisikan sebagai 0. Kalau ada kondisi error dalam program, kita harus keluar dari program dengan status EXIT_FAILURE yang didefinisikan sebagai -1.

EXIT_SUCCESS dan EXIT_FAILURE itu didefinisikan dengan header file stdlib.h. Dibawah ini contoh penggunaannya:

  • #include <stdio.h> //untuk fprintf dan stderr
    #include <stdlib.h> // untuk keluar dari program
  • int main(void)
    {
    int dividen = 10;
    int pembagi = 0;
    int hasil;
  •             if (pembagi == 0)
    {
    fprintf(stderr, “Pembaginya nol! Exit program. . .\n”);
    exit(EXIT_FAILURE);
    }
  •             hasil = dividen / pembagi;
    fprintf(stderr, “Hasil bagi : %d\n”, hasil);
    exit(EXIT_SUCCESS);
    }

Signal Handling dalam Bahasa C

Signal adalah suatu kondisi yang dilaporkan saat mengeksekusi suatu program, dan bisa di abaikan saja. Biasanya signal itu merupakan sistem operasi yang menunjukkan error-error tertentu yang terjadi, seperti division by zero, interrupt, dll. Namun, signal ini bukan digunakan untuk menangkap error-error yang ada; biasanya untuk menunjukkan error kritis yang akan mengganggu laju program yang normalnya. Satu fungsi mengirim signal, fungsi lainnya digunakan untuk memastkan bagaimana suatu signal akan di proseskan. Banyak signal-signal ini yang dihasilkan oleh operasi sistem dan juga sebagai fungsi pengirim signal.

Signal itu didefinisikan dengan header signal.h. Selain di definisikan, fungsi signal() juga perlu dipanggil. Signal handler ini akan diperlukan untuk memastikan beberapa sumber itu sudah dibersihkan dengan baik sebelum program diakhiri.

IGABRT
       Terminasi abnormal, seperti yang dipicu oleh fungsi abort. (Abort)

SIGFPE
       Operasi arimatika error, seperti divide by 0 atau overflow. (Floating point expetion)

SIGILL
       Terdeteksinya ‘program objek yang invalid’. Biasanya karena ada instruksi illegal dalam
suatu program. (Illegal Instruction)

SIGINT
       Perhatian signal interaktif; pada sistem interaktif ini biasanya dihasilkan dengan mengetik
beberapa kunci ‘break-in’ di terminal. (Interrupt)

SIGSEGV
       Akses penyimpanan yang invalid; paling sering disebabkan karena menyimpan suatu nilai
dalam objek yang ditunjuk oleh pointer yang buruk. (Segment Violation)

SIGTERM
       Permintaan mengakhiri suatu program oleh program itu sendiri. (Terminate)

Beberapa implementasi memiliki tambahan signal yang namanya itu akan selalui dimulai dengan SIG, dan akan memiliki nilai yang unik. Fungsi signal memungkinkan kita untuk menentukan tindakan mana yang diambil pada penerimaan signal. Fungsi signal ini mengubah pointer dan mengembalikan nilai aslinya. Jadi, fungsi nya itu seperti ini:

#include <signal.h>

Void (*signal (int sig, void(*func)(int)))(int);

 

Fungsi kedua mengambil argument satu int dan mengembalikan void. Argumen kedua ke signal itu mirip dengan pointer ke fungsi yang mengembalikan void yang mengambil argument int. Kalau panggilan ke signal berhasil, nilai fungsi sebelumnya untuk signal tertentu itu akan dikembalikan. Kalau tidak, SIG_ERR dikembalikan dan errno di set.

Ketika signal event terjadi, kalau dihubungkan dengan fungsi pointer ke fungsi, pertama, persamaan signal (sig, SIG_DFL) itu di eksekusi. Hal ini akan mereset signal handler menjadi default, yaitu menghentikan program. Kalau signalnya SIGILL, berarti soal reset ini merupakan implementasi yang didefinisikan. Implementasi ini bisa memilih untuk memblokir masukan lebih lanjut pada signal. Kemudian, fungsi signal-handling dipanggil. Kalau fungsi kembali secara normal, berarti programnya akan terus berlanjut. Namun, kalau nilai sig adalah SIGFPE, atau implementasi lainnya, berarti hal ini tidak terdefinisi.

Berikut adalah contoh penggunaan signal handler:

  • #include <stdio.h>
  • #include <stdlib.h>
    #include <signal.h>
  • Static void catch_function(int signal)
    {
    puts(“Interactive attention signal caught.”);
    }
  • int main(void)
    {
    if (signal(SIGINT, catch_function) == SIG_ERR)
    {
    fputs(“An error occurred while setting a signal handler.\n”, stderr);
    return EXIT_FAILURE;
    }
  • puts(“Raising the interactive attention signal.”);
  • if (raise(SIGINT) != 0)
    {
    fputs(“An error occurred while setting a signal handler.\n”, stderr);
    return EXIT_FAILURE;
    }
  •                                    puts(“Exiting.”);
  •             return 0;
    }

Suatu program dapat mengirimkan signal ke dirinya sendiri dengan fungsi raise yang ditulis seperti ini:

#include <signal.h>

int raise (int sig);

Dimana signal sig dikirim ke program. Raise mengembalikan  nol kalau sukses, non-zeru sebaliknya. Fungsi library abort itu  diimplementasikan sebagai berikut:

#include <signal.h>

void
abort (void)
{
       raise(SIGABRT)
}

Kalau signal nya terjadi buat alsan lain selain memanggil abort atau raise, fungsi signal-handling hanya akan memanggil signal atau memberikan nilai ke objek static tipe sig_atomic_t. Tipe sig_atomic_t itu di deklarasikan dalam <signal.h>. Tipe tersebut hanyalah tipe objek yang bisa di modifikasi sebagai kesatuan atomic yang aman. Tapi, fungsi ini tidak mengikuti aturan Standard.

Setjmp

Fungsi setmp bisa digunakan untuk meniru fitur yang menangani exception pada Bahasa pemrograman yang lain. Panggilan pertama setjmp memberikan titik referensi untuk mengembalikan fungsi yang diberikan, dan valid selama fungsi yang memiliki setjmp() tidak kembali atau keluar. Kalau kita memanggil longjmp, itu bisa menyebabkan eksekusi untuk kembali ke titik dimana setjmp dipanggil. Berikut contohnya:

  • #include <stdio.h>
    #include <setjmp.h>
  • Jmp_buf test;
  • void tryjump()
    {
    longjmp(test, 3);
    }
  • Int main(void)
    {
    if (setjmp(test) == 0)
    {
    printf(“setjmp() returned 0”);
    tryjum();
    }
  •        else
    printf(“setjmp() returned from a longjmp function call”);
    }

Nilai variabel yang tidak dapat berubah bisa saja corrupt ketika setjmp kembali dari panggilan longjmp. Selama setjmp() dan longjmp() bisa digunakan untuk error handling, biasnya lebih digunakan untuk mengembalikn nilai suatu fungsi untuk menunjukkan sebuah error.

Bab 9, Concurrency

December14

Ada beberapa alasan mengapa programmer menjadi tertarik pada Concurrency:

  1. Untuk lebih memahami arsitektur komputer (memiliki banyak concurrency
    dengan pipelining (beberapa langkah) dan super-skalar (beberapa instruksi))
  2. Desain compiler
  3. Beberapa yang paling alami diselesaikan dengan menggunakan satu set co-operasi proses
  4. Sebuah solusi sekuensial lebih dari spesifikasi
  5. Untuk mengurangi waktu eksekusi.

Bahasa Pemrograman Concurrent Programming

  • Java
  • C#
  • Erlang
  • Occam
  • Limbo SR
  • Ad

Tidak dalam bahasa C

Kelebihan Concurrent Programming

  • Lebih memahami Arsitektur Komputer
  • Design compiler
  • Beberapa permasalahan diselesaikan dengan menggunakan co-operating proses
  • Waktu pengerjaan lebih singkat

Concurrency pada sebuah mesin dapat terjadi pada 4 buah level :

  • Instruksi level (eksekusi 2 atau lebih instruksi mesin serentak)
  • Statement level (eksekusi 2 atau lebih statement bahasa tingkat tinggi serentak)
  • Unit level (eksekusi 2 atau lebih subprogram unit serentak)
  • Program level (eksekusi 2 atau lebih program serentak)

Ada 2 kategori concurrent unit control yaitu :

  • Physical concurrency
    • Memiliki lebih dari 1 processor, beberapa program unit dari program yang sama di eksekusi serentak.
  • Logical concurrency
    • Relaxation konsep dari concurrency yang membolehkan programmer dan aplikasi software memberikan concurrency asli.

Subprogram level concurrency

Task atau process atau thread adalah sebuah program unit yang dapat di eksekusi bersamaan dengan program unit yang lain.

Task berbeda dari subprogram biasa, terletak pada :

  • Sebuah task dapat implicit
  • Ketika program unit menjalan kan eksekusi task, maka tidak perlu dilakukan penundaan
  • Ketika eksekusi task selesai, control dapat tidak kembali kepada pemanggil nya

Task dapat di bagi menjadi 2 kategori yaitu :

  • Heavyweight
    • Task eksekusi pada ruang alamat nya sendiri
  • Lightweight
    • Semua task berjalan pada ruang address yang sama

Jika sebuah task tidak berkomunikasi terhadap eksekusi pada sebuah program di sebut disjoint.

help

Synchronization adalah meknisme yang mengontrol urutan dari sebuah eksekusi task.

Terdapat 2 tipe synchronization :

  • Cooperation synchronization
    • Dibutuhkan antara task A dan task B ketika task A harus menunggu task B untuk menyelesaikan aktivitas spesifik sebelum task A dapat melanjutkan eksekusi.
  • Competition synchronization
    • Dibutuhkan antara 2 task ketika keduanya membutuhkan resource yang tidak dapat digunakan secara serentak.

Scheduler berfungsi memberikan synchronisasi ke mekanisme eksekusi task yang terlambat. Task eksekusi control di atur oleh program bernama scheduler. Macam-macam task eksekusi states :

  • New (dibuat tapi belum dijalankan)
  • Ready (siap untuk dijalankan tapi belum berjalan)
  • Running (task yang sedang berjalan / eksekusi)
  • Blocked (task yang diblok ketika sedng berjalan / interrupted oleh sesuatu)
  • Dead (task yang tidak lagi aktif)

Liveness = karakteristik dari program unit yang mungkin / tidak mungkin memiliki sequential code (unit akan menyelesaikan eksekusinya)

Deadlock = semua task pada concurrent environment kehilangan liveness nya

Semaphore

Semaphore adalah data struktur mengandung counter dan queue untuk menyimpan task descriptor (data struktur yang menyimpan semua informasi relevan tentang state eksekusi dari sebuah task) / mekanisme simple yang dapat digunakan untuk memberikan syncronisasi task.

Contoh semaphore:

  • wait(aSemaphore)
  • if aSemaphore’s counter > 0 then
    • decrement aSemaphore’s counter
  • else
  • put the caller in aSemaphore’s queue
  • attempt to transfer control to some ready task
  • (if the task ready queue is empty, deadlock occurs)
  • end if
  • release(aSemaphore)
  • if aSemaphore’s queue is empty (no task is waiting) then
    • increment aSemaphore’s counter
  • else
  • put the calling task in the task-ready queue
  • transfer control to a task from aSemaphore’s queue
  • end

Gambar Semaphore Monitor

ssss

Monitor

Mengenkapsulasi shared data dan operasi nya pada akses terbatas. Monitor adalah abstract data type (ADT) untuk shared data.

 

 

Bab 8, Object-Oriented Programming

December14

Tipe-tipe bahasa yang memiliki object oriented programming:

  • Beberapa mendukung procedural dan data-oriented programming (contohnya Ada 95+ dan C++)
  • Beberapa mendukung functional program (contoh CLOS)
  • Beberapa bahasa yang baru tidak mendukung paradigm lain tapi menggunakan struktur imperative yang mereka miliki (contoh: Java dan C#)

Beberapa bahasa adalah bahasa yang murni OOP (contoh : Smalltalk dan Ruby)

Object-Oriented Programming memiliki tiga konsep dasar yaitu:

  • Abstract Data Type
  • Inheritance (tema sentral dari OOP dan bahasa yang mendukungnya)
  • Polimorfisme

Object Oriented Programming Language juga mendukung paradigm menggunakan class, methods, object dan message passing.

Inheritance adalah pewarisan sifat dari superclass ke subclass, yang mewarisi attribute dan method yang masih sejenis beserta attribute dan method tambahan yang merupakan sifat khusus subclass. Sebagai contoh class sapi adalah hewan bertulang belakang / vertebrata yang merupakan mamalia pemakan tumbuhan / herbivora.

Konsep OOP:

  • Abstract Data Type dalam OOP sering disebut sebagai classes
  • Class instances disebut sebagai objek
  • Sebuah class yang mewarisi sesuatu disebut sebagai derived class atau subclass
  • Sebuah class yang sifatnya diwarisi oleh class lain dinamakan parent class atau superclass
  • Subprogram yang mendefinisikan sebuah operasi dari suatu objek disebut sebagai methods.
  • Dari calls ke methods dinamankan messages
  • Serangkaian koleksi methods dari suatu objek dinamakan message protocol atau message interface
  • Messagaes mempunyai dua bagian, method name dan destinasi dari objek.
  • Secara garis besar, sebuah class mewarisi seluruh sifat yang tadinya ada di parent class

Inheritance dapat di komplikasikan dengan akses control terhadap enkapsulasi entities

  • Class dapat menyembunyikan entities dari subclass nya
  • Class dapat menyembunyikan entities dari client nya
  • Class dapat menyembunyikan entities dari client nya tetapi memperbolehkan subclass mengakses nya

Sebuah class dapat memodifikasi method dari class turunan nya

  • Method yang baru melakukan override terhadap method yang lama
  • Method pada parent di overridden

Tiga cara membedakan dari class parent nya:

  • Class parent dapat mendefinisikan beberapa variable atau method nya untuk memiliki private akses, yang berarti mereka tidak akan terlihat oleh kelas turunan nya.
  • Subclass dapat menambahkan variable atau method untuk yang di wariskan dari parent
  • Subclass dapat memodifikasi sikap dari satu atau banyak method yang diwariskan.

Terdapat 2 jenis variable pada sebuah class :

  • Class variable – satu / class
  • Instance variable – satu / objek
  • Terdapat 2 jenis method pada sebuah class :
  • Class method – menerima pesan kepada class.
  • Instance method – menerima pesan kepada objek.

Konsep Dynamic Binding

  • Polymorphic variable dapat di definisikan pada kelas yang dapat melakukan referensi objek kelas dan objek dari turunan nya
  • Ketika hierarki kelas mengandung kelas yang override method biasa disebut dengan polymorphic variable, binding ke method akan dynamic
  • Mengizinkan system software lebih mudah di perpanjang ketika dikembangkan dan maintenance
  • Abstrak method adalah salah satu yang tidak dimiliki pada definisi (hanya mendefinisikan protocol)
  • Abstrak kelas memiliki setidak nya satu virtual method
  • Abstrak kelas tidak dapat di instansikan.

Hal-hal yang dapat menjadi suatu masalah dalam OOP Languages:

  • Ekslusivitas Objek
    • Semua adalah suatu objek
      • Keuntungan : Elegan dan kemurnian
      • Kekurangan : Lambat pada operasi objek yang simple
    • Menambah objek untuk menyempurnakan typing system
      • Kelebihan : Cepat pada operasi objek yang simple
      • Kekurangan : Hasil membingungkan type system
    • Memasukan gaya imperative typing system untuk primitf tapi membuatnya menjadi objek
      • Kelebihan  : Cepat pada operasi objek yang simple secara relative system typing lebih kecil
      • Kekurangan : Masih membingungkan type system
    • Jika kelas turunan adalah kelas parent maka objek pada kelas turunan harus bersifat sama dengan objek pada kelas parent.
    • Subclass dapat menambah variable dan method dan override method turunan dengan cara compatible
  • Single dan Multiple Inheritance
    • Multiple inheritance mengizinkan kelas baru untuk di warisi dari 2 atau lebih kelas
      • Kekurangan :
        • Bahasa dan implementasi yang kompleks
        • Potensial tidak efisien – dynamic binding memiliki biaya lebih disbanding dengan multiple inheritance
      • Kelebihan :
        • Terkadang berharga dan berguna
  • Alokasi dan Dealokasi Objek
    • Jika bersifat ADT, maka dapat di alokasikan dari semua tempat
      • Alokasi dari run-time stack
      • Secara explicit membuat pada heap
    • Jika heap-dynamic referensi dapat melalui pointer atau referensi variable
      • Memudahkan assignment – melakukan referensi ulang secara implicit
      • Jika objek stack dynamic, akan memiliki masalah pada subtype – object slicing
  • Dynamic dan Static Binding
    • Seluruh binding message to methods harus dynamic sehingga kita tidak kehilangan kelebihan dari dynamic binding namun hal ini menjadi tidak efisien. Akan lebih baik bila design nya memungkingkan si pengguna untuk menspesifikasi tipe bindingnya.
  • Nested Classes
    • Jika kelas baru dibutuhkan oleh satu kelas, maka tidak ada alasan untuk mendefinisikan agar dapat terlihat oleh kelas lain nya
  • Inisialisasi Objek

Kelebihan dari Object Oriented Programming adalah;

  • Representasi data dan fungsionalitasnya terpisah dari pemakaian
  • Divide dan Conquer
  • Penggunaan kembali kode
  • Meningkatkan readability kode

Kelebihan penggunaan Object Oriented Programming dalam bahasa C adalah

  • Lebih cepat
  • Sebuah lingkungan penulisan kode dimana C++ dan compiler lain nya tidak available

Kekurangan dari penggunaan Object Oriented Programming dalam bahasa C adalah:

  • Kode yang ditulis lebih kompleks
  • Ada kemungkinan akan kehilangan type safety
  • Memakan waktu programmer lebih lama (Proses pembuatan lebih lama)
  • Lebih cenderung error
  • Management memori secara manual

Dalam bahasa C, sebenarnya tidak benar-benar bisa digunakan untuk menuliskan kode berbasis Object-Oriented namun dapat dibuat menyerupai kode yang ditulis di dalam bahasa yang mendukung Object Oriented Language. Enkapsulasi dapat dilakukan dengan menaruh definisi dari struktur kode di dalam .c file dan bukan di dalam header seperti biasanya. Objek akan dihandle dengan menggunakan pointer dan programmer dapat menyediakan function yang dapat memproses pointer tersebut sebagai “method” dari objek tersebut Sifat polimorfisme bisa kita dapatkan dengan menggunakan function pointer, biasanya dikelompokan ke dalam struktur operasi, mirip dengan virtual method table di dalam C++. Ops structure bisa berisikan hal lain seperi konstanta yang value nya spesifik kepada suatu “subclass”. Struktur “Parent” dapat mempunyai reference ke ops-specific data melalui voi* pointer. Contoh:

12-1

12-2

12-3

Contoh di atas, struct printer itu adalah abstract class yang dapat di “derived” dengan cara mengisi struktur pr_ops dan menyediakan constructor function pr_create(). Setiap subtype akan mempunyai strukturnya tersendiri yang akan ter-“anchored” ke objek struct printer oleh pointer data. Ini didemonstrasikan dalam subtype fileprinter. yang secara dinamis.

Class Instance Records menyimpan keadaan suatu objek (static, terbentuk saat compile time). Apabila sebuah class mempunyai parent, maka variable subclass instance akan ditambahkan ke dalam parent CIR dan karena CIR itu static, maka semua akses ke instance variables dilakukan seperti record. Method yang berada di dalam class yang secara static terikat tidak perlu dimasukan ke dalam CIR, sebaliknya methods terikat harus memiliki entry di CIR.

Bab 7, Abstract Data Type

December14

Tipe data abstrak (Abstract Data Type – ADT) adalah tipe data yang diatur menggunakan struktur data tertentu sehingga spesifikasi data dan spesifikasi operasinya terpisah dari representasi dan implementasinya. Pengguna hanya perlu memperhatikan spesifikasi data dan operasinya saja namun seorang program designer harus tahu implementasi program yang ia buat.

Abstract data types menurut Weiss merupakan abstraksi matematis yang menunjukkan bahwa antara spesifikasi operasi dan implementasi operasi merupakan dua bagian yang terpisah. Abstrak Data Type adalah sebuah tipe data yang user-defined (ini maksudnya apa ya) yang memenuhi dua kondisi yaitu:

  • Representasi dari objek nya tersembunyi dari program uni yang menggunakan objek tersebut sehingga operasi yang dapat digunakan adalah operasi yang tercantum di dalam definisi dari tipe data tersebut.
  • Deklarasi dari tipe dan protokol objek tipe data tersebut dimasukan ke dalam sebuah unit sintaks.

Keuntungan yang dimiliki dari Abstract Data Type adalah

  • Struktur data dapat di modifikasi.
  • User tidak perlu secara langsung mengakses objek data tersebut.
  • Kompilasi yang terpisah.

Adapun 3 level abstraksi data yaitu :

  • Level fisik (physical level)

Level fisik merupakan level terendah dalam abstraksi data, yang menunjukkan bagaimana sesungguhnya suatu data disimpan.

Contoh : sebuah data di simpan pada memori.

  • Level logic / konsep

Level logic menjelaskan data yang disimpan dalam basis data serta hubungan anatar data.

Contoh : data siswa pada tbl_siswa.

  • Level view

Level view adalah level tertinggi dari abstraksi data yang hanya menunjukkan sebagian dari basis data / informasi data yang kemunculannya di mata user diatur oleh aplikasi end-user.

Contoh : dalam sebuah sekolah memiliki bagian keuangan, bagian perpustakaan, bagian akademik, dll.

Constructor

Constructor berfungsi sebagai inisialisasi sebuah data dari suatu instance. Dalam class harus dibuat.

Destructor

Destructor berfungsi sebagai penghancur sebuah data dari suatu constructor. Dalam class harus dibuat jika tidak di buat maka memori akan penuh karena data tidak pernah di hancurkan.

Permisalan penggunaan abstract data type dalam daftar terurut yang berisikan daftar nama mahasiswa dalam sebuah kelas. Data mahasiswa terdiri dari NIM dan nama. Tentunya ‘daftar terurut’ (sorted list) dalam imaginasi pengguna, memiliki spesifikasi data sebagai berikut;

  1. Data terdiri dari nilai kunci (yaitu NIM) untuk mengurutkan berupa sebuah string dan string lainnya (yaitu nama mahasiswa),
  2. Ukuran maksimal daftar tersebut, misalnya 100 (seratus) karena dalam sebuah kelas tidak lebih dari 100 (seratus) mahasiswa
  3. Jumlah mahasiswa dalam kelas

Pengguna akan melakukan beberapa hal seperti dalam imajinasi (spesifikasi operasi), misalnya:

  1. Membentuk sebuah daftar baru
  2. Menambahkan sebuah data mahasiswa pada daftar
  3. Mencari nama mahasiswa sesuai sebuah nilai, misalnya NIM
  4. Mengetahui jumlah data pada daftar
  5. Mengetahui jumlah data maksimal pada daftar
  6. Menghapus seluruh data pada daftar
  7. Mencetak seluruh data pada daftar
  8. Memeriksa apakah daftarurut sudah penuh
  9. Memeriksa apakah daftarurut masih kosong

Untuk membentuk tipe data ‘daftar terurut’ diatas, tentu ada semacam “interface” untuk pengguna agar bisa mengoperasikan ‘daftar terurut’ tersebut.

2

Ditekankan bahwa objek seperti list (daftar terurut) memiliki operasi-operasi. Operasi yang disediakan dan termasuk didalamnya adalah error-handling (penanganan kesalahan) tergantung kebutuhan dan rancangan pemrogram.

Untuk visualisasinya, dapat dliihat dari gambar di bawah

3

Untuk menyimpan data didalam memori komputer, harus diatur penyimpanan data dalam memori. Pada C, bisa digunakan ‘struct’. Jumlah data pada daftar terurut dan ukuran daftar terurut berupa bilangan bulat, sehingga digunakan tipe data ‘int’. NIM berupa string dengan panjang misalnya 12 karakter, dimana disimpan berupa deretan tipe data char (array of char).

Contoh bentuk code nya :

  • typedef struct tdata {
  • char nim[12];
  • char nama[30];
  • };
  • typedef struct daftarurut {
  • tdata *data;
  • int max;
  • int jdata;
  • };

Untuk menyimpan 100 (seratus) data, maka max diberi nilai 100 (seratus), dan akan disediakan sebuah array yang terdiri dari elemen sejumlah max. Sedangkan jdata dimulai dari 0 (nol). Jdata akan bertambah otomatis setiap kali terjadi penambahan data. Jika dimasukkan sebuah data berisi NIM dan nama, misalnya“James Dean”, maka jdata akan bertambah 1 (satu). Ilustrasinya

4

Beberapa contoh implementasi menggunakan Array dalam bahasa C

Interface Operasi dan Penjelasan Operasi dan implementasi dalam bahasa C

  • Createlist(ukuran) : Membentuk sebuah daftar dengan ukuran tertentu, misalkan ‘ukuran’
    • _ daftarurut createlist(int ukuran)
    • {
    • int i;
    • daftarurut xyz;
    • xyz.max = ukuran;
    • xyz.data =(tdata *)malloc(sizeof(tdata) * xyz.max);
    • xyz.jdata = 0;
    • for(i=0;i<ukuran;i++)
    • {
    • xyz.data[i].nim[0] = ‘\0’;
    • xyz.data[i].nama[0] =’\0′;
    • }
    • printf(“ukuran list = %d\n”,xyz.max);
    • printf(“jumlah data dalam list = %d\n”,xyz.jdata);
    • return xyz;
    • }
  • Insert(xyz,baru) : Menambah sebuah data ‘baru’ pada daftar ‘xyz’, mengembalikan status 1 jika berhasil dan 0 jika gagal
    • _ int insert(daftarurut *a, tdata baru)
    • {
    • int i,j;
    • if (isempty(a))
    • {
    • (*a).data[0] = baru;
    • (*a).jdata++;
    • return 1;
    • }
    • if(!isfull(a))
    • {
    • j = sizelist(*a);
    • while (j >= 0 && strcmp(baru.nim,(*a).data[j-1].nim)<0)
    • {
    • (*a).data[j] = (*a).data[j-1];
    • j = j – 1;
    • }
    • (*a).data[j] = baru;
    • (*a).jdata++;
    • return 1;
    • }
    • else
    • {
    • printf(“Daftar sudah penuh”);
    • printf(“,jumlah data = %d”,(*a).jdata);
    • printf(“maksimal data = %d\n”,(*a).max);
    • return 0;
    • }
    • }
    • search(xyz,key): Mencari sebuah data dengan nilai ‘key’ pada daftar ‘xyz’, mengembalikan posisirecord jika ditemukan, dan -1 jika tidak ditemukan
    • _ int searchlist(daftarurut a, char key[])
    • {
    • int i;
    • for(i=0;i<a.jdata;i++)
    • {
    • if(strcmp(a.data[i].nim, key)==0)
    • return i;
    • }
    • return -1;
    • }

Contoh program menggunakan ADT Daftar Terurut dalam bahasa C

11

11-2

11-3

Enkapsulasi adalah sebuah konsep dalam penyembunyian sebuah informasi atau sebuah grup dari subprogram yang terhubung secala logis melalui sebuah unit yang dapat di compile secara terpisah. Ex: class

Enkapsulasi pada C

  • File berisi satu atau lebih subprogram dapa melakukan kompilasi sendiri
  • Interface ditempatkan pada header file
  • Memiliki masalah pada hubungan  antara header dan implementasi asosiasi

Bab 6, Subprograms

December14

Fungsi dalam Bahasa C adalah subprogram. Subprogram adalah sekumpulan perintah operasi program yang dapat menerima argument input dan dapat memberikan hasil output yang dapat berupa nilau ataupun sebuah hasil operasi. Hasil akhir fungsi akan berupa sebuah nilai balik (return). Nama fungsi yang didefinisikan sendiri oleh programmer tidak boleh sama dengan nama build-in function pada compiler C.

Suatu program itu merupakan kumpulan dari pernyataan-pernyataan. Ada program yang membutuhkan pernyataan yang berulang-ulang. Pengulangan pernyataan-pernyataan tersebut akan membuat program menjadi tidak efisien. Dengan fungsi, maka pengulangan tersebut tidak perlu terjadi lagi, karena kita hanya perlu memanggil kembali fungsi tersebut.

Sifat-sifat Fungsi

Berikut adalah sifat-sifat fungsi dalam Bahasa C:

  • Masing-masing fungsi mempunyai nama, aturan penamaan fungsi sama seperti penamaan variable.
  • Nama fungsi diikuti sepasang tanda kurung untuk membedakan fungsi dengan variable. Didalam tanda kurung dapat diisi argument-argumen fungsi tersebut. Kalau tidak perlu argumen tidak perlu diisi apa-apa.
  • Bagian tubuh dari fungsi harus memiliki tanda kurung kurawal ( { ) dan diakhiri tanda kurung kurawal ( } ). Bagian tubuh dari fungsi berisi deklarasi variabel dan pernyataan.

Manfaat Fungsi

Berikut adalah manfaat-manfaat fungsi dalam Bahasa C:

  • Menghindari penulisan program yang berulang
  • Membagi program menjadi modul-modul yang lebih kecil, jadi kesalahan dalam program akan lebih mudah untuk dilacak.
  • Fungsi dalam C ini dapat menghasilkan nilai, data ataupun hasil atau kegiatan lain yang bukan berupa data maupun nilai.

Struktur Fungsi dalam Bahasa C

Deklarasi fungsi secara umum:

  • Tipe_data_fungsi  Nama_fungsi  (parameter_fungsi)
    {
    statement;
    }

FUNGSI main() dalam C itu mutlak harus ada, karena dari fungsi inilah program akan dimulai. Dalam sebuah program yang terdapat beberapa fungsi, main() boleh diletakkan dimana saja, tapi sebaiknya fungsi main() diletakkan dipaling atas.

Dalam mendefinisikan sebuah fungsi, pasti akan dijumpai dengan:

  1. Parameter fungsi
  2. Parameter formal dan aktual
  3. Variabel lokal dan global
  4. Isi fungsi

Parameter fungsi adalah sarana komunikasi antar fungsi. Antar fungsi itu sendiri berarti fungsi dengan fungsi lain termasuk antara fungsi dengan fungsi utama. Ada dua jenis parameter dalam hubungannya dengan penggunaan fungsi dalam program, yaitu:

  1. Parameter Formal: parameter yang diberi nilai. Parameter formal merupakan parameter yang terdapat pada prototype fungsi atau deklarasi fungsi.1
  2. Parameter Aktual: parameter yang memberi nilai. Parameter actual merupakan parameter dalam daftar pemanggilan fungsi

1

Pemanggilan Secara Nilai (Call by Value)

Call by Value, merupakan nilai dari parameter actual yang dimasukkan kedalam parameter formal. Dengan cara ini, nilai parameter actual tidak akan berubah walaupun nilai dari parameter formal berubah.

Contoh Call by Value:

  • #include <stdio.h>
    #include <conio.h>
  • tambah (int c, int d); //prototype fungsi tambah
  • main()
    {
    int a, b;
    a = 2;
    b = 5;
  •             printf(“Nilai sebelum pemanggilan fungsi \n”);
    printf(“a = %d , b = %d \n\n”, a, b);
    tambah(a, b);  //parameter actual
    printf(“Nilai setelah pemangilan fungsi \n”);
    printf(“a = %d , b = %d \n\n”, a, b);
  • getchar();
    }
  • tambah(int c, int d)  //parameter formal
    {
    c = c + 4;
    d = d + 6;
  •             printf(“Nilai fungsi  tambah \n”);
    printf(“c = %d , d = %d \n\n”), c, d);
    }

Jadi, walaupun nilai a dan b pada fungsi tambah berubah menjadi 6 dan 11 dan pada fungsi main di panggil lagi nilai a dan b, maka nilai tersebut akan tetap menjadi nilai awalnya, yaitu 2 dan 5. Artinya, nilai variabel fungsi tambah tidak akan mempengaruhi nilai pada variabel fungsi main.

Pemanggilan Secara Referensi (Call by Reference)

Call by reference merupakan pemanggilan alamat dari suatu variabel ke dalam fungsi. Perubahan nilai di fungsi akan merubah nilai asli di bagian program yang memanggil fungsi. Call by reference ini mempergunakan fungsi dari pointer untuk memanggil alamat variabel tersebut.

Contoh Call by Reference:

  • #include <stdio.h>
    #include <conio.h>
  • kurang (int *c, int *d);  //prototype fungsi kurang
  • main()
    {
    int a, b;
  • a = 4;
    b = 7;
  •             printf(“Nilai sebelum pemanggilan fungsi \n”);
    printf(“a = %d , b = %d \n\n”, a, b);
    tambah(&a, &b);  //parameter actual
    printf(“Nilai setelah pemangilan fungsi \n”);
    printf(“a = %d , b = %d \n\n”, a, b);
  • getchar();
    }
  • kurang(int *c, int *d)   //parameter formal
    {
    *c = c* – 2;
    *d = *d – 4;
  •             printf(“Nilai fungsi  kurang \n”);
    printf(“c = %d , d = %d \n\n”), *c, *d);
    }

Berbeda dengan call by value yang tidak mempengaruhi nilai variabel pada fungsi main, Call by Reference mempengaruhi nilai variabel pada fungsi main. Nilai a = 4, b = 7. Fungsi kurang dipanggil, nilai a dan b mengikuti nilai variabel kurang menjadi 2 dan 3.

Variabel lokal merupakan fungsi dimana variabel local tersebut dideklarasikan. Variabel local jua memiliki sifat dinamis / otomatis yang dideklarasikan didalam suatu fungsi.1

Ingat, setiap variabel HARUS diletakan dibawah tanda kurung kurawal ( { )nVariabel local hanya berfungsi di dalam blok saja. Misalnya kalau dari contoh diatas, maka variabel tersebut hanya berlaku pada blok int main saja.

Variabel global merupakan fungsi yang dideklarasikan diluar semua fungsi, dikenali oleh semua fungsi, selalu ada selama program dijalankan dan memiliki sifat statis.

1

Jadi, variabel global pada contoh tersebut akan berlaku pada semua fungsi contoh disamping, variabel usia bisa digunakan dalam fungsi coba dan fungsi main. Untuk struktur fungsi tipe return, deklarasinya seperti ini:

  • <tipe return> NamaFungsi (Argumen1, Argumen2, …….)
    {
    Pernyataan1;
    Pernyataan2;
    }

Tipe return merupakan tipe data yang dipakai ketika suatu fungsi mengembalikan nilai, dapat berupa int, char, float dan tipe data lainnya kecuali tipe data void. Karena, void itu menyatakan bahwa fungsi tersebut tidak mengembalikan nilai.

Argumen atau parameter fungsi merupakan suatu variabel yang digunakan untuk menerima suatu nilai yang dikirimkan ke dalam suatu fungsi oleh fungsi lain. contoh:

  • int  fungsi_Jumlah  (int a,  int b)
    {
    return  a + b;
    }

Perlu diingat, untuk void, void tidak perlu menggunakan keyword return. Walau boleh dipakai, tapi sangat tidak disarankan. Contoh:

  • int  menu;
  • void  menu()
    {
    printf(“Menu  MysticFood”);
    printf(“1.  Mystic  Sunday”);
    printf(“2.  Snow  Chicken  Mist”);
    printf(“3.  Exit  and  choose  other  special  menu\n”);
    printf(“Pilihan  [1..3]   :   “);
    scanf(“%d”,  &menu); fflush (stdin);
    }

 

 

 

Bab 5, Control Structures Statement

December14

Control structure (Kontrol struktur) adalah statement kontrol dan statement yang eksekusi nya di atur oleh kontrol. Statement yang menyediakan jenis-jenis  kemampuan sering di sebut dengan kontrol statement. Selection statement (Statement Seleksi) memberikan arti pada pemilihan antara 2 atau lebih dari jalan eksekusi.

Kategori :

  • Two-way selector
  • Sebagai contoh :
    • if control_expression
    • then clause
    • else clause
  • Nesting Selector
    • if (sum == 0)
    • if (count == 0)
    • result = 0;
    • else
    • result = 1;

Statement diatas dapat di interpretasikan dengan 2 cara, berdasar pada fungsi else di samakan dengan fungsi then atau yang kedua.

  • Multiple-way selector

Multiple selection statement memperbolehkan seleksi satu dari banyak nomor dari statement / statement group.

Contoh :

  • switch (expression)
  • {
  • case constant_expression1:statement1;
  • . . .
  • case constantn: statement_n;
  • [default: statementn+1]
  • }

Counter controlled loop

Counting iterative control statement memiliki variable yang di sebut dengan loop variable, yang count value nya di simpan. Termasuk menjelaskan initial dan terminal nilai dari loop variable, dan perbedaan antara sequential loop variable value, yang biasa di sebut stepsize. Initial, terminal, dan stepsize merukapak sepsifikasi dari loop yang di sebut loop parameter.

Logical controlled loops

Pengulangan ekspresi terhadap Boolean ekspresi

Sebagai contoh :

  • while (control_expression)
  • loop body
  • and
  • do
  • loop body
  • while (control_expression);

User-Located Loop Control Mechanisms

Terkadang, fungsi ini emudah kan programmer untuk memilih lokasi dari kontrol loop dari pada menggunakan sistem top atau bottom dari sebuah loop body.

Sebagai contoh :

  • while (sum < 1000) {
  • getnext(value);
  • if (value < 0)
  • break;
  • sum += value;
  • }

Nilai negatif akan memberhentikan fungsi loop diatas.

Iterasi berdasar data struktur

Kontrol mekanisme biasa di sebut iterator yang mengembalikan element berikutnya dari sebuah urutan.

Contoh :

Do Count = 1, 9, 2

Pada statement diatas nilai 1 sebagai nilai awal dari count, dan nilai 9 sebagai nilai akhir, dan stepsize antar nilai adalah 2. Maka fungsi internal, iterator(iterasi), harus di panggil untuk setiap iterasi untuk menghitung nilai selanjut nya dari count (dengan menambah 2 sebagai nilai akhir dari count, pada contoh tadi).

Unconditional branching statement

Unconditional branching statement mentransfer kontrol eksekusi ke lokasi spesifik dari sebuah program. Memiliki masalah pada goto logic yaitu tanpa restriksi pada penggunaan akan membuat program menjadi sulit dibaca, yang dapat menyebabkan tidak handal dan mahal perawatan.

Guarded Command

Guarded command adalah setiap baris dari seleksi statement yang mengandung Boolean ekspresi dan statement atau statement sequence. Sebagai contoh :

  • if i = 0 -> sum := sum + i
  • [] i > j -> sum := sum + j
  • [] j > i -> sum := sum + i

Bab 4, Expression and Assignment Statements

December14

Ekspresi dalam bahasa C

Pada dasarnya, ekspresi adalah gabungan antara operator dan operand. Dari penggabungan operator dan operand ini dapat dibangun ekspresi-ekspresi yang lebih rumit. Namun demikian, bisa saja dalam bentuk paling sederhana, sebuah ekspresi hanya terdiri dari sebuah operand.

  1. Operator & Operand

Operator adalah karakter khusus yang berupa symbol atau tanda yang digunakan untuk mengoprasikan (memproses) dua operand atau lebih untuk mendapatkan hasil.

Operand adalah suatu variabel (angka atau karakter) yang akan dioprasikan (diproses) oleh operator untuk mengetahui hasil.

  • Operator Aritmatika

Operator adalah simbol-simbol yang digunakan untuk melaksanakan suatu pengolahan data, baik berupa bilangan maupun teks. Operator aritmatika adalah sekelompok operator yang digunakan untuk mengolah aritmatik.

Tabel 1.1 Daftar operator aritmatika

Operator Nama Contoh Penjelasan
* Perkalian x * y Kalikan x dengan y
/ Pembagian x / y Bagi x dengan y
% Modulo x % y Sisa pembagian x oleh y
+ Penjumlahan x + y Tambahkan x dengan y
Pengurangan x – y Kurangkan x dengan y
++ Postfix Inkremen

Prefix Inkremen

++x

x++

Inkremen x setelah digunakan

Inkremen x sebelum digunakan

Postfix Dekremen

Prefix Dekremen

–x

x–

Dekremen x sebelum digunakan

Dekremen x sesudah digunakan

Negasi -x Negasikan nilai x
+ Unary plus +x Nilai positif x

Operator-operator *, /, %, +, dan – merupakan operator dyadic ataubinary operator, yakni operator yang membutuhkan dua operand: kiri dan kanan. Sedangkan operator yang hanya membutuhkan satu operand, disebutmonadic atau operator unary. Yang termasuk golongan operator ini adalah:inkremen (++) dekremen (–), unary minus (-), unary plus (+).

Operasi unary inkremen dan dekremen masing-masing berfungsi untuk menambah nilai variabel dengan satu dan mengurangi nilai variabel dengan satu. Operator unary minus dan unary plus berturut-turut digunakan untuk mengambil nilai negatif dan nilai positif dari suatu bilangan.

Tabel 1.2 Presedensi operator aritmatika

Operator Asosiatifias Presedensi
++ — Kanan ke kiri Tertinggi
Kiri ke kanan
* / % Kiri ke kanan
+ – Kiri ke kanan Terendah
  • Operator Relasional

Operator relasional adalah binary operator yang digunakan untuk membandingkan suatu nilai. Dalam C, ada enam jenis operator relasional: lebih besar, lebih besar atau sama dengan, lebih kecil, lebih kecil atau sama dengan, sama dengan, dan tidak sama dengan.

Tabel 1.3 Daftar operasi relasional

Operator Nama Contoh Penjelasan
< Lebih kecil dari x > y 1 jika x lebih besar y, 0 jika tidak
<= Lebih kecil atau sama dengan x >=y 1 jika x lebih besar atau sama dengan y, 0 jika tidak
> Lebih besar dari x < y 1 jika x lebih kecil y, 0 jika tidak
>= Lebih besar atau sama dengan x <=y 1 jika x lebih kecil atau sama dengan y, 0 jika tidak
== Sama dengan x == y 1 jika x sama dengan y, 0 jika tidak
!= Tidak samadengan x != y 1 jika x dan y tidak sama, 0 jika tidak
  • Operator Unary ‘++’ dan operator unary ‘- -‘ merupakan operator khusus yang ada pada bahasa C dan jarang dijumpai di Bahasa yang lain. Operator ‘++’ akan menambah nilai numerik 1  ke pengenal yang menggunakannya dan operator ‘- – ‘ akan mengurangi dengan nilai numerik 1 untuk pengenal yang menggunakannya. Misalnya bentuk X=X+1 dapat dituliskan sebagai X++. Sedangkan bentuk X=X-1 dapat dituliskan sebagai X–. Operator ini banyak dijumpai di statement for yang berbentuk sebagai berikut
    • for(I=1; I<10;I=I+1)
    • Dapat ditulis dengan operator ‘++’ sebagai berikut
    • for(I=1;I<10;I++)

Contoh 1:

Nilai A adalah 5, nilai B adalah 7, dan nilai C adalah “a”. Beberapa ungkapan hubungan yang menggunakan variable-variebel ini dan hasilnya tampak sebagai berikut :

  • #include <stdio.h>
  • main()
  • {
  • int A=5,B=7;
  • printf(“%d < %d hasilnya adalah %d \n”, A,B,A<B);
  • printf(“%d<=%d hasilnya adalah %d \n”, A,B,A<=B);
  • printf(“%d>%d hasilnya adalah %d \n”,A,B,A>B);
  • printf(“%d>=%d hasilnya adalah %d \n”,A,B,A>=B);
  • printf(“%d==%d hasilnya adalah %d \n”,A,B,A==B);
  • printf(“%d !=%d hasilnya adalah %d \n”,A,B,A!=B);
  • }

Jika program ini dijalankan akan didapatkan hasil :

5 <   7 hasilnya adalah 1

5 <= 7 hasilnya adalah 1

5 >    7 hasilnya adalah 0

5 >= 7 hasilnya adalah 0

5 == 7 hasilnya adalah 0

5 != 7 hasilnya adalah 1

Operator hubungan banyak digunakan untuk penyeleksian kondisi dengan statement if, do-while

1.3  Operator Logika

Operator logika adalah operator-operator yang berkaitan dengan operasi logika, seperti negasi, (ingkaran), konjungsi (dan), dan disjungsi (atau).

Tabel 1.4 Daftar operator logika

Operator Nama Contoh Penjelasan
! NOT logika !x 1jika x nol, 0 jika tidak
&& AND logika x && y 1 jika x dan y keduanya 1
|| OR logika x ll y 0 jika x dan y keduanya 0

Misalnya nilai A adalah 5, B adalah 7, dan C adalah ‘ a’, maka ungkapan logika berikut ini akan mempunyai hasil akhir benar. Hasil akhir benar dari ungkapan logika tersebut didapat dari langkah-langkah sebagai berikut ini.

  • Jenjang operator hubungan lebih tinggi dibandingkan dengan jenjang operator logika, sehingga ungkapan-ungkapan hubungan dikerjakan terlebih dahulu. Ungkapan hubungan A < B adalah benar, maka akan bernilai 1. Ungkapan hubungan B == 7 adalah benar dan bernilai 1. Ungkapan hubungan C > ‘ z ‘ adalah salah maka bernilai 0.
  • Operator logika ‘ && ‘ mempunyai jenjang yang lebih tinggi dibandingkan dengan operator logika ‘ || ‘ , sehingga ungkapan logika 1 && 0 dikerjakan terlebih dahulu dengan hasil logikanya adalah 0.
  • Ungkapan logika 1 || 0 selanjutnya dikerjakan dengan memberikan hasil akhir bernilai logika benar atau 1.

1.4  Operator Bitwise Logika

Operator bitwise logika memperlakukan operan-operand-nya sebagai sebuah kuntitas yeng terdiri dari bit-bit. Operasi dilakukan terhadap masing-masing bittersebut satu demi satu. Operator &&, ||, dan ! memperlakukan seluruhoperand-nya sebagai sebuah nilai benar atau salah yang tunggal. Sedangkan operator bitwise logika dikenakan secara parallel terhadap posisi bit secara individu.

Tabel 1.5 Operator bitwise logika

Operator Nama Contoh Penjelasan
~ Bit-NOT ~x Mengubah bit 1 menjadi 0 dan bit 0 menjadi 1
& Bit-AND x & y AND bitwise dari x dan y
| Bit-OR x / y OR bitwise dari x dan y
^ Eksklusif-OR x ^ y Bernilai 1 bila bit-bit x dan y berbeda
<< Left Shift x << 4 x digeser ke kiri sebanyak 4 posisi bit
>> Right Shift x >> 4 x digeser ke kanan sebanyak 4 posisi bit

1.5  Operator-operator Khusus

Disamping operator-operator yang telah dibahas sebelumnya, C memiliki beberapa operator lain yang bersifat khusus dan digunakan untuk maksud-maksud tertentu. Beberapa diantaranya adalah sebagai berikut

  1. Operator sizeof

Operator sizeof adalah sebuah operator unary yang digunakan pada perhitungan jumlah byte yang dibutuhkan untuk menyimpan sebuah objek atau jenis data. Penentuan ini diperlukan karena sebagian besar jenis data dan variabel membutuhkan tempat penyimpanan internal yang berbeda antara satu komputer dengan komputer yang lain. Dengan penentuan ini, konsistensi data yang digunakan pada program dapat dipertahankan.

  • Contoh :
    #include <stdio.h>
  • main()
    {
    char C;
    int I;
    long int LI;
    float F;
    double D;
    long double LD;
  •      printf (“ukuran karakter = %d byte \n”, sizeof C);
    printf (“ukuran integer= %d byte\n”, sizeof I);
    printf(“ukuran long integer= %d byte \n”,sizeof LI);
    printf (“ukuran float= %d byte \n”,sizeof F);
    printf (“ukuran double= %d byte \n”,sizeof D);
    printf (“ukuran long double= %d byte \n”,sizeof LD);
    }

Jika program ini dijalankan maka akan didapatkan hasil:
ukuran karakter= 1 byte

ukuran integer= 2 byte

ukuran long integer= 4 byte

ukuran float= 4 byte

ukuran double= 8 byte

ukuran long double= 10 byteB.

  1. Operator penugasan

Operator penugasan (assignment operator) adalah operator yang digunakan untuk memberikan nilai pada suatu variabel. Operator ini adalah binaryoperator, dengan sisi sebelah kirinya berupa lvalue, yaitu sebuah variabel tunggal yang mengacu ke memori komputer, sementara sisi sebelah kanannya dapat berupa lvalue atau rvalue. Rvalue adalah sebuah ekspresi yang bukan lvlaue, contohnya paling sederhana adalah konstanta. Selain itu operator penugasan juga dapat digabungkan dengan operator aritmatika dan operatorbitwise logika.

Tabel 1.6 Daftar operator gabungan

Operator Contoh Ekspresi ekivalen Penjelasan
+= x += n x = x + n Tambah x dengan n
-= x -= n x = – n Kurangi x dengan n
*= x *= n x = * n Kalikan x dengan n
/= x /= n x = / n Bagi x dengan n
%= x %= n x = % n Pembagian sisa x dengan n
<<= x <<= n x = << n x digeser ke kiri sebanyak n posisi bit
>>= x >>= n x = >> n x digeser ke kanan banyak n posisi bit
&= x &= n x = & n Setiap bit x di-AND kan dengan setiap bit n
|= x |= n x = | n Setiap bit x di-OR kan dengan setiap bit n
^= x ^= n x = ^ n Setiap bit x di-XOR kan dengan setiap bit n

Contoh :

Misal “=” adalah operator pengerjaan yang akan memberikan nilai dari ungkapan  kepada variabel.

Contoh :

Misalnya variabel I dan J adalah variable-variabel tipe interger dengan nilai awal keduanya adalah 10. Statement-statement berikut ini menggunakan variable-variabel I dan J dan hasil  ungkapannya.

tabel 5 Contoh Operator Pengerjaan

Statement Ekuivalen dengan Hasil ungkapan
I += 3; I = I + 3; I = 10+3 = 13
I -= 2; I = I – 2; I = 10-2 = 8
I *= J/2; I = I*(J/2); I=10* (10/2)=50
I /= J-8; I = I/(J-8); I= 10/ (10-8)= 5
  1. Operator koma

Operator koma digunakan untuk memisahkan sederetan nama variabel dalam sebuah deklarasi, memisahkan argument fungsi, menyatukan dua ekspresi menjadi sebuah pernyataan, memungkinkan pemberian lebih besar dari satu ekspresi pada harga awal, dan perbaikan harga pada struktur pengulangan.

Misalnya Statement berikut ini:

X= ( B= 5, B*2);

Akan dihasilkan nilai X adalah 10, karena B= 5 akan diproses terlebih dahulu dan kemudian nilai B di kalikan dengan nilai 2. Hasil akhir ini yaitu nilai 10 diberikan ke variabel X. Nilai B terakhir adalah 5, sedangkan operasi B*2 tidak merubah nilai B karena operasi ini hasilnya tidak disimpan di variabel B.

  • Operator bertingkat

Operator bertingkat (nested operator) adalah beberapa operator yang dikenakan di dalam sebuah ekspresi. Masing-masing operator di dalam ekspresi tersebut memberikan sebuah nilai yang kemudian dapat digunakan didalam ekspresi yang lebih besar.

  • Operator alamat

Operator alamat adalah operator yang memberikan alamat dari operand­-nya, misalnya &x memberikan alamat dari x. Operand yang dikenakan pada & haruslah merupakan lvalue¸yang memiliki tempat penyimpanan di dalam memori.

  • Operator bersyarat

Operator yang satu-satunya bersifat triadic (ternary operator) yang membutuhkan tiga buah operand dan dikenal juga sebagai ekspresi bersyarat. Ketiga buah operand yang dibutuhkan pada operator ini terdiri dari: satu ekspresi yang akan diuji dan dua ekspresi pilihan.

  • Operator cast

Dalam sebuah program, pengkonversian jenis data secara otomatis sedapat mungkin hendaklah dihindarkan, khususnya pada kasus demosi, karena hal ini akan dapat menimbulkan hal-hal yan tidak diinginkan, misalnya terjadi pemotongan nilai (truncation).

Adakalanya pengkonversian jenis data malah berguna dan perlu dilakukan. Dalam hal ini, C berprinsip untuk tidak memberikan batasan apapun dan melimpahkan tanggung jawab ke pemrogram untuk tidak menyalahgunakan kebebasan ini. Jadi, hendaklah pengkonversian dilakukan dengan dangat hati-hati sekali, sehingga jenis data yang dikonversi dapat dilakukan dengan tepat. Metode melakukan hal itu disebut casting, menggunakan operator berupa sepasang tanda kurung biasa.

  1. Assignment Statement
  1. The Assignment Operator (=)

Dalam bahasa Indonesia assignment ini adalah penugasan. Saya rasa arti kata ini akan membingungkan kita, dalam bahasa saya arti yang lebih cocok dengan yang dilakukan oleh Assignment operator (=) ini dapat diartikan dengan “diisi. untuk lebih jelasnya mari kita lihat contoh dibawah ini :

  •  variable = expression;
  • <target_var> <assign_operator> <expression>
  • A == 7;   ==>variable  A diisi dengan 7.

=  can be bad when it is overloaded for the relational operator for equality (that’s why the C-based languages use == as the relational operator)

B = 1 + 1; ===> variable B diisi dengan hasil 1+1 yaitu 2.

C = A + 1; ===> variable C diisi dengan hasil varaibel A ditambah 1 yaitu 7 +1 = 8.

 2.Assignment Statement : Conditional Target

Statement yang akan ditampilkan bergantung pada kondisi yang telah kita deklarasi kan

Contoh:

  • if (x%2==0) {
  •      printf(“genap”);
  • }
  • Else {
  •      printf(“ganjil”);
  • }

Jika kita memasukkan angka yang akan habis dibagi 2 maka output yang dikeluarkan adalah “GENAP”, Sebalik-nya jika angka yang dimasukkan tidak habis dibagi 2 maka output yang dikeluarkan adalah “GANJIL”.

  1. Assignment Statements: Compound Assignment Operators

Cara sederhana untuk mendeklarasikan sebuah form

Contoh :

  • i = i*2
  • dapat ditulis lebih singkat menjadi : i*=2
  1. Assignment Statements: Unary Assignment Operators

Operator penetapan Unary dalam C-bahasa berbasis menggabungkan pertambahan dan pengurangan operasional perusahaan dengan contoh-contoh penetapan:

sum     =  x++ (x ditulis dahulu, baru ditambah)
sum     = ++x  (ditambah dulu x nya, baru ditulis x nya)
sum     = x– (x ditulis dahulu, baru dikurangi)
sum     = –x (x dikurang dahulu, baru ditulis)
count++ (count incremented)
-count++ (count incremented then negated)

  1. Assignment as an Expression

Dalam bahasa c, assignment statement menghasilkan hasil dan dapat digunakan sebagai operand

  • int c;
  • while((c=10)>0)
  1. Multiple Assignments

Untuk mendeklarasi kan hal hal yang bernilai sama dalam suatu variabel

sample1 = sample2 = 0;

sama seperti

sample1 = (sample2 = 0);

yang berarti sama dengan

sample2 = 0;

sample1 = sample2;

yang berarti sample1 dan sample2 sebenarnya bernilai sama yaitu 0.

  1. Assignment in Functional Languages

Identifiers dalam functional languages hanya nama dari nilai

Names are bound to values with val

     val fruit = apples + oranges;

Jika satu lagi val untuk buah-buahan dibuat, ia adalah sebuah nama yang berbeda dan baru

  1. Mixed-Mode Assignment

Dalam C , setiap nilai numerik dapat ditetapkan untuk setiap variabel scalar angka; hal-hal yang penting adalah konversi dilakukan.

  • int a, b;
  • float c;
  • c = a / b;

karena c adalah float, nilai-nilai a dan b dapat dipaksa untuk di hasilkan dalam bentuk float sebelum divisi, yang dapat menghasilkan nilai yang berbeda untuk c jika dibanding dengan cara-cara pemaksaan ditunda (misalnya, jika a adalah 2 dan b adalah 3).

Bab 3, Data Types

December14

Tipe data adalah jenis data yang mempunyai batasan tempat dan karakteristik sesuai dengan interprestasi data dan dapat diolah oleh komputer untuk memenuhi kebutuhan dalam pemrograman komputer. Tipe data pada umumnya termasuk tipe data primitif, yaitu interger, floating point number dan character (string). Kumpulan dari tipe data primitif yang sejenis juga dapat disatukan dalam sebuah blok yang disebut array.

Jenis-jenis tipe data

  1. Numeric/Number

Tipe data yang digunakan pada variabel atau konstanta untuk menyimpan nilai dalam bentuk bilangan atau angka baik angka atau bilangan tersebut merupakan bilangan bulat ataupun bilangan real.

Tipe data Numeric/Number terbagi menjadi 2 bagian antara lain :

  • Tipe Bilangan Bulat

Tipe bilangan yang hanya dapat menampung data bernilai positif, negatif dan nol ( 0 ). Didalam tipe bilangan bulat sendiri sebenarnya masih dapat terbagi lagi menjadi beberapa golongan berdasarkan rentang datanya. Misalnya, jika yang digunakan adalaha bahasa pemrograman java maka tipe bilangan bulat dibagi menjadi sebagai berikut :

Tipe Data Ukuran (bit) Range
Byte 8 -128 s.d. 127
Short 16 -32768 s.d. 32767
Int 32 -2147483648 s.d. 2147483647
Long 64 -9223372036854775808  s.d. 9223372036854775807
  • Tipe Bilangan Pecahan

Tipe bilangan yang hanya dapat menampung data bernilai positif, negatif, nol, yang bernilai pecahan. Didalam tipe bilangan pecahan sendiri sebenarnya masih dapat terbagi lagi menjadi beberapa golongan berdasarkan rentang datanya. Misalnya, jika yang digunakan adalaha bahasa pemrograman java maka tipe bilangan bulat dibagi menjadi sebagai berikut :

Tipe Ukuran Range Presisi (jumlah digit)
bytes bit
float 4 32 +/- 3.4 x 1038 6-7
double 8 64 +/- 1.8 x 10308 15
  1. String/Karakter

Tipe data yang digunakan pada variabel atau konstanta untuk menyimpan nilai dalam bentuk karakter (angka, huruf, karakter khusus atau simbol).

  1. Boolean

Tipe data yang digunakan untuk menampung nilai logika, yaitu nilai yang hanya memiliki dua buah kemungkinan (benar atau salah).

Tipe – Data Lain

Sebenarnya selain dari ketiga tipe diatas,dalam bahasa pemrograman masih ada tipe data lain yang tidak mungkin dapat disebutkan dan jelaskan satu persatu. Contoh dari tipe data selain Numerik,String dan Boolean adalah sebagai berikut :

  1. Array

Tipe data sejenis yang dapat menampung data secara bertumpuk,jadi satu tipe data tetapi datanya bisa lebih dari satu.

  1. Date

Tipe data yang hanya dapat menampung data dalam format tanggal saja

  1. Time

Tipe data yang hanya dapat menampung data dalam format waktu saja

  1. Char

Sebenarnya tipe data char hampir sama dengan tipe data String, akan tetapi kalau tipe data string panjangnya tidak tetap sedangkan tipe data char panjangnya selalu tetap sesuai dengan inisialisasi awal pemesanan tipe data.

 

OPERASI TIPE DATA

  1. Operasi tipe data numerik
  • Operasi aritmatika

Di dalam operasi ini nilai dari suatu tipe data bisa digunakan untuk melakukan perhitungan aritmatik (penambahan(+), pengurangan (-), perkalian (x), pembagian (/),dll).

  • Contoh :
  • Private int kuis,uts,uas,na;
  • Na=(kuis+uts+uas)/3
  • Operasi operator relational

Operasi operator relational sebenarnya harus dikombinasikan dengan operasi aritmatika dan operasi fungsi logika. Berikut simbol dari operator relational:

  • Sama dengan (=)
  • Tidak sama dengan (!=)
  • Lebih kecil dari (<)
  • Lebih besar dari (>)
  • Lebih kecil dari atau sama dengan (<=)
  • Lebih besar dari atau sama dengan (>=)

Contoh :

  • Private string keterangan;
  • Private int nilai_akhir=61;
  • If (nilai_akhir>=61){
  • Keterangan=”lulus”;
  • }
  1. Operasi tipe data String

Di dalam operasi ini nilai dari suatu tipe data bisa digunakan untuk melakukan pemenggalan, perhitungan panjang string penggabungan dll.

  • Operasi Pemenggalan

Operasi yang digunakan untuk mengambil suatu karakter dalam nilai data string.

Contoh :

  • Substring(“sulis wijayanti”,9,4);
  • Maka hasil diatas adalah “jaya”
  •  Operasi Perhitungan Panjang String

Operasi yang digunakan untuk mengetahui panjang karakter dalam nilai data string.

Contoh :

  • Length(“sulistiana”);
  • Maka hasil diatas adalah 10
  •  Operasi Penggabungan

Operasi yang digunakan untuk menggabungan nilai data string.

Contoh :

  • Concat(“sulis”,”soni”);
  • Maka hasil diatas adalah sulissoni
  •  Operasi Pencarian Posisi

Operasi yang digunakan untuk mengetahui posisi karakter dalam nilai string

Contoh :

  • Index(“intan sari wijayanti”,”sari”);
  • Maka hasil diatas adalah 7
  • Dan masih banyak lagi, misalnya UPPER untuk menjadikan huruf kapital, LOWER untuk menjadikan huruf kecil,L TRIM dan R TRIM untuk menghilangkan spasi pada nilai string dll.
  1. Operasi tipe data boolean

Pada tipe data boolean hanya dapat melakukan operasi logika dan fungsi logika tersebut dapat dikombinasikan dengan fungsi logical(and,or,not,dll) serta dapat dikombinasikan dengan operator relational.

Contoh :

  • Private int na=61;
  • Private string predikat;
  • If ( (na>=61) and (na<=70){
  • Predikat=”C”;
  • }else If ( (na>=71) and (na<=80){
  • Predikat=”B”;
  • }
« Older Entries