開始使用

透過範例學習

如要瞭解如何以新語言編寫程式,最好的方法之一就是參考大量的程式範例。最佳做法是複製下列各個程式並貼到文字檔中,並進行編譯。接著,請嘗試進行實驗。 透過擴充這些範例程式,您會熟悉 C++ 的不同面向,當您何時能從頭開始編寫程式,也會更有信心。

範例 1:讓編譯器正常運作!

如果您尚未執行此操作,請將下列傳統版程式複製並貼到文字檔中,並進行編譯。如需編譯操作說明,請參閱這篇文章

您可能已詳細瞭解本計畫的詳細內容,因此我們不會在這裡提供每一行的說明。不過,關於可讀性,仍有幾點需要注意。所謂的註解和格式,可讓程式更容易閱讀、理解及維護。

  • 我們撰寫的每個程式都會以標頭註解開頭,提供作者姓名、聯絡資訊、簡短說明和用途 (如適用)。每個函式都會從運算和使用情形開始。
  • 每當程式碼未記錄程式碼 (例如處理過程困難、不明顯、有趣或重要的時),我們就會以完整句子加入說明文字。
  • 一律使用描述性名稱:變數是小寫的字詞,並以 _ 分隔,如 my_variable 中所示。函式名稱會使用大寫英文字母來標示字詞,例如 MyExcitingFunction() 中。常數以「k」開頭,並使用大寫英文字母標示字詞,例如 kDaysInWeek。
  • 縮排為二的倍數。第一層是兩個空格;如果需要進一步縮排,我們會使用四個空格、六個空格,以此類推。
// hello.cpp: Maggie Johnson
// Description: a program that prints the immortal saying "hello world"

#include <iostream>
using namespace std;

int main() {
  cout << "Hello World!" << endl;
  return 0;
}

您可以試試下列實驗功能:

  • 最重要的是,請確保您可以編譯並執行這個程式。
  • 修改上述程式,將「Hello World!」一行 6 行 4 次,每一行會分別在 17 個空格的欄位中輸出。使用免人工管理的。如要瞭解如何使用 Cout 來設定輸出格式,請按這裡。如要查看解決方案,請按這裡
  • 使用您剛完成的程式,找出在 17 個空格欄位中,如何輸出「Hello World!」(預設值通常靠右對齊)。按一下這裡即可查看解決方案。

範例 2:取得輸入內容

只要使用 cin,就能輕鬆取得 C++ 鍵盤的輸入內容。範例如下:

// get_input.cpp: Maggie Johnson
// Description: Illustrate the use of cin to get input.

#include <iostream>
using namespace std;

int main() {
  int input_var = 0;
  // Enter the do while loop and stay there until either
  // a non-numeric is entered, or -1 is entered. Note that
  // cin will accept any integer, 4, 40, 400, etc.
  do {
    cout << "Enter a number (-1 = quit): ";
    // The following line accepts input from the keyboard into
    // variable input_var.
    // cin returns false if an input operation fails, that is, if
    // something other than an int (the type of input_var) is entered.
    if (!(cin >> input_var)) {
      cout << "You entered a non-numeric. Exiting..." << endl;
      break;
      // exit the do while loop
    }
    if (input_var != -1) {
      cout << "You entered " << input_var << endl;
    }
  } while (input_var != -1);
  cout << "All done." << endl;
  return 0;
}

實驗:

  • 發生輸入錯誤時,串流「中斷」、「cin」會傳回 false,程式會停止。防範這類錯誤非常重要,請務必比照上述計畫的做法。但是,如果想要從錯誤中復原,而非程式停止,該怎麼辦?修正錯誤時可採取以下兩個步驟:
    1. 清除 cin.clear() 的錯誤。
    2. 從串流中移除不正確的字元。其中一個做法是使用 cin.ignore()。

使用這兩個步驟,編寫可從錯誤輸入中復原的程式。請透過 Google 搜尋這些方法的運作方式。如需我們的解決方案,請參閱這篇文章

範例 3:這個程式會輸出什麼內容?

#include <iostream>
using namespace std;

int main() {
  cout << " 1\t2\t3\t4\t5\t6\t7\t8\t9" << endl << "" << endl;
  for (int c = 1; c < 10; c++) {
    cout << c << "| ";
    for (int i = 1; i < 10; i++) {
      cout << i * c << '\t';
    }
    cout << endl;
  }
  return 0;
} 

範例 4:分解可簡化一切...

該開始寫電腦遊戲了!第一個步驟比較簡單,但只是一個開始。我們的任務是編寫一個程式,實作可猜測的遊戲。我們的程式會產生 0 到 100 之間的隨機數字。玩家必須猜出密鑰。程式會提供「太高」或「太低」等提示,直到玩家最後猜出秘密數字為止。

我們將透過三個步驟開發這款遊戲。 

  1. 瞭解如何產生指定值範圍內的隨機數字。
  2. 建立主要函式,用於處理玩家猜測並提供提示。
  3. 新增系統需要允許多次猜測,直到玩家猜出數字為止。

這個開發程序稱為「分解」,也就是將工作分解成子工作,每個子工作都可輕鬆執行。

從步驟 1 開始,請先執行 Google 搜尋,瞭解如何使用 C++ 產生隨機號碼。請試著搜尋「rand C++」。請參閱這裡的解決方案。

針對步驟 2,我們需要從玩家接收整數輸入內容 (Cin 上有適當的錯誤檢查),並根據密鑰進行檢查。在查看我們的解決方案之前,請先嘗試自行編寫遊戲的這個部分。

最後,我們需要新增迴圈,讓玩家持續收集猜測,直到他們最後猜出密鑰為止。完成這部分計畫後,即可查看我們的解決方案

分解是對程式設計人員學習的重要技能之一。無論專案的大小或規模為何,能夠將任務細分為可管理的部分,然後逐一完成,至關重要。還有其他機會可以練習分解。

  • 許多日常工作都提供培養分解技能的機會。可能會讓您意外發現,以這種方式運作!

    舉例來說,如果必須清理很雜亂的廚房 (也許有些小女孩剛烘烤蛋糕),我會分解所有工作來提供計畫,並確保我之後不必重新做工作。如果櫃台上仍有各種東西需要清理,我不想先清洗地板,我可能得稍後再去擦地面。所以,也許我先將所有食材放在水槽裡、把所有菜都搬進水槽裡、洗碗櫃台、洗碗,最後在地板上大掃除。有其他方法可以執行這項工作,但從一開始就仔細思考,有助於我制定無須重新執行的計畫。

    請使用日常工作做為發展分解技能的範例。誰知道這件事,你也許還能更有效率地在家裡!

  • 兩個整數的大公差除數是平均分除兩個整數的最大數。例如 gcd(12, 18) = 6, gcd(4, 14) = 2。 計算 gcd 最有效率的方法是使用 Euclidean 演算法。編寫含有函式的程式,用於計算兩個整數的 gcd。請先嘗試執行函式,不要重複排列,這有助於您瞭解演算法的運作方式。

    明確定義子工作,例如找出 Euclidean 演算法的程式碼、為演算法建立非週期性函式等。請參考這裡的解決方案。

例 5:數學益智遊戲

運算的其中一項強大能力就是能夠進行暴力搜尋,找出問題的解決方案。測試和錯誤都非常適合您。事實上,這類問題在電腦中特別具有優勢。請考慮以下幾點:

馬匹的售價是 $10 美元,豬是 $3 美元,兔子的售價只是 $0.50 美元。某位農夫買了 100 隻動物 只要 $100 美元,他買了幾隻動物? 

而要解決這個問題,最簡單的方法就是:請先看看是否能找到這個機制,再查看我們的

試試另一本書:
你可以在書架上由左至右排列 6 本不同書籍的方式為何?

這次我們只會為您提供解決方案,並讓您編寫程式:720。

範例 6:用於考量的字串

下列程式輸出的內容為何?

#include <iostream>
using namespace std;

int main() {
  string str1 = "To be or not to be, that is the question";
  string str2 = "only ";
  string str3 = str1.substr(6, 12);
  str1.insert(32, str2);
  str1.replace(str1.find("to be", 0), 5, "to jump");
  str1.erase(9, 4);
  cout << str1 << endl;
  for (int i = 0; i < str3.length(); i++)
    cout << str3[i]; cout << endl;
}

這裡取得說明。

範例 7:分解的後續步驟 - 工作的第一天

你剛成為 ExerShoe 公司的銷售人員,專門銷售高級運動鞋,每雙鞋的售價約為 $225 美元。你的老闆提供了三種補償方式,你必須在開始第一天之前選擇:

  1. 每週 $600 美元的直薪;
  2. 每小時 $7.00 美元的薪資加上銷售佣金 10% 的薪資;
  3. 沒有薪資,但每雙鞋售出 20% 的佣金和 $20 美元

身為 C++ 程式設計師,您可以編寫程式來協助決定最佳補償。

為大型程式執行分組的常見做法是建立可讀外框等主要函式,以便解決問題。接著,我們會編寫函式來完成各項任務。

以下是主要程式的第一道票證:

  GetInput(WeeklySales);
  CalcMethod1(WeeklySales);
  CalcMethod2(WeeklySales);
  CalcMethod3(WeeklySales); 

請先瞭解您是否能實作下列各項函式,再查看我們的解決方案

範例 8:可在哪些國家/地區使用?

下列程式的輸出內容為何?

// scope.cpp, Maggie Johnson
// Description: A program to illustrate different scopes

#include <iostream>
using namespace std;

int a = 18;
int b = 6;

int function1(int a, int b) {
  return a - b;
}

int function2() {
  int c;
  c = a + b;
  return c;
}

int main() {
  int b = 12;
  int c = 0;
  a = function1(b, a);
  c = function2();
  cout << "a: " << a << " b: " << b << " c: " << c << endl;
}

找到答案後,請按這裡查看註解版本的程式碼。

範例 9:處理檔案

在 C++ 中處理檔案是透過 fstream 執行。如要儲存至檔案,我們會宣告串流,並使用「退出」模式開啟檔案。請查看以下範例。

// file.cpp, Maggie Johnson
// Description: An illustration of file processing
#include <fstream>
#include <iostream>
using namespace std;

int main() {
  char first_name[30], last_name[30]; int age;
  char file_name[20];
  // Collect the data.
  cout << "Enter First Name: "; cin >> first_name;
  cout << "Enter Last Name: "; cin >> last_name;
  cout << "Enter Age: "; cin >> age;
  cout << endl << "Enter the name of the file: "; cin >> file_name;

  // Create an ofstream called People, open the stream for output.
  ofstream People(file_name, ios::out);
  // Write the output to the stream.
  People << first_name << endl << last_name << endl << age << endl; return 0;
} 
  • 請確認您是否能找到如何開啟剛建立的檔案,並顯示資料。請參閱這裡的解決方案。
  • 現在,請確認您是否能夠修改此程式,讓使用者使用迴圈輸入多筆資料記錄。我們還想讀取所有資料,一次只能讀取一筆記錄。請參閱這裡的解決方案。

現在,您可以開始自行嘗試運動和專案了!

身為 Google 的軟體工程師

前往這個網站瞭解 Google 的工作環境。

運動與專案

下列練習會讓您進一步練習使用基本 C++。我們不會針對這些練習和專案提供解決方案,因為我們希望您在本課程中與其他同學合作。

  1. 與目前溫度成正比的普通板球場。將板球卡在一分鐘內的次數增加 40 個,值除以 4 就能得出溫度。編寫程式,納入一分鐘內所需的晶片數,並輸出目前的溫度。例如:
    Number of chirps: 120
    The temperature is: 40.0 degrees. 
  2. 編寫程式,針對您要參加的程式設計課程計算最終成績。以下是評分配置:
    Final grades will be based on the following:
    40% Assignments   15% Midterm Examination
    35% Final Examination
    10% Class Participation Grade 

    您的程式應要求使用者提供四項作業分數,分別是中期、最終成績和單元成績。接著,系統會計算並列印最終分數。計算方法是將四個作業分數平均加總,然後再乘以 0.4 (40%)。接著,您可以將期中分數乘以 0.15,最終乘以 0.35,然後再將參與分數乘以 0.1。然後將這些乘法的所有結果加總。

    在本程式中的任何位置使用函式。您可以透過傳遞做為參數的形式,建立要在說明內容中顯示的字串,藉此建立用於取得輸入內容的函式。以下是跑步範例:

    Enter the score for the first assignment. 75
    Enter the score for the second assignment. 85
    Enter the score for the third assignment. 82
    Enter the score for the fourth assignment. 94
    Enter the score for the midterm. 81
    Enter the score for the final. 89
    Enter the score for the section grade. 100
    The final grade is: 86.9
  3. 隨著電子碼表越來越便宜,準確度也更高,因此我們將難以準確評估不精確的時間測量結果。編寫程式,該程式需要以秒為單位進行輸入,然後輸出該時段所代表的小時數、分鐘數和秒數。例如:
    Number of seconds: 3662
    Hours: 1
    Minutes: 1
    Seconds: 2     
  4. 在編寫程式前,先執行分解作業。盡可能使用函式來建立結構化的計畫。

  5. 假設我們想列印以下項目的橫幅:

    「自由洗腦,釋放自由」

    我們希望字體夠大,因為這是橫幅:

    FFFFF
    F
    FFF
    F
    F
    
    EEEEE
    E
    EEE
    E
    EEEEE
    

    身為一個好的分解者,您可能會注意到,比起把所有點子放到主要函式中,直接用函式代入是更有效率的做法。因此我們可以使用「printE」和「printZ」函式等條件

    使用函式編寫程式,建立含有大量重複字母的字詞或詞組橫幅。可能原因:

    FREEZY BREEZE MAKES FLEAS
    SNEEZE TWEETLE BEETLE PADDLE BATTLE
    SIX SICK CHICKS KICK
    SUE SEWS SUE'S SOCKS
    BEN BENDS BIM'S BROOM 
  6. 這裡有個「魔術數字」問題:要求使用者輸入一組三位數的數字,其首位大於最後一個數字。您的程式將計算倒數,然後減去原有數字的逆數。最後,將產生的數字反轉,將其加入非反向格式。並輸出最終結果。使用者輸入的原始號碼必須是整數類型 (而非三個字元)。請思考如何編寫一個函式,該函式會將整數做為輸入,並傳回該數字的反向。範例:
    input number: 901
    reverse it: 109
    subtract: 901 - 109 = 792
    reverse it: 297
    add: 297 + 792 = 1089   
  7. 根據法律規定,食品製造商必須為產品設定到期日,但法律中設有漏洞:不需要以任何特定形式指定到期日。因此,該文內容能以斯瓦希里文撰寫,並不影響法律規範。

    納丁是 Ralph Nader 的第三個堂表兄弟姊妹,她是自認的食物品質間諜。她瞭解許多食品產品製造商已開始將產品到期日編碼,以免客戶掌握產品舊品。

    但這個編碼確實可讓雜貨基於某種原因而想查詢到期日。

    常見的編碼方式如下:

    • 以「A」到「L」編碼,將 1 月到 12 月的月份編碼
    • 將日期的每個數字編碼為「Q」到「Z」
    • 將年份編碼為「A」到「Z」,亦即 1 到 26,然後再加至 1995。

    娜娜在以下日期找到了一隻特別有問題的麵包:ARZM。 編寫程式以決定日期。

  8. 這是知名卡牌技巧的類比數字。請使用者輸入三位數的號碼。請將數字視為 ABC (其中 A、B、C 是號碼的三位數)。現在,找出 ABC、BCA 和 CAB 除以 11 所形成的餘數。我們將這些餘數稱為 X、Y、Z。將這些字詞新增為 X+Y、Y+Z、Z+X。如果任何總和為奇數,請將其增加或減少 11 (每次運算得到的正數小於 20;請注意,如果總和為 9,只要回報此結果並停止程序即可)。最後,將每個總和除以二。產生的數字為 A、B、C。請編寫實作此演算法的程式。

應用程式:透過動畫以視覺化方式呈現音樂

軟體工程師則負責開發各種經常有意思且創新的應用程式。在本課程的各個單元中,我們介紹了工程師設計和實作的各種應用程式,幫助您瞭解工程師在工作的各個領域。

這個網頁是專為視覺化音樂而設計的有趣應用程式。