智合網圖總目錄-各學院
關於智合網版主
智合網沿革
價值管理學院簡介
價值管理學院總目錄
價值管理簡介
價值管理總目錄
價值的定義

2020年7月29日 星期三

確定某西元年是否為閏年-以簡要瞭解C++

本文將以寫一個 C++ 程式,用以判斷某西元年是否為閏年,以簡要瞭解 C++ 程式語言的結構與基本用法。

首先要先知道一般在數學上是如何判斷一個西元年是否為閏年的規則:
  1. 西元年份除以4不可整除,為平年。
  2. 西元年份除以4可整除,且除以100不可整除,為閏年。
  3. 西元年份除以100可整除,且除以400不可整除,為平年。
  4. 西元年份除以400可整除,為閏年。
若寫成演算法,而且為便於使判斷過程更簡便,所以要倒過來判斷,其演算法如下:



假若西元年份可以被400整除,

{
為閏年
}
否則
{
     假若西元年份可以被100整除,
     則
     {
     為平年
     }
     否則
     {
          假若西元年份可以被4整除,
          則
          {
          為閏年
          }
          否則
          {
          為平年
          }
     }
}

完整判斷閏年的 C++ 程式碼:

#include <iostream>
using namespace std;

int main() {
 int y;
 bool b = false;
 cout << "Please Input a year:";
 cin >> y;
 if ((y % 400) == 0) {
  b = true;
 } else {
  if ((y % 100) == 0) {
   b = false;
  } else {
   if ((y % 4) == 0) {
    b = true;
   } else {
    b = false;
   }
  }
 }
 if (b)
  cout << endl << "This is a Leap year!";
 else
  cout << endl << "This is not a Leap year!";
 return 0;
}

其中,#include <iostream> 是指後要有一些指令要用到 iostream輸入輸出的函數庫。也就是說,在 C++ 程式中,若要使用到某些函數或資料型態,那就必須要以 #include 指令,來指出要使用到該函數所屬的函數庫名稱。然而一些最基本的資料型態 (primitive datatype),例如,int, float, bool 等資料型態是不用額外以 #include 指令來特別指定要使用的函數庫了。可參考「C++ 常用外顯指定 (include) 的函數庫」一文的說明。要想瞭解 C++ 的資料型態,可參考「C++ 的資料型態」一文的說明。

而 using namespace std; 指令是指本程式所使用的是標準的命名空間 (namespace)std。一個命名空間是指某一些程式集在一起執行時,所包括在一起的所有變數或名稱的空間集合,或名稱集合,這些集合在一起共同工作的程式可能是同一個大型專案或是某一具有特殊功能的函數庫。因此不同的大型專案或特殊的函數庫,可能有時候會有相同的變數名稱或是函數名稱或其他的名稱是相同的,但是其功能與相關的參數設計卻是不相同的,所以當一個程式若同時使用到不同命名空間中的函數庫或程式時,自然就必須要特別的指出是使用那一個命名空間中的函數或變數了。一般的小型程式專案大都不會使用太多複雜的其他程式專案或自訂的複雜函數庫所自行命名的命名空間,所以通常都是使用標準的 std 命名空間。可參考「C++ 的命名空間 (namespace)」一文的說明。

int main () { ... } 這整個區段是定義一個名為 main 的函數的區段,此函數會傳回一個值,其值的資料型態為 int。而左右小括弧 () 之間是定義要傳入函數內供此函數使用的資料參數,此處並未指定要傳入 main 函數內的參數。而函數實際的程式碼是位在左右大括弧 { } 之間。這也意謂者,在 C++ 程式中,一個函數的定義區的格式語法如下:

<回傳值資料型態> <函數名稱> (<參數>) { <實際程式碼> }

int main() 函數是一個特殊的函數,是一個 C++ 程式開始執行的起始點,而且函數名稱一定是 main,不可以是其他的函數名稱,至於 main() 函數回傳值的資料型態,以及要傳入函數中的參數,則使用者可以自訂。

在C++ 程式中,除了 #include 指令,以及以左右大括弧 { } 所定義的程式碼定義區區塊的最後的右大括弧 } 在結尾處,不可以加上一個分號 ; 作為指令的結尾,其他所有的指令皆要
加上一個分號 ; 作為指令的結尾。

int y; 指令是定義一個資料型態為整數 int 的變數 y 的儲存空間。

bool b = false; 指令是定義一個資料型態為二元值 bool的變數 b,其值只能是 true 或 false ,或是 1 或 0。此處預設存入值為 fasle。

cout << "Please Input a year:"; 其中,cout 讀音為 see out 是將後面所指定的內容輸出至標準輸出設備,亦即輸出至螢幕。cout 指令函數屬於 iostream 函數庫,所以必須在使用前以指令 #include <iostream> 含入。cout 指令可以同時串接多個要輸出的項目,每一個輸出的項目要以 << 符號來引導,所以此指令實際上要輸出的是一個字串 Please Input a year:,而且字串要前後加上一個雙引號。

cin >> y; 其中,cin 讀音為 see in 是將從標準輸入設備,亦即鍵盤所輸入的值讀入後,並存放在後面所指定的變數中。cin 指令函數屬於 iostream 函數庫,所以必須在使用前以指令 #include <iostream> 含入。此處是將由鍵盤輸入的值存入變數 y 中。 

if ((y % 400) == 0) { ... } else { ... } 是一個條件判斷式指令,在 C++ 中,條件判斷式的指令有許多個,例如,包括,if - else,case, while, do - while 指令等,其中 while, do - while 指令原本是迴圈指令內含條件判斷。可參考「C++ 條件判斷指令」一文的說明。

if - else 指令的語法如下:

if (<條件>) {<條件成立時要執行的程式碼>} else {<條件不成立時要執行的程式碼>} 

所以 if - else 指令中 if 後先要接一個條件判斷式,而且此一條件判斷式必須以左右小括弧含括起來。在 C++ 中,一個條件判斷式的結果只有兩類值,也就是屬於二元值 (bool) 的類型,為真 (true) 則代表條件成立,為假  (false) 則代表條件不成立。

在 if (<條件>) 條件判斷後,若為真,則要先撰寫條件成立時要執行的程式碼,通常是以左右大括弧 {} 所含括的程式碼區段 (code block),也就是說通常在C++中,一個程式碼區段是以
左右大括弧 {} 所含括的程式碼區段。

在 if (<條件>) 條件判斷後,若為假,則在條件成立時要執行的程式碼區段後要寫上 else 的指令,然後再撰寫條件不成立時要執行的程式碼區段。

所謂一個程式碼區段就是由左右大括弧 {} 所含括的程式碼區段,其中通常包括多個程式指令,此時每一個程式指令就要以分號 ; 做為結尾。若一個程式區段只包括一行指令,那麼就可以省略左右大括弧{}。例如,

if (x>y) { cout << "x>y";} else { cout << "not x>y";} 可以省略成:
if (x>y) cout << "x>y"; else cout << "not x>y";

其實 if - else 指令是 if 指令的擴充版,if 指令就是不去處理條件不成立時的情況。

if 指令的語法如下:

if (<條件>) {<條件成立時要執行的程式碼>}

此處 if ((y % 400 == 0)) 中的條件判斷式為 (y % 400 == 0),其中,== 是條件判斷子 (equal condition operator),用以判斷判斷子左邊與右邊運算式的值是否相等。而左邊的運算式為 y % 400 ,其中,% 是數學運算子,用以算出餘數。所以本條件判斷式的目的是用來判斷輸入的值 y 是否能被 400 所整除,若是整除代表其餘數應為 0。

所以,若所輸入的 y 年若被 400 所整除,依閏年判斷的規則就代表是閏年,所以接著在條件成立時要執行的程式碼區段中就執行指令 b = true;,也就說本程式是利用二元值變數 b 來存放對輸入值 y 年的閏年最終判斷,若是閏年則 b 設定為 true,若非閏年則 b 設定為 false。又,= 是一個設定值或指定值的指令運算子(assign operator),也就是將右邊運算式的值指定(亦即存入)給左邊的變數中。也就是說,運算子  = 及運算子 == 是兩個不同功能的運算子。  

若是 ((y % 400) == 0) 的條件不成立,自然就要在指令 else 之後的程式區段中來處理,此一程式區段中就另行再以if - else 指令來判斷  ((y % 100) == 0),亦即 y 是否可以被 100 所整除,這些條件判斷的規則都是依閏年判斷的規則來轉換成 if - else 指令的。所以其他的條件判斷指令就不再敘述,讀者應該很容易瞭解這些條件判斷的寫法與目的。

當將輸入 y 的年數進行閏年的條件判斷結束,並將是否為閏年的結果儲入變數 b 後,若 b 存的是 true 那麼就顯示是閏年的訊息,若 b 存的是 fase 那麼就顯示是不是閏年的訊息。所以一樣要使用 if - else 條件指令。

if (b) 指令中,條件判斷式就是二元值變數 b ,所以只要 b 的值是 true,那麼就代表條件成立,所以就執行輸出指令:cout << endl << "This is a Leap year!"; 否則就執行指令:cout << endl << "This is not a Leap year!";其中,<< endl 是要輸出一個換行的符號。

最後一行指令為 return 0; 代表此一 main() 函數要回傳一個值,此處因為執行過程都沒有什麼問題,所以通常回傳一個 0 值。為什麼會需要撰寫此一指令?因為在 int main() 函數宣告定義時,就指明要回傳一個值,且此值的資料型態為整數。若在一個函數宣告定義時,並不要求要回傳一個值,那麼就在最開頭的回傳值資料型態的部份改寫成 void ,亦即「無」的思,例如,改寫成 void main() { ... }。
 

主要網頁類別

  1. 關於智合網