**程式設計Ⅰ【筆記Ⅰ】** === * [name=Ivy Lin] * [筆記2](https://hackmd.io/50cD9oibROGhAn2loo5v6g) * [筆記3](https://hackmd.io/bvpG9TeaSTa5Y9cQGVWKaw) ## 第一週<2023.2.14> 1. 成績分配: - 期中考 40% (電腦教室考試,總共三次,取較高的兩次加總) - 期末考 37% (電腦教室考試) - 筆試 5% (電腦教室考試, 跟期末考一起) - 期末專題 18% :::info * 考試時間(擇三) >3/28, 3/30, 4/25, 4/27, 5/2, 5/4, 6/13, 6/15 ::: ## 第二、三週<2023.2.21~2.28> ### 程式撰寫、編譯、連結 >**text editor** >**compailer** >**linker** ### 基本觀念 **1.** **基本中的基本** >為什麼要 #include >main 是什麼? >printf 只打 print 可以嗎? >為什麼要雙引號 " "? >\n 反斜線加上 n 是什麼意思? >為什麼最後要有分號 ; ? >main 前面的 int 是什麼意思? >main 後面括號裡的 void 是什麼意思? >為什麼要 return 0; **2.** **小小進階** >printf 括號裡 用逗點隔開 是什麼意思? >百分比 % 加 d 有什麼作用? >printf("1234+5678\n"); 和 printf("%d\n", 1234+5678); 差別是什麼? >1234+5678 的運算什麼時候算? **3.** **宣告、輸入跟輸出** >int x; 的作用是什麼? >scanf 的功能是什麼? >scanf 為什麼不用 \n >scanf 後面的 x 會什麼要加 & **4.** **Data types** >* int >* short >* long > * unsigned int > * char > * float > * double **5.** **FORMAT ARGUMENT TYPE** > * %d, %i: int 十進位表示法 > * %u: unsigned int > * %x: unsigned int 十六進位表示法 > * %#x: unsigned int 十六進位表示法 數字前面會自動加上 0x > * %f: double (傳給 printf() 的參數型別如果是 float,其實會直接被升級成 double) > * %Lf: long double > * %e, %E: double 科學記號表示法 > * %c: int (顯示出對應的字元, 傳參數的時候 char 會先被轉成 int) > * %s: char * 用來顯示字串 > * %p: void * 用來顯示指標 > * %g, %G: double 選擇 %f 或 %e 兩者之中較簡短的表示法 **6.** **FORMAT ARGUMENT TYPE** > * %d: int * 傳整數變數的位址 例如 &n 會將讀取到的整數值存入 n > * %ld: long * > * %lld: long long * > * %u: unsigned int * > * %f: float * 讀取 float > * %lf: double * 讀取 double > * %Lf: long double * 讀取 long double > * %c: char * 讀取固定數量的字元 例如 %3c > * %s: char * 讀取用來字串 (至空格出現為止) > * %n: int * 搭配 %s 使用 讀取到的字元數會存入參數中 假設 ## 第四週<2023.3.7> ### 字串輸入輸出 #### <範例程式碼1> ```clike= #include<stdio.h> //使用printf() #include<stdlib.h> //使用strlen() #define speed 0.083 //將內文中所有speed代換成0.083 int main(){ int age; char name[10]; //注意宣告char要考慮輸入後會自動加上'/n' //宣告多少會占用到幾bytes的記憶體 printf("Please enter your name and age :"); scanf("%s %d",name,&age); /*scanf("%s")=>會收錄字串直到'/0'、空白建或換行(enter鍵) 因此須注意輸入字串的長度是否超過宣告長度*/ //字串名字本身即為指標=>不需要加上& return 0; } ``` ### 浮點數的輸入輸出 #### <範例程式碼2> ```clike= #include <stdio.h> #define ENGLNE 1499.99 int main(void) { printf("~%f~\n", ENGINE); printf("~%3.1f~\n", ENGINE); //%f=>單精度浮點數 //%lf=>倍精度浮點數 [輸出直接寫%f=>輸出形式不同] printf("~%e~\n", ENGINE); //%e=>科學記號表示法 printf("~%04.2f~\n", ENGINE); //%4.2f=> 代表總寬度4(加上小數點)、小數點後2位的表示法 //加上0=> 代表若不足位數,以0填補 printf("~%-10.3f~\n", ENGINE); printf("~%+4.2f~\n", ENGINE); //加上+號=> 顯示數值正負 //加上-號=> 將數值靠左對齊 } ``` ### 動態printf寫法 #### <範例程式碼3> ```clike= #include <stdio.h> #include <string.h> #define BORDER "############################################" int main(void) { char word[26]; scanf("%25s", word); printf("%.*s\n", (int)strlen(word)+2, BORDER); printf("#%s#\n", word); printf("%.*s\n", (int)strlen(word)+2, BORDER); /* 用 printf() 輸出字串時的格式設定 1.字串靠右對齊 2.printf("%*.*s\n", 15, 3, "university"); 則是用動態的方式來設定格式 把兩個 * 號分別用 15 和 3 取代 相當於 "%15.3s\n" 的效果 (*優先選取變數 接著%f選擇變數) 3.\b 退格(建議不要使用,容易造成輸出錯誤) 使用會覆蓋原本內容,須謹慎使用。 */ return 0 ; } ``` ### 迴圈(while loop) 1. 基本句型 先執行判斷,再執行動作 >while ( 判斷條件 ) { 執行句 } 2. 變化句(do while) >do { 執行句 } >while ( 判斷句 ) ; :::info * 注意事項 - 判斷條件的選擇(避免無窮迴圈) - 根據情況選擇適合的迴圈 ::: ### 算術運算子 :::warning * 超常用錯的算術運算子 - ++ 和 - - ::: ## 第五週<2023.3.14> ### 簡單的迴圈(for loop) ```clike= for(初始值設定;判斷條件;判斷通過後執行){ 敘述句 } ``` :::info **補充** *#include<ctype.h>的一些函數* 1. getchar() 讀取一個字元 2. putchar() 輸出一個字元 3. tolower() 將()內的字元轉成小寫 ::: ### 條件判斷句(if) ```clike= if(條件判斷){ 敘述句 } ``` :::info **邏輯運算子** 1. && and 2. || or 3. ^ Xor 4. << 往左一格(二進位) 5. >> 往右一格(二進位) 6. ~ Not 7. & 二進位表示法的and 8. | 二進位表示法的or ::: ### 快速讀入資料 ```clike= freopen("testcase.txt", "r", stdin); freopen("output.txt", "w", stdout); ``` testcase.txt=> 編輯的側資文字檔 output.txt=> 程式自動產生,裡面會是執行結果 ## 第六週<2023.3.21> ### 讀取檔案 ```clike= freopen("檔案", "r", stdin); //r=>read //w=>write //stdin =>標準輸入 ``` ### 巨集自定義 ```clike= # define # ifndef # endif //#ifndef 指示檢測指定的預處理器變量是否未定義 //未定義,跟在後面的所有指示被處理,直到出现#endif; //如果已定義,#ifndef測試為假,該指示和#endif指示間的代碼都被忽略。 ``` ### 遞迴 1. 找出一般式 2. 定義函式 :::info **最經典的題目:何內塔** 有三個桿子123(圓盤要從1移到3) * 想法: > 步驟一:將(n-2)個圓盤放到3 > 步驟二:將第(n-1)圓盤放到2 > 步驟三:將(n-2)個圓盤放到2 > 步驟四:將第n個圓盤放到3 > 步驟五:將(n-2)個圓盤移到1 > 步驟六:將第(n-1)圓盤移到3 > 步驟七:將(n-1)個圓盤移到3 ```clike= int ans; void change(int n){ if(n==1) ans+=1; else { change(n-1); change(1); change(n-1); } } int main(){ //幾個圓盤 int n; scanf("%d",&n); change(n); return 0; } ``` ::: ## 第七週<2023.3.28> 段考週 ## 第八週<2023.4.4> 清明連假