2022年10月1日
/*
gcc -g second_job.cpp -o second_job
考え方
(1)8時間労働、8時間睡眠、8時間余暇を基本として考える。
(2)8時間余暇の中には、通勤時間1.5時間 食事時間1.5時間が含まれるものとする
(3)とすれば、残りの余暇5時間をどのような使い方をするのかが問題となる。
(4)十分な余暇は、基本的に正業のパフォーマンスを上げるものであるとする。
(4)余暇を使った副業は、収入になるものとする
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct person {
double first_business_hour;
double sleep_hour;
double commute_time;
double meal_time;
double max_remain_time;
double second_business_hour;
double final_remain_time;
double fb_fee;
double sb_fee;
double fatigue_func;
double cost;
struct person *prev; /* 前の構造体を示すポインタ */
struct person *next; /* 次の構造体を示すポインタ */
} PERSON;
double min(double a, double b)
{
if (a > b)
return b;
else
return a;
}
double diff(double a, double b)
{
if (a > b)
return a - b;
else
return 0;
}
double fatigue_func(double time)
{
if (time < 1.0){
return 0.5;
}
else if ((time >= 1.0) && (time < 3.0)){
return (1.0 - 0.5)/(3.0 - 1.0) * (time - 1.0) + 0.5;
}
else {
return 1.0;
}
}
const double First_Business_hourly_fees = 2000;
const double First_Business_extra_fees = First_Business_hourly_fees * 1.25;
const double Second_Business_hourly_fees = 1000;
int main()
{
srand(13);
PERSON* first_p_person= (PERSON*)malloc(sizeof(PERSON));
PERSON* last_p_person= (PERSON*)malloc(sizeof(PERSON));
PERSON* p_prev_person = first_p_person;
for (int i = 0; i < 100; i++){
PERSON* p_person= (PERSON*)malloc(sizeof(PERSON));
memset(p_person, 0, sizeof(PERSON));
//////// ポインタの貼り替え //////////
p_prev_person->next = p_person;
p_person->next = last_p_person;
p_person->prev = p_prev_person;
p_prev_person = p_person;
//////////////////////////////////////
p_person->first_business_hour = 8.0 + 2.0 * (double)rand()/RAND_MAX; // 8~10時間
p_person->first_business_hour = 8.0; // 8~10時間
p_person->sleep_hour = 7.0 + 1.0 * (1.0 - 2.0 * (double)rand()/RAND_MAX); // 6~8時間
p_person->commute_time = 1.0 + 0.5 * (1.0 - 2.0 * (double)rand()/RAND_MAX); // 0.5~1.5時間
p_person->meal_time = 1.0 + 0.5 * (1.0 - 2.0 * (double)rand()/RAND_MAX); // 0.5~1.5時間
p_person->max_remain_time =
24.0 -
p_person->first_business_hour -
p_person->sleep_hour -
p_person->commute_time -
p_person->meal_time; // 最悪でも3時間の、最良で9時間の余暇時間ができる
#if 1
p_person->second_business_hour = p_person->max_remain_time * (double)rand()/RAND_MAX; //余暇の時間を適当に振る
#else
p_person->second_business_hour = 0;
#endif
p_person->final_remain_time = p_person->max_remain_time - p_person->second_business_hour;
p_person->fb_fee =
min(p_person->first_business_hour, 8.0) * First_Business_hourly_fees +
diff(p_person->first_business_hour, 8.0) * First_Business_extra_fees;
p_person->sb_fee = p_person->second_business_hour * Second_Business_hourly_fees;
p_person->fatigue_func = fatigue_func(p_person->final_remain_time);
p_person->cost =
p_person->fb_fee * p_person->fatigue_func + p_person->sb_fee;
//printf("%d:cost = %f\n", i, p_person->cost);
}
double total_cost = 0.0;
PERSON* p_person = first_p_person->next;
printf("本業時間,睡眠時間,通勤時間,食事時間,余暇時間,副業時間,残余暇時間,RATIO,収入\n");
while(p_person->next != last_p_person){
total_cost += p_person->cost;
printf("%f,%f,%f,%f,%f,%f,%f,%f,%f\n",
p_person->first_business_hour,
p_person->sleep_hour,
p_person->commute_time,
p_person->meal_time,
p_person->max_remain_time,
p_person->second_business_hour,
p_person->final_remain_time,
p_person->fatigue_func,
p_person->cost
);
p_person = p_person->next;
}
printf("total cost = %f\n", total_cost);
}