小生想写一套宾馆管理系统,可是价钱计算这块小生实在写不出来了。要求是这样的: 一天房价是80元,每天下午2点算一天;
入住8小时便算一天钱,不到8小时算半天;
到14点算一天,如果当日12点以后入住的,准备住一天,到当日14点这两个小时便免费 (比如13:59入住,到 14:00算钱显然不合适)。算出结账时一共多少钱。
谢谢大哥们了!!

解决方案 »

  1.   

    這個問題我覺得和程序沒多大關係,主要還是邏輯上的問題,我建議樓主盡量自己想想,鍛煉一下,問別人答案沒有好處。我說下我的理解。
    首先,判斷入住時間和退房時間的日期是否大於等於1,如果小於1,也就是說當天住當天退,那麼只需要判斷是否大於8小時即可,小於8小時就是半天,大於等於8小時就是1天。
    如果入住時間和退房時間的日期大於等於1,那麼整個住宿時間就等於 退房日期-入住日期+入住A+退房B,如下判斷:
    入住時間在0點~6點,那麼入住的當天時間就算1天,即入住A=1.
    入住時間在6點~12點,那麼入住的當天時間就算半天,即入住A=0.5.
    入住時間在12點~24點,那麼入住的當天時間就算零天,即入住A=0.
    退房時間在0點~14點,那麼退房的當天時間就算零天,即退房B=0.
    退房時間在14點~22點,那麼退房的當天時間就算半天,即退房B=0.5.
    退房時間在22點~24點,那麼退房的當天時間就算1天,即退房B=1.程序上的實現應該就很簡單了,做判斷就可以了。
      

  2.   

    上面的有一點遺漏,就是日期等於1,在14點以後入住且小於8小時的,補充下:
    首先,判斷入住時間和退房時間的日期,如果小於1,也就是說當天住當天退,那麼只需要判斷是否大於8小時即可,小於8小時就是半天,大於等於8小時就是1天。
    如果入住時間和退房時間的日期等於1且入住時間小於8小時,算半天。
    如果入住時間和退房時間的日期大於等於1且入住時間大於8小時,那麼整個住宿時間就等於 退房日期-入住日期+入住A+退房B,如下判斷:
    入住時間在0點~6點,那麼入住的當天時間就算1天,即入住A=1.
    入住時間在6點~12點,那麼入住的當天時間就算半天,即入住A=0.5.
    入住時間在12點~24點,那麼入住的當天時間就算零天,即入住A=0.
    退房時間在0點~14點,那麼退房的當天時間就算零天,即退房B=0.
    退房時間在14點~22點,那麼退房的當天時間就算半天,即退房B=0.5.
    退房時間在22點~24點,那麼退房的當天時間就算1天,即退房B=1.
      

  3.   

    晕~CSDN值允许同时回复3人,不能在回复了。不得已只能在注册一个帐号。多见谅!!谢谢大哥们的提醒,我又重新理了一下思路,并且写出了伪代码,大哥们帮看看~~哪里还有问题。重理思路:
    房费:标准间:80元;  钟点房:50元
    退房时间:14点;1.住房可分为标准间(过夜的)和钟点房(假设最多只能住5个小时)    钟点房:50元(刚入住收半价(25元);
                超过半小时 至 5个小时是50元);
                限制钟点房最多只能住5个小时,就是说钟点房没有任何多余计算。
        标准间:80元(刚入住收半价(40元);
                开标准间的一定是要住一天的(既然开了标准间,住不住够是他的事,没住够也按标准间计算)
    标准间退房说明:每天14点是系统的退房时间;就是到昨天14:00— 今天14:00算一天。
              入住8小时便算一天。不到8小时算半天;
              
    退房波动值说明:
              12:00(假设) — 13:59 这段时间算波动值。(例如13:59入住,到14:00退房,这一分钟不应该收费。)
              波动值仅仅是在刚登记时有效。-------------------------------------------------------
    我的思路是这样的,不知道对不对.
    就是不算一天的钱,半天半天往上加。
    比如:
    房费:80元/天
    登记后立刻算40元(半天),够八小时加40,到14:00在加40,从14:00够8小时在加40........以此类推。
    --------------------------------------------------------伪代码:$入住时间 = 2000-01-01 03:00   //登记时的时间
    $系统时间 = 2000-01-02 14:32   //读取系统时间date()函数
    $半天房价= $房价 / 2           //算出半天房价
    $房价 = 80                     //标准间房价80元一天if($入住时间 = [12点到13:59这个区间])
    {
        $价格= 0;
        $入住天数 = 0;
    }
    else{
        $入住天数 =0.5                 //登记后立刻算半天
         $价格 = $半天房价;             //累加变量。一登记算半天房价
    }
    if($系统时间 ==14点){
        $价格$价格 + $半天房价    $入住天数 = $入住天数 +0.5
    }
    if($入住时间 + (距离14点的8个小时)){
        $价格 = $价格 + $半天房价    $入住天数 = $入住天数 +0.5
    }if([12点到13:59这个区间] 到 [12点到13:59这个区间]  结账了)
    {
        $价格$半天房价;
        $入住天数 = 0.5;
    }
    价格文本框输出:$价格
    天数文本框输出:$入住天数
    可是大哥们代码该如何写呢~~~~不知道从何下手......
      

  4.   


    代码实现如下://应付房费
    $total_pay=0;
    //入住天数
    $in_days=0;//房价
    $price = 80; //标准间房价80元一天
    //半天房价
    $half_price= $price / 2; //算出半天房价//入住时间
    $in_time = new DateTime('2011-02-05 03:00'); //登记时的时间
    //系统时间,即退房时间,此处设置一下默认值
    $sys_time = new DateTime('2011-02-06 14:32'); //读取系统时间date()函数$date_tmp=new DateTime();
    $start_time=new DateTime($date_tmp->format('Y-m-d').' 12:00:00');
    $end_time=new DateTime($date_tmp->format('Y-m-d').' 13:59:59');
    if($in_time<= $end_time && $in_time>= $start_time)
    {
      $total_pay= 0;
      $in_days = 0;
    }
    else{
      $in_days =0.5 ; //登记后立刻算半天
      $total_pay = $half_price; //累加变量。一登记算半天房价
    }
    if($sys_time->format('H') =='14'){
      $total_pay= $total_pay + $half_price;
        $in_days = $in_days +0.5;
    }
    if($入住时间 + (距离14点的8个小时)){
      $total_pay = $total_pay + $half_price;
      $in_days = $in_days +0.5;
    }if([12点到13:59这个区间] 到 [12点到13:59这个区间] 结账了)
    {
      $total_pay= $half_price;
      $in_days = 0.5;
    }
    echo '价格为:'.$total_pay.'<br />';
    echo '入住天数为:'.$in_days;但是:if($入住时间 + (距离14点的8个小时)){ 和if([12点到13:59这个区间] 到 [12点到13:59这个区间] 结账了)这两句话看不明白意思,第二感觉语法不通,为什么两个时间段一样呢?开始时间和结束时间一样不就相当于等于[12点到13:59这个区间]这个时间点了吗?
      

  5.   

    $DefPrice = 80;                    //标准间房价80元一天
    $HalfPrice= $DefPrice / 2;         //算出半天房价
    $StartDate = "2000-01-01 18:00";   //登记时的时间
    $SysDate = "2000-01-03 15:00";     //读取系统时间date()函数for($StartDate,$SysDate){   //时间按小时循环,看从登记时间到现在时间一共过了多少个小时
        if($StartDate < 8小时){
            $Price = $HalfPrice;    //累加变量。一登记算半天房价
            $Day =0.5;              //天数
        
        }
        elseif($StartDate > 8小时){        $Price = $Price + $HalfPrice;   //累加变量。一登记算半天房价
            $Day = $Day + 0.5;              //天数累加
        }
        elseif($StartDate > 超过24小时){        $Price = $Price + $HalfPrice;   //累加变量。一登记算半天房价
            $Day = $Day + 0.5;              //天数累加
        }
        
    }价格:<input type="text" value="<?php echo $Price ?>" /><br />
    入住天数:<input type="text" value="<?php echo $Day ?>" />大致是这个思路,语法还是有问题。
    意思是一天加两次钱,够8小时+40,够24小时+40,每天循环,以此类推....
    可是这个循环怎么写啊??迷茫......
      

  6.   

    谢谢大哥们了!问题解决了!!
    把结果在这里重新整理一下。宾馆系统的算法就是从入住时间开始,8小时以内算半天,超过8小时算一天。直到24小时结束。第二天继续,不够8小时算半天,超过8小时算一天。
    比如:
    价格:80元/ 天
    1月1日1点入住;
       那么到1月1日9点以前都算半价(40元);
       超过九点在加半价(40元),就是一天的价格
       到1月2日1点,在加40元,价格变成了120元
       到1月2日9点,在加40元,价格变成160元
       ......
    实现代码如下:
    <?php
    date_default_timezone_set('Asia/Chongqing');  //设置默认时区$a = strtotime("2011-02-09 03:32");
    //入住的时候,用函数 time() 获取一个时间戳。这里取33个小时测试, 你自己把变量 $a 改为入住时的时间戳。$day =  floor((time() - $a) / 3600 / 24);  //天数
    $hour = floor((time() - $a) / 3600) - $day * 24; //小时数
    $minute = floor((time() - $a) / 60) - $day * 24 * 60 - $hour * 60; //分钟数$y = ($hour == 0) ? 0 : (($hour < 8) ? 40 : 80);  //判断是否多出8小时,这里要判断 0 的情况$time = $day.'天'.$hour.'小时'.$minute.'分'; //入住时间
    $pay = $day * 80 + $y; //费用
    echo '入住时间: '.$time.'<br>';
    echo '住宿费: '.$pay;
    ?>