Disusun Oleh Atang Susila Jl. Surya Kencana No. 1 Pamulang Telp (021)7412566, Fax. (021)7412566 Tangerang Selatan – Banten 2 DAFTAR ISI Hal Daftar Isi..................................................................................................................... 2 Pertemuan 1................................................................................................................ 3 Pertemuan 2................................................................................................................ 9 Pertemuan 3................................................................................................................ 11 Pertemuan 4................................................................................................................ 16 Pertemuan 5................................................................................................................ 18 Pertemuan 6................................................................................................................ 28 Pertemuan 7................................................................................................................ 33 Pertemuan 8................................................................................................................ 39 Pertemuan 9................................................................................................................ 46 Pertemuan 10.............................................................................................................. 52 Pertemuan 11.............................................................................................................. 55 Pertemuan 12.............................................................................................................. 59 Pertemuan 13.............................................................................................................. 65 Pertemuan 14.............................................................................................................. 74 Pertemuan 15.............................................................................................................. 75 Pertemuan 16.............................................................................................................. 80 Pertemuan 17.............................................................................................................. 85 Pertemuan 18.............................................................................................................. 91 Pertemuan 19.............................................................................................................. 100 Pertemuan 20.............................................................................................................. 104 Pertemuan 21.............................................................................................................. 109 Pertemuan 22.............................................................................................................. 115 3 PERTEMUAN I 4 RENCANA PERKULIAHAN Prasyarat : Telah lulus mata kuliah : 1. Pengantar Aplikasi Komputer 2. Pengantar Teknologi Informasi 3. Sistim Digital 4. Logika Matematika Bobot : 4 SKS Jumlah pertemuan : 24 kali Penilaian : 1. Kehadiran : 10% 2. Tugas : 20% 3. UTS : 30% 4. UAS : 40% Program yang digunakan : Microsoft Visual C++ 2008 Express Edition Tugas : 2 buah (1 tugas sebelum UTS dan 1 tugas sebelum UAS) Referensi : 1. Abdul kadir, Panduan Pemrograman Visual C++, Penerbit Andi Yogyakarta 2. Rinaldi Munir, Algoritma dan Pemrograman, Edisi-3, Informatika Bandung 3. M. Sjukani, Algoritma dan Struktur Data dengan C, C++, dan Java, Mitra Wacana Media 4. H.M. Deitel, C How To Program, 3rd, Prentice Hall 5. Bacaan lain dari Internet 5 PENGERTIAN DASAR Algoritma : Rangkaian langkah-langkah/alur pikiran untuk menyelesaikan suatu masalah/tugas yang sifatnya logis dan sistimatis Sifat-sifat Algoritma : Mudah dibaca/jelas maksudnya (tiap langkah jelas uraiannya) Berawal dan berakhir Tidak harus ada data masukan yang dimasukkan dari luar Paling tidak ada satu keluaran Tiap instruksi harus efektif Bahasa pemrograman : Bahasa komputer yang digunakan dalam penulisan program Pemrogram/Programmer : Orang yang membuat program komputer Pemrograman : Kegiatan merancang atau menulis program komputer PERANGKAT UTAMA KOMPUTER TAHAP PELAKSANAAN PROGRAM OLEH KOMPUTER 6 STRUKTUR DASAR DAN NOTASI ALGORITMA Algoritma berupa langkah-langkah penyelesaian suatu masalah/tugas. Langkah-langkah tersebut dapat berupa : 1. Runtunan (Sequence) 2. Pimilihan (Selection) 3. Pengulangan (Repetition) Notasi Algoritmik bukan notasi bahasa pemrograman sehingga siapapun dapat membuat notasi algoritmik yang berbeda. Namun demikian ketaatan atas notasi perlu diperhatikan untuk menghindari kekeliruan. Beberapa notasi yang digunakan untuk menulis algoritma : a. Untaian kalimat deskriptif Setiap langkah dinyatakan dengan bahasa yang gamblang/jelas b. Menggunakan diagram alir (flow chart) c. Menggunakan pseudo-code Pseudo : semu, tidak sebenarnya, pura-pura; adalah notasi yang menyerupai notasi bahasa pemrograman tingkat tinggi Suatu algoritma yang ditulis menggunakan diagram alir menggunakan simbol-simbol sebagai berikut : Simbol Maksud Simbol Maksud Terminal (START, END) Titik sambungan pada halaman yang sama Input/Output (READ, WRITE) Titik konektor yang berada pada halaman lain Proses (menyatakan assignment statement) Call (Memanggil subprogram) Decision (YES, NO) Dokumen Display Stored Data Alur proses Preparation (Pemberian nilai awal suatu variabel) 7 Penulisan algoritma menggunakan pseudo code dapat menggunakan notasi-notasi sebagai berikut : Pernyataan Penulisan Pembacaan Penugasan Notasi algoritmik write(x) write(x,y) write(“Hello”) read(a) read(a,b) bilx Maksud Nilai x dicetak di piranti keluaran Nilai x dan y dicetak di piranti keluaran Text Hello dicetak di piranti keluaran Baca nilai a Baca nilai a,b Isikan nilai variabel x kedalam variabel bil Teks algoritma (pseudo-code) terdiri dari : Head(Judul) : memberikan nama pada algoritma; umumnya nama sudah dapat memberi gambaran pada prosedur penyelesaian masalah atau masalah yang akan diselesaikan Deklarasi : menyatakan jenis dari setiap elemen data (variabel) yang akan digunakan dalam algoritma. Deskripsi : merupakan inti prosedur penyelesaian masalah; meliputi pernyataan/ operasi, fungsi, penjelasan, dll. CONTOH ALGORITMA : a.Untaian kalimat deskriftif ALGORITMA Penjumlahan Diberikan dua buah bilangan bulat positif A dan B. Algoritma Penjumlahan menjumlahakan nilai dua variabel A dan B, hasilnya disimpan pada variabel C DESKRIPSI : 1. Baca nilai A dan B 2. Jumlahkan A dengan B, hasilnya berikan ke C 3. Cetak C 8 b. Flow Chart c. Pseudo-code ALGORITMA Eucledian Program mencari pbt, m dan n bil bulat positif DEKLARASI : A, B : integer {input} C : integer {hasil} DESKRIPSI : read(A,B) C←A+B write(C) Latihan : 1. Buat flow chart untuk menghitung luas segitiga 9 PERTEMUAN II 10 STUDI KASUS MEMBUAT FLOW CHART DARI CONTOH SEDERHANA 1. Buat flow chart untuk menghitung luas, keliling, diagonal persrgi panjang 2. Buat flow chart untuk konversi waktu dari detik ke jam menit detik 3. Buatlah flow chart untuk menghitung luas lingkaran 11 PERTEMUAN III 12 STRUKTUR BAHASA C++ Struktur Bahasa C++ terdiri dari : Compiler directive (preprocessor) Deklarasi (variabel, fungsi) Tubuh program Baris komentar Contoh program : ELEMEN-ELEMEN DASAR C++ Identifier/pengenal : suatu nama yang dipakai dalam pemrograman, umumnya diberikan kepada nama : Variabel : suatu lokasi dalam memori komputer yang digunakan untuk menyimpan nilai Konstanta bernama Tipe data Fungsi Obyek Tipe data dasar Data Obyek Ekspresi aritmetika Statemen kontrol Fungsi Ketentuan pemberian nama : Terdiri dari huruf A sampai Z, atau a sampai z, atau underscore ( _ ), atau 0 sampai 9 13 Karakter pertama suatu identifier harus huruf atau underscore Tidak boleh sama dengan kata kunci (keyword) dalam bahasa C++ Tidak boleh ada spasi Case sensitive : hurup kapital dan hurup kecil diperlakukan beda Karakter : Elemen terkecil pada pemrograman C++ adalah karakter. Karakter dapat berupa : o Huruf (A sampai Z, a sampai z) o Angka ( 0 sampai 9) o Simbol (*, !, dll) o Kode kontrol (misal newline) Keywords : asm, auto, break, case, char, class, const, continue, default, delete, do, double, else, enum, extern, float, for, friends, goto, if, inline, int, long, new, operator, private, protected, public, register, return, short, signed, sizeof, static, struct, switch, template, this, typedef, union, unsigned, virtual, void, volatile, while. Kode escape : kode karakter yang penulisannya diawali dengan simbol \. Kode Ket. \0 Karakter Null \a Karakter audio (bel) \b Backspace \f Formfeed Kode Ket. \n New line \r Cariage return Kode \’ \” Ket. Petik tunggal Petik ganda \t \v \xdd \\ Hexadesimal (dd:0 sd FF) Menampilkan \ Tab Tab vertikal 14 TIPE DATA TIPE DATA DASAR Tipe Ukuran char,unsigned char, signed char 1 byte short, unsigned short 2 byte int, unsigned int 4 byte long, unsigned long 4 byte float 4 byte double 8 byte long double 8 byte JANGKAUAN NILAI Tipe Nilai char -128 sd 127 unsigned char 0 sd 255 short -32.768 sd 32.767 unsigned short 0 sd 65.535 -2.147.483.648 sd long 2.147.483.647 unsigned long 0 sd 4.294.967.295 -2.147.483.648 sd int 2.147.483.647 unsigned int 0 sd 4.294.967.295 float 1,2.10-38 sd 3,4.1038 double 2,2.10-308 sd 1,8.10308 Literal Karakter Literal Karakter digunakan untuk menyatakan sebuah karakter. Karakter ditulis dalam tanda petik tunggal. Contoh : ‘a’ : karakter huruf a ‘#’ : karakter simbol # ‘8’ : karakter angka 8 ‘\n’ : karakter newline Literal String String berarti deretan atau kombinasi sejumlah karakter. Literal String ditulis dalam tanda petik ganda. Contoh : “Rudy Hartono” 15 “4 x 4 = 16” “” : string kosong “abc\ndef” : antara abc dan def terdapat newline “abc\tdef” : antara abc dan def terdapat tab Konstanta Bernama Contoh : const double PI=3.14; menyatakan bahwa PI adalah literal bertipe double dengan nilai 3,14. kata kunci const menyatakan bahwa PI tak dapat diubah setelah didefinisikan. Variabel Menyatakan suatu lokasi dalam memori komputer yang digunakan untuk menyimpan suatu nilai dan nilai yang ada didalamnya bisa diubah. Deklarasi variabel : int a; int a, b; int a=30; cin>>usia; Pernyataan Pernyataan adalah suatu instruksi lengkap yang berdiri sendiri dan ditunjukan untuk melaksanakan suatu tugas tertentu. Sebuah pernyataan selalu diakhiri oleh tanda titik koma. Contoh : luas=panjang*lebar; const double PI=3.14; Latihan 1. Jika diketahui nilai A=5, B=2, T=4. Berapa isi A, B, dan T jika dikenai instruksi sbb : a. T=A b. T=T+A c. T=T+A*B d. T=A%B e. T=B%A f. T=A-B/2 2. Jika diketahui A=5, B=2, berapa isi A dan B jika dikenai instruksi : T=A A=B B=T 16 PERTEMUAN IV 17 STUDI KASUS MEMBUAT PROGRAM SEDERHANA DARI FLOW CHART PADA PERTEMUAN KE II 18 PERTEMUAN V 19 TIPE DATA dan MEMBACA-MENCETAK NILAI KONSTANTA I.Instruksi Baca – Tulis dalam bahasa C/C++ Cetak ke layar monitor Baca dari keyboard printf(“format”,var) gets(var) var=getch() puts(“string”) var=getche() scanf(“format”,&var) cout<<var var=getchar() II.Mencetak sebuah kalimat (literal String) pada program C. Kode program Tercetak di monitor //mencetak_string.cpp #include<stdio.h> void main(void) { printf("Jakarta\n"); Jakarta puts("Jakarta"); Jakarta printf("%s","Jakarta\n"); Jakarta } III.Mencetak sebuah karakter pada program C. Sebuah karakter disimpan dalam satu BYTE (8 bit) printf(“%c”,data); data ‘AB’ ‘a’ 65 97 49 50 66-1 35*2 41 297 172 171 Hasil tercetak A a A a 1 2 A F ) ) ¼ ½ Keterangan kode ASCII 65 adalah karakter A kode ASCII 97 adalah karakter a kode ASCII 49 adalah karakter 1 kode ASCII 50 adalah karakter 2 kode ASCII 65 adalah karakter A kode ASCII 70 adalah karakter F kode ASCII 41 adalah karakter ) kode ASCII 41 (297-256) adalah karakter ) kode ASCII 172 adalah karakter ¼ kode ASCII 171 adalah karakter ½ Catatan : Yang dimaksud dengan karakter diatas adalah karakter ASCII (American Standard Code for Information Interchange) Perhatikan program berikut : Statement printf(“%i”,’A’) printf(“%i”,’a’) printf(“%d”,’A’) printf(“%d”,’a’) Tercetak 65 97 65 97 Keterangan Nilai ASCII dari karakter ‘A’ adalah 65 Nilai ASCII dari karakter ‘a’ adalah 97 Nilai ASCII dari karakter ‘A’ adalah 65 Nilai ASCII dari karakter ‘a’ adalah 97 20 IV.Mencetak karakter escape pada program C. Kode Program //mencetak_escape.cpp #include<stdio.h> void main(void) { printf("Jakarta\nBali\n"); printf("Jakarta\bBali\n"); printf("Jakarta\rBali\n"); printf("Jakarta\\Bali\n"); printf("Jakarta\'Bali\n"); printf("Jakarta\t\tBali\n"); printf("Jakarta\"Bali\n"); } Hasil Jakarta Bali JakartBali Balirta Jakarta\Bali Jakarta’Bali Jakarta Bali Jakarta”Bali V. Mencetak konstanta numerik pada program C printf(“format”,var); Format yang dapat digunakan : Kode format %i atau %d %u %li atau %ld %lu %f %e %le atau %lE %Le atau %LE %c %x atau %X %o Kode program //cetak_numerik1.cpp #include<stdio.h> void main(void) { short a,b,c,d; //-32768 s/d 32767 a=-32768; b=-32769; c=32767; d=32768; printf("a = %i\n",a); printf("b = %i\n",b); printf("c = %i\n",c); printf("d = %i\n",d); } Hasil yang tercetak Numerik integer bertanda Numerik integer tak bertanda Numerik long integer bertanda Numerik unsigned long integer Numerik floating point Numerik floating point Numerik floating point double precission Numerik floating point long double precission Karakter ASCII Hexadesimal Integer Octal Integer Hasil a = -32768 b = 32767 c = 32767 d = -32768 Kode program //cetak_numerik2.cpp #include<stdio.h> void main(void) { unsigned short a,b,c,d; //0 s/d 65535 a=0; b=-1; c=65535; d=65536; printf("a = %u\n",a); printf("b = %u\n",b); printf("c = %u\n",c); printf("d = %u\n",d); } Hasil a=0 b = 65535 c = 65535 d=0 21 0 1 short: 1 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 Kode program //cetak_float1.cpp #include<stdio.h> void main(void) { float a,b,c,d; a=25; b=25.25; c=25.123456; d=25.123456789; printf("a = %f\n",a); printf("b = %f\n",b); printf("c = %f\n",c); printf("d = %f\n",d); printf("\n"); printf("a = %7.2f\n",a); printf("b = %7.3f\n",b); printf("c = %7.0f\n",c); printf("d = %7.4f\n",d); } //cetak_float1.cpp #include<stdio.h> void main(void) { float a,b,c,d; a=25; b=25.25; c=25.123456; d=25.123456789; printf("a = %e\n",a); printf("b = %E\n",b); printf("c = %e\n",c); printf("d = %E\n",d); printf("\n"); printf("a = %7e\n",a); printf("b = %5e\n",b); printf("c = %7.0E\n",c); printf("d = %10.2E\n",d); } 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 Hasil 25.000000 25.250000 25.123455 25.123457 25.00 25.250 25 25.1235 2.500000e+001 2.525000E+001 2.512346e+001 2.512346E+001 2.500000e+001 2.525000e+001 3E+001 2.51E+001 1 0 0 1 1 0 0 1 1 0 1 1 = = = = 32767 -32768 -32767 -1 22 VI. Menginput data melalui keyboard pada program C //baca_keyboard1.cpp #include<stdio.h> void main(void) { char S[6]; printf("Inputkan String : "); gets(S); printf("%s\n",S); } //baca_keyboard3.cpp #include<stdio.h> void main(void) { char C; printf("Masukan sebuah karakter : "); C=getchar(); printf("%c\n",C); } //baca_keyboard5.cpp #include<stdio.h> void main(void) { char C,D; printf("Inputkan dua karakter : "); scanf("%c",&C); scanf("%c",&D); printf("%c %c\n",C,D); } //baca_keyboard2.cpp #include<stdio.h> #include<conio.h> void main(void) { char C; printf("Inputkan sebuah karakter : "); C=getche(); printf("\n%c\n",C); } //baca_keyboard4.cpp #include<stdio.h> #include<conio.h> void main(void) { char C; printf("Masukan sebuah karakter : "); C=getch(); printf("\n%c\n",C); } //baca_keyboard6.cpp #include<stdio.h> void main(void) { int C,D,E; printf("Inputkan bilangan ke-1 : "); scanf("%i",&C); printf("Inputkan bilangan ke-2 : "); scanf("%i",&D); E=C*D; printf("%i * %i = %i\n",C,D,E); } 23 MASALAH TIPE DATA 1. Char Bila isinya diperlakukan sebagai nilai numerik, maka bit sign : 0 : berarti nilai positif 1 : berarti nilai negatif Nilai yang dapat ditampung berkisar dari //char1.cpp #include<iostream> using namespace std; void main(void) { char a,b,c,d; a=127; b=-128; c=128; d=-129; cout<<(int)a<<endl; cout<<(int)b<<endl; cout<<(int)c<<endl; cout<<(int)d<<endl; } Hasilnya : 127 -128 -128 127 Analisis : a = 127, masih dalam jangkauannya b = -128, masih dalam jangkauannya c = 128, diluar jangkauannya. 128 = 1000 0000, karena dideklarasikan sebagai char maka bit MSB memiliki nilai negatif yaitu -128 d = -129, diluar jangkauannya 129 = 1000 0001 -129 = 0111 1111, karena dideklarasikan sebagai char maka nilai biner tersebut sama dengan 127 2. unsigned char Bila isinya diperlakukan sebagai nilai numerik, maka nilai yang dapat ditampung berkisar antara 0 sampai dengan 255 24 //char2.cpp #include<iostream> using namespace std; void main(void) { unsigned char a,b,c,d; a=0; b=255; c=-1; d=256; cout<<(int)a<<endl; cout<<(int)b<<endl; cout<<(int)c<<endl; cout<<(int)d<<endl; } Hasilnya : Analisis : a = 0, masih dalam jangkauannya b = 255, masih dalam jangkauannya c = -1, diluar jangkauannya 1 = 0000 0001 -1 = 1111 1111 sama dengan 255 d = 256, diluar jangkauannya 256 = 1 0000 0000, karena hanya 8 bit maka bit paling kiri diabaikan sehingga nilainya menjadi 0 0 255 255 0 3. short bit sign : 0 : berarti nilai positif 1 : berarti nilai negatif Nilai yang dapat ditampung berkisar dari //short1.cpp #include<iostream> using namespace std; void main(void) { short a,b,c,d; a=-32768 ; b=32767; c=-32769; d=32769; cout<<a<<endl; cout<<b<<endl; cout<<c<<endl; cout<<d<<endl; } Hasilnya : -32768 32767 32767 -32768 Jelaskan!!!!!!! 25 4. unsigne short nilai yang dapat ditampung berkisar antara 0 sampai dengan 65.535 //short2.cpp #include<iostream> using namespace std; void main(void) { unsigned short a,b,c,d; a=0; b=65535; c=-1; d=65536; cout<<a<<endl; cout<<b<<endl; cout<<c<<endl; cout<<d<<endl; } Hasilnya : Jelaskan!!!!!!!!!!!!!!!!!! 0 65535 65535 0 5. int bit sign : 0 : berarti nilai positif 1 : berarti nilai negatif Nilai yang dapat ditampung berkisar dari 26 //int1.cpp #include<iostream> using namespace std; void main(void) { int a,b,c,d; a=-2147483648; b=2147483647; c=-2147483649; d=2147483648; cout<<a<<endl; cout<<b<<endl; cout<<c<<endl; cout<<d<<endl; } Hasilnya : Jelaskan!!!!!!!!!! -2.147.483.648 2.147.483.647 2.147.483.647 -2.147.483.648 6. unsigned int nilai yang dapat ditampung berkisar antara 0 sampai dengan 4.294.967.295 //int2.cpp #include<iostream> using namespace std; void main(void) { unsigned int a,b,c,d; a=0; b=4294967295; c=-1; d=4294967296; cout<<a<<endl; cout<<b<<endl; cout<<c<<endl; cout<<d<<endl; } Hasilnya : 0 4294967295 4294967295 0 Jelaskan!!!!!!!!!!!!!!!! 27 TUGAS 1. Buat algoritma (dalam bentuk flow chart dan pseudo-code) dan program bahasa C untuk menghitung luas lingkaran 2. Buat algoritma (dalam bentuk flow chart dan pseudo-code) dan program bahasa C untuk menghitung nilai-nilai x dari persamaan ax 2 bx c 0 x 1 x2 b b b 2 4ac 2a b 2 4ac 2a inputnya a,b,c 3. Jika diketahui nilai A=5, B=2, T=4. Berapa isi A, B, dan T jika dikenai instruksi sbb : a. T=A b. T=T+A c. T=T+A*B d. T=A%B e. T=B%A f. T=A-B/2 4. Jika diketahui A=5, B=2, berapa isi A dan B jika dikenai instruksi : T=A A=B B=T 28 PERTEMUAN VI 29 OPERATOR DAN EKSPRESI Operand 3 + 3 * Ekspresi 6 Operator Ekspresi/ungkapan : Suatu bentuk yang menghasilkan suatu nilai. Operator : simbol atau karakter khusus (mis. +,*) yang digunakan dalam suatu ekspresi untuk menghasilkan suatu nilai. Operator : Operator Aritmetika Operator penambahan (increment) dan pengurangan (decrement) Operator penugasan Operator pembandingan Operator logika Operator bit Menurut jumlah operand yang dilibatkan, operator diklasifikasikan menjadi menjadi : Operator unary, yaitu operator yang hanya melibatkan satu buah operand Operator binary, yaitu operator yang melibatkan dua buah operand Operator tertiary, yaitu operator yang melibatkan tiga buah operand Operator Aritmetika: Operator + * / % Keterangan Penjumlahan Tanda plus Pengurangan Tanda minus Perkalian Pembagian Sisa pembagian(Modulus) Urutan pelaksanaan operator aritmetika : Kode sumber Hasil //aritmetika.cpp #include<iostream> using namespace std; void main(void) { int a=11; int b=3; cout<<a+b<<endl; 14 cout<<a*b<<endl; 33 cout<<a-b<<endl; 8 cout<<a/b<<endl; 3 cout<<a%b<<endl; 2 } 30 Operator Urutan Dievaluasi pertama. Jika berkalang maka kalang paling dalam dievaluasi paling pertama. Jika ada beberapa pasangan kurung dalam satu level maka dievaluasi dari kiri ke kanan Dievaluasi kedua. Jika ada beberapa maka dievaluasi dari kiri ke kanan Dievaluasi terakhir. Jika ada beberapa maka dievaluasi dari kiri ke kanan () *, /, atau % + atau - Contoh : Aljabar : z=pr%q+w/x-y z = 6 p * r 1 % 2 q + w 4 / 3 x - y ; 5 Tentukan urutan operasi aritmetika dari persamaan berikut : y=a(b+c)+c(a-b(d+a)(a%b)), jika a=20, b=10, c=7, d=2 Operator Penambahan dan Pengurangan : x = x + 1 x++ atau ++x x = x – 1 x-- atau --x x semula 5 5 5 5 Pernyataan y = x++; y = ++x; y = x-y = --x Hasil y 5 6 5 4 Hasil x 6 6 4 4 31 Operator Bit C++ mendukung 6 buah operator yang beroperasi pada level bit (0 dan 1), yaitu : & (AND) | (OR) ^ (XOR) ~ (NOT) << (Geser Kiri) >> (Geser Kanan) Operator & Bit 1 Bit 2 0 0 0 1 1 0 1 1 Hasil 0 0 0 1 Contoh : 9 & 10 memberikan hasil 8 1 1 1 0 0 0 0 1 0 1 0 0 9 10 8 Bit 2 0 1 0 1 Hasil 0 1 1 1 Contoh : 9 | 10 memberikan hasil 11 1 1 1 0 0 0 0 1 1 1 0 1 9 10 11 Operator ^ Bit 1 Bit 2 0 0 0 1 1 0 1 1 Hasil 0 1 1 0 Contoh : 9 ^ 10 memberikan hasil 3 1 1 0 0 0 0 0 1 1 1 0 1 9 10 3 Operator | Bit 1 0 0 1 1 Operator ~ ~185 memberikan hasil -186 0 1 0 1 1 1 1 0 1 0 0 0 Operator << x << n identik dengan x*2n 29 << 1 memberikan hasil 58 0 1 0 1 1 0 185 -186 Operator >> x >> n identik dengan x/2n 29 >> 1 memberikan hasil 14 32 Tentukan output dari program berikut? //Operasi Bit #include<iostream> using namespace std; void main(void) { int x=185; int y=5; cout<<"~" << x <<" = "<<~x<<endl; cout<<x<<" | "<<y<<" = "<<(x|y)<<endl; cout<<x<<" & "<<y<<" = "<<(x&y)<<endl; cout<<x<<" ^ "<<y<<" = "<<(x^y)<<endl; cout<<x<<" << "<<y<<" = "<<(x<<y)<<endl; cout<<x<<" >> "<<y<<" = "<<(x>>y)<<endl; } Operator Penugasan Operator = += -= *= /= %= Keterangan Pemberian nilai Penambahan bilangan Pengurangan bilangan Pengalian bilangan Pembagian bilangan Pemerolehan sisa bagi a += 2 sama dengan a = a + 2 a -= 2 sama dengan a = a - 2 a *= 2 sama dengan a = a * 2 a /= 2 sama dengan a = a / 2 a %= 2 sama dengan a = a % 2 Operator &= ^= |= <<= >>= Keterangan Pemberian nilai Penambahan bilangan Pengurangan bilangan Pengalian bilangan Pembagian bilangan Contoh a &= x sama dengan a = a & x a ^= x sama dengan a = a ^ x a |= x sama dengan a = a | x a <<= x sama dengan a = a << x a >>= x sama dengan a = a >> x Tentukan nilai a dan b dari pernyataan berikut: a=b=6 a += 5 b -=2 a %=b Contoh 33 PERTEMUAN VII 34 TYPE CASTING Operasi perhitungan pada C++ dilakukan dengan menggunakan tipe data yang sama. Jika dalam suatu ekspresi terdapat operand dengan tipe yang berbeda, C++ akan mengkonversikan salah satu tipe sehingga kedua tipe menjadi sama dengan aturan : 1. Jika salah satu operand bertipe long double, yg lain dikonversikan menjadi long double 2. Jika salah satu operand bertipe double, yg lain dikonversikan menjadi double 3. Jika salah satu operand bertipe float, yg lain dikonversikan menjadi float 4. Jika salah satu operand bertipe char, signed char, unsigned char, atau unsigned short, yg lain dikonversikan menjadi int 5. Tipe enumerasi akan dikonversikan ke int, unsigned int, long, atau unsigned long dengan mengakomodasikan jangkauan tipe enumerasi 6. Jika salah satu operand bertipe unsigned long, yg lain dikonversikan menjadi unsigned long 7. Jika salah satu operand bertipe long dan yang lain bertipe unsigned int, kedua operand dikonversikan menjadi unsigned long 8. Jika salah satu operand bertipe long , yg lain dikonversikan menjadi long Type casting : proses mengubah suatu tipe ke tipe yang lain. Bentung pengarah tipe sbb : (tipe_data)data tipe_data(data) static_cast<tipe_data>(data) Code Program //Type casting #include<iostream> using namespace std; void main(void) { double fa,fb,fc; fa=3.14; fb=5.23; fc=10.25; cout<<fa<<endl; cout<<fb<<endl; cout<<fc<<endl; cout<<(int)fa<<endl; cout<<int(fb)<<endl; cout<<static_cast<int>(fc)<<endl; } Output 3.14 5.23 10.25 3 5 10 35 FILE I/O Untuk dapat mengakses file menggunakan C, dapat dilakukan dengan menggunakan pointer FILE. Contoh : FILE *fp; Untuk membuka sebuah file : FILE *fopen(const char *filename, const char *mode); mode : r : open for reading w : open for writing (file need not exist) a : open for appending(file need not exist) r+ : open for reading and writing, start at beginning w+ : open for reading and writing (overwrite file) a+ : open for reading and writing (overwrite file) Contoh sederhana : FILE *fp; fp=fopen("c:\\test.txt", "w"); fprintf(fp, "Testing...\n"); fclose(fp); Code Program //Create a sequential file #include<stdio.h> void main(void) { int akun; char nama[30]; FILE *fp; fp=fopen("d:\\kampus\\program\\c++\\data1.dat","w"); printf("Masukan akun, nama\n"); scanf("%d%s",&akun,nama); fprintf(fp,"%d %s\n",akun,nama); fclose(fp); } Hasil Input : 100 Heri [Enter] Output : File yang bernama data1.dat akan berisi data : 100 Heri 36 Code Program #include<stdio.h> void main(void) { int akun; char nama[30]; FILE *fp; fp=fopen("d:\\kampus\\program\\c++\\data1.dat","r"); fscanf(fp,"%d %s\n",&akun,nama); fclose(fp); printf("%d %s\n",akun,nama); } Hasil Akan tercetak di layar : 100 Heri FORMAT KELUARAN PADA C++ Manipulator dalam C++ Manipulator Fungsi endl end line. Kursos berpindah ke posisi awal baris berikutnya sama dg ends \n flush Menyisipkan karakter NULL Mencetak isi buffer dec Mengkonversi ke bilangan desimal hex Mengkonversi ke bilangan hexadesimal oct Mengkonversi ke bilangan oktal setbase(n) Mengkonversi ke bilangan berbasis n setw(n) Mengatur lebar cetakan selebar n setfill(n) Mengisi leading field dengan karakter n setprecision(n) Membuat lebar desimal point=n setiosflags(lf) Menset format yang diatur dengan tanda format ios: resetiosflags(lf) Mereset format yang diset oleh setioflags() Setiap menggunakan manipulator setxxxxx() atau resetxxxxxx() harus menggunakan : #include<iomanip.h> Code Program //Penggunaan setw #include<iostream> using namespace std; #include<iomanip.h> void main(void) { int x; x=64; cout<<123456789<<endl; cout<<setw(9)<<123<<endl; cout<<123<<endl; cout<<hex<<x<<endl; cout<<oct<<x<<endl; cout<<dec<<x<<endl; Hasil 123456789 123 123 40 100 64 setw() hanya berlaku untuk satu elemen cetak berikutnya 37 cout<<setfill('.'); cout<<setw(10)<<x<<endl; cout<<x<<endl; ........64 64 } Code Program //Penggunaan setprecision() #include<iostream.h> #include<iomanip.h> void main(void) { double x=123.456789; cout<<x<<endl; cout<<setprecision(0)<<x<<endl; cout<<setprecision(1)<<x<<endl; cout<<setprecision(2)<<x<<endl; cout<<setprecision(3)<<x<<endl; cout<<setprecision(4)<<x<<endl; cout<<setprecision(5)<<x<<endl; cout<<setprecision(6)<<x<<endl; cout<<setprecision(7)<<x<<endl; cout<<setprecision(8)<<x<<endl; cout<<setprecision(9)<<x<<endl; cout<<setprecision(10)<<x<<endl; Hasil 123.457 1e+002 1e+002 1.2e+002 123 123.5 123.46 123.457 123.4568 123.45679 123.456789 123.456789 } Tanda Format Untuk mengatur format cetakan diperlukan tanda format yang diset dengan menggunakan manipulator setiosflags() dan direset dengan menggunakan manipulator resetiosflags(). Tanda Format ios::left ios::right ios::scientific ios::fixed ios::dec ios::hex ios::oct ios::uppercase ios::showbase ios::showpoint ios::showpos Fungsi Keluaran yang diatur oleh setw() dicetak rata kiri Keluaran yang diatur oleh setw() dicetak rata kanan Keluaran dicetak dalam bentuk scientific Keluaran dicetak dalam bentuk fixed point Keluaran dicetak dalam bentuk desimal Keluaran dicetak dalam bentuk hexadesimal Keluaran dicetak dalam bentuk oktal Keluaran yang dicetak dalam bentuk hexadesimal dicetak dengan hurup besar Menambahkan 0x diawal hasil cetakan yang berbentuk hexademal atau 0 (nol) pada cetakan yang berbentuk oktal Menampilkan desimal point pada hasil cetakan yang mengandung pecahan Menambahkan tanda + pada hasil cetakan yang bernilai positip 38 Code Program //Penggunaan setiosflags() #include<iostream> #include<iomanip.h> using namespace std; void main(void) { int x=255; double y=123.44; cout<<setiosflags(ios::showbase); cout<<setiosflags(ios::left)<<setw(10)<<x<<endl; cout<<resetiosflags(ios::left); cout<<setiosflags(ios::right)<<setw(10)<<x<<endl; cout<<setiosflags(ios::hex)<<x<<endl; cout<<resetiosflags(ios::hex); cout<<setiosflags(ios::oct)<<x<<endl; cout<<resetiosflags(ios::oct); cout<<setiosflags(ios::dec)<<x<<endl; cout<<setiosflags(ios::fixed)<<setprecision(5)<<y<<endl; cout<<resetiosflags(ios::fixed); cout<<setiosflags(ios::scientific)<<setprecision(5)<<y<<endl; } Hasil 255 255 oxff 0377 255 123.44000 1.23440e+00 2 Soal : 1. Carilah nilai j dan terangkan bagaimana nilai j diperoleh, jika diketahui : int m=24, k=21; a. j=m|k b. j=m%k c. j=m&k d. j=m+ ++k e. j=m+ --k f. j=m- --k g. j=m>>2 h. j=k+=m i. j=--m + k++ j. j=--m*5 2. Buatlah program untuk konversi suhu dengan rumus : Fahrenheit=(9/5)C+32 Reamur=(4/9)C+32 C dalam derajat celcius, Hasilnya disimpan dalam file suhu.dat dengan bentuk : C F R … … … 3. Pak Budi menyimpan uangnya di BCA sebesar M rupiah dengan bunga B% per tahun selama 5 tahun. Buatlah program dan simpan hasilnya dalam file bank.dat untuk menghitung uang Pak Buda pada akhir tahun ke 5. (Inputnya M, B) Rumus : U=M(1+B)n U : uang pada akhir tahun ke-n M : uang pada awal tahun B : bunga per tahun 39 PERTEMUAN VIII 40 I. RUNTUNAN(SEQUENCE) Algoritma runtunan (sequence) : Tiap instruksi dikerjakan satu per satu Tiap instruksi dilaksanakan tepat sekali, tidak ada instruksi yang diulang Urutan instruksi yang dilaksanakan pemroses sama dengan urutan instruksi sebagaimana yang tertulis didalam teks algoritmanya Akhir dari instruksi terakhir merupakan akhir algoritma ALGORITMA Bola {Menghitung Luas, Keliling, Volume Bola} DEKLARASI R,K,L,V : float DESKRIPSI read(R) PI3.14 K2*PI*R L4*PI*R*R V4*PI*R*R*R/4 write(K,L,V) #include<iostream> using namespace std; void main(void) { float PI=3.14,R,L,K,V; cout<<”Masukan harga R :”<<endl; cin>>R; K=2*PI*R; L=4*PI*R*R; V=4*PI*R*R*R/4; cout<<”Keliling : “<<K<<endl; cout<<”Luas : “<<L<<endl; cout<<”Volume : “<<V<<endl; } Buat Algoritma dan program untuk mempertukarkan dua buah nilai variabel A dan B. II. PEMILIHAN/PENGAMBILAN KEPUTUSAN Ekspresi Boolean adalah ekspresi yang menghasilkan nilai yang dapat berupa : Benar (true) atau salah (false) Bukan nol atau nol Kondisi : suatu pernyataan atau ungkapan atau ekspresi yang mengandung nilai benar (TRUE) atau salah(FALSE). 41 1. Operator Pembanding/relasional dalam C/C++ Operator Makna Contoh == Kesamaan a==b 9 > 5 contoh ungkapan yg bernilai TRUE != Ketidaksamaan a!=b 0 contoh ungkapan yg bernilai FALSE > Lebih dari a>b 5 contoh ungkapan yg bernilai TRUE < Kurang dari a<b N > 60 dapat bernilai TRUE atau FALSE >= Lebih dari atau a>=b sama dengan <= Kurang dari a<=b atau sama dengan 2. Operator Logika dalam C/C++ Operator Makna Contoh && dan a==b&&c!=d || atau a==b||c!=d ! bukan !(a==b) 3. Pemilihan 1 kasus (IF-THEN) Pseudo-code if kondisi then pernyataan 1 pernyataan 2 endif opr_1 && opr_2 opr_1 opr_2 Hasil salah salah salah salah benar salah benar salah salah benar benar benar Flow chart opr_1 || opr_2 opr_1 opr_2 Hasil salah salah salah salah benar benar benar salah benar benar benar benar C/C++ if(kondisi) { //blok pernyataan yang //dijalankan jika kondisi benar } Contoh : Buatlah algoritma dan program C++ yang membaca sebuah bilangan bulat dari keyboard, lalu mencetak pesan “genap” jika bilangan tersebut merupakan bilangan genap Jawab : Untuk mengetahui suatu bilangan itu genap atau bukan dapat dilakukan dengan cara membagi bilangan tersebut dengan 2. Jika sisa pembagiannya sama dengan 0 maka bilangan tersebut adalah genap. Algoritma dan code programnya sbb: 42 Pseudo-code ALGORITMA bilGenap {mencetak pesan genap jika bilangan yang dimasukan dari keyboard merupakan bilangan genap} DEKLARASI x : integer DESKRIPSI read(x) if x mod 2 = 0 then write(‘genap’) endif Flow chart 4. Pemilihan 2 kasus(IF-THEN-ELSE) Pseudo-code Flow chart if kondisi then pernyataan 1 else pernyataan 2 endif Kode C++ //Penggunaan if #include<iostream> using namespace std; void main(void) { int x,s; cout<<"Masukan bilangan bulat : "; cin>>x; s=x%2; if(s==0) cout<<"Bilangan Genap"<<endl; } C/C++ if(kondisi) { blok pernyataan yang dijalankan jika kondisi benar } else { blok pernyataan yang dijalankan jika kondisi salah } Contoh : Buatlah algoritma dan code C++ untuk menentukan kelulusan suatu mata ujian. Dinyatakan Lulus jika nilai ujian lebih besar atau sama dengan 60. 43 Jawab : Pseudo-code ALGORITMA Lulus {mencetak pesan Lulus jika nilai ujian >=60} DEKLARASI x : integer DESKRIPSI read(x) if x >= 60 then write(‘Lulus’) else write(‘Tidak Lulus’) endif Flow chart Kode C++ //Penggunaan if-else #include<iostream> using namespace std; void main(void) { int NilaiUjian; cout<<"Masukan Nilai : "; cin>>NilaiUjian; if(NilaiUjian >= 60) cout<<"Lulus"<<endl; else cout<<"Tidak Lulus"<<endl; } 5. Pemilihan tiga kasus atau lebih/Pernyataan IF bersarang (nested IF) Merupakan pernyataan IF dalam IF. Contoh penggunaan IF bersarang yaitu untuk menentukan nilai suatu ujian tergolong sebagai A, B, C, D. E dengan kriteria sebagai berikut : Nilai Nilai 90 80 Nilai < 90 60 Nilai < 80 50 Nilai < 60 Nilai < 50 Skor A B C D E 44 Flow chart : 45 Program : #include<iostream> using namespace std; void main(void) { double NilaiUjian; char skor; Jika salah satu if sudah cout<<”Masukan Nilai Ujian : “; terpenuhi maka program cin>>NilaiUjian; akan langsung if(NilaiUjian >= 90) mengeksekusi cout. { if pertama skor=’A’; } else { if(NilaiUjian >= 70) { if kedua skor=’B’; } else { if(NilaiUjian >= 60) { if ketiga skor=’C’; } else { if(NilaiUjian >= 50) { if keempat skor=’D’; } else { skor=’E’; } } } } cout<<”Skor : “<<skor<<endl; } 46 PERTEMUAN IX 47 Flow chart Struktur C/C++ if(kond1) { //awal kond1 TRUE s1; if(kond2) { //awal kond2 TRUE s2; } //akhir kond2 TRUE else { //awal kond2 FALSE s3; } // akhir kond2 FALSE } //akhir kond1 TRUE else { //awal kond1 FALSE if(kond3) { //awal kond3 TRUE s4; } //akhir kond3 TRUE else { //awal kond3 FALSE s5; } //akhir kond3 FALSE s6; } //akhir kond1 FALSE Flow chart Struktur C/C++ if(kond1) { //awal kond1 TRUE if(kond2) { //awal kond2 TRUE if(kond3) { //awal kond3 TRUE if(kond4) { //awal kond4 TRUE s1; } //akhir kond4 TRUE } //akhir kond3 TRUE } //akhir kond2 TRUE } //akhir kond1 TRUE 48 Flow chart Struktur C/C++ if(kond1) { //awal kond1 TRUE s1; } //akhir kond1 TRUE else { //awal kond1 FALSE if(kond2) { //awal kond2 TRUE s2; } //akhir kond2 TRUE else { //awal kond2 FALSE if(kond3) { //awal kond3 TRUE s3; } //akhir kond3 TRUE else { //awal kond3 FALSE if(kond4) { //awal kond4 TRUE s4; } //akhir kond4 TRUE else { //awal kond4 FALSE s5; } //akhir kond4 FALSE } //akhir kond3 FALSE } //akhir kond2 FALSE } //akhir kond1 FALSE 6. Operator berkondisi(?:) Disebut juga operator ternary karena melibatkan 3 buah argumen. //Terbesar.cpp #include<iostream> using namespace std; void main(void) { int x,y,maks; cout<<”Masukan sebuah bilangan : “; cin>>x; cout<<”Masukan lagi sebuah bilangan : ”; cin>>y; maks = x > y ? x : y; cout<<”Terbesar adalah : “<<maks;endl; } 49 7. Struktur Case Untuk masalah dengan dua kasus atau lebih, penggunaan CASE dapat lebih menyederhanakan penulisan. case ekspresi nilai_1 : pernyataan_1 nilai_2 : pernyataan_2 .................................. nilai_n : pernyataan_n otherwise : pernyataan_x endcase Flow chart Kode C++ switch(ekspresi) { case nilai_1 : pernyataan_1 ; break; case nilai_2 : pernyataan_2 ; break; case nilai_3 : pernyataan_3 ; break; default : pernyataan_n ; } Pada pernyataan switch : masing-masing pernyataan ( 1 sd n) bagian default bersifat opsional. Jika dapat berupa satu atau beberapa ada, bagian perintah dan tidak perlu berupa blok ini dijalankan jika nilai ekspresi tidak pernyataan ada yang cocok dengan nilai_1, pernyataan_1 dijalankan kalau nilai ekspresi dengan nilai_1. Setelah dijalankan eksekusi dilanjutkan ke akhir pernyataan switch begitu juga dengan pernyataan lainya dijalankan jika nilai ekspresi sesuai dengan nilai ybs. nilai_2,...,nilai_n. nilai kondisi hanya dapat berupa tipe primitif pernyataan break digunakan untuk mengendalikan eksekusi ke akhir pernyataan switch. 50 Contoh : mencetak nama hari berdasarkan nomornya. Algoritma Kode C++ ALGORITMA hari #include<iostream> {Mencetak nama hari berdasarkan using namespace std; nomor (1 ..7)} void main(void) DEKLARASI { NomorHari : integer int NomorHari; DESKRIPSI cout<<”Masukan Nomor Hari : ”<<endl; read(NomorHari) cin>>NomorHari; case NomorHari switch(NomorHari) 1 : write(’Minggu’) { 2 : write(’Senin’) case 1: 3 : write(’Selasa’) cout<<”Minggu”<<endl; 4 : write(’Rabu’) break; 5 : write(’Kamis’) case 2: 6 : write(’Jumat’) cout<<”Senin”<<endl; 7 : write(’Sabtu’) break; otherwisw : case 3: write(’Salah Nomor’) cout<<”Selasa”<<endl; endcase break; case 4: cout<<”Rabu”<<endl; break; case 5: cout<<”Kamis”<<endl; break; case 6: cout<<”Jumat”<<endl; break; case 7: cout<<”Sabtu”<<endl; break; default : cout<<”Salah Nomor”<<endl; } } Tugas: 1. Buatlah algoritma dan program C++ untuk mengitung luas, keliling, panjang diagonal persegi panjang, dengan tampilan sbb (masukan : panjang dan lebar) : =============================== MENU EMPAT PERSEGI PANJANG 1. Hitung Luas 2. Hitung Keliling 3. Hitung Panjang Diagonal 4. Keluar Program ================================ Pilih Nomor : 51 2. Buatlah algoritma dan program C++ untuk menghitung upah mingguan karyawan. Masukan yang dibaca adalah nama karyawan, golongan, dan jumlah jam kerja. Keluaran program adalah nama karyawan dan upahnya. Ketentuan : jam kerja normal = 48 jam upah per jam : Golongan A : Rp. 4000 Golongan B : Rp. 5000 Golongan C : Rp. 6000 Golongan D : Rp. 7000 upah lembur : Rp.3000/jam 52 PERTEMUAN X 53 III. PENGULANGAN Struktur pengulangan terdiri atas : Kondisi pengulangan : ekspresi boolean Badan pengulangan Inisialisasi Terminasi Instruksi (pernyataan) pengulangan 1. for 2. while 3. repeat (do – while) 1. Pernyataan for Digunakan jika jumlah pengulangan sudah diketahui sebelum eksekusi Bentuk : a. for menaik : for pencacah nilai_awal to nilai_akhir do Pernyataan endfor b. for menurun : for pencacah nilai_akhir downto nilai_awal do Pernyataan endfor Flow chart pencacah harus bertipe integer atau karakter pernyataan adalah satu atau lebih instruksi yang diulang nilai_awal lebih kecil atau sama dengan nilai_akhir jumlah pengulangan = nilai_akhir - nilai_awal + 1 Struktur C++ for(init;kondisi;rubah_kondisi) { pernyataan; pernyataan; } for(init;kondisi;) { pernyataan; pernyataan; rubah_kondisi; } init; for(;kondisi;) { pernyataan; pernyataan; rubah_kondisi; } rubah_kondisi dapat diletakan diawal, ditengah, atau diakhir badan pengulangan 54 ALGORITMA for DEKLARASI I : integer DESKRIPSI for i1 to 5 do write(I) endfor #include<iostream> using namespace std; void main(void) { for(int I=1 ; I 5 ; I++) cout<<I<<endl; } Apa keluaran dari program diatas? Analisis perkembangan nilai I Kondisi nilai I Tercetak I5 1 T 1 2 T 2 3 T 3 4 T 4 5 T 5 6 F Keluar dari Loop Tentukan output dari program berikut : #include<iostream> #include<iostream> #include<iostream> using namespace std; using namespace std; using namespace std; void main(void) void main(void) void main(void) { { { for(int i=1; i<5;i++) for(int i=1; i<=10;i+=2) for(int i=1; i<=10;i+=2); cout<<i<<endl; cout<<i<<endl; cout<<i<<endl; } } } #include<iostream> #include<iostream> #include<iostream> using namespace std; using namespace std; using namespace std; void main(void) void main(void) void main(void) { { { int i=0; for(int i=1; i<=5;) for(int i=1; i<=5;i++) for(; i<=10;) { for(int j=1;j<=i;j++) { cout<<i+1<<endl; cout<<”*”; i++; i++; cout<<endl; cout<<i<<endl; } } } } } #include<iostream> #include<iostream> #include<iostream> using namespace std; using namespace std; using namespace std; void main(void) void main(void) void main(void) { { { for(int i=1; i<5;i+=10) for(int i=1; i<5;i+=4) for(int i=11; i<=10;i+=2) cout<<i<<endl; cout<<i<<endl; cout<<i<<endl; } } } Soal : Buat program untuk menghitung rata-rata dari sepuluh buah bilangan, yg diinput satu per satu dari kb. 55 PERTEMUAN XI 56 3. Pernyataan repeat(do-while) Bentuk : Keterangan: repeat Pengulangan dilakukan terus menerus jika kondisi masih true Pernyataan Pengulangan berhenti jika nilai kondisi menjadi false until kondisi Agar kondisi berubah ke false, dalam badan pengulangan harus ada instruksi yang merubah nilai kondisi Flow chart Struktur C++ init; do { pernyataan; pernyataan; rubah_kondisi; } while(kondisi); rubah_kondisi dapat diletakan diawal, ditengah, atau diakhir badan pengulangan ALGORITMA repeat #include<iostream> using namespace std; void main(void) { int I=1; do { cout<<I<<endl; I++; } while(I 5 ); } DEKLARASI I : integer DESKRIPSI I1 repeat write(I) II+1 until (I<=5) Apa keluaran dari program diatas? nilai I Tercetak Nilai I baru (Setelah I=I+1) Kondisi I5 1 2 3 4 5 1 2 3 4 5 2 3 4 5 6 T T T T F, keluar dari loop Pertanyaan : Apa perbedaan dan persamaan penggunaan pernyataan for, while, do-while? 57 4. Pernyataan continue Pernyataan continue dimaksudkan untuk memaksa melanjutkan loop (for, while, dowhile) Contoh untuk pernyataan while : Pada saat i=3 maka i dinaikan 1 dan kondisi while diuji lagi , akibatnya pernyataan : cout<<i<<endl; i++; tidak dijalankan saat i sama dengan 3 #include<iostream> using namespace std; void main(void) { int i=0; while(i<5) { if(i==3) { i++; continue; } cout<<i<<endl; i++; } } Hasilnya dilayar akan tercetak : 0 1 2 4 Contoh untuk pernyataan for : #include<iostream> Using namespace std; void main(void) { int i; for(i=0;i<=5;i++) { if(i==3) continue; cout<<i<<endl; } } Pada saat i=3 maka i dinaikan 1 dan loop for diulangi lagi , akibatnya pernyataan : cout<<i<<endl; i++; tidak dijalankan saat i sama dengan 3 Hasilnya dilayar akan tercetak : 0 1 2 4 58 5. Pernyataan break Pernyataan break dimaksudkan untuk memaksa keluar dari loop (for, while, do-while) Contoh : #include<iostream> using namespace std; void main(void) { int i; for(i=0;i<=5;i++) { if(i==3) break; cout<<i<<endl; } } Pada saat i=3 maka eksekusi langsung keluar dari loop , akibatnya pernyataan : cout<<i<<endl; i++; tidak dijalankan saat i sama dengan 3 Hasilnya dilayar akan tercetak : 0 1 2 Soal : 1. Susunlah algoritma dan program C++ untuk menginput sebuah bilangan bulat positif maksimum 255 yang menyatakan suatu bilangan desimal. Kemudian konversikan dan cetak kedalam bentuk biner. 2. Buat algoritma dan program C++ untuk menghitung dan mencetak 10 suku pertama deret bilangan berikut : 1,2,4,8,16,……. 3. Sebuah roket ditembakkan tegak lurus keatas. Pada kilometer pertama menghabiskan 10 kg bahan bakar. Pada kilometer ke-2 menghabiskan 8 kg bahan bakar (atau 80% dari kilometer sebelumnya). Demikian seterusnya. Susun algoritma dan program C++ untuk menghitung dan mencetak total bahan bakar yang dihabiskan setelah mencapai 100 km. 59 PERTEMUAN XII 60 LARIK (ARRAY) Array adalah suatu koleksi data yang bertipe sama atau sesuatu yang berbaris atau berderet-deret. Dalam bahasa pemrograman array adalah variable sejenis yang berderet-deret sedemikian rupa sehingga alamatnya saling bersambungan atau bersebelahan/berdampingan. Array 1 dimensi Array 2 dimensi Sifat array : Statik : jumlah elemen harus sudah diketahui sebelum program dieksekusi Jumlah elelmen tidak dapat diubah(dikurangi/ditambah) selama pelaksanaan program Seluruh elemen memiliki tipe yang sama 1. Deklarasi array Algoritma A[10] : integer A[4][7] : real Kode C++ int A[10]; float A[4][7]; 2. Alamat array #include<iostream> using namespace std; void main(void) { int a[7]; cout<<"Alamat a[0] = "<<&a[0]<<endl; cout<<"Alamat a[1] = "<<&a[1]<<endl; cout<<"Alamat a[2] = "<<&a[2]<<endl; } Hasilnya : Alamat a[0] = 0x0012FF64 Alamat a[1] = 0x0012FF68 Alamat a[2] = 0x0012FF6C Catatan : lebar data int = 4 byte 61 3. Mengisi array dengan konstanta #include<iostream> using namespace std; void main(void) { int i,a[4]; //Mengisi array for(i=0;i<=3;i++) a[i]=2+i; //Mencetak array for(i=0;i<=3;i++) cout<<a[i]<<endl; } #include<iostream> using namespace std; void main(void) { int i,a[4]={2,4,7,6}; //Mencetak array for(i=0;i<=3;i++) cout<<a[i]<<endl; } 4. Mengisi array melalui keyboard #include<iostream> using namespace std; void main(void) { int i=0, a[5]; while(i<5) //Baca data dari kb { cout<<"a["<<i<<"] = "; cin>>a[i]; i++; } //Cetak data cout<<endl<<"Isi array a adalah :"<<endl; for(i=0;i<5;i++) cout<<"a["<<i<<"] = "<<a[i]<<endl; } #include<iostream> using namespace std; void main(void) { int i,j,a[2][3]; //Baca data dari kb for(i=0;i<=1;i++) { for(j=0;j<=2;j++) { cout<<"a["<<i<<"]["<<j<<"] = "; cin>>a[i][j]; } } //Cetak data cout<<endl<<"Isi array a adalah :"<<endl; #include<iostream> using namespace std; void main(void) { int i,a[3]; //Mengisi array a[0]=a[1]=10; a[2]=20; //Mencetak array for(i=0;i<3;i++) cout<<a[i]<<endl; } 62 for(i=0;i<=1;i++) for(j=0;j<=2;j++) cout<<"a["<<i<<"]["<<j<<"] = "<<a[i][j]<<endl; } 5. Array karakter Array karakter biasa digunakan untuk menyimpan string. contoh : char nama[]=”Jennifer Lopez”; akan menyimpan array nama yang menyimpan string Jennifer Lopez Contoh mengisi array dengan string : #include<iostream> using namespace std; void main(void) { char nama[]="Mulyadi Oscar"; cout<<nama<<endl; cout<<nama[0]<<endl; cout<<nama[7]<<endl; } #include<iostream> #include<string.h> using namespace std; void main(void) { char nama[15]; strcpy(nama,"Jennifer Lopez"); cout<<nama<<endl; cout<<nama[0]<<endl; cout<<nama[7]<<endl; } Fungsi-fungsi yang berkaitan dengan string dalam C++ Fungsi Keterangan strcat() Menambahkan string ke akhir sebuah string strcmp() Membandingkan dua buah string strcmpi() Membandingkan dua buah string tanpa membedakan hurup kapital dan hurup kecil strcpy() Menyalin suatu string strstr() Mencari posisi suatu substring dalam suatu string strlen() Menghasilkan panjang string strupr() Mengkonversi semua hurup kecil dalam string menjadi hurup kapital strlwr() Mengkonversi semua hurup kapital dalam string menjadi hurup kecil #include<iostream> #include<string.h> using namespace std; void main(void) { Hasilnya : KOTA YOGYAKARTA kota yogyakarta 1 63 char kalimatA[35]; char kalimatB[35]; strcpy(kalimatA,"Kota Yogyakarta"); strcpy(kalimatB,kalimatA); //Ubah semua hurup kecil ke kapital strupr(kalimatA); cout<<kalimatA<<endl; //Ubah semua hurup kapital ke kecil strlwr(kalimatA); cout<<kalimatA<<endl; //Membandingkan dua string cout<<strcmp(kalimatA,kalimatB)<<endl; //Membandingkan dua string cout<<strcmpi(kalimatA,kalimatB)<<endl; //Menggabungkan string strcat(kalimatB," Never Ending Asia"); cout<<kalimatB<<endl; } Penjumlahan Matrik : #include<iostream> #include<iomanip.h> using namespace std; #define BARIS 3 #define KOLOM 4 void main(void) { int A[BARIS][KOLOM]={2,4,6,3, 4,2,5,6, 3,2,4,1}; int B[BARIS][KOLOM]={1,3,5,7, 2,2,4,6, 3,1,2,3}; int C[BARIS][KOLOM],i,j; //Jumlahkan matrik for(i=0;i<=BARIS-1;i++) for(j=0;j<=KOLOM-1;j++) C[i][j]=A[i][j]+B[i][j]; //cetak matrik A cout<<"Matrik A : "<<endl; for(i=0;i<=BARIS-1;i++) { for(j=0;j<=KOLOM-1;j++) cout<<setw(3)<<A[i][j]<<" "; cout<<endl; } //cetak matrik B cout<<"Matrik B : "<<endl; for(i=0;i<=BARIS-1;i++) { for(j=0;j<=KOLOM-1;j++) 0 Kota Yogyakarta Never Ending Asia 64 cout<<setw(3)<<B[i][j]<<" "; cout<<endl; } //Cetak matrik C cout<<"Matrik C : "<<endl; for(i=0;i<=BARIS-1;i++) { for(j=0;j<=KOLOM-1;j++) cout<<setw(3)<<C[i][j]<<" "; cout<<endl; } } Tugas I dikerjakan di rumah (dikumpulkan pada pertemuan ke-14) : 1. Buatlah program untuk menampilkan nilai rata-rata, nilai tertinggi, dan nilai terendah dari sekelompok bilangan bulat positip (integer) disimpan dalam array. Jumlah data tidak diketahui, dimasukan melalui keyboard. 2. Buatlah program untuk menampilkan IP seorang mahasiswa dengan rincian sbb : No 1 2 3 4 5 6 7 8 Bobot Nilai : A=4 B=3 C=2 D=1 Mata Kuliah Kalkulus Fisika Dasar PTI Sistim Digital PSO Logika Matematika Bahasa Inggris Agama Nilai SKS 4 3 2 2 2 2 2 2 65 PERTEMUAN XIII 66 POINTER Pointer : variable yang berisi alamat memori dari suatu variable yang berisi suatu nilai tertentu. pUsia merupakan variabel pointer (pointer) yang menunjuk ke variabel Usia. Isi dari pUsia (FFAB0000) merupakan alamat dari variabel Usia. Variabel usia berisi nilai 37. 1. Deklarasi variabel pointer Bentuk deklarasi variabel pointer : tipe_data* namaVariabel contoh : int* pNilai; Agar pointer menunjuk ke suatu variabel maka perlu diisi dengan alamat dari variabel yang bersangkutan. Contoh : int Usia; int * pUsia; pUsia = &Usia; tanda * menunjukkan bahwa variabel dideklarasikan sebagai pointer. pUsia menunjuk ke sebuah obyek(Usia) yang memiliki tipe integer. & : operator alamat, merupakan operator unary yang mengembalikan alamat dari operand. #include<iostream> using namespace std; void main(void) { int A=25,*pA; pA=&A; cout<<"A = "<<A<<endl; cout<<"pA = "<<pA<<endl; cout<<"&A = "<<&A<<endl; cout<<"&pA = "<<&pA<<endl; cout<<"*pA = "<<*pA<<endl; *pA=100; cout<<"*pA = "<<*pA<<endl; } Hasilnya : A = 25 pA = 0x0012FF7C &A = 0x0012FF7C &pA = 0x0012FF78 *pA = 25 *pA = 100 2. Pointer dan array 1D Pointer dapat digunakan untuk menunjuk ke array dan selanjutnya pointer dapat dipakai untuk mengakses elemen-elemen array. 67 Contoh : int *pTgl, tglLahir[]={24,6,65}; pTgl = &tglLahir; atau pTgl = tglLahir; atau pTgl = &pTgl[0]; pTgl = &tglLahir[2]; berarti pTgl menunjuk ke elemen tglLahir dengan subskript/indek 2 #include<iostream> using namespace std; void main(void) { int *pTgl, *pTgl2,tglLahir[]={24,6,65}; pTgl=tglLahir;pTgl2=&tglLahir[1]; //Menampilkan isi array dengan pointer for(int i=1;i<=3;i++) { cout<<*pTgl<<endl; pTgl++; } cout<<*pTgl2<<endl; cout<<*(pTgl2+1)<<endl; } (1) #include<iostream> using namespace std; void main(void) { int *P; int A[5]={2,1,7,0,5}; P=A; cout<<*P<<endl;P++; cout<<*P<<endl; } (3) #include<iostream> using namespace std; void main(void) { int *P; int A[5]={2,1,7,0,5}; P=A; cout<<*++P<<endl; cout<<*P<<endl; } Hasilnya : 24 6 65 6 65 (2) #include<iostream> using namespace std; void main(void) { int *P; int A[5]={2,1,7,0,5}; P=A; cout<<*P++<<endl; cout<<*P<<endl; } (4) #include<iostream> using namespace std; void main(void) { int *P; int A[5]={2,1,7,0,5}; P=A; cout<<++*P<<endl; cout<<*P<<endl; } 68 Penjelasan (1) : Pernyataan P=A menyebabkan pointer P menunjuk ke elemen A[0], sehingga pernyataan cout<<*P<<endl mencetak angka 2. Pernyataan P++ menyebabkan pointer P maju 1 langkah menunjuk ke elemen A[1]. Pernyataan cout<<*P<<endl mencetak isi elemen yang sedang ditunjuk oleh P, sehingga tercetak angka 1. Penjelasan (2) : Pernyataan cout<<*P++<<endl mencetak isi elemen yang sedang ditunjuk oleh P, sehingga tercetak angka 2, setelah itu pointer maju satu langkah menunjuk ke A[1] Pernyataan cout<<*P<<endl mencetak isi elemen yang sedang ditunjuk oleh P, sehingga tercetak angka 1. Penjelasan (3) : Pernyataan cout<<*++P<<endl menyebabkan pointer maju satu langkah ke A[1] kemudian mencetak isi array yg sedang ditunjukknya yaitu angka 1. Pernyataan cout<<*P<<endl mencetak isi elemen yang sedang ditunjuk oleh P, sehingga tercetak angka 1 Penjelasan (4) : Elemen yang sedang ditunjuk oleh P adalah A[0] yang isinya 2. Pernyataan cout<<++*P<<endl akan menambah isi elemen A[0] dengan 1 sehingga isinya menjadi 3, kemudian mencetak isi elemennya yaitu angka 3. Pernyataan cout<<*P<<endl mencetak isi elemen yang sedang ditunjuk oleh P, sehingga tercetak angka 3 Posisi awal pointer P : Tentukan posisi P dan isi elemen untuk contoh (2), (3), (4). 3. Pointer dan array 2D Dengan perintah char A[3][5] terbentuk array 2D sbb: 0 1 2 3 4 0 A B C D E 1 F G H I J 2 K L M N O Dalam memori komputer akan tersusun sbb : 0,0 0,1 A B 0,2 0,3 0,4 1,0 1,1 C D baris-0 E F G 1,2 1,3 1,4 H I J baris-1 0,0 artinya A[0][0] 2,0 2,1 K L 2,2 2,3 2,4 M N baris-2 O Pernyataan P=&A[0][0], menyebabkan pointer menunjuk ke array elemen pertama : 0,0 A P 0,1 B 0,2 C 0,3 D 0,4 E 1,0 F 1,1 G 1,2 H 1,3 I 1,4 J 2,0 K 2,1 L 2,2 M 2,3 N 2,4 O 69 Instruksi P=&A[0][0], dapat juga ditulis dalam bentuk P=A[0] Array 2D 3 x 5 dianggap sebagai kumpulan array 1D, A[0],A[1], dan A[2], masing-masing 5 elemen. Dengan pernyataan P=A[1] pointer P akan menunjuk ke baris kedua yaitu A[1][0] Pernyataan cout<<*P akan mencetak isi elemen yang ditunjuk oleh pointer P yaitu A[0][0]. #include<iostream> #include<iomanip.h> using namespace std; void main(void) { char A[3][5]= {'A','B','C','D','E', 'F','G','H','I','J', 'K','L','M','N','O'}; char *P; P=A[0]; for(int i=0;i<=14;i++) cout<<setw(2)<<*P++; cout<<endl; } Outputnya : ABCDEFGHIJKLMNO #include<iostream> #include<iomanip.h> using namespace std; void main(void) { char A[3][5]= {'A','B','C','D','E', 'F','G','H','I','J', 'K','L','M','N','O'}; char *P; for(int i=0;i<=2;i++) { P=A[i]; for(int j=0;j<=4;j++) cout<<setw(2)<<*P++; cout<<endl; } } Outputnya : ABCDE FGHIJ KLMNO 4. Pointer dan String #include<iostream> #include<iomanip.h> using namespace std; void main(void) { char kalimat[]={"Selamat Belajar Visual C++"}; char *pKarakter; int JumlahHurupKecil=0; int JumlahHurupBesar=0; pKarakter=kalimat; while(*pKarakter) { char kar=*pKarakter; if(kar>='a' && kar<='z') JumlahHurupKecil++; if(kar>='A' && kar<='Z') JumlahHurupBesar++; pKarakter++; } 70 cout<<"Jumlah Hurup Kecil = "<<JumlahHurupKecil<<endl; cout<<"Jumlah Hurup Kapital = "<<JumlahHurupBesar<<endl; } Outputnya : Jumlah Hurup Kecil = 17 Jumlah Hurup Kapital = 4 5. Array dari pointer Array dapat berisi pointer. Deklarasinya dapat dilakukan : char *Baju[4]={“Renang”,”Sekolah”,”Kerja”, ”Pesta”}; Baju[4] menunjukkan deklarasi sebuah array yang terdiri dari 4 elemen. Bagian char * menunjukkan bahwa tiap-tiap elemen dari array Baju berupa pointer terhadap char. #include<stdio.h> #define JML_MHS 10 //Banyaknya Mahasiswa #define JML_MK 5 //Jumlah mata Kuliah void main(void) { int i,k,*pNilaiMHS[JML_MHS],NILAI[JML_MHS][JML_MK]; FILE *pF; for(i=0;i<=JML_MHS-1;i++) { pNilaiMHS[i]=NILAI[i]; } if((pF=fopen("D:\\kampus\\program\\c++\\array3\\data.txt","r"))==NULL) { printf("File tidak dapat dibuka\n"); } else { for(i=0;i<JML_MHS;i++) for(k=0;k<JML_MK;k++) fscanf(pF,"%d",&NILAI[i][k]); } for(i=0;i<JML_MHS;i++) { for(k=0;k<JML_MK;k++) { printf("%d ",*pNilaiMHS[i]++); } printf("\n"); } fclose(pF); } 71 Data yang tersimpan dalam file data.txt : 00 10 20 30 40 01 11 21 31 41 02 12 22 32 42 03 13 23 33 43 04 14 24 34 44 05 15 25 35 45 06 16 26 36 46 07 17 27 37 47 08 18 28 38 48 09 19 29 39 49 Hasilnya : 00 10 20 30 40 01 11 21 31 41 02 12 22 32 42 03 13 23 33 43 04 14 24 34 44 05 15 25 35 45 06 16 26 36 46 07 17 27 37 47 08 18 28 38 48 09 19 29 39 49 6. Pointer menunjuk ke pointer Untuk membentuk hubungan seperti disamping diperlukan pendeklarasian : int *pB; int **pA; int nilaiX; pA adalah pointer yang menunjuk ke tipe pointer pB adalah pointer yang menunjuk ke tipe int nilaiX adalah variabel bertipe int Agar pointer pB menunjuk ke variabel nilaiX : pB=&nilaiX Agar pA menunjuk ke pointer pB : pa=&pB #include<iostream> Using namespace std; void main(void) { int *pB; int **pA; int nilaiX=100; pB=&nilaiX; pA=&pB; cout<<”Isi nilaiX via pB = “<<*pB<<endl; cout<<”Isi nilaiX via pA = “<<**pA<<endl; } Hasilnya : Isi nilaiX via pB = 100 Isi nilaiX via pA = 100 7. Pengalokasian memori secara dinamis Dengan menggunakan pointer dapat dilakukan pengalokasian memori secara dinamis, yaitu pointer menunjuk ke lokasi memori yang diciptakan ketika program sedang berjalan. Memori yang dialokasikan dapat dihapus kembali (dealokasi memori) kalau sudah diperlukan lagi. Lokasi memori tersebut dikenal dengan nama heap. Operator yang digunakan untuk alokasi memori : new Operator yang digunakan untuk dealokasi memori : delete 72 Contoh : int *pInt; pInt= new int; Setelah int *pInt dieksekusi Setelah pInt=new int dieksekusi #include<iostream> #include<iomanip.h> using namespace std; void main(void) { const int KOLOM=2; int(*pDuaDim)[KOLOM]; pDuaDim=new int[3][KOLOM]; pDuaDim[0][0]=10; pDuaDim[0][1]=20; pDuaDim[1][0]=30; pDuaDim[1][1]=40; pDuaDim[2][0]=50; pDuaDim[2][1]=60; for(int i=0;i<=2;i++){ for(int j=0;j<=KOLOM-1;j++) cout<<setw(3)<<pDuaDim[i][j]; cout<<endl; } delete []pDuaDim; } Hasilnya : 10 20 30 40 50 60 int(*pDuaDim)[KOLOM] digunakan untuk mendeklarasikan pointer yang menunjuk ke array berdimensi dua. pDuaDim=new int[3][KOLOM] digunakan untuk mengalokasikan array berdimensi dua, yang mengandung 3 buah baris dan 2 kolom. 8. Referensi Referensi merupakan jenis pointer khusus yang memungkinkan suatu pointer diperlakukan seperti variabel biasa. Referensi digunakan untuk memberikan nama alias suatu variabel : Contoh : int &ref=namaVariabel; #include<iostream> using namespace std; void main(void) { int nilaiX=100; Hasilnya: nilaiX=100 nilaiX=200 nilaiX=201 73 int &refX=nilaiX; cout<<"NilaiX = "<<refX<<endl; refX=200; cout<<"NilaiX = "<<refX<<endl; refX++; cout<<"NilaiX = "<<refX<<endl; } 74 PERTEMUAN XIV PEMBAHASAN TUGAS PERTEMUAN 12 75 PERTEMUAN XV 76 PROSEDUR dan FUNGSI Baik prosedur maupun fungsi merupakan suatu modul sub program yang mengerjakan tugas/aktivitas yang spesifik. Perbedaan diantara keduanya adalah sebuah fungsi akan mengembalikan suatu nilai tertentu ke modul/atau fungsi lain/prosedur lain yang memanggilnya. Tujuan utama dari prosedur atau fungsi adalah untuk membuat suatu aplikasi agar dapat dipecah menjadi sebuah bagian yang dapat dikelola dengan lebih mudah. Kerangka aplikasi yang tersusun atas sejumlah fungsi/prosedur 1. Pendefinisian prosedur - menuliskan nama prosedur - mendeklarasikan nama-nama konstanta, variable dan tipe - menjabarkan rangkaian aksi yang dilakukan Setiap prosedur mempunyai nama yang unik Prosedur terdiri dari: - bagian judul(header) , terdiri atas nama prosedur dan deklarasi parameter (jika ada) - bagian deklarasi, untuk mengumumkan nama-nama - bagian algoritma/deskripsi, disebut badan prosedur Parameter adalah nama-nama variabel yang dideklarasikan pada bagian header. Parameter : - aktual (argumen) : parameter yang disertakan pada saat pemanggilan prosedur - formal : parameter yang dideklarasikan pada bagian header prosedur 77 Contoh notasi algoritmik sebuah prosedur: Notasi algoritmik Kode bahasa C++ procedure Luas void Luas(void) { K. Awal : nilai panjang dan lebar diberikan} { { K. Akhir : luas segi empat tercetak} int panjang, lebar, HitungLuas; DEKLARASI cin>>panjang; panjang : integer cin>>lebar; lebar : integer HitungLuas = panjang*lebar; HitungLuas : integer cout<<HitungLuas; DESKRIPSI: } HitungLuas panjang * lebar write(HitungLuas) 2. Pemanggilan Prosedur Prosedur bukan program yang berdiri sendiri, jadi tidak dapat dieksekusi secara langsung. Prosedur diakses dengan cara memanggil namanya dari program pemanggil. Prosedur bisa memiliki parameter atau tidak. Jika tidak memiliki parameter cukup dengan menuliskan namanya. Ketika sebuah prosedur dipanggil, kendali program secara otomatis pindah ke prosedur tersebut. Seluruh instruksi dalam badan prosedur tersebut akan dilaksanakan. Setelah semua instruksi selesai dilaksanakan, kendali program berpindah secara otomatis kembali ke instruksi sesudah pemanggilan prosedur dalam program pemanggil. Agar nama prosedur dikenal oleh program pemanggil, maka dalam program pemanggil harus dideklarasikan prototipe prosedur tersebut. Contoh pemanggilan prosedur dari contoh sebelumnya: Notasi algoritmik ALGORITMA HitungLuas DEKLARASI procedure Luas DESKRIPSI: Luas procedure Luas DEKLARASI panjang : integer lebar : integer HitungLuas : integer DESKRIPSI: Read(panjang,lebar) HitungLuas panjang * lebar write(HitungLuas) Kode bahasa C++ #include <iostream> using namespace std; void Luas(); void main() { Luas(); } void Luas() { int panjang, lebar, HitungLuas; cin>>panjang; cin>>lebar; HitungLuas = panjang*lebar; cout<<HitungLuas; } 78 3. Lingkup variabel Lingkup variabel menjelaskan bagaimana sifat suatu variabel didalam suatu prosedur/fungsi. Variabel otomatis/lokal Variabel eksternal/global Variabel statis 3.1. Variabel otomatis/lokal Variabel otomatis bersifat lokal terhadap sebuah prosedur/fungsi. Variabel seperti ini tidak dikenal diluar prosedur/fungsi yang mendeklarasikannya. #include<iostream> using namespace std; void prosX(void);//prototipe prosedur void main(void) { int bilX=50; cout<<"Sebelum memanggil prosedur"<<endl; cout<<"bilX = "<<bilX<<endl; prosX(); cout<<"Setelah memanggil prosedur"<<endl; cout<<"bilX = "<<bilX<<endl; } Hasilnya : Sebelum memanggil prosedur bilX = 50 Dalam prosedur bilX = 100 Setelah memanggil prosedur bilX = 50 void prosX(void) { int bilX=100; cout<<"Dalam prosedur"<<endl; cout<<"bilX = "<<bilX<<endl; } 3.2. Variabel eksternal Didefinisikan diluar prosedur/fungsi, sehingga dikenal oleh seluruh prosedur/fungsi. #include<iostream> using namespace std; void ubahBilX(void);//prototipe prosedur int bilX; void main(void) { bilX=50; cout<<"Sebelum memanggil prosedur"<<endl; cout<<"bilX = "<<bilX<<endl; ubahBilX(); cout<<"Setelah memanggil prosedur"<<endl; cout<<"bilX = "<<bilX<<endl; } Hasilnya : Sebelum memanggil prosedur bilX = 50 Dalam prosedur bilX = 50 Setelah memanggil prosedur bilX = 100 79 void ubahBilX(void) { cout<<"Dalam prosedur"<<endl; cout<<"bilX = "<<bilX<<endl; bilX=100; } 3.3. Variabel Statis Sifat : Variabel hanya bisa diakses oleh prosedur/fungsi yang mendeklarasikannya Variabel tidak hilang saat eksekusi prosedur/fungsi berakhir Inisialisasi dalam deklarasi hanya dilakukan sekali selama aplikasi berjalan #include<iostream> using namespace std; void Pencacah(void);//prototipe prosedur void main(void) { Pencacah(); Pencacah(); Pencacah(); } Hasilnya : Prosedur telah dipanggil 1 kali Prosedur telah dipanggil 2 kali Prosedur telah dipanggil 3kali Coba kata static dihilangkan, bagaimana hasilnya? void Pencacah(void) { static int jumlah=1; cout<<"Prosedur telah dipanggil = "<<jumlah<<" kali"<<endl; jumlah++; } Latihan : Buatlah program untuk menghitung Luas, Keliling, Panjang Diagonal dari sebuah persegi panjang. Luas, Keliling, Panjang Diagonal masin-masing dikerjakan dalam sebuah prosedur. 80 PERTEMUAN XVI 81 4. Parameter/Argumen Kebanyakan program memerlukan pertukaran informasi antara prosedur dan pemanggilnya. Penggunaan parameter menawarkan mekanisme pertukaran tersebut. Prosedur dengan parameter diakses dengan cara memanggil prosedur tersebut beserta parameternya. Aturan yang harus diperhatikan dalam korespondensi satu-satu antara parameter formal dan parameter aktual adalah: - Jumlah parameter aktual pada pemanggilan prosedur harus sama dengan jumlah parameter formal pada deklarasi prosedurnya - Tiap parameter aktual harus bertipe sama dengan tipe parameter formal yang bersesuaian - Parameter aktual diekspresikan sesuai dengan jenis parameter formal(penjelasan lihat dibawah) Berdasarkan maksud penggunaannya, terdapat tiga jenis parameter formal: a. parameter masukan (input parameter) b. parameter keluaran (output parameter) c. parameter masukan/keluaran (input/output parameter) 4.1. Parameter masukan Parameter masukan : parameter yang nilainya berlaku sebagai masukan untuk prosedur. Sering disebut juga sebagai parameter nilai (value parameter atau parameter by value) Contoh: ALGORITMA HitungLuas #include<iostream> DEKLARASI using namespace std; a,b : integer void Luas(int a,int b);//prototipe prosedur procedure Luas(input panjang, lebar : void main(void) integer) { DESKRIPSI: int panjang=5,lebar=3; read(a,b) Luas(panjang,lebar); Luas(a,b) } procedure Luas(input p,l:integer) DEKLARASI luas : integer DESKRIPSI: luas p * l write(luas) void Luas(int p,int l) { int luas; luas=p*l; cout<<"Luas = "<<luas<<endl; } 82 Nilai parameter aktual diisikan kedalam parameter formal yang bersesuaian. Perubahan nilai dalam badan prosedur tidak mengubah nilai parameter aktual. Karena yang dipentingkan adalah nilainya, maka nama parameter aktual boleh berbeda dengan nama parameter formal yang bersesuaian. 4.2. Parameter Keluaran Parameter keluaran : parameter yang menampung keluaran yang dihasilkan oleh prosedur yang akan digunakan oleh program pemanggil. Contoh : ALGORITMA HitungLuas #include<iostream> DEKLARASI using namespace std; a,b,L : integer void hitung(int ,int, int * ); procedure Luas(input p,l : integer, void main(void) output luas : integer) { DESKRIPSI: int panjang,lebar,luas; read(a,b) cout<<"Panjang = ";cin>>panjang; Luas(a,b,L) cout<<"Lebar = ";cin>>lebar; write(L) hitung(panjang,lebar,&luas); cout<<"Luas = "<<luas<<endl; procedure Luas(input p,l : integer, output } luas : integer) DEKLARASI void hitung(int A, int B, int *luas) {tidak ada} { DESKRIPSI: *luas=A*B; } luas p * l Karena nama parameter merupakan suatu lokasi di memori maka bila didalam prosedur, parameter aktual diisi suatu nilai, nilai ini akan tetap berada didalam parameter aktual meskipun prosedur selesai dilaksanakan. Jadi setelah pemanggilan, parameter aktual berisi suatu nilai yang merupakan keluaran dari prosedur tersebut. 4.3. Parameter Masukan/Keluaran Parameter masukan/keluaran : parameter yang berfungsi sebagai masukan sekaligus keluaran bagi prosedur tersebut. Pada kebanyakan aplikasi kadang informasi harus dikirim dalam dua arah sehingga prosedur harus dapat mengakomodasi baik masukan dari dan keluaran ke blok program pemanggil. 83 Contoh: ALGORITMA SelisihXY DEKLARASI X,Y,Z : integer procedure Tukar(input/output integer) DESKRIPSI: read(X,Y) if X Y then Tukar(X,Y) endif ZX-Y write(Z) A,B procedure Tukar(input/output A,B : integer) DEKLARASI tmp : integer DESKRIPSI: tmp A AB B tmp #include<iostream> using namespace std; void Tukar(int *, int *); : void main(void) { int X,Y,Z; cout<<"X = ";cin>>X; cout<<"Y = ";cin>>Y; if(X<Y) Tukar(&X,&Y); Z=X-Y; cout<<Z<<endl; } void Tukar(int *A, int *B) { int tmp; tmp=*A; *A=*B; *B=tmp; } Akibat penggunaan parameter masukan/keluaran, bila parameter aktual diubah nilainya dalam badan prosedur maka sesudah pemanggilan prosedur, nilai parameter aktual di titik pemanggilan juga berubah. 5. Translasi notasi algoritmik Prosedur kedalam notasi bahasa C Aturan dalam translasi : Pendefinisian prosedur ditulis diluar blok program utama, kecuali jika direalisasikan sebagai file include. Prosedur umumnya diletakan setelah blok main(), sedangkan deklarasi prosedur ditulis sebelum blok main() sebagai prototipe. Jika pendefinisian prosedur ditulis sebelum blok main() maka pendeklarasian prototipe tidak diperlukan lagi. Dalam bahasa C tidak dikenal istilah prosedur. Semua modul program adalah fungsi. Prosedur adalah fungsi yang tidak mengembalikan nilai apapun. Karena itu nilai kembali untuk prosedur adalah void (artinya kosong). Bila prosedur tidak memiliki parameter maka tanda kurung “(“ dan “)” tetap ditulis setelah nama prosedur tersebut. 84 Semua parameter dalam bahasa C adalah parameter masukan. Oleh karena itu, semua argumen parameter aktual dilewatkan sebagai “by value” , artinya nilai parameter aktual disalin ke parameter formal yang bersesuaian. Suatu cara untuk memperoleh efek parameter keluaran maupun efek parameter masukan/keluaran adalah melewatkan pointer kedalam parameter aktual dengan menambahkan karakter “&” di awal nama parameter aktual yang berjenis parameter masukan atau masukan/keluaran. Sedangkan parameter formal yang berjenis masukan atau masukan/keluaran ditambahkan karakter “*” didepannya. 85 PERTEMUAN XVII 86 6. Fungsi Seperti halnya prosedur, fungsi juga merupakan sub-program yang mempunyai tujuan spesifik. Definisi Fungsi Fungsi adalah sub-program yang memberikan/ mengembalikan (return) sebuah nilai dari tipe tertentu. Contoh fungsi : f ( x) 2 x 2 5 x 10 H ( x, y ) 3x 2 y 5 Fungsi diakses dengan memanggil namanya Penulisan fungsi: function NamaFungsi(input parameter : tipe) tipe ………… DELARASI ………… ALGORITMA ………… return ekspresi Contoh: Notasi Algoritmik ALGORITMA F DEKLARASI x,y,Hasil : real DESKRIPSI read(x,y) HasilF(x,y) write(x,y,Hasil) function F(input x,y : real) real DEKLARASI H : real DESKRIPSI: H3*x + 2*y return H Kode bahasa C++ #include<iostream> using namespace std; float F(float x,float y); void main(void) { float x,y,Hasil; cout<<”x = “;cin>>x;cout<<”y = “;cin>>y; Hasil=F(x,y); cout<<x<<endl;cout<<y<<endl;cout<<Hasil<<endl; } float F(float A, float B) { float H; H=3*A+2*B; return H; } Fungsi dapat mengandung parameter formal. Parameter dalam fungsi selalu merupakan parameter masukan. 87 Tentukan output dari program berikut #include<iostream> using namespace std; void rubah(void); void main(void) { int A=10,B=20; cout<<"Nilai Awal A dan B"<<endl; cout<<"A = "<<A<<endl; cout<<"B = "<<B<<endl<<endl; rubah(); cout<<"Nilai A dan B setelah "; cout<<"pemanggilan fungsi"<<endl; cout<<"A = "<<A<<endl; cout<<"B = "<<B<<endl<<endl; } void rubah(void) { int A=100,B=200; cout<<"Nilai A dan B fungsi"<<endl; cout<<"A = "<<A<<endl; cout<<"B = "<<B<<endl<<endl; } #include<iostream> #include<iomanip.h> using namespace std; #define SIZE 10 void cetak(int *A) { for(int i=0;i<=SIZE-1;i++) cout<<setw(3)<<A[i]; } void jumlah(int *A,int *B) { int C[SIZE]; for(int i=0;i<=SIZE-1;i++) C[i]=A[i]+B[i]; cetak(C); } void main(void) { int A[SIZE]={2,4,6,3,4,2,5,6,3,2}; int B[SIZE]={1,3,5,7,2,2,4,6,3,1}; //cetak matrik A cetak(A);cout<<endl; #include<iostream> using namespace std; void tukar(int,int); void main(void) { int A,B; cout<<"A = ";cin>>A; cout<<"B = ";cin>>B;cout<<endl; cout<<"Sebelum ditukar"<<endl; cout<<"A = "<<A<<endl; cout<<"B = "<<B<<endl<<endl; tukar(A,B); cout<<"Setelah ditukar"<<endl; cout<<"A = "<<A<<endl; cout<<"B = "<<B<<endl; } void tukar(int A, int B) { dlm int C; C=B; B=A; A=C; } #include<iostream> #include<iomanip.h> using namespace std; #define SIZE 10 void cetak(int *A) //atau cetak(int A[]) { for(int i=0;i<=SIZE-1;i++) cout<<setw(3)<<A[i]; } void cetak_elemen(int el) { cout<<"Elemen = "<<el; } void kali_elemen(int //Elemen A[el]*a { A[el]*=a; } *A,int void rubah_array(int A[]) { for(int i=0;i<=SIZE-1;i++) el,int a) 88 //cetak matrik B cetak(B);cout<<endl; //Jumlahkan matrik jumlah(A,B);cout<<endl; A[i]=A[i]+2; } void main(void) { int A[SIZE]={2,4,6,3,4,2,5,6,3,2}; cetak(A);cout<<endl; cetak_elemen(A[2]);cout<<endl; kali_elemen(A,2,10);//Elemen A[2]*10 cetak(A);cout<<endl; rubah_array(A); cetak(A);cout<<endl; } } #include<iostream> using namespace std; #define N_Baris 5 #define N_Kolom 2 void cetak(int A[][N_Kolom]); void Rubah_data(int array[][N_Kolom]); void main(void) { int data[N_Baris][N_Kolom]= { {23,77}, {33,41}, {20,21}, {20,55}, {67,78} }; cetak(data); cout<<endl; Rubah_data(data); cetak(data); cout<<endl; } void Rubah_data(int array[][N_Kolom]) { int i,j; for(i=0;i<N_Baris;i++) { for(j=0;j<N_Kolom;j++) array[i][j]=0; } } void cetak(int A[][N_Kolom]) { int i,j; for(i=0;i<5;i++){ for(j=0;j<2;j++){ cout<<A[i][j]<<" "; } cout<<endl; } } 7. Fungsi Rekursif Algoritma rekursif adalah algoritma yang memanggil dirinya sendiri. Oleh karena itu, algoritma rekursif harus dinyatakan dalam prosedur atau fungsi karena hanya prosedur atau fungsi yang dapat dipanggil dalam sebuah program. Fungsi rekursif adalah fungsi yang memanggil dirinya sendiri. Proses pemanggilan fungsi itu sendiri disebut rekursi. Definisi rekursif disusun oleh dua bagian : 89 1) Basis : bagian yang berisi kasus yang terdefinisi secara eksplisit. Bagian ini menghentikan rekursif dan memberikan sebuah nilai yang terdefinisi pada fungsi rekursif. 2) Rekurens : bagian yang mendefinisikan obyek dalam terminologi dirinya sendiri Contoh : masalah faktorial. 0! = 1 1! = 1 2! = 1 x 2 3! = 1 x 2 x 3 4! = 1 x 2 x 3 x 4 atau dapat ditulis : 0! = 1 1! = 1 x 0! 2! = 2 x 1! 3! = 3 x 2! Untuk n>0 : n! = 1 X 2 x 3 x .. x (n-1) x n = n x (n-1)! Proses pemanggilan rekursif n! = 1 , jika n = 0 n! = n x (n-1)! , jika n > 0 {basis} {rekurens} function Fak(input n : integer) integer DEKLARASI DESKRIPSI if n = 0 then return 1 else return n * Fak(n-1) endif {basis} {rekuren} Nilai yg dikembalikan dari tiap-tiap pemanggilan rekursif Fungsi pustaka math.h Fingsi Penjelasan sqrt(x) Akar dua dari x x exp(x) Fungsi eksponensial e log(x) Logaritma natural dari x (basis e) log10(x) Logaritma dari x (basis 10) fabs(x) Nilai absolut dari x ceil(x) Membulatkan x ke integer terkecil tidak kurang dari x floor(x) Membulatkan x ke integer terbesar tidak Contoh sqrt(900.0) = 30.0 exp(1.0) = 2.718282 log(2.718282) = 1 log10(100.0) = 2.0 fabs(-5.0) = 5.0 ceil(9.2) = 10.0 ceil(-9.8) = -9.0 floor(9.2) = 9.0 90 lebih besar dari x pow(x,y) fmod(x,y) sin(x) cos(x) tan(x) x y Sisa pembagian dari x/y, floating point Sinus dari x ( x dalam radian) Cosinus dari x ( x dalam radian) Tangen dari x ( x dalam radian) floor(-9.8) = -10.0 pow(9,0.5) = 3.0 fmod(13.657,2.33) = 1.992 sin(0.0) = 0.0 cos(0.0) = 1.0 tan(0.0) = 0.0 Tugas : 1. Tulislah kode program C++ untuk menghitung faktorial 2. Tulislah program untuk menghitung nilai rata-rata dari sekumpulan data bilangan bulat yang dibaca berulang- ulang dari papan ketik (algoritma dan program C++). 3. Tulislah algoritma dan program C++ untuk menentukan nilai terbesar dan terkecil dari 3 integer 91 PERTEMUAN XVIII 92 PENCARIAN Pencarian (searching) merupakan proses yang fundamental dalam pengolahan data. Proses pencarian adalah menemukan nilai (data) tertentu didalam sekumpulan data yang bertipe sama. Data dapat disimpan secara temporer dalam memori utama atau disimpan secara permanen dalam memori sekunder. Dalam memori utama data disimpan dalam bentuk array(larik) sedangkan dalam memori sekunder dalam bentuk file(arsip). Pencarian elemen dalam larik disebut juga pencarian internal, sedangkan pencarian data yang disimpan dalam memori sekunder disebut juga pencarian eksternal. Persoalan Pencarian Diberikan sebuah larik L yang sudah terdefinisi elemen-elemennya, x adalah elemen yang bertipe sama dengan elemen larik L. Carilah x didalam larik L. Hasil dari proses pencarian dapat bermacam-macam : a) Pencarian hanya memeriksa keberadaan x. Keluaran yang diinginkan misalnya berupa pesan bahwa x ditemukan atau tidak ditemukan. contoh : write(x,’ditemukan’) atau write(x,’tidak ditemukan’) b) Hasil pencarian adalah indeks elemen larik. Jika x ditemukan maka indek elemen larik tempat x berada diisikan kedalam idx. Jika x tidak terdapat didalam larik L maka idx diisi dengan nilai khusus misalnya -1. contoh : D 35 15 60 70 25 10 12 0 1 2 3 4 5 6 Misalkan x=70, maka idx=3. Tetapi jika x=100, maka idx=-1 c) Hasil pencarian adalah sebuah nilai boolean yang menyatakan status hasil pencarian. Jika x ditemukan maka sebuah variabel bertipe boolean misalnya ketemu diisi dengan nilai true, jika sebaliknya maka ketemu diisi dengan false. I. Pencarian Beruntun (sequential search) Metode pencarian beruntun adalah proses membandingkan setiap elemen larik satu persatu secara beruntun, mulai dari elemen pertama sampai dengan elemen yang dicari ditemukan atau seluruh elemen sudah ditemukan. 93 I. a. Versi 1 (Pembandingan elemen dilakukan diawal pengulangan) (1). Hasil pencarian : sebuah variabel boolean bernilai true bila x ditemukan atau false bila x tidak ditemukan. Sudah ada array 1D yang dideklarasikan dengan int L[11] dan sudah ada isinya dengan ilustrasi sebagai berikut : n 0 1 2 3 4 5 6 7 8 9 10 12 17 10 5 15 25 11 7 25 16 19 Misal elemen yang akan dicari adalah x. Setiap elemen larik L dibandingkan dengan x mulai dari elemen pertama L[0]. Aksi pembandingan dilakukan selama indek larik i belum melebihi n dan L[i] belum sama dengan n. Aksi pembandingan dihentikan jika L[i] = x atau i = n. Elemen terakhir L[n] diperiksa secara khusus. procedure SeqSearch1(input L : LarikInt, input n : integer, input x : integer, output ketemu : boolean) DEKLARASI i : integer DESKRIPSI i0 while (i < n) and (L[i] x) do ii+1 endwhile if L[i] = x then ketemu true else ketemu false endif #include<iostream> using namespace std; void SeqSearch1(int Data[], int n, int x, bool *ketemu); void main(void) { int Data[]={23,56,10,90,35,45,9,100,200,65}; int x,i,jmlDat=10;bool ketemu; cout<<"Elemen Array : "; for(i=0;i<jmlDat;i++)cout<<Data[i]<<" ";cout<<endl; cout<<"Masukan data yang akan dicari ?:";cin>>x; SeqSearch1(Data,jmlDat,x,&ketemu); 94 if(ketemu!=false) cout<<"Data yang dicari ditemukan"<<endl; else cout<<"Data yang dicari tidak ada dalam array"<<endl; } void SeqSearch1(int Data[],int n,int x, bool *ketemu) { int i=0; while(i<n-1 && Data[i]!=x)i++; if(Data[i]==x)*ketemu=true; else *ketemu=false; } (2). Hasil Pencarian : indek elemen larik yang mengandung x Setiap elemen larik L dibandingkan dengan x mulai dari elemen pertama L[0]. Aksi pembandingan dilakukan selama indek larik i belum melebihi n dan L[i] belum sama dengan n. Aksi pembandingan dihentikan jika L[i] = x atau i = n. Elemen terakhir L[n] diperiksa secara khusus. Keluaran yang dihasilkan oleh prosedur adalah variabel idx yang berisi indek larik tempat x ditemukan. Jika x tidak ditemukan, idx diisi dengan -1. procedure SeqSearch2(input L : LarikInt, input n : integer, input x : integer, output idx : integer) DEKLARASI i : integer DESKRIPSI i0 while (i < n) and (L[i] x) do ii+1 endwhile if L[i] = x then idx i else idx -1 endif #include<iostream> using namespace std; void SeqSearch2(int Data[], int n, int x, int *idx); void main(void) { int Data[]={23,56,10,90,35,45,9,100,200,65}; int idx,x,i,jmlDat=10; cout<<"Elemen Array : "; 95 for(i=0;i<jmlDat;i++)cout<<Data[i]<<" ";cout<<endl; cout<<"Masukan data yang akan dicari ?:";cin>>x; SeqSearch1(Data,jmlDat,x,&idx); if(idx!=-1) cout<<"Data yang dicari berada pada indek "<<idx<<endl; else cout<<"Data yang dicari tidak ada dalam array"<<endl; } void SeqSearch1(int Data[],int n,int x, int *idx) { int i=0; while(i<n-1 && Data[i]!=x)i++; if(Data[i]==x)*idx=i; else *idx=-1; } I. b. Versi 2 (Pembandingan elemen dilakukan didalam pengulangan) (1). Hasil pencarian : sebuah variabel boolean bernilai true bila x ditemukan atau false bila x tidak ditemukan. procedure SeqSearch3(input L : LarikInt, input n : integer, input x : integer, output ketemu : boolean) DEKLARASI i : integer DESKRIPSI i0 ketemu false while (i <= n) and (not ketemu) do if L[i] = x then ketemu true else ii+1 endif endwhile #include<iostream> using namespace std; void SeqSearch3(int Data[], int n, int x, bool *ketemu); void main(void) { int Data[]={23,56,10,90,35,45,9,100,200,65}; int x,i,jmlDat=10;bool ketemu; cout<<"Elemen Array : "; for(i=0;i<jmlDat;i++)cout<<Data[i]<<" ";cout<<endl; cout<<"Masukan data yang akan dicari ?:";cin>>x; SeqSearch3(Data,jmlDat,x,&ketemu); if(ketemu==true) cout<<"Data yang dicari ditemukan"<<endl; 96 else cout<<"Data yang dicari tidak ada dalam array"<<endl; } void SeqSearch3(int Data[],int n,int x, bool *ketemu) { int i=0;*ketemu=false; while(i<n && !(*ketemu)) { if(Data[i]==x) *ketemu=true; else i++; } } Pada versi ini variabel boolean ketemu diinisialisasi dengan nilai false. Setiap elemen L dibandingkan dengan x mulai dari elemen pertama. Jika L[i] sama dengan x, variabel ketemu diisi nilai true dan pengulangan dihentikan. Jika L[i] tidak sama dengan x, pembandingan dilanjutkan untuk elemen berikutnya. Setiap elemen diperiksa termasuk elemen terakhir. (2). Hasil Pencarian : indek elemen larik yang mengandung x procedure SeqSearch4(input L : LarikInt, input n : integer, input x : integer, output idx : integer) DEKLARASI i : integer ketemu : boolean DESKRIPSI i0 ketemu false while (i <= n) and (not ketemu) do if L[i] = x then ketemu true else ii+1 endif endwhile if ketemu then idx i else idx -1 endif 97 #include<iostream> using namespace std; void SeqSearch4(int Data[], int n, int x, int *idx); void main(void) { int Data[]={23,56,10,90,35,45,9,100,200,65}; int idx,x,i,jmlDat=10; cout<<"Elemen Array : "; for(i=0;i<jmlDat;i++)cout<<Data[i]<<" ";cout<<endl; cout<<"Masukan data yang akan dicari ?:";cin>>x; SeqSearch4(Data,jmlDat,x,&idx); if(idx!=-1) cout<<"Data yang dicari berada pada indek "<<idx<<endl; else cout<<"Data yang dicari tidak ada dalam array"<<endl; } void SeqSearch4(int Data[],int n,int x, int *idx) { int i=0;bool ketemu=false; while(i<n && !ketemu) { if(Data[i]==x)ketemu=true; elsei++; } if(ketemu) *idx=i; else *idx=-1; II. Kinerja Metode Pencarian Beruntun Metode Pencarian Beruntun berjalan lambat. Waktu pencarian sebanding dengan jumlah elemen larik. Misal larik berukuran n elemen maka pada kasus dimana x tidak terdapat dalam larik atau x ditemukan pada elemen terakhir, maka harus dilakukan perbandingan sebanyak n kali. Jadi waktu pencarian dengan metode pencarian beruntun sebanding dengan n. III. Metode Pencarian Beruntun pada larik terurut Larik yang jumlah elemen-elemennya terurut dapat meningkatkan kinerja algoritma pencarian beruntun. 98 Contoh : (a). Diberikan larik L tidak terurut : 13 16 14 21 76 15 untuk mencari 15, dibutuhkan perbandingan sebanyak 6 kali. (b). Misalkan larik L diatas sudah diurut naik : 13 14 15 16 21 76 untuk mencari 15, dibutuhkan perbandingan hanya 3 kali Prosedur berikut adalah algoritma pencarian beruntun pada larik yang terurut menaik, yang merupakan modifikasi dari algoritma sebelumnya dengan merubah L[i] x menjadi L[i] x. procedure SeqSearch(input L : LarikInt, input n : integer, input n : integer, output idx : integer) DEKLARASI i : integer DESKRIPSI i0 while(i < n) and (L[i] < x) do ii+1 endwhile if L[i] = x then idx i else idx -1 endif #include<iostream> using namespace std; void SeqSearch(int Data[], int n, int x, int *idx); void main(void) { int Data[]={23,26,30,50,55,65,69,78,80,90}; int idx,x,i,jmlDat=10; cout<<"Elemen Array : "; for(i=0;i<jmlDat;i++)cout<<Data[i]<<" ";cout<<endl; cout<<"Masukan data yang akan dicari ?:";cin>>x; SeqSearch(Data,jmlDat,x,&idx); if(idx!=-1) cout<<"Data yang dicari berada pada indek "<<idx<<endl; else cout<<"Data yang dicari tidak ada dalam array"<<endl; } 99 void SeqSearch(int Data[],int n,int x, int *idx) { int i=0; while(i<n-1 && Data[i]<x)i++; if(Data[i]==x) *idx=i; else *idx=-1; } Soal : 1. Tulislah algoritma dan program C++ untuk pencarian sequensial versi 1. Pencarian dilakukan dalam sebuah fungsi yang mengembalikan indek array tempat data yang dicari berada. 2. Tulislah algoritma dan program C++ untuk pencarian sequensial versi 2. Pencarian dilakukan dalam sebuah fungsi yang mengembalikan indek array tempat data yang dicari berada. 3. Tulislah algoritma dan program C++ untuk pencarian sequensial dengan data yang sudah terurut menurun. 100 PERTEMUAN XIX 101 IV. Metode Pencarian Bagidua/Biner (Binary Search) Metode pencarian bagidua lebih efisien dibandingkan metode pencarian beruntun. Metode ini memerlukan data yang sudah terurut. Dalam proses pencarian diperlukan dua buah indeks array, yaitu indeks terkecil (indeks kiri) dan indeks terbesar (indeks kanan). Misalkan indeks kiri adalah i dan indeks kanan adalah j. Data sudah terurut menurun. Pada mulanya indek kiri i diinisialisasi dengan 1 dan dan j diinisialisasi dengan n. 81 76 21 18 16 13 10 7 i=0 1 2 3 4 5 6 7=j Langkah-langkah dalam metode ini adalah: Langkah 1: Bagi dua elemen larik pada elemen tengah. Elemen tengah adalah elemen dengan indeks k = (i + j) div 2 Langkah 2: Periksa apakah L[k] = x? Jika L[k] = x, pencarian selesai Jika L[k] < x, pencarian dilakukan pada larik bagian kiri, j = k-1 Jika L[k] > x, pencarian dilakukan pada larik bagian kanan, i = k + 1 Langkah 3 : Ulangi langkah 1 hingga x ditemukan atau i > j (yaitu ukuran array sudah 0) Contoh 1: misal elemen yang dicari x = 18 Langkah 1: i = 0, j = 7 k = (0 + 7) div 2=3 81 0 76 21 1 2 kiri 18 3 16 4 13 10 5 6 kanan 7 7 Langkah 2 : Bandingkan L[3] = x?, ya (x ditemukan, proses pencarian selesai) Contoh 2: Misal elemen yang dicari x = 16 Langkah 1: i = 0 dan j = 7 k = (0 + 7) div 2 = 3 Langkah 2: L[k] = x ?, tidak L[k] < x ?, tidak L[k] > x ?, ya, berarti pencarian dilakukan pada array kanan dengan indeks i = k +1 81 76 21 18 16 13 10 7 0 1 2 3 4 5 6 7 kiri kanan 16 13 10 7 i=4 5 6 7=j 102 Langkah 1’: i = 4, j = 7 k = (4 + 7) div 2 = 5 16 13 10 7 4 5 6 7 kiri kanan Langkah 1’’: i = 4, j = 4, k = (4 +4) div 2 = 4 16 4 procedure BinarySearch(input L : LarikInt, input n : integer, input x : integer, output idx : integer) DEKLARASI i,j,k : integer ketemu : boolean DESKRIPSI i0 jn ketemu false while (not ketemu) and (i n) do k (i + j) div 2 if (L[k] = x ) then ketemu true else if (L[k] x) then ik+1 else jk-1 endif endif endwhile if ketemu then idx k else idx -1 endif Langkah 2’ : L[k] = x ?, tidak L[k] < x ?, tidak L[k] > x ?, ya, maka pencarian dilakukan pada array bagian kiri j = k -1 = 5 -1 = 4 16 4 Langkah 2’’: L[k] = x ? , ya ( x ditemukan, pencarian dihentikan) Jadi nilai 16 berada pada index k, yaitu L[4] 103 #include<iostream> using namespace std; #define jmlDat 8 void BinSearch(int Data[], int n, int x, int *idx); void main(void) { int Data[jmlDat]={81,76,21,18,16,13,10,7},x,idx,i; cout<<"Elemen Array : "; for(i=0;i<jmlDat;i++)cout<<Data[i]<<" ";cout<<endl; cout<<"Masukan data yang akan dicari ?:";cin>>x; BinSearch(Data,jmlDat,x,&idx); if(idx!=-1)cout<<"Data yang dicari berada pada indeks : "<<idx<<endl; else cout<<"Data yang dicari tidak ada dalam array"<<endl; } void BinSearch(int Data[],int n,int x, int *idx) { bool ketemu = false; int top = n-1,bottom = 0,mid; while(bottom<=top && !ketemu) { mid=(top+bottom)/2; if(Data[mid]==x)ketemu=true; else if(Data[mid]<x)top=mid-1; else bottom=mid+1; } if(ketemu) *idx=mid; else *idx=-1; } Tugas : 1. Tulislah algoritma dan program C++ untuk pencarian metode bagidua dengan array terurut naik. 104 PERTEMUAN XX 105 PENGURUTAN Pengurutan : proses mengatur sekumpulan obyek meurut urutan atau susunan tertentu. Urutan menaik(ascending) : L[0] L[1] L[2] … L[n] Urutan menurun(descending) : L[0] L[1] L[2] … L[n] Contoh : Keuntungan dari data yang terurut: - mempercepat proses pencarian - langsung diperoleh nilai maksimum dan minimum a. data bertipe integer terurut naik: 23 30 40 45 60 b. data bertipe riil terurut menurun: 100,1 60,3 50,4 40,5 10,7 c. data bertipe string terurut naik: Amir Badu Cecep Dudi Rudi d. data bertpe karakter terurut naik: d e g l m e. data terstruktur terurut naik berdasarkan field NIM 135901, Eko, A 135902, Edo, A 135903, Dudi, B 135904, Amir, A Metode pengurutan diklasifikasikan menjadi dua: a. Internal : metode pengurutan untuk data yang disimpan di dalam memori komputer. Umumnya struktur internal yang dipakai untuk mengurutkan internal adalah larik, sehingga pengurutan internal disebut juga pengurutan larik. b. Eksternal : metode pengurutan untuk data yang disimpan didalam disk storage, disebut juga pengurutan arsip (file), karena struktur eksternal yang digunakan adalah arsip. I. METODE PENGURUTAN APUNG (BUBBLE SORT) Metode ini diinspirasi oleh gelembung sabun yang berada diatas permukaan air. Gelembung sabun selalu terapung ke atas permukaan air karena berat jenisnya lebih ringan daripada berat jenis air. Jika sebuah array dengan jumlah elemen (ukuran array) sebesar N maka proses pengapungan dilakukan sebanyak N-1 langkah (satu langkah disebut satu pass). Proses pengapungan dilakukan dengan cara perbandingan. Jumlah langkah = N - 1 Jumlah perbandingan = N(N - 1)/2 106 Algoritma Pengurutan Apung : L = 30 60 35 70 50 25 20 40 43 k = 0 1 .. .. .. .. .. .. n Untuk mendapatkan larik yang terurut menaik, algoritma pengurutan apung secara global sbb: Untuk setiap pass i=1, 2, …, n, lakukan : Mulai dari elemen k=n, n-1,…, i 1) Bandingkan L[k] dengan L[k-1] 2) Pertukarkan L[k] dengan L[k-1] jika L[k] L[k-1] Contoh : Tinjau L dengan N = 6 buah elemen belum terurut (n = 5) : L = 25 27 10 8 76 21 k= 0 1 2 3 4 5 Pass 1: k Elem. yg dibandingkan Pertukarkan? Hasil Sementara 5 Ya 25, 27, 10, 8, 21, 76 L[5] L[4] 4 Tidak 25, 27, 10, 8, 21, 76 L[4] L[3] 3 Ya 25, 27, 8, 10, 21, 76 L[3] L[2] 2 Ya 25, 8, 27, 10, 21, 76 L[2] L[1] 1 Ya 8, 25, 27, 10, 21, 76 L[1] L[0] Hasil akhir pass-1: 8 25 27 10 21 76 Pass 2 (berdasarkan hasil akhir pass 1) : k Elem. yg dibandingkan Pertukarkan? 5 Tidak L[5] L[4] 4 Tidak L[4] L[3] 3 Ya L[3] L[2] 2 Ya L[2] L[1] Hasil akhir pass-2: 8 10 25 27 21 76 Hasil Sementara 8, 25, 27, 10, 21, 76 8, 25, 27, 10, 21, 76 8, 25, 10, 27, 21, 76 8, 10, 25, 27, 21, 76 Pass 3 (berdasarkan hasil akhir pass-2) k Elem yg dibandingkan Pertukarkan? 5 Tidak L[5] L[4] 4 Ya L[4] L[3] 3 Ya L[3] L[2] Hasil Sementara 8, 10, 25, 27, 21, 76 8, 10, 25, 21, 27, 76 8, 10, 21, 25, 27, 76 Hasil akhir pass-3: 8 10 21 25 27 76 Pass 4 (berdasarkan hasil akhir pass-3) k Elem. yg dibandingkan Pertukarkan? Hasil Sementara 5 Tidak 8, 10, 21, 25, 27, 76 L[5] L[4] 4 Tidak 8, 10, 21, 25, 27, 76 L[4] L[3] Hasil akhir pass-4: 8 10 21 25 27 76 Pass 5 (berdasarkan hasil akhir pass-4) k Elem. yg dibandingkan Pertukarkan? Hasil Sementara 5 Tidak 8, 10, 21, 25, 27, 76 L[5] L[4] Hasil akhir pass-5: 8 10 21 25 27 76 Hasil akhir pass-5 menyisakan satu elemen (yaitu 76) yang tidak perlu diurutkan, maka pengurutan selesai. Algoritma pengurutan apung menaik: procedure BubbleSort(input/output L : LarikInt, input n : integer) {Keadaan Awal : Elemen larik L sudah terdefinisi nilai-nilainya} {Keadaan Akhir : Elemen larik L terurut menaik} DEKLARASI i : integer k : integer tmp : integer {pencacah untuk jumlah langkah} {pencacah untuk pengapungan pada setiap langkah} {variabel bantu untuk pertukaran} DESKRIPSI for i 1 to n do for k n downto i do if L(k) < L(k –1) then tmp L[k] L[k] L[k –1] L[k – 1] tmp endif endfor endfor 108 Metode pengurutan ini merupakan metode yang tidak efisien untuk data yang besar, disebabkan oleh banyaknya operasi pertukaran yang dilakukan pada setiap langkah pengapungan. Translasi algoritma pengurutan dengan metode bubble sort kedalam bahasa C sbb: /*Mengurutkan data dengan metode Bubble Sort*/ #include<iostream> using namespace std; void BubbleSort(int data[],int n); //prototipe fungsi void main(void) { int i; int n=9;//Jml Data = 10 maka n = 9 int data[]={20,10,32,100,60,12,70,25,45,65}; cout<<"Sebelum diurutkan :"<<endl; for(i=0;i<=n;i++) cout<<data[i]<<" "; cout<<endl; cout<<"_______________________________"<<endl; BubbleSort(data,n); /*Pemanggilan fungsi BubbleSort*/ cout<<"Setelah diurutkan"<<endl; for(i=0;i<=n;i++) cout<<data[i]<<" "; cout<<endl; } void BubbleSort(int array1[],int n) { int i,k,tmp; for(i=1;i<=n;i++) { for(k=n;k>=i;k--) { if(array1[k]<array1[k-1]) { tmp=array1[k]; array1[k]=array1[k-1]; array1[k-1]=tmp; } } } } Latihan : 1. Tulislah algoritma dan untuk pengurutan secara menurun 109 PERTEMUAN XXI 110 II. METODE PENGURUTAN SELEKSI (SELECTION SORT) Gagasan metode ini adalah memilih elemen maksimum/minimum dari array, lalu menempatkan elemen maksimum/minimum itu pada ujung (awal atau akhir) array. Selanjutnya elemen terujung tersebut diisolasi dan tidak disertakan pada proses selanjutnya. Proses yang sama diulang untuk elemen larik yang tersisa. Pemilihan nilai maksimum/ minimum dilakukan pada setiap pass. Ditinjau dari pemilihan elemen maksimum/minimum, algoritma pengurutan seleksi dibagi menjadi dua: 1. Algoritma pengurutan seleksi-maksimum, yaitu memilih elemen maksimum sebagai basis pengurutan 2. Algoritma pengurutan seleksi-minimum, yaitu memilih elemen minimum sebagai basis pengurutan Algoritma pengurutan seleksi-maksimum Untuk memperoleh array dengan jumlah elemen N yang terurut menaik, algoritma pengurutan seleksi-maksimum dapat ditulis secara garis besar sebagai berikut: Jumlah pass : n = N –1 Jumlah perbandingan : N(N + 1)/2 Untuk setiap pass i = 1, 2, …, n; lakukan: 1) Cari elemen terbesar (maks) mulai dari elemen pertama (ke-0) sampai elemen terakhir (ke-n) 2) Pertukarkan maks dengan elemen ke-n 3) Kurangi n dengan satu (karena elemen ke-n sudah terurut) procedure SelectionMax(input/output L : LarikInt, input n : integer) DEKLARASI i : integer {pencacah pass} j : integer {pencacah untuk mencari nilai maksimum} imaks : integer {indeks yg berisi nilai maksimum sementara} tmp : integer {variabel bantu untuk pertukaran} 111 DESKRIPSI: for i n downto 1 do imaks 0 for j 1 to i do if L[j] > L[imaks] then imaks j endif endfor tmp L [i] L[i] L[imaks] L[imaks] tmp endfor Contoh: Urutkan elemen larik berikut secara menaik: Elemen : 25 27 10 8 76 21 Index : 0 1 2 3 4 5 Pass 1 : Cari elemen maksimum didalam array L[0…5] hasilnya : maks = L[4] = 76. Pertukarkan maks dengan L[n], diperoleh: 25 27 10 8 21 76 Pass 2 (berdasarkan susunan larik hasil pass 1) : Cari elemen maksimum didalam array L[0…4] hasilnya : maks = L[1] = 27. Pertukarkan maks dengan L[4], diperoleh: 25 21 10 8 27 76 Pass 3(berdasarkan susunan larik hasil pass 2) : Cari elemen maksimum didalam array L[0…3] hasilnya : maks = L[0] = 25. Pertukarkan maks dengan L[3], diperoleh: 8 21 10 25 27 76 Pass 4 (berdasarkan susunan larik hasil pass 3) : Cari elemen maksimum didalam array L[0…2] hasilnya : maks = L[1] = 21. Pertukarkan maks dengan L[2], diperoleh: 8 10 21 25 27 76 Pass 5 (berdasarkan susunan larik hasil pass 4) : Cari elemen maksimum didalam array L[0…1] hasilnya : maks = L[1] = 10. Pertukarkan maks dengan L[1], diperoleh: 8 10 21 25 27 76 Tersisa satu elemen (yaitu 8), maka pengurutan selesai. Array sudah terurut naik. 112 Translasi algoritma pengurutan seleksi-maksimum kedalam bahasa C : /*Mengurutkan data dengan metode Seleksi Maksimum*/ #include<iostream> using namespace std; void SeleksiMaksimum(int data[],int n); /*prototipe fungsi*/ void main(void) { int i; int n=9;//Index terbesar int data[]={20,10,32,100,60,12,70,25,45,65}; cout<<"Sebelum diurutkan :"<<endl; for(i=0;i<=n;i++) cout<<data[i]<<" "; cout<<endl; cout<<"_______________________________"<<endl; SeleksiMaksimum(data,n); cout<<"Setelah diurutkan"<<endl; for(i=0;i<=n;i++) cout<<data[i]<<" "; cout<<endl; } void SeleksiMaksimum(int array1[],int n) { int i,j,tmp,imaks; for(i=n;i>=1;i--) { imaks=0; for(j=1;j<=i;j++) { if(array1[j]>array1[imaks]) imaks=j; } tmp=array1[imaks]; array1[imaks]=array1[i]; array1[i]=tmp; } } Algoritma pengurutan selesksi-minimum menaik : Basis pencarian adalah elemen minimum (terkecil). Elemen minimum ditempatkan di awal larik. Algoritma seleksi-minimum untuk memperoleh larik yang terurut menaik sbb : Untuk setiap pass i = 0, 1, 2, …, n-1, lakukan 1) Cari elemen terkecil (min) mulai dari elemen ke i sampai elemen ke n. 2) Pertukarkan min dengan elemen ke i. 113 procedure SelectionMin(input/output L : LarikInt, input n : integer) DEKLARASI i : integer {pencacah pass} j : integer {pencacah untuk mencari nilai minimum} imin : integer {indeks yg berisi nilai minimum sementara} tmp : integer {variabel bantu untuk pertukaran} DESKRIPSI: for i 0 to n-1 do imin 0 for j i+1 to n do if L[j] < L[imin] then imin j endif endfor tmp L [i] L[i] L[imin] L[imin] tmp endfor Contoh: Urutkan elemen larik berikut secara menaik: Elemen : 29 27 10 8 76 21 Index : 0 1 2 3 4 5 Pass 0 : Cari elemen terkecil didalam array L[0…5] hasilnya : min = L[3] = 8. Pertukarkan min dengan L[0], diperoleh: 8 27 10 29 76 21 Pass 1 (berdasarkan susunan larik hasil pass 0) : Cari elemen terkecil didalam array L[1…5] hasilnya : min = L[2] = 10. Pertukarkan min dengan L[1], diperoleh: 8 10 27 29 76 21 Pass 2 (berdasarkan susunan larik hasil pass 1) : Cari elemen terkecil didalam array L[2…5] hasilnya : min = L[5] = 21. Pertukarkan min dengan L[2], diperoleh: 8 10 21 29 76 27 Pass 3 (berdasarkan susunan larik hasil pass 2) : Cari elemen terkecil didalam array L[3…5] hasilnya : min = L[5] = 27. Pertukarkan min dengan L[3], diperoleh: 8 10 21 27 76 29 Pass 4 (berdasarkan susunan larik hasil pass 3) : Cari elemen terkecil didalam array L[4…5] hasilnya : min = L[5] = 29. Pertukarkan min dengan L[4], diperoleh: 8 10 21 27 29 76 Tersisa satu elemen (yaitu 76), maka pengurutan selesai. Array sudah terurut naik. 114 Translasi algoritma pengurutan seleksi-minimum kedalam bahasa C : /*Mengurutkan data dengan metode Seleksi Minimum*/ #include<iostream> using namespace std; void SeleksiMinimum(int data[],int n); /*prototipe fungsi*/ void main(void) { int i; int n=9;//Index terbesar int data[]={20,10,32,100,60,12,70,25,45,65}; cout<<"Sebelum diurutkan :"<<endl; for(i=0;i<=n;i++) cout<<data[i]<<" "; cout<<endl; cout<<"_______________________________"<<endl; SeleksiMinimum(data,n); cout<<"Setelah diurutkan"<<endl; for(i=0;i<=n;i++) cout<<data[i]<<" "; cout<<endl; } void SeleksiMinimum(int array1[],int n) { int i,j,tmp,imin; for(i=0;i<=n-1;i++) { imin=i; for(j=i+1;j<=n;j++) { if(array1[j]<array1[imin]) imin=j; } tmp=array1[imin]; array1[imin]=array1[i]; array1[i]=tmp; } } TUGAS 1. Tulislah algoritma untuk pengurutan secara menurun menggunakan metode selection sort(min dan max). 2. Buatlah programnya menggunakan C++ untuk array sbb: 10 40 20 60 15 4 8 100 200 25 115 PERTEMUAN XXII 116 PENGAKSESAN BERKAS (FILE) DALAM C Arsip/File/Berkas merupakan struktur penyimpanan data didalam memori sekunder seperti hard disk. Struktur arsip memungkinkan data disimpan secara permanen dan diakses kembali jika diperlukan. Setiap item data yang disimpan dalam arsip disebut rekaman (record). Pengorganisasian data dalam arsip ada 2 cara : 1. Beruntun (seqential) a. metode paling sederhana b. rekaman disimpan secara beruntun (rekaman yg satu setelah yg lain) c. data diakses mulai dari rekaman pertama sampai yang diinginkan d. pada umumnya lambat e. mudah dibuat dan dipelihara 2. Acak (random)/akses-langsung (direct access) a. rekaman diakses secara langsung tanpa perlu mulai dari yang pertama b. pengaksesan data individual lebih cepat c. lebih sulit dibuat dan dipelihara I. PENGAKSESAN ARSIP BERUNTUN Arsip beruntun adalah sekumpulan rekaman bertipe sama yang diakses secara beruntun mulai dari rekaman pertama sampai rekaman yang dituju atau sampai dengan rekaman terakhir. Struktur arsip beruntun tidak jauh berbeda dengan struktur larik. Setiap komponen larik disebut elemen sedangkan pada arsip disebut rekaman. Perbedaan arsip dengan larik hanya pada pilihan cara pengaksesan elemen dan arah pemrosesan. Rekaman dalam arsip beruntun tidak dapat diakses secara langsung karena harus dibaca dari awal rekaman, sementara dalam larik elemennya dapat diakses secara langsung melalui indeknya. Struktur arsip beruntun 117 Sebelum melakukan pemrosesan arsip, maka arsip tersebut harus dideklarasikan terlebih dahulu. Bentuk mum pendeklarasian arsip dalam bahasa C adalah sbb: FILE *arsip; Perintah-perintah baku yang dapat digunakan dalam pemrosesan arsip beruntun adalah : fopen : menyiapkan arsip untuk penulisan atau pembacaan fclose : menutup arsip fscanf : membaca rekaman dari arsip fprintf : menulis rekaman ke arsip Contoh 1 : Menulis ke dan membaca dari arsip berurutan #include<iostream> #include<stdio.h> using namespace std; FILE *fp; void main(void) { int i=0,k; //Menyimpan data ke file fp=fopen("d:\\kampus\\program\\c++\\FileIO1\\data1.dat","w"); if(fp==NULL)cout<<"Error membuka berkas"<<endl; else { for(i=0;i<=10;i++)fprintf(fp,"%d ",i); fclose(fp); } //Membaca data dari file fp=fopen("d:\\kampus\\program\\c++\\FileIO1\\data1.dat","r"); if(fp==NULL)cout<<"Error membuka berkas"<<endl; else { while(!feof(fp)) { fscanf(fp,"%d ",&k);cout<<k<<" "; } cout<<endl; fclose(fp); } } 118 Contoh 2 : Menulis ke dan membaca dari arsip berurutan #include<iostream> #include<stdio.h> using namespace std; FILE *fp; void main(void) { int i,j,jml_dat,k[100]; //Menyimpan data ke file fp=fopen("d:\\kampus\\program\\c++\\FileIO2\\data1.dat","w"); if(fp==NULL)cout<<"Error membuka berkas"<<endl; else { for(i=0;i<=10;i++)fprintf(fp,"%d ",i);fclose(fp); } //Membaca data dari file fp=fopen("d:\\kampus\\program\\c++\\FileIO2\\data1.dat","r"); if(fp==NULL)cout<<"Error membuka berkas"<<endl; else { i=0; while(!feof(fp)) { fscanf(fp,"%d ",&k[i]);i++; } jml_dat=i;fclose(fp); } for(j=0;j<jml_dat;j++)cout<<k[j]<<" ";cout<<endl; } II. PENGAKSESAN FILE SECARA RANDOM Panjang rekaman dalam file yang diakses secara random tetap dan dapat diakses secara langsung tanpa melalui pencarian melalui rekaman lain. Oleh karena itu file yang diakses secara random cocok digunakan dalam bidang reservasi pesawat terbang, sistem perbangkan, aplikasi lain yang memerlukan pengaksesan data secara cepat terhadap data tertentu. Karena panjang rekaman bersipat tetap maka lokasi dari suatu rekaman relatif terhadap awal berkas dapat dihitung sebagai fungsi dari kunci rekaman. Struktur penyimpanan secara random 119 Perintah-perintah baku yang dapat digunakan dalam pemrosesan arsip beruntun adalah : fopen : menyiapkan arsip untuk penulisan atau pembacaan fclose : menutup arsip fread : membaca rekaman dari arsip fwrite : menulis rekaman ke arsip fseek : menempatkan pointer pada posisi tertentu Contoh 1 : Menulis ke dan membaca dari arsip secara random //Penyimpanan & Pembacaan data secara random #include<iostream> #include<stdio.h> using namespace std; FILE *fp; void main(void) { int i,j,jml_dat; int k[100]; //Menulis data ke arsip fp=fopen("d:\\kampus\\program\\c++\\FileIO3\\data1.dat","w"); if(fp==NULL)cout<<"Error membuka file"<<endl; else { for(i=0;i<=10;i++)fwrite(&i,sizeof(i),1,fp); fclose(fp); } //Membaca seluruh data data dari arsip fp=fopen("d:\\kampus\\program\\c++\\FileIO3\\data1.dat","r"); if(fp==NULL)cout<<"Error membuka file"<<endl; else { i=0; while(!feof(fp)) { fread(&k[i],sizeof(int),1,fp); i++; } fclose(fp); } //Mencetak selauruh data ke layar jml_dat=i-1; cout<<"Jumlah data = "<<jml_dat<<endl; for(j=0;j<jml_dat;j++)cout<<k[j]<<" "; cout<<endl; fp=fopen("d:\\kampus\\program\\c++\\FileIO3\\data1.dat","r"); if(fp==NULL)cout<<"Error membuka file"<<endl; else { 120 //Baca data ke-0 fseek(fp,0*sizeof(j),SEEK_SET); fread(&j,sizeof(j),1,fp); cout<<"Data ke-0 = "<<j<<endl; //Baca data ke-1 fseek(fp,1*sizeof(j),SEEK_SET); fread(&j,sizeof(j),1,fp); cout<<"Data ke-1 = "<<j<<endl; //Baca data ke-5 fseek(fp,5*sizeof(j),SEEK_SET); fread(&j,sizeof(j),1,fp); cout<<"Data ke-5 = "<<j<<endl; //Baca data ke-0 rewind(fp); fread(&j,sizeof(j),1,fp); cout<<"Data ke-0 = "<<j<<endl; } } Contoh 2 : Menulis ke dan membaca dari arsip secara random //Penyimpanan & Pembacaan data secara random, data ditulis sekaligus #include<iostream> #include<stdio.h> using namespace std; FILE *fp; void main(void) { int i,j,jml_dat, k[100]; fp=fopen("d:\\kampus\\program\\c++\\FileIO4\\data1.dat","w"); if(fp==NULL)cout<<"Error membuka berkas"<<endl; else { for(i=0;i<=10;i++)k[i]=i; fwrite(k,sizeof(i),11,fp); fclose(fp); } fp=fopen("d:\\kampus\\program\\c++\\FileIO4\\data1.dat","r"); if(fp==NULL)cout<<"Error membuka berkas"<<endl; else { i=0; rewind(fp); while(!feof(fp)) { fread(&k[i],sizeof(int),1,fp);i++; } fclose(fp); } jml_dat=i-1; cout<<"Jumlah data = "<<jml_dat<<endl; for(j=0;j<jml_dat;j++)cout<<k[j]<<" "; 121 cout<<endl; } TUGAS (dikumpulkan saat UAS) Buatlah program C/C++ yang memberikan tampilan sbb : Ket : Pilihan 1 : Memasukan sejumlah data dari keyboard Pilihan 2 : Menyimpan seluruh data kedalam sebuah arsip Pilihan 3 : Membaca data dari arsip Pilihan 4 : Menampilkan data Pilihan 5 : Mengurutkan data Pilihan 6 : Menampilkan data yang telah diurut