# 計算機概論
**目錄**
[TOC]
## 作業一 計算機科學大事記
### 主題
車用晶片嚴重缺貨,美、日、德等國向台灣求援,盼台積電等業者增產
時間:西元2021年
### 簡報檔
[車用晶片嚴重缺貨事件](https://docs.google.com/presentation/d/14bFU3L5wDKpLi_DM5xlczo479Xu-tXYUv4BTRuwJ9SA/edit?usp=sharing)
## 作業二 程式語言十八般武藝
**題目名:[Sum of Two Integers](https://leetcode.com/problems/sum-of-two-integers/)**
### 程式碼
1.語言:C
```cpp=
int getSum(int a, int b){
return a+b;
}
```
2.語言:C++
```cpp=
class Solution {
public:
int getSum(int a, int b) {
return a+b;
}
};
```
3.語言:Python
```python=
class Solution(object):
def getSum(self, a, b):
return a+b;
"""
:type a: int
:type b: int
:rtype: int
"""
```
4.語言:Python3
```python=
class Solution:
def getSum(self, a: int, b: int) -> int:
return a+b
```
5.語言:Java
```java=
class Solution {
public int getSum(int a, int b) {
return a+b;
}
}
```
6.語言:csharp
```csharp=
public class Solution {
public int GetSum(int a, int b) {
return a+b;
}
}
```
7.語言:javascript
```javascript=
/**
* @param {number} a
* @param {number} b
* @return {number}
*/
var getSum = function(a, b) {
return a+b;
};
```
8.語言:Ruby
```ruby=
# @param {Integer} a
# @param {Integer} b
# @return {Integer}
def get_sum(a, b)
return a+b;
end
```
9.語言:swift
```swift=
class Solution {
func getSum(_ a: Int, _ b: Int) -> Int {
return a+b;
}
}
```
10.語言:golang
```golang=
func getSum(a int, b int) int {
return a+b;
}
```
11.語言:scala
``` scala=
object Solution {
def getSum(a: Int, b: Int): Int = {
return a+b;
}
}
```
12.語言:kotlin
``` kotlin=
class Solution {
fun getSum(a: Int, b: Int): Int {
return a+b;
}
}
```
13.語言:rust
``` rust=
impl Solution {
pub fn get_sum(a: i32, b: i32) -> i32 {
return a+b;
}
}
```
14.語言:php
```php=
class Solution {
/**
* @param Integer $a
* @param Integer $b
* @return Integer
*/
function getSum($a, $b) {
return $a+$b;
}
}
```
15.語言:typescript
``` typescript=
function getSum(a: number, b: number): number {
return a+b;
};
```
16.語言:Racket
```racket=
(define/contract (get-sum a b)
(-> exact-integer? exact-integer? exact-integer?)
(+ a b)
)
```
17.語言:Erlang
```erlang=
-spec get_sum(A :: integer(), B :: integer()) -> integer().
get_sum(A, B) ->
A+B.
```
18.語言:elixir
```elixir=
defmodule Solution do
@spec get_sum(a :: integer, b :: integer) :: integer
def get_sum(a, b) do
a+b
end
end
```
19.語言:dart
```dart=
class Solution {
int getSum(int a, int b) {
return a+b;
}
}
```
## 作業三 我預判了你的 git 預判
### Git 功能介紹
#### **git init**
**指令名稱**:git init
**用途**:建立一個.git資料夾,放入預先建立資料(初始化)
**操作示範**:
>git init
>資料夾初始化
{%youtube Kk5u9pBmLBQ %}
---
#### **git add**
**指令名稱**:git add
**用途**:將文件內容添加到暫存區
**操作示範**:
>*步驟1* : echo Hello World > a.txt
>建立檔名為a的文字檔(a.txt),檔案中存放"Hello World"文字
>↓
>*步驟2* :type a.txt
>輸出文字檔(a.txt)中信息
>↓
>*步驟3*: git add a.txt
>將文字檔(a.txt)加入暫存區
>
{%youtube PfKuFcNohYU %}
---
#### **git status**
**指令名稱**:git status
**用途**:顯示工作目錄和暫存區的狀態。但不顯示commit到項目歷史中的信息
**操作示範**:
>git status
>查看status(暫存區內容)
{%youtube Y2_N-1lWdHI%}
---
#### **git commit**
**指令名稱**:git commit
**用途**:用於將更改記錄傳送到存儲庫
**操作示範**:
>git commit -m "Initial commit"
>將文字檔(a.txt)傳送到儲存庫
{%youtube nP3vVTe4ctA%}
---
#### **git log**
**指令名稱**:git log
**用途**:用於顯示提交紀錄訊息
**操作示範**:
>git log
>顯示歷史提交紀錄
{%youtube gwQhZrW7z0s %}
---
#### **git rm**
**指令名稱**:git rm
**用途**:用於從工作區和索引中刪除文件
**操作示範**:
>git rm a.txt
>刪除a.txt(文字檔)
{%youtube H5wiWpJO_e4 %}
---
#### **git checkout**
**指令名稱**:git checkout
**用途**:用於切換分支
**操作示範**:
>*步驟1* : git branch develop
>建立一個develop分支
>↓
>*步驟2* : git branch
>查看當下使用分支(使用者為"*")
>↓
>*步驟3* : git checkout branch develop
>切換分支為develop分支
{%youtube BnqyTe7IYx8 %}
**參考資料來源**:
(1)[學習 Git 版本控管:新手上路篇 (命令列操作)](https://www.youtube.com/watch?v=WxFSad6II34)
(2)[Git 新手上路 AMA 實作練習腳本](https://gist.github.com/doggy8088/e39cfa2f28cd6da43fcf1689cee3f5ff)
(3)[Git教學](https://www.1ju.org/git/index)
(3)[Git安裝(官網)](https://www.gitscm.com/download/win)
---
## 作業4 AI 新創 Demo Pitch
### 產品簡介
**產品名稱**:AI 運動訓練
**產品解決問題**:在一個多數人追求健康的世界中,運動是人們不可或缺的事情之一,但你確定在運動過程中得動作都是正確的嗎?如果你有了 「AI運動訓練」,就可以避免動作錯誤的事情發生了!
**技術使用的資料來源**:擁有該項運動中人員進行姿勢、動作分析
**核心技術**:
(1)機器學習:分類不同種動作,並判斷使用者做的動作為何
(2)影像辨識:即時識別像和動作內容
(3)大數據分析:
1.將大部分使用者的錯誤姿勢設定為訓練前注意事項,並在每次訓練前提醒使用者此姿勢他(使用者)常錯姿勢,提早更正姿勢
2.分析使用者的能力,並給予合適的運動量
**預期會遇到的困難**:
(1)同一個運動可能有不同種正確姿勢,需將資料蒐集完整,才能確保使用者部會因此受傷
(2)要讓運動分析成效更好,必須配戴其他穿戴性裝置同步監測,才能較為準確
**產品介紹影片**:
{%youtube VU1mFof-Sj8 %}
**參考資料**:
[Johnson@Mirror 新概念健身魔鏡](https://www.johnsonfitness.com.tw/prod/?q=MIRROR)
---
## 作業 5 演算法十八般武藝
### 搜尋
[704. Binary Search](https://leetcode.com/problems/binary-search/)
#### 方法一:線性搜尋法
**使用方法**
將範圍中數值依序判斷,當尋找到目標值後結束執行
**程式碼**
```cpp
class Solution {
public:
int search(vector<int>& nums, int target) {
int key=-1;
for(int i=0;i<nums.size();i++){
if(nums[i]==target){
key=i;
break;
}
}
return key;
}
};
```

#### 方法二:二分搜尋法
**使用方法**
透過設定範圍(已排序)的上下限尋找出中間值,並查看其值與目標值的關係,每次判斷可淘汰範圍內一半的值
**程式碼**
```cpp
class Solution {
public:
int search(vector<int>& nums, int target) {
int m;
int count=0;
int l=0,h=nums.size()-1;
do{
count++;
m=((h-l)/2)+l;
if(nums[m]!=target && l==h){
m=-1;
break;
}
if(nums[m]<target){
l=m+1;
}
if(nums[m]>target){
h=m-1;
}
if(l<0 || h<0){
m=-1;
break;
}
}while(nums[m]!=target);
return m;
}
};
```

## 排序演算法
### 題目:
[Sort an Array - LeetCode](https://leetcode.com/problems/sort-an-array/)
## **方法一:氣泡排序**
### **使用方法**
一次比較兩個元素,如果它們的順序錯誤就把它們交換過來。
這個演算法的名字由來是因為越小的元素會經由交換慢慢浮到數列的頂端。
**泡沫排序演算法的運作如下:**
1. 比較相鄰的元素。如果第一個比第二個大,就交換它們兩個。
2. 對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。這步做完後,最後的元素會是最大的數。
3. 針對所有的元素重複以上的步驟,除了最後一個。
4. 持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較。
### **程式碼**
```cpp
class Solution {
public:
vector<int> sortArray(vector<int>& nums) {
int m=nums.size();
for(int i=m-1;i>=0;i--){
for(int j=0;j<i;j++){
if(nums[j]>nums[j+1]){
int tmp=nums[j];
nums[j]=nums[j+1];
nums[j+1]=tmp;
}
}
}
return nums;
}
};
```
### 解題結果截圖
**Time Limit Exceeded**
原因可能是執行次數過多,造成超時執行的狀況(時間複雜度過高)

## 方法二:雞尾酒排序
### 使用方法
演算法與泡沫排序的不同處在於排序時是以雙向在序列中進行排序
它從左邊刷過去再從右邊刷回來:第一次把最大值放到最右邊去、然後把最小值推到最左邊、再把次大值放到右邊、再把次小值放到左邊…依此類推。
### 程式碼
```cpp
class Solution{
public:
vector<int> sortArray(vector<int>& nums) {
int left=0,right=nums.size()-1;
while(left<right){
for(int i=left;i<right;i++){
if(nums[i]>nums[i+1]){
int tmp=nums[i];
nums[i]=nums[i+1];
nums[i+1]=tmp;
}
}
right--;
for(int j=right;j>left;j--){
if(nums[j-1]>nums[j]){
int tmp=nums[j-1];
nums[j-1]=nums[j];
nums[j]=tmp;
}
}
left++;
}
return nums;
}
};
```
### 解題截圖
**Time Limit Exceeded**
原因可能是執行次數過多,造成超時執行的狀況(時間複雜度過高)

## **方法三:插入排序**
### **使用方法**
原理是逐一將原始資料加入已排序好資料中,並逐一與已排序好的資料作比較,找到對的位置插入
**具體演算法描述如下:**
1. 從第一個元素開始,該元素可以認為已經被排序
2. 取出下一個元素,在已經排序的元素序列中從後向前掃描
3. 如果該元素(已排序)大於新元素,將該元素移到下一位置
4. 重複步驟3,直到找到已排序的元素小於或者等於新元素的位置
5. 將新元素插入到該位置後
6. 重複步驟2~5
### **程式碼**
```cpp
class Solution{
public:
vector<int> sortArray(vector<int>& nums) {
int i,j,key;
for (i=1;i<nums.size();++i){
key = nums[i];
j=i-1;
while((j>=0) && (nums[j]>key)) {
nums[j+1] = nums[j];
j--;
}
nums[j+1] = key;
}
return nums;
}
};
```
### 解題結果截圖
**Time Limit Exceeded**
原因可能是執行次數過多,造成超時執行的狀況(時間複雜度過高)

## **方法四:選擇排序**
### **使用方法**
### **程式碼**
```cpp
class Solution{
public:
vector<int> sortArray(vector<int>& nums) {
for(int i=0;i<nums.size();i++){
int min=i;
for(int j=i;j<nums.size();j++){
if(nums[j]<nums[min]){
min=j;
}
}
if(i!=min){
int tmp=nums[min];
nums[min]=nums[i];
nums[i]=tmp;
}
}
return nums;
}
};
```
### 解題結果截圖
**Time Limit Exceeded**
原因可能是資料量大,導致執行次數過多,造成超時執行的狀況

---
## **方法五:sort**
### **使用方法**
### **程式碼**
```cpp
class Solution{
public:
vector<int> sortArray(vector<int>& nums) {
sort(nums.begin(),nums.end());
return nums;
}
};
```
### 解題結果截圖

---
### 排序演算法結論
四種排序演算法(氣泡排序、雞尾酒排序、插入排序、選擇排序)的時間複雜度過高,導致執行時造成超時(TLE)現象
## 參考資料
**搜尋:**
[二分搜尋演算法 - 維基百科,自由的百科全書](https://zh.m.wikipedia.org/zh-tw/%E4%BA%8C%E5%88%86%E6%90%9C%E5%B0%8B%E6%BC%94%E7%AE%97%E6%B3%95)
[线性搜索 - 维基百科,自由的百科全书](https://zh.wikipedia.org/zh-tw/%E7%BA%BF%E6%80%A7%E6%90%9C%E7%B4%A2)
**排序:**
[泡沫排序 - 維基百科,自由的百科全書](https://zh.m.wikipedia.org/zh-tw/%E5%86%92%E6%B3%A1%E6%8E%92%E5%BA%8F)
[鸡尾酒排序 - 维基百科,自由的百科全书](https://zh.wikipedia.org/zh-tw/%E9%B8%A1%E5%B0%BE%E9%85%92%E6%8E%92%E5%BA%8F)
[插入排序 - 維基百科,自由的百科全書](https://zh.m.wikipedia.org/zh-tw/%E6%8F%92%E5%85%A5%E6%8E%92%E5%BA%8F)