0時~23時という時間表記があります。

AccessStartHourが6、AccessHoursが3
だとすると6時スタートで6、7、8の3時間のアクセスが可能という意味です。
この時間以外はアクセス禁止という条件文を作りたいと考えています。
しかし例えば22時から5時間だと0時をはさんで22、23、0、1、2となりどうやってif文を作ったらいいか混乱してしまいました。
すべての条件を満たすif文を教えてください。
AccessStartHour>=24またはAccessHours=0ではアクセス禁止という条件も入れてください。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2008/10/19 00:42:00
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:Mook No.1

回答回数1314ベストアンサー獲得回数393

ポイント60pt

コメントが無効なので回答で失礼します。


使用している言語が不明ですのでとりあえずC言語を例に回答しますが、

アルゴリズムは共通ですのでご使用の言語に変換して考えてください。


現在時刻を示す変数を currentHour とすると、

// 現在時間がアクセス可能時間より前だったら、24時間を足す
    currentHour += ( AccessStartHour > currentHour ) ? 24 : 0;

// 普通にアクセス開始時間とそれ以降の可能時間の間にあるかどうかを比較する
    if ( ( currentHour < AccessStartHour )
      || ( currentHour >= AccessStartHour + AccessHours )
      || ( AccessStartHour >= 24 )
      || ( AccessHours == 0 ) ) {
        accessDeny(); // アクセス禁止処理
    } else {
        accessAllow(); // アクセス許可処理
    }
id:plugbot

Cはあまり分からないのですが、最初の条件文は

if(AccessStartHour > currentHour )currentHour = currentHour + 24;

これでも大丈夫ですよね?

動作は確認しましたが間違っていると悪いので・・・

2008/10/19 00:25:46
  • id:Mook
    >if(AccessStartHour > currentHour )currentHour = currentHour + 24;

    コメントでの確認はそのとおりです。
  • id:plugbot
    回答ありがとうございました
  • id:deepskyblue
    間に合いませんでしたね><
    一応・・1行でする方法です^^;
    n が 確認する時間です。

    if ((AccessStartHour < 24) and (AccessHours > 0) and (((AccessStartHour <= n) and ((AccessStartHour + AccessHours) > n)) or ((AccessStartHour + AccessHours - 24) >= n))) {
     //アクセス可能
    } else {
     //アクセス不可
    }
  • id:plugbot
    ご丁寧にコメントいただきありがとうございます。
    参考にさせていただきます。
  • id:Mook
    1点修正です。

    今回のケースでは、
      currentHour += ( AccessStartHour > currentHour ) ? 24 : 0;
    によって、currentHour が AccessStartHour より小さくなることはないですから、条件は

      if ( ( currentHour >= AccessStartHour + AccessHours )
       || ( AccessStartHour >= 24 )
       || ( AccessHours == 0 ) ) {
    だけで十分ですね。

    書き方はいろいろとありますが、短さよりもわかりやすさが重要なケースもあります。
    今回の程度の条件なら、deepskyblue さんの書き方でも許容範囲だとは思いますが、
    論理演算は単純な構成にしておいた方が、変更や拡張時にバグを引き起こしにくいでしょう。

    機能的に優れたコードを書くことも大切ですが、可読性・拡張性に優れたコードを書くことも、
    プログラミングでは大切な要素です。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません