23
Hanoi Aptech Hướng dẫn Ôn tập môn C 1. Cấu trúc 1 chương trình C 2. Biến và các kiểu dữ liệu 3. Phép toán và biểu thức 4.Vào ra 5. Các lệnh điều khiển 6.Mảng 7.Hàm 8.Con trỏ 9.Chuỗi Tài liệu hướng dẫn ôn tập môn C Page 1 of 23

Huong danontapc

  • Upload
    ho-loi

  • View
    24

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Huong danontapc

Hanoi Aptech

Hướng dẫn Ôn tập môn C

1. Cấu trúc 1 chương trình C2. Biến và các kiểu dữ liệu3. Phép toán và biểu thức4. Vào ra5. Các lệnh điều khiển6. Mảng7. Hàm8. Con trỏ9. Chuỗi

Tài liệu hướng dẫn ôn tập môn C Page 1 of 18

Page 2: Huong danontapc

Hanoi Aptech

1 Cấu trúc một chương trình C

#include<stdio.h>#include<conio.h>...

int sum(int a, int b);void show(int x);...

void main(){

int a = 2;int b = 3;int c = sum(a,b);show(c);

}

int sum(int a, int b){

return a + b;}

void show(int x){

printf(“\n%d”, x);}

Tài liệu hướng dẫn ôn tập môn C Page 2 of 18

Khai báo thư viện sẽ sử dụng

Khai báo các nguyên mẫu hàm

Khai báo và viết code cho hàm main – hàm để chạy chương trình

Viết code xử lý cho các hàm đã khai báo trong phần nguyên mẫu ở trên

Page 3: Huong danontapc

Hanoi Aptech

2 Biến và kiểu dữ liệu

2.1 Khái niệmBiến là đơn vị lưu trữ cơ bản trong bộ nhớ. Khi nhập dữ liệu từ bàn phím, hoặc khi tính toán ra kết quả trung gian, người ta lưu vào biến.

2.2 Khai báo[Kiểu dữ liệu] [Tên biến];VD:int x;Chú ý: C phân biệt chữ hoa chữ thường nên int x và int X sẽ khai báo 2 biến khác nhau.

2.3 Kiểu dữ liệuC cung cấp đầy đủ các kiểu dữ liệu cơ bản, bao gồm kiểu số và kiểu ký tự.

2.3.1 Kiểu intKiểu số nguyên, lưu trữ 1 số nguyên trong khoảng -32768 → 32767

2.3.2 Kiểu floatKiểu số thực, lưu trữ số thực trong khoảng -3.37.1038 → 3.37.1038

2.3.3 Kiểu DoubleCũng giống như float nhưng có kích thước lớn hơn rất nhiều: -1.79.10308 → 1.79.10308

Ngoài ra còn có 1 số kiểu số nguyên khác: long, short, unsigned(xem thêm trong sách).

3 Phép toán và biểu thứcPhép toán số họcBao gồm: +, -, *, /, và %(lấy phần dư)

Phép gán:

Tên_biến = biểu_thức;VD: x = 3*4+2;

Phép tăng giảm giá trị:

++ và --VD: ++i; --i;Chú ý: ++i và i++ khác nhau ở chỗ:

Tài liệu hướng dẫn ôn tập môn C Page 3 of 18

Page 4: Huong danontapc

Hanoi Aptech

Lấy ví dụ: i = 7;x = ++i - 5; và x = i++ - 5;Phép gán thứ nhất sẽ cho kết quả x = 3, còn phép gán thứ 2 thì x = 2Lý do là trong biểu thức thứ nhất i được tăng trước rồi mới thực hiện phép trừ, còn trong biểu thức thứ 2 thực hiện trừ trước rồi mới tăng i.

Có thể gán nhiều biến nhận 1 giá trị: a = b = c = 10;

Phép toán quan hệ:

Trả về kết quả 1(true) nếu biểu thức quan hệ là đúng và 0(false) nếu biểu thức quan hệ sai. Các toán tử quan hệ bao gồm: >, <, >=, <=, ==, !=VD: a = 3; b = 5;a > b 0a < b 1a >= b 0a <= b 1a == b 0a != b 1

Phép toán logic

Bao gồm các phép toán &&(AND), ||(OR), !(NOT). Phép toán logic áp dụng trên các giá trị 0(false) và 1(true)Bảng kết quả phép &&:

Bảng kết quả phép ||:

Bảng kết quả phép !:

Tài liệu hướng dẫn ôn tập môn C

a b a &&b0 0 00 1 01 0 01 1 1

a b a ||b0 0 00 1 11 0 11 1 1

a !a0 11 0

Page 4 of 18

Page 5: Huong danontapc

Hanoi Aptech

4 Vào ra

4.1 Vào – Đọc từ bàn phím1. Lệnh scanfCú pháp: scanf(“chuỗi điều khiển”, danh sách tham số);

Chuỗi điều khiển là:%d: đọc số nguyên%f: đọc số thực%c: đọc kí tự%s: đọc chuỗi

Danh sách tham số là danh sách các địa chỉ của biến phân cách nhau bởi dấu phẩy.

Ví dụ: scanf(“%d”, &x); --> đọc 1 số nguyên và lưu vào biến xscanf(“%c %f”, &ch, &y) --> đọc 1 kí tự vào biến ch và 1 số thực lưu vào biến yKhi chạy chương trình phải nhập 1 kí tự rồi dấu phân cách(dấu cách hoặc tab) tiếp đó là số thực.

Lưu ý: Giữa các chuỗi điều khiển nên có dấu cách để phân tách:

VD: nếu lệnh scanf(“%d%c”, &y, &ch) và nhập: 1 a thì ch sẽ nhận giá trị là dấu cách(space) chứ không phải là chữ a. Để khắc phục, thêm 1 dấu cách giữa %d và %c:scanf(“%d %c”, &y, &ch);

Các tham số trong hàm scanf phải là địa chỉ của biến chứ không phải biến.VD: int x;scanf(“%d”, x) là sai mà phải là scanf(“%d”, &x)Tuy nhiên, nếu khai báo x là 1 biến con trỏ: int *x;thì lại phải dùng scanf(“%d”, x) vì lúc này x là địa chỉ.

2. Lệnh đọc 1 ký tự từ bàn phím:

getchar() và getche(). Cách dùng: ch = getchar() hoặc ch = getche()Điểm khác nhau là getchar thì phải gõ enter mới kết thúc nhập còn getche thì ngay khi gõ xong kí tự đã kết thúc nhập.

3. Lệnh đọc 1 xâu từ bàn phím:gets(biến_xâu)Cách sử dụng:char s[100];gets(s);

Lưu ý: khi sử dụng hàm gets thì phải dùng fflush(stdin) để xóa sạch bộ đệm bàn phím trước.

4.2 Ra – In ra màn hình1. Lệnh printf

Tài liệu hướng dẫn ôn tập môn C Page 5 of 18

Page 6: Huong danontapc

Hanoi Aptech

Cú pháp:printf(“chuỗi điều khiển”, danh sách tham số);Chuỗi điều khiển cũng giống như hàm scanf:%d: in số nguyên%f: in số thực%c: in ký tự%s: in chuỗi

Danh sách tham số là danh sách các biến(chứ không phải địa chỉ của biến – không có dấu &) phân cách nhau bởi dấu phẩy.

VD: printf(“%d %f”, x, y) --> in giá trị biến x và y ra màn hình.

Nếu x là biến con trỏ: int *x thì để in giá trị dùng câu lệnh: printf(“%d”, *x);In các ký tự đặc biệt:printf(“\n”): xuống dòngprintf(“\t”): thêm 1 dấu tabprintf(“\\”): in ký tự \printf(“\””): in ký tự “

2. Lệnh putcharIn 1 ký tự ra màn hình.Tham số của hàm putchar() có thể là 1 hằng ký tự (VD ‘A’) hoặc 1 biến kí tự (ch).

3. Lệnh putsIn 1 chuỗi ký tự ra màn hình.Tham số của puts là 1 chuỗi.

Tài liệu hướng dẫn ôn tập môn C Page 6 of 18

Page 7: Huong danontapc

Hanoi Aptech

5 Các cấu trúc điều khiển

5.1 If elseCú pháp:if(biểu_thức_điều_kiện){

lệnh1;lệnh 2;...

}else{

lệnh 3;lệnh 4;...

}

Có nghĩa là nếu biểu thức điều kiện đúng(có giá trị khác 0) thì thực hiện các lệnh ngay dưới if(lệnh 1, lệnh2) còn nếu sai(giá trị bằng 0) thì thực hiện các lệnh trong else(lệnh 3, 4).

Lưu ý: có thể có lệnh if ở bên trong 1 if khác. Người ta gọi là if lồng:VD: if (a > 1){

if (b > 1){

c = 1;}

}Đoạn code này thực hiện kiểm tra điều kiện a > 1 trước, nếu đúng thực hiện lệnh if bên trong kiểm tra b > 1, nếu đúng nữa thì thực hiện lệnh gán c = 1;

5.2 switch caseswitch(biểu_thưc){

case: gia_tri1danh_sach_cac_lenh;break;

case: gia_tri_2;danh_sach_cac_lenh;break;

..default:

danh_sach_cac_lenh;

Tài liệu hướng dẫn ôn tập môn C Page 7 of 18

Page 8: Huong danontapc

Hanoi Aptech

}

Câu lệnh switch kiểm tra giá trị biểu thức điều kiện, nếu nhận 1 trong các giá trị case nào thì thực hiện danh sách các câu lệnh trong case đó rồi kết thúc luôn. Trong trường hợp không có case nào đúng thì thực hiện các câu lệnh trong default.

Lưu ý: kết thúc các case phải có break default có thể có hoặc không (optional)

5.3 Lệnh lặp forCú pháp:

for(khởi_tạo_biến_chạy; điều_kiện_dừng; thay_đổi_biến_chạy);{

lệnh 1;lệnh 2;...

}

vd: int i;for (i = 1; i < 10; i++){

printf(“%d”, i);}Đoạn code này sẽ print ra màn hình: 123456789Trong ví dụ này đầu tiên máy sẽ khởi tạo biến chạy i = 1; kiểm tra điều kiện dừng i<4, vì lúc này i = 0 nhỏ hơn 4 nên chưa dừng, máy thực hiện lệnh printf trong for và in ra màn hình 1. Tiếp đó, thực hiện thay đổi biến chạy i++ -> i được tăng thêm 1 và bằng 2. Lại kiểm tra điều kiện, i vẫn nhỏ hơn 10 nên in ra 2. Cứ thế cho đến khi i = 10 thì biểu thức điều kiện là sai và vòng lặp for dừng lại.

Lưu ý: 3 phần trong for phân tách bởi dấu chấm phẩy ; Có phần có thể không có: VD: for(; i < 10; i++) Điều kiện dừng không đúng sẽ làm cho vòng for kéo dài vô tận không dừng lại.

VD: for(i = 1; i > 0; i++){

printf(“%d”,i);}

Tài liệu hướng dẫn ôn tập môn C Page 8 of 18

Page 9: Huong danontapc

Hanoi Aptech

5.4 Lệnh lặp while

Cú pháp:while (biểu_thức_điều_kiện){

Danh sách các câu lệnh;}Lệnh while sẽ kiểm tra biểu thức điều kiện trước, nếu đúng thì thực hiện các lệnh bên trong khối while cho đến khi nào biểu thức điều kiện sai thì dừng.

VD: int i = 1;while (i < 10){

printf(“%d”, i);i++;

}

5.5 Lệnh lặp do while:

Cú pháp:

do{

danh_sách_các_lênh;}while (biểu_thức_điều_kiện);Lệnh do while cũng giống như lệnh while nhưng thực hiện lệnh trước rồi mới kiểm tra biểu thức điều kiện.VD:int i = 1;do{

printf(“%d”, i);i ++;

}while (i < 10);

Tài liệu hướng dẫn ôn tập môn C Page 9 of 18

Page 10: Huong danontapc

Hanoi Aptech

Lệnh break

Nếu sử dụng trong vòng lặp thì khi gặp lệnh break; sẽ kết thúc vòng lặp đó ngay còn trong switch để chấm dứt việc kiểm tra biểu thức điều kiện nếu đã nhận 1 giá trị của 1 case nào đó.VD:for (int i = 1; i < 10; i++){

printf(“%d”, i);if (i >= 5) break;

}Đoạn code này sẽ chỉ in ra 12345 chứ không phải là 123456789 vì khi tăng i đến 5 thì gặp lệnh break kết thúc vòng for.

Lệnh continue:Sử dụng trong vòng lặp. Khi gặp câu lệnh continue, máy sẽ không thực hiện tiếp các câu lệnh phía bên dưới của continue mà sẽ thực hiện 1 lần lặp mới.VD:for (int i = 1; i < 10; i++){

if (i == 5) continue;printf(“%d”, i);

}Đoạn code này sẽ in ra 12346789 mà không có số 5. Nguyên nhân là khi i == 5 thì gặp lệnh continue và máy không thực hiện lệnh printf phía sau nữa.

Tài liệu hướng dẫn ôn tập môn C Page 10 of 18

Page 11: Huong danontapc

Hanoi Aptech

6 Mảng

Mảng là một tập hợp các phần tử có cùng kiểu dữ liệu được lưu trữ liên tiếp trong bộ nhớ mà người ta có thể truy nhập trực tiếp thông qua thứ tự(chỉ số) của phần tử.

VD: Mảng các số nguyên, mảng các số thực, mảng các ký tự

6.1 Khai báo mảngKiểu_dữ_liệu Tên_mảng[Kích_thước_mảng];

VD: int A[10] sẽ khai báo một mảng A gồm 10 phần tử trong bộ nhớ.

1 2 3 4 5 6 7 8 9 10

6.2 Thao tác với mảng

6.2.1 Truy nhập phần tử trong mảng:Tên_mảng[chỉ_số_phần_tử_truy_nhập]

VD:3 4 2 10 5 1 1 8 2 31 2 3 4 5 6 7 8 9 10

Nếu muốn lấy phần tử thứ 4 trong mảng thì dùng A[3], nguyên nhân là mảng trong C đánh số từ 0. Giá trị nhận được sẽ là 10

Các phép toán áp dụng cho 1 phần tử của mảng cũng giống hệt khi áp dụng cho 1 biến đơn.VD: lấy địa chỉ cho 1 phần tử mảng: &A[i]Đọc từ bàn phím cho 1 phần tử mảng: scanf(“%d”, &A[i]);

6.2.2 Duyệt mảng:

Sử dụng vòng lặp:VD: for (int i = 0; i < n; i++)

{Xử lý với A[i];

}

Tài liệu hướng dẫn ôn tập môn C Page 11 of 18

Page 12: Huong danontapc

Hanoi Aptech

6.2.3 Sắp xếp mảngVD: cho mảng 1 chiều A có 5 phần tử: 5,3,9,1,6Sắp xếp các phần tử của mảng theo thứ tự tăng dần. Nghĩa là A[0] = 1; A[1] = 3; A[2] = 5; A[4] = 6; A[5] = 9;

Dùng 2 vòng for:int temp;int n = 5;for(int i = 0; i < n - 1; i++) for (int j = i + 1; j < n; j++)

if (A[j] < A[i])//Swap{

temp = A[i];A[i] = A[j];A[j] = temp;

}

6.3 Mảng ký tựKhai báo:char Tên_mảng[Kích_thước];

VD: char s[10];khai báo 1 mảng có 10 ký tựXâu là 1 mảng ký tự với ký tự cuối là NULL(\0)

6.4 Mảng 2 chiềuLà mảng của các mảng 1 chiều. Mỗi phần tử của mảng 2 chiều là một mảng một chiều.VD:char A[10][30];Mỗi phần tử của mảng A là một chuỗi có kích thước là 30.

6.4.1 Truy nhập phần tử mảng 2 chiều

Tên_mảng[chỉ_số_hàng][chỉ_số_cột].VD: có 1 mảng 2 chiều: kích thước 3x4(3 hàng 4 cột): 3 mảng 1 chiều, mỗi mảng có 4 phần tử.

0 5 8 41 3 7 29 6 10 5

Muốn lấy giá trị phần tử ở hàng 2 cột thứ 3:

Tài liệu hướng dẫn ôn tập môn C Page 12 of 18

Page 13: Huong danontapc

Hanoi Aptech

printf(“d”, A[1][2] ) --> 7.(Chỉ số mảng bắt đầu từ 0)

6.4.2 Thao tác mảng 2 chiềuVD: Đọc từ bàn phím và lưu vào 1 mảng 2 chiều kích thước 2x3.#include <stdio.h>void main(){

int A[2][3];int i, j;for (i = 0; i < 2; i++)

for (j = 0; j < 3; j++){

printf(“\nEnter A[%d][%d] = ”);scanf(“%d”, &A[i,j]);

}

Tài liệu hướng dẫn ôn tập môn C Page 13 of 18

Page 14: Huong danontapc

Hanoi Aptech

7 HàmHàm được dùng để chia một bài toán lớn thành những công việc nhỏ hơn, có đầu vào và đầu ra xác định.

7.1 Cấu trúc hàmKiểu_kết_quả_trả_về Tên_hàm (danh_sách_tham_số){

các_lệnh_trong_thân_hàm;return kết_quả;

}

VD:int Sum(int a, int b){

int c = a + b;return c;

}

Ở đây, a và b được gọi là các tham số hình thức vì sau đó nó sẽ được thay bằng giá trị cụ thể khi gọi hàm.

7.2 Mẫu hàmMột hàm muốn sử dụng được (gọi được) thì trước đó phải được khai báo nguyên mẫu. Cú pháp khai báo nguyên mẫu:

Kiểu_kết_quả_trả_về Tên_hàm (danh_sách_tham_số);

7.3 Gọi hàm

7.3.1 Gọi hàm kiểu tham trị (chỉ truyền giá trị)Có nghĩa là khi truyền tham số cho hàm thì chỉ sử dụng giá trị của các tham số mà không thay đổi chúng.VD:int a = 3, b = 5;printf(“%d”, Sum(a,b)); Kết quả in ra màn hình là 8.Các giá trị a, b không hề bị thay đổi cho dù trong hàm Sum chúng ta có sử dụng lệnh gán để thay đổi a, b đi chăng nữa.

7.3.2 Gọi hàm kiểu tham biến(truyền địa chỉ của biến)Kiểu gọi hàm này sẽ làm thay đổi giá trị của tham số khi truyền vào cho lời gọi hàm.VD:

Tài liệu hướng dẫn ôn tập môn C Page 14 of 18

Page 15: Huong danontapc

Hanoi Aptech

void input(int *x){

printf(“\nInput:”);scanf(“%d”, x);

}void main(){

int x = 0;input(&x);

}

Sau lời gọi hàm input(&x) thì giá trị của x sẽ được thay thế bằng 1 giá trị nhập vào từ bàn phím, x không giữ nguyên giá trị 0 như kiểu gọi hàm bằng tham trị.

7.3.3 Truyền biến mảng cho lới gọi hàm

Trong C, khi truyền 1 mảng vào tham số của hàm, chỉ có địa chỉ của mảng được truyền.VD: void main(){

int ary[10];fn_ary(ary);

}void fn_ary(int ary[]){..}

với mảng 2 chiều:

void main(){

int ary[10][20];fn_ary(ary);

}void fn_ary(int ary[][20]){..}

Tài liệu hướng dẫn ôn tập môn C Page 15 of 18

Page 16: Huong danontapc

Hanoi Aptech

8 Con trỏCon trỏ là 1 biến đặc biệt, giá trị của biến con trỏ là địa chỉ của 1 ô nhớ.VD:

8.1 Khai báo

Kiểu_con_trỏ *Tên_con_trỏ;VD:int *p;int x;p = &x;

Đoạn code trên khai báo 1 con trỏ nguyên p, và p trỏ vào ô nhớ x.

8.2 Thao tác với con trỏ

8.2.1 Lấy giá trị mà con trỏ trỏ tớiCú pháp: *Tên_con_trỏVD: *p trong ví dụ trên sẽ trả về giá trị x;

8.2.2 Tăng giảm đối với biến con trỏ nguyênint *p;p++ hoặc ++p: tăng p thêm 2 đơn vị (vì kích thước 1 số nguyên là 2 byte)p-- hoặc -- p : giảm p 2 đơn vị

p+i , p - i: tăng, giảm p 2*i đơn vị.

8.2.3 Con trỏ và mảng 1 chiềuTên mảng chính là 1 con trỏ trỏ tới phần tử đầu tiên của mảng đó.VD: int A[5];

Tài liệu hướng dẫn ôn tập môn C Page 16 of 18

1001

50

con trỏ

giá trị trỏ tới

Page 17: Huong danontapc

Hanoi Aptech

Để lấy giá trị phần tử đầu tiên của mảng có 2 cách: A[0] hoặc *AĐể lấy giá trị phần tử thứ 1 của mảng: A[1] hoặc *(A + 1)Để lấy giá trị phần tử thứ i của mảng : A[i] hoặc *(A + i)

8.2.4 Cấp phát động bộ nhớ(Xem thêm trong giáo trình , trang 217 mục Allocating Memory)

Tài liệu hướng dẫn ôn tập môn C Page 17 of 18

Page 18: Huong danontapc

Hanoi Aptech

9 XâuXâu là mảng kí tự với kí tự kết thúc là NULL(‘\0’).

Nhập xâu từ bàn phím:gets(str)In xâu ra màn hình:puts(str)

Các hàm xử lý xâu:

strcat(str1, str2): nối chuỗi str2 vào chuỗi str1, trả về chuỗi đã nối.strcmp(str1,str2): so sánh 2 xâu theo thứ tự alphabe.

> 0: nếu str1 < str2 =0 : nếu str 1 == str2 <0 : nếu str1 > str2

strchar(str, chr): tìm ký tự chr trong chuỗi str. strstr(str1,str2): tìm chuỗi str2 trong chuỗi str1strcpy(str1,str2): copy chuỗi str2 vào chuỗi str1strlen(str): lấy chiều dài của str

Tài liệu hướng dẫn ôn tập môn C Page 18 of 18