【重點整理】C語言

這是我自己學習的筆記,紀錄一些準備考試的重點,不適合新手閱讀

好久不見!

因為要準備會考已經非常久沒有發文了,不過這一篇是我自己寫的一些重點整理筆記,且會持續更新。程式語言教學只會寫C與其他語言不同的語法,適合已經對程式有概念的人閱讀。如果你對C語言有興趣可以參考這個系列文章,我覺得寫得不錯w

C規則

只寫和javascript不同的地方,或我自己覺得重要或會忘記的部分

函式Cool

通常會加入stdio.hstdlib.h

  • stdio.h
    • puts(char) - 將字串顯示到視窗上,自動換行
    • gets(char) - 透過鍵盤輸入字串
  • stdlib.h
    • abs(int x) - 回傳整數 x 的絕對值
    • atoi(char) - 回傳字串轉整數的結果
    • strtof(char) -
    • 回傳字串轉 float 的結果
  • math.h
  • string.h
    • strlen(s) - 回傳一個整數,是字串 s 的長度,長度的計算不包含字串結尾的 '\0'

輸出

1printf("字串");
2printf("字串或格式代碼",var1,var2,var3);
3puts("ABC");//自動換行,但沒有格式化字串的功能。只能顯示字串
  • \n:換行
  • \t:自動對齊
  • \a: 鈴聲
  • \b: 游標(下個文字開始顯示的位置)倒退一格
  • \r: 游標倒退到這行的開頭

預留位置(Format placehold)

整數用 %d,浮點數用 %f,字元用 %c,字串用 %s

%hd, %d, %lld 都是將資料轉換成整數
能處理的位數 %hd < %d < %lld

格式化字串

最小長度

% 的後面加上數字,可以設定變數顯示的最小長度,如果長度不足會自動補空格,以達到對其的目的如printf("%4d\n", a);在最小位數的前面加上0,會變成用0補齊長度如printf("%07d\n", b);

變數

型態

加上 unsigned,會變成只能表示正數和0,但範圍 大小 不變。如unsigned char的範圍是0~2^8

型態說明範圍
long int長整數±21億
int整數±21億
short int短整數±32768
char字元0~255
float浮點數1.2~3.4e±38
double倍精度浮點數1.2~1.8e±308

你有沒有發現可悲的C語言中,並沒有 String 這個型別。需要使用字元的陣列 (character Array) 作為字串,而空字元('\0')代表字串結束 所以 "123",其實是一個長度為四的一維字元陣列,它的元依序是 '1', '2', '3', '\0'

宣告

以下4種方式都可以

1int x
2int x=1
3//一次多個
4int x=1, y=10, z=100;
5int x=y=z=100;

雖然沒有硬性規定,但C語言中可以用 f, F 標示數值是浮點數,整數時可以用 . 標示

指派/指定 運算子(Assignment Operator)

前面用過的 = 就是其中一種,執行時會先將等號右邊的值算出來,再指派給左邊的變數 a=a+1等效a+=1等效a++ a=a-1等效a-=1等效a-- a=a*2等效a*=2 a=a/2等效a/=2 a=a%2等效a%=2

輸入

1//輸入整數、字元、浮點到變數x、y、z
2scanf("%d%c%d", &x, &y, &z);

邏輯判斷

if、switch、while、for

和js大同小異

 1//if
 2if(ture){
 3	printf("yes");
 4}
 5else{
 6	printf("no");
 7}
 8//大括號內只有一行可省略大括號
 9if(x>100)
10	printf("x is greater than 100.");
11
12//switch
13switch(x){
14	case 0: case 7:
15		printf("A\n");
16		//x=0或是7都會印出A
17		break;
18	case 2: case 5:
19		printf("B\n");
20		break;
21	case 4: case 3:
22		printf("C\n");
23		break;
24	case 6: case 1:
25		printf("D\n");
26		break;
27}
28
29//while
30while(ture){
31	printf("forever printing");
32}
33
34//for 大括號內只有一行一樣可省略大括號
35int i;
36for(i=0; i!=5; i++)
37	printf("%d", i);//輸出12345
38	
程式碼縮排

和js一樣沒有規定,不縮也可以
通常以一個 Tab 鍵(在鍵盤左邊) 為單位,每多一個大括號,就多空一個單位。如果大括號被省略還是要縮排

break & continue

  • break: 強制結束迴圈
  • continue: 跳過這次的區塊,但迴圈不會結束

陣列

以下是一些合法使用的例子

1int arrA[5];
2int arr[]={12,22,3};
3arr[2]=4;
4arr[x]=y;
5printf("%d\n", arr[0]);

字元陣列 (character Array)

AKA字串。可悲C

  • 字元常數是用單引號括起來的一個字元,如'a'、'b'、'='、'+'、'?'
  • 字串常數是由一對雙引號括起的字元序列,如"EM" , “Oh yeah!” , "$12.5"

字元常數'a'和字串常數"a"雖然都只有一個字元,但在記憶體中的情況是不同的。

輸入記憶體
'a'a
"a"a \0

宣告

1//可以用和陣列一樣的方法初始化字串的內容
2char s[100]={'H', 'e', 'l', 'l', 'o', '!', '\0'};
3//或是用雙引號代表字串,但一樣只能在宣告時用這個方法指派
4char s[100]="Hello!";
5//可把字串作為printf()的引數來印出字串
6char s[100]="Hello!";
7printf(s);

輸出

1char s[100]="PJ";
2printf("My name is %s.", s);
3return 0;

輸入

1char name[100];
2scanf("%s", name);
3printf("My name is %s.\n", name);

如果輸入的字串包含空格必須用 %[^\n]

1char name[100];
2scanf("%[^\n]", name);
3printf("My name is %s.\n", name);

#### 常見字串處理

字串長度

可用loop

 1#include<stdio.h>
 2
 3int main(){
 4	char s[100]="Hello!";
 5	int len=0;
 6	for(int i=0; s[i]!='\0'; i++)
 7		len++;
 8	printf("%d\n", len);
 9	return 0;
10}

或透過函式庫string.h

定義

語法是:#define <目標文字> <替換文字>

#define 定義的函式,執行速度會比自訂函式還快,但函式功能複雜時不好編寫,且容易造成執行結果錯誤

 1#include<stdio.h>
 2#define plus + //定義函式
 3#define x 1 //定義變數
 4#define y 2 //定義變數
 5#define say printf
 6
 7int main(){
 8	say("%d\n", x plus y);
 9	return 0;
10}

函式

 1#include<stdio.h>
 2#include<stdlib.h>
 3
 4int pi(){
 5    char say[3]="hi";
 6    showMessage(say);
 7    return 666;
 8}
 9void showMessage(a){
10    printf(a);
11}
12int main(){
13    printf("\n%d", pi());//輸出12345
14    return 0;
15}

建構式

struct

 1#include<stdio.h>
 2#include<stdlib.h>
 3
 4struct STUDENT{
 5    int number;
 6    int age;
 7};
 8
 9int main(){
10	struct STUDENT student_1={87, 19};
11	printf("I am %d,I'm %d years old",student_1.number,student_1.age);
12    //I am 87,I'm 19 years old
13}

union

太廢了我也不知道拿來幹嘛

struct 一樣可以由多個不同型別的成員組成,但 同一時間只能儲存一個資料,或者可以說雖然可以用不同的成員名稱取得其中的資料,但實際上不管用哪個名稱都會得到同一個數值

 1#include<stdio.h>
 2#include<stdlib.h>
 3
 4union Data{
 5	int n;
 6	float f;
 7};
 8
 9int main(){
10	union Data data={5};
11	printf("%d %f\n", data.n, data.f);
12    //5 0.000000
13}

enum

 1#include<stdio.h>
 2#include<stdlib.h>
 3
 4enum week{A=1, B, C, D=1, E, F};
 5
 6int main(){
 7	printf("%d %d %d %d %d %d", A, B, C, D, E, F);
 8    //1 2 3 1 2 3
 9	return 0;
10}

關鍵字

以下這些字不能作為變數名稱

auto, do, goto, signed, break, double, if, sizeof, case, else, int, static, char, enum, long, struct, const, extern, register, switch, continue, float, return, typedef, default, for, short, union

科學記號

  • 123=1.23E+2
  • 0.00041=4.1e-4

數學<math.h>

  • M_E 回傳自然常數 e
  • M_PI 回傳圓周率 π
  • M_SQRT2 回傳根號2
  • sin(x) cos(x) tan(x) asin(x) acos(x) atan(x) BJ4
  • exp(x) 回傳自然常數 e 的 x 次方
  • pow(x, y) 回傳 xy 次方
  • pow(x) 回傳10的 x 次方
  • sqrt(x) 回傳 x 的根號
  • log(x) 回傳以 e 為底的對數
  • log10(x) 回傳以10為底的對數
  • abs(x) 回傳整數 x 的絕對值
  • fabs(x) 回傳實數 x 的絕對值