mantap
main.cpp
- Committer:
- asyrofi
- Date:
- 2018-04-17
- Revision:
- 0:d6253d3647d4
File content as of revision 0:d6253d3647d4:
//#include<iostream>
//#include <stdio.h>
#include<math.h>
#include<stdlib.h>
#include "mbed.h"
#include "Serial.h"
#include <algorithm>
Serial uart1(USBTX,USBRX);
#define MAX 20
#define k 4
using namespace std;
enum category{SHORT,TALL,AVERAGE};
class data{
int x,y;
category cat;
public:
void setd(int a,int b,category c){
x=a;
y=b;
cat=c;
}
int getx(){return x;}
int gety(){return y;}
category getcat(){
return cat;
}
};//end of class
int dis(data d1,data d2)
{
//return sqrt(pow((d2.getx()-d1.getx()),2)+pow((d2.gety()-d1.gety()),2));
return sqrt(pow(((double)d2.getx()-(double)d1.getx()),2.0)+pow(((double)d2.gety()-(double)d1.gety()),2.0));
}
int main()
{
uart1.baud(9600);
do{
int p,q; //input
int a[MAX]; //store distances
int b[k]; //to get min distances, used in calc
int c[k]; //to store freq
for(int i=0;i<k;i++){ //initiLIZATION
b[i]=-1;
c[i]=0;
} int min=1000;
//cout<<"Enter x,y(negative value to exit): ";
uart1.printf("Enter x,y(negative value to exit):");
//cin>>p>>q;
uart1.scanf("%ld,%ld",&p,&q);
if((p < 0) | (q < 0))
exit(0);
data n; //data point to classify
n.setd(p,q,SHORT);
data d[MAX]; //training set
d[0].setd(1,1,SHORT);
d[1].setd(1,2,SHORT);
d[2].setd(1,3,SHORT);
d[3].setd(1,4,SHORT);
d[4].setd(1,5,SHORT);
d[5].setd(1,6,SHORT);
d[6].setd(1,7,SHORT);
d[7].setd(2,1,SHORT);
d[8].setd(2,2,SHORT);
d[9].setd(2,3,AVERAGE);
d[10].setd(2,4,AVERAGE);
d[11].setd(2,5,AVERAGE);
d[12].setd(2,6,AVERAGE);
d[13].setd(2,7,AVERAGE);
d[14].setd(5,1,TALL);
d[15].setd(5,2,TALL);
d[16].setd(5,3,TALL);
d[17].setd(5,4,TALL);
d[18].setd(5,5,TALL);
d[19].setd(5,6,TALL);
for(int i=0;i<20;i++){
a[i]=dis(n,d[i]);
//cout<<"\t\t"<<a[i]<<endl;
uart1.printf("\t\t %d\n", a[i]);
}
//k-nearest neighbours calculation i.e smallest k distances
for(int j=0;j<k;j++)
{
min=1000;
for(int i=0;i<20;i++)
{
if(i!=b[0]&&i!=b[1]&&i!=b[2])
{
if((a[i]<=min))
{
min=a[i];
b[j]=i;
}
}
}
//cout<<min<<endl;
uart1.printf("%d\n",min);
}
//counting frequency of a class in each neighbour
for(int i=0;i<k;i++)
{
switch (d[b[i]].getcat())
{
case SHORT:
c[0]++;
break;
case AVERAGE:
c[2]++;
break;
case TALL:
c[1]++;
break;
}
} //counting max frequency
int max=-1,j;
for(int i=0;i<k;i++)
{
if(c[i]>max){
max=c[i];
j=i;
}
}
//cout<<"Prediction is : ";
printf("Prediction is:");
switch (j)
{
case 0:
//cout<<"SHORT"<<endl;
uart1.printf("SHORT\n");
break;
case 1:
//cout<<"TALL"<<endl;
uart1.printf("TALL\n");
break;
case 2:
//cout<<"AVERAGE"<<endl;
uart1.printf("AVERAGE\n");
break;
}
}while(true);
return 0;
}