
お世話になっております。
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で質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBAで、1つのエクセルで、2つのシートからもう1つのシートに条件のある転記コードを教えてください。 1 2023/03/16 18:07
- Excel(エクセル) EXCEL 関数を教えてください。(A列の同じ値が複数ある場合vlookupで出来ますか) 4 2022/12/07 20:54
- Visual Basic(VBA) VBAでのMATCH関数 3 2022/10/17 19:06
- Visual Basic(VBA) VBA シート間の転記で、条件の追加コードの書き方について教えて下さい。 13 2023/02/26 09:31
- PHP PHP MySql ページング 2 2022/09/20 06:38
- Excel(エクセル) Excelで質問です! 現在マクロを勉強中の初心者です。 以下のような表から、会社名が空白のもの以外 2 2022/06/14 12:16
- Excel(エクセル) EXCELで次の数式を教えてください。 5 2022/11/23 18:33
- オープンソース Python openpyxlを使用したセル番地の使用について 1 2023/08/03 22:05
- 英語 No way!の相手の能力や素質を否定する可能性について 5 2023/06/11 18:55
- Excel(エクセル) vba シート名の一覧を2列に分けるには 5 2023/04/24 08:56
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
表にフィルターをかけ、絞った...
-
[エクセル]連続する指定範囲か...
-
配列がとびとびである場合の書き方
-
Datatableへの代入
-
エクセルで、絶対値の平均を算...
-
array関数で格納した配列の型を...
-
Excelのセルの色指定をVBAから...
-
ExcelのINDEXとMATCH関数でスピ...
-
EXCEL VBA 2次元配列に格納さ...
-
iniファイルのキーと値を取得す...
-
配列のSession格納、及び取得方...
-
【VBA】ユーザーフォーム リス...
-
VBAでの100万行以上のデータの...
-
.NET - 配列変数を省略可能の引...
-
2次元配列への格納方法について
-
Excel VBA 配列の分割について
-
エクセルでエラーを無視して一...
-
DataSetから、DataTableを取得...
-
Access VBA Split利用方法
-
リストボックスの列見出し(Exc...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで、絶対値の平均を算...
-
[エクセル]連続する指定範囲か...
-
表にフィルターをかけ、絞った...
-
ExcelのINDEXとMATCH関数でスピ...
-
Excelのセルの色指定をVBAから...
-
Excel オートフィルタのリスト...
-
DataSetから、DataTableを取得...
-
array関数で格納した配列の型を...
-
読み込みで一行おきに配列に格納
-
.NET - 配列変数を省略可能の引...
-
【VBA】ユーザーフォーム リス...
-
配列がとびとびである場合の書き方
-
SUMPRODUCT関数を用いた最小値
-
iniファイルのキーと値を取得す...
-
VBAでの100万行以上のデータの...
-
エクセルでエラーを無視して一...
-
配列のSession格納、及び取得方...
-
VBA 配列に格納した値の平均の...
-
VB6.0 ファイルの一括読込み
-
Datatableへの代入
おすすめ情報