
お世話になっております。
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ベストアンサー
- 回答日時:
★おおよそのアルゴリズムは既に完成しているようですね。
・でもね、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 文などを使えば良い。
・以上。参考に!
毎度ありがとうございます。
なるほど、
ソースが少しすっきりしました。
みなさんの書かれた内容が、分からないことも少なからずあるんです、
分かるまで勉強をすすめたいと思います。
助かりました!
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で)探せばいい。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
SUMPRODUCT関数を用いた最小値
-
エクセル 条件を指定した標準...
-
ExcelのINDEXとMATCH関数でスピ...
-
【VBA】ユーザーフォーム リス...
-
[エクセル]連続する指定範囲か...
-
エクセルで、絶対値の平均を算...
-
【VBA】配列に数式を仕込む方法...
-
VB6.0 ファイルの一括読込み
-
Access2010で二次元配列をプル...
-
Excel VBA 配列の分割について
-
INDEX(D:D,L3)の意味は?
-
文字の場合でもA列の最終行の...
-
array関数で格納した配列の型を...
-
Generic.Listに1次元配列の配...
-
Dictionaryを使い4つの条件の一...
-
Excelのセルの色指定をVBAから...
-
VB.NETで DataRow()を利用して...
-
count(*)で取得した値をJAVAの...
-
テキストボックスのvalueとtext...
-
PHP8でWarning:Undefined varia...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで、絶対値の平均を算...
-
[エクセル]連続する指定範囲か...
-
表にフィルターをかけ、絞った...
-
ExcelのINDEXとMATCH関数でスピ...
-
array関数で格納した配列の型を...
-
Excelのセルの色指定をVBAから...
-
DataSetから、DataTableを取得...
-
Excel オートフィルタのリスト...
-
Datatableへの代入
-
【VBA】ユーザーフォーム リス...
-
配列がとびとびである場合の書き方
-
VBAでの100万行以上のデータの...
-
二次元配列の中の各行の要素を...
-
スプレットシートのGetTextにつ...
-
.NET - 配列変数を省略可能の引...
-
VB6.0 ファイルの一括読込み
-
【VBA】配列に数式を仕込む方法...
-
iniファイルのキーと値を取得す...
-
配列のSession格納、及び取得方...
-
Split関数でLong配列に格納する...
おすすめ情報