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|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|

2018-01-04 「パワハラ」シミュレーター [長年日記]

/*
  gcc -g harassment.cpp -o harassment
*/
 
 
#include <stdio.h>
#include <stdlib.h>
 
/*
  設定
  
  上司と部下の気質のタイプを5つに設定
  上司と部下が一致していると 部下のパフォーマンスは120%
  上司と部下が1つずれていると 部下のパフォーマンスは100%  
  上司と部下が2つずれていると 部下のパフォーマンスは80%  
  上司と部下が3つ以上ずれていると 部下のパフォーマンスは60%  
  上司と部下が4つ以上ずれていると 部下のパフォーマンスは40%  
  上司と部下が5つ以上ずれていると 部下のパフォーマンスは20%  
 
  上司に度量がない場合 移動量 ±0  → 部下のパフォーマンスは?
  上司に度量がある場合 移動量 ±1
  上司に度量がない場合 移動量 ±2
 
  部下に度量がない場合 移動量 ±0
  部下に度量がある場合 移動量 ±1
  部下に度量がある場合 移動量 ±2
 
*/
 
 
#define MAX_CHARACTER 6
 
#define STAFF_GENEROUS 0 //部下の度量(唯一の変数)
 
// 乗客の変数用構造体
typedef struct person {
 
  int character; // 0,1,2,3,4,5   人格を示す(×能力の大きさではない)
  int generous; //  0,1,2,3,4,5   度量の大きさを示す
  
} PERSON;
 
int min(int a, int b)
{
  if (a < b)
	return a;
  else 
	return b;
}
 
int max(int a, int b)
{
  if (a > b)
	return a;
  else 
	return b;
}
 
 
double performance(int b_character, int s_character, int b_generous, int s_generous)
{
  /*
	0   → 120
    1   → 100
    2   →  80
    3   →  60 
    4   →  40 
    5   →  20 
 
        |--------|
      b_min     b_max
 
 |--------|
s_min     s_max
 
  */
 
  int b_max = min(b_character + b_generous, 5);
  int b_min = max(b_character - b_generous, 0);
 
  int s_max = min(s_character + s_generous, 5);
  int s_min = max(s_character - s_generous, 0);
 
  int v1 = max(b_min - s_max, 0);
  int v2 = max(s_min - b_max, 0);
  
  int v = max(v1, v2);
 
  double f = 120.0 - 40.0 * v;
 
  return f;
}
 
int main()
{
  PERSON boss; 
  PERSON staff[100];
 
  srand(10);
 
  /*
 
 
  // 上司の設定
  boss.character = 5; //rand() % MAX_CHARACTER ;
  boss.generous = 3;
 
  */
 
  for( int a = 0; a < 6; a++){
	for( int b = 0; b < 6; b++){
 
	  boss.character = a;
	  boss.generous = b;
 
  
	  // 部下の設定
	  for(int i = 0; i < 100; i++){
		staff[i].character = rand() % MAX_CHARACTER ;
		staff[i].generous = STAFF_GENEROUS;
	  }
	  
	  // 計算
	  double sum = 0.0;
	  
	  for(int i = 0; i < 100; i++){
		sum += performance(boss.character, staff[i].character, boss.generous, staff[i].generous);
	  }
	  
	  //sum = (sum / 100.0) * (0.5 + boss.character * 0.1) ;
	  sum = (sum / 100.0); 
 
#if 0	  
	  printf("boss.character:%d\t", a);
	  printf("boss.generous:%d\t", b);
 
	  printf("Average sum = %f\n", sum);
#endif 
	  printf("%d %d %f\n",a,b,sum);
 
	}
	printf("\n");
  }
}
syntax2html

_ https://dotinstall.com/lessons/basic_postgresql


2018-01-05 psqlの操作方法の基本の基本 [長年日記]

/*
 
psqlの操作方法の基本の基本
 
C:\Users\yrl-user>psql -h localhost -U postgres	
postgres=# \l		
postgres=# \connect blogapp(データベース名)
blogapp=# \dt
blogapp=# \d users(テーブル名)
blogapp=# select * from users; /* 検索の基本形 */
 
分からなくなったら、ここ(PostgreSQL入門)で再履修
https://dotinstall.com/lessons/basic_postgresql
 
/*
	データの型
 
	数値:integer(int), real, serial
	文字:char(5), varchar(255),text
	真偽: boolean, TRUE, FALSE t f
	日付: date, time, timestamp
 
	制約
	not null 
	unique
	check
	default 
	primary key(not null, unique)	
 
*/
 
create table users (
	   id serial primary key,
	   name varchar(255),
	   score real,
	   team varchar(255)
);
 
insert into users (name, score, team) values
('taguchi', 5.5, 'red'),
('fkoji', 8.3, 'blue'),
('dotinstall', 2.2, 'blue'),
('sakaki', 5.0, 'green'),
('sasaki', 4.6, 'red'),
('kimura', 4.7, 'green');
 
create table posts (
	   id serial primary key,
	   user_id int not null,
	   title varchar(255) not null,
	   body text not null
);
 
insert into posts (user_id, title, body) values
(1, 'title1', 'body1'),
(1, 'title2', 'body2'),
(2, 'title3', 'body3'),
(5, 'title4', 'body4'),
(4, 'title5', 'body4');
syntax2html

2018-01-09 postgreSQL DBに C++ で読み書きをする [長年日記]

/*
  gcc -g -I"D:\PostgreSQL\pg96\include" pg_read_write.cpp -o pg_read_write.exe -L"D:\PostgreSQL\pg96\lib" -llibpq -lwsock32 -lws2_32
 
まず、以下の手順でテーブルを作っておく
 
C:\Users\yrl-user>psql -h localhost -U postgres	
postgres=# \l		
postgres=# \connect blogapp(データベース名)
 
以下をコピペしてテーブルとその内容を直接書き込む
 
create table users (
	   id serial primary key,
	   name varchar(255),
	   score real,
	   team varchar(255)
					);
 
insert into users (name, score, team) values
('taguchi', 5.5, 'red'),
('fkoji', 8.3, 'blue'),
('dotinstall', 2.2, 'blue'),
('sakaki', 5.0, 'green'),
('sasaki', 4.6, 'red'),
('kimura', 4.7, 'green');
 
blogapp=# \dt
blogapp=# \d users(テーブル名)
 
●データベースのテーブルの中身を確認する
blogapp=# select * from users; // 検索の基本形
 
●name = 'ebata"は消しておく
blogapp=# DELETE FROM users WHERE name = 'ebata';
 
*/
 
#include <stdio.h>
 
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#include <sys/types.h>
#include "libpq-fe.h"
 
int main(int argc, char **argv)
{
  const char *conninfo = "host=localhost user=postgres password=c-anemone dbname=blogapp";
 
  // データベースとの接続を確立する 
  PGconn *conn = PQconnectdb(conninfo);
  
  /* バックエンドとの接続確立に成功したかを確認する */
  if (PQstatus(conn) != CONNECTION_OK){
	fprintf(stderr, "Connection to database failed: %s",
			PQerrorMessage(conn));
  }
 
  
  ///////////////////////
  // テーブルの書き込み
  ///////////////////////
 
  // 続いて users にデータを追加する	
  
  char stringSQL[] = "INSERT INTO users(name, score, team) VALUES('ebata', 7.7, 'blue');";
  PGresult *res = PQexec(conn, stringSQL);
 
  // INSERT等値を返さないコマンドの場合戻り値は PGRES_COMMAND_OK
  if (res == NULL || PQresultStatus(res) != PGRES_COMMAND_OK) {
    // SQLコマンドが失敗した場合
	fprintf(stderr, "INSERT COMMAND IS FAILED.",
			PQerrorMessage(conn));
  }
 
  // 値セットが無い場合でも必ず結果をクリアする
  PQclear(res);
 
  ///////////////////////
  // テーブルの読み出し(1回目)
  ///////////////////////
  
  // テーブルオープン 
  res = PQexec(conn, "SELECT * from users;");
  if (res == NULL){
	fprintf(stderr, "[SELECT name from users;] failed: %s",
			PQerrorMessage(conn));
  }
 
  // SELECTの場合戻り値は PGRES_TUPLES_OK.  これを確認しておく
  if (PQresultStatus(res) != PGRES_TUPLES_OK){
	PQerrorMessage(conn);
  }
 
 
  // まず属性名を表示する。 
  int nFields = PQnfields(res);
  for (int i = 0; i < nFields; i++){
	printf("%-15s", PQfname(res, i));
  }
  printf("\n\n");
  
  // そして行を表示する。
  for (int i = 0; i < PQntuples(res); i++) {
	for (int j = 0; j < nFields; j++) {
	  printf("%-15s", PQgetvalue(res, i, j));
	}
	printf("\n");
  }
  printf("\n");  
  printf("\n");  
 
  // PQexecを使用した場合、不要になった時点で結果セットをクリア
  PQclear(res);
 
 
 
  ///////////////////////
  // (せっかくつくった)テーブルを削除
  ///////////////////////
  
  char stringSQL2[] = "DELETE FROM users WHERE name = 'ebata';";
  res = PQexec(conn, stringSQL2);
  
  // INSERT等値を返さないコマンドの場合戻り値は PGRES_COMMAND_OK
  if (res == NULL || PQresultStatus(res) != PGRES_COMMAND_OK) {
    // SQLコマンドが失敗した場合
	fprintf(stderr, "INSERT COMMAND IS FAILED.",
			PQerrorMessage(conn));
  }
 
  // 値セットが無い場合でも必ず結果をクリアする
  PQclear(res);
 
 
  ///////////////////////
  // テーブルの読み出し(2回目)
  ///////////////////////
  
  // テーブルオープン 
  res = PQexec(conn, "SELECT * from users;");
  if (res == NULL){
	fprintf(stderr, "[SELECT name from users;] failed: %s",
			PQerrorMessage(conn));
  }
 
  // SELECTの場合戻り値は PGRES_TUPLES_OK.  これを確認しておく
  if (PQresultStatus(res) != PGRES_TUPLES_OK){
	PQerrorMessage(conn);
  }
 
 
  // まず属性名を表示する。 
  nFields = PQnfields(res);
  for (int i = 0; i < nFields; i++){
	printf("%-15s", PQfname(res, i));
  }
  printf("\n\n");
  
  // そして行を表示する。
  for (int i = 0; i < PQntuples(res); i++) {
	for (int j = 0; j < nFields; j++) {
	  printf("%-15s", PQgetvalue(res, i, j));
	}
	printf("\n");
  }
  printf("\n");  
  printf("\n");  
  
  // PQexecを使用した場合、不要になった時点で結果セットをクリア
  PQclear(res);
 
  
  // 最後必ずデータベースとの接続を閉じる
  PQfinish(conn);
}
syntax2html

2018-01-10 postgreSQL 書き込み/上書き [長年日記]

/*
  g++ -c ca-pgsql.cpp
*/
 
/* 
   [前処理] データベースの作成
   
   C:\Users\yrl-user>psql -h localhost -U postgres	← ログイン
   postgres=# \l	
 
   postgres=# create database ca_db;
   
   以下をコピペする
 
   create table person_od (
        counter int primary key,
 
		generation_t1 real,
		delete_t1 real,
 
		generation_t2 real,
		delete_t2 real,
 
		generation_t3 real,
		delete_t3 real,
 
		orig_x real,
		orig_y real,
		dest_x real,
		dest_y real,
 
		orig_station int,
		dest_station int
	);
 
ca_db=# \dt
             リレーションの一覧
 スキーマ |   名前    |    型    |  所有者
----------+-----------+----------+----------
 public   | person_od | テーブル | postgres
(1 行)
 
 
ca_db=# \d person_od
    テーブル "public.person_od"
      列       |   型    |  修飾語
---------------+---------+----------
 counter       | integer | not null
 generation_t1 | real    |
 delete_t1     | real    |
 generation_t2 | real    |
 delete_t2     | real    |
 generation_t3 | real    |
 delete_t3     | real    |
 orig_x        | real    |
 orig_y        | real    |
 dest_x        | real    |
 dest_y        | real    |
 orig_station  | integer |
 dest_station  | integer |
インデックス:
    "person_od_pkey" PRIMARY KEY, btree (counter)
 
*/   
 
#include <stdio.h>
 
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#include <sys/types.h>
#include "libpq-fe.h"
 
typedef enum step{
  STEP1 = 1, STEP2 = 2, STEP3 = 3
}STEP;
 
// 駅の情報を格納する構造体
typedef struct station{
  int serial_number;
}STATION;
 
 
typedef struct person_od{
  int counter; 
 
  double generation_t1; // 発生時刻(STEP1)
  double delete_t1; // 消滅時刻(STEP1)
 
  double generation_t2; // 発生時刻(STEP2)
  double delete_t2; // 消滅時刻(STEP2)
 
  double generation_t3; // 発生時刻(STEP3)
  double delete_t3; // 消滅時刻(STEP3)
 
  double orig_x; // 出発x座標
  double orig_y; // 出発y座標
  double dest_x; // 到着x座標
  double dest_y; // 到着y座標
 
  STATION orig_station; // 出発駅
  STATION dest_station; // 到着駅
  
} PERSON_OD;
 
   
const char *conninfo = "host=localhost user=postgres password=c-anemone dbname=ca_db";
PGconn *conn;
 
int ca_pgsql_init()
{
  // データベースとの接続を確立する 
  conn = PQconnectdb(conninfo);
  
  /* バックエンドとの接続確立に成功したかを確認する */
  if (PQstatus(conn) != CONNECTION_OK){
	fprintf(stderr, "Connection to database failed: %s",
			PQerrorMessage(conn));
  }
}
 
int ca_pgsql_add_person(PERSON_OD *p_person_od)
{
  char stringSQL[500] = {0};
  
  sprintf(stringSQL, "INSERT INTO person_od(counter, generation_t1, orig_x, orig_y, dest_x, dest_y,  orig_station, dest_station) VALUES(%d, %f, %f, %f, %f, %f, %d, %d);",
		  p_person_od->counter, 
		  p_person_od->generation_t1, 
		  p_person_od->orig_x, 
		  p_person_od->orig_y, 
		  p_person_od->dest_x, 
		  p_person_od->dest_y,  
		  p_person_od->orig_station.serial_number,
		  p_person_od->dest_station.serial_number);
 
  PGresult *res = PQexec(conn, stringSQL);
 
  // INSERT等値を返さないコマンドの場合戻り値は PGRES_COMMAND_OK
  if (res == NULL || PQresultStatus(res) != PGRES_COMMAND_OK) {
    // SQLコマンドが失敗した場合
	fprintf(stderr, "INSERT COMMAND IS FAILED.",
			PQerrorMessage(conn));
  }
 
  // 値セットが無い場合でも必ず結果をクリアする
  PQclear(res);
}
 
 
int ca_pgsql_write(STEP step, PERSON_OD *p_person_od)
{
 
  char stringSQL2[500] = {0};
 
  if (step == STEP1){
	sprintf(stringSQL2, "UPDATE person_od SET generation_t1 = %f, delete_t1 = %f WHERE counter = %d;",
			p_person_od->generation_t1, 
			p_person_od->delete_t1,
			p_person_od->counter);
 
 
  } else if (step == STEP2){
	sprintf(stringSQL2, "UPDATE person_od SET generation_t2 = %f, delete_t2 = %f WHERE counter = %d;",
			p_person_od->generation_t2, 
			p_person_od->delete_t2,
			p_person_od->counter);
 
  } else if (step == STEP3){
	sprintf(stringSQL2, "UPDATE person_od SET generation_t3 = %f, delete_t3 = %f WHERE counter = %d;",
			p_person_od->generation_t3, 
			p_person_od->delete_t3,
			p_person_od->counter);
 
  } else {
	printf("error in ca_pgsql_write() in ca-pgsql.cpp\n");
  }
 
  PGresult *res = PQexec(conn, stringSQL2);
  
  // INSERT等値を返さないコマンドの場合戻り値は PGRES_COMMAND_OK
  if (res == NULL || PQresultStatus(res) != PGRES_COMMAND_OK) {
    // SQLコマンドが失敗した場合
	fprintf(stderr, "INSERT COMMAND IS FAILED.",
			PQerrorMessage(conn));
  }
 
  // 値セットが無い場合でも必ず結果をクリアする
  PQclear(res);
}
 
int ca_pgsql_close()
{
  // 最後必ずデータベースとの接続を閉じる
  PQfinish(conn);
 
}
 
=======================================
  
/*
 
  ca-pgsql.cpp用のテストプログラム
 
*/
 
/*
  g++ -g ca-pgsql-test.cpp ca-pgsql.cpp -o ca-pgsql-test.exe -I"D:\PostgreSQL\pg96\include" -L"D:\PostgreSQL\pg96\lib" -llibpq
 
*/
 
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#include <sys/types.h>
#include "libpq-fe.h"
 
typedef enum step{
  STEP1 = 1, STEP2 = 2, STEP3 = 3
}STEP;
 
// 駅の情報を格納する構造体
typedef struct station{
  int serial_number;
}STATION;
 
 
typedef struct person_od{
  int counter; 
 
  double generation_t1; // 発生時刻(STEP1)
  double delete_t1; // 消滅時刻(STEP1)
 
  double generation_t2; // 発生時刻(STEP2)
  double delete_t2; // 消滅時刻(STEP2)
 
  double generation_t3; // 発生時刻(STEP3)
  double delete_t3; // 消滅時刻(STEP3)
 
  double orig_x; // 出発x座標
  double orig_y; // 出発y座標
  double dest_x; // 到着x座標
  double dest_y; // 到着y座標
 
  STATION orig_station; // 出発駅
  STATION dest_station; // 到着駅
  
} PERSON_OD;
 
 
extern int ca_pgsql_init();
extern int ca_pgsql_add_person(PERSON_OD *p_person_od);
extern int ca_pgsql_write(STEP step, PERSON_OD *p_person_od);
extern int ca_pgsql_close();
 
 
int main()
{
  ca_pgsql_init();
 
  PERSON_OD person_od[10];
 
  for (int i = 0; i < 10; i++){
	person_od[i].counter = i;
 
	person_od[i].generation_t1 = 8.5; // 発生時刻(STEP1)
	person_od[i].delete_t1 = 9.5; // 消滅時刻(STEP1)
	
	person_od[i].generation_t2 = 8.5; // 発生時刻(STEP2)
	person_od[i].delete_t2 =10.2; // 消滅時刻(STEP2)
	
	person_od[i].generation_t3 = 8.5; // 発生時刻(STEP3)
	person_od[i].delete_t3 = 9.9; // 消滅時刻(STEP3)
	
	person_od[i].orig_x = 139.480841;  // 出発x座標
	person_od[i].orig_y = 35.700123; // 出発y座標
	
	person_od[i].dest_x = 139.766103; // 到着x座標
	person_od[i].dest_y = 35.681391; // 到着y座標
	
	person_od[i].orig_station.serial_number = 0; // 出発駅
	person_od[i].dest_station.serial_number = 10; // 到着駅
	
	ca_pgsql_add_person(&(person_od[i]));
  }
  
  ca_pgsql_write(STEP3, &(person_od[4]));
 
  ca_pgsql_close();
 
  return 0;
 
}
syntax2html

2018-01-16 postgreSQL 文字列 boolean などの入力方法 [長年日記]

create table station_info ( serial_number int, station_name varchar, longitude real, latitude real, bus_terminal boolean, bus_number int );

ca_db=# INSERT INTO station_info(serial_number, station_name, longitude, latitude, bus_terminal, bus_number) VALUES(1, 'ebata', 1.1, 1.3, 'T', 3);


2018-01-23 シェアリングエコノミーの市場 [長年日記]

現在世界全体のGDPは、2016年(IMF調査結果)で、75,367,754百万米ドル x 1000000 x 110 = 8290兆円 であり、8290、4529.4億円シェアリングエコノミーは、2025年に 世界で36.85兆円 と規模としては小さい ( 0.4%程度) 。しかし 日本の場合532兆円 に対して 15兆円ほど (2.8%)となることが推測されている。

日本は、世界水準の7倍のシェアリングエコノミーの可能性があるという見方もできる。


2018-01-24 PostgreSQLの基本的なコマンド [長年日記]

内容コマンド例
サービスの起動 postgres -D /usr/local/var/postgres
デフォルトのテーブルに接続 psql -d postgres
直接テーブルに接続 psql -d テーブル名
接続解除 \q
データベース一覧の表示 \l
データベースの選択 \c データベース名
テーブルの作成 create table テーブル名 (

counter int primary key,

present_station int,

departure_station int,

present_time time

);

データの書き込み INSERT INTO テーブル名(counter, present_station, departure_station, present_time) VALUES(1, 2, 3, '12:23:34');
データの上書き UPDATE テーブル名 set present_time = '23:34:45' WHERE counter = 1;
テーブル一覧の表示 \dt;
テーブル構造の表示 \d テーブル名;
テーブル内のデータを一覧 select * from テーブル名;
指定したカラムの内容を小さい順に表示 select * from テーブル名 order by カラム;
指定したカラムの内容を大きい順に表示 select * from テーブル名 order by カラム desc;
表示数指定 select * from テーブル名 limit 数;
表示の開始位置指定 select * from テーブル名 offset 数;
カラム内の任意の文字を表示 select distinct カラム名 from テーブル名;
カラム内の合計値 select sum(カラム名) from テーブル名;
カラム内の最大値 select max(カラム名) from テーブル名;
カラム内の最小値 select min(カラム名) from テーブル名;
カラム内の平均値 select avg(カラム名) from テーブル名;
データの更新 update テーブル名 set 更新内容;
全データの削除 delete from テーブル名;
データの削除 delete from テーブル名 where 条件;
テーブルのオーナーの変更 alter table テーブル名 owner to オーナー名;
文字数 select length(カラム名) from テーブル名;
文字列連結 select concat(文字列, 文字列, ...) from テーブル名;
カラムの追加 alter table テーブル名 add カラム名 データ型;
カラムの削除 alter table テーブル名 drop カラム名;
カラム名の変更 alter table テーブル名 rename カラム名 to 新カラム名;
カラムのデータ型を変更する alter table テーブル名 alter カラム名 type データ型;
インデックス追加 create index インデックス名 on テーブル名(カラム名);
インデックス削除 drop index インデックス名;
viewの作成 create view ビュー名 as viewに指定するコマンド;
view一覧の確認 \dv;
viewの使用方法 select * from ビュー名;
viewの削除 drop view ビュー名;
SQL文を外部ファイルに書いて実行する時に使う \i ファイル名

2018-01-25 C++プログラムでPostgreSQLに漢字を書き込めるようにする [長年日記]

/*
  「プログラムでは日本語入力ができないのでSQL文を力づくで作成」をなんとか対応したプログラム
 
  245行目の
 
  //////////////  漢字を書き込めるようにする、魔法の一行
  PQsetClientEncoding(conn, "SJIS"); // 左の通り、クライアント側エンコード指定
  // もしくは、SQL文として「PQExec(conn, "SET CLIENT_ENCODING TO 'SJIS'")」でも可
  ////////////// 
  
  に注目
*/
 
/*
  g++ -g station_sql.cpp -o station_sql.exe -I"D:\PostgreSQL\pg96\include" -L"D:\PostgreSQL\pg96\lib" -llibpq
 
*/
 
/*
   C:\Users\yrl-user>psql -h localhost -U postgres	← ログイン
   postgres=# \l	
   postgres=# create database cx_dx;
   
   以下をコピペする
   create table station_info (
          serial_number int,
          station_name varchar(40),
          longitude real,
          latitude real,
          bus_terminal boolean,
          bus_number int
	);
 */
 
/*
 
ca_db=# \dt station_info
              リレーションの一覧
 スキーマ |     名前     |    型    |  所有者
----------+--------------+----------+----------
 public   | station_info | テーブル | postgres
(1 行)
 
 
ca_db=# \d station_info
         テーブル "public.station_info"
      列       |          型           | 修飾語
---------------+-----------------------+--------
 serial_number | integer               |
 station_name  | character varying(40) |
 longitude     | real                  |
 latitude      | real                  |
 bus_terminal  | boolean               |
 bus_number    | integer               |
 
*/
syntax2html
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#include <sys/types.h>
#include "libpq-fe.h"
 
// 車両状態情報(現在地)
typedef struct location{
  // ちなみに X,Y 軸座標は、→に+  ↑に+
  double longitude; // 経度 東経 139.691 X軸  
  double latitude;  // 緯度 北緯 35.698  Y軸 
} LOCATION;
 
// 路線単位の駅番号
typedef struct station_number{
  int line;
  int number;
} STATION_NUMBER,AREA;
 
// 駅の情報を格納する構造体
typedef struct station{
  int serial_number;
  char name[40];
  LOCATION location;
  int intersection;
  STATION_NUMBER station_number[10];
  int person_number; 
  int bus_number; 
  double diff_tokyo;
}STATION;
 
STATION station[] = {
 
  // 中央線  全長約28km 上り14 下り14   2km で 1本というのは悪くない
  {0,"国分寺",{139.480841,35.700123},1,{{0,0}},0,5,-0.01},
  {1,"武蔵小金井",{139.506483,35.701337},1,{{0,1}},0,0,-0.01},
  {2,"東小金井",{139.524837,35.701643},1,{{0,2}},0,0,-0.01},
  {3,"武蔵境",{139.543402,35.702083},1,{{0,3}},0,5,-0.01},
  {4,"三鷹",{139.560325,35.702683},1,{{0,4}},0,0,-0.01},
  {5,"吉祥寺",{139.579765,35.703119},2,{{0,5},{1,0}},0,5,-0.01},
  {6,"西荻窪",{139.599361,35.703842},1,{0,6},0,0,-0.01},
  {7,"荻窪",{139.620109,35.704523},1,{{0,7}},0,5,-0.01},
  {8,"阿佐ヶ谷",{139.635859,35.704872},1,{{0,8}},0,5,-0.01},  
  {9,"高円寺",{139.649664,35.705326},1,{{0,9}},0,0,-0.01},
  {10,"中野",{139.665835,35.705765},1,{{0,10}},0,0,-0.01},
  {11,"新宿",{139.700464,35.689729},4,{{0,11},{2,0},{2,29},{3,23}},0,5,-0.01},
  {12,"四ツ谷",{139.730644,35.686041},1,{{0,12}},0,5,-0.01},
  {13,"御茶ノ水",{139.764955,35.699605},1,{{0,13}},0,0,-0.01},
  {14,"神田",{139.770641,35.691173},1,{{0,14}},0,0,-0.01},
  {15,"東京",{139.766103,35.681391},2,{{0,15},{2,13}},0,5,-0.01},
  // 合計15駅
 
  // 京王井の頭線 全長12.55km 上り6 下り6
 
  //吉祥寺	139.580306	35.702291(既出) {1,0}
  {16,"井の頭公園",{139.583112,35.697304},1,{{1,1}},0,0,-0.01},
  {17,"三鷹台",{139.589298,35.692046},1,{{1,2}},0,0,-0.01},
  {18,"久我山",{139.599308,35.688151},1,{{1,3}},0,5,-0.01},
  {19,"富士見ヶ丘",{139.607072,35.684805},1,{{1,4}},0,0,-0.01},
  {20,"高井戸",{139.615115,35.683253},1,{{1,5}},0,0,-0.01},
  {21,"西永福",{139.634936,35.678918},1,{{1,6}},0,0,-0.01},
  {22,"永福町",{139.6404349,35.6762763},1,{{1,7}},0,5,-0.01},
  {23,"明大前",{139.650352,35.668758},2,{{1,8},{3,18}},0,5,-0.01},
  {24,"東松原",{139.655535,35.662634},1,{{1,9}},0,0,-0.01},
  {25,"新代田",{139.660524,35.662593},1,{{1,10}},0,0,-0.01},
  {26,"下北沢",{139.6649004,35.661563},1,{{1,11}},0,5,-0.01},
  {27,"渋谷",{139.699553,35.6581046},2,{{1,12},{2,3}},0,5,-0.01},
 
  // 山手線 全長34.5km → 上り15 下り15
  //新宿	139.700464	35.689729(既出) {2,0}
  {28,"代々木",{139.702042,35.683061},1,{{2,1}},0,0,-0.01},
  {29,"原宿",{139.702592,35.670646},1,{{2,2}},0,0,-0.01},
  // 渋谷	139.701238	35.658871(既出) {2,3}
  {30,"恵比寿",{139.71007,35.646685},1,{{2,4}},0,0,-0.01},
  {31,"目黒",{139.715775,35.633923},1,{{2,5}},0,0,-0.01},
  {32,"五反田",{139.723822,35.625974},1,{{2,6}},0,0,-0.01},
  {33,"大崎",{139.728439,35.619772},1,{{2,7}},0,0,-0.01},
  {34,"品川",{139.738999,35.62876},1,{{2,8}},0,0,-0.01},
  {35,"田町",{139.747575,35.645736},1,{{2,9}},0,0,-0.01},
  {36,"浜松町",{139.757135,35.655391},1,{{2,10}},0,0,-0.01},
  {37,"新橋",{139.758587,35.666195},1,{{2,11}},0,5,-0.01},	
  {38,"有楽町",{139.763806,35.675441},1,{{2,12}},0,0,-0.01},	
  // 東京	139.766103	35.681391(既出){2,13}
  {39,"神田",{139.770641,35.691173},1,{{2,14}},0,0,-0.01},	
  {40,"秋葉原",{139.773288,35.698619},1,{{2,15}},0,5,-0.01},
  {41,"御徒町",{139.774727,35.707282},1,{{2,16}},0,0,-0.01},
  {42,"上野",{139.777043,35.71379},1,{{2,17}},0,5,-0.01},
  {43,"鶯谷",{139.778015,35.721484},1,{{2,18}},0,0,-0.01},
  {44,"日暮里",{139.771287,35.727908},1,{{2,19}},0,5,-0.01},
  {45,"西日暮里",{139.766857,35.731954},1,{{2,20}},0,0,-0.01},
  {46,"田端",{139.761229,35.737781},1,{{2,21}},0,5,-0.01},
  {47,"駒込",{139.748053,35.736825},1,{{2,22}},0,0,-0.01},
  {48,"巣鴨",{139.739303,35.733445},1,{{2,23}},0,0,-0.01},
  {49,"大塚",{139.728584,35.731412},1,{{2,24}},0,0,-0.01},
  {50,"池袋",{139.711461,35.72913},2,{{2,25},{5,7}},0,5,-0.01},
  {51,"目白",{139.706228,35.720476},1,{{2,26}},0,0,-0.01},
  {52,"高田馬場",{139.703715,35.712677},2,{{2,27},{4,17}},0,5,-0.01},
  {53,"新大久保",{139.700261,35.700875},1,{{2,28}},0,0,-0.01},
  // 新宿 139.700464	35.689729(既出) {2,29}
 
  // 京王線 駅数24  全長15.23km 上り7 下り7
  {54,"府中",{139.4799,35.672245},1,{{3,0}},0,5,-0.01},
  {55,"東府中",{139.495257,35.668766},1,{{3,1}},0,0,-0.01},
  {56,"多磨霊園",{139.502615,35.666197},1,{{3,2}},0,0,-0.01},
  {57,"武蔵野台",{139.511289,35.664159},1,{{3,3}},0,0,-0.01},
  {58,"飛田給",{139.523666,35.660121},1,{{3,4}},0,5,-0.01},
  {59,"西調布",{139.529822,35.657169},1,{{3,5}},0,0,-0.01},
  {60,"調布",{139.543988,35.652181},1,{{3,6}},0,0,-0.01},
  {61,"布田",{139.551557,35.649904},1,{{3,7}},0,0,-0.01},
  {62,"国領",{139.558036,35.650087},1,{{3,8}},0,0,-0.01},
  {63,"柴崎",{139.56658,35.653997},1,{{3,9}},0,0,-0.01},
  {64,"つつじヶ丘",{139.575103,35.657936},1,{{3,10}},0,5,-0.01},
  {65,"仙川",{139.584908,35.662257},1,{{3,11}},0,0,-0.01},
  {66,"千歳烏山",{139.60067,35.667921},1,{{3,12}},0,5,-0.01},
  {67,"芦花公園",{139.608247,35.670479},1,{{3,13}},0,0,-0.01},
  {68,"八幡山",{139.614927,35.669982},1,{{3,14}},0,0,-0.01},
  {69,"上北沢",{139.62329,35.668857},1,{{3,15}},0,0,-0.01},
  {70,"桜上水",{139.63129,35.66768},1,{{3,16}},0,0,-0.01},
  {71,"下高井戸",{139.641372,35.66615},1,{{3,17}},0,0,-0.01},
  // 明大前	139.650352	35.668758(既出){3,18}
  {72,"代田橋",{139.659413,35.671092},1,{{3,19}},0,0,-0.01},
  {73,"笹塚",{139.667251,35.673758},1,{{3,20}},0,5,-0.01},
  {74,"幡ヶ谷",{139.676183,35.677061},1,{{3,21}},0,0,-0.01},
  {75,"初台",{139.686354,35.68123},1,{{3,22}},0,0,-0.01},
  // 新宿	139.699187	35.690163(既出){3,23}
 
  // 西武新宿線 全長20.42km 上り9 下り9 18駅
 
  {76,"小平",{139.488491,35.736963},1,{{4,0}},0,5,-0.01},
  {77,"花小金井",{139.513228,35.726129},1,{{4,1}},0,0,-0.01},
  {78,"田無",{139.539259,35.727307},1,{{4,2}},0,0,-0.01},
  {79,"西武柳沢",{139.552477,35.728621},1,{{4,3}},0,5,-0.01},   // No:79
  {80,"東伏見",{139.563529,35.728761},1,{{4,4}},0,0,-0.01},
  {81,"武蔵関",{139.576417,35.7276},1,{{4,5}},0,0,-0.01},
  {82,"上石神井",{139.592266,35.726189},1,{{4,6}},0,0,-0.01},
  {83,"上井草",{139.602937,35.725326},1,{{4,7}},0,0,-0.01},
  {84,"井荻",{139.615303,35.72469},1,{{4,8}},0,0,-0.01},
  {85,"下井草",{139.624688,35.723852},1,{{4,9}},0,5,-0.01},
  {86,"鷺ノ宮",{139.63892,35.722605},1,{{4,10}},0,0,-0.01},
  {87,"都立家政",{139.644839,35.722313},1,{{4,11}},0,0,-0.01},
  {88,"野方",{139.652733,35.719658},1,{{4,12}},0,0,-0.01},
  {89,"沼袋",{139.663841,35.719458},1,{{4,13}},0,5,-0.01},       // No:89
  {90,"新井薬師前",{139.672582,35.715778},1,{{4,14}},0,0,-0.01}, // No:90
  {91,"中井",{139.686967,35.715106},1,{{4,15}},0,0,-0.01},
  {92,"下落合",{139.695391,35.715846},1,{{4,16}},0,5,-0.01},
  // 高田馬場	139.703715	35.712677(既出){4,17}
 
  // 西武池袋線 全長8.2km  上り4 下り4  8駅
  {93,"富士見台",{139.62969,35.735867},1,{{5,0}},0,5,-0.01},
  {94,"中村橋",{139.637456,35.736767},1,{{5,1}},0,0,-0.01},
  {95,"練馬",{139.654368,35.737893},1,{{5,2}},0,0,-0.01},
  {96,"桜台",{139.662602,35.738797},1,{{5,3}},0,0,-0.01},
  {97,"江古田",{139.672814,35.737557},1,{{5,4}},0,0,-0.01},  //
  {98,"東長崎",{139.683294,35.73003},1,{{5,5}},0,5,-0.01},
  {99,"椎名町",{139.694363,35.726572},1,{{5,6}},0,0,-0.01},
  // 池袋	139.711461	35.72913(既出){5,7}
 
  {-1,"",{0,0},0} // 終了
};
 
const char *conninfo = "host=localhost user=postgres password=x-axexoxe dbname=cx_dx";
PGconn *conn;
 
int main()
{
  // データベースとの接続を確立する 
  conn = PQconnectdb(conninfo);
 
  // 先ずはデータの全消去
  PGresult *res = PQexec(conn, "DELETE FROM station_info;");
  PQclear(res);
  
  // バックエンドとの接続確立に成功したかを確認する */
  if (PQstatus(conn) != CONNECTION_OK){
	fprintf(stderr, "Connection to database failed: %s",
			PQerrorMessage(conn));
  }
 
  //////////////  漢字を書き込めるようにする、魔法の一行
  PQsetClientEncoding(conn, "SJIS"); // 左の通り、クライアント側エンコード指定
  // もしくは、SQL文として「PQExec(conn, "SET CLIENT_ENCODING TO 'SJIS'")」でも可
  ////////////// 
 
  for (int i = 0; i < 100; i++){
	char stringSQL[256] = {0};
	char tfflag[2] = {0};
	
	if (station[i].bus_number > 0){
	  strcpy(tfflag, "t");
	} else {
	  strcpy(tfflag, "f");
	}
	
	sprintf(stringSQL, "INSERT INTO station_info(serial_number,longitude, latitude, bus_number, bus_terminal, station_name) VALUES(%d,%f,%f,%d,'%s','%s');",
			station[i].serial_number,
			station[i].location.longitude,
			station[i].location.latitude,
			station[i].bus_number,
			tfflag,
			station[i].name);
	
#if 0
	printf("%s\n",stringSQL);
#endif
	
	PGresult *res = PQexec(conn, stringSQL);
	if (res == NULL || PQresultStatus(res) != PGRES_COMMAND_OK) {
	  // SQLコマンドが失敗した場合
	  fprintf(stderr, "INSERT COMMAND IS FAILED.",
			  PQerrorMessage(conn));
	}
	
	// 値セットが無い場合でも必ず結果をクリアする
	PQclear(res);
  }
  
  return 0;
}
syntax2html

2018-01-26 postgreSQLデータベースからの読み出すプログラム [長年日記]

/*
   postgreSQLデータベースからの読み出し テストプログラム
*/
 
/*
  g++ -g read_sql.cpp -o read_sql.exe -I"D:\PostgreSQL\pg96\include" -L"D:\PostgreSQL\pg96\lib" -llibpq
*/
 
 
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#include <sys/types.h>
#include "libpq-fe.h"
 
const char *conninfo = "host=localhost user=postgres password=c-anemone dbname=ca_db";
PGconn *conn;
 
int main()
{
  // データベースとの接続を確立する 
  conn = PQconnectdb(conninfo);
 
  // バックエンドとの接続確立に成功したかを確認する */
  if (PQstatus(conn) != CONNECTION_OK){
	fprintf(stderr, "Connection to database failed: %s",
			PQerrorMessage(conn));
  }
 
  char stringSQL[256] = {0};
	
 
  sprintf(stringSQL, "SELECT * FROM side_list where s = 90;"); // 検索条件
  PGresult *res = PQexec(conn, stringSQL);
 
  // エラーチェック
  if( PQresultStatus( res ) != PGRES_TUPLES_OK ) {
    // error
    printf("error_2");
    exit(-1);
  }  
 
  int res_cnt = PQntuples( res ); // 検索数を得る
 
  for(int loop = 0; loop < res_cnt ; loop++) {
	int a = atoi(PQgetvalue(res, loop, 0));  // 文字列から整数へ
	int b = atoi(PQgetvalue(res, loop, 1));  // 文字列から整数へ
	int c = atoi(PQgetvalue(res, loop, 2));  // 文字列から整数へ
	double d = atof(PQgetvalue(res, loop, 3));  // 文字列から実数へ
 
	printf("a=%d, b=%d, c=%d, d=%f\n", a,b,c,d);
  }
 
  // 値セットが無い場合でも必ず結果をクリアする
  PQclear(res);
 
  
  return 0;
}
syntax2html

2018-01-27 複数のカラムからなるprimary keyを作成する [長年日記]

  create table side_list(
    counter int,
    s int, 
    e int, 
    c real,
    PRIMARY KEY (s, e)
  );