2011|08|
2013|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|05|06|07|08|09|10|11|12|
2016|01|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|

2017-07-03 「上司の帰宅が遅れると、部下の帰宅も遅れる」の仮説検証プログラム [長年日記]

/*
  g++ -g seat4.cpp -o seat4
*/
 
/*
  「上司の帰宅が遅れると、部下の帰宅も遅れる」の仮説検証プログラム
*/
 
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
 
// 共通関数
double max(double a){
  return a;
}
 
double max(double a, double b){
  if (a > b) 
    return a;
  else 
    return b;
};
 
double max(double a, double b, double c ){
  return max(max(a,b), max(b,c)); 
};
 
double max(double a, double b, double c, double d ){
  return max(max(a,b,c), d); 
};
 
double min(double a){
  return a;
}
 
double min(double a, double b){
  if (b > a) 
    return a;
  else 
    return b;
};
 
double min(double a, double b, double c ){
  return min(min(a,b), min(b,c)); 
};
 
double min(double a, double b, double c, double d ){
  return min(min(a,b,c), d); 
};
 
 
// ファジィ表現
typedef enum scale {LESSLESS, LESS, ZERO, MORE, MOREMORE} SCALE;
 
// 前件部メンバーシップ関数(山3つ)クラス
class condition_MF3
{
private:
  double center;
  double width;
  SCALE express;
  
public:
  condition_MF3(double _center, double _witdth, SCALE _express){
    center = _center;
    width = _witdth;
    express = _express;
    
    // 使用できないファジィ表現を使った場合は止める        
    if ((express == LESSLESS) || (express == MOREMORE)){
      printf("wrong expression used \n");
      exit(0);
    }
    
  };
  double func(double _x);
};
 
double condition_MF3::func(double _x)
{
  // x,yは、メンバーシップ関数上の座標を示す
  double x = _x;
  double y = 0.0; // yの値は、必ず0以上1以下になる
  
  if (express == LESS){
    if (x <= center - width){
      y = 1.0;
    }
    else if (x <= center){
      y = - 1.0 / width * (x - center);
    }
    else{
      y = 0.0;
    }
  }
  else if (express == ZERO){
    if (x <= center - width){
      y = 0.0;
    }
    else if (x <= center){
      y = 1.0 / width * (x - center) + 1.0;
    }
    else if (x <= center + width){
      y = -1.0 / width * (x - center) + 1.0;
    }
    else{
      y = 0.0;
    }
  }
  else if (express == MORE){
    if (x <= center){
      y = 0.0;
    }
    else if (x <= center + width){
      y = 1.0 / width * (x - center);
    }
    else{
      y = 1.0;
    }
  }
  else {
    printf("wrong expression\n");
    exit(1);
  }
  
  return y;
};
 
// 前件部メンバーシップ関数(山5つ)クラス
class condition_MF5
{
private:
  double center;
  double width;
  SCALE express;
  
public:
  condition_MF5(double _center, double _witdth, SCALE _express){
    center = _center;
    width = _witdth;
    express = _express;
  };
  double func(double _x);
};
 
 
double condition_MF5::func(double _x)
{
  // x,yは、メンバーシップ関数上の座標を示す
  double x = _x;
  double y = 0.0; // yの値は、必ず0以上1以下になる
  
  if (express == LESSLESS){
    if (x <= center - 2.0 * width){
      y = 1.0;
    }
    else if (x <= center - width){
      y = - 1.0 / width * (x - (center - 2.0 * width)) + 1.0;
    }
    else{
      y = 0.0;
    }
  }
  else if (express == LESS){
    if (x <= center - 2.0 * width){
      y = 0.0;
    }
    else if (x <= center - width){
      y = 1.0 / width * (x - (center - width)) + 1.0;
    }
    else if (x <= center){
      y = -1.0 / width * (x - (center - width)) + 1.0; 
    }
    else{
      y = 0.0;
    }
  }
  else if (express == ZERO){
    if (x <= center - width){
      y = 0.0;
    }
    else if (x <= center){
      y = 1.0 / width * (x - center) + 1.0;
    }
    else if (x <= center + width){
      y = -1.0 / width * (x - center) + 1.0;
    }
    else{
      y = 0.0;
    }
  }
  else if (express == MORE){
    if (x <= center){
      y = 0.0;
    }
    else if (x <= center + width){
      y = 1.0 / width * (x - (center + width)) + 1.0;
    }
    else if (x <= center + 2.0 * width){
      y = -1.0 / width * (x - (center + width)) + 1.0; 
    }
    else{
      y = 0.0;
    }
  }
  else if (express == MOREMORE){
    if (x <= center + width){
      y = 0.0;
    }
    else if (x <= center + 2.0 * width){
      y = 1.0 / width * (x - (center + 2.0 * width)) + 1.0;
    }
    else{
      y = 1.0;
    }
  }
  
  return y;
};
 
// 後件部メンバーシップ関数(山3つ)クラス  
class action_MF3
{
private:
  double center;
  double width;
  SCALE express;
  
  double x;
  double y;
  
public:
  action_MF3(double _center, double _witdth, SCALE _express){
    
    y = 0.0; // yの値は、必ず0以上1以下になる
    
    center = _center;
    width = _witdth;
    express = _express;
    
    if (express == LESS){
      x = center - width;
    }
    else if (express == ZERO){
      x = center;
    }
    else if (express == MORE){
      x = center + width;
    }
    else{
      printf("wrong scale expression\n");
      exit(0);
    }
  };
 
  // Y座標の値を最大値で更新する  
  void func_Max(double b){
    y = max(b, y);
  };
  
  // Y座標の値をリセット(y=0)する
  void func_Reset(){
    y = 0.0;
  };
  
  // X座標を返す
  double func_X(void){
    return x;
  };
  
  // (最大値で更新された、最後の)Y座標を返す
  double func_Y(){
    return y;
  };
 
};
 
// 後件部メンバーシップ関数(山5つ)クラス  
class action_MF5
{
private:
  double center;
  double width;
  SCALE express;
  
  double x;
  double y;
  
public:
  action_MF5(double _center, double _witdth, SCALE _express){
    y = 0.0; // yの値は、必ず0以上1以下になる
    
    center = _center;
    width = _witdth;
    express = _express;
    
    if (express == LESSLESS){
      x = center - 2.0 * width;
    }
    else if (express == LESS){
      x = center - width;
    }
    else if (express == ZERO){
      x = center;
    }
    else if (express == MORE){
      x = center + width;
    }
    else if (express == MOREMORE){
      x = center + 2.0 * width;
    }
    else{
      printf("wrong scale expression\n");
      exit(-1); // 強制終了
    }
  };
  
  // Y座標の値を最大値で更新する  
  void func_Max(double b){
    y = max(b, y);
  };
  
  // Y座標の値をリセット(y=0)する
  void func_Reset(){
    y = 0.0;
  };
  
  // X座標を返す
  double func_X(void){
    return x;
  };
  
  // (最大値で更新された、最後の)Y座標を返す
  double func_Y(){
    return y;
  };
  
};
 
typedef enum post{
  HEAD = 1,  // 部長
  CHIEF = 2, // 課長
  STAFF = 3  // 平社員
} POST;
 
typedef struct person{
  int absences;  // 0:帰宅、 1:残業
  char name[10];
  int section;
  int number;
  POST post;
  double p_x;
  double p_y;
  double expected_return_time;  // 17.5(17:30)から、21.0(21:00)までの時間)
  double going_home_ratio;
} PERSON;
 
const int SECTION = 6;
const int MEMBER = 8;
const int ALL_PERSON_COUNTER = 49; // 6つの課、それぞれ8人と部長
 
PERSON person[] = {
 
  {1,"部長",-1,-1, HEAD,   0.0,             0.0},
 
  {1,"社員", 0, 0, STAFF,  3.5 + 0.0 + 0.0, -4.4 + 0.0 + 0.0},
  {1,"社員", 0, 1, STAFF,  3.5 + 0.0 + 1.2, -4.4 + 0.0 + 0.0},
  {1,"社員", 0, 2, STAFF,  3.5 + 0.0 + 2.4, -4.4 + 0.0 + 0.0},
  {1,"社員", 0, 3, STAFF,  3.5 + 0.0 + 3.6, -4.4 + 0.0 + 0.0},
  {1,"課長", 0, 4, CHIEF,  3.5 + 0.0 + 0.0, -4.4 + 0.0 + 2.0},
  {1,"社員", 0, 5, STAFF,  3.5 + 0.0 + 1.2, -4.4 + 0.0 + 2.0},
  {1,"社員", 0, 6, STAFF,  3.5 + 0.0 + 2.4, -4.4 + 0.0 + 2.0},
  {1,"社員", 0, 7, STAFF,  3.5 + 0.0 + 3.6, -4.4 + 0.0 + 2.0},
 
  {1,"社員", 1, 0, STAFF,  3.5 + 4.8 + 0.0, -4.4 + 0.0 + 0.0},
  {1,"社員", 1, 1, STAFF,  3.5 + 4.8 + 1.2, -4.4 + 0.0 + 0.0},
  {1,"社員", 1, 2, STAFF,  3.5 + 4.8 + 2.4, -4.4 + 0.0 + 0.0},
  {1,"課長", 1, 3, CHIEF,  3.5 + 4.8 + 3.6, -4.4 + 0.0 + 0.0},
  {1,"社員", 1, 4, STAFF,  3.5 + 4.8 + 0.0, -4.4 + 0.0 + 2.0},
  {1,"社員", 1, 5, STAFF,  3.5 + 4.8 + 1.2, -4.4 + 0.0 + 2.0},
  {1,"社員", 1, 6, STAFF,  3.5 + 4.8 + 2.4, -4.4 + 0.0 + 2.0},
  {1,"社員", 1, 7, STAFF,  3.5 + 4.8 + 3.6, -4.4 + 0.0 + 2.0},
 
  {1,"社員", 2, 0, STAFF,  3.5 + 0.0 + 0.0, -4.4 + 3.4 + 0.0},
  {1,"社員", 2, 1, STAFF,  3.5 + 0.0 + 1.2, -4.4 + 3.4 + 0.0},
  {1,"課長", 2, 2, CHIEF,  3.5 + 0.0 + 2.4, -4.4 + 3.4 + 0.0},
  {1,"社員", 2, 3, STAFF,  3.5 + 0.0 + 3.6, -4.4 + 3.4 + 0.0},
  {1,"社員", 2, 4, STAFF,  3.5 + 0.0 + 0.0, -4.4 + 3.4 + 2.0},
  {1,"社員", 2, 5, STAFF,  3.5 + 0.0 + 1.2, -4.4 + 3.4 + 2.0},
  {1,"社員", 2, 6, STAFF,  3.5 + 0.0 + 2.4, -4.4 + 3.4 + 2.0},
  {1,"社員", 2, 7, STAFF,  3.5 + 0.0 + 3.6, -4.4 + 3.4 + 2.0},
 
  {1,"社員", 3, 0, STAFF,  3.5 + 4.8 + 0.0, -4.4 + 3.4 + 0.0},
  {1,"社員", 3, 1, STAFF,  3.5 + 4.8 + 1.2, -4.4 + 3.4 + 0.0},
  {1,"社員", 3, 2, STAFF,  3.5 + 4.8 + 2.4, -4.4 + 3.4 + 0.0},
  {1,"社員", 3, 3, STAFF,  3.5 + 4.8 + 3.6, -4.4 + 3.4 + 0.0},
  {1,"社員", 3, 4, STAFF,  3.5 + 4.8 + 0.0, -4.4 + 3.4 + 2.0},
  {1,"社員", 3, 5, STAFF,  3.5 + 4.8 + 1.2, -4.4 + 3.4 + 2.0},
  {1,"課長", 3, 6, CHIEF,  3.5 + 4.8 + 2.4, -4.4 + 3.4 + 2.0},
  {1,"社員", 3, 7, STAFF,  3.5 + 4.8 + 3.6, -4.4 + 3.4 + 2.0},
 
  {1,"課長", 4, 0, CHIEF,  3.5 + 0.0 + 0.0, -4.4 + 6.8 + 0.0},
  {1,"社員", 4, 1, STAFF,  3.5 + 0.0 + 1.2, -4.4 + 6.8 + 0.0},
  {1,"社員", 4, 2, STAFF,  3.5 + 0.0 + 2.4, -4.4 + 6.8 + 0.0},
  {1,"社員", 4, 3, STAFF,  3.5 + 0.0 + 3.6, -4.4 + 6.8 + 0.0},
  {1,"社員", 4, 4, STAFF,  3.5 + 0.0 + 0.0, -4.4 + 6.8 + 2.0},
  {1,"社員", 4, 5, STAFF,  3.5 + 0.0 + 1.2, -4.4 + 6.8 + 2.0},
  {1,"社員", 4, 6, STAFF,  3.5 + 0.0 + 2.4, -4.4 + 6.8 + 2.0},
  {1,"社員", 4, 7, STAFF,  3.5 + 0.0 + 3.6, -4.4 + 6.8 + 2.0},
 
  {1,"社員", 5, 0, STAFF,  3.5 + 4.8 + 0.0, -4.4 + 6.8 + 0.0},
  {1,"社員", 5, 1, STAFF,  3.5 + 4.8 + 1.2, -4.4 + 6.8 + 0.0},
  {1,"社員", 5, 2, STAFF,  3.5 + 4.8 + 2.4, -4.4 + 6.8 + 0.0},
  {1,"社員", 5, 3, STAFF,  3.5 + 4.8 + 3.6, -4.4 + 6.8 + 0.0},
  {1,"課長", 5, 4, CHIEF,  3.5 + 4.8 + 0.0, -4.4 + 6.8 + 2.0},
  {1,"社員", 5, 5, STAFF,  3.5 + 4.8 + 1.2, -4.4 + 6.8 + 2.0},
  {1,"社員", 5, 6, STAFF,  3.5 + 4.8 + 2.4, -4.4 + 6.8 + 2.0},
  {1,"社員", 5, 7, STAFF,  3.5 + 4.8 + 3.6, -4.4 + 6.8 + 2.0},
};
 
double distance(PERSON* person1, PERSON* person2)
{
  double d = 0.0;
  
  d  = pow((person1->p_x - person2->p_x),2.0);
  d += pow((person1->p_y - person2->p_y),2.0);
  d = sqrt(d);
 
  if ((person1->absences == 0) || (person2->absences == 0) )
    d = 99999.9; // どちらかが不在であれば、非常に大きい距離になる
 
  return d;
}
 
int main()
{
  PERSON* cheif[SECTION+1]; 
 
  // 初期状態 (最初は個人の帰宅時間は、乱数で設定)
  for (int i = 0; i < ALL_PERSON_COUNTER; i++){
    // 各個人の帰宅時間を設定
    person[i].expected_return_time = 17.5 + (21.0 -17.5) * rand()/ (1.0 + RAND_MAX);
    //person[i].expected_return_time = 18.5;
 
    // 各課の課長を選定(後で探すのが面倒なので)
    if (person[i].post == CHIEF){
      cheif[person[i].section] = &person[i];
    }
  }
 
  person[0].expected_return_time = 22.0;
 
  /*
  for (int i = 0; i < ALL_PERSON_COUNTER; i++){
    printf("%d, expected_return_time = %f\n",i, person[i].expected_return_time);
    printf("%d, expected_return_time = %d\n",i, person[i].absences);
  }
  */
 
  // 残業時間
  condition_MF3 OverTime_Short(1.0, 1.0, LESS); // 1時間
  condition_MF3 OverTime_Middle(1.0, 1.0, ZERO); // 2時間
  condition_MF3 OverTime_Long(1.0, 1.0, MORE); // 3時間
 
  // 部長からの距離
  condition_MF5 DistanceFrom_HEAD_NearNear(5.0, 5.0, LESSLESS); // 5メートル
  condition_MF5 DistanceFrom_HEAD_Near(5.0, 5.0, LESS); // 10メートル
  condition_MF5 DistanceFrom_HEAD_Middle(5.0, 5.0, ZERO); // 15メートル
  condition_MF5 DistanceFrom_HEAD_Far(5.0, 5.0, MORE); // 20メートル
  condition_MF5 DistanceFrom_HEAD_FarFar(5.0, 5.0, MOREMORE); // 25メートル
 
  // 課長からの距離
  condition_MF5 DistanceFrom_CHIEF_NearNear(1.0, 1.0, LESSLESS); // 1メートル
  condition_MF5 DistanceFrom_CHIEF_Near(1.0, 1.0, LESS); // 2メートル
  condition_MF5 DistanceFrom_CHIEF_Middle(1.0, 1.0, ZERO); // 3メートル
  condition_MF5 DistanceFrom_CHIEF_Far(1.0, 1.0, MORE); // 4メートル
  condition_MF5 DistanceFrom_CHIEF_FarFar(1.0, 1.0, MOREMORE); // 5メートル
 
  // 残っている課の人数
  condition_MF3 Staying_COUNT_Less(2, 2, LESS); // 2人
  condition_MF3 Staying_COUNT_Middle(2, 2, ZERO); // 4人
  condition_MF3 Staying_COUNT_Many(2, 2, MORE); // 6人
 
  // 帰宅度数
  action_MF3 GoingHome_Hard(0.5, 0.5, LESS);// 帰宅度数 0.0 → 帰宅できない
  action_MF3 GoingHome_Middle(0.5, 0.5, ZERO);// 帰宅度数 0.5 → 迷う
  action_MF3 GoingHome_Easy(0.5, 0.5, MORE);// 帰宅度数 1.0 → 帰宅できる
 
  double present_time =17.5;
 
  while (present_time < 24.0){
    present_time += 0.1; // 一番後ろで加算すると忘れそうなので
    //  printf("present_time = %f\n",  present_time);
 
    // 部の中の課の全体状況の把握
 
    if (person[0].expected_return_time < present_time){  // 部長は特別あつかい
      person[0].absences = 0;
    }
 
    int staying_count[SECTION] ={}; // 各課(Section)で残っている人数を格納(最初はゼロリセット)
    
    int staying_all = 0;
 
    for (int i = 0; i < ALL_PERSON_COUNTER; i++){
      if (person[i].absences == 1){
        staying_count[person[i].section] += 1;  // (Section)に一人追加
        staying_all += 1;
      }
    }
 
    printf("%f,%d,%d,%d,%d,%d,%d,%d\n", 
           present_time, 
           staying_count[0],
           staying_count[1],
           staying_count[2],
           staying_count[3],
           staying_count[4],
           staying_count[5],
           staying_all);
    
    for (int i = 1; i < ALL_PERSON_COUNTER; i++){ // person[0]の部長は神様→誰からも影響を受けない(とする)
 
#if 1
      if (person[i].absences == 0) // 帰った人間はどーでも良い
        continue;
 
      if (person[i].expected_return_time > present_time) // 仕事中は帰らない
        continue;
#endif
 
      if (person[i].post == STAFF){ // (ヒラ)社員の場合の付加条件
        /*
          ルール3
          課長が残っている場合、課長から1.5m以内のメンバは、帰宅度数0.0
          課長から3.0m以内のメンバは、帰宅度数0.5
          課長から4.5m以内のメンバは、帰宅度数0.7
        */
        
        double dis = distance(cheif[person[i].section], &person[i]);
 
        ///////////////
        double r11 = min(DistanceFrom_CHIEF_NearNear.func(dis), 
                         OverTime_Short.func(person[i].expected_return_time - present_time));
        GoingHome_Hard.func_Max(r11);
 
        double r12 = min(DistanceFrom_CHIEF_Near.func(dis), 
                         OverTime_Short.func(person[i].expected_return_time - present_time));
        GoingHome_Hard.func_Max(r12);
 
        double r13 = min(DistanceFrom_CHIEF_Middle.func(dis), 
                         OverTime_Short.func(person[i].expected_return_time - present_time));
        GoingHome_Hard.func_Max(r13);
 
        double r14 = min(DistanceFrom_CHIEF_Far.func(dis), 
                         OverTime_Short.func(person[i].expected_return_time - present_time));
        GoingHome_Middle.func_Max(r14);
 
        double r15 = min(DistanceFrom_CHIEF_FarFar.func(dis), 
                         OverTime_Short.func(person[i].expected_return_time - present_time));
        GoingHome_Easy.func_Max(r15);
        ///////////////
 
        ///////////////
        double r21 = min(DistanceFrom_CHIEF_NearNear.func(dis), 
                         OverTime_Middle.func(person[i].expected_return_time - present_time));
        GoingHome_Hard.func_Max(r21);
 
        double r22 = min(DistanceFrom_CHIEF_Near.func(dis), 
                         OverTime_Middle.func(person[i].expected_return_time - present_time));
        GoingHome_Hard.func_Max(r22);
 
        double r23 = min(DistanceFrom_CHIEF_Middle.func(dis), 
                         OverTime_Middle.func(person[i].expected_return_time - present_time));
        GoingHome_Middle.func_Max(r23);
 
        double r24 = min(DistanceFrom_CHIEF_Far.func(dis), 
                         OverTime_Middle.func(person[i].expected_return_time - present_time));
        GoingHome_Easy.func_Max(r24);
 
        double r25 = min(DistanceFrom_HEAD_FarFar.func(dis), 
                         OverTime_Middle.func(person[i].expected_return_time - present_time));
        GoingHome_Easy.func_Max(r25);
        ///////////////
 
        ///////////////
        double r31 = min(DistanceFrom_CHIEF_NearNear.func(dis), 
                         OverTime_Long.func(person[i].expected_return_time - present_time));
        GoingHome_Hard.func_Max(r31);
 
        double r32 = min(DistanceFrom_CHIEF_Near.func(dis), 
                         OverTime_Long.func(person[i].expected_return_time - present_time));
        GoingHome_Middle.func_Max(r32);
 
        double r33 = min(DistanceFrom_CHIEF_Middle.func(dis), 
                         OverTime_Long.func(person[i].expected_return_time - present_time));
        GoingHome_Easy.func_Max(r33);
 
        double r34 = min(DistanceFrom_CHIEF_Far.func(dis), 
                         OverTime_Long.func(person[i].expected_return_time - present_time));
        GoingHome_Easy.func_Max(r34);
 
        double r35 = min(DistanceFrom_CHIEF_FarFar.func(dis), 
                         OverTime_Long.func(person[i].expected_return_time - present_time));
        GoingHome_Easy.func_Max(r34);
        ///////////////
      }
 
 
      if (person[i].post == CHIEF){ // 課長の場合の付加条件
        /*
          ルール2
          部長が残っている場合、部長から5m以内の課長は、帰宅度数0.0
          5m~10m以内の課長は、帰宅度数0.5
          10m以上の課長は、帰宅度数1.0
        */
        
        double dis = distance(&person[0], &person[i]);
        
        ///////////////
        double r11 = min(DistanceFrom_HEAD_NearNear.func(dis), 
                         OverTime_Short.func(person[i].expected_return_time - present_time));
        GoingHome_Hard.func_Max(r11);
 
        double r12 = min(DistanceFrom_HEAD_Near.func(dis), 
                         OverTime_Short.func(person[i].expected_return_time - present_time));
        GoingHome_Hard.func_Max(r12);
 
        double r13 = min(DistanceFrom_HEAD_Middle.func(dis), 
                         OverTime_Short.func(person[i].expected_return_time - present_time));
        GoingHome_Hard.func_Max(r13);
 
        double r14 = min(DistanceFrom_HEAD_Far.func(dis), 
                         OverTime_Short.func(person[i].expected_return_time - present_time));
        GoingHome_Middle.func_Max(r14);
 
        double r15 = min(DistanceFrom_HEAD_FarFar.func(dis), 
                         OverTime_Short.func(person[i].expected_return_time - present_time));
        GoingHome_Easy.func_Max(r15);
        ///////////////
 
        ///////////////
        double r21 = min(DistanceFrom_HEAD_NearNear.func(dis), 
                         OverTime_Middle.func(person[i].expected_return_time - present_time));
        GoingHome_Hard.func_Max(r21);
 
        double r22 = min(DistanceFrom_HEAD_Near.func(dis), 
                         OverTime_Middle.func(person[i].expected_return_time - present_time));
        GoingHome_Hard.func_Max(r22);
 
        double r23 = min(DistanceFrom_HEAD_Middle.func(dis), 
                         OverTime_Middle.func(person[i].expected_return_time - present_time));
        GoingHome_Middle.func_Max(r23);
 
        double r24 = min(DistanceFrom_HEAD_Far.func(dis), 
                         OverTime_Middle.func(person[i].expected_return_time - present_time));
        GoingHome_Easy.func_Max(r24);
 
        double r25 = min(DistanceFrom_HEAD_FarFar.func(dis), 
                         OverTime_Middle.func(person[i].expected_return_time - present_time));
        GoingHome_Easy.func_Max(r25);
        ///////////////
 
        ///////////////
        double r31 = min(DistanceFrom_HEAD_NearNear.func(dis), 
                         OverTime_Long.func(person[i].expected_return_time - present_time));
        GoingHome_Hard.func_Max(r31);
 
        double r32 = min(DistanceFrom_HEAD_Near.func(dis), 
                         OverTime_Long.func(person[i].expected_return_time - present_time));
        GoingHome_Middle.func_Max(r32);
 
        double r33 = min(DistanceFrom_HEAD_Middle.func(dis), 
                         OverTime_Long.func(person[i].expected_return_time - present_time));
        GoingHome_Easy.func_Max(r33);
 
        double r34 = min(DistanceFrom_HEAD_Far.func(dis), 
                         OverTime_Long.func(person[i].expected_return_time - present_time));
        GoingHome_Easy.func_Max(r34);
 
        double r35 = min(DistanceFrom_HEAD_FarFar.func(dis), 
                         OverTime_Long.func(person[i].expected_return_time - present_time));
        GoingHome_Easy.func_Max(r34);
        ///////////////
      }
      
 
#if 0     
      /*
        ルール4
        同じ課のメンバのの人数が、6人以上残っている場合は、帰宅度数0.3
                              4人残っている場合は、帰宅度数0.6
                              2人以下の場合は、帰宅度数1.0
      */
 
      int num = staying_count[person[i].section];
      double r41 = min(Staying_COUNT_Less.func((double)num));
      GoingHome_Easy.func_Max(r41);
      
      double r42 = min(Staying_COUNT_Middle.func((double)num));
      GoingHome_Middle.func_Max(r42);
      
      double r43 = min(Staying_COUNT_Many.func((double)num));
      GoingHome_Hard.func_Max(r43);
 
#endif
 
      /*
        ルールに振れない場合は、min-max重心法の分母がゼロになり、
        ゼロ割が発生する場合がある為、それを回避する
      */
      double denominator =  // 分母
        GoingHome_Easy.func_Y() + 
        GoingHome_Middle.func_Y() +
        GoingHome_Hard.func_Y();
 
      double numerator =  // 分子   
        GoingHome_Easy.func_X() * GoingHome_Easy.func_Y() + 
        GoingHome_Middle.func_X() * GoingHome_Middle.func_Y() +
        GoingHome_Hard.func_X() * GoingHome_Hard.func_Y();
 
      // 推論結果 (分母がゼロの場合は、推論結果は前回と同値とする)
      if ( denominator != 0.0){
        person[i].going_home_ratio =  numerator / denominator ;
 
        /*
        if ((present_time >= 18.5) && (present_time < 18.52)){
          printf("%d: person[i].going_home_ratio=%f\n",i, person[i].going_home_ratio);
        }
        */
 
      }      
 
      if (person[i].going_home_ratio > 0.75){
        person[i].absences = 0;  // 0:帰宅、 1:残業        
      }
 
      // 後件部メンバーシップ関数のリセット(ループさせる時は必ずリセットする)
      GoingHome_Easy.func_Reset();
      GoingHome_Middle.func_Reset();
      GoingHome_Hard.func_Reset();
    }
  }
 
  /*
  for (int i = 0; i < ALL_PERSON_COUNTER; i++){
    printf("%d, absences = %d\n",i, person[i].absences);
  }
  */
  
  return 0;
}
 

2017-07-02 特許出願の審査経緯を見たい時の手続 [長年日記]

(Step.2) 自分の名前を入れて「検索」をクリックする

(Step.3) 「一覧表示」をクリックする

(Step.4) ターゲットの特許出願をクリックする

(Step.5) 「経過情報」をクリックする

(Step.6) 「審査書類情報」をクリックする

(Step.7) 参照可能書類リストから、ターゲットのもの(例:"2016/02/23 :拒絶理由通知書")をクリックする

例えば、「意見書」とか「拒絶理由通知書」とか「手続補正書」とかを読める

(もちろん、「みなし取り下げ」になっている出願については、何も出ていこない)

以上


2017-06-27 EMOBILE GP02 動かない [長年日記]

_ 電源抜いてもダメな時は、リセットボタンで戻ることがある

http://qa.nifty.com/cs/catalog/faq_nqa/qid_14105/1.htm?smptopc


2017-06-19 「デジタルアクティブ」比率計算シミュレータ [長年日記]

/*
  gcc -g birth_digital_active.cpp -o birth_digital_active
*/
 
/*
  デジタルネイティブ/デジタルアクティブ
 
  1992年生まれから人口の100%がディジタルネイティブになったと仮定する。
  Q:日本のデジタルネイティブの比率は、どう変化していくだろうか
  
 
*/
 
#include "stdio.h"
 
int main(int argc, char* argv[])
{
    double men[101],women[101]; // 年齢別人口 平成22年データ 単位は1000人
    double men_death_rate[101],women_death_rate[101]; // 死亡率 平成22年データ (資料  厚生労働省大臣官房統計情報部人口動態・保健統計課「人口動態統計」)                          
    // ファイルデバイスとデータ形式の統一回避する為、データべた書き
 
    men[ 0]=549   ; men_death_rate[ 0]=2.5/1000.0   ; // 男性0歳人口549千人、死亡率0.25% 2012年生まれ
    men[ 1]=535   ; men_death_rate[ 1]=0.4/1000.0   ; //2011年生まれ
    men[ 2]=535   ; men_death_rate[ 2]=0.2/1000.0   ; //2010年生まれ    
    men[ 3]=550   ; men_death_rate[ 3]=0.2/1000.0   ;   
    men[ 4]=548   ; men_death_rate[ 4]=0.2/1000.0   ;
 
    men[ 5]=544   ; men_death_rate[ 5]=0.1/1000.0   ;
    men[ 6]=542   ; men_death_rate[ 6]=0.1/1000.0   ;
    men[ 7]=562   ; men_death_rate[ 7]=0.1/1000.0   ;
    men[ 8]=574   ; men_death_rate[ 8]=0.1/1000.0   ;
    men[ 9]=589   ; men_death_rate[ 9]=0.1/1000.0   ; //2003年生まれ    
 
    men[10]=597   ; men_death_rate[10]=0.1/1000.0   ; //2002年生まれ    
    men[11]=604   ; men_death_rate[11]=0.1/1000.0   ;
    men[12]=604   ; men_death_rate[12]=0.1/1000.0   ;
    men[13]=613   ; men_death_rate[13]=0.1/1000.0   ;
    men[14]=610   ; men_death_rate[14]=0.1/1000.0   ;
 
    men[15]=607   ; men_death_rate[15]=0.3/1000.0   ;
    men[16]=627   ; men_death_rate[16]=0.3/1000.0   ;
    men[17]=632   ; men_death_rate[17]=0.3/1000.0   ;
    men[18]=621   ; men_death_rate[18]=0.3/1000.0   ; //1990年生まれ (ここまでが、ディタルネイティブ)    
    men[19]=631   ; men_death_rate[19]=0.3/1000.0   ;
 
    men[20]=623   ; men_death_rate[20]=0.6/1000.0   ; //1992年生まれ    
    men[21]=632   ; men_death_rate[21]=0.6/1000.0   ;
    men[22]=648   ; men_death_rate[22]=0.6/1000.0   ;
    men[23]=668   ; men_death_rate[23]=0.6/1000.0   ;
    men[24]=683   ; men_death_rate[24]=0.6/1000.0   ;
 
    men[25]=697   ; men_death_rate[25]=0.7/1000.0   ;
    men[26]=723   ; men_death_rate[26]=0.7/1000.0   ;
    men[27]=745   ; men_death_rate[27]=0.7/1000.0   ;
    men[28]=754   ; men_death_rate[28]=0.7/1000.0   ;
    men[29]=754   ; men_death_rate[29]=0.7/1000.0   ;
 
    men[30]=764   ; men_death_rate[30]=0.8/1000.0   ;
    men[31]=797   ; men_death_rate[31]=0.8/1000.0   ;
    men[32]=818   ; men_death_rate[32]=0.8/1000.0   ;
    men[33]=852   ; men_death_rate[33]=0.8/1000.0   ;
    men[34]=873   ; men_death_rate[34]=0.8/1000.0   ;
 
    men[35]=917   ; men_death_rate[35]=1.0/1000.0   ;
    men[36]=960   ; men_death_rate[36]=1.0/1000.0   ;
    men[37]=1012  ; men_death_rate[37]=1.0/1000.0   ;
    men[38]=1028  ; men_death_rate[38]=1.0/1000.0   ;
    men[39]=1010  ; men_death_rate[39]=1.0/1000.0   ;
 
    men[40]=982   ; men_death_rate[40]=1.5/1000.0   ;
    men[41]=954   ; men_death_rate[41]=1.5/1000.0   ;
    men[42]=937   ; men_death_rate[42]=1.5/1000.0   ;
    men[43]=916   ; men_death_rate[43]=1.5/1000.0   ;
    men[44]=915   ; men_death_rate[44]=1.5/1000.0   ;
 
    men[45]=713   ; men_death_rate[45]=2.4/1000.0   ;
    men[46]=882   ; men_death_rate[46]=2.4/1000.0   ;
    men[47]=826   ; men_death_rate[47]=2.4/1000.0   ;
    men[48]=805   ; men_death_rate[48]=2.4/1000.0   ;
    men[49]=778   ; men_death_rate[49]=2.4/1000.0   ;
 
    men[50]=765   ; men_death_rate[50]=3.8/1000.0   ;
    men[51]=770   ; men_death_rate[51]=3.8/1000.0   ;
    men[52]=783   ; men_death_rate[52]=3.8/1000.0   ;
    men[53]=761   ; men_death_rate[53]=3.8/1000.0   ;
    men[54]=740   ; men_death_rate[54]=3.8/1000.0   ;
 
    men[55]=776   ; men_death_rate[55]=6.3/1000.0   ;
    men[56]=803   ; men_death_rate[56]=6.3/1000.0   ;
    men[57]=803   ; men_death_rate[57]=6.3/1000.0   ;
    men[58]=850   ; men_death_rate[58]=6.3/1000.0   ;
    men[59]=896   ; men_death_rate[59]=6.3/1000.0   ;
 
    men[60]=949   ; men_death_rate[60]=9.3/1000.0   ;
    men[61]=1018  ; men_death_rate[61]=9.3/1000.0   ;
    men[62]=1111  ; men_death_rate[62]=9.3/1000.0   ;
    men[63]=1099  ; men_death_rate[63]=9.3/1000.0   ;
    men[64]=1042  ; men_death_rate[64]=9.3/1000.0   ;
 
    men[65]=645   ; men_death_rate[65]=14.6/1000.0   ;
    men[66]=684   ; men_death_rate[66]=14.6/1000.0   ;
    men[67]=825   ; men_death_rate[67]=14.6/1000.0   ;
    men[68]=794   ; men_death_rate[68]=14.6/1000.0   ;
    men[69]=809   ; men_death_rate[69]=14.6/1000.0   ;
 
    men[70]=780   ; men_death_rate[70]=22.7/1000.0   ;
    men[71]=698   ; men_death_rate[71]=22.7/1000.0   ;
    men[72]=599   ; men_death_rate[72]=22.7/1000.0   ;
    men[73]=627   ; men_death_rate[73]=22.7/1000.0   ;
    men[74]=631   ; men_death_rate[74]=22.7/1000.0   ;
 
    men[75]=616   ; men_death_rate[75]=39.6/1000.0   ;
    men[76]=571   ; men_death_rate[76]=39.6/1000.0   ;
    men[77]=521   ; men_death_rate[77]=39.6/1000.0   ;
    men[78]=501   ; men_death_rate[78]=39.6/1000.0   ;
    men[79]=470   ; men_death_rate[79]=39.6/1000.0   ;
 
    men[80]=430   ; men_death_rate[80]=70.5/1000.0   ;
    men[81]=385   ; men_death_rate[81]=70.5/1000.0   ;
    men[82]=350   ; men_death_rate[82]=70.5/1000.0   ;
    men[83]=316   ; men_death_rate[83]=70.5/1000.0   ;
    men[84]=281   ; men_death_rate[84]=70.5/1000.0   ;
 
    men[85]=247   ; men_death_rate[85]=120.3/1000.0   ;
    men[86]=202   ; men_death_rate[86]=120.3/1000.0   ;
    men[87]=158   ; men_death_rate[87]=120.3/1000.0   ;
    men[88]=122   ; men_death_rate[88]=120.3/1000.0   ;
    men[89]=98    ; men_death_rate[89]=120.3/1000.0   ;
 
    men[90]=78    ; men_death_rate[90]=202.5/1000.0   ;
    men[91]=67    ; men_death_rate[91]=202.5/1000.0   ;
    men[92]=44    ; men_death_rate[92]=202.5/1000.0   ;
    men[93]=36    ; men_death_rate[93]=202.5/1000.0   ;
    men[94]=28    ; men_death_rate[94]=202.5/1000.0   ;
 
    men[95]=21    ; men_death_rate[95]=318.8/1000.0   ;
    men[96]=15    ; men_death_rate[96]=318.8/1000.0   ;
    men[97]=11    ; men_death_rate[97]=318.8/1000.0   ;
    men[98]=7     ; men_death_rate[98]=318.8/1000.0   ;
    men[99]=5     ; men_death_rate[99]=318.8/1000.0   ;
 
    women[ 0]=520; women_death_rate[ 0]=2.1/1000.0   ;// 女性0歳人口520千人、死亡率0.21%
    women[ 1]=510; women_death_rate[ 1]=0.4/1000.0   ;
    women[ 2]=511; women_death_rate[ 2]=0.2/1000.0   ;
    women[ 3]=525; women_death_rate[ 3]=0.1/1000.0   ;
    women[ 4]=522; women_death_rate[ 4]=0.1/1000.0   ;
 
    women[ 5]=518; women_death_rate[ 5]=0.1/1000.0   ;
    women[ 6]=517; women_death_rate[ 6]=0.1/1000.0   ;
    women[ 7]=538; women_death_rate[ 7]=0.1/1000.0   ;
    women[ 8]=545; women_death_rate[ 8]=0.1/1000.0   ;
    women[ 9]=561; women_death_rate[ 9]=0.1/1000.0   ;
 
    women[10]=568; women_death_rate[10]=0.1/1000.0   ;
    women[11]=573; women_death_rate[11]=0.1/1000.0   ;
    women[12]=576; women_death_rate[12]=0.1/1000.0   ;
    women[13]=585; women_death_rate[13]=0.1/1000.0   ;
    women[14]=583; women_death_rate[14]=0.1/1000.0   ;
 
    women[15]=578; women_death_rate[15]=0.2/1000.0   ;
    women[16]=595; women_death_rate[16]=0.2/1000.0   ;
    women[17]=597; women_death_rate[17]=0.2/1000.0   ;
    women[18]=589; women_death_rate[18]=0.2/1000.0   ;//1990年生まれ (ここまでが、ディタルネイティブ)    
    women[19]=599; women_death_rate[19]=0.2/1000.0   ;
 
    women[20]=596; women_death_rate[20]=0.3/1000.0   ;
    women[21]=605; women_death_rate[21]=0.3/1000.0   ;
    women[22]=622; women_death_rate[22]=0.3/1000.0   ;
    women[23]=638; women_death_rate[23]=0.3/1000.0   ;
    women[24]=655; women_death_rate[24]=0.3/1000.0   ;
 
    women[25]=667; women_death_rate[25]=0.3/1000.0   ;
    women[26]=697; women_death_rate[26]=0.3/1000.0   ;
    women[27]=719; women_death_rate[27]=0.3/1000.0   ;
    women[28]=729; women_death_rate[28]=0.3/1000.0   ;
    women[29]=734; women_death_rate[29]=0.3/1000.0   ;
 
    women[30]=742; women_death_rate[30]=0.4/1000.0   ;
    women[31]=774; women_death_rate[31]=0.4/1000.0   ;
    women[32]=794; women_death_rate[32]=0.4/1000.0   ;
    women[33]=828; women_death_rate[33]=0.4/1000.0   ;
    women[34]=849; women_death_rate[34]=0.4/1000.0   ;
 
    women[35]=890; women_death_rate[35]=0.6/1000.0   ;
    women[36]=931; women_death_rate[36]=0.6/1000.0   ;
    women[37]=982; women_death_rate[37]=0.6/1000.0   ;
    women[38]=1001; women_death_rate[38]=0.6/1000.0   ;
    women[39]=981; women_death_rate[39]=0.6/1000.0   ;
 
    women[40]=958; women_death_rate[40]=0.8/1000.0   ;
    women[41]=931; women_death_rate[41]=0.8/1000.0   ;
    women[42]=920; women_death_rate[42]=0.8/1000.0   ;
    women[43]=902; women_death_rate[43]=0.8/1000.0   ;
    women[44]=898; women_death_rate[44]=0.8/1000.0   ;
 
    women[45]=705; women_death_rate[45]=1.3/1000.0   ;
    women[46]=872; women_death_rate[46]=1.3/1000.0   ;
    women[47]=815; women_death_rate[47]=1.3/1000.0   ;
    women[48]=798; women_death_rate[48]=1.3/1000.0   ;
    women[49]=772; women_death_rate[49]=1.3/1000.0   ;
 
    women[50]=760; women_death_rate[50]=1.9/1000.0   ;
    women[51]=768; women_death_rate[51]=1.9/1000.0   ;
    women[52]=783; women_death_rate[52]=1.9/1000.0   ;
    women[53]=765; women_death_rate[53]=1.9/1000.0   ;
    women[54]=744; women_death_rate[54]=1.9/1000.0   ;
 
    women[55]=783; women_death_rate[55]=2.8/1000.0   ;
    women[56]=810; women_death_rate[56]=2.8/1000.0   ;
    women[57]=813; women_death_rate[57]=2.8/1000.0   ;
    women[58]=868; women_death_rate[58]=2.8/1000.0   ;
    women[59]=918; women_death_rate[59]=2.8/1000.0   ;
 
    women[60]=975; women_death_rate[60]=3.9/1000.0   ;
    women[61]=1051; women_death_rate[61]=3.9/1000.0   ;
    women[62]=1152; women_death_rate[62]=3.9/1000.0   ;
    women[63]=1146; women_death_rate[63]=3.9/1000.0   ;
    women[64]=1090; women_death_rate[64]=3.9/1000.0   ;
 
    women[65]=685; women_death_rate[65]=6.0/1000.0   ;
    women[66]=741; women_death_rate[66]=6.0/1000.0   ;
    women[67]=903; women_death_rate[67]=6.0/1000.0   ;
    women[68]=875; women_death_rate[68]=6.0/1000.0   ;
    women[69]=899; women_death_rate[69]=6.0/1000.0   ;
 
    women[70]=873; women_death_rate[70]=9.8/1000.0   ;
    women[71]=793; women_death_rate[71]=9.8/1000.0   ;
    women[72]=690; women_death_rate[72]=9.8/1000.0   ;
    women[73]=738; women_death_rate[73]=9.8/1000.0   ;
    women[74]=755; women_death_rate[74]=9.8/1000.0   ;
 
    women[75]=753; women_death_rate[75]=17.9/1000.0   ;
    women[76]=718; women_death_rate[76]=17.9/1000.0   ;
    women[77]=675; women_death_rate[77]=17.9/1000.0   ;
    women[78]=671; women_death_rate[78]=17.9/1000.0   ;
    women[79]=646; women_death_rate[79]=17.9/1000.0   ;
 
    women[80]=614; women_death_rate[80]=34.3/1000.0   ;
    women[81]=573; women_death_rate[81]=34.3/1000.0   ;
    women[82]=547; women_death_rate[82]=34.3/1000.0   ;
    women[83]=515; women_death_rate[83]=34.3/1000.0   ;
    women[84]=482; women_death_rate[84]=34.3/1000.0   ;
 
    women[85]=454; women_death_rate[85]=69.1/1000.0   ;
    women[86]=405; women_death_rate[86]=69.1/1000.0   ;
    women[87]=349; women_death_rate[87]=69.1/1000.0   ;
    women[88]=313; women_death_rate[88]=69.1/1000.0   ;
    women[89]=276; women_death_rate[89]=69.1/1000.0   ;
 
    women[90]=236; women_death_rate[90]=131.2/1000.0   ;
    women[91]=213; women_death_rate[91]=131.2/1000.0   ;
    women[92]=146; women_death_rate[92]=131.2/1000.0   ;
    women[93]=128; women_death_rate[93]=131.2/1000.0   ;
    women[94]=106; women_death_rate[94]=131.2/1000.0   ;
 
    women[95]=87 ; women_death_rate[95]=238.1/1000.0   ;
    women[96]=63 ; women_death_rate[96]=238.1/1000.0   ;
    women[97]=49 ; women_death_rate[97]=238.1/1000.0   ;
    women[98]=35 ; women_death_rate[98]=238.1/1000.0   ;
    women[99]=25 ; women_death_rate[99]=238.1/1000.0   ;
 
    for (int year = 2012; year < 2100; year++){ // 2012年から2100年までループ計算
      
      double dummy = 0;
      for(int i = 15; i < 50; i++){  // 特殊出産率の対象 15歳から49歳までの人口加算
        dummy += women[i];
      } 
      
      // 1.4は、特殊出生率 / 35は特殊出生率の対象期間(35年) / 1.05は男性の出生比率
      double mem_new_birth = dummy * 1.4 / 35.0 * 1.05/(1.05+1.00);
      double womem_new_birth = dummy * 1.4 / 35.0 * 1.00/(1.05+1.00);   
      
      // 1年単位の人口移動 (死亡率も考慮) 
      for (int k = 99; k >= 0; k--){
        men[k+1] = men[k] * (1.0 - men_death_rate[k]);
        women[k+1] = women[k] * (1.0 - women_death_rate[k]);
        //printf("%d   %f    %f \n", k, men[k], women[k]);                  
        
      }
 
      // 新生児の人口を追加
      men[0] = mem_new_birth;
      women[0] = womem_new_birth;
      
      // 人口総計(年齢99歳まで。100歳以上の人口は無視することにした)
      double sum_men = 0;
      double sum_women = 0;
      
        for (int m = 0; m <= 100; m++){
          sum_men += men[m];
          sum_women += women[m];
        }
        
#if 0       
        // ディタルネイティブ人口総計
        double digital_sum_men = 0;
        double digital_sum_women = 0;
        
        int l = year -1990;
        if (l >= 100) l = 100;
 
        for (int n = 0; n <= l ; n++){
          digital_sum_men += men[n];
          digital_sum_women += women[n];
        }
#endif 
 
#if 0  // ここから江端仮説
 
        // デジタルアクティブ人口総計
        double digital_sum_men = 0;
        double digital_sum_women = 0;
 
        // 1970年以後の人は100%デジタルは使えるいう仮説の導入
        
        int l = year -1970;    
        if (l >= 100) l = 100;
 
        for (int n = 0; n <= l ; n++){
          digital_sum_men += men[n];
          digital_sum_women += women[n];
        }
 
        // 1950-70年にかけてデジタルを使える人は線形に増加した、という仮説の導入
        
        // デジタルアクティブ人口(江端"補正"仮説)
        int p1 = year -1970;  // 例:2020年の時に50歳
        int p2 = year -1950;  // 例:2020年の時に70歳
 
        for (int i = p1; i < p2 ; i++){  
          if (i < 100){
            // 例:2020年の時に70歳の人の0%、 60歳の人の50%、50歳の人の100%がデジタルを扱えるとする
            digital_sum_men += men[i] * 1.0 / (double)(p2 - p1) * (double)(p2 - i);
            digital_sum_women += women[i] * 1.0 / (double)(p2 - p1) * (double)(p2 - i);
          }
        }
 
#endif 
 
 
#if 1
        // 高齢者世代(65歳以上)に特化して計算してみる
 
        // 人口総計(年齢65歳から99歳まで。100歳以上の人口は無視することにした)
        sum_men = 0;
        sum_women = 0;
        
        for (int m = 65; m <= 100; m++){
          sum_men += men[m];
          sum_women += women[m];
        }
        
        // デジタルアクティブ人口総計
        double digital_sum_men = 0;
        double digital_sum_women = 0;
 
        // 1970年以後の人は100%デジタルは使えるいう仮説の導入
        
        int l = year -1970;    
        if (l >= 100) l = 100;
 
        for (int n = 65; n <= l ; n++){
          digital_sum_men += men[n];
          digital_sum_women += women[n];
        }
 
        // 1950-70年にかけてデジタルを使える人は線形に増加した、という仮説の導入
        
        // デジタルネイティブ人口(江端"補正"仮説)
        int p1 = year -1970;  // 例:2020年の時に50歳   2017年の時に47歳
        int p2 = year -1950;  // 例:2020年の時に70歳
 
        for (int i = p1; i < p2 ; i++){  
          if ((i >= 65) &&(i < 100)){
            // 例:2020年の時に70歳の人の0%、 60歳の人の50%、50歳の人の100%がデジタルを扱えるとする
            digital_sum_men += men[i] * 1.0 / (double)(p2 - p1) * (double)(p2 - i);
            digital_sum_women += women[i] * 1.0 / (double)(p2 - p1) * (double)(p2 - i);
          }
        }
#endif
 
        
        printf("%d,%f,%f,%f\n", year,  sum_men + sum_women, digital_sum_men + digital_sum_women, (digital_sum_men + digital_sum_women)/(sum_men + sum_women) ); 
    }
}
 

2017-06-16 typedefは1つの型を、2つ以上の別名(ここでは、STATION_NUMBER と AREA の 2つ)で定義できる [長年日記]

/*
  gcc -g dummy.cpp -o dummy
*/   
 
#include <stdio.h>
 
typedef struct station_number{
  int line;
  int number;
} STATION_NUMBER,AREA;
 
int main ()
{
  STATION_NUMBER st;
  st.line = 2;
  st.number = 5;
 
  AREA *area;
  area = &st;
 
  printf("%d : %d\n", area->line, area->number);
 
  area->line = 3; 
  area->number = 6;
 
  printf("%d : %d\n", st.line, st.number);
 
  return 0;
}
 
 
/* 
   出力結果
   dummy
   2 : 5
   3 : 6
*/
 
/*
  typedefは1つの型を、2つ以上の別名(ここでは、
  STATION_NUMBER と AREA の 2つ)で定義でき、
  キャストしなくてもコンパイラは文句を言ってこないらしい
*/
 

2017-06-11 Amazonのテキストリンク先はここ [長年日記]

https://affiliate.amazon.co.jp/home/textlink/general?ac-ms-src=ac-nav

にいってから、

「テキストリンク」のタブをクリック

「URLを入力 (必須)」にamazonのURLを入力して

「表示するテキスト (必須)」に本の名前を入力して、

「HTMLを取得」のボタンを押す。

プレビューのソースコードをブログに張りつける。


2017-06-02 C/C++あれこれ/Excel仕様のCSVファイルの読み込みと表示 [長年日記]

/*
  C/C++あれこれ/Excel仕様のCSVファイルの読み込みと表示
 
  http://winter-tail.sakura.ne.jp/pukiwiki/index.php?C%A1%BFC%2B%2B%A4%A2%A4%EC%A4%B3%A4%EC%2FExcel%BB%C5%CD%CD%A4%CECSV%A5%D5%A5%A1%A5%A4%A5%EB%A4%CE%C6%C9%A4%DF%B9%FE%A4%DF%A4%C8%C9%BD%BC%A8
  を、私が忘れないことを目的として張り付けさせて頂きました
 
  原作者は台北猫々さん(http://winter-tail.sakura.ne.jp/index.shtml)です。
  mingwでも問題なく動いており、心より感謝申し上げます。
 
*/
 
/* ==================== okinawa.csv ========================= */
 
47201,"900 ","9000,""000","オキナワケン","ナハシ","イカニケイサイガナイバアイ","沖縄県","那覇市","以下に掲載がない場合",0,0,0,0,0,0
 
47201,"90101","9010154","オキナワケン","ナハシ","アカミネ","沖縄県","那覇市","赤嶺",0,0,0,0,0,0
 
 
/* ==================== main.cpp ========================= */
 
/*
  g++ -g main.cpp CSVReader.cpp -o CSVReader
  でmingwでコンパイルできます
 
*/
 
#include <iostream>
#include <string>
#include <vector>
#include <fstream>
using namespace std;
 
#include "CSVReader.h"
 
int main(void) {
  std::fstream r("c:\\okinawa.csv", std::ios::in);
  if( !r.is_open() ) {
    cerr << "Open Error! :" << endl;
    return -1;
  }
  
  CSVReader csv(r);
  vector<string> tokens;
  while( !csv.Read(tokens) ) {
    for( unsigned int i=0; i<tokens.size(); i++ ) {
      //cout << "[" << tokens[i].c_str() << "]" << endl; // ここちょっっとテスト
      printf("[%s]\n",tokens[i].c_str());
    }
  }
  csv.Close();
  return 0;
}
 
 
/* ==================== CSVReader.h ========================= */
 
/**
 * CSVファイル読み込みクラス
 * @author      台北猫々
 * @version     CVS $Id: CSVReader.h,v 1.1 2008/03/26 12:45:24 tamamo Exp $
 * @license     BSD license:
 * Copyright (c) 2008, Taipei Cat Project
 * All rights reserved.
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 *     * Redistributions of source code must retain the above copyright
 *       notice, this list of conditions and the following disclaimer.
 *     * Redistributions in binary form must reproduce the above copyright
 *       notice, this list of conditions and the following disclaimer in the
 *       documentation and/or other materials provided with the distribution.
 *     * Neither the name of the Taipei Cat Project nor the
 *       names of its contributors may be used to endorse or promote products
 *       derived from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE FOR ANY
 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
#ifndef _CSVREADER_H__
#define _CSVREADER_H__
 
#include <string>
#include <vector>
#include <fstream>
using namespace std;
 
#define DEFAULT_SEPARATOR   ','
#define DEFAULT_QUOTE_CHARACTER '"'
 
class CSVReader
{
public:
 
    /**
     * コンストラクタ
     * @param stream ファイルストリーム
     * @comment セパレータ(,), エンクオート(")
     */
    CSVReader(fstream& stream);
 
    /**
     * コンストラクタ
     * @param stream ファイルストリーム
     * @param sep セパレータ
     * @comment エンクオート(")
     */
    CSVReader(fstream& stream, const char sep);
 
    /**
     * コンストラクタ
     * @param stream ファイルストリーム
     * @param sep セパレータ
     * @param quo エンクオート
     */
    CSVReader(fstream& stream, const char sep, const char quo);
 
    /**
     * デストラクタ
     */
    virtual ~CSVReader(void);
 
    /**
     * CSVファイルを1行読み込んで、分割して配列で返します。
     * @param tokens トークン(OUT)
     * @return 0:正常 -1:EOF
     */
    int Read(vector<string>& tokens);
 
    /**
     * ファイルストリームをクローズします。
     * @return 0:正常 -1:異常
     */
    int Close(void);
 
private:
 
    /**
     * ファイルから1行読み込みます。
     * @param line 行データ
     * @return >=0:読み込んだデータ長 -1:EOF
     */
    int GetNextLine(string& line);
 
    /**
     * データをパースします。
     * @param nextLine 行データ
     * @param tokens パースしたデータの配列(OUT)
     * @return 0
     */
    int Parse(string& nextLine, vector<string>& tokens);
 
    std::fstream* pstream;
    char SEPARATOR;
    char QUOTE;
 
};
 
#endif
 
/* ==================== CSVReader.cpp ========================= */
 
/**
 * CSVファイル読み込みクラス
 * @author      台北猫々
 * @version     CVS $Id: CSVReader.cpp,v 1.1 2008/03/26 12:45:24 tamamo Exp $
 * @license     BSD license:
 * Copyright (c) 2008, Taipei Cat Project
 * All rights reserved.
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 *     * Redistributions of source code must retain the above copyright
 *       notice, this list of conditions and the following disclaimer.
 *     * Redistributions in binary form must reproduce the above copyright
 *       notice, this list of conditions and the following disclaimer in the
 *       documentation and/or other materials provided with the distribution.
 *     * Neither the name of the Taipei Cat Project nor the
 *       names of its contributors may be used to endorse or promote products
 *       derived from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE FOR ANY
 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
#include "CSVReader.h"
 
CSVReader::CSVReader(fstream& stream):
  SEPARATOR(DEFAULT_SEPARATOR),
  QUOTE(DEFAULT_QUOTE_CHARACTER),
  pstream(&stream)
{
  
}
 
CSVReader::CSVReader(fstream& stream, const char sep):
  SEPARATOR(sep),
  QUOTE(DEFAULT_QUOTE_CHARACTER),
  pstream(&stream)
{
}
 
CSVReader::CSVReader(fstream& stream, const char sep, const char quo):
  SEPARATOR(sep),
  QUOTE(quo),
  pstream(&stream)
{
}
 
CSVReader::~CSVReader(void)
{
}
 
int CSVReader::Read(vector<string>& tokens) {
  tokens.clear();
  
  string nextLine;
  if( GetNextLine(nextLine)<=0 ) {
    return -1;
  }
  Parse(nextLine, tokens);
  return 0;
}
 
int CSVReader::GetNextLine(string& line) {
  
  if( !pstream || pstream->eof() ) {
    return -1;
  }
  std::getline( *pstream, line );
  return (int)line.length();
}
 
int CSVReader::Parse(string& nextLine, vector<string>& tokens) {
  string token;
  bool interQuotes = false;
  do {
    if (interQuotes) {
      token += '\n';
      if (GetNextLine(nextLine)<0) {
        break;
      }
    }
    
    for (int i = 0; i < (int)nextLine.length(); i++) {
      
      char c = nextLine.at(i);
      if (c == QUOTE) {
        if( interQuotes
            && (int)nextLine.length() > (i+1)
            && nextLine.at(i+1) == QUOTE ){
          token += nextLine.at(i+1);
          i++;
        }else{
          interQuotes = !interQuotes;
          if(i>2 
             && nextLine.at(i-1) != SEPARATOR
             && (int)nextLine.length()>(i+1) 
             && nextLine.at(i+1) != SEPARATOR
             ){
            token += c;
          }
        }
      } else if (c == SEPARATOR && !interQuotes) {
        tokens.push_back(token);
        token.clear();
      } else {
        token += c;
      }
    }
  } while (interQuotes);
  tokens.push_back(token);
  return 0;
}
 
/**
 * ファイルストリームをクローズします。
 * @return 0:正常 -1:異常
 */
int CSVReader::Close(void) {
  if(pstream) {
    pstream->close();
    pstream = NULL;
  }
  return 0;
}
 

2017-06-01 // double の場合は"%lf"でないと値が取れない (%fにするとゼロになる) [長年日記]

void make_cart()
{
  CART cart = {}; // クリア
 
  // 以下2行は共通
  cart.person_number = 0;
  cart.prev_station_time = cart.next_station_time = standard_time;
  cart.cart_speed = default_cart_speed;
 
#if 1
 
  FILE *fp;
  const char *fname = "cart_info.csv";
  char name[10];
  int line, station;
  char direction[10];
  double speed;
  
  fp = fopen( fname, "r" );
  if( fp == NULL ){
    printf( "%sファイルが開けません\n", fname );
    exit(-1);
  }
  
  /*
    fscanf()やscanf()関数には%dや%sなどの、
    変換文字(変換仕様)と言われる指定方法があります。
    その中に、%[^...] という変換文字があり、カッコ内の文字以外を読み込むという意味です。
 
    つまり、%[^abc] の場合は、「abc」以外の文字を読み込むという指定が出来ます。
    これを、CSVファイル読み込みにも利用してみます。
  */
 
  int ret;
  int cart_number = 0;
 
 
  // 1行ステップ、捨て行
  char dummy_line[100];
  fgets( dummy_line, sizeof(dummy_line), fp);
  
  while((ret = fscanf( fp, "%[^,],%d,%d,%[^,],%lf", 
                       name, &line, &station, direction, &speed )) == 5 ){
    
    printf("ret = %d: %s %d %d %s %lf \n", ret, name, line, station, direction, speed );
    
    cart.number = cart_number++;
    strcpy(cart.name, name);
    
    cart.orig_station.line_num = cart.prev_station.line_num = line;
    cart.orig_station.station_num = cart.prev_station.station_num = station;
    
    if (strcmp(direction, "UP") == 0){
      cart.direction = UP;
      cart.area = station;
    }
    else if (strcmp(direction, "DOWN") == 0){
      cart.direction = DOWN;
      cart.area = station - 1;
    }
    else{
      printf("%s\n",direction);
      printf("stop for error\n");
      exit(0); 
    }
    
    cart.cart_speed = speed;
    add_cart(&cart);
  }
 
  fclose( fp );
 
#endif 
}

2017-05-26 mingwでコアダンプができない件 [長年日記]

gdbでrunさせれば、落ちたところで行数が表示される→コアダンプがなくても大丈夫


2017-05-25 C/C++ で csvファイルの読み込みに、strtokを使うのに疲れた私の為に [長年日記]

/*
  出展 http://simd.jugem.jp/?eid=49
  gcc -g comma.cpp -o comma
 */
 
#include <stdio.h>
 
int main(void)
{
  FILE *fp;
  const char *fname = "comma.csv";
  char s[100];
  int ret, n1, n2;
  float f1, f2;
 
  fp = fopen( fname, "r" );
  if( fp == NULL ){
    printf( "%sファイルが開けません\n", fname );
    return -1;
  }
 
  /*
    fscanf()やscanf()関数には%dや%sなどの、
    変換文字(変換仕様)と言われる指定方法があります。
    その中に、%[^...] という変換文字があり、カッコ内の文字以外を読み込むという意味です。
 
    つまり、%[^abc] の場合は、「abc」以外の文字を読み込むという指定が出来ます。
    これを、CSVファイル読み込みにも利用してみます。
  */
 
  while( ( ret = fscanf( fp, "%[^,],%d,%d,%f,%f", s, &n1, &n2, &f1, &f2 ) ) != EOF ){
    printf( "%s %d %d %f %f", s, n1, n2, f1, f2 );
  }
 
  fclose( fp );
  return 0;
}
 
 
#if 0
 
以下を、"comma.csv"というファイル名で保存する。
 
test01,10,11,1.0,1.1
test02,20,21,2.0,2.1
test03,30,31,3.0,3.1
 
#endif