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 }
Definisi Fungsi Contoh fungsi sederhana: float fungsi_math (int x, int y) { float z; identifier parameter tipe return z = (float)x / y; deklarasi lokal return (z); } statemen statemen return
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
#include <stdio.h> /* pertama pendefinisian fungsi */ float my_perkalian (float a, float b) { float c; c = a * b; return (c); }
Contoh Fungsi Lengkap
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> int inc_int (int a) { a++; return (a); }
Fungsi dan Variabel Lokal
int alt_inc (int a) { int b; b = b + a; return (b); }
Perhatikan penggunaan nama yang sama untuk dua variabel yang ‘lokal’ ke fungsinya sendiri jadi mereka TIDAK sama!
int main (void) { int a = 1, b, c, d; 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 Faktorial (n!)
Analisa Persyaratan: – 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: Mendapat Tampilkan “Masukkan sebuah bilangan positif:” Input Baca input sebagai angka, simpan sebagai n hasil = n Menghitung n=n–1 n! while n > 1 hasil = hasil x n n=n–1 Tampilkan n! Tampilkan “n faktorial =“ Tampilkan hasil sebagai angka Tampilkan “Tekan ‘y’ untuk lanjut” Lagi? Baca input sebagai karakter, simpan di in_c If in_c adalah ‘Y’ ulangi dari awal:
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 main
“str”
printf
int n float hasil & int n
dapat_input int n
scanf
“str”
int n
display_hasil printf
char in_c
float hasil
hitung_n_fak
float hasil & “str” & int n
printf
scanf
#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
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); }
Contoh Fungsi
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’