dポイントプレゼントキャンペーン実施中!

お世話になっております。
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関数)や、構造体等をどこにどのように使って
コーディングすればいいのか分かりません。
入門書を読みながら勉強をしているのですが、載っていない内容が多数ありまして。。。

最近もこちらで質問をし、みなさんから親切に教えて頂いてとてもよい勉強になりました。

長々と申し訳ありません。
ご教授願います。

A 回答 (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 文などを使えば良い。
・以上。参考に!
    • good
    • 0
この回答へのお礼

毎度ありがとうございます。
なるほど、
ソースが少しすっきりしました。

みなさんの書かれた内容が、分からないことも少なからずあるんです、
分かるまで勉強をすすめたいと思います。

助かりました!

お礼日時:2007/05/11 07:34

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で)探せばいい。
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/05/11 07:22

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!