Modul 1 Dasar­Dasar Bahasa Pemrograman C 1. C dan Pengolahan Sinyal Digital C adalah bahasa pemrograman tingkat tinggi. Sebab bahasa pemrogramannya menggunakan keyword dan syntax yang mudah dimengerti manusia (human friendly). Kelebihan C dibanding bahasa pemrograman tingkat tinggi lainnya (seperti PASCAL atau JAVA) adalah kemampuannya dalam melakukan interaksi dengan perangkat keras secara mudah karena ”kedekatannya” dengan perangkat keras tersebut, persis seperti bahasa pemrograman tingkat rendah seperti assembler. Ini berarti dua hal, pertama, kompilasi dan running programnya jauh lebih cepat, kedua, kode/listing C dapat dijalankan di berbagai platform/processor yang berbeda dengan penyesuaian yang tidak terlalu banyak. Yang terakhir membuat C dikenal juga sebagai platform independent programming language. Dengan kelebihan seperti demikian, maka C adalah bahasa pemrograman pilihan untuk aplikasi Pengolahan Sinyal Digital (PSD). Sebab PSD yang tentunya membutuhkan banyak interaksi dengan perangkat keras dapat dengan mudah diimplementasikan menggunakan bahasa pemrograman C, baik sebagai simulator, emulator atau end­system yang pada banyak kasus memerlukan operasi real­ time. Percayalah, C mampu melakukannya! Pada pelatihan ini, kita akan menggunakan C pada sistem operasi Windows. Jadi prerequisite yang harus anda miliki adalah pemahaman tentang pengoperasian Windows. 2. Compiler dan Editor C adalah bahasa pemrograman. That’s it. Jadi, seperti bahasa pemrograman lain, yang harus anda lakukan adalah menuliskan beberapa baris perintah, lalu simpan ke dalam file dengan ekstensi .c. Karena tujuan akhir kita adalah program aplikasi yang executable , maka hal berikutnya yang harus anda lakukan adalah meng­compile file tersebut untuk menghasilkan file berekstensi .exe. Oleh sebab itu, dalam pengembangan (developing) sebuah aplikasi, minimal anda memerlukan dua program, yaitu editor dan compiler. Banyak pilihan program developing yang bisa anda pakai, tetapi untuk kesederhanaan dan kecepatan phase development, pada pelatihan ini, kita akan menggunakan program Borland Turbo C, yang di dalamnya sudah terdapat compiler dan editor sekaligus. Saat ini, Borland Turbo C dapat anda peroleh secara gratis, yaitu cukup mendownloadnya di situs resmi Borland. 3. Program Pertama Mungkin, cara yang terbaik untuk memahami C adalah dengan melihat langsung contoh programnya. Perhatikan program berikut : #include <stdio.h> void main ( void ) { printf ( "Pengolahan Sinyal Digital\n" ) ; } Di sini, kita bisa melihat beberapa komponen utama yang biasanya ada dalam sebuah program, yaitu bagian main() dan preprocessor. Kita akan membahas lebih jauh mengenai hal ini pada bagian berikutnya. Untuk mencoba Borland Turbo C anda, silahkan coba program di atas, dan lihat keluarannya. 4. Mengenal Bahasa Pemrograman C Berikut adalah penjelasan secara umum tentang bahasa pemrograman C. Untuk mempertajam pemahaman, kita juga akan mencobanya langsung menggunakan compiler/editor Turbo C. 1. Variabel dan Identifier • Dalam C, sebuah variabel harus dideklarasikan terlebih dahulu sebelum dapat digunakan. Caranya adalah dengan menyatakan tipe variabel diikuti dengan nama variabelnya. Perhatikan contoh berikut : int a; char nama[20]; double *y; float koeff = 0.87; • Nama variabel atau identifier adalah case­sensitive. Ini berarti, variabel saya berbeda dengan Saya atau SAYA. Sangat tidak disarankan untuk menggunakan nama variabel dengan huruf besar seluruhnya, sebab biasanya compiler menggunakan variabel seperti ini untuk keperluan program kompilasinya. • Identifier harus dimulai dengan huruf (bukan angka) kemudian selebihnya dapat berupa kombinasi huruf, angka dan underscore. Jadi berikut adalah contoh identifier yang benar : panjang pjg_pointer nama koeff_17 Sementara yang berikut adalah salah : _ini 98angka • Tipe­tipe variabel yang dikenali di C Deklarasi char unsigned char int unsigned int short unsigned short long unsigned long float double Ukuran (bit) 8 8 16 16 16 16 32 32 32 64 Range ­128 sampai 127 0 sampai 255 ­32768 sampai 32767 0 sampai 65535 ­32768 sampai 32767 0 sampai 65535 ­2.1e9 sampai 2.1e9 0 sampai 4.3e9 ­1e­308 sampai 1e38 ­1e­308 sampai 1e308 Sebagai contoh program untuk melihat tipe variabel ini, salin dan compile program typevar.c, lalu perhatikan hasil keluarannya. • Variabel di C dibedakan menurut cakupan dan waktu hidupnya dalam tiga macam variabel, yaitu auto, static dan extern. Pendeklarasiannya sama seperti sebelumnya, hanya ditambahkan keyword sesuai jenisnya, sebagai contoh : static int a; extern char nama[20]; 2. Expression dan Operator • Expression secara sederhana dapat diartikan sebagai sebaris perintah yang dimengerti dan dieksekusi oleh compiler sesuai aturan (lexical) yang telah dtetapkan. Contoh expression sederhana adalah operasi aritmatika, seperti berikut: c = a + b; • Dalam tiap expression digunakan satu atau lebih operator, pada contoh di atas, operator yang digunakan adalah + dan =. • Adapun operator yang dikenal di C adalah sebagai berikut : Operator Aritmatika Operator * / + % ++ ­­ Deskripsi Pengali Pembagi Penjumlah Pembagi modulus (sisa integer) Increment Decrement Operator Relasi Operator < > <= >= != == Deskripsi Lebih kecil dari Lebih besar dari Lebih kecil atau sama dengan Lebih besar atau sama dengan Tidak sama dengan Sama dengan Operator Logika Operator && || ! & | ~ << >> Deskripsi Operasi AND Operasi OR NOT Operasi AND bit per bit Operasi OR bit per bit Negasi bit per bit Geser tiap bit ke kiri Geser tiap bit ke kanan 3. Flow Control • Program adalah kumpulan instruksi yang harus dikerjakan komputer untuk melakukan aplikasi tertentu. Dan tiap pemrograman pasti membutuhkan mekanisme pengaturan alur jalannya instruksi, inilah yang disebut flow control. Termasuk dalam flow control adalah persyaratan dan looping/iterasi. • Di dalam C, persyaratan yang dikenal adalah : a) Pernyataan if else dan trinary conditional Sintaks yang dikenali : 1) if ( condition ) { statements }; 2) if ( condition ) { perform­if­true } else { perform­this­instead } 3) if ( condition ) { perform­if­true } elseif ( another­condition ) { perform­this } else { perform­this­instead } 4) (condition) ? TRUE­STATEMENT : FALSE­STATEMENT c sebagai contoh lihat program ifelse.c. b) Pernyataan switch Sintaksnya : switch ( expression ) { case value_1 : statements; break; case value_2: statements; break; default: statements; break; } Sebagai contoh lihat program switch.c. • Adapun mekanisme looping yang dikenal adalah : a) Pernyataan while do dan do while Sintaksnya : 1) while ( condition ) do { statements }; 2) do { statements } while ( condition ); Sebagai contoh lihat program while.c dan dowhile.c. b) Pernyataan for Sintaksnya : for ( initial­expression;condition;update ) { statements; } Sebagai contoh lihat program for.c. • Sintaks lain yang juga penting dalam flow control adalah break dan continue. break telah kita kenal dalam pernyataan switch, yaitu sebagai perintah untuk mengakhiri persyaratan atau looping. Sementara continue digunakan untuk men­skip perintah setelahnya dan kembali ke condition pada looping. 4. Function • Function adalah mekanisme reusing code di C, yaitu penggunaan kode yang sama secara berulang­ulang. Hal ini penting khususnya dalam dua hal, yaitu optimasi kode dan modularitas. • Deklarasi sebuah fungsi adalah serupa dengan main() hanya tentu saja namanya bukan main, bahkan tidak boleh ada dua main() dalam satu program yang sama. • Perhatikan contoh berikut : #include <stdio.h> int num = 2; /* Variabel Global */ int main() { header(); /* Memanggil fungsi header() */ printf("Kuadrat dari 3 adalah %d\n\n", kuadrat(num)); printf("Variabel inc bernilai : %d\n", increment()); printf("Variabel inc sekarang : %d\n", increment()); printf("Variabel inc sekarang : %d\n", increment()); getch(); return 0; } header() /* Fungsi dengan nama header */ { printf("Contoh function\n\n"); } int kuadrat (int number) /* Fungsi lain */ { int sqr; /* Variabel Lokal */ sqr = number * number; return sqr; } int increment() { static int inc; return inc++; } • Contoh di atas memperlihatkan penggunaan fungsi. Perhatikan juga penggunaan variabel yang cakupan dan waktu hidupnya berbeda sehingga disebut variabel global, variabel lokal dan variabel statik. 5. String dan Array • Array adalah kumpulan data yang bertipe sama. Pendeklarasiannya sama dengan sebelumnya hanya ditambahkan informasi panjang array, seperti : int c[200]; • String diperlakukan berbeda dengan karakter dalam bahasa C. Walaupun string sendiri adalah kumpulan dari karakter dalam bentuk array, pendeklarasiannya adalah seperti berikut : char c[200] = "Laboratorium PSD"; • Modifier yang dapat digunakan untuk string adalah %s, seperti contoh berikut : printf("%s", c); 6. Pointer • Pointer adalah elemen yang sangat penting dalam bahasa C atau bahasa pemrograman lain. Berbeda denga tipe variabel lain, pointer menunjukan alamat memori dari suatu variabel bukan nilai dari variabel. • Pendeklarasiannya adalah sebagai berikut : tipe *nama_variabel; nama_variabel di sini menyimpan alamat, sementara *nama_variabel menyatakan nilainya. Operator yang biasa digunakan pada operasi pointer adalah * dan &, yang masing­masing menyatakan nilai sebuah pointer dan alamat sebuah variabel. Untuk jelasnya, perhatikan contoh program pointer.c. 7. Alokasi Memori Dinamis • Ketika kita mendeklarasikan sebuah variabel, secara otomatis compiler akan mengalokasikan memori sesuai tipe variabel yang digunakan (lihat tabel di atas). Namun adakalanya kita menginginkan alokasi memori yang dinamis, misalkan pada penggunaan array, dimana terkadang kita tidak tahu pasti berapa panjang array yang dibutuhkan. • Untuk mengalokasikan memori secara dinamis digunakan fungsi malloc(), dengan sintaks seperti : var = (tipe) malloc (ukuran * sizeof(tipe); sebagai contoh adalah penggunaannya pada pointer seperti berikut : ptr = (int *) malloc (100*sizeof(int)); • Untuk contoh lebih jelas, perhatikan program malloc.c. Pada contoh program ini kita juga bisa melihat hubungan antara pointer dengan array, string dan function. Latihan: Buat fungsi untuk membangkitkan sinyal sinus dan cosinus dengan frekuensinya sebagai masukan fungsi tersebut. Buat juga fungsi untuk membangkitkan sinyal random. 8. Struktur • Jika array merupakan variabel dengan koleksi beberapa nilai bertipe sama, maka kadang kita membutuhkan variabel yang mampu menyimpan beberapa variabel dengan tipe berbeda, di sinilah kita membutuhkan struktur. • Sintaks yang dipakai untuk mendeklarasikan sebuah struktur adalah : struct { tipe1 var1; tipe2 var2; } nama_structure; sebagai contoh : struct { int no; char nama [50]; double frek; } sinyal; • Untuk mengakses tiap variabel dalam struktur digunakan operator berupa titik (.). Sebagai contoh untuk struktur di atas : sinyal.no = 0; strcpy(sinyal.nama, "Sinusoidal"); sinyal.frek = 2.9; • Struktur juga dapat dibuat dalam bentuk array, deklarasinya seperti : struct { char nama [50]; double frek; } sinyal[10]; Yang masing­masing anggota struktur dapat diakses dengan cara : strcpy(sinyal[0].nama, "Sinusoidal"); sinyal[0].frek = 2.9; • Jika struktur dapat digunakan bersama array, maka tentu struktur juga dapat digunakan bersama pointer. Deklarasinya adalah seperti : struct { char nama [50]; double frek; } *sinyal; Yang masing­masing anggota struktur dapat diakses dengan cara : strcpy(sinyal­>nama, "Sinusoidal"); sinyal­>frek = 2.9; • Untuk contoh penggunaan struktur dapat dilihat pada program struct.c. 9. typedef • Beberapa tipe variabel yang telah kita pelajari sebelumnya kadang belum cukup untuk menyatakan tipe variabel yang kita inginkan, atau pertimbangan seperti kemudahan untuk diingat serta modularitas sistem mengharuskan kita mendefinisikan tipe variabel baru. Untuk ini, bahasa C menyediakan perintah typedef untuk menyatakan tipe variabel baru. • Sintaks yang digunakan adalah : typedef tipe_baru tipe; • Sebagai contoh : typedef bilangan_bulat int; typedef struct { double re; double im; } kompleks; Setelah pendefinisian, kita langsung bisa menggunakan di sepanjang program kita seperti tipe variabel lainnya. bilangan_bulat A; kompleks x ; Latihan: Buat fungsi penjumlahan, pengurangan dan perkalian bilangan kompleks. Petunjuk : gunakan struktur dan typedef.