Minggu IV : Teori dan Workshop PERULANGAN (LOOP/Iterasi/Repetisi)
Motivasi Sangat banyak kegiatan sehari-hari yang sering diulang. Contoh : Makan sepiring akan dilakukan sesendok demi sesendok (berulang). Kondisi awal : sepiring nasi Yang diulang : makan sesendok nasi Kondisi berikutnya : sepiring sesendok nasi Kondisi akhir : nasi habis
Aritmetika Untuk menghitung 2 x 3 dilakukan dengan menjumlah 2 sebanyak 3 kali (2 ditambah 2ditambah 2) Kondisi awal? Yang diulang? Kondisi berikutnya? Kondisi akhir?
Ada yang berkurang vs ada yang bertambah Kondisi awal : berada di rumah Kondisi akhir : sampai di kampus Yang diulang : jalan kaki selangkah demi selangkah Yang berkurang :jarak rumah kampus Yang bertambah : banyaknya langkah yang telah dilakukan
Komputer mempunyai kemampuan untuk menghitung perulangan dengan sangat cepat dan tidak mengenal lelah. Kadang diperlukan suatu kondisi untuk menghitung dengan perulangan sampai presisi tertentu.
Konsep Counter Perhatikan penugasan berikut ini : C++ : Atau i i + 1 i++; ++i;
Operator Increment dan Decrement Operator increment dan decrement digunakan dalam ekspresi aritmetika Postfix Prefix int hasil, bilangan = 10; hasil = 2 * bilangan++; cout << hasil << endl; cout << bilangan << endl; int hasil, bilangan = 10; hasil = 2 * ++bilangan; cout << hasil << endl; cout << bilangan << endl; Output: 20 11 Output: 22 11
Konsep Total Misalnya kita diminta untuk menghitung jumlah deret : 1 + 2 + 3 + + n = Harga awal : i dimulai dengan 0 (unsur identitas penjumlahan) n i=1 i
Konsep Total (lanjutan) Algoritmik : jumlah 0 for i 1 to n do jumlah jumlah + i C++ : jumlah = 0; for (i = 1; i<=n; i++) jumlah += i;
Konsep Total Perkalian Misalkan kita diminta menghitung : n! = 1. 2. 3. n = Harga awal : 1 (unsur identitas perkalian) n i=1 i
Algoritmik faktorial 1 for i 1 to n do faktorial faktorial * i C++ faktorial = 1; for (i = 1; i<=n; i++) faktorial *= i;
Pemrograman Algoritmik for i awal to akhir do aksi end for for i awal downto akhir do aksi end for while (kondisi) do aksi end while repeat aksi until (kondisi) C++ for (i = awal; i <= akhir; i++) aksi; for (i = awal; i <= akhir; i--) aksi; while (kondisi) aksi; do { aksi; while (kondisi);
Contoh pernyataan for Tidak sah: for (j = 0, j < n, j = j + 3) // semicolon diperlukan for (j = 0; j < n) // bagian ketiga diperlukan
for Ekspresi Null Contoh 1: j = 1; sum = 0; for ( ; j <= 10; j = j + 1) sum = sum + j; Contoh 2: j = 1; sum = 0; for ( ; j <= 10; ) sum = sum + j;
Contoh 3: j = 1; sum = 0; for ( ; ; ) { sum = sum + j; j++; cout << "\n" << sum;
Menghentikan Loop terminating loop Output bilangan genap < 12 Ketika x berharga 12, evaluasi ekspresi menjadi false x = 2; while ( x!= 12 ) { cout << x << ; x = x + 2; Program Output: 2 4 6 8 10 Example: infinite loop Outputs odd bilangans < 12 x tidak pernah berharga 12, sehingga ekspresi selalu true x = 1; while ( x!= 12 ) { cout << x << ; x = x + 2; Loop akan terus Program Output: berulang! 1 3 5 7 9 11 13 15...
Perulangan while dan do-while Perbedaan antara keduanya : saat pengecekan ekspresi! while loop: while ( Expression ) { Statement_1; Statement_2;.... Statement_Last; Ekspresi dievaluasi sebelum badan loop dieksekusi. Badan loop bisa saja tidak dieksekusi. Badan loop do { do-while loop: Statement_1; Statement_2;.... Statement_Last; while ( Expression ); Ekspresi dievaluasi sesudah badan loop dieksekusi. Badan loop Badan loop setidakna diekseskusi sekali.
Format: Badan loop adalah sebuah blok for (initialisasi; tes; update ) { Statement_1; Statement_2;... Badan loop adalah pernyataan tunggal for (initialisasi; tes; update ) Statement; for Loop for loop adalah pre-test loop ekspresi dites before setiap iterasi 1. Eksekusi ekspresi inisialisasi dilakukan hanya sekali 2. Evaluasi ekspresi tes If true, go to 3. If false, loop berakhir. 3. Eksekusi badan loop 4. Eksekusi ekspresi update Kembali ke 2.
for Loop Untuk menambah 1 sampai 10 lakukan pernyataan berikut 10 kali sum = sum + n; Menggunakan while : sum = 0; n = 1; while ( n <= 10 ) { sum = sum + n; n++; Menggunakan for : sum = 0; for ( n = 1; n <= 10 ; n++ ) sum = sum + n; n diinitialisasi1 loop berlanjut sepanjang bernilai true increment setiap kali badan loop dieksekusi for ( Inisialisasi; Ekspresi_Tes; Ekspresi_Update) Cek untuk akhir loop
for Loop Variabel update yang berbeda Variabel n didecrement 7 setiap kali iterasi for ( n = 0; n >= -100; n = n 7) cout << n is now equal to << n << endl; Mendeklarasikan variabel saat inisialisasi Variabel n lokal terhadap badan loop for ( int n = 1; n <= 10; n++ ) { sum = sum + n; Skope cout << sum << endl; variabel n Lebih dari 1 pernyataan dalam inisialisasi for ( int ct = 1, total = 0.0; ct <= 5; ct ++ ) ct dan total { diinisialisasi cout << Enter the sales for day << ct << endl; cin >> sales; total += sales; multiple inisialisasi dipisah dengan koma
Loop Bersarang loop bersarang : loop yang berada di dalam loop yang lain for ( int hours = 0; hours < 24; hours++ ) 3 levels of nesting { for ( int minutes = 0; minutes < 60; minutes++ ) { for ( int seconds = 0; seconds < 60; seconds++ ) { cout << setw(2) << hours << : ; cout << setw(2) << minutes << : cout << setw(2) << seconds << endl; Indentasikan setiap level sub pernyataan bersarang Inner loop akan menjalani iterasi untuk setiap iterasi outer loop
Contoh loop bersarang int y,z; for (y = 5; y > 0; y--) {cout << "\nkuliah."; for (z = 1; z < 3; z++) cout <<"\talgoritma.\t"; cout << ** ; Eksekusi 1 2 3 4 5 4 5 4 6 2 3 4 5 4 5 4 6 2 3 4 5 4 5 4 6 2 3 4 5 4 5 4 6 2 3 4 5 4 5 4 6 2 7
Pernyataan break dan continue break statement causes a loop to terminate early while ( ++count <= 10 ) When break is executed, the loop ends immediately and execution continues with statement following the loop Exit loop { cin >> bilangan; if ( bilangan >= 0 ) { cout << Error: positive bilangan ; break; sum += bilangan; Reads in 10 negative bilangans, computes sum continue statement causes loop to stop current iteration and begin next one while ( testval++ < 7 ) Ketika testval = 4, continue dieksekusi dan cout diloncati, lalu iterasi berikutnya mulai { 1 2 3 5 6 7 if ( testval == 4 ) continue; cout << testval << ;
Pernyataan break int j =50; while (j < 80) { j += 10; if (j == 70) break; cout << Nilai j adalah << j<< \n ; cout << Keluar dari loop.\n ; Output Nilai j adalah 60 Keluar dari loop. Deretan eksekusi : 1 2 3 4 6 7 1 2 3 4 5 8
Pernyataan continue int j =50; while (j < 80) { j += 10; if (j == 70) continue; cout << Nilai j adalah << j<< \n ; cout << Keluar dari loop.\n ; Output Nilai j adalah 60 Nilai j adalah 80 Keluar dari loop. Sequence of execution: 1 2 3 4 6 7 1 2 3 4 5 1 2 3 4 6 7 1 8
break dan continue while ( ---) { statement-1; if( ---) continue statement-2; statement-3; while ( ---) { statement-1; if( ---) break statement-2; statement-3;
Loop design consists of three parts Designing Loops Loop body repeats a predetermined bilangan of times pseudocode: implemented as a for loop: sum = 0 repeat this_many times read value into next sum = sum + next end of loop 1 the body of the loop 2 the initializing statements 3 the conditions for ending the loop Compute the product of a list of bilangans int sum = 0; Initialize to 0 for ( int ct = 1; ct <= this_many; ct++ ) { Loop terminates cin >> next; when this is false sum = sum + next; int product =1; Not initialized to 0 for ( int ct = 1; ct <= this_many; ct++) { First time through loop cin >> next; product * next should = next product = product * next;
Kasus 4.1. Cetaklah bilangan 1 sampai 4 Algoritma Cetak_Angka {Mencetak angka 1,.., 4 ke piranti keluaran Deklarasi i : integer for loop while loop repeat until loop Deskripsi for i 1 to 4 do write (i) endfor Deskripsi i 1 while (i <= 4) do write (i) i i + 1 endwhile Deskripsi i 1 repeat write (i) i i + 1 until (i > 4)
Perhatikan perbedaan ketiga flowchart berikut : Mulai Mulai Mulai for i = 1 to 4 do i =1 i =1 i i <= 4 F i Selesai i T i = i+1 i = i+1 Selesai F i > 4 T Selesai Struktur for Struktur while Struktur repeat -until
for loop while loop do while loop #include <iostream.h> main() { int i; for (i=1; i<=4; i++) cout << << i; return 0; #include <iostream.h> main() { int i=1; while (i <= 4) { cout << << i; i++; return 0; #include <iostream.h> main() { int i=1; do { cout << << i; i++; while (i <= 4); return 0;
Kasus 4.2. Cetaklah bilangan ganjil dari 0 sampai 10 Ide : Bilangan ganjil dari 0 sampai 10 diawali dengan 1, kemudian bertambah dengan 2 atau bilangan ganjil adalah bilangan yang bila dibagi 2 bersisa 1.
Algoritma Cetak Ganjil {Mencetak bilangan ganjil dari 0 sampai 10 ke piranti keluaran Deklarasi i : integer Deskripsi for i 0 to 10 do if (i mod 2 = 1) then write (i) endif endfor Deskripsi i 1 while (i <= 10) do write (i) i i + 2 endwhile Deskripsi i 1 repeat write (i) i i + 2 until (i > 10)
Beberapa cara : Alternatif for Alternatif while Alternatif do while #include <iostream.h> #include <iostream.h> #include <iostream.h> main() { for (int i=0; i<=10; i++) { if (i % 2 == 1) cout << i << endl; return 0; main() { int i=1; while (i<=10) { if (i % 2 == 1) cout << i << endl; i++; return 0; main() { int i=1; do { if (i % 2 == 1) cout << i << endl; i++; while (i<=10); return 0;
Aplikasi Perulangan kerap digunakan untuk menghitung jumlah deret. Contoh : Hitung jumlah dari : 1+2+3+ + n = n i = 1 Kuncinya : buat pola untuk rumus di sebelah kanan! Untuk operasi perkalian menggunakan tanda i
Algoritma menjumlah deret Deklarasi i, n, jumlah : integer Deskripsi read(n) {menjumlah sampai suku ke-n jumlah 0 { nilai awal/unsur identitas penjumlahan adalah 0 for i 1 to n do jumlah jumlah + i write(jumlah)
#include <iostream.h> Bahasa C++ main() { int n, jumlah = 0; cout << "Sampai berapa suku? "; cin >> n; for (int i=0; i<=n; i++) jumlah += i; cout << "Jumlah deret sampai : " << n << " suku = " << jumlah; return 0; Cocok menggunakan perulangan for karena digunakan untuk kalkulasi bilanganerik dengan jumlah perulangan tertentu (fix)
Bilangan Fibonacci Bilangan Fibonacci dapat disajikan sebagai berikut : 0, 1, 1, 2, 3, 5, 8, Dimulai dari suku pertama = 0 dan kedua = 1, suku ketiga adalah jumlah 2 suku pertama. Dalam rumus : F(n) = F(n-1) + F(n-2)
Analisis : Ketika kita menghitung suku ke-3 (F(3)) maka suku ke-1 sebenarnya sudah tidak digunakan. Untuk itu kita bisa menggeser tempat : f1 f2 f2 f3 Lalu berulang kita hitung suku berikutnya : f3 f2 + f1 Buat algoritma fibonacci dan flowchartnya!
Bahasa C++ #include <iostream.h> #define true 1 int main() { long batas; cout << "Masukkan integer positif : "; cin >> batas; cout << "Bilangan Fibonacci < " << batas << ":\n0, 1"; long f1=0, f2=1; while (true) { long f3 = f2 + f1; if (f3 > batas) break; // menghentikan loop cout << ", " << f3; f1 = f2; f2 = f3; return 0; Buat class Fibonacci dan methodnya!
Perulangan while cocok untuk situasi di mana badan loop tidak semuanya dieksekusi Perulangan do - while cocok untuk situasi di mana badan loop sekurangkurangnya dieksekusi satu kali
Kasus 4.3. Carilah rata-rata dari n bilangan bulat positif. Analisis : Rumus rata-rata adalah : n i=1 n x i yaitu jumlah data dibagi dengan banyaknya data, dengan x i adalah data ke-i.
Algoritma mencari rata-rata {Diberikan n data kemudian dicari rata-ratanya Deklarasi i, n, jumlah, x : integer rata : real Deskripsi read(n) jumlah 0 for i 1 to n do read(x) jumlah jumlah + x endfor rata jumlah/n write(rata)
Bahasa C++ #include <iostream.h> main() { int i, n, jumlah, x; float rata; cout << "Banyak data : "; cin >> n; jumlah = 0; for (i = 1; i<=n; i++) { cout << "Data ke- : " << i; cin >> x; jumlah += x; rata = (float) jumlah/n; cout << "Rata-rata = " << rata; return 0; Buat class Rata dan methodnya!
Sentinel Digunakan bila banyaknya masukan tidak diketahui, tetapi sifat datanya diketahui. Untuk menghentikan masukan, digunakan harga lain. Contoh : Bila masukan harga selalu positif (misalkan nilai mahasiswa), sentinel bisa nol atau harga negatif.
Kasus 4.4. Hitunglah rata-rata dari integer positif (banyak data ditentukan dari data yang dimasukkan) Algoritma mencari rata-rata {Diberikan data bilangan bulat positif kemudian dicari rata-ratanya Deklarasi Deskripsi n, jumlah, x : integer rata : real jumlah 0 read(x) n 1 while (x>0) do jumlah jumlah + x read(x) n n+1 endfor rata jumlah/(n-1) write(rata)
Bahasa C++ #include <iostream.h> main() { int n = 1, jumlah = 0, x; float rata; cout << "Data ke-1 : "; cin >> x; while (x>0) { jumlah += x; cout << "Data ke- : " << n+1; cin >> x; n++; rata = (float)jumlah/(n-1); cout << "Rata-rata = " << rata; return 0; Buat class Rata dan methodnya!
Kasus 4.7. Hitunglah nilai dari dan y bilangan bulat. x y dengan x bilangan real Analisis : y x i= 1 = x. x. x. x (sebanyak y kali) = Input : x dan y Output : hasil x pangkat y y x
Algoritma Pangkat {Diberikan masukan x dan y, dihitung nilai dari x pangkat y Deklarasi x, y, i : integer { input pangkat : integer { output Deskripsi read (x,y) pangkat 1 for i 1 to y do pangkat pangkat * x enfor write (pangkat) Buat class Pangkat dan methodnya!
Bahasa C++ #include <iostream.h> main() { int x, y, i; int pangkat = 1; cout << "Menghitung hasil perpangkatan\n"; cout << "Tulis sebuah bilangan : "; cin >> x; cout << "Mau dipangkat berapa : "; cin >> y; for (i = 1; i<=y; i++) pangkat *= x; cout << x << " pangkat << y << = << pangkat; return 0;
Hanya saja, algoritma ini khusus untuk y 0. Latihan : Sempurnakan algoritma tersebut agar dapat menghitung pangkat y negatif.
Kasus 4.8. Hitunglah axb dengan metode penjumlahan Analisis : axb = a + a + + a (sebanyak b kali) = b i = 1 a Ini berlaku untuk a positif maupun negatif Bagaimana bila b negatif?
Karena loop tidak pernah negatif maka harus dimanipulasi perulangan yang selalu positif. Untuk itu nilai b menjadi abs(b) Kemudian khusus untuk b < 0, jumlah yang sudah diperoleh dinegatifkan Ingat : ax(-b) = ax(-1)xb = -axb
#include <iostream.h> #include <math.h> Bahasa C++ main() { int a, b, jumlah=0; cout << "Program menghitung perkalian dengan cara penjumlahan\n"; cout << "Masukkan nilai a : "; cin >> a; cout << "Masukkan nilai b : "; cin >> b; for (int i=1; i<=abs(b); i++) jumlah += a; if (b < 0) jumlah = -jumlah; cout << a << "x" << b << " = " << jumlah; return 0;
Loop Invariant Loop invariant digunakan untuk membuktikan bahwa loop for adalah benar Karakteristik : Benar pada suatu titik (pernyataan) pada setiap iterasi loop Benar bila loop berhenti membuktikan loop bekerja secara benar.
Contoh : program untuk mencari nilai minimum dari sederetan input #include <iostream.h> Bahasa C++ int main() { // mencari maksimum dari sederetan bilangan int n, min; cout << "Masukkan bilangan positif(0 untuk selesai): "; cin >> n; for (min = n; n > 0; ) { if (n < min) min = n; // INVARIANT: min <= n untuk semua n, // dan min adalah 1 dari n bilangan cin >> n; cout << "min = " << min << endl; return 0;
Kondisi : min <= n selalu benar sebab sebelum pernyataan if mengubah harga min jika harga input terakhir dari n kurang dari harga min sebelumnya. Kondisi : min satu dari n harga selalu benar sebab min diawali dengan harga pertama dan min berubah harganya hanya bila harga input n yang baru lebih kecil dari min. Akhirnya : kondisi benar ketika loop berakhir diperoleh nilai minimum dari semua input
Rangkuman Minggu Depan : SUBPROGRAM
Mengakhiri perulangan Secara umum, perulangan dapat diakhiri dengan cara : Dikontrol counter : banyaknya iterasi ditentukan sebelum perulangan dimulai Ditanyakan lebih dulu sebelum iterasi : pengguna ditanya setiap kali iterasi apakah dilanjutkan atau tidak Keluar dengan tanda (flag) : harga variabel berubah pada saat perulangan. Bila sudah berubah sesuai dengan kondisi keluar, maka perulangan berhenti Buat contoh dari masing-masing kasus di atas!
Menunggu respon pengguna char jawab; do { // pernyataan lain cout << Mau melanjutkan? (y/t): "; cin >> jawab; while (jawab!= t');
Contoh Flag bilangan = 0; while ( bilangan!= 999 ) { total = total + bilangan; cout \ntotal saat ini << total; cout << Masukkan bilangan: ; cin >> bilangan;
Contoh Flag flag = 1; while ( flag ) { total = total + bilangan; cout \ntotal saat ini << total; cout << Masukkan bilangan: ; cin >> bilangan; if( bilangan > 999) flag = 0;
Melakukan debugging pada perulangan Bisa terjadi loop terjadi tak berhingga banyak. Agar loop dapat dikendalikan, dapat dilakukan trace (pelacakan) dengan cara : Debuglah kode berikut : int next = 2; int prod = 1; while ( next < 5 ) { next++; prod = prod * next; Variabel trace diletakkan pada cout dalam badan loop : int next = 2; int prod = 1; while ( next < 5 ) { next++; prod = prod * next; cout << next = << next Variabel Trace << prod = << prod << endl;
Kesalahan umum! while (balance!= 0.0); { balance = balance - amount; ini akan mengarah ke infinite loop! for (n=1; n <= count; n++); { cout << "hello" << endl; "hello" hanya dicetak sekali!
Kesalahan umum! while (balance!= 0.0) { balance = balance - amount; balance may not become equal zero due to bilangan inaccuracies while (power <= 1000) { cout << "Next power of N is " << power << endl; power *= n; pastikan variabel sudah diinisialisasi. Untuk penjumlahan 0 dan untuk perkalian 1
Latihan Buatlah algoritma dan program untuk mencetak bilangan yang habis dibagi 3 dan 5 antara 1 sampai dengan 100. Hitunglah nilai dari : 1 1 1 1 1 + + L+ 2 3 4 n [Sentinel] Buatlah algoritma untuk menentukan nilai terkecil, terbesar, dan jumlah semua bilangan positif yang dimasukkan. Buatlah algoritma untuk menentukan nilai terbesar t sedemikian sehingga : 1 2 + 2 2 + + t 2 < 2000
Bahan Diskusi Buat simulasi membeli tiket masuk kebun binatang dengan spesifikasi : Input berupa : Pilihan perorangan/ rombongan Perorangan, berapa orangtua, berapa anak-anak (50% orangtua) Rombongan, banyak orang tua+ anak, diskon 25% Input akan terus dimasukkan sampai tidak ada lagi pengunjung yang membeli tiket Output menyatakan : Banyak tiket orang tua, dan tiket anak Banyak rombongan beserta jumlah tiketnya
Ketentuan program Dibuat menggunakan class Input dan output menggunakan operator overloading dan dibuat cukup informatif untuk pengguna Tidak menggunakan ARRAY Tidak diperkenankan menggunakan SATU FILE untuk seluruh program
Laporan (selain listing program) Deskripsi masalah Analisis permasalahan Algoritma Print out uji coba berupa : Masukan Keluaran
Bacaan [S5] 6.5 while Statement : Fibonacci 6.6 break Statement 8.1 for Statement 8.2 switch Statement Tunjukkan catatan pinggir saat masuk kelas