**程式設計Ⅰ【筆記Ⅰ】**
===
* [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>
清明連假