1. 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 19
2. 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 19
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
3. Hanoi Aptech
2 Biến và kiểu dữ liệu
2.1 Khái niệm
Biế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ệu
C 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 int
Kiểu số nguyên, lưu trữ 1 số nguyên trong khoảng -32768 → 32767
2.3.2 Kiểu float
Kiểu số thực, lưu trữ số thực trong khoảng -3.37.1038
→ 3.37.1038
2.3.3 Kiểu Double
Cũ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ức
Phép toán số học
Bao 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 19
4. 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 = 2
Lý 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 0
a < b 1
a >= b 0
a <= b 1
a == b 0
a != 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 ||:
Tài liệu hướng dẫn ôn tập môn C
a b a &&b
0 0 0
0 1 0
1 0 0
1 1 1
a b a ||b
0 0 0
0 1 1
1 0 1
1 1 1
Page 4 of 19
5. Hanoi Aptech
Bảng kết quả phép !:
Tài liệu hướng dẫn ôn tập môn C
a !a
0 1
1 0
Page 5 of 19
6. Hanoi Aptech
4 Vào ra
4.1 Vào – Đọc từ bàn phím
1. Lệnh scanf
Cú 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 x
scanf(“%c %f”, &ch, &y) --> đọc 1 kí tự vào biến ch và 1 số thực lưu vào biến y
Khi 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.
Tài liệu hướng dẫn ôn tập môn C Page 6 of 19
7. Hanoi Aptech
4.2 Ra – In ra màn hình
1. Lệnh printf
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òng
printf(“t”): thêm 1 dấu tab
printf(“”): in ký tự
printf(“””): in ký tự “
2. Lệnh putchar
In 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 puts
In 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 7 of 19
8. Hanoi Aptech
5 Các cấu trúc điều khiển
5.1 If else
Cú 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 case
switch(biểu_thưc)
{
case: gia_tri1
danh_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 8 of 19
9. 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 for
Cú 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: 123456789
Trong 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 9 of 19
10. 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 10 of 19
11. 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 11 of 19
12. 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ảng
Kiể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 1
0
5 1 1 8 2 3
1 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 12 of 19
13. Hanoi Aptech
6.2.3 Sắp xếp mảng
VD: cho mảng 1 chiều A có 5 phần tử: 5,3,9,1,6
Sắ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ều
Là 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 4
1 3 7 2
9 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 13 of 19
14. 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ều
VD: Đọ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 14 of 19
15. Hanoi Aptech
7 Hàm
Hà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àm
Kiể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àm
Mộ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 15 of 19
16. 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 16 of 19
17. 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ới
Cú 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ên
int *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ều
Tê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 17 of 19
1001
50
con trỏ
giá trị trỏ tới
18. 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 18 of 19
19. Hanoi Aptech
9 Xâu
Xâ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 str1
strcpy(str1,str2): copy chuỗi str2 vào chuỗi str1
strlen(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 19 of 19