Tài liệu tham khảo
BÀI GIẢNG
Trần Minh Thái, tập bài giảng KTLT, 2005
Phạm Văn Ất: “ỹ thuật lập trình C: cơ sở và
LẬP TRÌNH C
nâng cao. NXB KHKT – 1996
Nguyễn Đình Tê – Hoàng Đức Hải: Giáo trình lý
thuyết & Bài tập ngôn ngữ C. Nhà Xuất Bản Mũi
Cà Mau.
ThS. Nguyễn Thị Thúy Loan
Huỳnh Tấn Dũng – Hoàng Đức Hải, Bài tập
ngôn ngữ C từ A đến Z, NXB Lao Động – Xã
Hội.
5/3/2013 2 Nguyễn Thị Thúy Loan
Cách đánh giá
Nội dung chương trình
Lý thuyết: 50%
Kiến thức cơ bản
Thực hành: 30%
Tổng quan về lập trình C.
Bài tập: 20%
Biểu thức, toán tử, vào ra dữ liệu.
Cấu trúc điều kiển và lưu đồ thuật toán.
Hàm
Mảng – chuỗi kí tự.
1
5/3/2013 3 5/3/2013 4 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan
NỘI DUNG
Chương I:
Chuyển đổi cơ số
KIẾN THỨC CƠ BẢN
Kỹ thuật để giải quyết bài toán
Các bước để viết chương trình.
Một chương trình đơn giản.
ThS. Nguyễn Thị Thúy Loan
5/3/2013 6 Nguyễn Thị Thúy Loan
Biểu diễn thông tin
Biểu diễn thông tin
Đơn vị đo thông tin: bit- BInary digiT
Biểu diễn số trong các hệ đếm:
Một bit tương ứng với một chỉ thị hoặc một
Hệ đếm là tập hợp các ký hiệu và qui tắc
thông báo nào đó về sự kiện, có 1 trong 2
sử dụng tập ký hiệu đó. Mỗi hệ đếm có
trạng thái là Tắt (Off) / Mở (On) hay Đúng
một số ký số (digits) hữu hạn. Tổng số ký
(True)/Sai (False).
số của mỗi hệ đếm gọi là cơ số (base hay
radix), ký hiệu là b.
2
5/3/2013 7 5/3/2013 8 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan
Biểu diễn thông tin
Biểu diễn thông tin
Hệ đếm cơ số b (b ≥ 2, b là số nguyên
Số N(b) trong hệ đếm cơ số (b) được biểu
dương) mang tính chất sau:
diễn bởi:
o Có b ký số để thể hiện giá trị số. Ký số nhỏ
o N(b)=anan-1an-2…a1a0a-1a-2…a-m
nhất là 0 và lớn nhất là b-1.
o Giá trị vị trí thứ n của một số trong hệ đếm
bằng cơ số b lũy thừa n: bn
5/3/2013 9 5/3/2013 10 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan
Biểu diễn thông tin
Biểu diễn thông tin
Hoặc dưới dạng công thức tổng quát:
o Trong đó, số N(b) có n+1 ký số biểu diễn
n
cho phần nguyên và m ký số lẻ biểu diễn
i
. ba i
cho phần b_phân, và có giá trị là:
b )(
N
mi
o N(b) = an.bn + an-1.bn-1 + an-2.bn-2 + …+
a1.b1+a0.b0 + a-1.b-1+a-2.b-2+…+a-m.b-m
3
5/3/2013 11 5/3/2013 12 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan
Biểu diễn thông tin
Hệ đếm thập phân (b = 10)
Các hệ đếm:
Hệ đếm thập phân b = 10 là một trong các
o Nhị phân
phát minh của người Ả rập cổ, bao gồm
o Bát phân
10 ký số theo ký hiệu sau: 0, 1, 2, 3, 4,
o Thập phân
5, 6, 7, 8, 9
o Thập lục phân
5/3/2013 13 5/3/2013 14 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan
Hệ đếm thập phân (b = 10)
Hệ đếm thập phân (b = 10)
Bất kỳ số nguyên dương trong hệ thập
Ví dụ:
phân có thể biểu diễn như là một tổng các
Số 123 được biểu diễn như sau:
số hạng, mỗi số hạng là tích của một số
123 = 1 * 102 + 2 * 101 + 3*100
với 10 lũy thừa, trong đó số mũ lũy thừa
Số 5246 có thể được biểu diễn như sau:
được tăng thêm 1 đơn vị kể từ số mũ lũy
5246 = 5 * 103 + 2 *102 + 4 * 101 + 6 * 100
thừa phía bên phải nó. Số mũ lũy thừa
= 5 * 1000 + 2 * 100 + 4 * 10 + 6 * 1
của hàng đơn vị trong hệ thập phân là 0.
4
5/3/2013 15 5/3/2013 16 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan
Hệ đếm thập phân (b = 10)
Hệ đếm nhị phân (b = 2)
Phần thập phân trong hệ thập phân sau
Với b = 2, là hệ đếm đơn giản nhất với 2
dấu chấm phân cách thập phân (theo qui
chữ số là 0 và 1. Mỗi chữ số nhị phân gọi
ước của Mỹ) thể hiện trong ký hiệu mở
là BIT.
Cách chuyển đổi hệ nhị phân sang hệ
rộng bởi 10 lũy thừa âm, tính từ phải sang
thập phân:
trái kể từ dấu chấm phân cách.
Ví dụ: 254.68 = 2 * 102 + 5 * 101 + 4 * 100
+ 6 * 10-1 + 8 * 10-2
5/3/2013 17 5/3/2013 18 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan
Hệ đếm nhị phân (b = 2)
Hệ đếm nhị phân (b=2)
11101.11(2)= ? (10)
Ví dụ: 10101(2) = ? (10) Số nhị phân :1
1
1
0
1
1
1
1
0
1.
1
1
Số nhị phân
Số vị trí :
4
3
2
1
0
4
3
2
1
0
-1
-2
Số vị trí
Trị vị trí :
24
23
22
21
20
24
23 22 21 20 2-1 2-2
Trị vị trí
Hệ 10 là :
16
8
4
2
1
16
8
4
2
1 0.5 0.25
Hệ 10 là
10101(2) = 1*24 + 0*23 + 1*22 + 0*21 + 1*20
= 16 + 0 + 4 + 0 + 1 = 21(10)
11101.11(2) = 1*16 + 1*8 + 1*4 + 0*2 + 1*1 + 1*0.5 + 1*0.25 = 29.75 (10)
5
5/3/2013 19 5/3/2013 20 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan
Hệ đếm bát phân (b = 8)
Hệ đếm bát phân (b = 8)
1 tập hợp 3 bit biểu diễn 8 trị : 000, 001,
Tập hợp các chữ số này gọi là hệ bát
010, 011, 100, 101, 110, 111 tương
phân, là hệ đếm với b = 8 = 23. Trong hệ
đương với 8 trị trong hệ thập phân là 0, 1,
bát phân, trị vị trí là lũy thừa của 8.
2, 3, 4, 5, 6, 7.
Ví dụ: 235(8) = 2*82 + 3*81 + 5*80 = 157(10)
5/3/2013 21 5/3/2013 22 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan
Hệ đếm thập lục phân(b=16)
Hệ đếm thập lục phân(b=16)
Ví dụ:
Hệ đếm thập lục phân là hệ cơ số b =16= 24,
tương đương với tập hợp 4 chữ số nhị phân
34F5C(16) = 3*164 + 4*163 + 15*162 + 5*161 + 12*160 = 216294(10)
(4 bit).
Hexa-decimal gồm 16 ký tự : từ 0 đến 9, và 6
chữ in A, B, C, D, E, F với A là 10, B là 11,
C là 12, D là 13, E là 14, F là 15. Với hệ thập
lục phân, trị vị trí là lũy thừa của 16.
6
5/3/2013 23 5/3/2013 24 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan
Bài tập
Bảng qui đổi tương đương 16 chữ số đầu tiên của 4 hệ
Thực hiện các phép chuyển đổi sau:
100011011(2)= ? (10)
277(8) = ?(10)
19B116 (16) = ?(2)
0011011111011111(2) = ?(16)
Hệ 16 0 1 2 3 4 5 6 7 8 9 A B C D E F
Hệ 8 0 1 2 3 4 5 6 7 10 11 12 13 14 15 16 17
Hệ 2 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
Hệ 10 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
5/3/2013 25 5/3/2013 26 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan
Kỹ thuật để giải quyết bài toán
Kỹ thuật để giải quyết bài toán
Một chương trình máy tính được thiết kế
Các bước gồm:
o Xác định yêu cầu của bài toán
để giải quyết một bài toán nào đó. Vì vậy,
o Nghĩ ra 1 thuật toán (algorithm) để tìm
những bước cần để tìm kiếm lời giải cho
lời giải.
một bài toán cũng giống như những bước
o Thực hiện thuật toán đó.
cần để viết một chương trình.
o Kiểm tra kết quả để lời giải đó có theo
yêu cầu của bài không?
7
5/3/2013 27 5/3/2013 28 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan
Kỹ thuật để giải quyết bài toán
Các bước trong chu trình phát triển chương trình
Viết 1 chương trình trên C, các bước đề
nghị:
Soạn thảo 1 văn bản được dùng nhập mã
o Xác định mục đích của chương trình
nguồn (source code)
o Nghĩ ra thuật toán để giải quyết bài toán
Mã nguồn được biên dịch (compile) để
(dùng mã giả, lưu đồ, ….)
tạo nên tập tin đối tượng (object file)
o Cài đặt (viết) thuật toán dùng ngôn ngữ lập
trình C.
o Thực thi chương trình và kiểm thử (testing)
5/3/2013 29 5/3/2013 30 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan
Các bước trong chu trình phát triển chương trình
Các bước trong chu trình phát triển chương trình
Các tập tin đối tượng được liên kết (link)
để tạo nên tập tin có thể thực thi được
(executable file).
Thực hiện (run) chương trình để chỉ ra
chương trình có làm việc giống như kết
quả đã định không?
8
5/3/2013 31 5/3/2013 32 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan
Các bước trong chu trình phát triển chương trình
Các bước trong chu trình phát triển chương trình
Biên dịch mã nguồn (compile)
Nhập mã nguồn (source code)
o Chương trình viết bằng ngôn ngữ cấp cao
o Mã nguồn là tập lệnh dùng để chỉ dẫn máy
C/C++ được biên dịch sang mã máy
tính thực hiện công việc do người lập trình
(machine language) bằng một chương trình
đưa ra.
dịch (trình biên dịch -compiler)
o Tập tin mã nguồn có phần mở rộng .cpp
o Mã đối tuợng (object code) và tập tin chứa
(C++)
chúng gọi là tập tin đối tuợng .obj.
5/3/2013 33 5/3/2013 34 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan
Các bước trong chu trình phát triển chương trình
Các bước trong chu trình phát triển chương trình
o Tập tin đối tượng do trình biên dịch tạo ra
Liên kết các tập tin đối tượng tạo các tập
kết hợp với mã đối tượng để tạo tập tin thực
tin thực thi (executable file).
thi, quá trình này được tạo bởi bộ liên kết
o C có một thư viện chứa mã đối tượng cho
(Linker)
những hàm được tạo sẵn.
Ví dụ: clrscr(), gets(), sqrt(),
9
5/3/2013 35 5/3/2013 36 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan
Các bước trong chu trình phát triển chương trình
Các bước trong chu trình phát triển chương trình
Thực hiện chương trình (run)
o Quá trình 4 bước sẽ được lập lại cho đến
o Chương trình nguồn được biên dịch và liên
khi tập tin thực thi thực hiện đúng yêu cầu
kết sẽ tạo nên tập tin thực thi và thực thi tại
bài toán.
dấu nhắc hệ thống.
o Nếu chương trình có lỗi phải được chỉnh
sửa và biên dịch lại.
5/3/2013 37 5/3/2013 38 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan
Chương trình C đơn giản
Chương II:
#include
#include
void main()
TỔNG QUAN VỀ LẬP TRÌNH C
{ clrscr();
printf (“ Hello! ”);
ThS. Nguyễn Thị Thúy Loan
//cout<<“Hello!”;
getch();
}
10
5/3/2013 39 Nguyễn Thị Thúy Loan
Khái niệm cơ bản về lập trình
NỘI DUNG
Các khái niệm cơ bản.
Lập trình?
Khảo sát một chương trình C đơn giản.
Ngôn ngữ Lập trình
Từ khóa, quy tắc đặt tên trong C
Kiểu dữ liệu, hằng, biến.
Giải thuật
Các thao tác trên Borland C.
5/3/2013 41 5/3/2013 42 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan
Ngôn ngữ lập trình là gì?
Ngôn ngữ lập trình là gì?
Phân loại:
Khái niệm: Ngôn ngữ lập trình là ngôn
o Ngôn ngữ máy: Ngôn ngữ riêng của từng
ngữ dùng để trình bày các thuật toán
máy và là loại ngôn ngữ mà máy tính có
trong máy tính mà máy tính có thể hiểu
thể hiểu được một cách trực tiếp.
được.
11
5/3/2013 43 5/3/2013 44 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan
Ngôn ngữ lập trình là gì?
Ngôn ngữ lập trình là gì?
o Hợp ngữ: Tương tự ngôn ngữ máy, nhưng
o Ngôn ngữ cấp cao: Chương trình thường dễ
hợp ngữ khác với ngôn ngữ máy ở chỗ,
viết hơn so với Ngôn ngữ máy và Hợp ngữ.
thay vì viết chương trình dưới dạng nhị
Mỗi lệnh của ngôn ngữ cấp cao tương
phân, người ta sử dụng một số ký hiệu
đương với một lệnh của thuật toán.
tượng trưng dễ nhớ.
o Ví dụ: C, Pascal, Java, C++, Visual Basic, …
5/3/2013 45 5/3/2013 46 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan
Ví dụ
Các đặc điểm của CT
Đúng đắn, chính xác (correctness).
#include
Chắc chắn (robustness).
#include
Thân thiện (user friendliness).
void main()
Khả năng
thích nghi
(adapability):
{ clrscr();
Chương trình có khả năng phát triển theo
printf(“Hello!”);//cout<<“Hello!”;
yêu cầu.
getch();
}
12
5/3/2013 47 5/3/2013 48 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan
Các đặc điểm của CT
Tập ký tự dùng trong C Ngôn ngữ C được xây dựng trên bộ ký tự sau:
Tính tái sử dụng (reuseability): Chương
Ký tự chữ: 26 chữ cái hoa: A B C .. Z, 26 chữ
trình có thể dùng để làm một phần trong
cái thường: a b c .. z
một chương trình lớn khác.
Ký tự số: 0 1 2 .. 9
Tính hiệu quả (efficiency).
Ký tự gạch chân: _
Tính khả chuyển (porability): Khả năng
Các ký tự đặc biệt:
chuyển đổi giữa các môi trường.
o Các ký hiệu toán học: + - * / = ( )
Tính dừng (halt).
o Các ký tự khác: . , : ; [ ] {} ! \ & % # $ ...
5/3/2013 49 5/3/2013 50 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan
Cấu trúc của một CT C
Khối khai báo
Khảo sát chương trình C đơn giản
Hàm main()
Các hàm con (nếu có)
13
5/3/2013 51 5/3/2013 52 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan
Chương trình C đơn giản
#include
/*Tính tổng hai số*/ // Mô tả mục đích của chương trình
#include
chuẩn của C, chứa các định nghĩa về
nhập và xuất.
#include
int a,b,t;
printf(“nhap a, b”);//cout <<“Nhap a,b”;
scanf(“%d%d”,&a,&b);cin>>a,b;
t = Tong(a,b);
printf(“Tong a +b = %d”, t);//cout<<“Tong a +b”< chuẩn của C, chứa các thư viện chuẩn. }
int Tong(int a, int b)// Hàm con
{ int t =0;
t = a+b;
return t; } 5/3/2013 54 Nguyễn Thị Thúy Loan Hàm main() là thành phần bắt buộc của Chương trình C phải tồn tại một hàm chương trình. main() Hàm main() là nơi chương trình C bắt đầu Nội dung của hàm main() được thực hiện đầu tiên và đặt trong cặp dấu ngoặc { }. thực hiện. Hàm main() không phụ thuộc vào vị trí của hàm. 14 5/3/2013 55 5/3/2013 56 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan Các chú thích được các lập trình viên sử dụng để ghi chú hay mô tả trong các phần của chương trình. Trong C có hai cách để chú thích: Thư viện stdio.h: chứa các định nghĩa
macro và các hàm nhập xuất như printf(),
scanf(), gets(), fflush(), fwrite(), scanf()...
Thư viện conio.h: chứa các hàm màn
hình như getch(), putch(), clrscr(),
gotoxy(), ... o Chú thích trên 1 dòng: dùng cặp dấu //. Thư viện math.h: chứa các hàm tính toán o Chú thích khối (chú thích trên nhiều như: sin, cos, sqrt, … dòng) dùng cặp /* ... */. 5/3/2013 57 5/3/2013 58 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan Từ khoá là những từ được sử dụng để khai báo các kiểu dữ liệu, để viết các toán #include "stdio.h"
void main()
{ tử và các câu lệnh. Không được dùng các từ khóa để đặt tên cho các hằng, biến, mảng, hàm... Các từ int x,y;
x = 1; //Gán hằng số 1 cho biến x
y = 3 + x; //Gán giá trị 3 + x cho y khóa được viết bằng chữ thường. } Bảng dưới đây liệt kê các từ khoá của C: 15 5/3/2013 59 5/3/2013 60 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan Tên là một dãy các ký tự bao gồm chữ cái, case số và gạch nối. Ký tự đầu tiên của tên phải là chữ hoặc gạch nối (không bắt đầu bằng số). Tên không được trùng với từ khoá. break
continue default
else
for
interrupt
short enum
goto
long
signed asm
const
double
float
int
return char
do
extern
if
register
sizeof Tên được dùng để đặt cho tên hằng, tên struct switch static typedef biến, tên mảng, tên hàm, tên con trỏ, tên tệp,... unsigned void union while 5/3/2013 61 5/3/2013 62 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan Các tên đúng: a_1, delta, x1, _step, GAMA Kiểu ký tự: Một giá trị kiểu char chiếm 1 Các tên sai: 3MN Ký tự đầu tiên là số byte (8 bit) và biểu diễn được một ký tự m#2 Sử dụng ký tự # thông qua bảng mã ASCII f(x) Sử dụng các dấu ( ) Ký tự Mã ASCII Ký tự Mã ASCII do Trùng với từ khoá te ta Sử dụng dấu trắng Y-3 Sử dụng dấu gạch ngang - 0
1
2
9 48
49
50
57 A
B
a
b 65
66
97
98 16 5/3/2013 63 5/3/2013 64 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan Kiểu số nguyên: Có hai kiểu dữ liệu ký tự: kiểu char và Kiểu Phạm vi biểu diễn unsigned char. Kích
thước Mã định
dạng int -32768 đến 32767 2 byte %d định Kiểu Phạm vi biểu
diễn Số ký
tự Kích
thước Mã
dạng %u 0 đến 65535 2 byte unsigned
int char -128 đến 127 256 1 byte %c or %d long 4 byte %ld -2147483648 đến
2147483647 0 đến 255 256 1 byte %d unsigned
char 0 đến 4294967295 4 byte %lu unsigned
long 5/3/2013 65 5/3/2013 66 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan Hằng: là các đại lượng mà giá trị của nó Kiểu số thực (dấu chấm động): không thay đổi trong quá trình tính toán. Kiểu Cú pháp: #define Số chữ số
có nghĩa Kích
thước Mã đinh
dạng Float 7 đến 8 4 byte %f Ví dụ: #define MAX 1000 // MAX là tên hằng, Double 15 đến 16 8 byte %lf MAX có giá trị 1000 17 đến 18 %lf long
double Phạm vi biểu
diễn
3.4E-38 đến
3.4E+38
1.7E-308 đến
1.7E+308
3.4E-4932 đến
1.1E4932 10
byte 17 5/3/2013 67 5/3/2013 68 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan Hằng long: là số nguyên có giá trị trong Hằng int: là số nguyên có giá trị trong khoảng khoảng từ -2,1 tỷ đến 2,1 tỷ. từ -32768 đến 32767. Hằng long được viết theo cách: 14L hoặc Ví dụ: 14l (thêm L hoặc l vào đuôi) #define so -50// hằng so có giá trị là -50 Một số nguyên vượt ra ngoài miền xác #define so_ng 262// hằng so_ng có giá trị là 262 định của int cũng được xem là long. #define sothuc 262.0// hằng sothuc có giá trị là 262.0 (float) 5/3/2013 69 5/3/2013 70 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan Hằng ký tự: là một ký tự riêng biệt được Ví dụ: viết trong hai dấu nháy đơn, ví dụ 'a'. Giá trị #define n1 33000L // Định nghĩa hằng long của 'a' chính là mã ASCII của chữ a. Như n1 có giá trị là 33000 vậy giá trị của 'a' là 97. #define n2 33000 // Định nghĩa hằng long Hằng ký tự có thể tham gia vào các phép n2 có giá trị là 33000 toán như mọi số nguyên khác. Ví dụ: '9' - '0' = 57 – 48 = 9 #define kt 'a' // hằng ký tự kt có giá trị là 97 18 5/3/2013 71 5/3/2013 72 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan Biến: là tên tượng trưng trong một vùng Hằng chuỗi ký tự: là một dãy ký tự bất kỳ đặt trong hai dấu nháy kép. nhớ mà dữ liệu có thể lưu trữ trên đó, mỗi Ví dụ: #define s1 "Ha noi" biến cần phải được khai báo trước khi Chuỗi ký tự được lưu trữ trong máy dưới dạng đưa vào sử dụng. một mảng có các phần tử là các ký tự riêng Cú pháp: biệt. Trình biên dịch tự động thêm ký tự null (\0) vào cuối mỗi xâu (ký tự \0 được xem là dấu hiệu kết thúc của một xâu ký tự ). 5/3/2013 73 5/3/2013 74 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan Ví dụ: B1: Phân tích bài toán và vẽ lưu đồ thuật int a = 10, b; // biến a, b chứa các số toán. nguyên B2: Xây dựng thuật toán. long m , n; // biến m, n chứa giá trị long B3: Viết chương trình. B4: Chạy và kiểm tra chương trình. B5: Bảo trì. 19 5/3/2013 75 5/3/2013 76 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan Bộ lệnh phù hợp với phương pháp lập Telephone Laboratories vào năm 1972. trình cấu trúc. Vào năm 1983, học viện chuẩn quốc Kiểu dữ liệu phong phú, cho phép định gia Mỹ (American National Standards nghĩa kiểu dữ liệu mới. Institute - ANSI) thành lập một tiểu ban để Gồm một hoặc nhiều hàm rời nhau. chuẩn hóa C được biết đến như ANSI Linh động về cú pháp. Standard C 5/3/2013 77 5/3/2013 78 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan Mỗi lệnh nằm trên một dòng. Cuối dòng Lệnh lệnh PHẢI có dấu chấm phẩy (;). Lệnh thực hiện một chức năng nào đó Lệnh quá dài có thể được viết thành (khai báo, gán, xuất, nhập, …) và được nhiều dòng sao cho mỗi lệnh phải được kết thúc bằng dấu chấm phẩy (;) quan sát trọn vẹn trong pham vi cửa sổ Khối lệnh lệnh. Khối lệnh gồm nhiều lệnh và được đặt trong cặp dấu ngoặc { } 20 5/3/2013 79 5/3/2013 80 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan Màn hình làm việc Không nên đặt nhiều lệnh trên cùng một dòng, ngay cả các khai báo biến, nếu các biến có khác kiểu cũng nên đặt trên các dòng khác nhau. 5/3/2013 81 5/3/2013 82 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan Các phím chức năng chính: F3: Mở file có sẵn. F2: Lưu file F4: Chạy từng bước tại vị trí con trỏ hiện hành. Chú ý: Chọn đường dẫn và đặt tên file cho đúng. Tên có tối đa 8 ký tự, phần mở F5: Phóng to hoặc thu nhỏ màn hình soạn rộng không cần nhập vào (mặc định là thảo. *.cpp). F6: Chuyển qua lại các cửa sổ soạn thảo. 21 5/3/2013 83 5/3/2013 84 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan F7: Chạy từng bước, từ đầu chương trình F9: Biên dịch chương trình. Mục đích là và vào từng lệnh của hàm con (nếu có gọi kiểm tra lỗi chương trình. hàm). Ctr + F9: Thực thi chương trình (Run) khi chương trình không có lỗi. F8: Chạy từng bước, từ đầu chương trình không vào chi tiết từng lệnh khi gọi đến hàm con (chỉ đưa ra kết quả của hàm con). 5/3/2013 85 5/3/2013 86 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan Alt + F5: Xem lại màn hình kết quả Biên dịch và sửa lỗi: chương trình đã chạy trước đó. Sau khi soạn thảo xong chương trình Ctrl + F1: Xem hàm này được chứa trong nhấn F2 đặt tên chương trình. Để đảm thư viện nào. bảo chương trình có thể thực thi được, ta phải nhấn F9 để biên dịch. Nếu không có lỗi, ta có thể nhấn Ctr + F9 để thực thi chương trình. 22 5/3/2013 87 5/3/2013 88 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan Ví dụ chương trình sau có 3 lỗi thì C sẽ báo như sau: Nếu chương trình chạy hoài không dừng (bị loop) nhấn Ctrl+Break+Enter để trở về màn hình soạn thảo. 5/3/2013 89 5/3/2013 90 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan Khi hiển thị màn hình báo lỗi, ta phải nhấn Viết chương trình cho phép nhập vào 2 phím Enter để xuất hiện cửa sổ mô tả lỗi. số nguyên a,b. Xuất ra tổng, hiệu, tích thương của 2 số. Viết chương trình tính diện tích và chu vi của hình chữ nhật với chiều dài và chiều rộng được nhập từ bàn phím. 23 5/3/2013 91 5/3/2013 92 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan Chương III: Biểu thức Các phép toán Hàm xuất/ nhập ThS. Nguyễn Thị Thúy Loan 5/3/2013 94 Nguyễn Thị Thúy Loan Biểu thức là một sự kết hợp giữa các Trong C, ta có hai khái niệm về biểu thức: o Biểu thức gán. phép toán và các toán hạng để diễn đạt một công thức toán học nào đó. o Biểu thức điều kiện. Biểu thức dùng để diễn đạt một công Biểu thức được phân loại theo kiểu giá trị: thức, một qui trình tính toán, vì vậy nó là nguyên và thực. một thành phần không thể thiếu trong chương trình. 24 5/3/2013 95 5/3/2013 96 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan Biểu thức thường được dùng trong: Các phép toán số học. o Vế phải của câu lệnh gán. Các phép toán quan hệ và logic. Phép toán tăng giảm. o Làm tham số thực sự của hàm. Thứ tự ưu tiên các phép toán. o Làm chỉ số. Chuyển đổi kiểu giá trị. o Trong các toán tử của các cấu trúc điều khiển. 5/3/2013 97 5/3/2013 98 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan Ví dụ: Các phép toán hai ngôi số học là. 11/3 = 3; 11%3 = 2; -(2+6) = -8 Phép toán Ý nghĩa Ví dụ Các phép toán +, - có cùng thứ tự ưu + Phép cộng a+b tiên, nhỏ hơn các phép *, /, % và cả ba - Phép trừ a-b phép này lại có thứ tự ưu tiên nhỏ hơn * Phép nhân a*b phép trừ một ngôi. / Phép chia a/b Các phép toán số học được thực hiện từ % a%b Phép lấy
phần dư trái sang phải. 25 5/3/2013 99 5/3/2013 100 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan Phép toán quan hệ và logic cho ta giá trị Ý nghĩa Ví dụ đúng (khác 0) hoặc giá trị sai (0). Nói So sánh lớn hơn 4 > 5 có giá trị 0 Phép
toán
> cách khác, khi các điều kiện nêu ra là 6 >= 2 có giá trị 1 >= đúng thì ta nhận được giá trị khác 0, trái lại ta nhận giá trị 0. So sánh lớn hơn hoặc
bằng
So sánh nhỏ hơn 6 <= 7 có giá trị 1 < <= 8 <= 5 có giá trị 0 So sánh nhỏ hơn hoặc
bằng
So sánh bằng nhau 6 == 6 có giá trị 1 == So sánh khác nhau 9 != 9 có giá trị 0 != 5/3/2013 101 Nguyễn Thị Thúy Loan Hai phép toán == và != có độ ưu tiên thấp logic: hơn bốn phép toán >, >=, <, <=. Bốn Phép toán một ngôi (phủ định !) phép toán này có độ ưu tiên bằng nhau. Phép hai ngôi: và (AND) && hay hoặc (OR) || Các phép toán quan hệ có số thứ tự ưu a && b a || b tiên thấp hơn so với các phép toán số a
1 b
1 1 1 học, cho nên biểu thức: i < n-1 được hiểu 1 0 0 1 a
1
0 !a
0
1 là i < (n - 1). 0
0 1
0 0
0 1
0 26 5/3/2013 103 5/3/2013 104 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan C đưa ra hai phép toán một ngôi để tăng Các phép toán quan hệ có số ưu tiên nhỏ và giảm giá trị các biến (nguyên và thực). hơn so với phép phủ định (!) nhưng lớn Toán tử tăng là ++ sẽ cộng 1 vào toán hơn so với &&, ||. Vì vậy biểu thức sau: hạng của nó, toán tử giảm -- thì sẽ trừ toán (ad) hạng đi 1. có thể viết lại thành: ad Ta có thể viết phép toán ++ và -- trước hoặc sau toán hạng như sau: ++n, n ++, -- n, n --. 5/3/2013 105 5/3/2013 106 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan Ví dụ: n = 5; Các phép toán có độ ưu tiên khác nhau, điều này có ý nghĩa trong cùng một biểu ++ n; Cho ta n = 6 thức sẽ có một số phép toán này được -- n; Cho ta n = 4 thực hiện trước một số phép toán khác. x = ++ n; Cho ta x = 6 và n = 6 x = n ++; Cho ta x = 5 và n = 6 Thứ tự ưu tiên của các phép toán được trình bày trong bảng sau: 27 5/3/2013 107 5/3/2013 108 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan Các phép toán trên một dòng có cùng thứ tự ưu tiên, các phép toán ở hàng trên có số ưu tiên cao hơn các số ở hàng dưới. Đối với các phép toán cùng mức ưu tiên thì trình tự tính toán có thể từ trái qua phải hay ngược lại được chỉ ra trong cột trình tự kết hợp. Phép toán
() [] ->
! ~ & * - ++ -- (type ) sizeof
* ( phép nhân ) / %
+ -
<<, >> (dịch trái/ phải trên bit)
<, <= , >, >=
== !=
& (and trên bit)
^ (xor trên bit)
| (or trên bit)
&&
||
?: Trình tự KH
Trái qua phải
Phải qua trái
Trái qua phải
Trái qua phải
Trái qua phải
Trái qua phải
Trái qua phải
Trái qua phải
Trái qua phải
Trái qua phải
Trái qua phải
Trái qua phải
Phải qua trái
Phải qua trái
Trái qua phải TT
1
2
3
4
5
6
7
8
9
10
11
12
13
14 = += -= *= /= %= <<= >>= &= ^= |=
15 , 5/3/2013 110 Nguyễn Thị Thúy Loan Ví dụ: Toán tử[ ] dùng để biểu diễn phần tử mảng. Ví dụ: a[i]; *--px = *(--px) (Phải qua trái) Toán tử .dùng để biểu diễn thành phần cấu 8/4*6 = (8/4)*6 (Trái qua phải) trúc. Ví dụ: sv.ten Toán tử -> Dùng để biểu diễn thành phần cấu trúc thông qua con trỏ. Ví dụ: p -> info 28 5/3/2013 111 5/3/2013 112 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan Việc chuyển đổi kiểu giá trị thường diễn * dùng để khai báo con trỏ, và lấy giá trị ra một cách tự động trong hai trường hợp tại địa chỉ mà con trỏ đến. sau: & phép toán lấy địa chỉ. Khi gán biểu thức gồm các toán hạng Ví dụ: &x khác kiểu. Toán tử , thường dùng để viết một dãy Khi gán một giá trị kiểu này cho một biến biểu thức trong toán tử for kiểu khác. Ví dụ: for (i = 0, j = 0; i 5/3/2013 113 5/3/2013 114 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan Khi hai toán hạng trong một phép toán có bất kỳ mà ta muốn bằng phép chuyển kiểu khác nhau thì kiểu thấp hơn sẽ được sau: nâng thành kiểu cao hơn trước khi thực ( hiện phép toán. Ví dụ: (float) (a+b) o Giữa int và long thì int chuyển thành long. o Giữa int và float thì int chuyển thành float. 29 5/3/2013 115 5/3/2013 116 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan Ví dụ: Chú ý: Muốn có giá trị chính xác trong 1.5*(11/3) = 4.5 phép chia hai số nguyên cần dùng phép 1.5*11/3 = 5.5 ép kiểu: ((float)a)/ b (11/3)*1.5 = 4.5 Để đổi giá trị thực r sang nguyên, ta dùng: (int)(r + 0.5) (int)1.4*10 = 1*10 = 10 (int)(1.4*10) = (int)14.0 = 14 5/3/2013 117 5/3/2013 118 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan Để sử dụng các hàm nhập xuất cần khai Là hàm cho phép đọc dữ liệu từ bàn phím báo ở đầu chương trình sử dụng thư viện và gán cho các biến trong chương trình stdio.h khi chương trình thực thi. Trong ngôn ngữ C, đó là hàm scanf nằm trong thư viện #include 30 5/3/2013 119 5/3/2013 120 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan Cú pháp: Ví dụ: scanf(“%d”, &a); //a co kieu nguyen scanf(“%f”, &b); // b co kieu thưc Giải thích: Mã định dạng: dùng để qui Hoặc scanf(“%d%f”, &a, &b); định kiểu dữ liệu, cách biểu diễn, độ rộng, scanf(“%d%f%c”,&bien1,&bien2, &bien3); số chữ số thập phân,... /*bien1 co kieu nguyen, bien2 co kieu thuc, bien3 co kieu char*/ 5/3/2013 121 5/3/2013 122 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan Để nhập vào một chuỗi ký tự (không chứa Để nhập giá trị kiểu char được chính xác, khoảng trắng hay kết thúc bằng khoảng nên dùng hàm fflush(stdin) để loại bỏ trắng), chúng ta phải khai báo kiểu mảng các ký tự còn nằm trong vùng đệm bàn ký tự hay con trỏ ký tự, sử dụng định phím trước hàm scanf(). dạng %s và tên biến thay cho địa chỉ biến. 31 5/3/2013 123 5/3/2013 124 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan Hàm printf (trong thư viện stdio.h) dùng để Để đọc vào một chuỗi ký tự có chứa xuất giá trị của các biểu thức lên màn hình. khoảng trắng (kết thúc bằng phím Enter) Cú pháp: thì phải dùng hàm gets(). Ví dụ: Giải thích: Mã định dạng: dùng để qui định kiểu dữ liệu, cách biểu diễn, độ rộng, số chữ số thập phân,... Chương IV: 5/3/2013 125 5/3/2013 126 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan ThS. Nguyễn Thị Thúy Loan Xuất số nguyên
Xuất số thực có 32 5/3/2013 127 Nguyễn Thị Thúy Loan Lệnh và khối lệnh. Mỗi câu lệnh thực hiện một chức năng nào đó (có thể viết trên nhiều dòng) và Cách trình bày code chương trình. kết thúc bằng dấu chấm phẩy (;). Các ký hiệu lưu đồ. Cấu trúc rẽ nhánh Khối lệnh bao gồm nhiều lệnh, được nằm trong cặp dấu ngoặc nhọn ({}). Cấu trúc lặp Cấu trúc switch…case. 5/3/2013 129 5/3/2013 130 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan Canh theo lề trái. Mỗi lệnh/ khối lệnh con phải nằm lùi sang phải 1 tab (thông thường 1 tab = 4 ký tự). void main()
{ int a;
printf(“Nhap vao a:”);
scanf(“%d”, &a);
if(a>0)
printf(“Ban vua nhap so duong”);
else
if(a<0)
printf(“Ban vua nhap so am”);
else
printf(“Ban nhap so 0”);
getch();
} 33 5/3/2013 131 5/3/2013 132 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan Khái niệm. Lưu đồ thuật toán là công cụ dùng để biểu diễn thuật toán, việc mô tả nhập Phương pháp duyệt (input), xuất (output) dữ liệu và luồng xử Các ký hiệu lý thông qua các ký hiệu hình học. 5/3/2013 133 5/3/2013 134 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan STT ký HIỆU DIỄN GIẢI Duyệt từ trên xuống. Bắt đầu chương trình 1 Duyệt từ trái sang phải. Kết thúc chương trình 2 3 4 5 6 7 Luồng xử lý
Điều khiển lựa chọn
Nhập
Xuất
xử lý, tính toán hoặc gán
trả về giá trị (return) 8 9 Điểm nối liên kết tiếp theo (Sử
dụng khi lưu đồ vượt quá trang) 34 5/3/2013 135 Nguyễn Thị Thúy Loan Ví dụ: Nhập vào 3 số nguyên a, b, c và Tuần tự thực thi tiến trình. Mỗi lệnh được xuất ra màn hình với giá trị của mỗi số thực thi theo một chuỗi từ trên xuống, tăng lên 1. xong lệnh này rồi chuyển xuống lệnh kế tiếp. 5/3/2013 137 5/3/2013 138 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan void main() { int a, b, c; printf(“Nhap vao 2 so a, b,c: ”); scanf(“%d%d%d”, &a, &b, &c); a++; b++; c++; printf(“a=%d, b=%d, c=%d”,a,b,c); } 35 5/3/2013 5/3/2013 139 140 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan Chỉ xét trường hợp đúng. Cú pháp: if (biểu thức điều kiện) { } Nếu biểu thức điều kiện cho kết quả đúng thì thực hiện khối lệnh. 5/3/2013 141 5/3/2013 142 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan Ví dụ: Nhập vào số nguyên n. Kiểm tra nếu n>0 thì tăng giá trị n lên 1. Xuất kết quả. n > 0 36 5/3/2013 143 5/3/2013 144 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan void main() Xét trường hợp đúng và trường hợp sai. { int n; printf(“Nhap vao n: ”); scanf(“%d”, &n); if(n>0) n=n+1; printf(“n=%d”,n); } 5/3/2013 145 5/3/2013 146 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan Ví dụ: Nhập vào số nguyên n. Kiểm tra Cú pháp: nếu n chẵn xuất ra màn hình “n chẵn”, if (biểu thức điều kiện) ngược lại xuất “n lẻ”. { } else { } 37 5/3/2013 147 5/3/2013 148 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan void main() { int n; printf(“Nhap vao n: ”); scanf(“%d”, &n); n %2 = 0 if(n%2==0) printf(“n chan”); else printf(“n le”); } 5/3/2013 5/3/2013 149 150 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan Thực hiện liên tục 1 lệnh hay tập lệnh với Kiểm tra điều kiện trước khi lặp. số lần lặp dựa vào điều kiện. Lặp sẽ kết thúc khi điều kiện được thỏa. for while do … while 38 5/3/2013 151 5/3/2013 152 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan Cú pháp: Cú pháp: for ( nhảy>) while ( { { Bước nhảy; }
Bất kỳ biểu thức nào trong 3 biểu thức nói } trên đều có thể vắng nhưng phải giữ dấu chấm phẩy (;). 5/3/2013 153 5/3/2013 154 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan Ví dụ: Nhập vào số nguyên n. Xuất ra màn hình từ 1 đến n. 39 5/3/2013 155 5/3/2013 156 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan #include #include void main() { int n; printf(“Nhap vao n: ”); scanf(“%d”, &n); for(int i=1; i<=n; i++) printf(“%d\t”, i); } 5/3/2013 5/3/2013 157 158 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan Thực hiện lặp trước khi kiểm tra điều kiện 40 5/3/2013 159 5/3/2013 160 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan Cú pháp: Nhập vào số nguyên dương n. Nếu nhập sai yêu cầu nhập lại. do{ < khối lệnh> ; } while (biểu thức điều kiện); Thực hiện khối lệnh cho đến khi biểu thức có giá trị bằng 0. 5/3/2013 161 5/3/2013 162 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan 41 5/3/2013 163 5/3/2013 164 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan switch (biểu thức)
case n1: Cú pháp: Kết hợp nhiều cấu trúc if tuần tự case n2: case nk: [default: các câu lệnh] 5/3/2013 165 5/3/2013 166 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan Tạo menu cấp 1 cho phép chọn menu #include bằng số nhập từ bàn phím. printf ("Thuc Don");
printf ("\n1. Sup ga!");
printf ("\n2. Com chien!");
printf ("\n3. Lau thai!");
printf ("\n Xin moi ban chon mon an!");
scanf ("%d",&chon);
return chon; 42 5/3/2013 167 5/3/2013 168 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan void main() void Xuly_Menu (int chon)
switch (chon)
case 1: printf ("\nBan chon sup ga!"); clrscr() ; break;
case 2: printf ("\nBan chon com chien!"); int c ; break ;
case 3: c = Menu(); printf ("\nBan chon lau thai!"); Xuly_Menu(c); break;
default: getch(); printf ("\nBan chon khong dung!"); } } 5/3/2013 169 5/3/2013 170 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan Dùng để kết thúc lặp (break) hay để bỏ qua một lần lặp (continue). #include Ví dụ 1: Cho phép người dùng nhập liên tục giá trị n cho đến khi nhập âm thì { printf(“\nNhap n: ”);
scanf(“%d”, &n);
if(n<0) dừng. break; }
getch (); 43 5/3/2013 5/3/2013 171 172 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan số 13 và số 17. #include for(int i=10 ; i<=20; i++)
{ if(i==13||i==17)
continue;
printf(“%d\t”, i); }
getch (); 5/3/2013 5/3/2013 173 174 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan Lưu đồ thuật toán rất hữu ích trong việc mô tả 1. Nhập vào hai số x, y. Xuất ra màn hình cách giải quyết của một bài toán. tổng, hiệu, tích, thương của hai số trên. Khi xây dựng lưu đồ thuật toán, chúng ta cần 2. Nhập vào số nguyên n, kiểm tra xem n chẵn chú ý một vài điểm sau: hay lẻ và xuất ra màn hình. o Một lưu đồ phải có điểm bắt đầu và điểm kết thúc. 3. Nhập vào ba cạnh a, b, c của tam giác. Xuất o Phải có dữ liệu vào, ra sau khi xử lý tính toán. ra màn hình tam giác đó thuộc loại tam giác o Tại mỗi vị trí quyết định lựa chọn rẽ nhánh phải ghi gì? (Thường, cân, vuông, đều hay vuông rõ điều kiện đúng hoặc sai thì đi theo nhánh nào. cân). 44 5/3/2013 175 5/3/2013 176 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan 4. Nhập vào số nguyên n. Nếu n>5 thì tăng n lên 2 đơn vị và trả về giá trị n, ngược lại trả về giá trị 0. 5. Tính n!,với n ≥ 0 Cho biết kết quả của đoạn chương trình sau:
int a=9, b=6;
a++;
a=a+b--;
a=a+(--b);
if(a%2==0) 6. Tính P(n) = 1.3.5…(2n+1), với n ≥ 0 printf("Gia tri cua a la chan”); 7. Tính S(n)= 1+1.2+1.2.3+…+1.2.3…n, với n>0 printf(“Tong cua a va b la: %d”, a+b) ; 8. Tính S(n) =1+1/2+1/3+…+1/n, với n > 0 Chương V: 5/3/2013 177 5/3/2013 178 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan Ý nghĩa Định nghĩa hàm Cách xây dựng hàm, nguyên tắc và cách gọi hàm Hàm đệ qui ThS. Nguyễn Thị Thúy Loan 45 5/3/2013 180 Nguyễn Thị Thúy Loan Trong những chương trình lớn, có thể có những đoạn chương trình viết lặp đi lặp lại thực hiện trọn vẹn một công việc nhất nhiều lần, để tránh rườm rà và mất thời gian định sau đó trả về giá trị cho chương trình khi viết chương trình; người ta thường phân gọi nó, hay nói cách khác hàm là sự chia chia chương trình thành nhiều module, mỗi nhỏ của chương trình. module giải quyết một công việc nào đó. Các module như vậy gọi là các chương trình con. 5/3/2013 181 5/3/2013 182 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan Một hàm được viết theo mẫu sau: Kiểu dữ liệu trả về có thể int, float, long, cấu trúc, … . Tham số: là tham số truyền dữ liệu vào cho hàm, một hàm có thể có hoặc không có tham số. 46 5/3/2013 183 5/3/2013 184 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan Khai báo các tham số có dạng: và có thể trả về một giá trị nào đó. ( Cú pháp: return ; /*không trả về giá trị chỉ để dừng chương trình*/ return biểu thức*/ 5/3/2013 185 5/3/2013 186 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan Quy tắc hoạt động của hàm: Một hàm phải được khai báo trước khi sử Kiểu dữ liệu của hàm. dụng. Tham số. Cú pháp gọi hàm: 47 5/3/2013 187 5/3/2013 188 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan void: Hàm không trả về giá trị. Những void Tên_hàm (danh sách các tham số) hàm loại này thường rơi vào những nhóm { chức năng: Nhập/ xuất dữ liệu, thống kê, Khai báo các biến cục bộ; sắp xếp, liệt kê, tạo mảng. Các câu lệnh/ khối lệnh hay lời gọi đến hàm khác; } 5/3/2013 189 5/3/2013 190 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan Kiểu dữ liệu cơ bản (rời rạc/ liên tục) hay kiểu dữ liệu có cấu trúc: Kiểu dữ liệu tùy { theo mục đích của hàm cần trả về giá trị Khai báo các biến cục bộ; Các câu lệnh / khối lệnh hay lời gọi đến hàm gì thông qua việc phân tích bài toán. khác; Những hàm loại này thường được sử return kq; dụng trong các trường hợp: Đếm, kiểm } tra, tìm kiếm, tính trung bình, tổng, tích, … 48 5/3/2013 191 5/3/2013 192 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan Tham trị: Khi truyền tham số theo kiểu Tham chiếu: Có sự thay đổi giá trị của tham tham trị cho hàm, các giá trị thực (tham số trong quá trình thực hiện và cần lấy lại giá trị đó sau khi ra khỏi hàm. số thực) không bị thay đổi giá trị khi kết Khi gọi hàm ta phải truyền 1 biến cùng kiểu thúc hàm (cho dù bên trong hàm có bất tham số và ta truyền bản thân biến đó cho kỳ lệnh nào làm thay đổi giá trị của tham hàm, nên bất kỳ thay đổi gì trên tham số số) chính là thay đổi trên biến được truyền. 5/3/2013 193 5/3/2013 194 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan Ta xét chương trình sau đây: Tham chiếu: #include Ứng dụng của tham số loại này có thể là #include void Hoanvi1(int a, int b) dữ liệu đầu ra (kết quả) hoặc cũng có thể { int t=a; vừa là dữ liệu đầu vào vừa là dữ liệu đầu a=b; ra. b=t; printf("\Ben trong ham a=%d , b=%d", a, b); } 49 5/3/2013 195 196 5/3/2013 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan void Hoanvi2(int &a, int &b) { int t=a; a=b; b=t; printf("\Ben trong ham a=%d ,b=%d", a, b); void main()
int a, b;
{
clrscr();
printf("\n Nhap vao 2 so nguyen a, b:");
scanf("%d%d",&a,&b);
printf("\nTruoc khi goi ham a=%d,b=%d",a, b);
Hoanvi1(a,b);
printf("\n Sau khi goi ham a=%d ,b=%d",a,b);
Hoanvi2(a,b);
printf("\n Sau khi goi ham a=%d ,b=%d",a,b);
getch(); } } 5/3/2013 197 5/3/2013 198 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan Đặt tên theo quy ước sao cho tên gọi Ví dụ 1: Viết chương trình nhập số đúng với chức năng hay mục đích thực nguyên dương n và in ra màn hình các hiện của hàm và gợi nhớ. ước số của n. Phân tích bài toán: 50 5/3/2013 199 5/3/2013 200 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan Input: n (Để xác định tham số) Xác định tên hàm: Hàm này dùng in ra o Kiểu dữ liệu: số nguyên (int). các ước số của n nên có thể đặt là o giá trị n không bị thay đổi trong quá trình tìm Lietke_uocso ước số → Tham số của hàm không là con trỏ. Ta có nguyên mẫu hàm: Output: In ra các ước số của n (Để xác void Lietke_uocso(int n ); định kiểu dữ liệu hàm) o Không trả về giá trị. o Kiểu dữ liệu của hàm là void. void Lietke_uocso (int n) { for(int i=1; i<=n; i++) if (n%i = =0) printf(“%d\t”, i); } #include } 5/3/2013 201 5/3/2013 202 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan 51 5/3/2013 203 5/3/2013 204 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan Viết chương trình nhập số nguyên dương Input: n (Để xác định tham số) n và tính tổng o Kiểu dữ liệu: số nguyên dương (unsigned int). S = 1+2+3+ …+n, với n>0 o giá trị n không bị thay đổi trong quá trình tính Phân tích bài toán: tổng → Tham số của hàm không là con trỏ. 5/3/2013 205 5/3/2013 206 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan Xác định tên hàm: Hàm này dùng tính Output: Tổng S (Để xác định kiểu dữ liệu tổng S nên có thể đặt là Tong_s. hàm) Ta có nguyên mẫu hàm: o Trả về giá trị của S. o S là tổng các số nguyên dương nên S cũng long Tong_s (int n); là số nguyên dương → Kiểu trả về của hàm là unsigned int (hoặc unsigned long cho trường hợp giá trị của tổng lớn hơn 2 bytes). 52 5/3/2013 207 5/3/2013 208 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan C không những cho phép từ hàm này gọi Xét một ví dụ về tính giai thừa của số tới hàm khác, mà nó còn cho phép từ một nguyên dương n. Ta nhận thấy rằng n! có điểm trong thân của một hàm gọi tới thể tính theo công thức truy hồi sau: chính hàm đó. Hàm như vậy gọi là hàm n!=1 nếu n=0 or n =1 đệ qui. n!=n*(n-1)! nếu n>1 Vì thế hàm tính giai thừa một số nguyên dương có thể viết theo 2 cách như sau: 5/3/2013 209 5/3/2013 210 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan if ( trường hợp suy biến)
{ // viết đệ qui
long Gth(int n)
{ // viết kg đệ qui
long Gt(int n)
{ long s=1; Trình bày cách giải bài toán khi suy biến if (n==0 || n==1) return 1; int i;
for(i=1;i<=n;i++) return(n*Gth(n-1)); }
else /* Trường hợp tổng quát */
{ } s*=i;
return s; } Gọi đệ qui tới hàm (đang viết) với các giá trị
khác của tham số } 53 5/3/2013 5/3/2013 211 212 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan #include "stdio.h" Bài toán dùng đệ qui tìm USCLN của hai int Uscln(int a, int b ); // khai báo prototype số nguyên dương a và b. void main() { int m,n; Trường hợp suy biến: khi a =b thì USCLN printf("\n Nhap cac gia tri cua a va b :"); của a và b chính là giá trị của chúng. scanf("%d%d",&m,&n); Trường hợp chung: printf("\nUSCLN cua a=%d va b=%d la :%d", m, o USCLN(a, b) = USCLN(a-b, b) nếu a > b m, Uscln (m,n)) o USCLN(a, b) = USCLN(a, b-a) nếu a < b } 5/3/2013 213 214 5/3/2013 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan int Uscln (int a,int b) { hay một khối. Phạm vi sử dụng là bên if (a==b) trong hàm hay khối mà nó khai báo. return a; if (a>b) return USCLN(a-b,b); return USCLN(a,b-a); } 54 5/3/2013 215 5/3/2013 216 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan Biến toàn cục: là biến khai báo bên ngoài tất cả các hàm của chương trình trong đó #include có cả hàm main(). Có thể được sử dụng ở bất kì đâu trong chương trình, ngay sau khi nó được khai báo. Phạm vi sử dụng của biến toàn cục là bắt đầu từ vị trí khai y=%d va a=%d",x,y,a);
Demo();
printf("\nSau khi goi ham Demo x=%d, y=%d
va a=%d", x, y, a);
return 0; } báo đến cuối chương trình. 5/3/2013 217 5/3/2013 218 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan void Demo(void) Nhập số nguyên dương n (n>0). Liệt kê tất { int x = 88, y = 99; cả các số nguyên tố nhỏ hơn n. a=a+5; Nhập số nguyên dương n (n>0). Liệt kê n số printf("\nTrong hàm demo x=%d, y= %d chính phương đầu tiên. va a=%d.", x, y, a); Viết chương trình nhập số nguyên dương n } tính tổng các ước số dương của n 55 5/3/2013 219 5/3/2013 220 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan Chương VI: Mảng một chiều Chuỗi ký tự. Mảng hai chiều ThS. Nguyễn Thị Thúy Loan 5/3/2013 222 Nguyễn Thị Thúy Loan Khái niệm: Do đó để truy xuất các biến thành phần, ta dùng cơ chế chỉ mục. Mảng thực chất là một biến được cấp phát bộ nhớ liên tục và bao gồm nhiều Chỉ số 0 1 2 3 4 biến thành phần. Các thành phần của mảng là tập hợp các Phần tử A[0] A[1] A[2] A[3] A[4] biến có cùng kiểu dữ liệu và cùng tên. 56 5/3/2013 223 5/3/2013 224 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan Ví dụ: Để khai báo một mảng, ta có 2 cách khai int a[100];//Khai báo mảng a gồm 100 báo sau: phần tử Cách 1: Con trỏ hằng float b[50];//Khai báo mảng b gồm 50 phần tử tối đa của mảng>]; 5/3/2013 225 5/3/2013 226 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan Cách 2: Con trỏ Ví dụ: Ý nghĩa: Khi ta khai báo một mảng với int *a; // khai báo con trỏ a kiểu dữ liệu bất kỳ (int, float, char,…) thì int b[100]; tên của mảng thực chất là một hằng địa a = b; // a trỏ vào phần tử 0 của mảng b chỉ của phần tử đầu tiên. Với cách viết như trên thì ta có thể hiểu < Kiểu dữ liệu > *< Tên mảng >; các cách viết sau là tương đương a[i] *(a + i) b[i] *(b+i) 57 5/3/2013 227 5/3/2013 228 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan Ví dụ: mảng theo cách như trên thì thực chất con Cách 1: dùng malloc trỏ a chỉ chiếm 2 byte bộ nhớ để chứa địa int *px; //Khai báo con trỏ px chỉ mà thôi. Để tạo mảng chứa dữ liệu thành px = (int *) malloc (100); //Cấp phát 100 ô phần thì ta phải cấp phát vùng nhớ cho con nhớ kiểu int cho px trỏ a. Dùng hàm: malloc, calloc trong thư viện 5/3/2013 229 5/3/2013 230 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan Cách 2: dùng calloc Nhập xuất mảng một chiều. int *p; //khai báo con trỏ p Tính tổng/ tích p = (int *) calloc (100, sizeof (int)); //cấp Kỹ thuật đặt cờ hiệu phát 100 ô nhớ mỗi ô 2 bytes Đếm Sau khi sử dụng xong thì nên giải phóng Tìm kiếm, kỹ thuật đặt lính canh Sắp xếp vùng nhớ bằng hàm free Xóa/ chèn Ví dụ : free (p); // giải phóng vùng nhớ cho Tách/ ghép mảng con trỏ p. 58 5/3/2013 231 5/3/2013 232 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan void Nhap_mang (int a[], int n) void Nhap_mang_dk(int a[], int n) { for (int i = 0; i < n; i ++) { for (int i = 0; i < n; i ++) { do{ printf (“ a [%d] = “, i); printf (“ a [%d] = “, i); scanf (“ %d “, &a[i]); scanf (“ %d “, &a[i]); } }while (a[i] chua thoa dk); } } 5/3/2013 233 5/3/2013 234 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan void Xuat_mang (int a[], int n) long Tong_mang(int a[], int n)// không điều { kiện printf (“\nNoi dung mang: “); { long tong =0; for (int i = 0; i < n; i ++) for(int i=0; i printf (“ %d \t “, a[i]); tong += a[i]; } return tong; } 59 5/3/2013 235 5/3/2013 236 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan Viết hàm tính tổng các số nguyên chẵn long Tong_đk(int a[], int n)// có điều kiện lớn hơn 10. { long tong =0; for(int i=0; i if (a[i] thỏa điều kiện) tong += a[i];// tich *= a[i] return tong; } 5/3/2013 237 5/3/2013 238 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan int Dem_dk (int a[], int n )// có điều kiện int Tim_x(int x, int a[], int n) { int dem = 0; { int i=0; for (int i = 0; i < n ; i++ ) while (i if(a[i] thỏa điều kiện) i++; dem++; if(i< n) return i; return dem; return -1; } } 60 5/3/2013 239 5/3/2013 240 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan int Tim_x (int x, int a[], int n) Kỹ thuật này thường được áp dụng cho { a[n] = x; // đặt lính canh những bài tập về “tìm kiếm”, “liệt kê” theo int i = 0; một điều kiện nhất định nào đó. while ( a[i] != x ) i++; Viết hàm tìm phần tử x có xuất hiện trong if (i mảng một chiều các số nguyên hay return -1; không? Nếu có trả về vị trí của x trong } mảng, ngược lại trả về -1. 5/3/2013 241 5/3/2013 242 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan int Ktra_tontai(int a[], int n) { for (int i = 0; i < n ; i++) { for (int i = 0; i < n ; i++) if (a[i] thoa dieu kien) if (a[i] khong thoa dieu kien) return 1; return 0; return 0; return 1; } } 61 5/3/2013 243 5/3/2013 244 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan Kỹ thuật này thường được áp dụng cho int Ktra_tang (int a[ ], int n)
{ những bài toán “kiểm tra” hay “đánh dấu”. int flag = 1;
for (int i = 0; i < n-1; i ++ ) Ví dụ: Viết hàm kiểm tra xem mảng các số nguyên có thứ tự tăng dần không? if(a[i] > a[i+1]) //Vi phạm ĐK tăng dần
{ (Hàm này trả về 1 nếu mảng tăng dần, flag = 0;
break; } ngược lại trả về 0). return flag; } 5/3/2013 245 5/3/2013 246 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan void Sap_tang (int a[], int n) int Tim_min(int a[], int n) { for (int i = 0; i < n-1 ; i++) { int min = a[0]; for (int j = i+1; j < n; j++) for (int i = 1; i < n; i++) if (a[i] > a [j]) if (a[i] < min) Hoanvi (a[i], a[j]); min = a[i]; } return min; } 62 5/3/2013 247 5/3/2013 248 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan void Sap_giam (int a[], int n) Duyệt mảng từ trái sang phải. Xuất phát { for (int i = 0; i < n-1 ; i++) từ vị trí cần xóa tiến hành dời lần lượt các for (int j = i+1; j < n; j++) phần tử về phía trước cho đến khi kết if (a[i] < a [j]) thúc mảng, sau đó giảm kích thước Hoanvi (a[i], a[j]); mảng. } Vấn đề đặt ra là tìm vị trí cần xóa theo điều kiện bài toán rồi thực hiện xóa. 5/3/2013 249 5/3/2013 250 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan Viết hàm xóa phần tử đầu tiên của mảng. Viết hàm xóa phần tử tại vị trí (vitri) cho void Xoa_dau (int a[], int &n) trước trong mảng. { void Xoa_taivitri (int a[], int &n, int vitri) for (int i = 0; i < n-1 ; i++) { for (int i = vitri; i < n-1 ; i++) a[i] = a[i+1]; a[i] = a[i+1]; n--; n--; } } 63 5/3/2013 251 5/3/2013 252 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan Thêm phần tử có giá trị X vào cuối mảng. Duyệt mảng từ phải sang trái. Xuất phát void ThemCuoi (int a[], int &n, int X) từ cuối mảng tiến hành đẩy lần lượt các { phần tử về phía sau cho đến vị trí cần a[n]=X; chèn, chèn phần tử cần chèn vào vị trí n++; chèn và tăng kích thước mảng. } Trước khi chèn ta phải xác định vị trí cần chèn theo điều kiện bài toán. 5/3/2013 253 5/3/2013 254 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan Chèn phần tử có giá trị X vào mảng tại vị Cho mảng a kích thước n (n chẵn). Tách trí k cho trước mảng a thành 2 mảng b và c sao cho: b void Chenx (int a[], int &n, int X, int k) có ½ phần tử đầu của mảng a, ½ phần tử { for (int i = n; i >k ; i--) còn lại đưa vào mảng c. a[i] = a[i-1] ; a[k] = X; n++; } 64 5/3/2013 255 5/3/2013 256 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan void Tachmg(int a[], int n, int b[], int &m, int c[], int &l) lần lượt là n và m. Viết chương trình nối { int k=n/2; mảng b vào cuối mảng a. m = l = 0; void Noi_mang(int a[], int &n, int b[], int m) for(int i=0; i { for(int i=0; i { b[m++] = a[i]; a[n+i]= b[i]; c[l++] = a[k+i] n = n + m; } } } 5/3/2013 5/3/2013 257 258 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan Khái niệm Chuỗi ký tự là một dãy các phần tử, mỗi phần tử có kiểu ký tự. Khai báo Các thao tác trên chuỗi Lưu ý: Chuỗi ký tự được kết thúc bằng ký tự ‘\0’. Do đó khi khai báo độ dài của Các hàm thư viện (string.h) chuỗi luôn luôn khai báo dư 1 phần tử để chứa ký tự ‘\0’. 65 5/3/2013 259 5/3/2013 260 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan Để khai báo một chuỗi, ta có 2 cách khai Ví dụ: char S[5] = “CNTT” //khai báo chuỗi báo sau: có 5 phần tử kiểu char và gán dãy ký tự Cách 1: Con trỏ hằng CNTT vào chuỗi. C N T T \0 char < Tên chuỗi > [< Số ký tự tối đa của Phần tử Phần tử Phần tử Phần tử Phần tử chuỗi >] ; S[0] S[1] S[2] S[3] S[4] Ví dụ: char S[25]; Chuỗi rỗng là chuỗi chưa có ký tự nào trong mảng ký hiệu “” 5/3/2013 261 5/3/2013 262 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan Cách 2: Con trỏ Nhập chuỗi char *< Tên chuỗi >; Cú pháp: Ví dụ: char *S; char *gets(char *s); Nhận các ký tự nhập từ phím cho đến khi nhấn phím Enter và đưa vào s. 66 5/3/2013 263 5/3/2013 264 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan Cú pháp: Ví dụ: int puts (const char *s); //Xuất chuỗi s ra void main() màn hình. { char chuoi[80]; Ví dụ: printf("Nhap vao chuoi:"); void main() gets(chuoi); { char chuoi[] = "Vi du xuat chuoi\n"; printf("Chuoi vua nhap la: %s\n", chuoi); puts(chuoi); } } 5/3/2013 5/3/2013 265 266 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy Loan TÊN HÀM CHỨC NĂNG int strlen(char s[]); trả về độ dài của chuỗi s. TÊN HÀM
strncat(char s1[],char
s2[],int n) strcpy(char dest[],
char src[]); Sao chép nội dung chuỗi src vào
chuỗi dest. int strcmp(char
s1[],char s2[]) strncpy(char dest[],
char src[], int n); Chép n ký tự từ chuỗi src sang
chuỗi dest. Nếu chiều dài src < n
thì hàm sẽ điền khoảng trắng
cho đủ n ký tự vào dest. Nối chuỗi s2 vài chuỗi s1. strcat(char s1[], char
s2[]); int strncmp(char
s1[],char s2[], int n) CHỨC NĂNG
Nối n ký tự đầu tiên của chuỗi
s2 vào chuỗi s1.
So sánh 2 chuỗi s1 và s2 theo
nguyên tắc thứ tự từ điển. Phân
biệt chữ hoa và thường. trả về:
0 : nếu s1 bằng s2.
>0: nếu s1 lớn hơn s2.
<0: nếu s1 nhỏ hơn s2.
Tương tự như strcmp(), nhưng
chỉ so sánh n ký tự đầu tiên của
hai chuỗi. 67 5/3/2013 267 Nguyễn Thị Thúy Loan TÊN HÀM CHỨC NĂNG TÊN HÀM
int stricmp(char
s1[],char s2[]) CHỨC NĂNG
Tương tự như strcmp(), nhưng
không phân biệt hoa thường. Tìm sự xuất hiện đầu tiên của chuỗi s2 trong chuỗi s1. trả int strnicmp(char
s1[],char s2[], int n); về: char *strstr(char s1[], Tương tự như stricmp(), nhưng
chỉ so sánh n ký tự đầu tiên của
hai chuỗi. char s2[]); NULL: nếu không có. Ngược lại: Địa chỉ bắt đầu char *strchr(char s[],
char c); chuỗi s2 trong s1. Tìm lần xuất hiện đầu tiên của ký
tư c trong chuỗi s. trả về:
NULL: nếu không có.
Địa chỉ c: nếu tìm thấy. 68 5/3/2013 269 5/3/2013 270 Nguyễn Thị Thúy Loan Nguyễn Thị Thúy LoanChương trình C đơn giản
Chương trình C đơn giản
Các thư viện thông dụng
Các chú thích
Ví dụ
Từ khóa
Từ khóa
Quy tắc đặt tên trong C
Kiểu dữ liệu
Ví dụ
Kiểu dữ liệu
Kiểu dữ liệu
Hằng và biến
Kiểu dữ liệu
Hằng và biến
Hằng và biến
Hằng và biến
Hằng và biến
Hằng và biến
Hằng và biến
Cách xây dựng chương trình
Hằng và biến
Đặc điểm ngôn ngữ C
Môi trường hỗ trợ lập trình
C được tạo bởi Dennis Ritchie ở Bell
Các khái niệm
Qui ước viết lệnh trong C
Các thao tác trên Borland C
Qui ước viết lệnh trong C
Các thao tác trên Borland C
Các thao tác trên Borland C
Các thao tác trên Borland C
Các thao tác trên Borland C
Các thao tác trên Borland C
Các thao tác trên Borland C
Các thao tác trên Borland C
Các thao tác trên Borland C
Các thao tác trên Borland C
Bài tập
NỘI DUNG
BIỂU THỨC, TOÁN
TỬ, VÀO, RA DỮ LIỆU
Biểu thức
Biểu thức
Các phép toán
Biểu thức
Các phép toán số học
Các phép toán số học
Các phép toán quan hệ và logic
Các phép toán quan hệ và logic
Các phép toán quan hệ là:
Các phép toán quan hệ và logic
Các phép toán quan hệ và logic
Các phép toán logic: có ba phép toán
Phép toán tăng giảm
Các phép toán quan hệ và logic
Phép toán tăng giảm
Thứ tự ưu tiên các phép toán
Thứ tự ưu tiên các phép toán
Thứ tự ưu tiên các phép toán
Thứ tự ưu tiên các phép toán
Chuyển đổi kiểu giá trị
Thứ tự ưu tiên các phép toán
Chuyển đổi kiểu giá trị
Chuyển đổi kiểu giá trị
Chuyển từ một kiểu giá trị sang một kiểu
Chuyển đổi kiểu giá trị
Chuyển đổi kiểu giá trị
Hàm nhập, xuất
Nhập giá trị cho biến
Nhập giá trị cho biến
Nhập giá trị cho biến
scanf(“mã định dạng”, địa chỉ của các
biến);
Nhập giá trị cho biến
Nhập giá trị cho biến
Xuất giá trị của biểu thức
Nhập giá trị cho biến
printf (“mã định dạng”, Các biểu thức);
int biennguyen;
float bienthuc;
char bienchar;
char chuoi1[20], *chuoi2;
Xuất giá trị của biểu thức
Một số định dạng đối với int, số thực, ký tự.
Ý nghĩa
CẤU TRÚC ĐIỀU KIỂN
& LƯU ĐỒ THUẬT TOÁN
Định dạng
%d
%[.số chữ số
thập phân]f
%o
%x
%c
%s
%e or %E or
%g or %G
theo quy tắc làm tròn số.
Xuất số nguyên hệ bát phân
Xuất số nguyên hệ thập lục phân
Xuất một ký tự
Xuất chuỗi ký tự
Xuất số nguyên dạng khoa học
(nhân 10 mũ x)NỘI DUNG
Lệnh và khối lệnh
Cách trình bày code CT
Cách trình bày code CT
Khái niệm
Các ký hiệu lưu đồ
Các ký hiệu
Phương pháp duyệt
Cấu trúc tuần tự
Cấu trúc tuần tự
Cấu trúc tuần tự
Cấu trúc if
Cấu trúc if
Cấu trúc if
Cấu trúc if
Cấu trúc if…else
Cấu trúc if
Cấu trúc if…else
Cấu trúc if…else
Cấu trúc if…else
Cấu trúc if…else
Cấu trúc lặp
for/ while
for
while
Ví dụ
while
Ví dụ
do … while
Ví dụ
#include
int n, i=1;
printf(“Nhap vao n: ”);
scanf(“%d”, &n);
while(i<=n)
{
printf(“%d\t”, i);
i++;
}
}
do … while
Ví dụ
Ví dụ
#include
int n;
do{
printf(“Nhap vao n: ”);
scanf(“%d”, &n);
}while(n<=0);
}
Cấu trúc switch … case
Cấu trúc switch … case
Ví dụ
Ví dụ
break và continue
Ví dụ
Ví dụ
In ra màn hình giá trị từ 10 đến 20 trừ đi
Kết luận
Bài tập
Bài tập
Bài tập
NỘI DUNG
HÀM
Ý nghĩa
Ý nghĩa
Hàm là một đoạn chương trình độc lập
Định nghĩa hàm
Định nghĩa hàm
tham số hình thức)
{
[return [biểu thức];]
}
Định nghĩa hàm
Định nghĩa hàm
Lệnh return dùng để thoát khỏi một hàm
dữ liệu>
Định nghĩa hàm
Cách xây dựng hàm, nguyên
tắc và cách gọi hàm
[
các tham số thực]);
Kiểu dữ liệu của hàm
Kiểu dữ liệu của hàm
Kiểu dữ liệu của hàm
Kiểu dữ liệu của hàm
Tham số
Tham số
Ví dụ
Tham số
Ví dụ
Ví dụ
Tên hàm
Ví dụ
Ví dụ
Ví dụ
Ví dụ
Ví dụ
Ví dụ
Hàm đệ qui
Ví dụ
Ví dụ
Hàm đệ qui
Hàm ĐQ thường được xây dựng theo cách sau:
Ví dụ
Ví dụ
Ví dụ
Biến toàn cục và biến cục bộ
Biến cục bộ: là biến khai báo trong 1 hàm
Ví dụ
Biến toàn cục và biến cục bộ
Ví dụ
Bài tập
NỘI DUNG
MẢNG VÀ
CHUỖI KÝ TỰ
Khái niệm
Mảng một chiều
Khái niệm
Khái niệm
Khai báo
Khai báo
Khai báo
Khai báo
Chú ý: Khi sử dụng biến con trỏ để truy xuất
Thao tác trên mảng
Khai báo
Nhập mảng một chiều
Nhập mảng một chiều
Tính tổng/ tích
Xuất mảng một chiều
Ví dụ
Tính tổng/ tích
Đếm
Tìm kiếm
Kỹ thuật đặt lính canh
Kỹ thuật đặt lính canh
Kiểm tra
Kiểm tra
int Ktra_voimoi(int a[], int n)
Kỹ thuật đặt cờ hiệu
Kỹ thuật đặt cờ hiệu
Min/ Max
Sắp xếp
Xóa
Sắp xếp
Xóa
Xóa
Chèn
Chèn
Chèn
Tách/ ghép mảng
Tách/ ghép mảng
Tách/ ghép mảng
Cho 2 mảng số nguyên a và b kích thước
Chuỗi ký tự
Khái niệm
Khai báo
Khái niệm
Khai báo
Các thao tác trên chuỗi
Xuất chuỗi
Nhập chuỗi
Các hàm thư viện (string.h)
Các hàm thư viện (string.h)
Các hàm thư viện (string.h)
Các hàm thư viện (string.h)