7.6.3. C|c lệnh v{o ra kh|c (4)
• Ví dụ:
#include
#include
void main()
{
char str[30];
puts(“Hay cho biet ho ten ban:”);
fflush(stdin); gets(str);
printf(“Xin chao ”);
puts(str);
puts(“An phim bat ki de ket thuc.”);
getch();
}
69C|c lệnh nhập xuất kh|c
• Kết quả:
Hay cho biet ho ten ban:
ngon ngu lap trinh C
Xin chao ngon ngu lap trinh C
An phim bat ki de ket thuc .
534 trang |
Chia sẻ: hachi492 | Ngày: 04/01/2022 | Lượt xem: 570 | Lượt tải: 0
Bạn đang xem trước 20 trang tài liệu Bài giảng Tin học đại cương (Bản đầy đủ), để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
ời dùng sử dụng ngôn ngữ thao tác dữ liệu để diễn tả
yêu cầu cập nhật (nhập, sửa, xóa dữ liệu) hay tìm kiếm,
kết xuất thông tin (xuất dữ liệu chứa trong CSDL theo
những điều kiện tìm kiếm cụ thể).
50
Select *
from
nhanvien
3.3.2 Hệ quản trị cơ sở dữ liệu
• Các chức năng cơ bản của hệ quản trị CSDL :
– Cung cấp công cụ kiểm soát, điều khiển việc truy cập
vào CSDL :
Hệ quản trị CSDL đảm bảo :
• Phát hiện và ngăn chặn truy cập trái phép
• Duy trì tính nhất quán của dữ liệu.
• Tổ chức, điều khiển các truy cập cùng lúc.
• Khôi phục CDSL khi gặp sự cố.
• Quản lí các mô tả dữ liệu.
51
3.3.2 Hệ quản trị cơ sở dữ liệu
• Ví dụ: bài toán quản lý sinh viên. Các file
dùng để chứa thông tin liên quan đến sinh
viên:
– Thông tin sinh viên
– Thông tin tài chính
– Danh sách lớp
52
3.3.2 Hệ quản trị cơ sở dữ liệu
53
Thông tin sinh viên
Mã số sinh viên
Tên
Địa chỉ
Chuyên ngành
Học kỳ 1
Trung bình
Số tín chỉ đã đạt
Học kỳ 2
Trung bình
Số tín chỉ đã đạt
Thông tin tài chính
Mã số sinh viên
Tên
Địa chỉ
Chuyên ngành
Học phí
Phí ký túc xá
Học bổng
Danh sách lớp
Mã môn học
Phòng học
GV hướng dẫn
Tổng số sinh viên
Sinh viên 1
MSSV
Họ tên
Ngành
Sinh viên 2
MSSV
Họ tên
Ngành
3.3.2 Hệ quản trị cơ sở dữ liệu
• Tính quan hệ trong CSDL
– Sự ràng buộc giữa các file dữ liệu.
• Tính nhiều mặt
– Cách thức làm việc khác nhau với cùng 1 cở sở dữ liệu
cho từng người dùng khác nhau.
• Xu thế Client/Server
– Cho phép tận dụng được lợi điểm giao
diện đơn giản của các máy PC và sức
mạnh tính toán của các máy tính cỡ lớn
với các CSDL khổng lồ.
54
TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI
VIỆN CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG
TIN HỌC ĐẠI CƯƠNG
Phần 2. Giải quyết bài toán
Bài 4: Giải quyết bài toán
Nội dung
4.1. Bài toán (problem)
4.2. Giải quyết bài toán bằng máy tính
4.3. Biểu diễn thuật toán
2
Nội dung
4.1. Bài toán (problem)
4.2. Giải quyết bài toán bằng máy tính
4.3. Biểu diễn thuật toán
3
4.1. Bài toán (problem)
• “Bài toán” hay “Vấn đề”
– Vấn đề có nghĩa rộng hơn bài toán
– Bài toán là một loại vấn đề mà để giải quyết phải
liên quan ít nhiều đến tính toán: bài toán trong
vật lý, hóa học, xây dựng, kinh tế
• Hai loại vấn đề (Pitago)
– Theorema: là vấn đề cần được khẳng định tính
đúng sai.
– Problema: là vấn đề cần tìm được giải pháp để
đạt được một mục tiêu xác định từ những điều
kiện ban đầu nào đó.
4
4.1. Bài toán (2)
• Biểu diễn vấn đề-bài toán
– A → B
• A: Giả thiết, điều kiện ban đầu
• B: Kết luận, mục tiêu cần đạt
• Giải quyết vấn đề-bài toán
– Từ A dùng một số hữu hạn các bước suy luận có
lý hoặc hành động thích hợp để đạt được B
– Trong Tin học, A là đầu vào, B là đầu ra
5
Nội dung
4.1. Bài toán (problem)
4.2. Giải quyết bài toán bằng máy tính
4.3. Biểu diễn thuật toán
6
4.2. Giải quyết bài toán bằng máy tính
• Máy tính không thể dùng để giải
quyết các vấn đề liên quan đến hành
động vật lý hoặc biểu thị cảm xúc
• Máy tính chỉ làm được những gì mà
nó được bảo phải làm. Máy tính
không thông minh, nó không thể tự
phân tích vấn đề và đưa ra giải
pháp.
• Lập trình viên là người phân tích
vấn đề, tạo ra các chỉ dẫn để giải
quyết vấn đề (chương trình), và máy
tính sẽ thực hiện các chỉ dẫn đó
7
4.2. Giải quyết bài toán bằng máy tính (2)
• Phương án giải quyết bài toán được gọi
là thuật toán/giải thuật trong tính toán
• Một thuật toán là:
– một dãy hữu hạn các thao tác và trình tự thực
hiện các thao tác đó sao cho sau khi thực hiện
dãy thao tác này theo trình tự đã chỉ ra, với đầu
vào (input) ta thu được kết quả đầu ra (output)
mong muốn.
8
4.2. Giải quyết bài toán bằng máy tính (3)
• Không chỉ đơn giản là lập trình
• Phức tạp, gồm nhiều giai đoạn phát triển
• Các giai đoạn quan trọng
9
Bước 1. Xác định yêu cầu bài toán
Bước 2. Phân tích và thiết kế bài toán Lựa chọn phương án
Xây dựng thuật toán
Bước 3. Lập trình
Bước 4. Kiểm thử và hiệu chỉnh
chương trình
Bước 5. Triển khai và bảo trì
Hai giai đoạn chính để hiện thực hóa bài toán
Giai đoạn giải quyết vấn đề Giai đoạn thực hiện
10
Nội dung
4.1. Bài toán (problem)
4.2. Giải quyết bài toán bằng máy tính
4.3. Biểu diễn thuật toán
11
12
4.3. Biểu diễn thuật toán
• Ngôn ngữ tự nhiên
Cách 1:
• Ngôn ngữ lưu đồ (lưu đồ/sơ đồ khối)
Cách 2:
• Mã giả (pseudocode) gọi là ngôn ngữ mô phỏng
chương trình PDL (Programming Description Language).
Cách 3:
• Các ngôn ngữ lập trình như Pascal, C/C++ hay Java.
uy nhiên, không nhất thiết phải sử dụng đúng ký pháp
của các ngôn ngữ đó mà có thể được bỏ một số ràng buộc.
Cách 4:
4.3.1. Ngôn ngữ tự nhiên
• Sử dụng một loại ngôn ngữ tự nhiên để
liệt kê các bước của thuật toán
• Ưu điểm
– Đơn giản
– Không yêu cầu người viết và người đọc phải có
kiến thức nền tảng
• Nhược điểm
– Dài dòng
– Không làm nổi bật cấu trúc của thuật toán
– Khó biểu diễn với những bài toán phức tạp
13
14
Ví dụ 1
• Bài toán: Đưa ra kết luận về tương quan
của hai số a và b (>, < hay =).
– Đầu vào: Hai số a và b
– Đầu ra: Kết luận a>b hay a<b hay a=b.
• Ý tưởng:
– So sánh a và b rồi đưa ra kết luận
15
VD1 - Ngôn ngữ tự nhiên (tuần tự các bước)
• B1: Nhập số a và số b.
• B2: Nếu a> b, hiển thị “a>b” và kết thúc
• B3: Nếu a=b, hiển thị “a=b” và kết thúc
• B4: (a<b) Hiển thị “a<b” và kết thúc.
4.3.2. Sơ đồ khối
Bắt đầu hoặc kết thúc
Thao tác tính toán hoặc phức tạp
Lệnh vào, lệnh ra (read hoặc write)
Kiểm tra điều kiện
Luồng thực hiện
Nối tiếp đoạn lệnh
Một số khối trong sơ đồ khối dùng biểu diễn thuật toán
16
17
Ví dụ 1 - Mô tả bằng lưu đồ thuật toán
Biểu diễn thao
tác kiểm tra điều
kiện
Thể hiện thao tác bắt
đầu hoặc kết thúc Nhập a, b
a>b
a=b
Hiển thị “a>b”
Hiển thị “a=b”
Hiển thị “a<b”
Đ
Đ
S
S
4.3.2. Sơ đồ khối (2)
• Ưu điểm
– Trực quan, dễ hiểu, dễ thiết kế
– Cung cấp toàn cảnh, tổng quan về thuật toán
• Nhược điểm
– Cồng kềnh, đặc biệt với bài toán phức tạp
18
4.3.3. Mã giả (pseudocode)
• Ngôn ngữ tựa (gần giống) với ngôn ngữ
lập trình được gọi là mã giả
– Mệnh đề có cấu trúc
– Ngôn ngữ tự nhiên
• Ưu điểm
– Tiện lợi, đơn giản
– Dễ hiểu, dễ diễn đạt
• Giới thiệu chi tiết trong bài sau
19
20
Ví dụ 2
• Bài toán: Đưa ra tổng, tích, hiệu, thương
của hai số a và b.
– Đầu vào: Hai số a và b
– Đầu ra: Tổng, tích, hiệu và thương của a và b.
• Ý tưởng:
– Tính tổng, tích, hiệu của a và b
– Nếu b khác 0, đưa ra thương
– Nếu b bằng 0, đưa ra thông báo không thực hiện
được phép chia
21
VD2 - Ngôn ngữ tự nhiên (tuần tự các bước)
• B1: Nhập số a và số b.
• B2: s a + b; d a – b; p a * b
• Hiển thị
– Tổng là s
– Hiệu là d
– Tích là p
• B3: Nếu b = 0, hiển thị “Không thực hiện được
phép chia” và kết thúc
• B4: (b0) Hiển thị “Thương là a/b” và kết thúc
22
Ví dụ 2 - Mô tả bằng lưu đồ thuật toán
Nhập a, b
b = 0
Hiển thị
“Không thực hiện được
phép chia”
Hiển thị “Thương là a/b”
s a + b; d a – b;
p a * b;
Hiển thị
“Tổng là s, Hiệu là d,
Tích là p”
Biểu diễn thao tác
tính toán đơn giản
hoặc phức tạp
Đ
S
23
Ví dụ 3
• Bài toán: Giải phương trình bậc I
– Đầu vào: Hai hệ số a, b
– Đầu ra: Nghiệm của phương trình ax + b = 0
• Ý tưởng:
– Lần lượt xét a = 0 rồi xét b = 0 để xét các trường
hợp của phương trình
24
Ví dụ 3 - Mô tả tuần tự các bước
• B1: Nhập a và b.
• B2: Nếu a0 thì hiển thị “Phương trình có 1
nghiệm duy nhất x = -b/a”.
• B3: (a=0) Nếu b 0 thì hiển thị “Phương
trình vô nghiệm” và kết thúc
• B4: (a=0)(b=0) Hiển thị “Phương trình vô số
nghiệm” và kết thúc
Ví dụ 3 - Mô tả bằng lưu đồ thuật toán
25
Nhập a và b
a0
Hiển thị
“Nghiệm là: x = -b/a”
b0
S
S
Đ
Đ Hiển thị
“Phương trình vô nghiệm”
Hiển thị
“Phương trình vô số nghiệm”
26
Ví dụ 4
• Bài toán: Tìm giá trị lớn nhất của một
dãy số nguyên có N số
– Đầu vào: Số số nguyên dương N và N số nguyên
a1, a2,, aN
– Đầu ra: số nguyên lớn nhất của dãy ak, k trong
khoảng [1N]
• Ý tưởng:
– Khởi tạo giá trị Max = a1
– Lần lượt so sánh Max với ai với i=2,3,, N;
nếu ai > Max ta gán giá trị mới cho Max
Ví dụ 4 – Ý tưởng
27
3 5 7 9 2 max
3
5 max<5
max = 3
7
9
9
8
9
9
max<7
max<9
max>2
max>8
Kết quả
28
Ví dụ 4 - Mô tả tuần tự các bước
• B1: Nhập N và dãy số a1, a2,,aN.
• B2: Max a1; i=2.
• B3: Nếu i > N, Hiển thị Max là giá trị lớn nhất
của dãy và kết thúc
• B4: Nếu ai > Max, Max ai
• B5: Tăng i lên 1 đơn vị.
• B6: Quay lên B3.
• B7: Kết thúc.
29
Ví dụ 4 - Mô tả bằng lưu đồ thuật toán
Nhập N và
dãy số a1, a2,,aN
i > N
Hiển thị
“Max là số lớn nhất”
Max a1; i=2
ai > Max
i i + 1
S
S
Đ
Max ai
Đ
30
Bài tập
• Bài toán: Giải phương trình bậc II
– Đầu vào: Ba hệ số a, b, c
– Đầu ra: Nghiệm của phương trình
ax2 + bx + c = 0
• Ý tưởng:
– Lần lượt xét a = 0, b = 0 rồi xét c=0 để xét các
trường hợp của phương trình
31
Các tiêu chí giải thuật cần thỏa mãn
• Tính hữu hạn: giải thuật phải dừng sau một thời
gian hữu hạn.
• Tính đúng đắn: Khi kết thúc, giải thuật phải cung
cấp kết quả đúng đắn.
• Tính hiệu quả:
– Thời gian tính toán nhanh
– Sử dụng ít tài nguyên không gian như bộ nhớ, thiết
bị,
– Mang tính phổ dụng, dễ hiểu, dễ cài đặt và mở rộng cho
các lớp bài toán khác.
TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI
VIỆN CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG
TIN HỌC ĐẠI CƯƠNG
Phần 2. Giải quyết bài toán
Bài 5: Một số thuật toán thông dụng
Nội dung
5.1. Các cấu trúc cơ bản trong lập trình
5.2. Giả mã (pseudocode)
5.3. Thuật toán số học
5.4. Thuật toán về dãy
5.5. Thuật toán đệ quy
2
3
5.1. Các cấu trúc cơ bản trong lập trình
• Cấu trúc tuần tự
• Cấu trúc rẽ nhánh
• Cấu trúc lặp
4
5.1.1. Cấu trúc tuần tự
• Các bước được thực hiện theo 1 trình tự tuyến
tính, hết bước này đến bước khác
Bước 1
Bước 2
Bước n
5
5.1.2. Cấu trúc rẽ nhánh
• Việc thực hiện bước nào phụ thuộc vào điều kiện
xác định.
• Ví dụ: Tìm max của 2 số a, b.
– Nếu a > b thì max là a, ngược lại max sẽ là b.
– Diễn giải:
• B1: Nhập 2 số a, b.
• B2: Nếu a > b thì Max = a và đi đến bước kết thúc (B4).
• B3: (a <= b) Max b.
• B4: Kết thúc.
Max a
a>b
Max b
Đ S
6
5.1.3. Cấu trúc lặp
• Một tác động/ nhiệm vụ
có thể được thực hiện lặp
nhiều lần.
• Số lần lặp có thể biết
trước hoặc không biết
trước.Tuy nhiên số lần
lặp phải hữu hạn.
Điều kiện
Thực hiện công việc
trong vòng lặp
Thực hiện công việc
khi thoát khỏi vòng lặp
5.1.3. Cấu trúc lặp (2)
7
Nhập N và
dãy số a1, a2,,aN
i > N
Hiển thị
“Max là số lớn nhất”
Max a1; i=2
ai > Max
i i + 1
S
S
Đ
Max ai
Đ
Ví dụ: Tìm số lớn nhất của
một dãy có n số
Lần lượt phải so sánh số Max
tạm thời (lúc đầu Max được
gán bằng phần tử thứ nhất,
a1) với ai, với i từ 2, 3,, n.
Việc so sánh này được thực
hiện lặp nhiều lần giữa Max
và ai.
Khi kết thúc quá trình lặp, ta
sẽ thu được Max là số lớn
nhất của dãy n số.
Nội dung
5.1. Các cấu trúc cơ bản trong lập trình
5.2. Giả mã (pseudocode)
5.3. Thuật toán số học
5.4. Thuật toán về dãy
5.5. Thuật toán đệ quy
8
5.2. Mã giả (pseudocode)
• Gán: hoặc :=
Ví dụ: i i + 1
a := b + c
• Cấu trúc rẽ nhánh
if(điều kiện) then (hành động)
hoặc
if(điều kiện) then (hành động)
else (hành động)
• Cấu trúc nhảy goto:
– goto nhãn x;
9
5.2. Giả mã (2)
• Cấu trúc lặp:
while điều_kiện do hành_động
hoặc
repeat
hành_động
until điều_kiện
hoặc
for biến:= gtrị_đầu to gtrị_cuối do hành_động
hoặc
for biến:= gtrị_đầu downto gtrị_cuối do hành_động
10
Nội dung
5.1. Các cấu trúc cơ bản trong lập trình
5.2. Giả mã (pseudocode)
5.3. Thuật toán số học
5.4. Thuật toán về dãy
5.5. Thuật toán đệ quy
11
5.3. Thuật toán số học
• Các bài toán về số học
– Xác định một số nguyên có phải là số nguyên
tố/hợp số hay không
– Tìm USCLN, BSCNN của 2 số nguyên
– ..
12
Bài toán số nguyên tố
• Cho một số nguyên dương p. Làm thế nào để biết
được p có phải số nguyên tố hay không?
– Input: p nguyên dương
– Output: kết luận về tính nguyên tố của p
• Ý tưởng?
– p = 1? Không phải số nguyên tố
– p > 1?
• Kiểm tra từ 2 đến p-1 có phải là ước số của p không
• Nếu có thì kết luận p không là số nguyên tố, ngược lại
không có số nào thì kết luận p là số nguyên tố
13
Bài toán số nguyên tố (2)
Nhập p
if p=1 then begin
Xuất: p không nguyên tố;
Dừng thuật toán;
end
flag := TRUE //Cờ trạng thái cho biết có tìm được ước nào của p không
for k:=2 to p-1 do //Tối ưu duyệt đến [căn bậc 2 của p]
if (k là ước số của p) then
begin
flag:=FALSE
break //ngắt vòng lặp FOR
end
if flag=TRUE then
Xuất: p là số nguyên tố
else
Xuất: p không là số nguyên tố
14
Nội dung
5.1. Các cấu trúc cơ bản trong lập trình
5.2. Giả mã (pseudocode)
5.3. Thuật toán số học
5.4. Thuật toán về dãy
5.5. Thuật toán đệ quy
15
5.4. Thuật toán về dãy
• Làm việc với một dãy số
• Các bài toán điển hình
– Tìm số lớn nhất, nhỏ nhất trong dãy
– Kiểm tra dãy có phải là dãy tăng hoặc dãy giảm
– Sắp xếp dãy tăng dần hoặc giảm dần
– Tìm trong dãy có phần tử nào bằng một giá trị
cho trước
– Tính trung bình cộng của dãy
–
16
Ví dụ 1 - Tìm số lớn nhất trong dãy
• Input: dãy số a1, a2, a3, an
• Output: max là giá trị lớn nhất trong dãy số
đã cho
• Thuật toán:
17
max:=a1
for i:=2 to n do
if max < ai then max:= ai
Xuất: max là giá trị lớn nhất trong dãy số
18
Ví dụ 2. Sắp xếp dãy số
• Bài toán: Sắp xếp bằng phương pháp nổi bọt
(Bubble Sort)
– Đầu vào: Dãy a gồm N số nguyên a1, a2,, aN
– Đầu ra: Dãy a được sắp lại theo thứ tự không giảm.
• Ý tưởng:
– Với mỗi cặp số liên tiếp trong dãy, nếu số trước lớn hơn
số sau ta đổi chỗ chúng cho nhau.
– Việc đó được lặp cho đến khi không có sự đổi chỗ nào
cho nhau
19
Ví dụ 2 - Mô tả tuần tự các bước
• B1: Nhập số N và dãy số a1,a2,,aN
• B2: M N.
• B3: Nếu M < 2 thì thuật toán kết thúc và hiển thị
dãy đó.
• B4: M M – 1, i 0.
• B5: Tăng i lên 1 đơn vị.
• B6: Nếu i > M thì quay lại B3.
• B7: Nếu ai > ai+1 thì tráo đổi hai số đó cho nhau
• B8: Quay lên B5.
20
S
Đ
Nhập N và
dãy số a1, a2,,aN
M < 2
Hiển thị
Dãy đã sắp xếp
M N
i > M
S
Đ
ai ai+1
M M – 1, i 0
i i + 1
ai > ai+1
S
Đ
Ví dụ 2 - Mô tả bằng lưu đồ thuật toán
Bài tập
• Bài 1. Xây dựng thuật toán tìm phần tử có giá trị truyệt đối
lớn nhất trong dãy gồm n phần tử.
• Bài 2. Xây dựng thuật toán tìm tổng của các số chẵn và tổng
của các số lẻ trong dãy gồm n phần tử được nhập vào từ
bàn phím.
• Bài 3. Xây dựng thuật toán kiểm tra xem một dãy số gồm n
phần tử được nhập vào từ bàn phím có phải là dãy số tăng
(hoặc giảm) không.
• Bài 4. Xây dựng thuật toán tính trung bình cộng của các số
dương trong dãy gồm n số được nhập vào từ bàn phím.
21
Nội dung
5.1. Các cấu trúc cơ bản trong lập trình
5.2. Giả mã (pseudocode)
5.3. Thuật toán số học
5.4. Thuật toán về dãy
5.5. Thuật toán đệ quy
22
5.5. Thuật toán đệ quy
• Với bài toán có thể được phân tích và đưa
tới việc giải một bài toán cùng loại nhưng
cấp độ thấp hơn
– độ lớn dữ liệu nhập nhỏ hơn
– giá trị cần tính toán nhỏ hơn
Tự thực hiện lại thuật toán
• Ví dụ:
– Giai thừa: n! = (n-1)! * n
– Dãy số Fibonacci: 0, 1, 1, 2, 3, 5, 8...
• F(n) = F(n-1) + F(n-2)
23
5.5. Thuật toán đệ quy (2)
• Để xây dựng thuật toán đệ quy, cần xác định:
– Trường hợp cơ bản: (Các) trường hợp không cần thực
hiện lại thuật toán.
– Phần tổng quát: Có yêu cầu gọi đệ quy
• Cần xác định nguyên lý đưa trường hợp tổng quát về
trường hợp cơ bản
• Đảm bảo tính dừng của giải thuật đệ quy - chắc chắn
từ trường hợp tổng quát sẽ đến được trường hợp cơ
bản
24
Ví dụ
• Tính giai thừa của n:
– Trường hợp cơ bản: 1! = 1
– Trường hợp tổng quát: n! = (n-1)! * n
• Xây dựng dãy Fibonacci
– Trường hợp cơ bản: F(0) = F(1) = 1
– Trường hợp tổng quát: F(n) = F(n-1) + F(n-2)
25
Tính giai thừa - Thuật toán đệ quy
• Input: số tự nhiên n
• Output: GT(n)=n!
• Thuật giải:
Nhập n
GT:=1;
if n>0 then
GT := GT(n-1)*n;
Xuất GT
26
Bài tập
• Xây dựng thuật toán cho bài toán tìm số
Fibonacci F(n)
27
Thuật giải heuristic
• Dùng “mẹo”
• Áp dụng với những bài toán
– Chưa tìm được thuật toán và không biết có tồn
tại thuật toán không
– Có thuật toán nhưng thời gian tính toán quá lâu
hoặc điều kiện của thuật toán khó đáp ứng
28
TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI
VIỆN CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG
TIN HỌC ĐẠI CƯƠNG
Phần 3. Lập trình C
Bài 6: Tổng quan về ngôn ngữ C
Nội dung
6.1. Lịch sử ph|t triển
6.2. C|c phần tử cơ bản của ngôn ngữ C
6.3. Cấu trúc cơ bản của chương trình C
6.4. Biên dịch chương trình C
6.5. Trình biên dịch Turbo C++
2
Nội dung
6.1. Lịch sử ph|t triển
6.2. C|c phần tử cơ bản của ngôn ngữ C
6.3. Cấu trúc cơ bản của chương trình C
6.4. Biên dịch chương trình C
6.5. Trình biên dịch Turbo C++
3
4
6.1. Lịch sử ph|t triển
• Ngôn ngữ C ra đời tại phòng thí nghiệm BELL
của tập đo{n AT&T (Hoa Kỳ)
• Do Brian W. Kernighan và Dennis M. Ritchie
ph|t triển v{o đầu 1970, hoàn thành 1972
• C dựa trên nền c|c ngôn ngữ BCPL (Basic
Combined Programming Language) và ngôn
ngữ B.
• Tên l{ ngôn ngữ C như l{ sự tiếp nối ngôn ngữ
B.
6.1. Lịch sử ph|t triển
• Đặc điểm của ngôn ngữ lập trình C
– Ngôn ngữ lập trình hệ thống
– Tính khả chuyển, linh hoạt cao
– Có thế mạnh trong xử lý dữ liệu số, văn bản, cơ
sở dữ liệu
• C thường được sử dụng để viết các chương
trình hệ thống
– Hệ điều hành Unix có 90% mã C, 10% hợp ngữ
– Các trình điều khiển thiết bị (device driver)
– Xử lý ảnh
5
6
6.1. Lịch sử ph|t triển
• 1978: C được giới thiệu trong phiên bản đầu của
cuốn s|ch "The C programming language"
• Sau đó, C được bổ sung thêm những tính năng và
khả năng mới Đồng thời tồn tại nhiều phiên bản
nhưng không tương thích nhau.
• Năm 1989, Viện tiêu chuẩn quốc gia của Hoa Kỳ
(American National Standards Institute - ANSI) đ~
công bố phiên bản chuẩn hóa của ngôn ngữ C:
ANSI C hay C chuẩn hay C89
6.1. Lịch sử ph|t triển
• Các phiên bản ngôn ngữ C
– ANSI C: C chuẩn (1989)
– Các phiên bản khác thường bổ sung thêm thư
viện của ANSI C
• Hiện nay cũng có nhiều phiên bản của ngôn ngữ C
khác nhau, gắn liền với một bộ chương trình dịch
cụ thể của ngôn ngữ C
– Turbo C++ và Borland C++ của Borland Inc.
– MSC v{ VC của Microsoft Corp.
– GCC của GNU project
7
Nội dung
6.1. Lịch sử ph|t triển
6.2. C|c phần tử cơ bản của ngôn ngữ C
6.3. Cấu trúc cơ bản của chương trình C
6.4. Biên dịch chương trình C
6.5. Trình biên dịch Turbo C++
8
Ví dụ chương trình C đơn giản
#include
#include
void main(){
printf(“Hello World\n”);
getch();
}
9
6.2.1. Tập ký tự
• Tập ký tự là tập các phần tử cơ bản tạo nên
chương trình
– Tổ hợp các ký tự → từ
– Liên kết các từ theo cú pháp → câu lệnh
– Tổ chức các câu lệnh → chương trình
• Ví dụ:
– include, void, main
– printf(“”), getch();
10
#include
#include
void main(){
printf(“Hello World\n”);
getch();
} Cau lenh printf
6.2.1. Tập ký tự
• Tập ký tự trong C
– 26 chữ c|i hoa: A B C ... X Y Z
– 26 chữ c|i thường:a b c x y z.
– 10 chữ số: 0 1 2 3 4 5 6 7 8 9.
– C|c kí hiệu to|n học:+ - * / =
– C|c dấu ngăn c|ch: . ; , : space tab
– C|c dấu ngoặc:( ) [ ] { }
– C|c kí hiệu đặc biệt:_ ? $ & # ^ \ ! ‘ “ ~ .v.v.
11
6.2.2. Từ khóa
• Từ khóa (keyword)
– Có sẵn trong mỗi ngôn ngữ lập trình
– Dành riêng cho các mục đích xác định
• Đặt tên cho kiểu dữ liệu: int, float, double
• Mô tả các lệnh, các cấu trúc lập trình: if,
while, case
• Chú ý:
– C là ngôn ngữ phân biệt chữ hoa, chữ thường
– Tất cả từ khóa trong C đều viết bằng chữ cái
thường
12
int x;
for (x=1; x<20; x++)
if (x/2 = 1) break;
6.2.2. Từ khóa
• Một số từ khóa hay dùng trong Turbo C
13
6.2.3. Định danh
• Định danh (Identifier – hoặc còn gọi l{ Tên)
l{ một d~y c|c kí tự dùng để gọi tên c|c đối
tượng trong chương trình.
• C|c đối tượng trong chương trình
– Biến
– Hằng số
– Hàm
– Kiểu dữ liệu (sẽ l{m quen ở c|c mục sau)
• Định danh có thể được đặt bởi
– Ngôn ngữ lập trình → c|c từ khóa
– Người lập trình
14
6.2.3. Định danh
• Quy tắc đặt tên định danh trong C
– C|c kí tự được sử dụng: chữ c|i, chữ số v{ dấu
gạch dưới “_” (underscore)
– Bắt đầu của định danh phải l{ chữ c|i hoặc dấu
gạch dưới “_”, không được bắt đầu định danh
bằng chữ số.
– Định danh do người lập trình đặt không được
trùng với các từ khóa của C
15
6.2.3. Định danh
• Ví dụ
– Định danh hợp lệ:
i, x, y, a, b, _function, _MY_CONSTANT, PI, gia_tri_1
– Định danh không hợp lệ
• 1_a, 3d, 55x (bắt đầu bằng chữ số)
• so luong, ti le (có dấu c|ch - kí tự không hợp
lệ)
• int, char (trùng với từ khóa của ngôn ngữ C)
16
6.2.3. Định danh
• Một số quy ước (code convention)
– Nên sử dụng dấu gạch dưới để ph}n t|ch c|c định danh
gồm nhiều từ
– Định danh nên có tính gợi nhớ
– Quy ước thường được sử dụng:
• Hằng số dùng chữ c|i hoa
• C|c biến, h{m, cấu trúc dùng chữ c|i thường
• Ví dụ
Định danh Loại đối tượng
HANG_SO_1, _CONSTANT_2 Hằng số
a, b, i, j, count Biến
nhap_du_lieu, tim_kiem, xu_li Hàm
sinh_vien, mat_hang Cấu trúc
17
6.2.4. C|c kiểu dữ liệu
• Định nghĩa:
– Một kiểu dữ liệu l{ một tập hợp c|c gi| trị m{ một
dữ liệu thuộc kiểu dữ liệu đó có thể nhận được.
– Trên một kiểu dữ liệu ta x|c định một số phép
to|n đối với c|c dữ liệu thuộc kiểu dữ liệu đó.
• Ví dụ:
– Kiểu dữ liệu int (số nguyên) trong C
– Một dữ liệu thuộc kiểu dữ liệu int
• L{ một số nguyên
• Nhận gi| trị từ từ - 32,768 (- 215) đến 32,767 (215 - 1)
18
6.2.4. C|c kiểu dữ liệu
• Ví dụ (tiếp)
– Một số phép to|n được định nghĩa trên kiểu dữ liệu int
của C
Tên phép toán Ký hiệu
Đảo dấu -
Cộng +
Trừ -
Nhân *
Chia lấy phần nguyên /
Chia lấy phần dư %
So sánh >, =, <=, ==, !=
19
6.2.5. Hằng số
• Định nghĩa:
–Hằng số (constant) l{ đại lượng có gi| trị
không đổi trong chương trình.
• Biểu diễn hằng số trong ngôn ngữ C:
– Hằng số nguyên
– Hằng số thực
– Hằng ký tự
– Hằng chuỗi ký tự
20
6.2.5. Hằng số
• Biểu diễn hằng số nguyên: trong C, một hằng
số nguyên có thể biểu diễn dưới 3 dạng
–Dạng thập ph}n
–Dạng thập lục ph}n
–Dạng b|t ph}n
Gi| trị thập ph}n Gi| trị thập lục ph}n Gi| trị b|t ph}n
2007 0x7D7 03727
396 0x18C 0614
21
6.2.5. Hằng số
• Biểu diễn hằng số thực: trong C, một hằng số
thực có thể biểu diễn dưới 2 dạng
– Dạng số thực dấu phẩy tĩnh
– Dạng số thực dấu phẩy động
• Ví dụ
Số thực dấu phẩy tĩnh Số thực dấu phẩy động
3.14159 31.4159 E-1
123.456 12.3456 E+1 hoặc 1.23456 E+2
22
6.2.5. Hằng số
• Biểu diễn hằng ký tự: trong C, một hằng ký tự có thể
biểu diễn theo hai cách
– Bằng ký hiệu của ký tự đặt giữa hai dấu nháy đơn
– Bằng số thứ tự của ký tự đó trong bảng mã ASCII (số
nguyên -> tuân thủ quy tắc biểu diễn hằng số nguyên)
• Ví dụ
Ký tự cần biểu diễn Cách 1 Cách 2
Chữ c|i A ‘A’ 65, 0x41, 0101
Số 1 ‘1’ 49, 0x31, 061
Dấu nh|y đơn ‘\’’ 39, 0x27, 047
Ký tự tab ‘\t’ 9, 0x09, 011
23
6.2.5. Hằng số
• Biểu diễn hằng x}u (chuỗi) ký tự:
– Hằng xâu kí tự được biểu diễn bởi dãy các kí tự
thành phần có trong xâu đó và được đặt trong
cặp dấu nháy kép.
• Ví dụ:
– “ngon ngu lap trinh C”
– “Tin hoc dai cuong”
– “Dai hoc Bach Khoa Ha Noi”
24
6.2.6. Biến
• Định nghĩa:
– Biến (variable) l{ đại lượng m{ gi| trị có thể thay
đổi trong chương trình.
• Biến phải thuộc một kiểu dữ liệu n{o đó.
• Biến được sử dụng để lưu trữ dữ liệu, phục
vụ cho xử lý tính to|n trong chương trình.
• Biến phải được đặt tên theo qui tắc đặt tên.
• Chú ý:
– Biến được cấp ph|t vùng nhớ trong bộ nhớ
chính, còn hằng thì không.
25
Ví dụ 1. Minh họa sử dụng biến
#include
#include
#define PI 3.14
void main(){
float r, s;//Hai biến r, s thuộc kiểu số thực
printf("Nhap ban kinh hinh tron:");
scanf("%f",&r);
s = PI * r * r;
printf("Dien tich hinh tron %f\n",s);
getch();
}
26
Ví dụ 2
#include
#include
void main(){
float a, b, x;
printf("Nhap he so a khac 0");scanf("%f",&a);
printf("Nhap he so b, b=");scanf("%f",&b);
x = -b/a;
printf("Nghiem cua phuong trinh %f",x);
getch();
}
27
6.2.7. Hàm
• Mô tả:
– Hàm (function) là một chương trình con có chức
năng nhận dữ liệu đầu vào (các tham số đầu vào),
thực hiện một chức năng nào đó và đưa ra các kết
quả.
• 2 loại hàm:
– Hàm có sẵn trong thư viện
– Hàm do người lập trình định nghĩa (viết ra)
28
Ham Tham so vao Tham so ra
6.2.7. Hàm
• Ví dụ h{m có sẵn trong thư viện:
– Thư viện stdio.h h{m: scanf, printf, .
– Thư viện math.h h{m: pow, sin, cos, sqrt,
Hàm Ý nghĩa Ký hiệu to|n học Ví dụ
pow(x,y) x mũ y xy pow(2,3)=8
sin(x) Sin của x Sin(x) sin(0)=0
cos(x) Cos của x Cos(x) cos(0)=1
29
6.2.8. Biểu thức
• Định nghĩa:
– Biểu thức l{ sự ghép nối c|c to|n tử (operator)
v{ c|c to|n hạng (operand) theo một quy tắc x|c
định.
– C|c to|n hạng có thể l{ biến, hằng
– C|c to|n tử rất đa dạng: cộng, trừ, nh}n, chia..
• Ví dụ: Biểu thức tính biệt thức delta
b*b – 4*a*c
- a, b, c, 4 l{ c|c to|n hạng
- C|c to|n tử (phép to|n): *, -
30
6.2.9. C}u lệnh
• Câu lệnh (statement) diễn tả một hoặc một
nhóm các thao tác trong giải thuật.
• Chương trình được tạo thành từ dãy các câu
lệnh.
• Cuối mỗi câu lệnh bắt buộc có dấu chấm phẩy
‘;’ để đ|nh dấu kết thúc câu lệnh
31
6.2.9. C}u lệnh
• Có 2 loại nhóm câu lệnh
– Nhóm các câu lệnh đơn: những câu lệnh không
chứa câu lệnh khác.
– Ví dụ:
• Lệnh gán: delta = 100;
• Lệnh xuất ra màn hình: printf(« Hello World »);
– Nhóm các câu lệnh phức: những câu lệnh chứa
câu lệnh khác.
– Ví dụ
• Lệnh khối đặt trong cặp ngoặc nhọn { }
32
6.2.10. Chú thích
• Chú thích (comment):
– Lời mô tả, giải thích vắn tắt cho một câu lệnh,
một đoạn chương trình hoặc cả chương trình
– Giúp việc đọc và hiểu chương trình dễ dàng hơn
– Chú thích không phải là câu lệnh -> không ảnh
hưởng tới chương trình
• Cách viết chú thích: trong C có hai cách
– Chú thích một dòng: sử dụng //
– Chú thích nhiều dòng: sử dụng /* và */
33
Nội dung
6.1. Lịch sử ph|t triển
6.2. C|c phần tử cơ bản của ngôn ngữ C
6.3. Cấu trúc cơ bản của chương trình C
6.4. Biên dịch chương trình C
6.5. Trình biên dịch Turbo C++
34
Ví dụ
#include
void main(){
// Khai bao cac bien
int a, b;
int tong, hieu, tich;
// Nhap vao tu ban phim 2 so nguyen
printf(“\n Nhap vao so nguyen thu
nhat: ”);
scanf(“%d”,&a);
printf(“\n Nhap vao so nguyen thu
hai: “);
scanf(“%d”,&b);
35
Ví dụ
// Tinh tong, hieu, tich cua 2 so do
tong = a+b; hieu = a – b;tich = a*b;
// Hien thi cac gia tri ra man hinh
printf(“\n Tong cua 2 so vua nhap
la %d”, tong);
printf(“\n Hieu cua 2 so vua nhap
la %d”, hieu);
printf(“\n Tich cua 2 so vua nhap
la %d”, tich);
// Doi nguoi dung an phim bat ki
getch();
}
36
37
• Gồm 6 phần có thứ tự như sau:
Phần 1: Khai b|o tệp tiêu đề: #include
Phần 2: Định nghĩa kiểu dữ liệu mới: typedef ...
Phần 3: Khai b|o c|c h{m nguyên mẫu
Phần 4: Khai b|o c|c biến to{n cục
Phần 5: H{m main()
Phần 6: Nội dung c|c h{m đ~ khai b|o
6.3. Cấu trúc cơ bản của chương trình C
38
• Phần 1: Khai b|o tệp tiêu đề:
– Thông b|o cho chương trình dịch biết l{ chương
trình có sử dụng những thư viện n{o.
– VD: #include // thao tác vào ra
#include // h{m của DOS
• Phần 2: Định nghĩa c|c kiểu dữ liệu mới
–Định nghĩa c|c kiểu dữ liệu mới (nếu cần)
dùng cho cả chương trình.
6.3. Cấu trúc cơ bản của chương trình C
39
• Phần 3: Khai b|o c|c h{m nguyên mẫu:
– Giúp cho chương trình dịch biết được những
thông tin cơ bản của c|c h{m sử dụng trong
chương trình.
• Phần 4: Khai b|o c|c biến to{n cục
– Ví dụ:
int a, b;
int tong, hieu, tich;
6.3. Cấu trúc cơ bản của chương trình C
40
• Phần 5: Hàm main( )
– Khi thực hiện, chương trình sẽ bắt đầu bằng
việc thực hiện c|c lệnh trong h{m main( ).
– Trong hàm main( ) có thể có lệnh gọi tới c|c
hàm khác.
• Phần 6: Nội dung của c|c h{m đ~ khai b|o
– C{i đặt (viết m~) cho c|c h{m đ~ khai b|o
nguyên mẫu ở phần 3.
6.3. Cấu trúc cơ bản của chương trình C
Nội dung
6.1. Lịch sử ph|t triển
6.2. C|c phần tử cơ bản của ngôn ngữ C
6.3. Cấu trúc cơ bản của chương trình C
6.4. Biên dịch chương trình C
6.5. Trình biên dịch Turbo C++
41
42
• Preprocessor
– Loại bỏ c|c chú thích
– Dịch c|c chị thị tiền xử lý bắt đầu l{ #
• C Compiler
– Biên dịch m~ nguồn th{nh m~ assembly.
• Assembler
– Tạo ra m~ object.
• Trên UNIX file .o
• Trên MS-DOS file.OBJ
• Link Editor
– Nếu tệp nguồn tham chiếu đến c|c h{m
thư viện/h{m được định nghĩa thì Link
editor kết hợp c|c h{m n{y với h{m
main() để tạo ra tệp có thể thực thi được
• Trong MS-DOS là file .exe
6.4. Biên dịch chương trình C
Nội dung
6.1. Lịch sử ph|t triển
6.2. C|c phần tử cơ bản của ngôn ngữ C
6.3. Cấu trúc cơ bản của chương trình C
6.4. Biên dịch chương trình C
6.5. Trình biên dịch Turbo C++
43
6.5.1. Giới thiệu
• Trình biên dịch (compiler): dịch m~ nguồn
(source code) th{nh file thực thi
• C|c trình biên dịch C phổ biến
– Turbo C++ của hãng Borland
– MSC của Microsoft
– GCC của GNU
– Dev C++ của Bloodshed Software
• Turbo C++ có nhiều phiên bản
– Phiên bản lựa chọn: Turbo C++ 3.0
44
6.5.2. C{i đặt v{ sử dụng Turbo C++ 3.0
Cài đặt
• B1: Chuẩn bị bộ c{i của Turbo C++ 3.0 (~4 MB) Copy bộ
c{i n{y v{o m|y của bạn, giả sử v{o thư mục C:\TC_Setup.
• B2: Đến thư mục chứa bộ c{i Turbo C++ 3.0 (như giả sử ở
trên là C:\TC_Setup) v{ kích hoạt file INSTALL.EXE để chạy
chương trình c{i đặt. Chương trình c{i đặt sẽ yêu cầu bạn
chỉ ra ổ đĩa trên đó chứa bộ c{i Turbo C++ 3.0
– Enter the SOURCE drive to use:
– H~y nhập v{o tên ổ đĩa, chẳng hạn C (ta để bộ c{i Turbo
C++ 3.0 ở thư mục C:\TC_Setup).
45
6.5.2. C{i đặt v{ sử dụng Turbo C++ 3.0
• B3: Chương trình yêu cầu bạn nhập v{o đường dẫn tới thư
mục chứa c|c file của Turbo C++ 3.0
– Enter the SOURCE Path:
– Thông thường chương trình sẽ tự tìm cho bạn, v{ bạn
chỉ cần ấn Enter để chuyển sang bước tiếp theo.
• B4: X|c định thư mục c{i đặt. Thư mục n{y sẽ chứa c|c file
của Turbo C++ 3.0 để bạn sử dụng sau n{y.
– Directories [C:\TC]
– Option[IDE CMD LIB CLASS BGI HELP EXMPL]
46
6.5.2. C{i đặt v{ sử dụng Turbo C++ 3.0
• Start Installation
• Thư mục c{i đặt mặc định sẽ l{ \TC nằm trên thư mục gốc
của ổ đĩa chứa bộ c{i. Nếu bạn muốn thay đổi thư mục c{i
đặt thì h~y dùng c|c phím và để di chuyển hộp s|ng đến
phần Directories, gõ Enter v{ nhập v{o đường dẫn mới, sau
đó ấn phím Esc để trở về.
• Dùng các phím và để di chuyển hộp s|ng đến phần
Start Installation v{ ấn Enter. Chương trình sẽ tự động thực
hiện v{ ho{n tất qu| trình c{i đặt cho bạn.
• Lưu ý: Bạn có thể copy to{n bộ thư mục đ~ c{i đặt của
Turbo C++ 3.0 về m|y v{ sử dụng, nhưng bạn phải chỉ cho
Turbo C++ biết đường dẫn tới c|c tệp tiêu đề v{ c|c tệp thư
viện bằng c|ch v{o menu Option, chọn Directories.
47
6.5.2. C{i đặt v{ sử dụng Turbo C++ 3.0
• Giao diện sử dụng của chương trình
48
6.5.2. C{i đặt v{ sử dụng Turbo C++ 3.0
49
Video: Setup TurboC
6.5.2. C{i đặt v{ sử dụng Turbo C++ 3.0
• Khởi động chương trình: tìm đến thư mục
BIN trong thư mục c{i đặt v{ chạy file
TC.EXE
• Tạo cửa sổ soạn thảo mới: chọn menu File
(hoặc ấn Alt-F), sau đó chọn mục New để
mở cửa sổ soạn thảo mới.
– Gõ chương trình nguồn v{o cửa số soạn thảo
– Lưu chương trình với tên file,ví dụ:
HelloWorld.cpp
• Biên dịch chương trình: bấm F9
• Chạy chương trình: Ctrl + F9 50
6.5.2. C{i đặt v{ sử dụng Turbo C++ 3.0
51
Video: Sử dụng TurboC
TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘI
VIỆN CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG
TIN HỌC ĐẠI CƯƠNG
Phần 3. Lập trình C
Bài 7. Kiểu dữ liệu và biểu thức trong C
Nội dung
7.1. Các kiểu dữ liệu chuẩn trong C
7.2. Khai báo và khởi tạo biến, hằng
7.3. Biểu thức trong C
7.4. Các phép toán trong C
7.5. Một số toán tử đặc trưng
7.6. Các lệnh vào ra dữ liệu với các biến
2
7.1. C|c kiểu dữ liệu chuẩn trong C
Kiểu dữ liệu Ý nghĩa Kích thước Miền dữ liệu
unsigned char Kí tự 1 byte 0 255
char Kí tự 1 byte -128 127
unsigned int Số nguyên không
dấu
2 byte 065.535
short int Số nguyên
có dấu
2 byte -32.76832.767
int Số nguyên có dấu 2 byte -32.76832.767
3
7.1. C|c kiểu dữ liệu chuẩn trong C
Kiểu dữ liệu Ý nghĩa Kích thước Miền dữ liệu
unsigned long Số nguyên không
dấu
4 byte 0
4,294,967,295
long Số nguyên có dấu 4 byte -2,147,483,648
2,147,483,647
float Số thực dấu phẩy
động,
độ chính x|c đơn
4 byte 3.4E-38
3.4E+38
double Số thực dấu phẩy
động,
độ chính x|c kép
8 byte 1.7E-308
1.7E+308
long double Số thực dấu phẩy
động,
độ chính x|c kép
mở rộng
10 byte 3.4E-4932
1.1E+4932
4
Nội dung
7.1. Các kiểu dữ liệu chuẩn trong C
7.2. Khai báo và khởi tạo biến, hằng
7.3. Biểu thức trong C
7.4. Các phép toán trong C
7.5. Một số toán tử đặc trưng
7.6. Các lệnh vào ra dữ liệu với các biến
5
7.2.1. Khai b|o v{ khởi tạo biến
• Một biến trước khi sử dụng phải được khai b|o
• Cú pháp khai báo:
kieu_du_lieu ten_bien;
Hoặc:
kieu_du_lieu ten_bien1, , ten_bienN;
• Ví dụ: Khai b|o một biến x thuộc kiểu số nguyên 2
byte có dấu (int), biến y, z,t thuộc kiểu thực 4 byte
(float) như sau:
int x;
float y,z,t;
x = 3; y = x + 1;
6
7.2.1. Khai b|o v{ khởi tạo biến (2)
Kết hợp khai b|o v{ khởi tạo
• Cú pháp:
kieu_du_lieu ten_bien = gia_tri_ban_dau;
Hoặc:
kieu_du_lieu bien1=gia_tri1, bienN=gia_triN;
• Ví dụ:
int a = 3;// sau lenh nay bien a se co gia tri bang 3
float x = 5.0, y = 7.6; // sau lenh nay x co gia
// tri 5.0, y co gia tri 7.6
7
7.2.2. Khai b|o hằng
• Cách 1: Dùng từ khóa #define:
– Cú pháp:
#define ten_hang gia_tri
– Ví dụ:
#define MAX_SINH_VIEN 50
#define CNTT “Cong nghe thong tin”
#define DIEM_CHUAN 23.5
8
7.2.2. Khai b|o hằng
• C|ch 2: Dùng từ khóa const :
– Cú pháp:
const kieu_du_lieu ten_hang = gia_tri;
– Ví dụ:
const int MAX_SINH_VIEN = 50;
const char CNTT[20] = “Cong nghe thong tin”;
const float DIEM_CHUAN = 23.5;
9
7.2.2. Khai b|o hằng
• Chú ý:
– Gi| trị của c|c hằng phải được x|c định ngay khi
khai báo.
– Trong chương trình, KHÔNG thể thay đổi được
gi| trị của hằng.
– #define l{ chỉ thị tiền xử lý (preprocessing
directive)
• Dễ đọc, dễ thay đổi
• Dễ chuyển đổi giữa c|c nền tảng phần cứng hơn
• Tốc độ nhanh hơn
10
Nội dung
7.1. Các kiểu dữ liệu chuẩn trong C
7.2. Khai báo và khởi tạo biến, hằng
7.3. Biểu thức trong C
7.4. Các phép toán trong C
7.5. Một số toán tử đặc trưng
7.6. Các lệnh vào ra dữ liệu với các biến
11
7.3.1. C|c loại biểu thức
• a. Biểu thức số học:
– L{ biểu thức m{ gi| trị của nó l{ c|c đại lượng số
học (số nguyên, số thực).
– C|c to|n tử l{ c|c phép to|n số học (cộng, trừ,
nh}n, chia), c|c to|n hạng l{ c|c đại lượng số
học (số, biến, hằng).
– Ví dụ:
• 3 * 3.7
• 8 + 6/3
• a + b – c // Với a, b, c l{ c|c biến thuộc một
kiểu dữ liệu số n{o đó.
12
7.3.1. C|c loại biểu thức
• b. Biểu thức logic:
– L{ biểu thức m{ gi| trị của nó l{ c|c gi| trị logic,
tức l{ một trong hai gi| trị: Đúng (TRUE) hoặc
Sai (FALSE).
• Gi| trị nguyên kh|c 0: Đúng (TRUE),
• Gi| trị 0: Sai (FALSE).
– C|c phép to|n logic gồm có
• AND: VÀ logic, kí hiệu l{ &&
• OR: HOẶC logic, kí hiệu l{ ||
• NOT: PHỦ ĐỊNH, kí hiệu l{ !
13
7.3.1. C|c loại biểu thức
• c. Biểu thức quan hệ:
– L{ những biểu thức trong đó có sử dụng c|c
to|n tử quan hệ so s|nh như lớn hơn, nhỏ hơn,
bằng nhau, kh|c nhau
– Chỉ có thể nhận gi| trị l{ một trong 2 gi| trị
Đúng (TRUE) hoặc Sai (FALSE)
Biểu thức quan hệ l{ một trường hợp riêng
của biểu thức logic.
14
7.3.1. C|c loại biểu thức
• Ví dụ về biểu thức quan hệ:
15
7.3.1. C|c loại biểu thức
• Ví dụ về biểu thức logic:
16
Sử dụng biểu thức
• L{m vế phải của lệnh g|n.
• L{m to|n hạng trong c|c biểu thức kh|c.
• L{m tham số thực trong lời gọi h{m.
• L{m chỉ số trong c|c cấu trúc lặp for,
while, do while.
• L{m biểu thức kiểm tra trong c|c cấu trúc rẽ
nhánh if, switch.
17
Nội dung
7.1. Các kiểu dữ liệu chuẩn trong C
7.2. Khai báo và khởi tạo biến, hằng
7.3. Biểu thức trong C
7.4. Các phép toán trong C
7.5. Một số toán tử đặc trưng
7.6. Các lệnh vào ra dữ liệu với các biến
18
7.4. Các phép toán trong C
• Bao gồm:
– Nhóm c|c phép to|n số học
– Nhóm c|c phép to|n quan hệ
– Nhóm các phép toán logic
– Nhóm các phép toán thao tác trên bit
– Ngo{i ra C còn cung cấp một số phép to|n kh|c
nữa như phép g|n, phép lấy địa chỉ
19
7.4.1. Phép to|n số học
20
7.4.2. Phép toán trên bit (bitwise)
21
1)
1)
7.4.2. Phép toán trên bit
22
7.4.3. Phép to|n quan hệ
23
7.4.4. Phép toán logic
24
7.4.5. Phép toán gán
• Cú pháp
tên_biến = biểu_thức;
• Lấy gi| trị của biểu_thức gán cho tên_biến
• Ví dụ:
int a, b, c;
a = 3;
b = a + 5;
c = a * b;
25
7.4.5. Phép toán gán
• Biểu thức g|n l{ biểu thức nên nó cũng có gi| trị.
• Gi| trị của biểu thức g|n bằng gi| trị của biểu_thức:
Có thể g|n gi| trị của biểu thức g|n cho một biến
kh|c hoặc sử dụng như một biểu thức bình thường
• Ví dụ:
int a, b, c;
a = b = 2007;
c = (a = 20) * (b = 30);
26
7.4.5. Phép toán gán
• Phép to|n g|n thu gọn:
x = x + y; giống như
x += y;
• Dạng lệnh g|n thu gọn n{y còn |p dụng
được với c|c phép to|n kh|c: +, -, *, /, %, >>,
<<, &, |, ^
27
7.4.6. Thứ tự ưu tiên c|c phép to|n
28
Muc Cac toan tu Trat tu ket hop
1 () [] . -> ++ -- (ha
2
3
4
5
6
7
8
9
10
11
12
13
14
Ví dụ
• a < 10 && 2 * b < c
• ( a < 10 ) && ( ( 2 * b ) < c )
29
Nội dung
7.1. Các kiểu dữ liệu chuẩn trong C
7.2. Khai báo và khởi tạo biến, hằng
7.3. Biểu thức trong C
7.4. Các phép toán trong C
7.5. Một số toán tử đặc trưng
7.6. Các lệnh vào ra dữ liệu với các biến
30
7.5.1. C|c phép to|n tăng giảm một đơn vị
• Tăng hoặc giảm một đơn vị cho biến:
– = + 1;
++;
– = - 1;
--;
– Ví dụ:
int a = 5;
float x = 10;
a++; // tương đương với a = a + 1;
x--; // tương đương với x = x – 1;
31
Tiền tố v{ hậu tố
• Tiền tố: Thay đổi gi| trị của biến trước khi sử dụng
• Hậu tố: Tính to|n gi| trị của biểu thức bằng gi| trị
ban đầu của biến, sau đó mới thay đổi gi| trị của
biến
• Ví dụ:
int a, b, c;
a = 3; // a bang 3
b = a++;// Dang hau to
// b bằng 3; a bằng 4
c = ++b;// Dang tien to
// b bằng 4, c bằng 4;
32
7.5.2. Phép to|n lấy địa chỉ biến (&)
• Biến thực chất l{ một vùng nhớ được đặt tên (l{ tên của
biến) trên bộ nhớ của m|y tính.
• Mọi ô nhớ trên bộ nhớ m|y tính đều được đ|nh địa chỉ. Do
đó mọi biến đều có địa chỉ
• & ;
– Ví dụ: int a = 2006;
&a; // co gia tri la 158 hay 9E
33
.
.
.
.
.
.
D6
07
.
.
.
157
158
159
160
1
a
7.5.3. Phép to|n chuyển đổi kiểu bắt buộc
• Chương trình dịch sẽ tự động chuyển đổi kiểu
– char int long int float
double long double
• Ngược lại
– Số nguyên long int 50,000 không phải l{ một số nguyên
kiểu int vì phạm vi biểu diễn của kiểu int l{ từ (-32,768
đến 32,767).
Phải ép kiểu
• Cú pháp:
() ;
34
7.5.3. Phép to|n chuyển đổi kiểu bắt buộc (2)
• Ví dụ:
#include
#include
void main()
{
long int li; int i; float f; clrscr();
li = 0x123456; f = 123.456;
i = (int) li;
printf(“\n li = %ld; i = %d”,li, i);
i = (int) f;
printf(“\n f = %f; i = %d”,f, i);
getch();
}
35
• Kết quả
li = 1193046; i = 13398
f = 123.456000; i = 123
7.5.4. Biểu thức điều kiện
• Cú pháp
– biểu_thức_1 ? biểu_thức_2 : biểu_thức_3
– Gi| trị của biểu thức điều kiện
• Gi| trị của biểu_thức_2 nếu biểu_thức_1 có gi| trị
kh|c 0 (tương ứng với gi| trị logic ĐÚNG),
• Ngược lại: Gi| trị của biểu_thức_3 nếu biểu_thức_1 có
gi| trị bằng 0 (tương ứng với gi| trị logic SAI).
• Ví dụ:
float x, y, z; // khai báo biến
x = 3.8; y = 7.6; //gán giá trị cho các biến x, y
z = (x<y) ? x : y; //z sẽ có giá trị bằng giá trị
// nhỏ nhất trong 2 số x và y
36
Nội dung
7.1. Các kiểu dữ liệu chuẩn trong C
7.2. Khai báo và khởi tạo biến, hằng
7.3. Biểu thức trong C
7.4. Các phép toán trong C
7.5. Một số toán tử đặc trưng
7.6. Các lệnh vào ra dữ liệu
37
7.6. C|c lệnh v{o ra dữ liệu
• C cung cấp 2 h{m v{o ra cơ bản:
– printf()
– scanf()
• Muốn sử dụng 2 h{m printf() và
scanf() ta cần khai b|o tệp tiêu đề
stdio.h:
#include
Hoặc
#include “stdio.h”
38
7.6.1. Hàm printf
a. Mục đích và cú pháp:
• Mục đích:
– Hiển thị ra m{n hình c|c loại dữ liệu cơ bản
như: Số, kí tự v{ x}u kí tự
– Một số hiệu ứng hiển thị đặc biệt như xuống
dòng, sang trang,
39
a. Mục đích v{ cú ph|p (2)
• Cú pháp:
printf(xau_dinh_dang [, danh_sach_tham_so]);
–xau_dinh_dang: Qui định c|ch thức hiển
thị dữ liệu ra m{n hình m|y tính.
–danh_sach_tham_so: Danh s|ch c|c biến sẽ
được hiển thị gi| trị lên m{n hình theo c|ch
thức được qui định trong xau_dinh_dang.
40
a. Mục đích v{ cú ph|p (3)
• Ví dụ: Chương trình sau
#include
#include
void main()
{ int a = 5;
float x = 1.234;
printf(“Hien thi mot so nguyen %d và mot
so thuc %f”,a,x);
getch();
}
• Sẽ cho ra kết quả:
Hien thi mot so nguyen 5 va mot so thuc 1.234000
41
a. Mục đích v{ cú ph|p (4)
• Trong xau_dinh_dang chứa:
– C|c kí tự thông thường: Được hiển thị ra m{n
hình.
– C|c nhóm kí tự định dạng: X|c định quy c|ch
hiển thị c|c tham số trong phần
danh_sach_tham_so.
– C|c kí tự điều khiển: Dùng để tạo c|c hiệu ứng
hiển thị đặc biệt như xuống dòng (‘\n’) hay sang
trang (‘\f ’)
42
a. Mục đích v{ cú ph|p (5)
• Mỗi nhóm kí tự định dạng chỉ dùng cho một
kiểu dữ liệu
Ví dụ: %d dùng cho kiểu nguyên
%f dùng cho kiểu thực
• Nếu giữa nhóm kí tự định dạng v{ tham số
tương ứng không phù hợp với nhau thì sẽ
hiển thị ra kết quả không như ý.
43
a. Mục đích v{ cú ph|p (6)
• danh_sach_tham_so phải phù hợp với c|c
nhóm kí tự định dạng trong xau_dinh_dang
về:
– Số lượng
– Kiểu dữ liệu
– Thứ tự
44
Nhóm kí tự
định dạng
Kiểu dữ liệu Kết quả
%c int, char Kí tự đơn lẻ
%i, %d int, char Số thập ph}n
%o int, char Số b|t ph}n
(không có 0 đằng trước)
%x, %X int, char Số hexa
(chữ thường/chữ hoa)
%u unsigned
int/char
Số thập ph}n
45
b. Một số nhóm định dạng phổ biến
Nhóm kí tự
định dạng
Kiểu dữ liệu Kết quả
%ld, %li long Số thập ph}n
%lo long Số b|t ph}n
(không có 0 đằng trước)
%lx, %LX long Số hexa
(chữ thường/chữ hoa)
%lu unsigned long Số thập ph}n
46
b. Một số nhóm định dạng phổ biến (2)
Nhóm kí tự
định dạng
Kiểu dữ liệu Kết quả
%s char [] Hiển thị x}u kí tự
kết thúc bởi ‘\0’
%f float/double Số thực dấu phẩy
tĩnh
%e, %E float/double Số thực dấu phẩy
động
47
c. Một số nhóm định dạng phổ biến (3)
c. Độ rộng hiển thị - số nguyên
• Đối với số nguyên hoặc ký tự hoặc xâu ký tự:
– Có dạng %md, với m l{ số nguyên không }m
– Ví dụ: Có số a = 1234
Lệnh:
printf("%5d",a);//danh 5 cho de hien thi a
printf(“\n%5d",34);
Cho ra kết quả: 1234
34
( kí hiệu cho dấu c|ch đơn (space) )
48
c. Độ rộng hiển thị - số nguyên (2)
• Ví dụ:
printf("\n%3d %15s %3c", 1, "nguyen van a", 'g');
printf("\n%3d %15s %3c", 2, "tran van b", 'k');
• Kết quả:
1 nguyen van a g
2 tran van b k
49
c. Độ rộng hiển thị - số thực
• m, n là 2 số nguyên không âm
%m.nf
Trong đó:
– m vị trí để hiển thị số thực, bao gồm cả kí tự '.‘,
‘-’
– n vị trí trong m vị trí đó để hiển thị phần thập
phân.
50
c. Độ rộng hiển thị - số thực (2)
• Ví dụ:
printf("\n%f",17.345);
printf("\n%.2f",17.345);
printf("\n%7.2f",17.345);
• Kết quả:
17.345000
17.34
17.34
51
c. Độ rộng hiển thị - Chú ý
• Khi số chỗ cần thiết để hiển thị nội dung dữ
liệu lớn hơn trong định dạng:
– Tự động cung cấp thêm chỗ mới để hiển thị chứ
không cắt bớt nội dung của dữ liệu.
– Ví dụ: a=1000
printf(“So a la: %1d”, a);
– Kết quả:
So a la: 1000
52
d. Căn lề phải, lề tr|i
• Căn lề phải:
– Khi hiển thị dữ liệu, mặc định C căn lề phải
• Căn lề trái:
– Nếu muốn căn lề tr|i khi hiển thị dữ liệu ta chỉ
cần thêm dấu trừ - v{o ngay sau dấu %.
53
d. Căn lề phải, lề tr|i (2)
• Ví dụ:
printf("\n%-3d %-15s %.2f %-3c", 9, "nguyen
van a", 7.5, 'g');
printf("\n%-3d %-15s %.2f %-3c", 10, “nguyen
ha", 6.75, 'k');
• Kết quả:
9 nguyen van a 7.50 g
10 nguyen ha 6.75 k
54
7.6.2. Hàm scanf
a. Mục đích và cú pháp:
• Mục đích:
– Hàm scanf() dùng để nhập dữ liệu từ bàn phím
• Cú pháp:
scanf(xau_dinh_dang[,danh_sach_dia_chi]);
• Ví dụ:
int a; float b;
scanf(“%d %f”, &a, &b);
55
a. Mục đích v{ cú ph|p (3)
• Xau_dinh_dang:
– Gồm các ký tự được qui định cho từng loại dữ
liệu được nhập vào.
– Ví dụ: Với dữ liệu định nhập vào là kiểu nguyên
thì xâu định dạng là : %d
• Danh_sach_dia_chi:
– Bao gồm các địa chỉ của các biến (toán tử &),
phân tách nhau bởi dấu phẩy (,)
56
a. Mục đích v{ cú ph|p (4)
• danh_sach_dia_chi phải phù hợp với các
nhóm kí tự định dạng trong xau_dinh_dang
về:
– Số lượng
– Kiểu dữ liệu
– Thứ tự
57
Nhóm kí
tự
định dạng
Kiểu dữ
liệu
Chú thích Ví dụ
%c char Kí tự đơn lẻ char x;
scanf(“%c”, &x);
%d int Số thập ph}n int x;
scanf(“%d”, &x);
%o int Số bát phân int x;
scanf(“%o”, &x);
%x int Số hexa int x;
scanf(“%x”, &x);
%u unsigned
int
Số thập phân unsigned int x;
scanf(“%u”, &x);
58
b. Một số nhóm định dạng phổ biến
Nhóm kí tự
định dạng
Kiểu dữ liệu Chú thích
%s char* Nhập x}u kí tự kết
thúc bởi ‘\0’
%f float Số thực dấu phẩy
tĩnh
%ld long Số nguyên
%lf double Số thực dấu phẩy
tĩnh
59
c. Một số nhóm định dạng phổ biến (3)
Ví dụ
#include
#include
void main()
{
// khai bao bien
int a; float x;
char ch; char str[30];
// Nhap du lieu
printf(“Nhap vao mot so nguyen”);
scanf(“%d”,&a);
printf(“\n Nhap vao mot so thuc”);
scanf(“%f”,&x);
60
Ví dụ
printf(“\n Nhap vao mot ki tu”);
fflush(stdin); scanf(“%c”,&ch);
printf(“\n Nhap vao mot xau ki tu”);
fflush(stdin); scanf(“%s”,str);
// Hien thi du lieu vua nhap vao
printf(“\n Nhung du lieu vua nhap vao”);
printf(“\n So nguyen: %d”,a);
printf(“\n So thuc : %.2f”,x);
printf(“\n Ki tu: %c: ”,ch);
printf(“\n Xau ki tu: %s”,str);
getch();
}
61
Ví dụ
• Kết quả:
Nhap vao mot so nguyen: 2007
Nhap vao mot so thuc: 17.1625
Nhap vao mot ki tu: b
Nhap vao mot xau ki tu: ngon ngu lap trinh C
Nhung du lieu vua nhap vao
So nguyen: 2007
So thuc: 17.16
Ki tu: b
Xau ki tu: ngon
62
c. Một số quy tắc cần lưu ý
• Quy tắc 1: Khi đọc số
– H{m scanf() quan niệm rằng mọi kí tự số, dấu
chấm (‘.’) đều l{ kí tự hợp lệ.
– Khi gặp c|c dấu ph}n c|ch như tab, xuống dòng
hay dấu c|ch (space bar) thì scanf() sẽ hiểu l{
kết thúc nhập dữ liệu cho một số
63
c. Một số quy tắc cần lưu ý (tiếp)
• Quy tắc 2: Khi đọc kí tự:
Hàm scanf() cho rằng mọi kí tự có trong bộ
đệm của thiết bị vào chuẩn đều là hợp lệ, kể
cả các kí tự tab, xuống dòng hay dấu cách.
64
Phần mềm
(viết bằng C)
c. Một số quy tắc cần lưu ý (tiếp)
• Quy tắc 3: Khi đọc xâu kí tự:
+ Hàm scanf() nếu gặp các kí tự dấu trắng, dấu
tab hay dấu xuống dòng thì nó sẽ hiểu là kết thúc
nhập dữ liệu cho một xâu kí tự.
+ Trước khi nhập dữ liệu kí tự hay xâu kí tự ta nên
dùng lệnh fflush(stdin) để xóa bộ đệm.
65
Bộ đệm bàn
phím
A
B
C
8
Phần mềm C
scanf("%c:\", &x);
người dùng
gõ kí tự '8'
7.6.3. C|c lệnh v{o ra kh|c
• Hàm gets():
Dùng để nhập v{o từ b{n phím một x}u kí tự bao gồm cả
dấu c|ch, điều m{ h{m scanf() không l{m được.
• Cú pháp :
gets (biến_xâu_kí_tự);
• Ví dụ:
char str[30];
printf(“Nhap vao mot xau ki tu:”);
fflush(stdin); gets(str);
66
7.6.3. C|c lệnh v{o ra kh|c (2)
• Hàm puts():
Hiển thị ra m{n hình nội dung x}u_kí_tự v{ sau đó đưa con
trỏ xuống dòng mới.
• Cú pháp:
puts(xâu_kí_tự);
• Ví dụ:
puts(“Nhap vao xau ki tu:”);
• Tương đương với:
printf(“%s\n”, “Nhap vao xau ki tu:“);
Hoặc printf(“Nhap vao xau ki tu:\n”);
67
7.6.3. C|c lệnh v{o ra kh|c (3)
• H{m getch(): thường dùng để chờ người sử
dụng ấn một phím bất kì rồi sẽ kết thúc
chương trình.
• Cú pháp
getch();
• Sử dụng h{m gets(), puts(), cần
khai b|o tệp tiêu đề stdio.h
• Sử dụng h{m getch(), cần khai b|o tệp
tiêu đề conio.h
• (Hàm tương tự getchar())
68
7.6.3. C|c lệnh v{o ra kh|c (4)
• Ví dụ:
#include
#include
void main()
{
char str[30];
puts(“Hay cho biet ho ten ban:”);
fflush(stdin); gets(str);
printf(“Xin chao ”);
puts(str);
puts(“An phim bat ki de ket thuc...”);
getch();
}
69
C|c lệnh nhập xuất kh|c
• Kết quả:
Hay cho biet ho ten ban:
ngon ngu lap trinh C
Xin chao ngon ngu lap trinh C
An phim bat ki de ket thuc ...
70