• Tidak ada hasil yang ditemukan

Minggu IV : Teori dan Workshop. PERULANGAN (LOOP/Iterasi/Repetisi)

N/A
N/A
Protected

Academic year: 2021

Membagikan "Minggu IV : Teori dan Workshop. PERULANGAN (LOOP/Iterasi/Repetisi)"

Copied!
69
0
0

Teks penuh

(1)

Minggu IV : Teori dan Workshop

PERULANGAN

(2)

Motivasi

n Sangat banyak kegiatan sehari-hari yang

sering diulang.

n Contoh :

n Makan sepiring akan dilakukan sesendok

demi sesendok (berulang).

n Kondisi awal : sepiring nasi

n Yang diulang : makan sesendok nasi

n Kondisi berikutnya : sepiring – sesendok nasi n Kondisi akhir : nasi habis

(3)

Aritmetika

n Untuk menghitung 2 x 3 dilakukan

dengan menjumlah 2 sebanyak 3 kali (2 ditambah 2 ditambah 2)

n Kondisi awal ? n Yang diulang ?

n Kondisi berikutnya ? n Kondisi akhir ?

(4)

Ada yang berkurang vs ada yang

bertambah

n Kondisi awal : berada di rumah

n Kondisi akhir : sampai di kampus

n Yang diulang : jalan kaki selangkah

demi selangkah

n Yang berkurang : jarak rumah à

kampus

n Yang bertambah : banyaknya langkah

(5)

n Komputer mempunyai kemampuan

untuk menghitung perulangan dengan sangat cepat dan tidak mengenal lelah.

n Kadang diperlukan suatu kondisi untuk

menghitung dengan perulangan sampai presisi tertentu.

(6)

Konsep Counter

n Perhatikan penugasan berikut ini :

i ß i + 1

n C++ :

i++; Atau

(7)

Operator Increment dan Decrement

Operator increment dan decrement digunakan dalam ekspresi aritmetika

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 Postfix Prefix

(8)

Konsep Total

n Misalnya kita diminta untuk menghitung

jumlah deret :

1 + 2 + 3 + … + n =

n Harga awal : i dimulai dengan 0 (unsur

identitas penjumlahan) 1 =

n i i

(9)

Konsep Total (lanjutan)

n Algoritmik : jumlah ß 0 for i ß 1 to n do jumlah ß jumlah + i n C++ : jumlah = 0;

for (i = 1; i<=n; i++) jumlah += i;

(10)

Konsep Total Perkalian

n Misalkan kita diminta menghitung :

n n! = 1 . 2 . 3 . … n =

n Harga awal : 1 (unsur identitas

perkalian) 1 =

n i i

(11)

n Algoritmik faktorial ß 1 for i ß 1 to n do faktorial ß faktorial * i n C++ faktorial = 1;

for (i = 1; i<=n; i++) faktorial *= i;

(12)

Pemrograman

Algoritmik C++

for i ß awal to akhir do aksi

end for

for (i = awal; i <= akhir; i++) aksi;

for i ß awal downto akhir do aksi

end for

for (i = awal; i <= akhir; i--) aksi; while (kondisi) do aksi end while while (kondisi) aksi; repeat aksi until (kondisi) do { aksi; } while (kondisi);

(13)

n Tidak sah:

for (j = 0, j < n, j = j + 3) // semicolon diperlukan for (j = 0; j < n) // bagian ketiga diperlukan

(14)

for – Ekspresi Null

nContoh 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;

(15)

Contoh 3: j = 1; sum = 0; for ( ; ; ) { sum = sum + j; j++; cout << "\n" << sum; }

(16)

Menghentikan Loop

terminating loop

Output bilangan genap < 12

x = 2; while ( x != 12 ) { cout << x << “ “; x = x + 2; }

Example: infinite loop

Outputs odd bilangans < 12

x = 1; while ( x != 12 ) { cout << x << “ “; x = x + 2; } 2 4 6 8 10 Program Output: 1 3 5 7 9 11 13 15 . . . Program Output:

x tidak pernah berharga 12, sehingga ekspresi selalu true Ketika x berharga 12, evaluasi ekspresi menjadi false Loop akan terus berulang !

(17)

Perulangan while dan do-while

Perbedaan antara keduanya : saat pengecekan ekspresi !

while ( Expression ) { Statement_1; Statement_2; . . . . Statement_Last; }

while loop: do-while loop:

do { Statement_1; Statement_2; . . . . Statement_Last; } while ( Expression ); Ekspresi dievaluasi sebelum

badan loop dieksekusi.

Badan loop bisa saja tidak dieksekusi.

Ekspresi dievaluasi sesudah badan loop dieksekusi.

Badan loop setidakna diekseskusi sekali.

Badan loop

Badan loop

(18)

for Loop

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 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.

(19)

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

(20)

for Loop

Mendeklarasikan variabel saat inisialisasi

for ( int n = 1; n <= 10; n++ ) {

sum = sum + n;

cout << sum << endl; }

Variabel n lokal terhadap badan loop

Variabel update yang berbeda

for ( n = 0; n >= -100; n = n – 7 )

cout << “n is now equal to “ << n << endl;

Lebih dari 1 pernyataan dalam inisialisasi

for ( int ct = 1, total = 0.0; ct <= 5; ct ++ ) {

cout << “Enter the sales for day “ << ct << endl; cin >> sales;

total += sales; }

ct dan total diinisialisasi

multiple inisialisasi dipisah dengan koma

Variabel n didecrement 7 setiap kali iterasi

Skope variabel n

(21)

Loop Bersarang

loop bersarang : loop yang berada di dalam loop yang lain

for ( int hours = 0; hours < 24; hours++ ) {

}

for ( int minutes = 0; minutes < 60; minutes++ ) {

}

3 levels of nesting

Indentasikan setiap level sub pernyataan bersarang

for ( int seconds = 0; seconds < 60; seconds++ ) {

cout << setw(2) << hours << “:”; cout << setw(2) << minutes << “:” cout << setw(2) << seconds << endl; }

(22)

int y,z; for (y = 5; y > 0; y--) { cout << "\nKuliah."; for (z = 1; z < 3; z++) cout <<"\tAlgoritma.\t"; cout << “**“; }

Contoh loop bersarang

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

(23)

Pernyataan break dan continue

break statement causes a loop to terminate early

while ( ++count <= 10 ) {

cin >> bilangan; if ( bilangan >= 0 ) {

cout << “Error: positive bilangan”;

break;

}

sum += bilangan; }

When break is

executed, the loop ends immediately and

execution continues with statement

following the loop

Reads in 10 negative bilangans, computes sum

continue statement causes loop to stop current iteration and begin next one while ( testVal++ < 7 )

{ if ( testVal == 4 ) continue; cout << testVal << “ “; } Exit loop Ketika testVal = 4,

continue dieksekusi dan cout diloncati, lalu iterasi berikutnya mulai

(24)

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”;

n Output

Nilai j adalah 60 Keluar dari loop.

n Deretan eksekusi :

(25)

Pernyataan continue

int j =50;

while (j < 80) { j += 10;

if (j == 70) continuecontinue;

cout << “Nilai j adalah “ << j<< ‘\n’; }

cout << “Keluar dari loop.\n”; nOutput

Nilai j adalah 60 Nilai j adalah 80 Keluar dari loop.

nSequence of execution:

n 1 2 3 4 6 7 1 2 3 4 5 n 1 2 3 4 6 7 1 8

(26)

break dan continue

while ( - - - ) { statement-1; if( - - - ) continue continue statement-2; } statement-3; while ( - - - ) { statement-1; if( - - - ) break break statement-2; } statement-3;

(27)

Designing Loops

Loop body repeats a predetermined bilangan of times

int product =1;

for ( int ct = 1; ct <= this_many; ct++) {

cin >> next;

product = product * next; }

Compute the product of a list of bilangans

pseudocode:

sum = 0

repeat this_many times read value into next sum = sum + next end of loop

implemented as a for loop:

int sum = 0;

for ( int ct = 1; ct <= this_many; ct++ ) {

cin >> next;

sum = sum + next; }

Not initialized to 0

First time through loop

product * next should = next Initialize to 0

1 – the body of the loop

2 – the initializing statements

3 – the conditions for ending the loop

Loop design consists of three parts

Loop terminates when this is false

(28)

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)

(29)

Perhatikan perbedaan ketiga flowchart berikut : Mulai for i = 1 to 4 do i Selesai Selesai Mulai i =1 i = i+1 i <= 4 F T Mulai i =1 Selesai i = i+1 i i > 4 F T i

(30)

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; }

(31)

Kasus 4.2.

Cetaklah bilangan ganjil dari 0 sampai 10

Ide :

n Bilangan ganjil dari 0 sampai 10 diawali

dengan 1, kemudian bertambah dengan 2 atau bilangan ganjil adalah bilangan yang bila dibagi 2 bersisa 1.

(32)

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)

(33)

Beberapa cara :

Alternatif for Alternatif while Alternatif do while

#include <iostream.h>

main() {

for (int i=0; i<=10; i++) { if (i % 2 == 1) cout << i << endl; } return 0; } #include <iostream.h> main() { int i=1; while (i<=10) { if (i % 2 == 1) cout << i << endl; i++; } return 0; } #include <iostream.h> main() { int i=1; do { if (i % 2 == 1) cout << i << endl; i++; } while (i<=10); return 0; }

(34)

Aplikasi

n Perulangan kerap digunakan untuk

menghitung jumlah deret. Contoh :

n Hitung jumlah dari :

1+2+3+… + n =

n Kuncinya : buat pola untuk rumus di sebelah

kanan !

n Untuk operasi perkalian menggunakan tanda

∏ 1 n i i =

(35)

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)

(36)

Bahasa C++ #include <iostream.h>

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)

(37)

Bilangan Fibonacci

n Bilangan Fibonacci dapat disajikan

sebagai berikut :

0, 1, 1, 2, 3, 5, 8, …

n Dimulai dari suku pertama = 0 dan

kedua = 1, suku ketiga adalah jumlah 2 suku pertama. Dalam rumus :

(38)

Analisis :

n 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

n Lalu berulang kita hitung suku

berikutnya : f3 ß f2 + f1

(39)

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; }

(40)

n Perulangan while cocok untuk situasi di

mana badan loop tidak semuanya dieksekusi

n Perulangan do - while cocok untuk

situasi di mana badan loop sekurang-kurangnya dieksekusi satu kali

(41)

Kasus 4.3.

Carilah rata-rata dari n bilangan bulat positif.

Analisis :

n Rumus rata-rata adalah :

n yaitu jumlah data dibagi dengan

banyaknya data, dengan xi adalah data

ke-i. 1 =

n i i x n

(42)

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)

(43)

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;

}

(44)

Sentinel

n Digunakan bila banyaknya masukan tidak

diketahui, tetapi sifat datanya diketahui.

n Untuk menghentikan masukan, digunakan

harga lain.

n Contoh :

Bila masukan harga selalu positif (misalkan nilai mahasiswa), sentinel bisa nol atau harga negatif.

(45)

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 n, jumlah, x : integer rata : real Deskripsi 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)

(46)

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;

}

(47)

Kasus 4.7.

Hitunglah nilai dari dengan x bilangan real dan y bilangan bulat.

n Analisis :

= x . x . x . … x (sebanyak y kali) =

n Input : x dan y

n Output : hasil x pangkat y

y x y x

=1 y i x

(48)

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)

(49)

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;

(50)

n Hanya saja, algoritma ini khusus untuk

y ≥ 0. Latihan :

n Sempurnakan algoritma tersebut agar

(51)

Kasus 4.8.

Hitunglah axb dengan metode penjumlahan

Analisis :

axb = a + a + … + a (sebanyak b kali) =

n Ini berlaku untuk a positif maupun

negatif

n Bagaimana bila b negatif ?

1 b i a =

(52)

n Karena loop “tidak pernah negatif”

maka harus dimanipulasi perulangan yang “selalu” positif.

n Untuk itu nilai b menjadi abs(b)

n Kemudian khusus untuk b < 0, jumlah

yang sudah diperoleh dinegatifkan

(53)

Bahasa C++

#include <iostream.h> #include <math.h> 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;

(54)

Loop Invariant

n Loop invariant digunakan untuk

membuktikan bahwa loop for adalah benar

n Karakteristik :

n Benar pada suatu titik (pernyataan) pada

setiap iterasi loop

n Benar bila loop berhenti membuktikan

(55)

Contoh :

program untuk mencari nilai minimum dari sederetan input

Bahasa C++

#include <iostream.h>

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;

(56)

n Kondisi : min <= n selalu benar sebab

sebelum pernyataan if mengubah harga min jika harga input terakhir dari n kurang dari harga min sebelumnya.

n 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.

n Akhirnya : kondisi benar ketika loop berakhir

(57)

Rangkuman

(58)

Mengakhiri perulangan

n Secara umum, perulangan dapat diakhiri

dengan cara :

n Dikontrol counter : banyaknya iterasi ditentukan

sebelum perulangan dimulai

n Ditanyakan lebih dulu sebelum iterasi : pengguna

ditanya setiap kali iterasi apakah dilanjutkan atau tidak

n Keluar dengan “tanda” (flag) : harga variabel

berubah pada saat perulangan. Bila sudah berubah sesuai dengan kondisi keluar, maka perulangan

berhenti

(59)

Menunggu respon pengguna

char jawab;

do {

// pernyataan lain …

cout << “Mau melanjutkan ? (y/t): "; cin >> jawab;

(60)

bilangan = 0;

while ( bilangan != 999bilangan != 999 ) {

total = total + bilangan;

cout “\nTotal saat ini“ << total; cout << “Masukkan bilangan: “; cin >> bilangan;

}

(61)

flag = 1;

flag = 1;

while ( flagflag ) {

total = total + bilangan;

cout “\nTotal saat ini “ << total; cout << “Masukkan bilangan: “; cin >> bilangan; if( bilangan > 999) flag = 0; flag = 0; }

Contoh Flag

(62)

Melakukan debugging pada perulangan

n 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

<< “prod = “ << prod << endl; }

Variabel Trace

(63)

Kesalahan umum !

while (balance != 0.0);

{

balance = balance - amount;

}

n ini akan mengarah ke infinite loop!

for (n=1; n <= count; n++); {

cout << "hello" << endl; }

(64)

while (balance != 0.0) {

balance = balance - amount;

}

n balance may not become equal zero due to

bilangan inaccuracies

while (power <= 1000) {

cout << "Next power of N is " << power << endl; power *= n;

}

n pastikan variabel sudah diinisialisasi. Untuk

penjumlahan 0 dan untuk perkalian 1

(65)

Latihan

n Buatlah algoritma dan program untuk

mencetak bilangan yang habis dibagi 3 dan 5 antara 1 sampai dengan 100.

n Hitunglah nilai dari :

n [Sentinel] Buatlah algoritma untuk

menentukan nilai terkecil, terbesar, dan jumlah semua bilangan positif yang

dimasukkan.

n Buatlah algoritma untuk menentukan nilai

terbesar t sedemikian sehingga : 12 + 22 + … + t2 < 2000 1 1 1 1 1 2 3 4 − + − + +L n

(66)

Bahan Diskusi

Buat simulasi membeli tiket masuk kebun binatang dengan spesifikasi :

n Input berupa :

n Pilihan perorangan/ rombongan

n Perorangan, berapa orangtua, berapa anak-anak

(50% orangtua)

n Rombongan, banyak orang tua+ anak, diskon 25% n Input akan terus dimasukkan sampai tidak ada

lagi pengunjung yang membeli tiket

n Output menyatakan :

n Banyak tiket orang tua, dan tiket anak

(67)

Ketentuan program

n Dibuat menggunakan class

n Input dan output menggunakan

operator overloading dan dibuat cukup informatif untuk pengguna

n Tidak menggunakan ARRAY

n Tidak diperkenankan menggunakan

(68)

Laporan (selain listing program)

n Deskripsi masalah

n Analisis permasalahan

n Algoritma

n Print out uji coba berupa :

n Masukan n Keluaran

(69)

Bacaan

n [S5]

n 6.5 while Statement : Fibonacci

n 6.6 break Statement

n 8.1 for Statement

n 8.2 switch Statement

n Tunjukkan catatan pinggir saat

Referensi

Dokumen terkait