C++入門教學:輸入/輸出與運算

C++ 是一個歷史悠久的語言。1983 年由貝爾實驗室的 Bjarne Stroustrup 所發明。

起初,這種語言被稱作「C WITH CLASSES」(「包含類別的C語言」),作為C語言的增強版出現。所以可以看到 C 語言並沒有像 C++ 一樣有「class」這種程序。

目前 C++ 是最被廣泛應用的語言之一。

先前 IEEE 透過算出 2016年熱門程式語言排行榜,其中包含Google搜尋、GitHub、Stack Overflow、Reddit、Hacker News、IEEE Xplore 數位圖書館等網站,得出對應的熱門程式語言排名。

2015 年 IEEE Spectrum 熱門程式語言排行榜前三名分別為:Java、C 與 C++。

可以看到 C++ 常常在第三和第四之間變動。

近幾年來 C++ 的新標準不斷發布,C++ 已經變得越來越龐大了,大多數的 C++ 程式員只用到(也只懂)C++ 功能的一小部份。

想成為 C++ 語言的高手,沒有耗上三五年是不可能的。

雖然 C++ 很複雜,但是真正想成為程式高手的人應該都要懂 C/C++,重要的 API 都會有 C/C++ 的版本,由此可見 C/C++ 的重要性。

今天就要來教大家最最基礎的 C++ 語法。

 

環境設置

我們寫程式需要「編輯器」和「編譯器」,以前是要分開安裝,現在能利用整合開發環境 (Integrated Development Environment, 簡稱 IDE) 把這些功能通通包在一起、輔助程式開發者寫軟體。

IDE 內撰寫程式,程式碼會用顏色區分不同命令以方便閱讀,程式寫完之後,按下「執行 (Run)」按鈕,就會開始編譯、測試你的程式。

如果過程中出錯、程式執行失敗,螢幕裡會自動標示出錯的程式碼行數跟錯誤訊息,幫助你 Debug。

不過原本 IDE 也是要安裝的,現在雲端技術普及,除了有 Google Drive、Dropbox 這種雲端服務,連 IDE 也推出有雲端版了。

要撰寫下列程式,可以使用雲端 IDE—— Ideone 來撰寫。

點選左下角,可以選擇你要撰寫的程式語言環境,包括 C/C++、Python、Java…

選好、寫好程式之後按下「Run」,就能看到結果了。

利用 Ideone,讓我們開始今天的教學吧!

(不過以下我是用本機端的Terminal,看程式碼和輸出結果就行了)

 

輸入與輸出

起手式:每一個 C++ 程式都會有的基本結構

#include <iostream>
using namespace std;

int main(){
 
  return 0;
}

iostream 是 C++ 中用於資料輸入與輸出的標頭文件,屬於 C++ 標準程式庫的一部分。 iostream 為 Input/Output Stream 的縮寫,即是輸入/輸出流。

namespace (命名空間) 是 C++ 的 class 原本就有提供的一種功能。待後續再為大家詳細解釋,總之先這樣寫就對了。

接下來印出 “hello, world” ,我們的第一個程式吧!

TWICE 成員由左而右分別是:Mina、Momo、Sana、Tzuyu,來跟著 TWICE 動疵動疵學 hello, world 吧~

在 return 前面寫上 cout << “Your Message” << endl;

#include <iostream>
using namespace std;

int main(){
  cout << "hello, world" << endl;
  return 0;
}

<< endl 是換行的意思。試試看如果加上三個 << endl 、不加上 << endl 和用可以替換 endl 的 ‘\n’ ,編譯起來會有什麼差別呢?

#include <iostream>
using namespace std;

int main(){
  cout << "hello, world Tzuyu!" << endl << endl << endl;
  cout << "hello, world Sana!";
  cout << "hello, world Mina!" << '\n';
  cout << "hello, world Momo!" << endl;
  return 0;
}

結果在此:

 

來寫一個能印出生日賀卡的程式看看:

################################
Dear Tzuyu,  
  TWICE is the best! 
  Fighting!

                Sincerely, Lynn
################################

要怎麼寫呢?多印幾行就可以啦。

#include <iostream>
using namespace std;

int main(){
  cout << "################################" << endl;
  cout << "Dear Tzuyu" << endl;
  cout << "  TWICE is the best!" << endl;
  cout << "  Fighting!" << endl;
  cout << "                Sincerely, Lynn" << endl;    
  cout << "################################" << endl;
  return 0;
}

很簡單吧!如果要有空格的話,印的時候也要在裡面放入空格就行了。

讓我們進一步提升這個程式,能讓你自訂輸入收卡人和送卡人的姓名,名字可以是英文字母或是中文字。

在 C++ 中這叫字串,可以這樣表示:

char name[50];

char 代表型態為字元,name 是這個陣列的變數名稱,要叫 s、hello 都可以。50 是陣列大小。

已經知道 cout << 是輸出,輸入的寫法長這樣:

cin>> name1;
cin>> name2;

//或寫成
cin>> name1>> name2;

//然後輸出
cout<< name1;

寫成完整的程式:

#include <iostream>
using namespace std;

int main(){
  char name1[50], name2[50]; //宣告name1和name2是字元陣列
  cin >> name1 >> name2; //輸入
  cout << "################################" << endl;
  cout << "Dear "<< name1 << endl;
  cout << "  TWICE is the best!" << endl;
  cout << "  Fighting!" << endl;
  cout << "                Sincerely, " << name2 << endl;
  cout << "################################" << endl;
  return 0;
}

這樣一來就可以指定想要跟 TWICE 中的哪一位成員告白了!顆顆

等等,我想要寫個更真摯一點…

所以我決定寫 Sana 的全名來告白!Minatozaki Sana。

等等,結果怎麼變成這樣了?!name1 被代換成 Minatozaki、name2 被代換成 Sana。

原因是因為 cin>> 是用「空格」、「tab 鍵」和「Enter (return) 鍵」作為分隔點。

所以只要一按下空格,cin 就會判斷為第二個輸入。

解決辦法是改寫成: cin.getline(name1, 50);

cin.getline(字串, 字串長度) 的意思是按照一行行的方式做輸入。而 cin>>字串 則是理解成按單個字串輸入。

基本上只要把輸入改掉就行了,輸出不變。

#include <iostream>
#include <cmath>
using namespace std;

int main(){
  char name1[50], name2[50]; //宣告name1和name2是字元陣列
  cin.getline(name1, 50);
  cin.getline(name2, 50);
  cout << "################################" << endl;
  cout << "Dear "<< name1 << endl;
  cout << "  TWICE is the best!" << endl;
  cout << "  Fighting!" << endl;
  cout << "                Sincerely, " << name2 << endl;
  cout << "################################" << endl;
  return 0;
}

 

哦成功了!

 

四則運算

身為一個財金背景的,寫程式第一個要做的當然是計算利息啦。來試著寫一個能計算銀行存款利息的程式吧!

這裡是

總額 = 本金*(1+利率)年期

這裡我們要用到一個次方函數,需要用到 <cmath> 函式庫中的 pow 函數。在最上方 include 進來此函式庫。

pow 函數的寫法為:pow(底數, 次方)

#include <iostream>
#include <cmath>
using namespace std;

int main(){
  double money, years, rate, sum; //宣告浮點型變數
  
  cin>>money>>years>>rate; //輸入本金, 年期, 利息
  sum = money*pow((1+rate), years); //算出總額
  cout<<sum<<endl;
  
  return 0;
}

來計算看看本金 1,000 元,年期 5 年,利率 5% 的存款,在到期後的總額會是多少:

接下來,再一次提升這個程式的功能。

如果我想要讓程式永無止境跑,讓我能輸入我要算的存款條件、算到開心為止該怎麼做呢?

可以在外面包一個「while 迴圈」,只要 while() 裡面的條件符合,它就會一直跑下去。

#include <iostream>
#include <cmath>
using namespace std;

int main(){
  double money, years, rate, sum; //宣告浮點型變數
  cin>>money>>years>>rate; //輸入本金, 年期, 利息

  while(money > 0){
    sum = money*pow((1+rate), years); //算出總額
    cout<<sum<<endl<<;
    cin>>money>>years>>rate; //再繼續輸入
  }

  return 0;
}

所以我們分別輸入「本金 1,000 元、年期 5 年、利率 5%」、「本金 250,000 元、年期 2 年、利率 3%」、「本金 3,000 元、年期 1 年、利率 2%」… 等條件。

問題來了,要不是這個程式是我們寫的,誰知道那個游標是要我們輸入啥啊…

更好的方式是印出提示文字,像這樣:

要做到這樣很簡單,運用一下第一個教的 cout<< 把文字印出來就行了。

#include <iostream>
#include <cmath>
using namespace std;

int main(){
  double money, years, rate, sum; //宣告浮點型變數
  cout<< "請分別輸入本金,年期,利率,並用空格隔開:";
  cin>>money>>years>>rate; //輸入本金, 年期, 利息

  while(money > 0){
    sum = money*pow((1+rate), years); //算出總額
    cout<<"到期存款總額為 ";
    cout<<sum<<endl;
    cout<< "請分別輸入本金,年期,利率,並用空格隔開:";
    cin>>money>>years>>rate; //再繼續輸入
  }

  return 0;
}