# CH1 探索C++
## 程式的輪廓
``` c++=
#include <iostream>
int main() {
std::cout << "Hello, world!"
return 0; //註解
}
```
第1行並不算是`C++`的程式,但是往往`C++`程式都少不了它,這一行是包含(或導入)一個標項庫文件,名為iostream。iostream是一個`C++`標準庫,它提供了`C++`與輸入/輸出設備。
第3行才是真正的程式,`int main()`是一個函式,我們寫的程式都需要他,因為這是程式的起點。
3至6行大括號{}包着的地方,稱為main的本體(body)用作放入main函式的內容
第4行使用了`C++`的輸出運算子`<<`來輸出一段文字。std::cout是一種稱為“字符輸出流”的物件,常常用來將資訊輸出到終端機。在這個例子中,我們用`<<`運算子將"Hello, world!"這個字串輸出到std::cout,即終端機。**每個`C++`語句的結尾需要用分號`;`來標記。**
第6行。在main()函數的最後,我們通常會加入return 0,這代表當main()函數運行完成後,它將向操作系統回傳一個"0",代表程式成功無誤地執行完成。
在第6行後的`//`是程式的**註解**(comment),用作寫給自己或別人閱讀的說明文字,編譯器遇到註解的時候會自動跳過。
## 輸出和輸入
在`C++`程式中,我們通常使用兩個主要的串流物件來處理輸出和輸入:std::cout和std::cin。"cout"代表"character output",用於輸出文字和數據,而"cin"代表"character input",用於讀取使用者的輸入。
### std::cout
std::cout是我們最常用的輸出工具。透過使用"插入運算子"(<<),我們可以將多種類型的資料輸出到終端機。以下是一個範例:
```c++=
#include <iostream>
int main() {
int age = 20;
std::cout << "Hello, world!\n";
std::cout << "I am " << age << " years old.\n";
return 0;
}
```
輸出
```
Hello, world!
I am 20 years old.
```
第3行程式碼定義了主函數main。在一個C++程式中,main函數是程式執行的起始點。
第4行程式碼在main函數中定義了一個名為age的變數,並給它賦值為20。
第5行程式碼用std::cout輸出了一個字串"Hello, world!"到終端機,\n會使輸出換到下一行。
第6行程式碼先輸出字串"I am ",然後輸出變數age的值(20),然後輸出字串" years old."。輸出結果將為"I am 20 years old."。
第7行程式碼表示main函數的結束,並且回傳值為0,表示程式執行成功。
### std::cin
std::cin用於從鍵盤讀取使用者的輸入。我們使用"提取運算子"(>>)將輸入的資料儲存到變數中。以下是一個範例:
```c++=
#include <iostream>
int main() {
int age; //宣告一個整數變數age
std::cout << "Enter your age: ";
std::cin >> age; //鍵盤輸入數字
std::cout << "You are " << age << " years old.\n";
return 0;
}
```
輸出
```
Enter your age: 25
You are 25 years old.
```
第4行程式碼定義了一個整數變數age,但並未給它賦初值。
第5行程式碼輸出一個提示信息"Enter your age: ",要求使用者輸入他們的年齡。
第6行程式碼讀取使用者的輸入並存入變數age中。
第7行程式碼輸出"You are ",然後輸出變數age的值(使用者輸入的年齡),然後輸出" years old."。
### 名稱空間(Namespace)
名稱空間是用來封裝一系列的識別符(如變數名、函式名等)的一種機制,以防止名稱衝突。當我們在使用`std::cout`和`std::cin`時,`std::`前綴指出了我們正在使用"std"名稱空間中的cout和cin。
為了方便,我們可以使用`using namespace std;`來避免在每次引用std名稱空間中的名稱時都需要添加`std::`,例如在`cout`和`cin`前省略`std::`。以下是一個範例:
```c++=
#include <iostream>
using namespace std;
int main() {
int age = 20;
cout << "Hello, world!\n";
cout << "I am " << age << " years old.\n";
return 0;
}
```
這個程式的輸出將與先前的程式完全相同。不過,為了避免可能的名稱衝突,一般建議只在需要的地方使用using namespace std;,特別是在大型的專案中。
## 練習
1. 請你印出以下圖形
```
*
**
***
****
*****
```
2. 修改上面的 "Hello, World!" 程式,使其可以問用戶他們的名字,然後打印出 "Hello, [Name]!"。其中 [Name] 是用戶輸入的名字。提示:請用string宣告變數,加入```#include <string>```,```string name```
| input 1 | input 2 |
| -------- | ------- |
| Tom | Mary |
| output 1 | output 2 |
| ----------- | ------------ |
| Hello, Tom! | Hello, Mary! |
3. 請修改以下的錯誤程式
```c++=
#include <iostream>
using namespace std;
int main(){
cout<<"Apple"<<endl
return 0
}
```
4. C++程式中,哪種符號用於標記語句的結束?
* A. `:`
* B. `;`
* C. `,`
* D. `.`
5. 在iostram中定義的endl作用是什麼?
* A. 結束程式
* B. 空一格
* C. 換行
* D. 註解
## 解答
**1**
```
#include <iostream>
using namespace std;
int main() {
cout << "*" << endl;
cout << "**" << endl;
cout << "***" << endl;
cout << "****" << endl;
cout << "*****" << endl;
return 0;
}
```
**2**
```c++=
#include <iostream>
#include <string>
using namespace std;
int main() {
string name;
cout << "Please enter your name: ";
cin >> name;
cout << "Hello, " << name << "!\n";
return 0;
}
```
**3**
```c++=
#include <iostream>
using namespace std;
int main() {
cout << "Apple" << endl;
return 0;
}
```
**4**
B
**5**
C