0% menganggap dokumen ini bermanfaat (0 suara)
411 tayangan

Algoritma Dan Pemrograman

Bahasa C merupakan salah satu bahasa pemrograman yang populer yang pertama kali dikembangkan oleh Dennis Ritchie. Bab ini menjelaskan dasar-dasar pemrograman C seperti compiler, variabel, tipe data, operator, input-output, dan komentar.

Diunggah oleh

Ojo Dumeh
Hak Cipta
© Attribution Non-Commercial (BY-NC)
Format Tersedia
Unduh sebagai PDF, TXT atau baca online di Scribd
0% menganggap dokumen ini bermanfaat (0 suara)
411 tayangan

Algoritma Dan Pemrograman

Bahasa C merupakan salah satu bahasa pemrograman yang populer yang pertama kali dikembangkan oleh Dennis Ritchie. Bab ini menjelaskan dasar-dasar pemrograman C seperti compiler, variabel, tipe data, operator, input-output, dan komentar.

Diunggah oleh

Ojo Dumeh
Hak Cipta
© Attribution Non-Commercial (BY-NC)
Format Tersedia
Unduh sebagai PDF, TXT atau baca online di Scribd
Anda di halaman 1/ 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.

Source compile Executable


Code File
Program C

Source Code adalah koding yang kita buat.

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

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

Algoritma dan Pemrograman Page 1 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 :

#include <stdio.h>
#include <conio.h>
void main( )
{
clrscr();

textbackground(BLUE);
textcolor(WHITE);

cprintf (“Hello Titans“);


getch( );
}

Berikut ini kita akan membahas satu bagian per bagian

clrscr();

Fungsi clrscr() digunakan untuk membersihkan layer ( clear screen )

textbackground(BLUE);
textcolor(WHITE);

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

cprintf(“Hello Titans”);

Untuk mencetak tulisan dengan warna gunakan cprintf

getch();

Algoritma dan Pemrograman Page 2 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.

X=1 X=80

Y=1

X=5,Y=5

Y=25

contoh :

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

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.

Algoritma dan Pemrograman Page 3 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 :

// satu baris komentar.


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

Tipe data

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

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.

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

Aturan penulisan variabel :

ƒ 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

Algoritma dan Pemrograman Page 4 of 51


Contoh deklarasi variable yang salah

int 8angka ; // diawali dengan angka


float angka desimal; // menggunakan spasi

Contoh deklarasi variable yang benar

int angka8 ;
float angka_desimal;
long _567;

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:

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

Apakah yang akan tercetak di layar ?

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

Algoritma dan Pemrograman Page 5 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.

int x = 10, y=5;


x++;
y--;

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

a = 5 + x++;

Pada bagian ini yang akan dievaluasi sebagai berikut.

a = 5 + x;
x++;

Pre Increment

a = 5 + (++x);

akan dievaluasi sebagai berikut

x++;
a = 5 + x;

Disinilah dapat terlihat perbedaan antara post increment dan pre increment. Hal ini
juga berlaku untuk decrement ( pengurangan ).

Algoritma dan Pemrograman Page 6 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:

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

Output

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

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

Algoritma dan Pemrograman Page 7 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.

Algoritma dan Pemrograman Page 8 of 51


Bab 2
Control Flow

2.1 Selection

if <kondisi> …

int umur;
printf(“Masukkan umur anda : “);
scanf(“%d”,&umur);

if ( umur >= 17 ){
printf (“Anda sudah dewasa”);
}

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 …

int umur;
printf(“Masukkan umur anda : “);
scanf(“%d”,&umur);

if ( umur >= 17 ){
printf (“Anda sudah dewasa”);
} else {
printf (“Anda belum dewasa”);
}

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 if ( umur >= 13 ) {
printf (“Anda remaja”);
} else {
printf (“Anda masih kecil”);
}

Algoritma dan Pemrograman Page 9 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:

#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();
}

2.2 Looping

for
for (inisialisasi; kondisi; perintah yang dilakukan)
{
statement 1……;
statement 2……;
}

Algoritma dan Pemrograman Page 10 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.

#include <stdio.h>
#include <conio.h>

void main()
{
int x;
for (x=1; x<=10; x++)
{
printf(“%d”, x);
}
getch();
}

do – while

do {
statement 1……;
statement 2……;
}while (kondisi);

contoh:

#include <stdio.h>
#include <conio.h>

void main()
{
int x = 1;
do {
printf("%d", x);
x++;
}while (x<=10);
getch();
}

Nilai x akan ditambah dan dicetak terus dari 1 ke layar hingga nilai x mencapai 10.

while

while (kondisi)
{
statement 1……;
statement 2……;
}

Algoritma dan Pemrograman Page 11 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();
}

Algoritma dan Pemrograman Page 12 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.

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

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

2. Modifikasilah program pada nomor 1 sehingga menghasilkan output sebagai


berikut.

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

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

3. Modifikasilah program pada nomor 2 sehingga menghasilkan output sebagai


berikut.

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

4. Modifikasilah program pada nomor 2 sehingga menghasilkan output sebagai


berikut.

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

Algoritma dan Pemrograman Page 13 of 51


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

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

6. Buatlah program sehingga menghasilkan output sebagai berikut.

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

7. Buatlah program sehingga menghasilkan output sebagai berikut.

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

Algoritma dan Pemrograman Page 14 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:

#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();
}

Perhatikan program berikut ini. Apakah output dari program berikut ini ?

#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();
}

Algoritma dan Pemrograman Page 15 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 :

#include<stdio.h>
#include<conio.h>

void cetak(){
printf(“TITANS”);
}

void main(){
clrscr();
cetak(); // memanggil fungsi yang telah dibuat
getch();
}

Fungsi cetak() dipanggil dari void main, maka semua isi dari fungsi cetak() akan
dijalankan.

#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();
}

Fungsi dapat dipanggil dengan menggunakan parameter seperti contoh di atas.

Fungsi juga dapat mengembalikan suatu nilai.

int isGenap ( int n ) {


return (n%2==0);
}

Algoritma dan Pemrograman Page 16 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.

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

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.

#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();
}

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 :

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

Algoritma dan Pemrograman Page 17 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

#include<stdio.h>
#include<conio.h>

long n;

void main()
{
clrscr();
n=5;
printf(“Faktorial dari 5 = %ld”,faktorial(n);
}

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

long faktorial ( long n ){


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

Perhatikan fungsi dari berikut ini.

void cetak ( int n ){


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

Jika di void main fungsi dipanggil seperti di bawah ini, apakah output yang akan
tercetak ?

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

Algoritma dan Pemrograman Page 18 of 51


cetak(5)

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

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

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:

#include<stdio.h>

void cetak(int x)
{
printf(“%d”,x);
}

void main()
{
int x=5;
cetak(x);
}

Algoritma dan Pemrograman Page 19 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


#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();
}

Pada fungsi di atas dimaksudkan untuk menukar variable x dan variable y.

MEMORY

MAIN TUKAR

a b
X Y

Algoritma dan Pemrograman Page 20 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

#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
a
MAIN TUKAR

X Y b

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.

Algoritma dan Pemrograman Page 21 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.

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

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 :

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

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.

int jumlah(int n){


int hasil;
….
….
return hasil;
}

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;

Algoritma dan Pemrograman Page 22 of 51


Bab 5
Array dan Struct

5.1 Array

Array adalah sekumpulan tempat penampung data sejenis (homogen), mengunakan


satu identifier.

contoh :

#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();
}

Macam-macam deklarasi array

int a[5];
int a[5]={5,7,4,9,4};
int a[]={9,8,4};

int a[]; // ERROR – harus langsung diinisialisasi

Hubungan Pointer dan Array

Misalkan kita mendeklarasikan sebagai berikut

int a;
int arr[5];

Di sini a dideklarasikan sebagai variabel integer sedangkan arr dideklarasikan


sebagai array dari integer.

int *p;

Lalu kita mendeklarasikan variabel pointer yang bertipe ( int * ) yang berarti bahwa
sebuah pointer yang akan menunjuk ke suatu nilai integer.

Algoritma dan Pemrograman Page 23 of 51


Jika kita ingin menunjuk variable a maka

p=&a;

Jika kita ingin menunjuk arr (suatu array) maka tidak menggunakan tanda &

p=arr;

Dengan statement di atas maka pointer p akan menunjuk pada elemen pertama dari
arr (alamat dari arr[0] ). Hal ini boleh dituliskan sebagai berikut

p=&arr[0];

Untuk mencetak seluruh isi elemen dari array dapat melalui pointer maupun array.

#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();
}

Passing Array ke Fungsi

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

Algoritma dan Pemrograman Page 24 of 51


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

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.

int arr[];
int *p;

p = arr;

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

int arr[] = {1,2,3,4,5} ;


int *p;

p = &arr;

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

int arr[5]={0};
int *p = arr, i;

for(i=0;i<5;i++){
printf(“%d”,arr[i]);
printf(“%d”,*p);
*p++;
}

Algoritma dan Pemrograman Page 25 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 :

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

Kemudian kita dapat membuat suatu variable bertipe struct orang

struct orang var;

atau dapat ditulis juga seperti berikut ini

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

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

Algoritma dan Pemrograman Page 26 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 :

#include<stdio.h>
#include<conio.h>

void main(){
char nama[21];
clrscr();
printf(“Masukkan nama : “); scanf(“%s”,nama);
getch();
}

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.

char nama[21];

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

#include<stdio.h>
#include<conio.h>

void main(){
char nama[21];
clrscr();
printf(“Masukkan nama : “); gets(nama);
getch();
}

Operasi-operasi string

strlen
#include <stdio.h>
#include <conio.h>

void main(){
char nama[21];
printf(“Masukkan nama : “);
gets(nama);
printf(“Panjang nama adalah : “, strlen(nama));
getch();
}

Algoritma dan Pemrograman Page 27 of 51


strcpy

#include<stdio.h>
#include<conio.h>

void main(){
char s1[21]=”ABCDE”;
char s2[21];

strcpy(s2,s1);
printf(“s2 = %s”,s2);
getch();
}

strcmp

#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 !

Algoritma dan Pemrograman Page 28 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.

Algoritma dan Pemrograman Page 29 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

struct node {
int n;
struct node *next;
};

struct node *head=NULL, *tail,*curr;

n n n n

next next next next

head tail

Kenapa kita menggunakan linked list ?

Untuk menampung data lebih dari satu, kita dapat menggunakan array dalam
program kita. Tapi array memesan memori secara statis, misalkan

int arr[5];

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.

Algoritma dan Pemrograman Page 30 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.

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

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.

void main(){
//mulai program



clear(); // membebaskan semua memori ( dealokasi )
}

Fungsi untuk menambahkan node baru ke suatu linked list adalah cukup mudah.
Fungsi dapat dilihat sebagai berikut.

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

Kita akan membahas bagian per bagian dari fungsi di atas.

curr = (struct node *)malloc(sizeof(struct node));


curr->n = n;

Algoritma dan Pemrograman Page 31 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.

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

Jika head == NULL pada saat head masih NULL atau belum ada data, maka
head=tail=curr

head tail

next

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.

Algoritma dan Pemrograman Page 32 of 51


contoh :

#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();
}

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.

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

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.

struct node {
int n;
struct node *next, *prev;
};

struct node *head=NULL, *tail,*curr;

Perhatikan ada penambahan pada deklarasi, yaitu pointer prev

Algoritma dan Pemrograman Page 33 of 51


Untuk fungsi clearnya sama. Tetapi untuk insertnya ada beberapa tambahan

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
}

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

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

mencetak dari tail ke head

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

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

tail ->next = head;

head->prev = tail;

Algoritma dan Pemrograman Page 34 of 51


Jadi pada program di atas hanya perlu memodifikasi sedikit.

void insert ( int n ){



tail -> next = head; //ubah pada bagian akhir fungsi insert
}

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){


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

Algoritma dan Pemrograman Page 35 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:

FILE *filepointer;

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.

Algoritma dan Pemrograman Page 36 of 51


contoh :

#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();
}

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 c;
clrscr();
out=fopen(“TES.C”,”r”);
while ( (c=fgetc(out))!=EOF ){
printf(“%c”,c);
}
fclose(f);
getch();
}

Algoritma dan Pemrograman Page 37 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 :

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

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

Carilah contoh penggunaan fread dan fwrite

Algoritma dan Pemrograman Page 38 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.

void tukar(int *a, int *b)


{
int c = *a;
*a = *b;
*b = c;
}

bubble sort

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

Untuk mengetahui apakah sudah terurut kita dapat menggunakan flag, misalkan
urut. Jika urut bernilai 1 berarti sudah terurut dan langsung hentikan proses sorting.

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

Algoritma dan Pemrograman Page 39 of 51


selection 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]);
}
}

insertion sort

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

Shell sort

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

Algoritma dan Pemrograman Page 40 of 51


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

merge sort

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

Algoritma dan Pemrograman Page 41 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();
}

Algoritma dan Pemrograman Page 42 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 :

#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();
}

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.

Algoritma dan Pemrograman Page 43 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();
}

Algoritma dan Pemrograman Page 44 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.

Algoritma dan Pemrograman Page 45 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.

Algoritma dan Pemrograman Page 46 of 51


LAMPIRAN A
TABEL KODE TOMBOL

Tombol Kode Secondary key


Enter 13
Escape 27 Tombol Kode
‘a’ – ‘z’ 97-122 Home 71
‘A’ – ‘Z’ 65-90 Panah atas 72
‘0’-‘9’ 48-57 PgUp 73
Spasi 32 Panah kiri 75
Tab 9 Panah kanan 77
Backspace 8 End 79
F11 123 Panah bawah 80
F12 122 PgDn 81
Alt F11 117 Ins 82
Alt F12 116 Del 83
Shift F11 121
Shift F12 120
Ctrl F11 119 Tombol Kode
Ctrl F12 118 Alt Q – ] 16..27
F11 123 Alt A – ‘ 30..40
F12 122 Alt Z - / 44..53
Alt F11 117 F1-F10 59-68
Alt F12 116 Alt F1-F10 104-113
Alt 0 127 Shift F1-F10 84-93
Alt - 126 Ctrl F1-F10 94-103
Alt = 125 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);
}

Algoritma dan Pemrograman Page 47 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);

Algoritma dan Pemrograman Page 48 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

Algoritma dan Pemrograman Page 49 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 ╜

Algoritma dan Pemrograman Page 50 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

Algoritma dan Pemrograman Page 51 of 51

Anda mungkin juga menyukai