#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUFFER_SIZE (256)
#define SIZE 20
struct TStation
{
char s_number[SIZE]; // 駅番号
char s_nameJ[SIZE]; //駅名(日本語)
char s_nameA[SIZE];// 駅名(アルファベット)
float up_long; //上り線での次の駅までの距離
float down_long;//下り線での次の駅までの距離
};
//プロトタイプ宣言
void PrintRoute(int,int,struct TStation *);
float CalcDistance(int,int,struct TStation *);
int CalcTime(float,float);
int CalcCost(float);
int main()
{
char up[SIZE];
char down[SIZE];
int i,j;
char buf[BUFFER_SIZE];
char more;
int up_number,down_number;
//構造体メンバへのデータ代入
struct TStation data[15] =
{
{"K01","国際会館","Kokusaikaikan",0,1.6},
{"K02","松ヶ崎","Matsugasaki",1.6,1.0},
{"K03","北山","Kitayama",1.0,1.2},
{"K04","北大路","Kitaoji",1.2,0.8},
{"K05","鞍馬口","Kuramaguchi",0.8,0.8},
{"K06","今出川","Imadegawa",0.8,1.5},
{"K07","丸太町","Marutamachi",1.5,0.7},
{"K08","烏丸御池","Karasuma Oike",0.7,0.9},
{"K09","四条","Shijo",0.9,0.8},
{"K10","五条","Gojo",0.8,1.0},
{"K11","京都","Kyoto",1.0,0.8},
{"K12","九条","Kujo",0.8,0.7},
{"K13","十条","Jujo",0.7,1.2},
{"K14","くいな橋","Kuinabashi",1.2,0.7},
{"K15","竹田","Takeda",0.7,0},
};
first:;
printf("ーーーーーーーーーー\n");
printf("京都市営地下鉄烏丸線\n");
printf("ーーーーーーーーーー\n");
printf("K01 国際会館 Kokusaikaikan\n");
printf("K02 松ヶ崎 Matsugasaki\n");
printf("K03 北山 Kitayama\n");
printf("K04 北大路 Kitaoji\n");
printf("K05 鞍馬口 Kuramaguchi\n");
printf("K06 今出川 Imadegawa\n");
printf("K07 丸太町 Marutamachi\n");
printf("K08 烏丸御池 Karasuma Oike\n");
printf("K09 四条 Shijo\n");
printf("K10 五条 Gojo\n");
printf("K11 京都 Kyoto\n");
printf("K12 九条 Kujo\n");
printf("K13 十条 jujo\n");
printf("K14 くいな橋 Kuinabashi\n");
printf("K15 竹田 Takeda\n");
printf("乗車ルート,距離,時間,料金を検索します.\n");
printf("駅番号または駅名を入力してください.\n");
input:;
//乗車駅の入力
printf("乗車駅 : ");
fgets(up,BUFFER_SIZE,stdin);
//下車駅の入力
printf("下車駅 : ");
fgets(down,BUFFER_SIZE,stdin);
// 終端処理
for(i = 0; i < SIZE; i++)
{
if(up == '\n')
{
up = '\0';
break;
}
}
// 終端処理
for(i = 0; i < SIZE; i++)
{
if(down == '\n')
{
down = '\0';
break;
}
}
for(i = 0; i < 15; i++)
{
if(strncmp( data.s_number, up, 8) == 0 || strncmp(data.s_nameJ, up, 8) == 0 || strncmp(data.s_nameA, up, 8) == 0)
{
up_number = i;
break;
}
}
for(j = 0; j < 15; j++)
{
if(strncmp( data[j].s_number, down, 8) == 0 || strncmp(data[j].s_nameJ, down, 8) == 0 || strncmp(data[j].s_nameA, down, 8) == 0)
{
down_number = j;
break;
}
}
if(up_number != i || down_number != j)
{
printf("入力に誤りがあります.\n");
printf("もう一度駅番号または駅名を入力してください.\n");
goto input;//inputに戻って再入力
}
//検索結果の表示
printf("ーーーー\n");
printf("検索結果\n");
printf("ーーーー\n");
PrintRoute(up_number,down_number,data);
printf("乗車距離 : %0.1fKm\n",CalcDistance(up_number,down_number,data));
printf("乗車時間 : %d分\n",CalcTime(CalcDistance(up_number,down_number,data),31.6));
printf("乗車料金 : %d円\n",CalcCost(CalcDistance(up_number,down_number,data)));
printf("もう一度調べますか? [y/n] :");
fgets(buf,BUFFER_SIZE,stdin);
//yを入力した時の表示
if(buf[0] == 'y')
{
goto first;
}
//nを入力した時の表示
else if(buf[0] == 'n')
{
printf("終了します.\n");
}
return 0;
}
// 乗車ルートを印字する関数
void PrintRoute( int from, int to, struct TStation *line )
{
int k;
if(from > to)
{
for(k = from; k >= to; k--)
{
printf("○%s %s %s\n",(line + k)->s_number,(line + k)->s_nameJ,(line + k)->s_nameA);
if(k == to)
{
break;
}
printf("|\n|%0.1fkm\n|\n",(line + k)->up_long);
}
}
else
{
for(k = from; k <= to; k++)
{
printf("○%s %s %s\n",(line + k)->s_number,(line + k)->s_nameJ,(line + k)->s_nameA);
if(k == to)
{
break;
}
printf("|\n|%0.1fkm\n|\n",(line + k)->down_long);
}
}
}
// 乗車距離を求める関数
float CalcDistance( int from, int to, struct TStation *line )
{
int k;
float lon = 0;
if(from > to)
{
for(k = from; k > to; k--)
{
lon += (line + k)->up_long;
}
}
else
{
for(k = from; k < to; k++)
{
lon += (line + k)->down_long;
}
}
return lon;
}
//乗車時間を求める関数
int CalcTime( float distance, float perHour )
{
float f_time;
int time;
f_time = distance / perHour * 60;
time = f_time;
if((f_time - time) >= 0.5)
{
time++;
}
return time;
}
// 乗車距離から料金を計算する関数
int CalcCost( float distance )
{
int money;
//距離が3km以下の時
if(distance <= 3)
{
money = 210;
}
//距離が3~7kmの時
else if(distance > 3 && distance <= 7)
{
money = 250;
}
//距離が7~11kmの時
else if(distance > 7 && distance <= 11)
{
money = 280;
}
//距離が11~15kmの時
else if(distance > 11 && distance <= 15)
{
money = 310;
}
//距離が15km~の時
else
{
money = 350;
}
return money;
}
大まかには何をしているかはわかるのですが、細かいところがわかりません。
誰にでもわかりやすく説明できるようにしたいのでよろしくお願いします。