質問: 構造体を使った時刻表(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関数)や、構造体等をどこにどのように使って コーディングすればいいのか分かりません。 入門書を読みながら勉強をしているのですが、載っていない内容が多数ありまして。。。 最近もこちらで質問をし、みなさんから親切に教えて頂いてとてもよい勉強になりました。 長々と申し訳ありません。 ご教授願います。
回答: ★おおよそのアルゴリズムは既に完成しているようですね。 ・でもね、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 文などを使えば良い。 ・以上。参考に!