Pemrograman Dasar C Minggu 6
Topik Bahasan Fungsi Menulis sekali digunakan berulang kali Tugas yang dikompartemenkan Variabel lokal dalam fungsi Teknik Mendesain Top-Down Kode Pseudo Struktur dan Diagram Data Flow Fungsi Spesial main
Fungsi Tugas individu yang identifikasi sebelumnya dengan partisi dan tugas berulang adalah kandidat untuk fungsi: menulis fungsi sekali dan dipanggil jika diperlukan. Komponen utama, fungsi mempunyai: nama sebagai identifier dimana fungsi dipanggil, contoh: printf tubuh dimana pekerjaan internal didefinisikan (sebuah statemen compound dengan {}) fungsi mungkin membutuhkan sebuah informasi yang dikirim kepadanya parameter. Ini dilakukan dengan menggunakan kurung () setelah nama, contoh printf mendapatkan string kontrol dan argumen lain sebuah tipe, tipe return seperti float dll
Analogi Fungsi Dalam matematika kita menulis x = cos(y) Kita menggunakan fungsi bernama cos Kita perlu memberikan kepada fungsi ini sebuah parameter dari tipe derajat : sudut y Fungsi mengembalikan (return) sebuah hasil bilangan riil yang diberikan kepada x, jadi fungsi berlaku seolah mempunyai tipe return real, atau double
Definisi Fungsi Fungsi (seperti variabel dll) harus didefinisikan sebelum dapat digunakan (kompiler harus tahu seperti apa bentuknya) Sebuah definisi fungsi sbb: tipe_hasil nama_fungsi (daftar Parameter) { deklarasi lokal (jika diperlukan)... statemen-statemen;... return statemen; - biasanya }
tipe return statemen Contoh fungsi sederhana: Definisi Fungsi float fungsi_math (int x, int y) { } float z; z = (float)x / y; return (z); identifier deklarasi lokal statemen return parameter Analogi kotak hitam (black box) Parameter Fungsi Hasil (return)
Contoh: Fungsi Pangkat int x_pangkat_y (int x, int y) { if (!(( x = = 0) (y < 0))) { switch (y) { case 0: x = 1; break; case 1: break; default: z = y; for (i=2, i <= y; i++) { x *= z; } /* - akhir for - */ } /* akhir dari switch */ } else x = 0; return (x); } catatan: ditempatkan diatas main()
Memanggil Fungsi Sebuah fungsi dipanggil untuk berfungsi dengan nama identifikasinya. Berikan parameter aktual yang dibutuhkan dengan menempatkannya didalam kurung yang mengikuti nama. Karena fungsi biasanya mengembalikan sebuah nilai, biasanya di-assign ke sesuatu (misalnya sebuah variable yang sesuai) untuk menerima hasil yang dikembalikan.
Memanggil Fungsi Menggunakan contoh pangkat sebelumnya int a = 2, c; c = x_pangkat_y (a,2); Catatan: Tipe dari variabel c sesuai dengan tipe return dari fungsi yang akan menerima hasil (keduanya int) Parameternya passed by value, artinya a tidak berubah, sebuah kopi dari nilainya akan kirimkan kepada fungsi Semua yang dideklarasikan didalam fungsi hanya dikenal di dalam fungsi dan tidak diluar, jadi variabel x dan y hanya ada didalam fungsi kita dan tidak boleh dicampur artikan dengan semua yang terdeklarasi diluar Pengguna tidak perlu tahu apa yang ada di dalam fungsi
Contoh Fungsi Lengkap #include <stdio.h> /* pertama pendefinisian fungsi */ float my_perkalian (float a, float b) { float c; c = a * b; return (c); } float my_pembagian(float q1, float q2) { return (q1/q2); } /* kemudian main didetailkan */ int main (void) { float a = 4.0, x = 2.0, y = 3.0, z, w; z = my_perkalian(a,x); printf( \n%f %f, z, my_pembagian(z,y)); } return (0);
Tambahan untuk Fungsi Parameter Formal adalah nama parameter yang dideklarasikan didalam deklarasi fungsi, seperti float q1 dan q2 dalam my_pembagian Parameter Aktual adalah nama argumen yang dikirim kepada parameter formal ketika fungsi dipakai, jadi ketika my_pembagian dipanggil parameter aktual y dan z dipakai dan dengan asosiasi posisi nilai dari z dikirim kepada fungsi dan menjadi nilai dari parameter formal q1 dan juga q2 mengadopsi nilai y
Tambahan untuk Fungsi Penting untuk disadari bahwa nilai dari parameter aktual yang dikirim kepada parameter formal dan bukan variabel itu sendiri, jadi jika didalam fungsi parameter formalnya berubah nilainya, sumbernya yaitu parameter aktual yang berada diluar tidak terpengaruh! Semua variabel dll yang dideklarasikan di dalam sebuah fungsi hidup hanya jika fungsinya di-run dan mati jika selesai dan nilainya tidak diingat! Kompiler mengecek bahwa angka dan tipe dari parameter aktual dan formal sejenis dan membuat konversi seperlunya aktual ke formal
#include <stdio.h> Fungsi dan Variabel Lokal int inc_int (int a) { a++; return (a); } int alt_inc (int a) { int b; b = b + a; return (b); } int main (void) { int a = 1, b, c, d; Perhatikan penggunaan nama yang sama untuk dua variabel yang lokal ke fungsinya sendiri jadi mereka TIDAK sama! b = inc_int(a); c = alt_inc(b); d = alt_inc(b); printf( a=%d b=%d c=%d d=%d, a, b, c, d); } return (0);
Studi Kasus: Menghitung Analisa Persyaratan: Faktorial (n!) Menghitung n! untuk integer positif yang diberikan Spesifikasi: Menerima input dari integer positif (menggunakan int) Algoritma: n! = n * (n-1) * (n-2) * (n-3)... * (n-(n-1)) Menampilkan output sebagai sebuah bilangan (mungkin besar jadi gunakan float? atau mungkin double?
Menghitung Faktorial (n!) Desain START Mendapat Input Menghitung n! Menampilkan n! Lagi? END
Desain Top-Down Mengembangkan Desain selanjutnya dengan Pseudo Code Start: Tampilkan Masukkan sebuah bilangan positif: Baca input sebagai angka, simpan sebagai n hasil = n n = n 1 while n > 1 hasil = hasil x n n = n 1 Tampilkan n faktorial = Tampilkan hasil sebagai angka Tampilkan Tekan y untuk lanjut Baca input sebagai karakter, simpan di in_c If in_c adalah Y ulangi dari awal: Mendapat Input Menghitung n! Tampilkan n! Lagi?
Desain Top-Down CATATAN: partisi/kompartemen, kandidat yang mungkin untuk fungsi? Mereka dapat berdiri sendiri! Perhatikan 4 kemunculan dari Tampilkan dan 2 dari Baca, kandidat untuk fungsi juga? Pengulangan?
Struktur dan Data Flow Diagram Diagram Struktur menunjukkan relasi internal diantara modul-modul (sering fungsi-fungsi individual) yang ditunjukkan dalam kotak, garis menunjukkan ketergantungan. Data Flow Diagram menunjukkan aliran dari data diantara modul-modul, sering menspesifikasi tipe data
Struktur dan Data Flow Diagram int n main str printf dapat_input float hasil & int n char in_c scanf int n str printf int n float hasil display_hasil float hasil & str & int n scanf hitung_n_fak printf
#include <stdio.h> int dapat_input (void) { int x; printf( \nmasukkan nilai integer positif: ); scanf( %d, &x); return (x); } Implementasi float hitung_n_fak (int y) { float i; for (i = (float)y, --y; y>1; y--) { i *= y; } return (i); } void display_hasil (int n, float x) { printf( \n%d faktorial = %g, n, x); } int main (void) { int n, float hasil, char in_c; do{ n = dapat_input(); hasil = hitung_n_fak(n); display_hasil(n, hasil); printf( \ntekan y untuk lanjut: ); scanf( %c, &in_c); } while (in_c = = Y in_c = = y ); return (0); }
Penggunaan Ulang (Reusability) Reusability: sebuah tugas dilakukan berulang kali dalam program adalah kandidat yang baik untuk sebuah fungsi tulis sekali, dipakai lagi berulang kali. (Fungsi seperti ini, jika didesain dengan baik, mungkin digunakan untuk program lain juga! Letakkan dalam library anda sendiri?) Contoh: Sebuah program untuk menhitung total power yang dibuang di dalam sebuah jaringan tahanan (resistor). Mengulangi tugas menghitung power dalam sebuah resistor berulang kali, satu kali untuk setiap resistor dalam jaringan. Tugas berulang biasanya kandidat yang baik untuk fungsi. Jadi hanya memanggil fungsi ini ketika program anda membutuhkan nilai power dari resistor tertentu Hindari berulang kali menulis bagian kode yang sama.
Penyembunyian Data (Data Hiding) Data Hiding: gunakan variabel lokal (yang dideklarasikan di dalam fungsi) untuk menyembunyikan data yang tidak perlu diketahui bagian program yang lain (dijaga supaya berdiri sendiri). Contoh: Jika semua bagian lain dari program membutuhkan adalah power yang dibuang, maka variabel untuk menyimpan voltase dan arus dapat tetap lokal untuk fungsi tsb, jadi tersembunyi dari bagian program yang lain. Menghindari mempunyai terlalu banyak variabel global.
Pemrograman Terstruktur Pemrograman Terstruktur / Structured Programming Semuanya tentang peng-kompartemenan dan modularisasi Membuat program lebih mudah ditulis dan dipahami
Contoh Fungsi Fungsi untuk menghitung power double res_pwr (int res_num) { double v, i, pwr; printf( \nuntuk resistor %d, res_num); printf( masukkan volt: ); scanf( %lf, &v); printf( masukkan arus: ); scanf( %lf, &i); pwr = v * i; return (pwr); } Digunakan pada bagian lain dari program seperti: total_pwr = res_pwr(2) + res_pwr(3); Dimana total_pwr bertipe variabel double
Fungsi main Apakah tujuan main? Setiap program C memiliki hanya satu fungsi yang disebut main. main adalah fungsi utama (master) dari program dimana semuanya dikontrol. Eksekusi program selalu dimulai dari statemen ter-eksekusi di dalam main. main dapat menerima parameter, ini akan muncul pada shell perintah PC command line setelah nama program, contoh: C:\ my_prog 23 data1.txt Disini kita mempunyai program dinamakan my_prog dan akan menerima 2 parameter, yang pertama angka 23 dan yang lain sebuah file bernama data1.txt
Fungsi main Untuk mengakses parameter diatas main membutuhkan yang berikut pada definisi headernya: int main (int argc, char *argv[]) {.. } argc memberitahukan berapa jumlah parameter pada kenyataannya pada command line ( 2 untuk diatas ) *argv[] adalah array dari pointer untuk parameter diatas (mereka diperlakukan sebagai string karakter)
Ringkasan Fungsi Ditulis sekali digunakan ( call ) berulang kali Baik untuk bagi dan kuasai Harus dideklarasikan sebelum digunakan Mempunyai tipe return Menerima parameter yang: Passed by Value! Sebuah kopi lokal, perubahan di dalam tidak mempengaruhi isi dari sumber orisinil yang diluar Variabel lokal dideklarasikan di dalam fungsi Hidup dan Mati dengan fungsinya Tidak dikenal diluar fungsi
Ringkasan Teknik Desain yang Berguna: Pseudo Code deskripsi Bahasa Logis Diagram: Flow Chart berurutan Data Flow pertukaran informasi Struktur ketergantungan (dependensi) Fungsi spesial yang dinamai main