#!/usr/local/bin/tcc -run /* ? 以下の3つのサンフ?ルか?と?のクラスに属しているか を推定するフ?ロク?ラムを作成する ? 最も近いサンフ?ルと同し?クラスとみなせ 5.7,4.0,1.2,0.2 5.9,2.9,4.2,1.5 5.6,2.8,4.8,2.0 */ #include #include #include #include #define type1 "Iris-setosa" #define type2 "Iris-versicolor" #define type3 "Iris-virginica" typedef struct { double sepal_length; double sepal_width; double petal_length; double petal_width; char class[256]; }iris; int max3(int x,int y,int z) { if (y < x && z < x)return 0; else if(x < y && z < y)return 1; else if (x < z && y < z)return 2; else return 3; return 0; } int strcmn_jdg(iris tmp) { if ((strcmp(tmp.class,type1) == 0))return 0; else if ((strcmp(tmp.class,type2) == 0))return 1; else if ((strcmp(tmp.class,type3) == 0))return 2; return 0; } void shift(int min[],int times[],int k,int fin) { for(int i=k;i > fin;i--) { min[i] = min[i-1]; times[i] = times[i-1]; } } int comp(iris sample,iris iris[],int count,int k) { double min[k]; int times[k]; int counter[3] = {0}; int minis = 0; for (int j = 0; j < count; j++) { double number = sqrt(pow((sample.sepal_length - iris[j].sepal_length),2) + pow((sample.sepal_width - iris[j].sepal_width),2) + pow((sample.petal_length - iris[j].petal_length),2) + pow((sample.petal_width - iris[j].petal_width),2)); for (int i = 0; i <= k; i++) { //printf("%d-%d\n",j,i); if (min[i] > number || i == j) { shift(min, times, k, i); min[i] = number; times[i] = strcmn_jdg(iris[j]); if (i == 0) minis = times[i]; break; } } } printf("\n\n"); for (int i = 0; i < k; i++) counter[times[i]]++; for (size_t i = 0; i < 3; i++) printf("%d\n",counter[i]); int result = max3(counter[0],counter[1],counter[2]); printf("%d\n",result); if (result == 3) return minis; return result; } void search(iris average[],iris iris[],int times[],int count) { for (int i = 0; i < count; i++) { int number = 0; number = strcmn_jdg(iris[i]); average[number].sepal_length += iris[i].sepal_length; average[number].sepal_width += iris[i].sepal_width; average[number].petal_length += iris[i].petal_length; average[number].petal_width += iris[i].petal_width; times[number]++; } } int main(int argc, char const *argv[]) { //system("cp iris.data iris.data.csv"); char str[512]; char species[3][16] = {type1,type2,type3}; int times[3]; iris average[3]; iris sample[3] = { {5.7,4.0,1.2,0.2,""}, {5.9,2.9,4.2,1.5,""}, {5.6,2.8,4.8,2.0,""} }; int count; FILE *fp = fopen("iris.data", "r"); for (count = 0;(fgets(str,512,fp)) != NULL; count++); iris iris[count]; fclose(fp); int k = 0; fprintf(stdout, "What's 'k'? "); fscanf(stdin,"%d",&k); fp = fopen("iris.data", "r"); for (int i = 0; i < count; i++) { fscanf(fp,"%lf,%lf,%lf,%lf,%s\n",&iris[i].sepal_length,&iris[i].sepal_width,&iris[i].petal_length,&iris[i].petal_width,iris[i].class); } fclose(fp); search(average,iris,times,count); for (int i = 0; i < 3; i++) { average[i].sepal_length /= times[i]; average[i].sepal_width /= times[i]; average[i].petal_length /= times[i]; average[i].petal_width /= times[i]; } for (int i = 0; i < 3; i++) { printf("Sampleの%dは%sに分類されます\n",i+1,species[comp(sample[i],iris,count,k)]); } return 0; }