• ベストアンサー

構造体を使った時刻表(C)

お世話になっております。 Cの勉強をしております、初心者です。 No1、現在の時刻を取得 No2、現在の「時」の配列を取得 No3、その中の現在の「分」に近い値を取得   (例)現在時刻が9時5分だとすると、下記時刻表内容であれば      9時配列中の10分を取得    8時→{4 13 19....}    9時→{5 10 16 22....};   10時→{5 16 29....}     No4ー1 現在時刻が59分だった場合や、その時間帯に列車が無かった      場合は、取得した「時」に+1し、次の「時」の配列を取得      *上記No4ー1に該当しない場合はNo5へ       No4ー2 上記 No3で取得した「分」を0(ゼロ)分にする No4ー3 上記No3に戻って、列車の時刻を取得できるまで      No3~No4ー3をループ No5 結果表示  No6 Enter押下  No7 No1に戻る 上記内容のフローがやっとできた段階で悩んでいまして、 サンプルソース等見せて頂ければ幸いです。 使ったことのない関数(time関数)や、構造体等をどこにどのように使って コーディングすればいいのか分かりません。 入門書を読みながら勉強をしているのですが、載っていない内容が多数ありまして。。。 最近もこちらで質問をし、みなさんから親切に教えて頂いてとてもよい勉強になりました。 長々と申し訳ありません。 ご教授願います。

質問者が選んだベストアンサー

  • ベストアンサー
  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.2

★おおよそのアルゴリズムは既に完成しているようですね。 ・でもね、No.2 の現在の『時』の配列を取得するよりも時刻表のデータを1つの  テーブル・データ配列にまとめた方が No.4 の現在時刻が 59 分だった場合に  次の時間帯に移動しやすくなりますよ。時間帯によって配列を分けるやり方も  ありますが、私ならば連続させます。 ・下にそのテーブル・データ配列を載せます。 テーブル内容: static int table[] = {  …, …, …,  804, 813, 819, …,  905, 910, 916, 922, …,  1005, 1016, 1029, …,  …, …, …,  -1, ←テーブルの終端を表す値(重要) }; 解説: ・上記のテーブル内容は『時×100+分』という値を1つの時・分として管理しています。  つまり、8時5分ならば 8×100+5=805 と考えています。→私の考えはね。 ・それで現在時刻が9時5分ならば、テーブル内で 905 以上の最初の1つを探す関数を  作成します。検索方法は  (1)900 の数値が現れるまでテーブル内容をサーチ移動します。  (2)900 が見つかったらば 905 以上になった最初の1つを返します。  (3)もしも 905 以上が見つからなくて -1 が現れたらば No.5 の結果表示をすれば良い。 ・上記の方法ならば、59 分で見つからない場合は次の『時』の配列を取得して再検索など  しなくても簡単に次の時刻表に移動できます。このため、No4-2 で『分』を 00 分に  リセットもしなくて良い。 ・まぁ、上記のは私のアルゴリズムですけど。参考に。 参考ソース: int findtime = 905; ←現在の時刻の値 int *search; for ( search = table ; *search != -1 ; search++ ){  if ( *search > findtime ){   break;  } } /* 結果表示 */ if ( *search == - 1 ){  printf( "見つからなかった。\n" ); } else{  printf( "次の時刻は%02d時%02d分を発見!\n",   (*search / 100),  ←『時』要素を取り出す   (*search % 100) ); ←『分』要素を取り出す } その他: ・上記の参考ソースは検索関数として作成した方が分かりやすいでしょう。  引数に現在の時刻を表す整数値(905)などを与え、戻り値に発見された時刻を返します。  もしも、時刻表テーブル配列(table)より時刻が見つからなければ -1 などをエラーとして  返せばよい。main() で呼び出すときは、エラーをチェックして結果を表示すれば良い。 ・あとは一時停止した後 Enter の押し下げで繰り返すように while 文などを使えば良い。 ・以上。参考に!

onarav
質問者

お礼

毎度ありがとうございます。 なるほど、 ソースが少しすっきりしました。 みなさんの書かれた内容が、分からないことも少なからずあるんです、 分かるまで勉強をすすめたいと思います。 助かりました!

その他の回答 (1)

回答No.1

struct departure {  int h; /* 時 */  int m; /* 分 */ }; struct departure timetable[] = {  { 8, 4}, { 8, 13}, { 8, 19 } ... }; なんて時刻表を用意しておき、 与えられた現在時刻 x = {hh,mm} に対して timetable[i-1] <= x かつ x < timetable[i] を満たすiを(for-loopで)探せばいい。

onarav
質問者

お礼

迅速なお答えありがとうございます。 さっそくやってみます