2017-01-02 53 views
-1

我有這種情況。合併if語句與邏輯相關條件

**更新了我的代碼,它可以以我想要的方式工作。 *澄清代碼的要求(全程序)

如果我給

開始時間:2時30分30秒

停止時間:2點30分25秒

我應該得到

已過時:23:59:55

得到它了嗎?它穿過午夜......進入第二天......

這就是我想要的,它的工作原理!

我有這五個if語句與邏輯相關的條件。

該計劃得到所需的輸出,但有可能結合這些,如果以任何方式聲明(不是使用「或」經營者和賺取豐厚的條件等;像嵌套,如果也許有條件的經營者

//time elapsed program 
//including support for time crossing midnight into the next day 
#include<stdio.h> 

struct time 
{ 
    int hour; 
    int minute; 
    int second; 
}; 

struct time timeElapsed(struct time, struct time); 

int main() 
{ 
    struct time start, stop, elapse; 

    printf("Enter start time (hh:mm:ss) : "); 
    scanf("%d:%d:%d", &start.hour, &start.minute, &start.second); 
    printf("Enter stop time (hh:mm:ss) : "); 
    scanf("%d:%d:%d", &stop.hour, &stop.minute, &stop.second); 

    elapse = timeElapsed(start, stop); 

    printf("The time elapsed is   : %.2d:%.2d:%.2d", elapse.hour, elapse.minute, elapse.second); 

    return 0; 
} 

struct time timeElapsed(struct time begin, struct time end) 
{ 
    struct time elapse; 

    if(end.hour < begin.hour) 
    end.hour += 24; 

    if(end.hour == begin.hour && end.minute < begin.minute) 
    end.hour += 24; 

    if(end.hour == begin.hour && end.minute == begin.minute && end.second < begin.second) 
    end.hour += 24; 

    if(end.second < begin.second) 
    { 
    --end.minute; 
    end.second += 60; 
    } 

    if(end.minute < begin.minute) 
    { 
    --end.hour; 
    end.minute += 60; 
    } 

    elapse.second = end.second - begin.second; 
    elapse.minute = end.minute - begin.minute; 
    elapse.hour = end.hour - begin.hour; 

    return elapse; 
} 
+0

這有什麼錯用||運營商? – OldProgrammer

+2

你是在效率還是可讀性? – JimmyNJ

+0

OldProgrammer沒有這麼說。他問你爲什麼堅持不使用'||'操作符。它可以簡化您的代碼(例如,以避免編寫'聲明1','聲明2'或'聲明3'一次以上),但是避免大的條件你(我相信任意)約束的作品針對。也可以使用的時間數學(分鐘,小時,秒之間的關係),但你有沒有做到這一點,所以任何人給你一個答案,基於對你的功課,簡直是不負責任的。 – Peter

回答

0

照理你是比較結束時間是否比開始時間早。

如果您可以通過它保留了訂單,那麼你將能夠使用比較單一的映射三個數字轉換成一個。

在這種情況下,轉換爲總秒數突出:

if ( end.hour * 3600L + end.minute * 60 + end.second 
    < begin.hour * 3600L + begin.minute * 60 + begin.second) 

這可能會也可能不會比您的原始代碼更有效。如果你打算經常這樣做,那麼你可以使用inline函數將時間轉換爲總秒數。

0

所以前三項測試等於檢查「結束<開始」。假設字段已經驗證,在範圍之內(即.minute和。第二既0..59)爲什麼不轉換成秒,他們直接比較,比如:

if((end.hour * 3600 + end.minute * 60 + end.second) < 
    (begin.hour * 3600 + begin.minute * 60 + begin.second)) 

對我來說這是源更加明顯,並在一個現代的CPU可能會產生更好的代碼(即假設分支昂貴,整數乘法便宜)

要看看這兩種方法如何比較這裏是一個Godbolt版本的兩個這樣的比較函數編譯與Clang 3.9 -O3( 21對11指令,我沒有計算代碼字節或嘗試猜測執行時間)。下面

https://godbolt.org/g/Ki3CVL

0

代碼不同於OP的邏輯有點,但我認爲這相匹配的真正目的(也許不是)


同類項和規模減。通過在縮放之前減去,溢出機會減少。

#define MPH 60 
#define SPM 60 
int cmp = ((end.hour - begin.hour)*MPH + (end.minute - begin.minute))*SPM + 
    (end.second - begin.second); 

if (cmp < 0) Time_After(); 
else if (cmp > 0) Time_Before(); 
else Time_Same();  
+0

添加完整的程序,檢查出來,如果u能告訴我有關的變化.. –

0

保持你的方法,我會做如下。這是沒有太大的不同,但主要有兩個分支:一個地方end完全不必,因爲它begin後或在同一時間發生的修改(兩者的差異是0:0.0),而另一種字段調整考慮模塊化算術。

struct time timeElapsed (struct time begin, struct time end) 
{ 
    if ((end.hour >= begin.hour) && 
     (end.minute >= begin.minute) && 
     (end.second >= begin.second)) { 
    /* end is greater or equal to begin, nothing to adjust. */ 
    } else { 
    end.hour +=24; 

    if (end.second < begin.second) { 
     --end.minute; 
     end.second += 60; 
    } 

    if (end.minute < begin.minute) { 
     --end.hour; 
     end.minute += 60; 
    } 
    } 

    struct time elapsed = { 
    end.hour - begin.hour, 
    end.minute - begin.minute, 
    end.second - begin.second 
    }; 
    return elapsed; 
} 
+0

我添加完整的程序,你可以檢查出來好嗎? –

+0

@LokeshVeerappan編輯 – coredump