Deteksi Penjiplakan Kode Program C dengan Metode Bisecting KMeans pada Kode yang Memiliki Makro

DETEKSI PENJIPLAKAN KODE PROGRAM C DENGAN
METODE BISECTING K-MEANS PADA KODE YANG
MEMILIKI MAKRO

FAJAR SURYA DHARMA

DEPARTEMEN ILMU KOMPUTER
FAKULTAS ILMU PENGETAHUAN ALAM DAN MATEMATIKA
INSTITUT PERTANIAN BOGOR
BOGOR
2015

PERNYATAAN MENGENAI SKRIPSI DAN
SUMBER INFORMASI SERTA PELIMPAHAN HAK CIPTA
Dengan ini saya menyatakan bahwa skripsi berjudul Deteksi Penjiplakan
Kode Program C dengan Metode Bisecting K-Means pada Kode yang Memiliki
Makro adalah benar karya saya dengan arahan dari komisi pembimbing dan
belum diajukan dalam bentuk apa pun kepada perguruan tinggi mana pun. Sumber
informasi yang berasal atau dikutip dari karya yang diterbitkan maupun tidak
diterbitkan dari penulis lain telah disebutkan dalam teks dan dicantumkan dalam
Daftar Pustaka di bagian akhir skripsi ini.

Dengan ini saya melimpahkan hak cipta dari karya tulis saya kepada Institut
Pertanian Bogor.
Bogor, Februari 2015
Fajar Surya Dharma
NIM G64080101

ABSTRAK
FAJAR SURYA DHARMA. Deteksi Penjiplakan Kode Program C dengan
Metode Bisecting K-Means pada Kode yang Memiliki Makro. Dibimbing oleh
AUZI ASFARIAN.
Pengumpulan tugas pemrograman dalam bentuk digital sangatlah rentan
akan penjiplakan karena jumlah submisi yang diunggah dapat mencapai ratusan
setiap minggunya sehingga proses pemeriksaan penjiplakan secara manual
menjadi tidak memungkinkan. Oleh sebab itu, diperlukan suatu sistem yang dapat
mendeteksi penjiplakan kode program secara otomatis. Hal ini sudah dilakukan
pada penelitian sebelumnya dengan menggunakan metode K-means dan bisecting
K-means, namun penelitian sebelumnya mengasumsikan tidak adanya
preprocessor directive. Padahal penggunaan preprocessor directive dapat
mengubah struktur kode program yang bisa mempengaruhi kemampuan sistem
dalam deteksi penjiplakan. Tujuan penelitian ini adalah menangani kode program

yang mempunyai makro dan membandingkan hasil yang didapat dengan
penelitian sebelumnya. Hasil penelitian yang didapat menunjukkan adanya
peningkatan akurasi dalam mendeteksi seluruh kode program dari 85% menjadi
89%. Sedangkan untuk pengujian masing-masing jenis kode program akurasinya
naik dari 20%-40% menjadi 80%.
Kata kunci: deteksi penjiplakan, preprocessor directive, structure-oriented
similarity

ABSTRACT
FAJAR SURYA DHARMA. C Source Code Plagiarism Detection Using
Bisecting K-means on the Code with Macro. Supervised by AUZI ASFARIAN.
Submission of programming tasks in digital form is vulnerable to plagiarism
because the number of submitted codes can reach hundreds every week, making
the process of plagiarism checking manually infeasible. Therefore we need a
system that can detect plagiarism program code automatically. This has been done
in previous studies using the K-means and bisecting K-means, but previous
research assumes no preprocessor directive in the program code. Meanwhile, the
use of preprocessor directive can change the structure of the program code that
could affect the ability of the system to detect plagiarism. The purpose of this
study is to detect codes that uses macro and compare the results obtained with

previous research. The results obtained showed an increased accuracy in detecting
the whole program code from 85 % to 89 %. Testing for each type of program
code result in an increase of accuracy from 20%-40% to 80%.
Keywords: plagiarism detection, preprocessor directive, structure-oriented
similarity

DETEKSI PENJIPLAKAN KODE PROGRAM C DENGAN
METODE BISECTING K-MEANS PADA KODE YANG
MEMILIKI MAKRO

FAJAR SURYA DHARMA

Skripsi
sebagai salah satu syarat untuk memperoleh gelar
Sarjana Komputer
pada
Departemen Ilmu Komputer

DEPARTEMEN ILMU KOMPUTER
FAKULTAS ILMU PENGETAHUAN ALAM DAN MATEMATIKA

INSTITUT PERTANIAN BOGOR
BOGOR
2015

Judul Skripsi : Deteksi Penjiplakan Kode Program C dengan Metode Bisecting KMeans pada Kode yang Memiliki Makro
Nama
: Fajar Surya Dharma
NIM
: G64080101

Disetujui oleh

Auzi Asfarian, SKomp MKom
Pembimbing

Diketahui oleh

Dr Ir Agus Buono, MSi MKom
Ketua Departemen


Tanggal Lulus:

PRAKATA
Puji dan syukur penulis panjatkan ke hadirat Allah Subhanahu wa
Ta’alaata rahmat, hidayah, dan nikmat-Nya sehingga penulis dapat
menyelesaikan penelitian ini sebagai tugas akhir untuk memperoleh gelar Sarjana
Komputer. Banyak pihak yang telah memberikan bantuan baik yang bersifat
materi maupun moral kepada penulis dalam penyelesaian tugas akhir ini. Oleh
karena itu, penulis ingin menyampaikan rasa terima kasih yang sebesar-besarnya
kepada:
1 Bapak dan Ibu penulis yang selalu mendukung penulis.
2 Bapak Auzi Asfarian, Skomp MKom selaku dosen pembimbing.
3 Bapak Ahmad Ridha, SKom MS dan Bapak Firman Ardiansyah, SKom MSi
selaku dosen penguji.
Akhir kata, penulis mohon maaf apabila dalam tulisan ini masih terdapat
banyak kekurangan. Penulis berharap semoga tulisan ini dapat bermanfaat bagi
para pembaca.
Bogor, Februari 2015
Fajar Surya Dharma


DAFTAR ISI
DAFTAR TABEL

vi

DAFTAR GAMBAR

vi

DAFTAR LAMPIRAN

vi

PENDAHULUAN

1

Latar Belakang

1


Perumusan Masalah

2

Tujuan Penelitian

2

Manfaat Penelitian

2

Ruang Lingkup Penelitian

2

METODE

2


Pembuatan program penanganan makro

3

Pembuatan Data Plagiasi

5

Pengujian Data pada Sistem tanpa Penanganan Makro

5

Pengujian Data pada Sistem dengan Penanganan Makro

5

Perbandingan Kedua Percobaan

6


Lingkungan Pengembangan

6

HASIL DAN PEMBAHASAN

6

Pembuatan Program Penanganan Makro

6

Pembuatan Data Plagiasi

8

Pengujian Data Untuk Sistem tanpa Penanganan Makro

8


Pengujian Data Untuk Sistem dengan Penanganan Makro

9

Perbandingan Kedua Percobaan

9

SIMPULAN DAN SARAN

10

Simpulan

10

Saran

10


DAFTAR PUSTAKA

10

LAMPIRAN

11

RIWAYAT HIDUP

19

DAFTAR TABEL
1 Contoh aturan konversi
2 Hasil pengujian untuk sistem tanpa penanganan makro
3 Hasil pengujian untuk sistem dengan penanganan makro

4
8
9

DAFTAR LAMPIRAN
1
2
3
4

Tabel aturan konversi
Kode program yang dimodifikasi
Clustering untuk pengujian data pada sistem tanpa penanganan makro
Clustering untuk pengujian data pada sistem dengan penanganan makro

11
12
17
18

PENDAHULUAN
Latar Belakang
Plagiarisme atau penjiplakan sejak dulu sudah menjadi masalah dalam dunia
pendidikan karena bisa mengacaukan penilaian terhadap kemampuan siswa.
Penjiplakan dalam kode program biasanya dilakukan hanya dengan mengubah
nama dokumen, variabel yang digunakan, nama fungsi dan sebagainya.
Pengumpulan tugas dalam bentuk digital sangatlah rentan akan penjiplakan karena
jumlah submisi yang diunggah dapat mencapai ratusan setiap minggunya
sehingga proses pemeriksaan penjiplakan secara manual menjadi tidak
memungkinkan. Oleh karena itu diperlukan suatu sistem yang dapat mendeteksi
penjiplakan secara otomatis.
Burrow (2004) mengatakan ada dua kategori utama metode pendeteksian :
text-based dan code-based. Deteksi penjiplakan pada kode program biasanya
digunakan sistem berbasis kode. Pada sistem berbasis kode sendiri terdapat dua
pendekatan yang digunakan, yaitu structure-oriented and attribute-oriented. Pada
attribute-oriented code-based system kesamaan antara dua program diukur dari
banyaknya operator dan operand yang digunakan. Cara ini punya keterbatasan
karena hanya efektif jika program yang diperiksa sangat mirip sedangkan pada
penjiplakan terkadang pelakunya menambah/mengurangi beberapa baris kode
yang tak diperlukan sehingga kode programnya kadang terlihat berbeda.
Structure-oriented code-based system relatif tahan terhadap perubahan kecil yang
dilakukan pada program seperti penambahan variabel, penambahan kode program
dan sebagainya, sehingga untuk menghindari pendeteksian diperlukan perubahan
besar pada program untuk menghindari deteksi penjiplakan. Teknik yang
digunakan adalah mengubah kode program menjadi suatu representasi yang solid
lalu akan dicari kemiripan antara representasi kode program tersebut.
Notyasa (2013) dan Gumilang (2013) menggunakan structured-oriented
code-based system untuk mendeteksi penjiplakan pada kode program. Penelitian
Gumilang (2013) menggunakan metode flat clustering K-means, pada metode ini
jumlah cluster yang dihasilkan harus ditentukan terlebih dahulu padahal jumlah
cluster yang akan dihasilkan belum diketahui. Maka pada penelitian gumilang
masalah ini diatasi dengan melakukan iterasi K-means secara otomatis, yaitu
dengan menentukan cluster awal berjumlah satu kemudian dicek jarak antar
dokumennya jika belum memuaskan maka cluster akan ditambah hingga
mendapatkan jarak antar dokumen yang diinginkan. Cara ini memerlukan waktu
eksekusi yang cukup lama karena setiap penambahan cluster semua jarak antar
dokumen akan dihitung ulang. Pada penelitian Notyasa (2013) metode clustering
yang digunakan adalah bisecting K-means, metode ini adalah suatu algoritme
clustering yang bersifat HDC (Hierarchical Divisive Clustering), algoritme
clustering ini awalnya berawal dari suatu cluster besar yang akan dipecah menjadi
cluster-cluster kecil, idealnya setiap cluster akan berisi satu data saja, namun
dalam penelitian ini yang ingin dihasilkan adalah suatu cluster yang berisi
kumpulan data yang mirip sehingga jarak antara data dan centroid-nya dalam satu
cluster akan dibatasi. Hasil akurasi yang didapat pada penelitian tersebut sudah
cukup baik yaitu mencapai 90%.

2
Dalam penelitian sebelumnya diasumsikan tidak adanya makro sehingga
semua preprocessor directive dihilangkan. Padahal penggunaan makro dapat
mengakibatkan struktur program berubah. Hal ini juga berpengaruh pada proses
tokenisasi karena preprocessor directive bisa mengakibatkan sebaris kode
program dianggap sebagai sebuah variabel, sehingga kode program yang dijiplak
bisa tidak terdeteksi oleh sistem. Oleh sebab itu diperlukan suatu sistem yang bisa
mengatasi makro agar kode-kode program yang menggunakan makro bisa
terdeteksi. Pada penelitian ini akan diimplementasikan program penanganan
makro pada sistem yang telah dibuat pada penelitian sebelumnya, sehingga semua
kode program dengan makro yang akan diperiksa akan terdeteksi oleh sistem.

Perumusan Masalah
Perumusan masalah dalam penelitian ini adalah
1 Bagaimana mengimplementasikan program penanganan makro dalam sistem
pendeteksi plagiat kode program C dengan metode bisecting K-Means.
2 Apakah dengan diimplementasikannya program penanganan makro pada
sistem yang sudah ada dapat menaikkan akurasi sistem dalam mendeteksi
kode program yang mempunyai makro di dalamnya.

Tujuan Penelitian
Tujuan dari penelitian ini adalah mendeteksi penjiplakan kode program C
yang mempunyai makro di dalamnya dengan menambahkan penanganan makro
serta membandingkan hasil yang didapat dengan penelitian terdahulu terutama
dalam pendeteksian penjiplakan.
Manfaat Penelitian
Penelitian ini diharapkan dapat mempermudah deteksi penjiplakan pada
kode progam C yang mengandung makro di dalamnya.
Ruang Lingkup Penelitian
1 Kode program yg dideteksi hanya kode program dalam bahasa C.
2 Data yang digunakan adalah data dummy kode program C dengan makro
di dalamnya.

METODE
Penilitian ini terbagi menjadi 5 tahap yaitu pembuatan program penanganan
makro, pembuatan data plagiasi, pengujian data pada sistem tanpa penanganan
makro, pengujian data pada sistem dengan penanganan makro, dan perbandingan
kedua percobaan. Ilustrasinya dapat dilihat pada Gambar 1.

3

Pembuatan program
penanganan makro

Pembuatan data plagiasi

Pengujian data untuk
sistem tanpa penanganan
makro

Pengujian data untuk
sistem dengan penanganan
makro

Perbandingan kedua
percobaan
Gambar 1 Metode Penelitian

Pembuatan program penanganan makro
Preprocessor directive adalah suatu fitur dalam bahasa pemrograman C
yang akan memodifikasi kode program sebelum program tersebut dijalankan oleh
compiler (Banahan et al.1991). Jenis preprocessor directive yang dipakai dalam
penelitian ini adalah yang dapat mempengaruhi struktur program yaitu
preprocessor yang mendefinisikan sebuah makro. Makro adalah suatu potongan
program yang diberi sebuah identifier, setiap kali identifier tersebut digunakan
dalam tubuh program maka identifier tersebut akan digantikan oleh argument dari
makro. Biasanya, ada dua jenis makro yang sering digunakan, yaitu makro yang
berbentuk seperti sebuah objek dan makro yang berbentuk seperti sebuah fungsi.
Preprocessor ini berada di awal kode program dan mempunyai ciri “#define” di
depannya kemudian diikuti dengan identifier dan argument yang masing-masing
dipisahkan oleh whitespace. Tanda berakhirnya makro adalah baris baru dalam
kode program, tetapi dengan menggunakan backslash, makro dapat ditulis lebih
dari satu baris. Berikut ini adalah contoh beberapa jenis preprocessor directive
yang mendefinisikan makro:

4
#define X 10000
#define Y rev[i] = rev[l - i]
#define Z(x)\
strlen(x)-1

Untuk pembuatan program penangangan makro yang pertama dilakukan
adalah mengidentifikasi bagian kode program yang berupa makro, kemudian
seluruh makro tersebut akan diidentifikasi identifier dan argument-nya. Jika
makro tersebut berbentuk sebuah fungsi maka akan ditambahkan sebuah fungsi
yang mirip dengan makro tersebut ke dalam tubuh program. Jika makro tersebut
berbentuks sebuah objek maka ketika identifier dari makro tersebut dipanggil
dalam program hanya tinggal digantikan dengan argument-nya. Selanjutnya kode
program akan dijadikan sebuah representasi yang ringkas berupa token stream
agar lebih mudah dihitung kemiripan antar kode programnya, setiap syntax akan
diubah menjadi token yang berbeda-beda, sedangkan nama variabel, nilai variabel,
nama fungsi akan dimasukkan ke kategori yang sama. Contoh tokenisasi yang
dilakukan dapat dilihat pada Tabel 1:
Tabel 1 Contoh aturan konversi
Syntax
(
)
,
{
}
+
=
ALPHANUM
int
return
STRING

Token
h
i
j
k
l
a
o
N
A
R
5

Sebagai contoh kode program sederhana berikut ini jika diubah menjadi
token stream:
1 #include
2
3 int main(){
4
int a=1,b=1,c=1;
5
a=b+c;
6
printf("%d", a);
7
b=a+c;
8
printf("%d", b);
9
return 0;
10 }

Token stream kode program di atas:
ANhikANoNjNoNjNoNNoNaNNh5jNiNoNaNNh5jNiRNl

5
Pembuatan Data Plagiasi
Karena pada penelitian ini ingin menguji seberapa akurat program jika
diujicobakan pada kumpulan program yang dijiplak maka data pada penelitian ini
adalah data dummy yang dibuat sendiri. Data yang dibuat asalnya hanya satu kode
program, tetapi dimodifikasi sedemikian rupa sehingga strukturnya secara kasat
mata lumayan berbeda. Jenis modifikasi yang dilakukan pada setiap kode program
adalah:
1
2
3
4
5
6
7
8
9
10

Kode asli
Perubahan nama variabel
Penambahan fungsi di atas
Penambahan fungsi di bawah
Penggantian variabel dengan makro
Penggantian baris program dengan makro
Pembuatan fungsi dengan makro
Perubahan variabel dan penambahan makro
Penambahan Fungsi di atas dan penambahan makro
Penambahan Fungsi di bawah dan penambahan makro

Dalam penelitian ini akan dibuat 5 jenis kode program dengan struktur dan
kompleksitas yang berbeda. Untuk setiap jenis kode progam akan diberi nama ex1
sampai dengan ex5. Setiap varian dari kode program akan diberi kode tes1 sampai
dengan tes10 pada, jenis kode program yang akan diuji berjumlah 5 jenis dengan
10 varian untuk masing-masing jenis kode program sehingga ada 50 kode
program. Pengelompokan manual sesuai jenis kode program juga dilakukan untuk
mengukur akurasi program.
Pengujian Data pada Sistem tanpa Penanganan Makro
Pada tahap ini data plagiasi yang sudah dibentuk menjadi korpus akan
diujikan ke program hasil dari penelitian Notyasa(2013). Validasi hasil clustering
dalam mendeteksi penjiplakan akan diukur menggunakan Rand Index (RI). RI
adalah suatu metode untuk mengukur persentase dari keputusan yang tepat
(Manning et al. 2008) dengan formula sebagai berikut:
RI =

TP + TN
TP + FP + FN + TN

dengan
RI
: Rand index
TP
: true positive, dua dokumen yang mirip berada pada cluster yang sama
FP
: false positive, dua dokumen yang berbeda berada di cluster yang sama
TN
: true negative, dua dokumen yang berbeda berada di cluster yang berbeda
FN
: false negative, dua dokumen yang mirip berada di cluster yang berbeda
Pengujian Data pada Sistem dengan Penanganan Makro
Pada tahap ini data plagiasi akan diujikan pada program yang sama tetapi
sudah dimodifikasi pada bagian praproses datanya sehingga bisa mendeteksi dan

6
menangani makro pada kode program. Tingkat akurasi dalam mendeteksi
penjiplakan diukur menggunakan metode yang sama seperti tahap sebelumnya.
Perbandingan Kedua Percobaan
Perbandingan dari hasil kedua percobaan di atas adalah berupa perubahan
cluster pada program tanpa penangangan marko dan dengan penanganan makro.
Akurasi dari kedua percobaan tersebut juga akan dibandingkan, dan jika ada kode
program yang tak terdeteksi atau keluar dari cluster aslinya akan dianalisa apa
yang menyebabkan kode tersebut tak terdeteksi.

Lingkungan Pengembangan




Perangkat Keras:
Processor intel Pentium i5
Memory 4GB
Hard disk 500GB










Perangkat Lunak:
Operating System Microsoft Windows 8.1 64bit
Programming language PHP 5.6.3
Apache HTTP server 2.4.10
Database Management System MySQL 5.6.21
Server Control Panel Xampp v3.2.1
Integrated Development Environtment Netbeans 8.0
Integrated Development Environtment Notepad++ v.6.6.8
Integrated Development Environtment Dev-C++ 5.6.3

HASIL DAN PEMBAHASAN
Pembuatan Program Penanganan Makro
Untuk mendeteksi preprocessor directive pada kode program yang pertama
dilakukan adalah mengecek ada atau tidaknya tanda “#” pada awal program,
karena preprocessor directive yang dapat mempengaruhi struktur program hanya
makro maka hanya preprocessor directive yang diikuti kata “define” saja yang
diambil berikutnya akan diambil identifier dan argument dari makro yang masingmasing dipisahkan oleh whitespace. Jika makro pada kode program memakai
backslash agar bisa ditulis lebih dari satu baris maka akan dinormalisasi dengan
menghilangkan backslash dan menjadikannya satu baris saja. Sebagai contoh, dari
kode program sebagai berikut:
1
2
3
4
5

#include
#include
#define X 10000
#define Y rev[i] = rev[l - i]
#define Z(x)\

7
6 strlen(x)-1
7
8 int reverse(char rev[], int i, int l){
9
if(2 * i > l)
return
0;
10
char temp;
11
temp = rev[i];
12
rev[i] = rev[l - i];
13
rev[l - i] = temp;
14
reverse(rev, ++i, l);
15 }
16
17 main(){
18
char word[10000] ;
19
scanf("%s", &word);
21
printf("entered string is %s\n", word);
22
int length = Z(word);
23
reverse(word, 0, length);
24
printf("reversed string is %s\n", word);
25
return 0;
26 }

Dari kode program di atas akan diambil makro yang sudah dinormalisasi seperti
ini:
3 #define X 10000
4 #define Y rev[i] = rev[l - i]
5 #define Z(x) strlen(x)-1

Kemudian setiap makro yang didapat akan diperiksa apakah berupa fungsi
atau hanya berupa objek. Jika berupa fungsi, pada tubuh program akan
ditambahkan fungsi yang mirip seperti makro jika hanya berupa objek maka
hanya tinggal diganti identifier yang ada pada tubuh program dengan argument
yang ada pada makro. Selanjutnya semua preprocessor directive yang ada akan
dihapus dari program agar tidak mempengaruhi proses tokenisasi kode program.
Berikut contoh kode program yang telah diproses:
1 int reverse(char rev[], int i, int l){
2
if(2 * i > l)
return
0;
3
char temp;
4
temp = rev[i];
5
rev[i] = rev[l - i];
6
rev[l - i] = temp;
7
reverse(rev, ++i, l);
8 }
9
10 main(){
11
char word[1000] ;
12
scanf("%s", &word);
13
printf("entered string is %s\n", word);
14
int length = Z(word);
15
reverse(word, 0, length);
16
printf("reversed string is %s\n", word);
17
return 0;
18 }
20 Z(x){strlen(x)-1;}

8
Setelah kode program di atas mengalami proses tokenisasi sesuai aturan
tabel konversi pada Lampiran 1, maka akan didapat token stream yang siap
dihitung jarak antar dokumennya. Berikut adalah token stream yang dihasilkan
dari kode program di atas:
ANhCNNNjANjANikIhNcNnNiRNCNNoNNNNNNNNoNNNbNNNNNbNNoN
NhNjaaNjNilNhikCNNNNNh5jfNiNh5jNiANoNhNiNhNjNjNiNh5jNiRNlNhNik
NhNibNl
Pembuatan Data Plagiasi
Untuk menguji apakah kode program penanganan makro yang sudah dibuat
berfungsi atau tidak dibutuhkan data kode program yang mempunyai banyak jenis
makro di dalamnya oleh karena itu penelitian ini tidak menggunakan data
sebenarnya namun data dummy yang dibuat sendiri dengan mempertimbangkan
bagaimana penjiplakan di dunia nyata dilakukan, dari satu kode program akan
dibuat 9 jenis kode program dengan metode penjiplakan yang berbeda-beda.
Jenis kode program yang dipakai adalah sebanyak 5 jenis kode program,
dengan demikian akan didapatkan 50 kode program, setiap jenis program akan
dinamakan ex1 sampai dengan ex5. Varian dari masing-masing jenis program
akan dinamai tes1 sampai dengan tes10. Berbagai macam modifikasi yang
dilakukan pada jenis program ex1 dapat dilihat pada Lampiran 2. Selanjutnya data
tersebut akan dijadikan korpus dan akan dikelompokkan secara manual sesuai
dengan jenis kode programnya untuk memeriksa akurasi dari program pendeteksi
penjiplakan.
Pengujian Data Untuk Sistem tanpa Penanganan Makro
Pada penelitian Notyasa (2013) nilai i (rata-rata jarak setiap anggota cluster
ke centroid cluster-nya) terbaik yang di dapat adalah adalah 0.95-0.97. Untuk
pengujian awal akan diuji seluruh data yang ada pada korpus dengan i=0.97
sehingga didapat hasil clustering dan RI yang dapat dilihat pada Tabel 2:
Tabel 2 Hasil pengujian untuk sistem tanpa penanganan makro
Data yang diuji
Seluruh data
ex1
ex2
ex3
ex4
ex5

RI
0.855
0.622
0.356
0.4
0.222
0.467

Jumlah Cluster
9
3
3
3
4
2

Hasil clustering dari pengujian ini dapat dilihat pada Lampiran 3. Dari hasil
RI yang didapat dari hasil pengujian setiap jenis kode program dapat dilihat
nilainya cukup rendah dan jumlah cluster yang dihasilkan juga cukup banyak,
sehingga cukup banyak kode program yang tidak berada dalam satu cluster
padahal, semua kode program yang ada hanya berasal dari satu kode program dan

9
pada kondisi ideal untuk pengujian seluruh data cluster-nya berjumlah 5 dan
untuk pengujian setiap jenis data hanya menghasilkan 1 cluster.
Pengujian Data Untuk Sistem dengan Penanganan Makro
Pada pengujian ini nilai i yang digunakan sama yaitu 0.97. Dari hasil
pengujian didapat clustering dan RI yang dapat dilhat pada Tabel 3:
Tabel 3 Hasil pengujian untuk sistem dengan penanganan makro
Data yang diuji
Seluruh data
ex1
ex2
ex3
ex4
ex5

RI
0.891
0.8
0.467
0.8
0.8
0.8

Jumlah Cluster
7
2
2
2
2
2

Hasil clustering dari pengujian ini dapat dilihat pada Lampiran 4. Hasil RI
yang didapat pada pengujian ini mengalami kenaikan dan kode program yang
diuji sudah berkumpul ke dalam satu cluster walaupun ada beberapa pengecualian.
Perbandingan Kedua Percobaan
Dari kedua percobaan tersebut dapat dilihat bahwa penambahan
penangangan makro pada praproses data dapat meningkatkan nilai RI. Pada
pengujian keseluruhan data, nilai RI yang didapat bertambah dari 85% menjadi
89% dan cluster-nya berkurang dari 9 menjadi 7. Pada pengujian keseluruhan data
jika tidak ada penangangan makro dapat dilihat dokumen menyebar tidak pada
cluster-nya sedangkan pada yang memakai penangangan makro dokumen mulai
menyebar pada cluster-nya masing-masing pengecualian terdapat pada cluster ex2
yang seharusnya sejenis namun terbagi menjadi dua cluster hal ini nampaknya
disebabkan karena pada dokumen ex2 penambahan fungsi yang ada cukup
signifikan sehingga mempengaruhi keseluruhan struktur program.
Pada pengujian masing-masing jenis kode program nilai RI yang didapat
meningkat dari 20-40% menjadi 80%. Pengecualian terjadi lagi pada beberapa
kode program ex2, yang mendapatkan penambahan jumlah fungsi yang signifikan
yaitu tes 3,4,9, dan 10, sehingga terbagi menjadi dua cluster. Pada setiap jenis
program dapat dilihat bahwa tes7 selalu terpisah dengan tes1 yang merupakan
kode program yang asli, hal ini terjadi karena pada tes7 terdapat preprocessor
directive yang berbentuk makro fungsi sehingga ketika diproses akan
menambahkan fungsi pada tubuh program hal ini dapat menyebabkan tes7 dapat
keluar dari cluster aslinya.

10

SIMPULAN DAN SARAN
Simpulan
Dari hasil perbandingan kedua pengujian, dapat dilihat dengan
ditambahkannya penanganan makro pada praproses data dapat meningkatkan
akurasi RI yang didapat baik pada keseluruhan data maupun pada setiap jenis data.
Tetapi penambahan fungsi yang signifikan pada kode program dapat
menyebabkan struktur kode program berubah sehingga menyebabkan kode yang
diberi tambahan fungsi tapi merupakan penjiplakan tidak masuk ke cluster aslinya.
Saran
Penambahan fungsi yang signifikan dapat mengakibatkan struktur program
berubah cukup drastis sehingga mengakibatkan kode program tersebut keluar dari
cluster aslinya, hal ini mungkin dapat menjadi pertimbangan untuk penelitian
selanjutnya. Program penanganan makro yang dibuat juga belum bisa menangani
makro yang di dalam argument-nya terdapat identifier dari makro lain. Saran
lainnya adalah penambahan variasi pada kode program plagiasi agar data yang
diuji semakin beragam.

DAFTAR PUSTAKA
Burrow S. 2004. Efficient and effective plagiarism detection for large code
repositories [tesis]. Melbourne (AU): RMIT University.
Gumilang AP. 2013. Pendeteksian penjiplakan kode program C dengan K-means
[skripsi]. Bogor (ID): Fakultas Matematika dan Ilmu Pengetahuan Alam,
Institut Pertanian Bogor
Notyasa Arizal. 2013. Pendeteksian penjiplakan kode program C dengan
Bisecting K-means [skripsi]. Bogor (ID): Fakultas Matematika dan Ilmu
Pengetahuan Alam,Institut Pertanian Bogor.
Banahan M, Brady D, Doran M. 1991. The C Book. United Kingdom : GBDirect.
Manning CD, Raghavan P, Schütze H. 2008. An Introduction to Information
Retrieval. Cambridge (UK): Cambridge University Press.

11
Lampiran 1 Tabel aturan konversi

Syntax

Token

Syntax

Token

+

a

-

b

*

c

/

d

%

e

&

f

|

g

(

h

)

i

,

j

{

k

}

l

<

m

>

n

=

o

.

p

!

q

:

r

int

A

float

B

short
long
signed
unsigned
if
else
while
do
for
ALPHANUM
goto
case
break
return
switch
const
continue
sizeof
struct
enum
typedef

E
F
G
H
I
J
K
L
M
N
O
P
Q
R
S
T
U
W
X
Y
Z

char

C

STRING

5

double

D

12

Lampiran 2 Kode program yang dimodifikasi
1 Kode asli
1 #include
2 #include
3
4 int reverse(char v[], int index, int length){
5
if(2 * index > length) return
0;
6
char temp;
7
temp = v[index];
8
v[index] = v[length - index];
9
v[length - index] = temp;
10
reverse(v, ++index, length);
11 }
12
13 main(){
14
15
char test[10000];
16
scanf("%s", &test);
17
printf("entered string is %s\n", test);
18
reverse(test, 0, strlen(test) - 1);
19
printf("reversed string is %s\n", test);
20
return 0;
21 }

2 Perubahan nama variabel
1 #include
2 #include
3
4 int reverse(char rev[], int i, int l){
5
if(2 * i > l)
return
0;
6
char temp;
7
temp = rev[i];
8
rev[i] = rev[l - i];
9
rev[l - i] = temp;
10
reverse(rev, ++i, l);
11 }
12
13 main(){
14
char word[10000] ;
15
scanf("%s", &word);
16
printf("entered string is %s\n", word);
17
int length = strlen(word)-1;
18
reverse(word, 0, length);
19
printf("reversed string is %s\n", word);
20
return 0;
21 }

13
Lampiran 2 Lanjutan
3

Penambahan fungsi di atas

1 #include
2
3 int reverse(char rev[], int i, int l){
4
if(2 * i > l)
return
0;
5
char temp;
6
temp = rev[i];
7
rev[i] = rev[l - i];
8
rev[l - i] = temp;
9
reverse(rev, ++i, l);
10 }
11
12 int calculate_length(char *string) {
13
int l = 0;
14
while (string[l] != '\0') {
15
l++;
16
}
17
return l;
18 }
19
20 main(){
21
char word[10000] ;
22
scanf("%s", &word);
23
printf("entered string is %s\n", word);
24
int length = calculate_length(word)-1;
25
reverse(word, 0, length);
26
printf("reversed string is %s\n", word);
27
return 0;
28 }

4

Penambahan fungsi di bawah

14
1 #include
2 #include
3
4 int reverse(char v[], int index, int length);
5
6 main(){
7
char test[] = "";
8
scanf("%s", &test);
9
printf("entered string is %s\n", test);
10
reverse(test, 0, strlen(test) - 1);
11
printf("reversed string is %s\n", test);
12
return 0;
13 }
14
15 int reverse(char v[], int index, int length){
16
if(2 * index > length) return
0;
17
char temp;
18
temp = v[index];
19
v[index] = v[length - index];
20
v[length - index] = temp;
21
reverse(v, ++index, length);
22 }

Lampiran 2 Lanjutan
5 Penggantian variabel dengan makro
1 #include
2 #include
3 #define X 10000
4 #define Y 2
5 #define Z 0
6
7 int reverse(char v[], int index, int length){
8
if(Y * index > length) return
Z;
9
char temp;
10
temp = v[index];
11
v[index] = v[length - index];
12
v[length - index] = temp;
13
reverse(v, ++index, length);
14 }
15
16 main(){
17
char test[X];
18
scanf("%s", &test);
19
printf("entered string is %s\n", test);
20
reverse(test, Z, strlen(test) - 1);
21
printf("reversed string is %s\n", test);
22
return Z;
23 }

6 Penggantian baris program dengan makro

15
1 #include
2 #include
3 #define X reverse(test,0,strlen(test)-1)
4 #define Y reverse(v,++index,length)
5 #define Z if(2 * index > length) return 0
6 #define A temp = v[index]
7 #define B v[index] = v[length - index]
8
9
10 int reverse(char v[], int index, int length){
11
Z;
12
char temp;
13
A;
14
B;
15
v[length - index] = temp;
16
Y;
17 }
18
19 main(){
20
21
char test[10000];
22
scanf("%s", &test);
23
printf("entered string is %s\n", test);
24
X;
25
printf("reversed string is %s\n", test);
26
return 0;
27 }

Lampiran 2 Lanjutan
7

Pembuatan fungsi dengan makro

1 #include
2 #include
3 #define X(x,y) x-y
4 #define Y(x) ++x
5 #define Z(x,y) 2 * x > y
6 #define A(x) strlen(x)-1
7
8 int reverse(char v[], int index, int length){
9
if(Z(index,length))
return
0;
10
char temp;
11
temp = v[index];
12
v[index] = v[X(length,index)];
13
v[X(length,index)] = temp;
14
reverse(v, Y(index), length);
15 }
16
17 main(){
18
19
char test[] = "";
20
scanf("%s", &test);
21
printf("entered string is %s\n", test);
22
reverse(test, 0, A(test));
23
printf("reversed string is %s\n", test);
24
return 0;
25 }

16
8 Perubahan variabel dan penambahan makro
1 #include
2 #include
3 #define X 10000
4 #define Y rev[i] = rev[l - i]
5 #define Z(x) strlen(x)-1
6
7 int reverse(char rev[], int i, int l){
8
if(2 * i > l)
return
0;
9
char temp;
10
temp = rev[i];
11
rev[i] = rev[l - i];
12
rev[l - i] = temp;
13
reverse(rev, ++i, l);
14 }
15
16 main(){
17
char word[10000] ;
18
scanf("%s", &word);
19
printf("entered string is %s\n", word);
20
int length = Z(word);
21
reverse(word, 0, length);
22
printf("reversed string is %s\n", word);
23
return 0;
24 }

Lampiran 2 Lanjutan
9 Penambahan fungsi di atas dan penambahan makro
1 #include
2 #define X 10000
3 #define Y string[l] != '\0'
4 #define Z(x) ++x
5
6 int reverse(char rev[], int i, int l){
7
if(2 * i > l)
return
0;
8
char temp;
9
temp = rev[i];
10
rev[i] = rev[l - i];
11
rev[l - i] = temp;
12
reverse(rev, Z(i), l);
13 }
14
15 int calculate_length(char *string) {
16
int l = 0;
17
while (Y) {
18
l++;
19
}
20
return l;
21 }
22
23 main(){
24
char word[X] ;
25
scanf("%s", &word);
26
printf("entered string is %s\n", word);
27
int length = calculate_length(word)-1;
28
reverse(word, 0, length);
29
printf("reversed string is %s\n", word);
30
return 0;
31 }

17
10

Penambahan fungsi di bawah dan penambahan makro

1 #include
2 #include
3 #define X 10000
4 #define Y reverse(rev, ++i, l)
5 #define Z(x,y) (x-y)
6
7 int reverse(char rev[], int i, int l);
8
9 main(){
10
char word[X];
11
scanf("%s", &word);
12
printf("entered string is %s\n", word);
13
int length = strlen(word)-1;
14
reverse(word, 0, length);
15
printf("reversed string is %s\n", word);
16
return 0;
17 }
18
19 int reverse(char rev[], int i, int l){
20
if(2 * i > l)
return
0;
21
char temp;
22
temp = rev[i];
23
rev[i] = rev[Z(l,i)];
24
rev[Z(l,i)] = temp;
25
Y;
26 }

Lampiran 3 Clustering untuk pengujian data pada sistem tanpa penanganan makro
Keseluruhan data
C1

ex4.tes1 ex4.tes10 ex4.tes2 ex4.tes3 ex4.tes4 ex4.tes5 ex4.tes6
ex4.tes7 ex4.tes8 ex4.tes9

C2

ex2.tes1 ex2.tes2 ex2.tes5 ex2.tes6 ex2.tes7 ex2.tes8

C3

ex2.tes10 ex2.tes3 ex2.tes4 ex2.tes9

C4

ex1.tes1 ex1.tes10 ex1.tes2 ex1.tes3 ex1.tes4 ex1.tes5 ex1.tes7
ex1.tes8 ex1.tes9

C5

ex1.tes6

C6

ex5.tes1 ex5.tes2 ex5.tes3 ex5.tes4 ex5.tes5 ex5.tes7

C7

ex5.tes10 ex5.tes6 ex5.tes8 ex5.tes9

C8

ex3.tes1 ex3.tes2 ex3.tes3 ex3.tes5 ex3.tes6 ex3.tes7 ex3.tes8

C9

ex3.tes10 ex3.tes4 ex3.tes9

Data ex1
C1
C2
C3

tes6
tes1 tes10 tes2 tes3 tes4 tes5 tes8 tes9
tes7

Data ex2

18
tes10 tes3 tes4 tes9
C1
C2 tes1 tes2 tes5 tes6 tes8
tes7
C3

Data ex3
C1
C2
C3

tes10 tes4 tes9
tes1 tes2 tes3 tes5 tes6 tes8
tes7

Data ex4
C1

tes10 tes4 tes9

C2

tes6 tes8

C3 tes1 tes2 tes3 tes5
tes7

C4

Data ex5
C1

tes1 tes2 tes3 tes4 tes5 tes7

C2

tes10 tes6 tes8 tes9

Lampiran 4 Clustering untuk pengujian data pada sistem dengan penanganan makro
Keseluruhan data
C1
C2
C3

ex4.tes1 ex4.tes10 ex4.tes2
ex4.tes7
ex3.tes1 ex3.tes10 ex3.tes2
ex3.tes7
ex5.tes1 ex5.tes10 ex5.tes2
ex5.tes7

ex4.tes3
ex4.tes8
ex3.tes3
ex3.tes8
ex5.tes3
ex5.tes8

ex4.tes4 ex4.tes5 ex4.tes6
ex4.tes9
ex3.tes4 ex3.tes5 ex3.tes6
ex3.tes9
ex5.tes4 ex5.tes5 ex5.tes6
ex5.tes9

C4

ex2.tes1 ex2.tes2 ex2.tes5 ex2.tes6 ex2.tes7 ex2.tes8

C5

ex2.tes10 ex2.tes3 ex2.tes4 ex2.tes9

C6

ex1.tes1 ex1.tes10 ex1.tes2 ex1.tes3 ex1.tes4 ex1.tes5 ex1.tes6
ex1.tes8 ex1.tes9

C7

ex1.tes7

Data ex1
C1

tes1 tes10 tes2 tes3 tes4 tes5 tes6 tes8 tes9

C2

tes7

Data ex2
C1

tes1 tes2 tes5 tes6 tes7 tes8

C2

tes10 tes3 tes4 tes9

19
Data ex3
C1

tes1 tes10 tes2 tes3 tes4 tes5 tes6 tes8 tes9

C2

tes7

Data ex4
C1

tes1 tes10 tes2 tes3 tes4 tes5 tes6 tes8 tes9

C2

tes7

Data ex5
C1

tes1 tes10 tes2 tes3 tes4 tes5 tes6 tes8 tes9

C2

tes7

RIWAYAT HIDUP
Penulis dilahirkan di Jakarta pada tanggal 29 September 1990, merupakan
anak ketiga dari Bapak Sri Mulyono dan Ibu Herminie Soemitro.Pada Tahun 2002
sampai 2005 penulis menempuh pendidikan sekolah menengah pertama di SMP
Negeri 166 Jakarta. Kemudian penulis melanjutkan pendidikannya di SMA
Negeri 49 Jakarta pada tahun 2005 sampai 2008. Lulus dari sekolah menengah
atas, penulis diterima di Departemen Ilmu Komputer Fakultas Matematika dan
Ilmu Pengetahuan Alam Institut Pertanian Bogor melalui jalur Seleksi Nasional
Masuk Perguruan Tinggi Negeri (SNMPTN) pada tahun 2008.