C 語言初學教材 - 第二章 處理時間問題

Say Hello! 可以向不同使用者打招呼了,可是所顯示的是過去的時間,而非現在的時間。若是要取得現在電腦的時間,我們可以利用作業系統的的 date 指令,可以直接顯示現在的時間日期

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    char name[10];
    
    printf("請輸入您的暱稱: ");
    scanf("%s", name);
    
    printf("\n\n");
    system("date");
    printf("哈囉, %s!\n\n", name);
    
    return 0;
}

/* 《程式語言教學誌》的範例程式
    http://pydoing.blogspot.com/
    檔名:hellonow.c
    功能:顯示現在時間的打招呼程式
    作者:張凱慶
    時間:西元2010年7月 */


因為我們要使用作業系統的指令,這一方面要利用標準函數庫 stdlib.h 的函數 system() ,所以第 2 行,我們要先引入 stdlib.h
#include <stdlib.h>


然後在第 12 行呼叫函數 system()
system("date");


函數 system() 需要用字串當參數,這個字串就是所需要的作業系統指令。在打招呼之前會先執行 date 指令,執行完 date 指令才會繼續執行接下來的打招呼。


UNIX-Like 的作業系統都可以直接用 date 指令,若是用 MS-Windows 系統,可能需要用到 date 及 time 兩個指令,其他作業系統請查詢該系統的手冊。


編譯後執行,如下



我們繼續提供另一種顯示現在時間的方法,就是利用標準函數庫中 time.h 的函數 time() ,這個函數會回傳自格林威治時間 1970 年 1 月 1 日到目前所經過的總秒數
#include <stdio.h>
#include <time.h>

int main(void)
{
    char name[10];
    int s = (int) time(NULL);
    int sec, min, hour;
    
    s += 8 * 60 * 60;
    sec = s % 60;
    min = (s / 60) % 60;
    hour = (s / 3600) % 24;

    printf("請輸入您的暱稱: ");
    scanf("%s", name);
    
    printf("\n\n現在是%d點%d分%d秒\n", hour, min, sec);
    printf("哈囉, %s!\n\n", name);
    
    return 0;
}

/* 《程式語言教學誌》的範例程式
    http://pydoing.blogspot.com/
    檔名:hellonowo.c
    功能:顯示現在時間的打招呼程式
    作者:張凱慶
    時間:西元2010年7月 */


首先在第 2 行,我們引入 time.h
#include <time.h>


第 7 行有個 (int)
int s = (int) time(NULL);


這是種利用小括弧轉換型態的方式,這個小括弧被稱為 cast 運算子,用來強制型態轉換。因為函數 time() 回傳的是另外定義的算術型態 time_t ,我們這裡做強制型態轉換的目的是為了避免編譯器出現型態不符的警告訊息。


time() 需要一個指向型態 time_t 的指標當作參數,由於我們直接接收回傳值,所以用 NULL 給 time() 當作參數。 NULL 在 C 語言中是一個常數值,表示空的指標。


變數 s 得到的是自格林威治時間 1970 年 1 月 1 日到目前所經過的總秒數,由於格林威治時間與台灣時差八個小時,所以第 10 行,我們將 s 加上時差的秒數
s += 8 * 60 * 60;


接下來由於計算日期有點麻煩,所以我們暫時只計算出目前時間,也就是現在幾點幾秒幾分,這些計算放在第 11 行到第 13 行
sec = s % 60;
min = (s / 60) % 60;
hour = (s / 3600) % 24;


計算現在時間的秒數,就是把總秒數除以 60 的餘數。計算目前幾分也很簡單,總秒數除以 60 的商會是總分數,將總分數除以 60 取其餘數,就會得到目前幾分。至於計算目前幾點大致相同,就用總秒數除以 3600 的商就是總時數,總實數再除以 60 取其餘數就是目前幾點。


來編譯執行看看吧!



問題與討論
  1. 程式直接使用作業系統的指令有什麼優缺點?
  2. 什麼時候需要用到強制型態轉換?
  3. 想一想,我們取得總秒數之後,可以用什麼方式算出月份跟日期呢?
  4. C 語言採用的是整數除法,因此 s / 60 只會得到整數的商,少了小數部份,這樣會不會造成計算誤差呢?




1 則留言:

Unknown 提到...

總實數再除以 60 取其餘數就是目前幾點。
應該是除以24??