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