# 20191121 基礎班
> 最後更新時間:11/23 13:15
---
## 本日課綱
* 作業檢討
* char
* function
---
## char
----
### 你是否不同意
```cpp
#include <iostream>
using namespace std;
int main() {
cout <<"你是否不同意未來公投案不應不使用不能讓民眾不理解的多重否定句?";
char answer;
cin >> answer;
// 確認是否同意
if (answer == 'Y' || answer == 'y') {
cout << "同意\n";
} else if (answer == 'N' || answer == 'n') {
cout << "不同意\n";
}
}
```
---
## Function
----
### 哈囉? - 1
```cpp
#include <iostream>
using namespace std;
int main() {
cout << "哈囉";
cout << "哈囉";
cout << "哈囉";
}
```
----
### 哈囉? - 2
```cpp
#include <iostream>
using namespace std;
int main() {
for (int i = 0; i < 3; i++) {
cout << "哈囉";
}
}
```
----
### 哈囉? - 3
```cpp
#include <iostream>
using namespace std;
void hello();
int main() {
for (int i = 0; i < 3; i++) {
hello();
}
}
// 哈囉一次
void hello() {
cout << "哈囉";
}
```
----
### 哈囉? - 4
```cpp
#include <iostream>
using namespace std;
void hello(int n);
int main(void) {
hello(3);
}
void hello(int n) {
for (int i = 0; i < n; i++) {
cout << "哈囉";
}
}
```
----
### 取得正整數
```cpp
#include <iostream>
using namespace std;
int getPositiveInt(string prompt);
int main(void) {
int num = getPositiveInt("請輸入正整數:");
}
int getPositiveInt(string prompt) {
int n;
do {
cout << prompt;
cin >> n;
} while (n < 1);
return n;
}
```
---
## 接下來是課後新增的內容
---
## 上次作業檢討
----
### 華氏溫度轉攝氏溫度
```cpp
#include <iostream>
using namespace std;
int main()
{
cout << "輸入攝氏溫度:";
float celsius;
cin >> celsius;
float fahrenheit = (celsius * 9) / 5 + 32;
cout << fahrenheit;
}
```
----
### 錢包問題
```cpp
#include <iostream>
using namespace std;
int main()
{
float dollars;
do {
cout << "輸入金額:";
cin >> dollars;
} while (dollars < 0);
// 將元轉換為角以避免浮點數不精確
int dimes = dollars * 10;
// 初始化計數器,紀錄錢幣加上紙鈔的數量
int number = 0;
// 1000 元 = 10000 角
// 盡可能地拿最多數量的一千元
number += dimes / 10000;
// 拿完一千之後剩下來的錢就是除以 10000 的餘數
dimes = dimes % 10000;
// 一樣的方式拿 500 元
number += dimes / 5000;
dimes = dimes % 5000;
// 一樣的方式拿 100 元
number += dimes / 1000;
dimes = dimes % 1000;
// 一樣的方式拿 50 元
number += dimes / 500;
dimes = dimes % 500;
// 一樣的方式拿 10 元
number += dimes / 100;
dimes = dimes % 100;
// 一樣的方式拿 5 元
number += dimes / 50;
dimes = dimes % 50;
// 一樣的方式拿 1 元
number += dimes / 10;
dimes = dimes % 10;
// 一樣的方式拿 5 角
number += dimes / 5;
// 剩下來的錢就是 1 角的個數
number += dimes % 5;
// 顯示個數
cout << number;
}
```
---
## 作業 0:ISBN
----
你可能有發現,幾乎所有書籍都有國際標準書號,又稱作 ISBN 或 ISBN-10,用一個十位數的數字來幫所有書籍類產品做唯一的識別。
----
2007 年後又有一個 ISBN-13,一串十三碼的數字,目的是類似的,我們這裡暫不討論。
----
ISBN 的最後一碼稱之為「檢查碼」,將 ISBN 中每個數字透過公式可以與檢查碼比對,即可知道是不是正確的 ISBN 碼。
----
### 檢查碼的計算方法(原始定義)

###### 引用自[維基百科](https://zh.wikipedia.org/wiki/%E5%9B%BD%E9%99%85%E6%A0%87%E5%87%86%E4%B9%A6%E5%8F%B7#%E6%A0%A1%E9%A9%97%E7%A2%BC%E7%9A%84%E8%A8%88%E7%AE%97%E6%96%B9%E6%B3%95)
----
看起來很複雜。
還好我們有 [模算數](https://zh.wikipedia.org/wiki/%E6%A8%A1%E7%AE%97%E6%95%B8) 可以改寫、簡化定義。
----
公式改寫之後其實很簡單,
如果 $X_{1}$ 代表第一個數字,
$X_{10}$ 代表最後一個數字,則:
$X_{10}$ = (1·$X_{1}$ + 2·$X_{2}$ + 3·$X_{3}$ + 4·$X_{4}$ + 5·$X_{5}$ + 6·$X_{6}$ + 7·$X_{7}$ + 8·$X_{8}$ + 9·$X_{9}$) $mod$ 11
----
### 檢查碼的計算方法(++模算數++重新定義)
換句話說,要計算 ISBN-10 的第十位數字,請將
```
第一位數字 乘以 1,第二位數字 乘以 2,第三位數字 乘以 3,
第四位數字 乘以 4,第五位數字 乘以 5,第六位數字 乘以 6,
第七位數字 乘以 7,第八位數字 乘以 8,第九位數字 乘以 9。
```
然後把這些乘積加起來,除以 11 的餘數,
就是 ISBN-10 的第十位數字!
但是,如果餘數為 10,就轉成羅馬數字 X。
----
### 作業要求
* 請讓使用者輸入數字,
驗證他是不是符合 ISBN 的規範
* 請使用「模算數重新定義」的計算方式
* 假設使用者剛好輸入 10 位數字
* 使用者不會輸入 X
----
### 範例
```
ISBN: 7309045475
YES
```
```
ISBN: 7309045474
NO
```
----
### <i class="fa fa-lightbulb-o fa-fw"></i>提示
可以透過錢包問題「取餘數」方式,
提取出每一個位數並加總。
----
### 注意事項
`int` 的上限為 2$^{31}$ - 1 = 2147483647
你可以使用 `long long` 這個新的宣告型態。
宣告範例:
```cpp
long long isbn = 7309045475;
```
----
### 作業繳交連結
https://classroom.github.com/a/4jJpsxOq
---
## 作業 1:瑪利歐 1.0
<!-- .slide: data-background="https://i.imgur.com/J3aEtka.png" data-background-color="#005" -->
----
請輸入一個不大於 8 的數字,使用井號來建立這些半金字塔。
----
### 範例
```
高度: 5
#
##
###
####
#####
```
----
### 範例
```
高度: 3
#
##
###
```
----
### 範例
不符合高度規定(1~8)時,請使用者重新輸入
```
高度: -5
高度: 4
#
##
###
####
```
----
### 作業繳交連結
https://classroom.github.com/a/Z4DSMfvP
---
## 加分作業:瑪利歐 2.0
<!-- .slide: data-background="https://i.imgur.com/uNPNUaX.png" data-background-color="#005" -->
若你寫的出來,請務必繳交
----
基於 瑪利歐 1.0 改良
若你寫的出來,請務必繳交
----
兩個半金字塔中間有寬度為二的鴻溝
----
### 範例
```
高度:4
# #
## ##
### ###
#### ####
```
----
### 範例
```
高度:-5
高度:4
# #
## ##
### ###
#### ####
```
----
### 作業繳交連結
https://classroom.github.com/a/haJnWl__
---
## 簡報更新記錄
* 上週作業參考解答
* 本週作業
* 更新 ISBN 定義,請使用「模算數定義」
> 最後更新時間:11/23 13:15
{"metaMigratedAt":"2023-06-15T01:42:03.750Z","metaMigratedFrom":"YAML","title":"20191121 基礎班","breaks":true,"slideOptions":"{\"transition\":\"convex\"}","contributors":"[{\"id\":\"39811bc9-1305-4534-84c5-a4c97d2ac539\",\"add\":5814,\"del\":891}]"}