/* gcc -g hiseiki.cpp -o hiseiki */ /* まず「基本形」 普通の会社を想定する 景気の波がある 非正規雇用はいつでも解雇できる。 正規雇用は解雇できない。 必要な労働力は人数で換算できる。 景気の波は 景気循環には、3~4年周期の「キチンの波」、約10年周期の「ジュグラーの波」、20~30年周期の「クズネッツの波」、約50年周期の「コンドラチェフの波」の四種類があるとされ、それぞれ、在庫投資、設備投資、建設投資、技術革新が原因とされてきた。しかし、これらの周期性の計測や、因果関係に確定的な根拠があるわけではない。現在のところ確実に観測できるのは約4年周期の波だけで、しかも設備投資がそれを主導するように同調的に変動している。周期問題の分析は今後の課題に残されている。 今回は、約10年周期の「ジュグラーの波」を採用する。 企業の寿命は考えない。雇用期間は20歳から60歳までの40年 一人の人間が生み出す利益は、年齢とともに単調的に増加する(長期雇用のメリット) 一人の人間の人件費も年齢と共に単調的に増加する 年齢に応じて100人いるとすると4000人 提供労働力は、年齢に応じて増えていく(給料も増えるが、能力はそれを超えると考える) 需要労働力は、変動する 需要労働力に対して、提供労働力が大きいと、損害になる 1200円→2400円 2倍 需要労働力に対して、提供労働力が小さいと、(競争に負けるので)、やはり損害になる 需要労働力と、提供労働力が一致していることが望ましい 正規社員 1.25 → 2.50 (http://www.mhlw.go.jp/file/06-Seisakujouhou-11650000-Shokugyouanteikyokuhakenyukiroudoutaisakubu/0000120286.pdf) 非正規社員 1.00 のまま その金が支払われるのは、その能力がある(あるいは教育に投資をしていると仮定する) 正規社員は退職せず、非正規社員は問答無用で解雇できるものとする */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> typedef struct person{ int age; // 20歳~60歳 のいずれか int position; // 1:正規社員 0:非正規社員 double productivity; // 生産力 正規社員の場合 /////////// struct person *prev; /* 前の構造体を示すポインタ */ struct person *next; /* 次の構造体を示すポインタ */ } PERSON; typedef struct company{ int payroll; double productivity; // 会社としての生産力の合計 } COMPANY; PERSON *p_first_person, *p_last_person; //社員リスト(あえてグローバルで保持) // 社員用リストの先頭と終端を作成するルーチン /* リストの先頭と終端をはグローバルでも良いのであるが、 一応、メインルーチンの方で、陽に定義できるように、 ここでは、返り値としている */ double min(double a, double b){ if (b > a) return a; else return b; }; double juglar_cycles(int year) { // 10年で変動するsin周期 // ベースとするのは2017年とする(単なる仮説) int x = (year -7) % 10; double y = sin( (double)x /10.0 * 2 * 3.141592654); return y; } void init_person_list(PERSON **p_first_person, PERSON **p_last_person) { PERSON *p_top_person = (PERSON *)malloc(sizeof(PERSON)); if(p_top_person == NULL) { printf("メモリが確保できません\n"); exit(EXIT_FAILURE); } memset(p_top_person, 0, sizeof(PERSON)); // ゼロクリア PERSON *p_tail_person = (PERSON *)malloc(sizeof(PERSON)); if(p_tail_person == NULL) { printf("メモリが確保できません\n"); exit(EXIT_FAILURE); } memset(p_tail_person, 0, sizeof(PERSON)); // ゼロクリア *p_first_person = p_top_person; *p_last_person = p_tail_person; (*p_first_person)->prev = NULL; (*p_last_person)->next = NULL; (*p_first_person)->next = (*p_last_person); (*p_last_person)->prev = (*p_first_person); return; } // 社員オブジェクトを生成して、社員用リストに追加するルーチン void add_person(PERSON *p_ref_person) { PERSON *new_p_person = (PERSON *)malloc(sizeof(PERSON)); if(new_p_person == NULL) { printf("メモリが確保できません\n"); exit(EXIT_FAILURE); } memset(new_p_person, 0, sizeof(PERSON)); // ゼロクリア memcpy(new_p_person, p_ref_person, sizeof(PERSON)); // 引数の動的メモリの内容コピー // personの追加属性記述ここから // personの追加属性記述ここまで PERSON *p_person = p_last_person->prev; p_person->next = new_p_person; new_p_person->prev = p_person; p_last_person->prev = new_p_person; new_p_person->next = p_last_person; return; } void delete_person(PERSON *p_person) { // ポインタを貼り替えて p_person->prev->next = p_person->next; p_person->next->prev = p_person->prev; // そのメモリを解放する free(p_person); return; } int main() { // 社員格納用リストの作成 init_person_list(&p_first_person, &p_last_person); //20歳から59歳までの正規社員、各世代100人づつ、合計4000人を作成する /////// PERSONを作成する /////// for (int age = 20; age < 60; age ++){ for (int i = 0; i < 100; i++){ PERSON person; person.age = age; person.position = 1; // 1:正規社員 0:非正規社員 person.productivity = 1.25 + (2.50 -1.25) / 40.0 * ((double)age -20.0); //20歳 1.25 60歳 2.50まで線形変化 add_person(&person); } } /////// PERSONを作成する /////// COMPANY company; company.payroll = 0; // 従業員数ゼロリセット company.productivity = 0.0; // 生産力ゼロリセット double sum_profit = 0; for ( int year = 2017; year < 2040; year++){ //// 年齢を1歳加算し、定年 // ===== PERSON ループを回す======== PERSON* p_person = p_first_person->next; while (p_person != p_last_person){ p_person->age += 1; p_person->productivity = 1.25 + (2.50 -1.25) / 40.0 * ((double)(p_person->age) -20.0); //20歳 1.25 60歳 2.50まで線形変化 if (p_person->age >= 60){ // 60歳になったら定年 delete_person(p_person); } p_person = p_person->next; } // ===== PERSON ループを回す(ここまで)======== //// 100人の20歳の新入社員を入社する for (int i = 0; i < 100; i++){ /////// PERSONを作成する /////// PERSON person; person.age = 20; person.position = 1; // 1:正規社員 0:非正規社員 person.productivity = 1.25 + (2.50 -1.25) / 40.0 * ((double)person.age -20.0); //20歳 1.25 60歳 2.50まで線形変化 add_person(&person); } /////////// ここから生産力算出ループ company.productivity = 0; // 生産力ゼロリセット company.payroll = 0 ; // 従業員数ゼロリセット // ===== PERSON ループを回す======== p_person = p_first_person->next; while (p_person != p_last_person){ company.payroll += 1 ; // 従業員数一人加算 company.productivity += p_person->productivity; // 生産力加算 p_person = p_person->next; } // ===== PERSON ループを回す(ここまで)======== //printf("company.payroll = %d\n",company.payroll); // company.payroll = 4000 //printf("company.productivity = %f\n",company.productivity); // company.productivity = 7437.500000 double potential = juglar_cycles(year) * 1500.0 + 7500.0; // 景気ライン double border = 7000.0; // 利益のボーダー double profit = min(company.productivity, potential) - border; sum_profit += profit; //printf("year = %d company.productivity = %f potential = %f profit = %f sum_profit=%f\n",year,company.productivity, potential, profit,sum_profit); printf("%d,%f,%f,%f,%f\n",year,company.productivity, potential, profit,sum_profit); } // for ( int year = 2017; year < 2040; year++){ return 0; }