---
# System prepended metadata

title: TQC+ C# 考試重點整理

---

# TQC+ C# 考試重點整理
## 第一章 基本處理

```
字串轉型或檢查一律用 TryParse(不符合的則會out 0)
```

- 102 **偶數相加**
    - 不合整數或為奇數記得**轉0**，再去相加

- 104 **距離計算**
    - 四捨五入一定是要先變成**整數**丟進去 ***Math.Floor()***，再除於要的位數

- 106 **最大及最小值**
    - 比較最大最小值別用題目說的Math套件，把數值加到 list 集合比較好處理，如 ***list.Max(); list.Min()***;
	- 利用while迴圈加入輸入數字

- 108 **數學函數**
    - 結果要轉成"小數點後含0"，就用 ***結果.ToString("F4")***

- 110 **存錢筒**
    - 可用三元運算式，來判斷轉換輸入的值
    - 結果要轉成"金錢的千位數"，就用 ***結果.ToString("#,###")***
---

## 第二章 條件判斷式、迴圈及例外處理

```
字串轉型或檢查一律用 TryParse(不符合的則會out 0)
```

- 202 **判斷奇偶數**
    - 無

- 204 **質數**
    - 把原本輸入值轉型int部分拿掉，換成TryParse() 順便判斷
    - 記得將輸入兩數值做大小的判斷，利用temp交換的方式去對調數值
	- 開始做巢狀迴圈:
	    - 外層跑要比較的範圍的數字n(起始值用 ***Math.max(n, 2)*** 比較，因範圍起始值可能大於或等於2)
		- 旗標則設在一開始外迴圈處
        - 內層再將該數值n 去試著用 **任何小於n的數值k**(起始最小為 2)，若可被k整除，則代表該數值n不為質數，則跳出該次判斷(旗標為true)
		- 內層的判斷旗標若為false時，則為質數，將該數值n印出 (被除數一定大於除數, 如果等於就沒檢查必要)
	
            ```
                int x1, x2, tmp;
                // x1 = Convert.ToInt32(Console.ReadLine());
                // x2 = Convert.ToInt32(Console.ReadLine());
                bool result1 = int.TryParse(Console.ReadLine(), out x1);
                bool result2 = int.TryParse(Console.ReadLine(), out x2);

                //TODO
                if (!result1) throw new Exception();
                if (!result2) throw new Exception();
                if (x1 > x2)
                {
                  tmp = x1;
                  x1 = x2;
                  x2 = tmp;
                }
                if (x1 <= 0 || x2 > 100) throw new Exception();

                // 1 is not a prime
                bool foundFactor;
                for (int n = Math.Max(x1, 2); n <= x2; n++)
                {
                  foundFactor = false;
                  for (int k = 2; k < n; k++)
                  {
                    if (n % k == 0)
                    {
                      foundFactor = true;
                      break; // it is not a prime
                    }
                  }
                  if (!foundFactor)
                  {
                    Console.WriteLine(n);
                  }
                }



              }
              catch
              {
                Console.Write("error");
              }
              Console.ReadKey();
            ```

- 206 **關鍵字出現次數**
    - 利用 ***Array.IndexOf(x1)*** 找出是否有該字串出現(將搜尋結果存入pos變數)
    - 利用***while***迴圈 搭配 ***pos***變數去找下一個同樣條件的字串位置(pos+1)

- 208 **計算階乘**
    - 注意間距要**兩個空白(四個字元)**與換行
    - 小於0的乘積記得補0
	- **外層變數 >= 內層變數** 再印出即可，因題目所求(如: 3*3 = 9  3* 2 =6  3*1 =3 , 前數必定大於等於後數)

- 210 **捕捉錯誤**
    - 記得把兩相除結果，包**進try...catch**，且印出結果即可(否則除於0會印出Error , 因為division() 會繼續往外拋例外)

---

## 第三章 陣列、集合與遞迴

```
字串轉型或檢查一律用 TryParse(不符合的則會out 0)
```

- 302 **文字陣列取出資料**
    - 記得判斷輸入數值為 0~6

- 304 **移除陣列指定值**
    - 將***scores***陣列元素依序**加入list 集合**中(如果輸入值格式(如文字)不符要求，或無相同元素，要將該值**轉為0**再加入集合)
	- 記得加總前需將除數**轉成Double**，否則結果為整數(不符需求)
	
        ```
          int removeNum;
          double sum = 0, avg = 0;
          bool result = int.TryParse(Console.ReadLine(), out removeNum);
          List<int> list = new List<int>();
          if (!result) list.Add(0);

          for (int i = 0; i < scores.Length; i++)
          {
            if (scores[i] != removeNum) list.Add(scores[i]);
          }

          foreach (var score in list)
          {
            sum += score;
          }

          avg = Math.Floor((sum / list.Count) * 100) / 100;
          Console.Write(avg); //TODO

          Console.ReadKey();
        ```

- 306 **矩陣相加**
    - 因題目已設置好，因此先將b的二維陣列拆成: 變數***i<3***, 值加入***b[0]***, 否則加入***b[1]***
          2. 透過 ***compute()*** 將a,b兩陣列元數相加後，傳至print()跑**相同迴圈**，將結果陣列印出
          3. print()回傳的結果陣列各元素記得轉字串後偏移4個數字(***數值.ToString().PadLeft(4)***)
		  
- 308 **陣列搜尋**
    - 利用**foreach或for迴圈**找出符合的值為條件即可(用***try...catch***比用***if..else***好, 因為要印出錯誤)
- 310 **遞迴函數**
    - **依題目條件寫出**遞迴後回傳結果，傳入compute()的參數為正整數(用***Math.abs()*** 轉為絕對值)
---

# 第四章

```
DateTime.ParseExact() 可以設定時間字串格式並轉成DateTime物件
時間輸入格式都為 "yyyyMMdd"(如題目) ,沒照格式會Parse時產生錯誤
```

- 402 **計算時間差**
    - 兩時間物件相減運算得***TimeSpan***物件, ***ts.Days***可得天數(記得用 ***Math.abs()*** 轉正整數)

- 404 **上週起迄日期**
    - 要做***Datime***物件，然後用 ***AddDays()*** 來計算往回幾天, ***dt.DayOfWeek()*** 可求得當天為這禮拜第幾天(會以禮拜日第一天),求得DateTime物件後, ***ToString("d")*** 轉天數字串給 ***lastDay*** 用
	- 以題目例, 為往回7天, 然後看七天前是該禮拜第幾天後, 再加上一天為當周第一天
    - 求得的Datetime物件記得轉***ToString("yyyy/MM/dd")***

        ```
        try
          {
            //TODO
            DateTime dt = DateTime.ParseExact(Console.ReadLine(), "yyyyMMdd", null);
            string firstDay = dt.AddDays(-7).AddDays(-int.Parse(dt.DayOfWeek.ToString("d")) + 1).ToString("yyyy/MM/dd");
            string lastDay = DateTime.ParseExact(firstDay, "yyyy/MM/dd", null).AddDays(6).ToString("yyyy/MM/dd");
            Console.Write("{0}-{1}", firstDay, lastDay); //TODO
          }
          catch
          {
            Console.Write("error");
          }
          Console.ReadKey();
        ```
- 406 **亂數**
    - ***Random(seed)*** 亂數種子要丟在物件的建構式內
    - 把亂數加入list集合內，***if (!list.Contains(亂數))*** 檢查是否亂數重複，再以 ***String.JOIN()*** 組合輸出所需字串

- 408 **轉換工時數**
    - 記得 **分鐘>59** 的判斷
- 410 **生日人數**
    - 取出每個**生日的字串**後，再從該字串陣列**取出月分**

---

# 第五章 檔案存取及資料流

```
寫出檔案都用:
System.IO.File.WriteAllText()
(將字串資料組合好，一次寫入即可)

讀入檔案都用:
StreamReader sr = new StreamReader("read.txt"); //逐字讀入
可搭配 : 
1. sr.EndOfStream 迴圈條件判斷
2. 如需要判斷擷取的資料筆數，可透過計數器控制，用計數數值搭配，判斷筆數

空字串判斷都用:
string.IsNullOrEmpty()
```
- 502 **寫入資料至文字檔**
    - 如上述通則

- 504 **文字檔資料新增**
    - 輸入字串檢查可以用foreach 檢查，然後把其字串與 ***newstudent*** 陣列，加在一起後進行while迴圈，透過計數器控制，用計數數值來判斷，分別把資料塞到新的list內
    - 剩下如上述通則

- 506 **刪除文字資料**
    - 利用 ***"StringBuilder"*** append 資料，組合成一整個完整文字資料
    - 讀出跟寫入是不同檔案要注意
    - 剩下如上述通則

- 508 **計算平均成績**
    - 把原本題目程式前面去除掉(此題特殊) 
    - 因取前幾筆的資料有可能遇到男或女的**筆數為0**狀況，所以要用**大於0**的方式加上判斷，再計算平均值
    - 要注意男女的平均加總平均還要**除於3**，因為每筆資料有3個成績
    - 剩下如上述通則

- 510 **寫入至文字檔**
    - 分割字串如果要去除空白輸入: ***StringSplitOptions.RemoveEmptyEntries***

---

# 第六章 物件導向程式設計
- 602 **汽車外觀設計**
    - 需依題意將所列的屬性在***car***類別宣告出來，***color***屬性用***int***值即可，剩下用複製的
    - 將列舉 ***"carColor"*** 定義好，在***main***主方法內準備使用
    - 將上述屬性透過***Car***建構式或定義好的set方法(皆可)傳值到物件內，其中color屬性是透過 ***(int)carColor.成員*** 指派
    - 最後透過car物件呼叫屬性印出值，其中color用 ***(carColor)car.color*** 取得並印出

- 604 **薪資總計**
    - 記得改寫將***isManager***屬性用在FullTime類別的***salary***方法內
    - 使用StreamReader物件讀出資料後，加總薪水
- 606 **銀行帳戶設計**
    - 在迴圈處理好存提款就好，最後再處理好本利和
    - 記得計算本利合時，程式需處理好轉型 (***balance  (1 + ((double)rate / 100.0))***)

- 608 **航空包裏運費計算**
    - 利用***air***物件的建構式，把需要的單位運費、時數初始化後，透過 ***computeFreight()*** 方法去計算
    - 在***while***迴圈 內建立物件，並呼叫計算方法去加總
- 610 **電腦零件設計**
    - 改寫抽象類別，其類別**存取範圍不得比父類別大**
    - 在Notebook類別有兩個建構式，透過建構式傳題目要的屬性，順便建構起LCD等物件，且***注意CPU物件建構式為Double***
    - 計算成本或售價記得台數
    - 最後結果輸出: cost/total 應可不用特別轉字串或格式，且除了輸入長度(字串切割後)需判斷外，其他的資料的檢查題目已打好，應可以不用再檢查