AlgoritmaDanPemrograman

51
Algoritma dan Pemrograman Page 1 of 51 Bab 1 Dasar-dasar pemrograman C Bahasa C merupakan salah satu bahasa yang popular digunakan dalam pemrograman. Pertama kali bahasa C dikembangkan oleh Dennis Ritchie di Bell Laboratories. Awalnya bahasa C hanya dapat dijalankan dalam system operasi UNIX tetapi pada perkembangannya bahasa C sudah dapat digunakan dalam system operasi MS-DOS pada IBM. Bahasa C memiliki kemampuan yang sangat luas. Selain itu C memiliki kesederhanaan dalam ekspresinya dan kerampingan kodenya. Akan tetapi, C bukan merupakan bahasa yang terbaik karena bentuk bahasanya kurang jelas. Bagi pemula akan merasa sulit dalam menggunakan C tetapi nantinya bila terbiasa bahasa C merupakan bahasa yang menyenangkan untuk dipakai. Kesulitan yang diuraikan bersifat sementara saja. Penerjemah dalam bahasa pemrograman ada dua macam, yaitu interpreter dan compiler. Interpreter merupakan penerjemah yang menerjemahkan instruksi per baris setiap saat. Sementara compiler merupakan penerjemah yang menerjemahkan seluruh instruksi dalam program secara sekaligus dan kemudian menghasilkan executable file yang langsung bisa dijalankan. Bahasa C menggunakan compiler sebagai penerjemah. Aturan-aturan umum dalam bahasa C - Bersifat Case sensitive, yang berarti huruf besar dan huruf kecil diartikan berbeda. - Setiap statement diakhiri dengan tanda titik koma ( ; ) - Bagian program diawali dan diakhiri dengan tanda kurung kurawal (scope) - Dalam program C selalu terdapat fungsi main() sebagai program utama untuk menjalankan keseluruhan program Source Code Program C Executable File compile Source Code adalah koding yang kita buat. Executable File adalah source code yang sudah di-compile menjadi instruksi- instruksi yang langsung dapat dijalankan / dieksekusi.

Transcript of AlgoritmaDanPemrograman

Page 1: AlgoritmaDanPemrograman

Algoritma dan Pemrograman Page 1 of 51

Bab 1 Dasar-dasar pemrograman C

Bahasa C merupakan salah satu bahasa yang popular digunakan dalam pemrograman. Pertama kali bahasa C dikembangkan oleh Dennis Ritchie di Bell Laboratories. Awalnya bahasa C hanya dapat dijalankan dalam system operasi UNIX tetapi pada perkembangannya bahasa C sudah dapat digunakan dalam system operasi MS-DOS pada IBM. Bahasa C memiliki kemampuan yang sangat luas. Selain itu C memiliki kesederhanaan dalam ekspresinya dan kerampingan kodenya. Akan tetapi, C bukan merupakan bahasa yang terbaik karena bentuk bahasanya kurang jelas. Bagi pemula akan merasa sulit dalam menggunakan C tetapi nantinya bila terbiasa bahasa C merupakan bahasa yang menyenangkan untuk dipakai. Kesulitan yang diuraikan bersifat sementara saja. Penerjemah dalam bahasa pemrograman ada dua macam, yaitu interpreter dan compiler. Interpreter merupakan penerjemah yang menerjemahkan instruksi per baris setiap saat. Sementara compiler merupakan penerjemah yang menerjemahkan seluruh instruksi dalam program secara sekaligus dan kemudian menghasilkan executable file yang langsung bisa dijalankan. Bahasa C menggunakan compiler sebagai penerjemah. Aturan-aturan umum dalam bahasa C

- Bersifat Case sensitive, yang berarti huruf besar dan huruf kecil diartikan berbeda.

- Setiap statement diakhiri dengan tanda titik koma ( ; )

- Bagian program diawali dan diakhiri dengan tanda kurung kurawal (scope)

- Dalam program C selalu terdapat fungsi main() sebagai program utama untuk menjalankan keseluruhan program

Source Code

Program C

Executable File

compile

Source Code adalah koding yang kita buat.

Executable File adalah source code yang sudah di-compile menjadi instruksi- instruksi yang langsung dapat dijalankan / dieksekusi.

Page 2: AlgoritmaDanPemrograman

Algoritma dan Pemrograman Page 2 of 51

#include #include adalah pengarah preprosesor untuk membaca header-file. Dalam setiap file yang berekstension “.h“ ini, berisikan fungsi-fungsi tertentu yang kita gunakan dalam membuat program. Library : adalah file yang berisi kumpulan fungsi-fungsi yang dapat digunakan dalam membuat program, misalkan fungsi untuk mencetak teks pada layar, atau fungsi untuk membersihkan layar. Dua buah library yang biasa kita gunakan adalah : #include <conio.h> #include <stdio.h> Perhatikanlah contoh program di bawah ini :

Berikut ini kita akan membahas satu bagian per bagian Fungsi clrscr() digunakan untuk membersihkan layer ( clear screen ) Fungsi textbackground(BLUE) akan menge-set warna background dari layar menjadi biru sedangkan textcolor(WHITE) akan menge-set warna tulisan menjadi putih. Note: Untuk konstanta warna dapat dilihat di halaman lampiran Untuk mencetak tulisan dengan warna gunakan cprintf

clrscr();

textbackground(BLUE); textcolor(WHITE);

cprintf(“Hello Titans”);

getch();

#include <stdio.h> #include <conio.h> void main( ) clrscr(); textbackground(BLUE); textcolor(WHITE); cprintf (“Hello Titans“); getch( );

Page 3: AlgoritmaDanPemrograman

Algoritma dan Pemrograman Page 3 of 51

Digunakan untuk meminta user menekan satu tombol keyboard ( press any key ). Gotoxy untuk menentukan koordinat kursor pada layar Layar window standard dalam model 80x25 dibagi ke dalam koordinat – koordinat, dengan 2 sumbu utama, yaitu sumbu x dan y. Panjang maksimal sumbu x adalah 80 dan sumbu adalah 25. contoh : Program di atas akan memindahkan kursor pada posisi (2,5) kemudian mencetak tulisan Hallo, Apa kabar ? Fungsi getch digunakan untuk meminta input dari user berupa penekanan satu buah tombol ( press any key ), sehingga tidak langsung kembali ke layar coding dan hasil tampilan dapat dilihat. Komentar Komentar digunakan untuk memberi penjelasan pada program yang dibuat. Ada dua bentuk komentar yaitu “//” dan “/* … */”. // digunakan untuk komentar yang panjangnya satu baris sementara /* */ digunakan untuk komentar yang lebih dari satu baris.

#include <stdio.h> #include <conio.h> void main( ) gotoxy(2,5); //pindahkan kursor ke koordinat (2,5); printf (“ Hallo, Apa kabar ?“); // cetak string getch( );

X=80 X=1

Y=1

Y=25

X=5,Y=5

Page 4: AlgoritmaDanPemrograman

Algoritma dan Pemrograman Page 4 of 51

Jika C menemukan tanda // atau /* */ maka baris tersebut tidak akan dijalankan oleh compiler sebagai perintah / syntax dalam C. Ini sangat berguna untuk memberi keterangan atau penjelasan pada bagian coding. contoh : Tipe data Macam-macam Tipe Data dalam bahasa C

Type Length Range unsigned char 8 bits 0 to 255 char 8 bits -128 to 127 enum 16 bits -32,768 to 32,767 unsigned int 16 bits 0 to 65,535 short int 16 bits -32,768 to 32,767 int 16 bits -32,768 to 32,767 unsigned long 32 bits 0 to 4,294,967,295 long 32 bits -2,147,483,648 to 2,147,483,647 float 32 bits 3.4 x 10-38 to 3.4 x 1038 double 64 bits 1.7 x 10-308 to 1.7 x 10308 long double 80 bits 3.4 x 10-4932 to 1.1 x 104932

Variabel Variabel selalu mempunyai tipe data tertentu, dan variabel harus selalu dideklarasikan sebelum digunakan. Pendeklarasian variabel dilakukan untuk memesan tempat di memori untuk menyimpan nilai-nilai tertentu. Aturan penulisan variabel :

// satu baris komentar. /* baris satu baris dua semua yang ada di dalam tanda /* */ tidak akan dijalankan oleh C. */

Huruf pertama nama variabel hanya boleh _ (underscore) atau huruf Huruf selanjutnya dapat menggunakan angka, huruf atau _ Tidak boleh ada variabel dengan nama yang sama Tidak boleh ada spasi

Tipe data adalah menentukan tipe nilai yang dapat ditampung oleh suatu variabel.

Variabel adalah suatu tempat untuk menampung suatu nilai secara sementara di dalam memory untuk digunakan dalam program.

Page 5: AlgoritmaDanPemrograman

Algoritma dan Pemrograman Page 5 of 51

Contoh deklarasi variable yang salah

Contoh deklarasi variable yang benar Setiap variabel sebelum digunakan untuk menampung suatu nilai harus dideklarasikan terlebih dahulu. Operator Aritmatika

+ operator penjumlahan - operator pengurangan * operator perkalian / operator pembagian % modulus, operator sisa hasil pembagian

contoh:

Increment dan Decrement

Increment ( ++ ) digunakan untuk menambah nilai variabel dengan 1. Decrement ( -- ) digunakan untuk mengurangi nilai variabel dengan 1.

Bentuk a++ adalah sama dengan a=a+1 Bentuk a-- adalah sama dengan a=a-1

int x, y=10, z=5, a, b, c, d, e; x = 5+y; a = y-3; b = y*z; c = y / z; d = z%2; printf (“%d, %d, %d, %d, %d”, x, a, b, c, d);

int 8angka ; // diawali dengan angka float angka desimal; // menggunakan spasi

int angka8 ; float angka_desimal; long _567;

Apakah yang akan tercetak di layar ?

Page 6: AlgoritmaDanPemrograman

Algoritma dan Pemrograman Page 6 of 51

contoh: Pada bagian di bawah ini dimulai dengan deklarasi variabel, yaitu mendeklarasikan variable x yang langsung di-inisialisasi dengan nilai 10 dan variabel dengan nilai 5. Setelah baris perintah di atas maka nilai x adalah 11 dan y adalah 4 Post Increment and Pre Increment Bentuk Post Increment : a++ Bentuk Post Increment : ++a Jika statement tersebut berdiri sendiri maksudnya adalah sama yaitu menambahkan nilai a dengan 1. Tetapi akan berbeda jika digabungkan dengan operator lainnya. Perhatikan penjelasan di bawah ini. contoh : Post Increment Pada bagian ini yang akan dievaluasi sebagai berikut. Pre Increment akan dievaluasi sebagai berikut Disinilah dapat terlihat perbedaan antara post increment dan pre increment. Hal ini juga berlaku untuk decrement ( pengurangan ).

a = 5 + x++;

a = 5 + x; x++;

a = 5 + (++x);

x++; a = 5 + x;

int x = 10, y=5; x++; y--;

Page 7: AlgoritmaDanPemrograman

Algoritma dan Pemrograman Page 7 of 51

getch dan getche

Kedua fungsi tersebut berfungsi untuk meminta satu karakter sebagai input dari keyboard. Perbedaannya adalah getch () tidak menampilkan karakter yang diinput pada layar sementara getche () menampilkan karakater yang diinput pada layar. scanf Berfungsi untuk membaca input yang diberikan dari keyboard. contoh: Output Latihan

1. Buatlah program yang menerima dua buah input, kemudian tampilkan penjumlahan, pengurangan, perkalian, pembagian, dan modulus dari kedua angka tersebut.

2. Apa perbedaan antara dua statement(s) berikut

int a = 5; int b = a++ * 2; dengan int a = 5; int b = ++a * 2;

3. Lihatlah table Operator Precedence di bagian belakang buku ini. Berapakah nilai x dan y int x = 8; y = x+6*x+2; x = y/3;

4. Berapakah nilai dari n yang tercetak ? Mengapa ? int n = 40000; printf(“%d”,n);

int x; char y; printf (“Masukan bilangan: “); scanf (“%d”, &x); printf (“Bilangan yang anda masukan adalah: %d\n”, x); printf (“Masukan karakter: “); scanf(“%c”,&y); printf(“Karakter yang anda masukan adalah: %c\n”, y);

Masukan bilangan: 5 Bilangan yang anda masukan adalah: 5 Masukan karakter: a Karakter yang anda masukan adalah: a

Page 8: AlgoritmaDanPemrograman

Algoritma dan Pemrograman Page 8 of 51

Operator Relasi

== sama dengan != tidak sama dengan > lebih besar dari < lebih kecil dari

>= lebih besar sama dengan <= lebih kecil sama dengan

Operator Logika

&& AND || OR ! NOT

Bitwise Operator

& bitwise AND | bitwise OR ~ bitwise NOT

<< Menggeser bit biner ke kiri >> Menggeser bit biner ke kanan

Operator-operator akan kita pelajari lebih lanjut.

Page 9: AlgoritmaDanPemrograman

Algoritma dan Pemrograman Page 9 of 51

Bab 2 Control Flow

2.1 Selection if <kondisi> … disini program akan meminta input dan ditampung ke variable umur. Kemudian pada statement if akan dicek apakah umur >= 17 jika true maka akan dicetak “Anda sudah dewasa” jika tidak maka statement dalam if tidak dijalankan atau diabaikan. if <kondisi> … else … disini program akan meminta input dan ditampung ke variable umur. Kemudian pada statement if akan dicek apakah umur >= 17 jika true maka akan dicetak “Anda sudah dewasa” jika tidak maka statement else akan dijalankan dan mencetak “Anda belum dewasa” if <kondisi 1> … else if <kondisi 2> … else …

int umur; printf(“Masukkan umur anda : “); scanf(“%d”,&umur); if ( umur >= 17 ) printf (“Anda sudah dewasa”); else printf (“Anda belum dewasa”);

int umur; printf(“Masukkan umur anda : “); scanf(“%d”,&umur); if ( umur >= 17 ) printf (“Anda sudah dewasa”);

int umur; printf(“Masukkan umur anda : “); scanf(“%d”,&umur); if ( umur >= 17 ) printf (“Anda sudah dewasa”); else if ( umur >= 13 ) printf (“Anda remaja”); else printf (“Anda masih kecil”);

Page 10: AlgoritmaDanPemrograman

Algoritma dan Pemrograman Page 10 of 51

switch – case merupakan fungsi untuk memilih 1 statement dari sekian banyak pilihan statement yang ada. switch ( ekspresi) case ……: statement 1……; break; case…… : statement 2……; break; default : statement……; contoh: 2.2 Looping for for (inisialisasi; kondisi; perintah yang dilakukan) statement 1……; statement 2……;

#include <stdio.h> #include <conio.h> void main() int x; char tekan; clrscr(); printf("Silahkan pilih angka 1 atau 2\n\n"); tekan=getch(); switch (tekan) case '1': printf("Angka yang anda tekan adalah 1"); break; case '2': printf("Angka yang anda tekan adalah 2"); break; default: printf("Angka yang anda tekan selain angka 1 dan 2"); getch();

Page 11: AlgoritmaDanPemrograman

Algoritma dan Pemrograman Page 11 of 51

contoh: perulangan akan terjadi dengan nilai awal x adalah 1. Nilai x mengalami kenaikan (x++) dan perulangan akan berakhir apabila nilai x <=20. Setiap kali kenaikannya, nilai x akan dicetak ke layar.

do – while do statement 1……; statement 2……; while (kondisi); contoh:

Nilai x akan ditambah dan dicetak terus dari 1 ke layar hingga nilai x mencapai 10. while while (kondisi) statement 1……; statement 2……;

#include <stdio.h> #include <conio.h> void main() int x = 1; do printf("%d", x); x++; while (x<=10); getch();

#include <stdio.h> #include <conio.h> void main() int x; for (x=1; x<=10; x++) printf(“%d”, x); getch();

Page 12: AlgoritmaDanPemrograman

Algoritma dan Pemrograman Page 12 of 51

contoh:

#include <stdio.h> #include <conio.h> void main() int x; while(x<=10) x++; printf(“%d”, x); getch();

Bagaimana menvalidasi input ? misalkan kita ingin user hanya boleh input nilai dari 5 sampai 10

#include <stdio.h> #include <conio.h> void main() int n; clrscr(); do gotoxy(5,5); printf(“Masukkan nilai [5..10]: “); clreol(); scanf(“%d”,&n); while ( n < 5 || n > 10 ); getch();

Page 13: AlgoritmaDanPemrograman

Algoritma dan Pemrograman Page 13 of 51

Latihan

1. Buatlah program yang meminta input dari user berupa integer. Validasilah input, user hanya boleh memasukkan angka dari 1 sampai 10. Output dari program adalah sebagai berikut.

2. Modifikasilah program pada nomor 1 sehingga menghasilkan output sebagai berikut.

3. Modifikasilah program pada nomor 2 sehingga menghasilkan output sebagai berikut.

4. Modifikasilah program pada nomor 2 sehingga menghasilkan output sebagai berikut.

Masukkan n ? 5 ***** ***** ***** ***** *****

Masukkan n ? 4 ***** ***** ***** *****

Masukkan n ? 5 ***** **** *** ** *

Masukkan n ? 4 **** *** ** *

Masukkan n ? 5 *o*o* *o*o *o* *o *

Masukkan n ? 5 *o*o* o*o*o *o*o* o*o*o *o*o*

Page 14: AlgoritmaDanPemrograman

Algoritma dan Pemrograman Page 14 of 51

5. Buatlah program sehingga menghasilkan output sebagai berikut. Asumsikan input selalu ganjil.

6. Buatlah program sehingga menghasilkan output sebagai berikut.

7. Buatlah program sehingga menghasilkan output sebagai berikut.

Masukkan n ? 5 o***o *o*o* **o** *o*o* o***o

Masukkan n ? 9 * *** ***** ******* ********* *********** ************* *************** *****************

Masukkan n ? 11 1 121 12321 1234321 123454321 12345654321 1234567654321 123456787654321 12345678987654321 1234567890987654321 123456789010987654321

Page 15: AlgoritmaDanPemrograman

Algoritma dan Pemrograman Page 15 of 51

Bab 3 Pointer

Pointer adalah variabel yang berisi alamat variabel lainnya. Bahasa C meyediakan dua operator untuk operasi pointer, yaitu operator * dan operator &. Operator & berarti alamat memory, sedangkan operator * digunakan untuk mendapatkan nilai yang berada di alamat memory yang ditunjukkan oleh variabel pointer. contoh: Perhatikan program berikut ini. Apakah output dari program berikut ini ?

#include<stdio.h> #include<conio.h> void main() int a; int *p; clrscr(); a=10; p=&a; printf("nilai dari p adalah %x\n\n",p); *p=b+15; printf("nilai dari a setelah di *p=b+15 adalah %d\n",a); getch();

#include <stdio.h> #include <conio.h> void main() int a; int *p; p=&a; a=100; printf(“Nilai dari variabel a : %d”,a); printf(“Alamat dari a : %d”,&a); printf(“Alamat dari a : %d”,p); printf(“Alamat dari pointer p : %d”,&p); printf(“Nilai yang ditunjuk p ( a ) : %d”,*p); getch();

Page 16: AlgoritmaDanPemrograman

Algoritma dan Pemrograman Page 16 of 51

Bab 4 Fungsi

3.1 Pengenalan Fungsi Kita dapat memecah bagian-bagian program menjadi beberapa fungsi. Hal ini akan mempermudah pembagian kerja, fungsi yang telah dibuat dapat dipakai berulang-ulang, dan mempermudah maintenance pada saat memperbaiki bug. contoh : Fungsi cetak() dipanggil dari void main, maka semua isi dari fungsi cetak() akan dijalankan. Fungsi dapat dipanggil dengan menggunakan parameter seperti contoh di atas. Fungsi juga dapat mengembalikan suatu nilai.

#include<stdio.h> #include<conio.h> void cetak() printf(“TITANS”); void main() clrscr(); cetak(); // memanggil fungsi yang telah dibuat getch();

#include<stdio.h> #include<conio.h> void cetak(int n) for(i=0;i<n;i++) printf(“TITANS\n”); void main() clrscr(); cetak(5); // memanggil fungsi yang telah dibuat dengan parameter getch();

int isGenap ( int n ) return (n%2==0);

Page 17: AlgoritmaDanPemrograman

Algoritma dan Pemrograman Page 17 of 51

Fungsi isGenap menerima parameter berupa satu buah integer yang dievaluasi apakah bilangan tersebut genap. Jika ya maka fungsi itu mengembalikan nilai 1 jika tidak maka akan mengembalikan nilai 0. Fungsi isPrima menerima sebuah parameter berupa integer yang akan mengembalikan nilai apakah bilangan tersebut prima. Jika ya maka mengembalikan nilai 1 dan jika tidak maka akan mengembalikan nilai 0. Sebagai contoh yang lain adalah kita membuat fungsi luassegitiga. Pada program di atas jika alas = 3 dan tinggi = 5 maka luas yang akan ditampilkan adalah 7.500000. Jika ingin mencetak hanya 2 angka di belakang koma dapat menggunakan formatting pada printf sebagai berikut :

int isPrima(int n) int i; if ( n == 0 || n == 1 ) return 0; if ( n%2==0&&n!=2 ) return 0; if ( n%3==0&&n!=3 ) return 0; for(i=2;i<n;i++) if ( n % i == 0 ) return 0; return 1;

#include <stdio.h> #include <conio.h> float luassegitiga(float a,float t) return 0.5 * a * t; void main() float alas,tinggi,luas; clrscr(); printf(“masukkan alas : “); scanf(“%f”,&alas); printf(“masukkan tinggi : “); scanf(“%f”,&tinggi); luas = luassegitiga(alas,tinggi); printf(“\n\nLuas segitiga adalah : %f”, luas); getch();

printf(“\n\nLuas segitiga adalah : %.2f”, luas);

Page 18: AlgoritmaDanPemrograman

Algoritma dan Pemrograman Page 18 of 51

3.2 Fungsi Rekursif Rekursif adalah suatu fungsi yang memanggil dirinya sendiri kembali. contoh: Kita ingin membuat fungsi faktorial di mana dapat digunakan sebagai berikut Analisa 5 ! = 5 * 4 * 3 * 2 * 1 4 ! = 4 * 3 * 2 * 1 5 ! = 5 * 4 ! N ! = N * ( N–1 ) ! faktorial ( n ) = n * faktorial ( n – 1 ); Dengan demikian kita dapat membuat fungsi sebagai berikut Perhatikan fungsi dari berikut ini. Jika di void main fungsi dipanggil seperti di bawah ini, apakah output yang akan tercetak ?

#include<stdio.h> #include<conio.h> long n; void main() clrscr(); n=5; printf(“Faktorial dari 5 = %ld”,faktorial(n);

long faktorial ( long n ) if ( n == 0 ) return 1; return n * faktorial ( n – 1 );

void cetak ( int n ) if ( n == 0 ) return; cetak ( n – 1); printf(“%d”,n);

void main() clrscr(); cetak (5); getch();

Page 19: AlgoritmaDanPemrograman

Algoritma dan Pemrograman Page 19 of 51

Perhatikan gambar berikut. Passing parameter Passing parameter adalah suatu metode pengiriman nilai suatu variabel ke fungsi yang berbeda. Tipe passing parameter ada 2 macam, yaitu passing parameter by value dan passing parameter by reference. Passing parameter by value memiliki karakteristik sebagai berikut :

1. yang dikirimkan ke fungsi adalah nilai dari datanya, bukan alamat memory letak dari datanya.

2. fungsi yang menerima kiriman nilai ini akan menyimpannya di alamat yang

terpisah dari nilai aslinya yang digunakan oleh bagian program yang memanggil fungsi.

3. karena kedua alasan tersebut maka perubahan nilai difungsi tidak akan

mempengaruhi nilai asli di bagian program yang memanggil fungsi walaupun keduanya menggunakan nama variabel yang sama.

4. pengiriman parameter secara nilai adalah pengiriman searah, yaitu dari

bagian program yang memanggil fungsi ke fungsi yang dipanggil.

contoh:

cetak(5)

cetak(4) cetak(3) cetak(2) cetak(1) cetak(0)

printf(“5”) printf(“4”) printf(“3”) printf(“2”) printf(“1”)

#include<stdio.h> void cetak(int x) printf(“%d”,x);

void main() int x=5;

cetak(x);

Page 20: AlgoritmaDanPemrograman

Algoritma dan Pemrograman Page 20 of 51

Passing parameter by reference mempunyai karakteristik sebagai berikut:

1. yang dikirim ke fungsi adalah alamat letak dari nilai datanya, bukan nilai dari datanya.

2. fungsi yang menerima kiriman alamat ini akan menggunakan pointer yang menunjuk pada alamat yang sama untuk mendapatkan nilai datanya.

3. karena kedua alasan tersebut maka perubahan nilai di fungsi melalui pointer akan merubah nilai asli di bagian program yang memanggil fungsi.

4. pengiriman parameter secara reference adalah pengiriman dua arah, yaitu dari bagian program yang memanggil ke fungsi yang dipanggil dan sebaliknya.

contoh: Passing parameter by value Pada fungsi di atas dimaksudkan untuk menukar variable x dan variable y.

#include<stdio.h> #include<conio.h> void tukar(int a,int b) int c = a;

a = b;

b = c;

void main() int x=5,y=3;

tukar(x,y);

printf(“x = %d y = %d ”,x,y);

getch();

MEMORY

MAIN TUKAR

b Y X

c

a

Page 21: AlgoritmaDanPemrograman

Algoritma dan Pemrograman Page 21 of 51

Pada fungsi di atas nilai dari x akan dikirim ke a, dan nilai dari y akan dikirim ke b. Kemudian di dalam fungsi tukar nilai dari a dan b ditukar. Hal ini tidak mengakibatkan pertukaran nilai antara x dan y. Pada saat fungsi tukar selesai maka semua variable local dalam fungsi tukar dihilangkan. Passing parameter by reference Pada fungsi ini menggunakan dua buah pointer, yaitu pointer a yang menunjuk pada alamat dari x dan pointer b menunjuk pada alamat dari y. Kemudian di tukar isinya dengan bantuan variabel c. Jadi yang benar-benar ditukar nilainya adalah variable x dan variable y.

#include<stdio.h> #include<conio.h> void tukar(int *a,int *b) int c = *a;

*a = *b;

*b = c;

void main() int x=5,y=3;

tambah(&x,&y);

printf(“x = %d y = %d”,x,y);

getch();

MEMORY

MAIN TUKAR

Y X

c

b

a

Page 22: AlgoritmaDanPemrograman

Algoritma dan Pemrograman Page 22 of 51

Latihan

1. Buatlah fungsi pangkat(x,y) dengan menggunakan rekursif!

2. Buatlah fungsi menampilkan bilangan fibonacii dengan rekursif dan iteratif !

3. Algoritma manakah yang lebih efisien. Rekursif atau iteratif ? Mengapa ?

4. Buatlah fungsi untuk mencetak pada posisi x,y dengan string tertentu. Sehingga dapat digunakan di void main.

5. Buatlah fungsi untuk menghitung luas lingkaran. Menggunakan satu buah parameter bertipe float.

6. Buatlah fungsi untuk untuk menghitung pangkat. Menggunakan dua buah

parameter bertipe int yaitu x dan y. Di mana pangkat(x,y) = xy. Sehingga dapat digunakan dalam program di bawah ini :

8. Buatlah fungsi untuk menjumlahkan angka setiap digit dari suatu nilai integer, sehingga nilai jumlah(12345) = 15 ( nilai dari 5 + 4 + 3 + 2 + 1 ). Gunakan deklarasi fungsi berikut ini.

9. Buatlah fungsi untuk menentukan apakah bilangan tersebut palindrom. Bilangan palindrome adalah yang dibaca dari depan dan belakang adalah sama. contoh: palindrome(12321) = 1; palindrome(12345) = 0;

void main() clrscr(); cetak(5,5,”Hello TITANS”);

int jumlah(int n) int hasil; …. …. return hasil;

void main() int x,y; clrscr(); printf(“Input nilai x = “); scanf(“%d”,&x); printf(“Input nilai y = “); scanf(“%d”,&y); printf(“\nNilai x pangkat y adalah = %d”,pangkat(x,y)); getch();

Page 23: AlgoritmaDanPemrograman

Algoritma dan Pemrograman Page 23 of 51

Bab 5 Array dan Struct

5.1 Array Array adalah sekumpulan tempat penampung data sejenis (homogen), mengunakan satu identifier. contoh : Macam-macam deklarasi array Hubungan Pointer dan Array Misalkan kita mendeklarasikan sebagai berikut Di sini a dideklarasikan sebagai variabel integer sedangkan arr dideklarasikan sebagai array dari integer. Lalu kita mendeklarasikan variabel pointer yang bertipe ( int * ) yang berarti bahwa sebuah pointer yang akan menunjuk ke suatu nilai integer.

#include<stdio.h> #include<conio.h> void main() int arr[5]; int i; for(i=0;i<5;i++) printf(“Masukkan angka ke-%d : “,i+1); scanf(“%d”,&arr[i]); getch();

int a[5]; int a[5]=5,7,4,9,4; int a[]=9,8,4; int a[]; // ERROR – harus langsung diinisialisasi

int a; int arr[5];

int *p;

Page 24: AlgoritmaDanPemrograman

Algoritma dan Pemrograman Page 24 of 51

Jika kita ingin menunjuk variable a maka Jika kita ingin menunjuk arr (suatu array) maka tidak menggunakan tanda & Dengan statement di atas maka pointer p akan menunjuk pada elemen pertama dari arr (alamat dari arr[0] ). Hal ini boleh dituliskan sebagai berikut Untuk mencetak seluruh isi elemen dari array dapat melalui pointer maupun array. Passing Array ke Fungsi

p=&a;

p=arr;

p=&arr[0];

#include<stdio.h> #include<conio.h> int arr[5]=5,6,7,8,9; int *p=arr; void main() int i; clrscr(); for(i=0;i<5;i++) printf(“Cetak melalui array: %d ”,arr[i]); printf(“Cetak melalui pointer: %d\n”,*(p+i)); getch();

void cetakarray(int arr[],int n) int i; for(i=0;i<n;i++) printf(“%d “,arr[i]); void main() int arr[5]; int i; clrscr(); for(i=0;i<5;i++) printf(“Masukkan angka ke-%d : “,i+1); scanf(“%d”,&arr[i]); cetakarray(arr,5); getch();

Page 25: AlgoritmaDanPemrograman

Algoritma dan Pemrograman Page 25 of 51

Pada passing array ke fungsi pada header fungsi, parameter untuk array dari integer boleh dituliskan pula seperti di atas. ( lihat hubungan array dan pointer ) Latihan

1. Buatlah fungsi yang menerima parameter input berupa array dari integer, dan sebuh integer. Fungsi ini akan mengembalikan nilai berupa total semua angka di dalam array.

2. Buatlah fungsi yang menerima parameter input berupa array dari integer, dan

sebuh integer. Fungsi ini akan mengembalikan nilai maksimal dari semua angka di dalam array.

3. Buatlah fungsi yang menerima parameter input berupa array dari integer, dan

sebuh integer. Fungsi ini akan mengembalikan nilai minimal dari semua angka di dalam array.

4. Buatlah fungsi yang menerima parameter input berupa array dari integer, dan

sebuh integer. Fungsi ini akan mengembalikan nilai rata-rata dari semua angka di dalam array.

5. Apa yang salah dalam program di bawah ini. Jelaskan dan buat perbaikannya.

6. Apa yang salah dalam program di bawah ini. Jelaskan dan buat perbaikannya.

7. Apa yang salah dalam program di bawah ini. Jelaskan dan buat perbaikannya.

void cetakarray(int *arr,int n) int i; for(i=0;i<n;i++) printf(“%d “,arr[i]);

int arr[]; int *p; p = arr;

int arr[] = 1,2,3,4,5 ; int *p; p = &arr;

int arr[5]=0; int *p = arr, i; for(i=0;i<5;i++)

printf(“%d”,arr[i]); printf(“%d”,*p); *p++;

Page 26: AlgoritmaDanPemrograman

Algoritma dan Pemrograman Page 26 of 51

5.2 Struct Struct adalah merupakan tipe data yang dapat didefinisikan sendiri isinya di mana merupakan gabungan beberapa tempat penampung (variabel) data yang dapat berbeda tipe datanya. contoh : Kemudian kita dapat membuat suatu variable bertipe struct orang atau dapat ditulis juga seperti berikut ini Pada program ini kita dapat menggunakan variable var yang bertipe struct orang sebagai berikut

#include<stdio.h> #include<conio.h> struct orang char nama[31]; int berat; int tinggi; var; void main() strpcy(var.nama,”boboho”); var.tinggi = 120; var.berat = 200; printf(“Nama saya %s tinggi saya %d dan berat saya %d”, var.nama, var.tinggi, var.berat ); getch();

struct orang char nama[31]; //lebihkan satu untuk karakter null int berat; int tinggi; ;

struct orang var;

struct orang char nama[31]; //lebihkan satu untuk karakter null int berat; int tinggi; var;

Page 27: AlgoritmaDanPemrograman

Algoritma dan Pemrograman Page 27 of 51

Bab 6 String dan Fungsi String

String adalah array of character. Di akhir string selalu ditandai dengan simbol null ‘\0’ ( ASCII 0 ) contoh : Di sini waktu pendeklarasian suatu string kita melebihkan satu tempat untuk karakter null. Jika kita ingin menampung 20 karakter maka kita memesan sebanyak 21 tempat. Pada program di atas jika user menginput namanya “Henry William” maka yang akan masuk ke variable nama adalah “Henry”. Ini dikarenakan scanf tidak bisa membaca spasi, tab, dan enter. Sebagai gantinya kita gunakan gets Operasi-operasi string strlen

#include<stdio.h> #include<conio.h> void main() char nama[21]; clrscr(); printf(“Masukkan nama : “); scanf(“%s”,nama); getch();

char nama[21];

#include<stdio.h> #include<conio.h> void main() char nama[21]; clrscr(); printf(“Masukkan nama : “); gets(nama); getch();

#include <stdio.h> #include <conio.h> void main() char nama[21]; printf(“Masukkan nama : “); gets(nama); printf(“Panjang nama adalah : “, strlen(nama)); getch();

Page 28: AlgoritmaDanPemrograman

Algoritma dan Pemrograman Page 28 of 51

strcpy strcmp

#include<stdio.h> #include<conio.h> void main() char s1[21]=”ABCDE”; char s2[21]; strcpy(s2,s1); printf(“s2 = %s”,s2); getch();

#include<stdio.h> #include<conio.h> void main() char s1[21]=”ABCDE”; char s2[21]=”ABCDE”; if ( strcmp(s1,s2) == 0 ) printf(“s1 sama dengan s2”); else printf(“s1 tidak sama dengan s2”); getch();

Apa perbedaan antara strcmp dengan stricmp ?

Carilah fungsi-fungsi operasi string lainnya !

Page 29: AlgoritmaDanPemrograman

Algoritma dan Pemrograman Page 29 of 51

Latihan

1. Buatlah sebuah fungsi strdel yang memiliki 2 buah parameter, yaitu sebuah string s, dan sebuah karakter c, di mana fungsi tersebut mengembalikan nilai berupa string yaitu sebuah string s di mana semua karakter yang sama dengan c dihilangkan.

strdel(“abcde”,’c’) mengembalikan nilai “abde”

2. Buatlah sebuah fungsi strndel yang memiliki 3 buah parameter, yaitu sebuah string s, awal sebagai integer, panjang sebagai integer.

strndel(“abcde”,2,2) mengembalikan nilai “abe” s adalah string sumber, awal adalah index awal dari string, panjang adalah jumlah yang akan dihilangkan dihitung dari index awalnya.

3. Buatlah sebuah program yang akan menampilkan jumlah masing-masing huruf berdasarkan suatu kalimat. User pertama-tama menginput sebuah kalimat, misalkan “lotus”, kemudian pada layer akan ditampilkan jumlah masing-masing huruf dari kalimat tersebut yaitu, l=1, o=1, t=1, u=1, s=1.

4. Buatlah sebuah program yang meminta input sebuah kalimat, kemudian

tampilkanlah jumlah vocal dan konsonannya.

5. Buatlah sebuah program yang meminta input berupa kalimat, kemudian tampilkanlah jumlah huruf besar dan huruf kecilnya berapa

6. Buatlah sebuah program yang meminta input berupa kalimat yang kemudian

tampilkan jumlah kata dalam kalimat tersebut.

7. Buatlah sebuah program yang meminta input berupa kalimat yang kemudian ubahlah semua huruf besar menjadi huruf kecil dan huruf kecil menjadi huruf besar.

8. Buatlah sebuah program yang meminta input sebuah kalimat, misalkan

“jakartabarattimur” yang kemudian akan menghilangkan semua duplikat masing-masing huruf sehingga hasilnya menjadi “jakrtbimu”

9. Buatlah sebuah program yang meminta input sebuah kalimat, misalkan

“jakartabarattimur” yang akan mengelompokkan huruf-huruf kalimat tersebut sesuai urutannya sehingga menjadi “jaaaaakrrrtttbimu”

10. Buatlah program yang meminta input sebuah kalimat dan tampilkanlah

kalimat terbalik dibaca dari belakang.

Page 30: AlgoritmaDanPemrograman

Algoritma dan Pemrograman Page 30 of 51

Bab 7 Linked list

7.1 Pengenalan Linked List Linked list adalah sejumlah node (simpul) yang dihubungkan secara linier dengan bantuan pointer. Linked list erat kaitannya dengan struct. deklarasi linked list

Untuk menampung data lebih dari satu, kita dapat menggunakan array dalam program kita. Tapi array memesan memori secara statis, misalkan Maka arr akan memesan tempat untuk menampung 5 buah integer. Bagaimana jika suatu saat program membutuhkan tempat untuk menampung lebih dari 5 buah integer. Mungkin bisa saja kita memesan lebih seperti 100 buah elemen array, ataupun 1000 buah elemen array, namun hal itu jelas menggunakan memory resource yang berlebihan dan belum tentu semuanya dipergunakan. Untuk itu berkembang lah konsep linked list, di mana node-node yang ada saling berhubungan satu sama lain. Pointer head dirancang untuk selalu menunjuk ke node yang paling depan sedangkan pointer tail dirancang untuk selalu menunjuk ke node yang paling terakhir.

n

next

n

next

n

next

n

next

head tail

struct node int n; struct node *next; ; struct node *head=NULL, *tail,*curr;

int arr[5];

Kenapa kita menggunakan linked list ?

Page 31: AlgoritmaDanPemrograman

Algoritma dan Pemrograman Page 31 of 51

Untuk node yang ditunjuk tail ( node terakhir ) next nya adalah NULL. Pada pemrograman menggunakan linked list, programmer akan mengalokasikan memori secara eksplisit. Dan programmer harus meng-dealokasikan semua memori yang dipesannya. Jika tidak maka akan mengakibatkan “memory leak”. Untuk itu kita perlu membuat fungsi untuk meng-dealokasikan semua memory yang di pesan.

Pastikan anda membuat fungsi clear() ini dan ditempatkan di bagian akhir program. Fungsi ini akan meng-dealokasikan semua memory yang dialokasi sebelumnya dari head sampai tail. Fungsi untuk menambahkan node baru ke suatu linked list adalah cukup mudah. Fungsi dapat dilihat sebagai berikut.

Kita akan membahas bagian per bagian dari fungsi di atas.

void insert ( int n ) curr = (struct node *)malloc(sizeof(struct node)); curr->n = n; if ( head == NULL ) head =tail = curr; else tail->next = curr; tail = curr; tail ->next = NULL;

void clear(void) curr=head; while(curr!=NULL) head=head->next; free(curr); curr=head;

void main() //mulai program … … … clear(); // membebaskan semua memori ( dealokasi )

curr = (struct node *)malloc(sizeof(struct node)); curr->n = n;

Page 32: AlgoritmaDanPemrograman

Algoritma dan Pemrograman Page 32 of 51

malloc digunakan untuk mengalokasi memori sebesar ukuran struct node ( byte(s) ) dan akan ditunjuk oleh pointer curr. Kemudian nilai n akan di varibel n dari node yang ditunjuk oleh curr. Jika head == NULL pada saat head masih NULL atau belum ada data, maka head=tail=curr

Jika head tidak NULL maka curr akan ditempatkan di belakang tail ( insert dari belakang ). Berarti setiap penambahan data akan ditempatkan di paling akhir. Dan selalu ingat bahwa pada single linked list, tail->next selalu NULL, menyatakan bahwa setelah node yang ditunjuk tail tidak ada node lagi.

curr->n = n; identik dengan (*curr).n = n;

tidak boleh dituliskan *curr.n ( tanpa kurung ), dikarenakan presedensi dari . lebih tinggi daripada * maka seakan-akan dievaluasi sebagai *(curr.n). Hal ini akan menyebabkan error.

if ( head == NULL ) head =tail = curr; else tail->next = curr; tail = curr; tail ->next = NULL;

n

next

curr

head tail

Page 33: AlgoritmaDanPemrograman

Algoritma dan Pemrograman Page 33 of 51

contoh : Pada program di atas akan menginsert node baru secara berurutan dengan nilai 9,8,7 kemudian akan menge-set curr mulai dari head selama tidak NULL akan dicetak, setiap looping curr digeser ke next nya. Pada sebelum akhir dari program dipanggil fungsi clear untuk meng-dealokasikan semua memory yang sudak dialokasi sebelumnya dengan malloc. 7.2 Double Linked List Linked list yang baru saja dibahas adalah Single Linked List dari suatu node hany memiliki satu pointer penunjuk ( pointer next pada contoh di atas ). Sekarang kita akan lebih mendalami dan membahas bagaimana membuat Double Linked List. Perhatikan ada penambahan pada deklarasi, yaitu pointer prev

#include <stdio.h> #include <conio.h> void main() clrscr(); insert(9); insert(8); insert(7); curr=head; while(curr !=NULL ) printf(“%d “,curr->n); curr=curr->next; clear();

Modifikasilah fungsi insert di atas sehingga setiap kali dilakukan insert node baru, maka data-data dalam linked list harus selalu urut secara ascending

Modifikasilah fungsi insert di atas sehingga setiap kali dilakukan insert node baru, maka data-data dalam linked list harus selalu urut secara descending

struct node int n; struct node *next, *prev; ; struct node *head=NULL, *tail,*curr;

Page 34: AlgoritmaDanPemrograman

Algoritma dan Pemrograman Page 34 of 51

Untuk fungsi clearnya sama. Tetapi untuk insertnya ada beberapa tambahan Sehingga kita dapat mencetak data-data dari node-node pada linked list dari head ke tail maupun dari tail ke head. mencetak dari head ke tail mencetak dari tail ke head Jangan lupa untuk menambahkan fungsi clear() juga sebelum akhir program. 7.3 Circular Linked List Circular linked list dibagi lagi menjadi dua, yaitu Circular Single Linked List dan Circular Double Linked List. Konsep utama nya adalah

void insert ( int n ) curr = (struct node *)malloc(sizeof(struct node)); curr->n = n; if ( head == NULL ) head =tail = curr; else tail->next = curr; curr->prev = tail; // tambahkan baris berikut tail = curr; tail ->next = NULL; head->prev = NULL; //tambahkan baris berikut

curr = head; while ( curr != NULL ) printf(“%d “,curr->n); curr=curr->next;

curr = tail; while ( curr != NULL ) printf(“%d “,curr->n); curr=curr->prev;

tail ->next = head;

head->prev = tail;

Page 35: AlgoritmaDanPemrograman

Algoritma dan Pemrograman Page 35 of 51

Jadi pada program di atas hanya perlu memodifikasi sedikit. Berikut ini kita mencoba membuat fungsi insert untuk linked list di mana hasil linked listnya adalah berupa angka-angka yang terurut secara ascending.

void insert ( int n ) … … tail -> next = head; //ubah pada bagian akhir fungsi insert

void insert(int n) struct node *p; curr=(struct node *)malloc(sizeof(struct node)); curr->n=n; if (head==NULL) head=tail=curr; else if(n < head->n ) curr->next=head; head=curr; else if (n > tail->n) tail->next=curr; tail=curr; else for(p=head;p->next->n<n;p=p->next); curr->next=p->next; p->next=curr; tail->next=NULL;

Page 36: AlgoritmaDanPemrograman

Algoritma dan Pemrograman Page 36 of 51

Bab 8 File data

Nilai yang disimpan di memory computer akan hilang jika computer dimatikan/direstart, juga kapasitasnya lebih kecil dari pada kapasitas hard disk. Karena itu kita bisa menyimpannya dalam bentuk file. File data untuk file adalah FILE Sintaks: membuat variabel untuk buffer(penampung operasi file) Perintah – perintah untuk memanipulasi file: Kita menggunakan fungsi fopen untuk membuka file dan fclose untuk menutup file. FILE * fopen(const char *filename, const char*mode); melink variabel – variabel ke file asli, dan memindahkan pointer file ke awal file. Jika gagal akan mengembalikan nilai NULL. Mode adalah cara dalam mengakses file itu. Pilihan mode dalam C diantaranya: Mode Keterangan

“r” Open for reding only “w” Create for writing. If a file exist, it will be

overwritten. “a” Append; open for writing at end of file, or

create for writing if the file don’t exist. “r+” Open an existing file for update(reading

& writing) “w+” Create new file for update (reading &

writing). If a file by that name already exist, it will be overwritten.

“a+” Open for append; open for update at the end of the file, or create if the file does not exist.

Untuk menyatakan bahwa file ini dibuka dalam mode text, tambahkan ‘t’ pada mode. Sedangkan untuk mode biner, tambahkan ‘b’. Sebagai contoh kita akan membuat program sederhana untuk menerima input sebanyak 5 angka dan semua angka tersebut akan ditampung ke dalam array. Setelah itu kita akan menuliskan semua elemen dari array tersebut ke file.

FILE *filepointer;

Page 37: AlgoritmaDanPemrograman

Algoritma dan Pemrograman Page 37 of 51

contoh : Pada awal program, user akan diminta input 5 buah angka yang akan ditampung ke dalam array, kemudian kita membuka file “tes.txt” dengan mode “w” (write) dengan tujuan untuk menulis ke file. Jangan lupa untuk menggunakan fungsi fclose setelah file selesai ditulis. Buatlah program dibawah ini, savelah dengan nama file tes.c. Program di bawah ini akan membuka file tes.c dan akan membacanya satu per satu karakter dan akan langsung dicetak. Pada ssat funsgi fgetc mengembalikan EOF menyatakan bahwa file telah habis dibaca. ( EOF : End-Of-File )

#include<stdio.h> #include<conio.h> FILE *out; void main() int arr[10]; int i; clrscr(); printf(“Masukkan 5 angka\n“); for(i=0;i<5;i++) printf(“angka ke-%d: “,i+1); scanf(“%d”,&arr[i]); //selesai mengisi ke dalam array out = fopen(“tes.txt”,”w”); for(i=0;i<5;i++) fprintf(out,”%d\n”,arr[i]); printf(“\n\nFile berhasil dibuat”); fclose(out); getch();

#include<stdio.h> #include<conio.h> FILE *out; void main() int c; clrscr(); out=fopen(“TES.C”,”r”); while ( (c=fgetc(out))!=EOF ) printf(“%c”,c); fclose(f); getch();

Page 38: AlgoritmaDanPemrograman

Algoritma dan Pemrograman Page 38 of 51

Fungsi Keterangan fgetc Digunakan untuk mendapatkan satu karakter dari file stream fputc Digunakan untuk menuliskan satu karakter ke file stream fprintf Digunakan untuk menulis ke file. Penggunaan hampir sama dengan

printf fscanf Digunakan untuk membaca dari file. Penggunaan hampir sama

dengan scanf fgets Digunakan untuk mendapatkan suatu string dari file fputs Digunakan untuk menuliskan suatu string ke file fread Membaca data dari suatu stream fwrite Menulis data melalui suatu stream

contoh : Pada program di atas file dibuka dengan mode “a” ( append ). Di mana file dibuka untuk ditulis dan file yang sudah ada tidak dihapus. Berbeda dengan mode “w”, di mana file yang sudah ada di-replace. Jadi kita berniat untuk menambahkan data tiap kita menulis ke file, bukalah file dengan mode “a”.

#include<stdio.h> #include<conio.h> void main() FILE *f; char nama[51]; f = fopen(“string.txt”,”a”); printf(“Masukkan nama : “); gets(nama); fputs(nama,f); fclose(f);

Carilah contoh penggunaan fread dan fwrite

Page 39: AlgoritmaDanPemrograman

Algoritma dan Pemrograman Page 39 of 51

Bab 9 Sorting

Dalam bab ini kita akan membahas tentang sorting yaitu pengurutan data. Algoritma untuk sorting sangatlah beragam dengan kompleksitas yang berbeda-beda. Buatlah void tukar untuk menukarkan dua buah variable. bubble sort Untuk mengetahui apakah sudah terurut kita dapat menggunakan flag, misalkan urut. Jika urut bernilai 1 berarti sudah terurut dan langsung hentikan proses sorting.

void bubblesort(int *arr, int n) int i,j; for(i=0; i<n-1 ; i++) for(j=n-1; j>i ; j--) if ( arr[j] < arr[j-1] ) tukar(&arr[j],&arr[j-1]);

void bubbleflag(int *arr, int n) int i=1,j; int urut; for(i=0; i<n-1 ; i++) urut=1; for(j=n-1; j>i ; j--) if ( arr[j] < arr[j-1] ) tukar(&arr[j],&arr[j-1]); urut=0; if(urut) break;

void tukar(int *a, int *b) int c = *a; *a = *b; *b = c;

Page 40: AlgoritmaDanPemrograman

Algoritma dan Pemrograman Page 40 of 51

selection sort insertion sort Shell sort

void selection(int *arr, int n) int i,j; int temp; for(i=0;i<n-1;i++) temp=i; for(j=i+1;j<n;j++) if(arr[temp]>arr[j]) temp=j; if(temp!=i) tukar(&arr[temp],&arr[i]);

void insertionsort(int *arr, int n) int i,j,temp; for(i=1;i<n;i++) temp=arr[i]; for(j=i-1;(j>=0) && (temp < arr[j]);j--) arr[j+1]=arr[j]; arr[j]=temp;

void shellsort(int *arr, int n) int i,j,gap; int temp; for(gap=n/2;gap>0;gap=(gap==2) ? 1 : (int)(gap/2.2)) for(i=gap;i<n;i++)

temp = arr[i]; for(j=i; j>=gap && temp < arr[j-gap]; j-=gap ) arr[j]=arr[j-gap]; arr[j]=temp;

Page 41: AlgoritmaDanPemrograman

Algoritma dan Pemrograman Page 41 of 51

quick sort merge sort

void quicksort(int *arr, int kr, int kn) int i,j,k; if(kr<kn) j=kr; k=kn+1; do do j++; while(arr[j]<arr[kr]); do k--; while(arr[k]<arr[kr]); if(j<k) tukar(&arr[j],&arr[k]); while(j<=k); tukar(&arr[kr], &arr[kn]); quicksort(arr,kr,k-1); quicksort(arr,k+1,kn);

void mergesort ( int *arr, int *temp, int kr,int kn ) int tgh; if( kr < kn ) tgh=(kr+kn)/2; mergesort(arr,temp,kr,tgh); mergesort(arr,temp,tgh+1,kn); merge(arr,temp,kr,tgh+1,kn); void merge(int *arr, int *temp, int krawal, int knawal, int knakhir) int krakhir = knawal-1; int pjg = (knakhir-knawal)+1; int pos=krawal; int i; while(krawal<=krakhir && knawal<=knakhir ) if(arr[krawal]<arr[knawal]) temp[pos++]=arr[krawal++]; else temp[pos++]=arr[knawal++]; while(krawal<=krakhir) temp[pos++]=arr[krawal++]; while(knawal<=knakhir) temp[pos++]=arr[knawal++]; for(i=0;i<pjg;i++) arr[knakhir]=temp[knakhir]; knakhir--;

Page 42: AlgoritmaDanPemrograman

Algoritma dan Pemrograman Page 42 of 51

contoh :

#include <stdio.h> #include <conio.h> void cetak(int *arr,int n) int i; for(i=0;i<n;i++) printf(“%d “,arr[i]); void main() int arr[5]; int i; clrscr(); for(i=0;i<5;i++) printf(“Masukkan angka ke-%d : “,i+1); scanf(“%d”,&arr[i]); printf(“\nSebelum diurutkan : “); cetak(arr,5); selectionsort(arr,5); printf(“\nSesudah diurutkan : “); cetak(arr,5); getch();

Page 43: AlgoritmaDanPemrograman

Algoritma dan Pemrograman Page 43 of 51

Bab 10 Searching dan Hashing

9.1 Searching Searching adalah proses pencarian. Di sini computer banyak sekali dimanfaatkan untuk membantu proses pencarian karena kecepatan dan ketelitian yang tinggi di atas manusia. Konsepnya adalah misalkan kita ingin mencari suatu bilangan tertentu dari suatu array, maka kita harus memeriksa satu per satu array tersebut mulai dari indeks ke 0 hingga indeks terakhir. Perhatikan coding di bawah ini : Program di atas disebut dengan algoritma Linear Search. Kompleksitas untuk algoritma ini cukup tinggi. Bayangkan jika datanya ada 100000 maka jika kita ingin mencari suatu angka dari data-data tersebut, kemungkinan terburuk adalah kita mencarinya dari data ke-1 hingga data ke-100000 dan tidak menemukan angka yang ingin kita cari. Dapat disimpulkan makin banyak jumlah data ( populasi ) maka akan lebih lambat proses pencariannya. Orang kemudian mengembangkan algoritma yang lain. Salah satunya yang akan dibahas di sini adalah binary search di mana kompleksitasnya adalah log n. Tetapi kelemahannya data sudah harus terurut ( sorted ) terlebih dahulu.

#include <stdio.h> #include <conio.h> int arr[10]=5,8,23,45,67,1,90,87,45,22; int i,angka; void main() clrscr(); printf(“masukkan angka yang ingin dicari : “); scanf(“%d”,&angka); for(i=0;i<10;i++) if(arr[i]==angka) printf(“Ketemu di index : %d”,i); break;

if(i==10) printf(“tidak ketemu”);

getch();

Page 44: AlgoritmaDanPemrograman

Algoritma dan Pemrograman Page 44 of 51

#include <stdio.h> #include <conio.h> int arr[10]=1,5,7,8,10,15,19,27,45,62; int i,angka; int binarysearch(int *arr,int n,int key) int lo,hi,mid; lo = 0; hi = n-1; while(lo<=hi) mid = (lo+hi)/2; if(arr[mid]==key) return mid; else if(arr[mid]<key) lo=mid+1; else hi=mid-1; return -1; //not found code void main() clrscr(); printf(“masukkan angka yang ingin dicari : “); scanf(“%d”,&angka); i = binarysearch(arr,10,19); //mencari angka 19 dari 10 data if(i==-1)

printf(“tidak ketemu”); else printf(“ketemu di indeks : %d”,i); getch();

Page 45: AlgoritmaDanPemrograman

Algoritma dan Pemrograman Page 45 of 51

9.2 Hashing Hashing adalah suatu metode yang digunakan untuk mempercepat pencarian. Penyimpanan data pada metode hashing menggunakan suatu table yang sering disebut HashTable untuk menampung nilai-nilainya. Nilai-nilai yang ada ditempatkan dengan fungsi hash yang khusus. Misalkan kita mempunyai table berukuran 23 Indeks Data 0 1 2 3 4 5 5 6 7 8 8 9 10 11 34 12 13 14 60 15 16 17 18 19 20 21 22 78 Pada tabel di atas akan dimasukkan angka-angka. Penempatannya ditentukan oleh fungsi yang khusus. Misalkan fungsi hashnya adalah : Hash(key) = key % 23 Jadi jika kita ingin memasukkan angka-angka berikut ini : 5, 60, 78, 34, 8 Masing-masing penempatannya adalah sebagai berikut : 5 -> ditempatkan di indeks 5 ( karena 5 % 23 = 5 ) 60 -> ditempatkan di indeks 14 ( karena 60 % 23 = 14 ) 78 -> ditempatkan di indeks 22 ( karena 78 % 23 = 22 ) 34 -> ditempatkan di indeks 11 ( karena 34 % 23 = 11 ) 8 -> ditempatkan di indeks 8 ( karena 8 % 23 = 8 ) Semakin besar kapasitas tabel hashing semakin bagus.

Page 46: AlgoritmaDanPemrograman

Algoritma dan Pemrograman Page 46 of 51

Jika kita ingin mencari angka 78, jika dengan cara linear search maka perlu untuk melakukan pemeriksaan berulang-ulang. Dengan hashing untuk mendapatkan posisi angka 78 adalah dengan cara memasukkannya ke dalam fungsi hash. Hash(78) = 78 % 23 = 22 Langsung cek pada indeks 22 apakah terdapat angka 78 dan ternyata langsung ditemukan. Collision / Tabrakan Karena keterbatasan tabel hash mungkin saja ada dua angka yang jika dimasukkan ke dalam fungsi hash maka menghasilkan nilai yang sama. Hal ini disebut dengan collision. contoh : Kita ingin memasukkan angka 6 dan 29. Hash(6) = 6 % 23 = 6 Hash(29)= 29 % 23 = 6 Pertama-tama anggap tabel masih kosong. Pada saat angka 6 masuk akan ditempatkan pada posisi indeks 6, angka kedua 29 seharusnya ditempatkan di indeks 6 juga, namun karena indeks ke-6 sudah ditempati maka 29 tidak bisa ditempatkan di situ, di sinilah terjadi collision. Cara penanganannya bermacam-macam :

1. Linear Probing Pada saat terjadi collision, maka akan mencari posisi yang kosong di bawah tempat terjadinya collision, jika masih penuh terus ke bawah, hingga ketemu tempat yang kosong. Jika tidak ada tempat yang kosong berarti HashTable sudah penuh.

2. Quadratic Probing Penanganannya hampir sama dengan metode linear, hanya lompatannya tidak satu-satu, tetapi quadratic ( 12, 22, 32, 42, … )

3. Double Hashing

Pada saat terjadi collision, terdapat fungsi hash yang kedua untuk menentukan posisinya kembali.

Page 47: AlgoritmaDanPemrograman

Algoritma dan Pemrograman Page 47 of 51

LAMPIRAN A TABEL KODE TOMBOL Tombol Kode Enter 13 Escape 27 ‘a’ – ‘z’ 97-122 ‘A’ – ‘Z’ 65-90 ‘0’-‘9’ 48-57 Spasi 32 Tab 9 Backspace 8 F11 123 F12 122 Alt F11 117 Alt F12 116 Shift F11 121 Shift F12 120 Ctrl F11 119 Ctrl F12 118 F11 123 F12 122 Alt F11 117 Alt F12 116 Alt 0 127 Alt - 126 Alt = 125

Secondary key Tombol Kode Home 71 Panah atas 72 PgUp 73 Panah kiri 75 Panah kanan 77 End 79 Panah bawah 80 PgDn 81 Ins 82 Del 83 Tombol Kode Alt Q – ] 16..27 Alt A – ‘ 30..40 Alt Z - / 44..53 F1-F10 59-68 Alt F1-F10 104-113 Shift F1-F10 84-93 Ctrl F1-F10 94-103 Alt 1-9 120-128

Untuk mengecek suatu tombol adalah secondary key. Gunakan cara sebagai berikut.

#include<stdio.h> #include<conio.h> void main() char key; clrscr(); printf(“Tekan Esc untuk keluar. Tombol lain untuk melihat kode asciinya”); do key=getch(); if(key==0) key=-getch(); printf(“%d\n”,key); while(key!=27);

Page 48: AlgoritmaDanPemrograman

Algoritma dan Pemrograman Page 48 of 51

LAMPIRAN B Tabel konstanta warna Constant Value Background Foreground BLACK 0 Yes Yes BLUE 1 Yes Yes GREEN 2 Yes Yes CYAN 3 Yes Yes RED 4 Yes Yes MAGENTA 5 Yes Yes BROWN 6 Yes Yes LIGHTGRAY 7 Yes Yes DARKGRAY 8 No Yes LIGHTBLUE 9 No Yes LIGHTGREEN 10 No Yes LIGHTCYAN 11 No Yes LIGHTRED 12 No Yes LIGHTMAGENTA 13 No Yes YELLOW 14 No Yes WHITE 15 No Yes BLINK 128 No Yes Untuk mendapatkan efek BLINK tambahkan BLINK pada foreground color. Contoh: textcolor(LIGHTBLUE + BLINK);

Page 49: AlgoritmaDanPemrograman

Algoritma dan Pemrograman Page 49 of 51

LAMPIRAN C Tabel Kode ASCII Nomor Karakter Nomor Karakter 0 45 - 1 46 . 2 47 / 3 ♥ 48 0 4 ♦ 49 1 5 ♣ 50 2 6 ♠ 51 3 7 • 52 4 8 53 5 9 54 6 10 55 7 11 56 8 12 57 9 13 58 : 14 59 ; 15 60 < 16 61 = 17 62 > 18 63 ? 19 ‼ 64 @ 20 ¶ 65 A 21 § 66 B 22 67 C 23 68 D 24 ↑ 69 E 25 ↓ 70 F 26 → 71 G 27 ← 72 H 28 ∟ 73 I 29 ↔ 74 J 30 75 K 31 76 L 32 77 M 33 ! 78 N 34 “ 79 O 35 # 80 P 36 $ 81 Q 37 % 82 R 38 & 83 S 39 ‘ 84 T 40 ( 85 U 41 ) 86 V 42 * 87 W 43 + 88 X

Page 50: AlgoritmaDanPemrograman

Algoritma dan Pemrograman Page 50 of 51

44 , 89 Y 90 Z 141 ì 91 [ 142 Ä 92 \ 143 Å 93 ] 144 É 94 ^ 145 æ 95 _ 146 Æ 96 ` 147 ô 97 a 148 ö 98 b 149 ò 99 c 150 û 100 d 151 ù 101 e 152 ÿ 102 f 153 Ö 103 G 154 Ü 104 h 155 ¢ 105 i 156 £ 106 j 157 ¥ 107 k 158 ₧ 108 l 159 ƒ 109 m 160 á 110 n 161 í 111 o 162 ó 112 p 163 ú 113 q 164 ñ 114 r 165 Ñ 115 s 166 ª 116 t 167 º 117 u 168 ¿ 118 v 169 119 w 170 ¬ 120 x 171 ½ 121 y 172 ¼ 122 z 173 ¡ 123 174 « 124 | 175 » 125 176 126 ~ 177 127 178 128 Ç 179 129 Ü 180 130 É 181 131 Â 182 132 Ä 183 133 À 184 134 Å 185 135 ç 186 136 ê 187 137 ë 188 138 è 189

Page 51: AlgoritmaDanPemrograman

Algoritma dan Pemrograman Page 51 of 51

139 ï 190 140 î 191 192 224 α 193 225 ß 194 226 Γ 195 227 Π 196 228 Σ 197 229 σ 198 230 µ 199 231 τ 200 232 Φ 201 233 Θ 202 234 Ω 203 235 δ 204 236 ∞ 205 237 φ 206 238 ε 207 239 ∩ 208 240 ≡ 209 241 ± 210 242 ≥ 211 243 ≤ 212 244 ⌠ 213 245 ⌡ 214 246 ÷ 215 247 ≈ 216 248 ° 217 249 · 218 250 · 219 251 √ 220 252 ⁿ 221 253 ² 222 254 223 255