/* 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"); } }
_ https://dotinstall.com/lessons/basic_postgresql
/* 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');
/* 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); }
/* 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; }
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);
現在世界全体のGDPは、2016年(IMF調査結果)で、75,367,754百万米ドル x 1000000 x 110 = 8290兆円 であり、8290、4529.4億円シェアリングエコノミーは、2025年に 世界で36.85兆円 と規模としては小さい ( 0.4%程度) 。しかし 日本の場合532兆円 に対して 15兆円ほど (2.8%)となることが推測されている。
日本は、世界水準の7倍のシェアリングエコノミーの可能性があるという見方もできる。
内容 | コマンド例 |
---|---|
サービスの起動 | 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 ファイル名 |
/* 「プログラムでは日本語入力ができないので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 | */
#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; }
/* 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; }
create table side_list( counter int, s int, e int, c real, PRIMARY KEY (s, e) );