Skip to content

Instantly share code, notes, and snippets.

@mfrazi
Created October 27, 2015 09:52
Show Gist options
  • Save mfrazi/b21b41804cadac86dc37 to your computer and use it in GitHub Desktop.
Save mfrazi/b21b41804cadac86dc37 to your computer and use it in GitHub Desktop.
#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