Created
October 27, 2015 09:52
-
-
Save mfrazi/b21b41804cadac86dc37 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <stdio.h> | |
#include <string.h> | |
#include <math.h> | |
#include <algorithm> | |
#define garis printf("---------------------------------------------------------\n") | |
#define garis2 printf("|=======================================================|\n") | |
struct hasil_jarak{ | |
int index; | |
double jaraknya; | |
}; | |
bool acompare(hasil_jarak lhs, hasil_jarak rhs) { return lhs.jaraknya < rhs.jaraknya; } | |
void input_data1(int *, int *, int *); | |
void input_data2(char a[][100], int); | |
void input_dataset(int a[][100], int, int, int); | |
void input_kasus(int *, int, int); | |
void input_K(int *); | |
void display_table(int a[][100], hasil_jarak *, int, int, bool, int); | |
void display_hasil(int *, char a[][100], int, int); | |
double euclidean_distance(int *, int *, int); | |
int main(){ | |
int total_atribut, total_dataset, total_class; | |
input_data1(&total_atribut, &total_dataset, &total_class); | |
char class_name[total_class][100]; | |
input_data2(class_name, total_class); | |
int data[total_dataset][100], kasus[total_atribut], K; | |
input_dataset(data, total_dataset, total_atribut, total_atribut); | |
input_kasus(kasus, total_atribut, total_atribut); | |
input_K(&K); | |
hasil_jarak jarak[total_dataset]; | |
int hasil[total_class]; | |
memset(hasil, 0, sizeof(hasil)); | |
int tmp_data[total_atribut]; | |
for(int i=0; i<total_dataset; i++){ | |
for(int j=0; j<total_atribut; j++) | |
tmp_data[j] = data[i][j]; | |
jarak[i].index = i; | |
jarak[i].jaraknya = euclidean_distance(tmp_data, kasus, total_atribut); | |
} | |
printf("\n >>> Data jarak sebelum diurutkan :\n"); | |
display_table(data, jarak, total_atribut, total_dataset, false, K); | |
std::sort(jarak, jarak+total_dataset, acompare); | |
printf("\n >>> Data jarak setelah diurutkan :\n"); | |
display_table(data, jarak, total_atribut, total_dataset, true, K); | |
for(int i=0; i<K; i++) | |
hasil[data[jarak[i].index][total_atribut]]++; | |
printf("\n"); | |
for(int i=0; i<total_class; i++){ | |
printf(" > Jumlah class ke-%d (\"%s\") -> %d\n", i+1, class_name[i], hasil[i]); | |
} | |
int maks = -1, maks_index = 0; | |
for(int i=0; i<total_class; i++) | |
if(hasil[i] > maks){ | |
maks = hasil[i]; | |
maks_index = i; | |
} | |
display_hasil(kasus, class_name, total_atribut, maks_index); | |
return 0; | |
} | |
void input_data1(int *a, int *b, int *c){ | |
printf("> Jumlah atribut\t: "); scanf("%d", a); | |
printf("> Jumlah dataset\t: "); scanf("%d", b); | |
printf("> Jumlah class\t\t: "); scanf("%d", c); | |
} | |
void input_data2(char class_name[][100], int total_class){ | |
printf(" (Masukkan nama class)\n"); | |
for(int i=0; i<total_class; i++){ | |
printf(" > Class %d (nilai %d) : ", i+1, i); | |
scanf("%s", class_name[i]); | |
} | |
} | |
void input_dataset(int data[][100], int a, int b, int n){ | |
printf("Masukkan data"); | |
printf("\n( "); | |
for(int i=0; i<n; i++) | |
printf("atribut%d ", i+1); | |
printf("class )\n"); | |
for(int i=0; i<a; i++) | |
for(int j=0; j<b+1; j++){ | |
scanf("%d", &data[i][j]); | |
} | |
} | |
void input_kasus(int *a, int b, int n){ | |
printf("> Masukkan contoh kasus\t: "); | |
printf("\n ( "); | |
for(int i=0; i<n; i++) | |
printf("atribut%d ", i+1); | |
printf(")\n > "); | |
for(int i=0; i<b; i++) | |
scanf("%d", &a[i]); | |
} | |
void input_K(int *K){ | |
printf("> Masukkan nilai K\t: "); scanf("%d", K); | |
} | |
void display_table(int data[][100], hasil_jarak *jarak, int n, int m, bool flag, int k){ | |
garis; | |
printf("| Index\t| Jarak\t\t| Class\t|\n"); | |
garis; | |
for(int i=0; i<m; i++){ | |
printf("|\t%d\t", jarak[i].index); | |
printf("|\t%lf\t", jarak[i].jaraknya); | |
printf("|\t%d\t|\n", data[jarak[i].index][n]); | |
if(flag and i==k-1) | |
garis2; | |
} | |
garis; | |
} | |
void display_hasil(int *kasus, char class_name[][100], int n, int m){ | |
printf("\n"); | |
printf(" > Kesimpulan class dari kasus ("); | |
for(int i=0; i<n; i++){ | |
printf("%d", kasus[i]); | |
if(i!=n-1) | |
printf(", "); | |
} | |
printf(") adalah \"%s\"\n\n", class_name[m]); | |
} | |
double euclidean_distance(int *data, int *kasus, int n){ | |
int tmp=0; | |
for(int i=0; i<n; i++){ | |
tmp += pow((data[i]-kasus[i]), 2); | |
} | |
return sqrt(tmp); | |
} | |
/* | |
4 | |
12 | |
2 | |
0 0 0 0 0 | |
0 0 0 1 0 | |
1 0 0 0 1 | |
2 1 0 0 1 | |
2 2 1 0 1 | |
2 2 1 1 0 | |
1 2 1 1 1 | |
0 1 0 0 0 | |
0 2 1 0 1 | |
2 1 1 0 1 | |
0 1 1 1 1 | |
1 1 0 1 1 | |
2 1 0 1 | |
3 | |
*/ |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment