# 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 應可不用特別轉字串或格式,且除了輸入長度(字串切割後)需判斷外,其他的資料的檢查題目已打好,應可以不用再檢查