Prosedur, fungsi, dan pemrograman terstruktur
| English | Bahasa Indonesia |
|---|---|
| subroutines/ˈsʌbruːtiːnz/ | subrutin |
| function/ˈfʌŋkʃn/ | fungsi |
| procedure/prəˈsiːdʒə/ | prosedur |
| structured programming/ˈstrʌktʃəd ˈprəʊɡræmɪŋ/ | pemrograman terstruktur |
| decomposition/ˌdiːkɒmpəˈzɪʃn/ | dekomposisi |
| parameters/pəˈræmɪtəz/ | parameter |
| arguments/ˈɑːɡjuːmənts/ | argumen |
| signature/ˈsɪɡnɪtʃə/ | tanda tangan |
| pass by value/pæs baɪ ˈvæljuː/ | lulus dengan nilai |
| pass by reference/pæs baɪ ˈrefrəns/ | lulus dengan referensi |
| global variable/ˈɡləʊbl ˈveərɪəbl/ | variabel global |
| local variable/ˈləʊkl ˈveərɪəbl/ | variabel lokal |
| scope/skəʊp/ | scope |
Pita rutin siapa pun bisa meminjam
- Pada tahun 1951 tim EDSAC di Cambridge menyimpan perpustakaan subrutin pada pita kertas berlubang: akar kuadrat, pencetakan, logaritma. Program apa pun dapat membacanya dan memanggilnya.
- Bagian yang sulit adalah kembali. Trik David Wheeler, "Wheeler jump", menyimpan alamat kembali sehingga rutinitas dapat kembali ke mana pun telah dipanggil darinya.
- Setiap pemanggilan fungsi yang Anda tulis hari ini melakukan hal yang sama, dan setiap pustaka bahasa berasal dari pita itu.
- Pelajaran ini adalah prosedur dan fungsi: bagaimana mendefinisikannya, bagaimana mengirim nilai masuk dan keluar, dan bagaimana menulis satu dengan cara Paper 2 memberinya nilai.
Prosedur dan fungsi
- Pemrograman terstruktur membangun program dari subrutin kecil bernama, masing-masing dengan satu pekerjaan.
- Prosedur adalah blok bernama yang melakukan aksi dan tidak mengembalikan apa pun:
PROCEDURE Greet(Name : STRING) … ENDPROCEDURE, dijalankan denganCALL Greet("Ada"). - Fungsi mengembalikan nilai yang menjadi bagian dari ekspresi:
FUNCTION Square(X : INTEGER) RETURNS INTEGER … RETURN X * X … ENDFUNCTION, digunakan sebagaiResult ← Square(5) + 1.

Prosedur melakukan sesuatu; fungsi mengembalikan sebuah nilai
Tumpukan panggilan: push saat dipanggil, pop saat dikembalikan
Memanggil subrutina mendorong bingkai baru ke atas; mengembalikan memunculkan bingkai tersebut dan memberikan nilai kembali kepada pemanggil. Panggilan yang sedang berjalan selalu merupakan bingkai di posisi teratas.
Perbedaan utama antara prosedur dan fungsi adalah bahwa sebuah fungsi:
Fungsi mengembalikan nilai (digunakan dalam ekspresi); prosedur melakukan tindakan dan tidak mengembalikan apa pun.
Sebuah fungsi Square(x) mengembalikan x * x. Apa yang dikembalikan oleh panggilan Square(5)?
5 × 5 = 25 — nilai yang diberikan fungsi kepada pemanggilnya (bingkai yang dilepas dari tumpukan panggilan).
Kapan masing-masing cocok digunakan
- Prosedur ketika kelompok langkah yang sama diperlukan di beberapa tempat: memvalidasi input, menampilkan menu, menukar dua nilai. Langkah-langkahnya ditulis sekali dan dipanggil berdasarkan nama.
- Fungsi ketika satu nilai harus dihitung lalu digunakan dalam ekspresi: total, hasil
TRUE/FALSE, angka yang lebih besar dari dua bilangan. Nilai kembalian menggantikan pemanggilannya. - Gunakan subrutin ketika logika muncul di lebih dari satu tempat, ketika blok memiliki tujuan bernama yang jelas, ketika program cukup kompleks untuk memerlukan dekomposisi, atau ketika Anda ingin menguji satu bagian secara terpisah.
Alasan bagus untuk menulis subrutina adalah karena:
Subrutina menghilangkan duplikasi, memberikan tujuan yang bernama, dan dapat diuji secara terpisah.
Parameter, argumen, dan antarmuka
- Parameter adalah variabel yang dideklarasikan oleh subrutin untuk menerima nilai; nilai yang disediakan oleh Caller disebut argumen.
- Header adalah baris pertama:
PROCEDURE Name(Param : TYPE)atauFUNCTION Name(Param : TYPE) RETURNS TYPE. Antarmuka, atau tanda tangan, adalah nama, parameter berurutan beserta tipenya, dan tipe kembalian: semua hal yang harus diketahui Caller. - Nilai kembalian adalah apa yang dilewatkan kembali oleh fungsi dengan
RETURN.
Pasangkan setiap istilah dengan artinya.
Fungsi vs prosedur = mengembalikan nilai atau tidak; lewat nilai vs lewat referensi = salinan atau data asli.
Contoh terpecahkan: jelaskan setiap istilah dalam header
FUNCTION Pass2(Count : INTEGER) RETURNS BOOLEAN.FUNCTION: subrutin yang mengembalikan nilai.Pass2: pengenal yang digunakan untuk memanggilnya.Count: parameter, pengenal yang menerima argumen yang dilalui masuk.INTEGER: tipe data dari parameter tersebut.RETURNS BOOLEAN: tipe data dari nilai yang dikembalikan fungsi. Lima bagian, satu nilai per bagian.
Dalam FUNCTION Pass2(Count : INTEGER) RETURNS BOOLEAN, pengenal Count adalah ____.
Parameter menerima argumen yang dilalui pemanggil dan digunakan di dalam fungsi seperti variabel lokal.
Lulus nilai dan lulus referensi
- Lulus nilai: rutin menerima salinan, sehingga perubahan di dalamnya tidak sampai ke Caller. Gunakan ini untuk input yang hanya dibaca oleh rutin.
- Lulus referensi: rutin menerima referensi ke variabel Caller sendiri, sehingga perubahan menyampai ke Caller. Gunakan ini ketika rutin harus memperbarui argumen, seperti pada
Swap. - Cambridge menuliskan mode di header,
BYVALatauBYREF, sebelum setiap parameter. Jika tidak ada yang ditulis,BYVALdiasumsikan.

Salinan, atau tautan ke variabel Caller
Contoh terpecahkan: apa outputnya?
PROCEDURE Adjust(BYREF X : INTEGER, BYVAL Y : INTEGER)
X <- X + Y
Y <- Y * 2
ENDPROCEDURE
A <- 5
B <- 3
CALL Adjust(A, B)
OUTPUT A, B
Xadalah referensi keA, sehinggaAmenjadi 8.Yadalah salinan dariB, sehingga menggandakanYmeninggalkanBtetap 3.- Outputnya adalah
8, 3. Jika header mengatakanBYVAL X,Aakan tetap 5.
Dalam contoh worked, berapakah nilai A setelah CALL Adjust(A, B)?
X dilewatkan BYREF, sehingga X ← X + Y menambahkan 3 pada A pemanggil: 5 + 3 = 8. B tetap 3 karena Y adalah salinan.
Variabel lokal dan global
- Variabel lokal dideklarasikan di dalam subrutin dan hanya ada selama berjalan; variabel global dideklarasikan di luar dan terlihat di mana saja. Wilayah di mana nama terlihat disebut ruang lingkup.
- Lokal lebih disukai: pengenal yang sama dapat digunakan kembali di tempat lain tanpa bentrok, nilainya tidak dapat berubah tak sengaja oleh bagian program lain, memori dibersihkan saat kembali, dan subrutin swa-kontained.
- Local dibuat baru setiap kali dipanggil, sehingga tidak dapat membawa nilai antar pemanggilan. Rutin yang membangun string melalui pemanggilan berulang membutuhkan string tersebut menjadi global, atau diluluskan
BYREF.

Global terlihat di mana saja; lokal hidup hanya di dalam rutinya sendiri
Variabel lokal hanya ada di dalam subrutina di mana ia dideklarasikan, sedangkan variabel global terlihat di seluruh program.
Menjaga variabel tetap lokal membatasi cakupannya, menghindari bentrok nama, dan membuat subrutina dapat diuji sendiri — variabel global sebaiknya dihindari.
Manakah manfaat penggunaan variabel lokal? Pilih semua yang berlaku.
Lokal dibuat segar setiap kali dipanggil, sehingga tidak dapat menyimpan nilai antar panggilan. Itu adalah satu tugas yang dilakukan oleh variabel global, atau parameter BYREF sebagai gantinya.
Mengubah prosedur menjadi fungsi
- Ubah
PROCEDUREmenjadiFUNCTIONdan tambahkanRETURNS <type>ke header. - Ganti
OUTPUT, atauBYREFparameter yang membawa hasil keluar, dengan pernyataanRETURN. - Ubah setiap pemanggilan agar nilai kembalian digunakan:
Result ← Unpack(Text)alih-alihCALL Unpack(Text, Result).
Untuk mengonversi prosedur menjadi fungsi, ubah header menjadi FUNCTION dengan RETURNS, ganti OUTPUT dengan RETURN, dan ubah panggilan untuk menggunakan nilai yang dikembalikan.
Tiga perubahan, tiga poin: header, RETURN, dan panggilan.
Contoh terpecahkan: menulis modul untuk Paper 2
- Array global
Score : ARRAY[1:50] OF INTEGERmenyimpan nilai ujian. Tulislah fungsiCountAbove(Limit : INTEGER)yang mengembalikan berapa banyak nilai yang lebih besar dariLimit.
FUNCTION CountAbove(BYVAL Limit : INTEGER) RETURNS INTEGER
DECLARE Index, Count : INTEGER
Count <- 0
FOR Index <- 1 TO 50
IF Score[Index] > Limit THEN
Count <- Count + 1
ENDIF
NEXT Index
RETURN Count
ENDFUNCTION
- Skema memberikan nilai per fitur: header dengan parameter dan tipe kembalian, deklarasi lokal, counter diinisialisasi sebelum loop, loop atas setiap elemen, kondisi dengan perbandingan yang benar, pembaruan di dalamnya, konstruksi ditutup, dan satu
RETURNsetelah loop. - Modul yang belum selesai masih mendapat nilai untuk setiap bagian yang benar, jadi tulis semuanya.

Setiap bagian jawaban modul membawa nilainya sendiri
Susun bagian-bagian jawaban modul Paper 2 sesuai urutan penulisannya.
Header, deklarasikan, loop, kondisi, update, return. Setiap bagian bernilai satu poin, bahkan jika bagian lain salah.
⟦⟧ Nilai yang sering terlewat
- Rutin yang harus mengubah variabel Caller membutuhkan
BYREFdi header-nya; tanpa ituBYVALdiasumsikan dan perubahan hilang. - Fungsi memiliki satu
RETURN, setelah loop, danENDFUNCTION.RETURNdi dalam loop mengakhiri loop pada elemen pertama. DECLAREsetiap lokal, dan inisialisasi counter atau total menjadi 0 sebelum loop.- "Pseudocode efisien" berarti memindahkan pekerjaan yang tidak berubah keluar dari loop, menghentikan pencarian pada kecocokan pertama, dan tidak mengulang pemanggilan whose result could be stored.
Untuk membuat perulangan lebih efisien, nilai yang tidak berubah seiring dengan penghitung perulangan harus:
Mentransfer invarian perulangan ke luar menghindari perhitungan ulang nilai yang sama pada setiap iterasi.
Anda telah memahaminya
- prosedur melakukan tindakan dan bersifat
CALLed; fungsi mengembalikan nilai yang digunakan dalam ekspresi - header menamai rutin, parameternya dengan tipe dan tipe kembalian; argumen adalah nilai yang dilalui masuk
- BYVAL meluluskan salinan (default); BYREF memungkinkan rutin mengubah variabel Caller
- pilih local variabel; local dibuat baru setiap kali dipanggil, global mempertahankan nilainya
- Modul Paper 2: header, deklarasi, inisialisasi, loop, kondisi, pembaruan, konstruksi tertutup, satu
RETURN