Algoritma Dan Pemrograman
Algoritma Dan Pemrograman
Dasar-dasar pemrograman C
Executable File adalah source code yang sudah di-compile menjadi instruksi- instruksi
yang langsung dapat dijalankan / dieksekusi.
- 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
#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.
#include <conio.h>
#include <stdio.h>
#include <stdio.h>
#include <conio.h>
void main( )
{
clrscr();
textbackground(BLUE);
textcolor(WHITE);
clrscr();
textbackground(BLUE);
textcolor(WHITE);
cprintf(“Hello Titans”);
getch();
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
contoh :
Tipe data
Tipe data adalah menentukan tipe nilai yang dapat ditampung oleh suatu variabel.
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.
int angka8 ;
float angka_desimal;
long _567;
Operator Aritmatika
+ operator penjumlahan
- operator pengurangan
* operator perkalian
/ operator pembagian
% modulus, operator sisa hasil pembagian
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.
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++;
a = 5 + x;
x++;
Pre Increment
a = 5 + (++x);
x++;
a = 5 + x;
Disinilah dapat terlihat perbedaan antara post increment dan pre increment. Hal ini
juga berlaku untuk decrement ( pengurangan ).
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
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
int a = 5;
int b = a++ * 2;
dengan
int a = 5;
int b = ++a * 2;
int x = 8;
y = x+6*x+2;
x = y/3;
== 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
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”
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”);
}
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……;
}
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……;
}
#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();
}
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
*****
*****
*****
*****
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*
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
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;
*p=b+15;
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();
}
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 main(){
clrscr();
cetak(5); // memanggil fungsi yang telah dibuat dengan parameter
getch();
}
#include <stdio.h>
#include <conio.h>
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 :
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
Jika di void main fungsi dipanggil seperti di bawah ini, apakah output yang akan
tercetak ?
void main(){
clrscr();
cetak (5);
getch();
}
Passing parameter
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.
contoh:
#include<stdio.h>
void cetak(int x)
{
printf(“%d”,x);
}
void main()
{
int x=5;
cetak(x);
}
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:
MEMORY
MAIN TUKAR
a b
X Y
#include<stdio.h>
#include<conio.h>
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.
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”);
}
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.
5.1 Array
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();
}
int a[5];
int a[5]={5,7,4,9,4};
int a[]={9,8,4};
int a;
int arr[5];
int *p;
Lalu kita mendeklarasikan variabel pointer yang bertipe ( int * ) yang berarti bahwa
sebuah pointer yang akan menunjuk ke suatu nilai integer.
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();
}
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();
}
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.
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++;
}
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;
};
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;
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();
}
#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();
}
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.
2. Buatlah sebuah fungsi strndel yang memiliki 3 buah parameter, yaitu sebuah
string s, awal sebagai integer, panjang sebagai integer.
s adalah string sumber, awal adalah index awal dari string, panjang adalah
jumlah yang akan dihilangkan dihitung dari index awalnya.
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.
10. Buatlah program yang meminta input sebuah kalimat dan tampilkanlah
kalimat terbalik dibaca dari belakang.
Linked list adalah sejumlah node (simpul) yang dihubungkan secara linier dengan
bantuan pointer. Linked list erat kaitannya dengan struct.
struct node {
int n;
struct node *next;
};
n n n n
head tail
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.
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.
if ( head == NULL ) {
head =tail = curr;
} else {
tail->next = curr;
tail = curr;
}
tail ->next = NULL;
}
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.
#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
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;
};
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.
curr = head;
while ( curr != NULL ){
printf(“%d “,curr->n);
curr=curr->next;
}
curr = tail;
while ( curr != NULL ){
printf(“%d “,curr->n);
curr=curr->prev;
}
Jangan lupa untuk menambahkan fungsi clear() juga sebelum akhir program.
Circular linked list dibagi lagi menjadi dua, yaitu Circular Single Linked List dan
Circular Double Linked List. Konsep utama nya adalah
head->prev = tail;
…
…
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.
Sintaks:
FILE *filepointer;
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.
#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]);
}
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();
}
contoh :
#include<stdio.h>
#include<conio.h>
void main(){
FILE *f;
char nama[51];
f = fopen(“string.txt”,”a”);
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”.
Dalam bab ini kita akan membahas tentang sorting yaitu pengurutan data. Algoritma
untuk sorting sangatlah beragam dengan kompleksitas yang berbeda-beda.
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.
insertion sort
Shell sort
merge sort
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) temp[pos++]=arr[krawal++];
while(knawal<=knakhir) temp[pos++]=arr[knawal++];
for(i=0;i<pjg;i++){
arr[knakhir]=temp[knakhir];
knakhir--;
}
}
#include <stdio.h>
#include <conio.h>
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]);
}
9.1 Searching
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.
#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();
}
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.
int arr[10]={1,5,7,8,10,15,19,27,45,62};
int i,angka;
void main(){
clrscr();
printf(“masukkan angka yang ingin dicari : “);
scanf(“%d”,&angka);
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
Hash(key) = key % 23
Jadi jika kita ingin memasukkan angka-angka berikut ini : 5, 60, 78, 34, 8
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 :
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.
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);
}