#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define MAXLINE 1024/* Input line max size */
#define STUDENTMAX 5
typedef struct _heightset {
double base[STUDENTMAX];
double add[STUDENTMAX];
double sum[STUDENTMAX];
double example;
double height;
} Heightset;
/* 0.1~0.5を0.1刻みで取得する */
double getrandom(void)
{
return ((int)(5.0 * rand() / (RAND_MAX + 1.0)) + 1) / 10.0;
}
int getmin(int a[], int arraysize)
{
int i, n, min;
#ifdef DEBUG1
for (i = 0; i < arraysize; i++)
{
printf("%d: %d\t",i , a[i]);
}
#endif
min = a[0];
n = 0;
for (i = 1; i < arraysize; i++)
{
if (a[i] < min)
{
min = a[i];
n = i;
}
}
#ifdef DEBUG1
printf("min: %d\n", n);
#endif
return n;
}
int getmax(int a[], int arraysize)
{
int i, n, max;
#ifdef DEBUG2
for (i = 0; i < arraysize; i++)
{
printf("%d: %d\t",i , a[i]);
}
#endif
max = a[0];
n = 0;
for (i = 1; i < arraysize; i++)
{
if (max < a[i])
{
max = a[i];
n = i;
}
}
#ifdef DEBUG2
printf("max: %d\n", n);
#endif
return n;
}
int addheight(const char *inputf, const char *outputf)
{
FILE *ifp, *ofp;
char line[MAXLINE];
char *sp;
const char *delimiter = " ";
double student[STUDENTMAX] = {0.0, };
Heightset h[STUDENTMAX];
int sum[STUDENTMAX] = {0, };/* temp */
int example[STUDENTMAX] = {0, }, exp;/* temp */
int i, k;/* temp */
/* File open */
ifp = fopen(inputf, "r");
ofp = fopen(outputf, "w");
if (ifp == NULL || ofp == NULL)
{
fprintf(stderr, "error: can't open file(s)\n");
exit (1);
}
srand((unsigned)time(NULL));
/* height pick */
while ((fgets(line, MAXLINE, ifp)) != NULL)
{
/* 1行分のデータを配列に代入 */
sp = strtok(line, delimiter);
for (i = 0; sp != NULL; i++)
{
student[i] = atof(sp);
sp = strtok(NULL, delimiter);
}
if (i != STUDENTMAX)
{
fprintf(stderr, "error: Invalid data(!= %d)\n", STUDENTMAX);
exit (2);
}
/* データを算出する */
for (i = 0; i < STUDENTMAX; i++)
{
/* -- 基礎データ(5人分) -- */
for (k = 0; k < STUDENTMAX; k++)
{
h[i].base[k] = getrandom();
}
/* -- 付加データ(5人分) -- */
for (k = 0; k < STUDENTMAX; k++)
{
h[i].add[k] = getrandom();
}
/* -- 基礎+付加(5人分) -- */
for (k = 0; k < STUDENTMAX; k++)
{
h[i].sum[k] = h[i].base[k] + h[i].add[k];
sum[k] = (int)(h[i].sum[k] * 10);
}
/* -- i回目の代表のデータ -- */
k = getmin(sum, STUDENTMAX);
h[i].example = h[i].sum[k];
/* -- i回目の代表の身長 -- */
h[i].height = student[k];
}
/* -- 行の代表のデータ -- */
for (i = 0; i < STUDENTMAX; i++)
{
example[i] = (int)(h[i].example * 10);
}
exp = getmax(example, STUDENTMAX);/* exp:代表 */
/* 出力する */
/* -- 元データ -- */
fprintf(ofp, "%.1f", student[0]);
for (i = 1; i < STUDENTMAX; i++)
{
fprintf(ofp, "%s%.1f", delimiter, student[i]);
}
/* -- x5回 -- */
for (i = 0; i < STUDENTMAX; i++)
{
/* -- 基礎データ(5人分) -- */
for (k = 0; k < STUDENTMAX; k++)
{
fprintf(ofp, "%s%.1f", delimiter, h[i].base[k]);
}
/* -- 付加データ(5人分) -- */
for (k = 0; k < STUDENTMAX; k++)
{
fprintf(ofp, "%s%.1f", delimiter, h[i].add[k]);
}
/* -- 基礎+付加(5人分) -- */
for (k = 0; k < STUDENTMAX; k++)
{
fprintf(ofp, "%s%.1f", delimiter, h[i].sum[k]);
}
/* -- 回の代表のデータ -- */
fprintf(ofp, "%s%.1f", delimiter, h[i].example);
/* -- 回の代表の身長 -- */
fprintf(ofp, "%s%.1f", delimiter, h[i].height);
}
/* -- 行の代表の身長 -- */
fprintf(ofp, "%s%.1f\n", delimiter, h[exp].height);
}
/* File close */
fclose(ifp);
fclose(ofp);
return 0;
}
int main(void)
{
const char *inputf = "height.csv";
const char *outputf = "result.csv";
addheight(inputf, outputf);
return 0;
}