Tải bản đầy đủ (.pdf) (262 trang)

Ngôn ngữ cc++ và kỹ thuật lập trình cơ sở

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (4.98 MB, 262 trang )

L
A
P
T
R
iN
H
C
O
s

V
O
IN
G

N
N
G

C
/C
+
+
V .

A

W|

0 - 7



NHÀ XUẤT BẢN KHOA HỌC VÀ KỸ THUẬT


DƯƠNG THẢNG LONG (CHỦ BIÊN)
TRƯƠNG TIÉN TÙNG

KỸ THUẬT LẬP TRÌNH
VỐI NGỔN NGỮ C/C++
c

v

V~T~1

NHÀ XUẤT BẢN KHOA HỌC VÀ KỸ THUẬT

s




Chịu trách nhiệm xuất bản
GIÁM ĐỐC - TỔNG BIÊN TẬP
PHẠM NGỌC KHÔI
Biên tập và sửa bản in: TS. NGUYEN h u y t i ế n
Họa sỹ bìa

: XUÂN DŨNG


NHÀ XUẤT BẢN KHOA HỌC VÀ KỸ THUẬT
70 Trần Hưng Đạo - Hoàn Kiếm - Hà Nội
ĐT: 04 3942 2443
Fax: 04 3822 0658
Website:
Email:
CHI NHÁNH NHÀ XUẤT ÉvÍN KHOA HỌC VÀ KỸ THUẬT
28 Đồng KHqri?-*Quận 1 - TP Hồ Chí Minh
Ể >t:t8 3822 5062 ’ ' f

In 300 bản, khổ 16 X 24cm, tại Xí nghiệp In NXB Văn hóa Dân tộc
Địa chỉ: 128C/22 Đại La, Hà Nội
SỐĐKXB: 1455 - 2014/CXB/l - 93/KHKT.
Quyết định XB số: 245/QĐXB - NXBKHKT, ngày 30/12/2014.
ISBN: 978-604-67-0312-9
In xong và nộp lưu chiểu Quý I năm 2015.


LỜI NÓI ĐẦU
Để đáp ứng nhu cầu đào tạo kỹ sư tin học của các ngành Công
nghệ thông tin và Tin học trong các trường đại học, tăng cường thêm
một lựa chọn cho người học tiếp cận đa dạng đến những vấn đề cơ sở
của ngành, chúng tôi biên soạn cuốn sách “K ỹ thuật lập trình cơ sở
với ngơn ngữ C /C + + ”. Tài liệu này mong muốn cung cấp các kiến

thức cơ sở về lập trình nói chung và các kỹ thuật xử lý trong ngơn ngữ
C/C++ nói riêng, qua đó nhàm giúp sinh viên có thêm tài liệu học
tập, tham khảo và đặc biệt là kỹ năng thực hành giải quyết các bài
tập lập trình.
Nội dung tài liệu gồm 06 chương, sắp xếp theo trật tự logic từ đon

giản đến phức, đảm bảo tính hệ thống và liên thơng từ đầu đến cuối.
Chương 1 trình bày các khái niệm cơ bản về lập trình, ngơn ngữ
lập trình và các vấn đề liên quan đến lập trình như giải thuật, độ phức
tạp của giải thuật.
Chương 2 giới thiệu về ngơn ngữ lập trình C/C++ gồm các khái
niệm và các thành phân cơ bản cân có của ngơn ngữ lập trình như tập
ký tự, tên, từ khóa, kiểu dữ liệu, các tốn tử, cấu trúc chương trình,
câu lệnh, khối lệnh,...
Chương 3 trình bày các cấu trúc lệnh điều khiển trong lập trình
bao gồm tuần tự, rẽ nhánh và lặp. Chúng được thể hiện bởi các lệnh
như if, switch, for, while,...
Chương 4 trình bày về lập trình cấu trúc. Trong đó gồm các khái
niệm liên quan, phương pháp xây dựng chương trình theo mơ-đun
(dưới dạng các hàm), các vấn đề liên quan đến hàm như vấn đề trao
đổi dữ liệu giữa các hàm, kỹ thuật hàm đệ quy, hàm nạp chồng, hàm
m ẫu,...


KỸ THUẬT LẬP TRÌNH c ơ SỞ VỚI NGĨN NGỮ C/C++

4

Chương 5 trình bày phương pháp tổ chức dữ liệu theo mảng, các
bài toán và thuật toán liên quan đến mảng. Trong đó bao gồm mảng
một chiều, mảng hai chiều, mảng biểu diễn xâu ký tự và cách xử lý,...
và đặc biệt là phương pháp khai thác sử dụng cơ chế bộ nhớ động với
con trỏ.
Chương 6 trình bày phương pháp tổ chức dữ liệu theo gói (hay
cấu trúc - struct), phương pháp tổ chức dữ liệu dạng danh sách, dạng
cây... đổi với các cấu trúc dữ liệu cơ bản và các vấn đề liên quan.

Cũng trong chương này, phần cuối sẽ cung cấp phương pháp xử lý
vào/ra tệp tin phục vụ cho việc lưu dữ liệu trên bộ nhớ ngoài (ổ đĩa).
Mỗi chương được chia làm ba phần: phần thứ nhất trình bày lý
thuyết các vấn đề, mỗi vấn đề đều có các ví dụ minh họa, giải thích
chi tiết hoặc/và các hình vẽ minh họa trực quan giúp cho người đọc dễ
tiếp nhận. Phần thứ hai gồm các bài tập có hướng dẫn thực hiện và lời
giải theo hướng dẫn đó và phần thứ ba là các bài tập chưa có lời giải.
Các ví dụ mẫu cũng như bài giải của các bài tập đã được viết bằng
ngôn ngữ C/C++ và chạy thử cho kết quả đúng trên môi trường
Dev-C++.
Hướng dẫn: Bạn đọc nên đọc các phần lý thuyết trước mỗi

chương và xem các ví dụ minh họa, tiếp theo tìm hiểu các bài tập đã
nêu phương pháp giải để nắm rõ việc vận dụng phần lý thuyết vào mỗi
bài toán cụ thể. Cuối cùng bạn hãy tự làm các bài tập yêu cầu để nâng
cao kỹ năng lập trình cũng như giải quyết các bài tốn bàng máy tính.
Nhóm tác giả mong nhận được những đóng góp để hoàn thiện
hơn cho tài liệu này qua địa chỉ email: duongthanglong@ gm ail.com.

Hà Nội ngày 19 thảng 05 năm 2014
Nhóm tác giả


Chương 1
TỔNG QUAN VỀ KỸ THUẬT LẬP TRÌNH
1.1. Lập trình và ngơn ngữ lập trình
1.1.1. Khái niệm về lập trình
Thuật ngữ lập trình (programming) nhằm nói đến q trình xây
dựng - sản xuất một chương trình phần mềm cho máy tính, qua đó khi
chương trình phần được thực thi trên máy tính, chúng ta ứng dụng để

giải quyết bài tốn thực tế. Khái niệm bài toán ở đây được hiểu theo
nghĩa rộng, tức là bất kỳ vấn đề nào trong thực tế mà con người cần
ứng dụng máy tính để giải quyết. Quá trình này gồm nhiều giai đoạn
như khảo sát, phân tích và thiết kế, mã hóa chương trình, kiểm thử
chương trình, bảo trì nâng cấp,... (xem hình vẽ sau).
Các giai đoạn chính trong q trình xây dựng một chương trình
phần mềm như sau.

\ Khảo
I sát

Mã hóa
Phân tích &
chương trình
thiêt kê

Kiểm
tra

Chương
trình phần
mềm

Giai đoạn khảo sát nhàm làm rõ các yêu cầu của bài toán, giới
hạn hay xác định phạm vi bài tốn cần giải quyết, tiếp theo phân tích
các yêu cầu của bài toán thật chi tiết về các quy trình nghiệp vụ, cách
thức xử lý các vấn đề có trong phạm vi bài tốn để từ đó thiết kế các


6


KỸ THUẬT LẠP TRÌNH c ơ s ở VỚI NGƠN NGỮ C/C++

thành phần cho chương trình phần mềm. Giai đoạn mã hóa chương
trình (hay coding) là một giai đoạn quan trọng, ở đó, các thiết kế về
phần mềm sẽ được chuyển hóa thành nội dung các thành phần của một
chương trình máy tính. Người thực hiện ở giai đồn này hay được gọi
là lập trình viên (programmer).
Như vậy, kết quả của lập trình là chương trình phần mềm
(software), chương trình này sẽ được thực hiện trên máy tính và qua
đó giúp con người giải quyết bài toán đặt ra ban đầu.
Chúng ta khơng đi sâu tìm hiểu chi tiết về các giai đoạn ở đây.
Trong khuôn khổ tài liệu này, sẽ đề cập đến giai đoạn mã hóa chương
trình hay còn gọi là viết mã lệnh. Giai đoạn này được thực hiện dựa
trên những phân tích và thiết kế về chương trình đó. Các thiết kế của
chương trình gồm nhiều thành phần khác nhau như việc phân chia các
rtìơ-đun xử lý, các giao diện người dùng của chương trình... nhưng
quan trọng là quy trình xử lý và tính tốn cho các vấn đề của bài tốn
bằng máy tính, hay cịn gọi là thuật toán. Phần thuật toán này sẽ cho
thấy cấu trúc trình tự mà người lập trình sẽ viết mã lệnh cho chương
trình. Khái niệm và các vấn đề về thuật tốn được trình bày ở phần sau.
Thực tiễn đặt ra nhiều bài toán cho việc xây dựng các chương
trình phần mềm ứng dụng. Có một số bài tốn có thể đang được giải
quyết bằng sức lao động của con người, tuy nhiên có những bài tốn
chúng ta khơng thể giải quyết vì khối lượng tính tốn khổng lồ hoặc
diễn ra trong những môi trường đặc biệt. Chẳng hạn, bài tốn giải
phương trình bậc hai là đơn giản và chúng ta có thể tính tốn trong
thời gian ngắn, trong khi bài tốn phân tích một số ngun khoảng 50
chữ số thành các thừa số nguyên tố sẽ cần một khối lượng tính tốn
lớn và con người khơng dễ gì có thể tính tốn ngay được. Hoặc bài

tốn điều khiển các thiết bị rơ-bốt được phóng vào vũ trụ thì rõ ràng
con người chưa thể tham gia điều khiển trực tiếp mà cần có sự tự động
hóa việc điều khiển bàng máy tính. Những điều này cho thấy sự cần


KỸ THUẬT LẬP TRÌNH c ơ s ở VỚI NGƠN NGỮ C/C++

thiết đến việc ứng dụng máy tính thơng qua các chương trình phầr
mềm ứng dụng.
Mặt khác, với đặc trưng như tính trung thực, khơng bị phụ thuộc
vào điều kiện ngoại cảnh khi tính tốn và xử lý... nên việc ứng dụng
máy tính giải quyết các bài tốn giúp con người sẽ hiệu quả cao vè
đảm bảo tính ổn định hon.

1.1.2. Ngơn ngữ lập trình
Chương trình phần mềm của máy tính là tập hợp các câu lệnh CC
thứ tự để điều khiển máy tính xử lý và tính tốn giải quyết bài tốn đ<
đặt ra. Các câu lệnh (hay cịn gọi mã lệnh) được viết trong chươnị
trình về bản chất chỉ sử dụng 2 ký hiệu 0 và 1, bởi vì máy tính điện tì
hiện nay chỉ xử lý tín hiệu dạng nhị phân (tương ứng với trạng thá
ON/OFF). Các lệnh biểu diễn ở dạng này gọi là mã máy. Tuy nhiêi
chúng ta khơng phải và cũng rất khó lập trình bằng các lệnh m ã máy
mà sẽ sử dụng các lệnh dưới dạng tương tự ngôn ngữ tự nhiên (chi
yếu bằng tiếng Anh) để dễ dàng hơn, đó chính là nhờ sự cung cấp củi
ngơn ngữ lập trình.
Như vậy, ngơn ngữ lập trình có thể hiểu là tập các ký pháp, qir
tắc, quy ước để viết mã lệnh cho chương trình. Hiện nay có rất nhiềi
loại ngơn ngữ lập trình được chia thành từng nhóm sau:
- Ngơn ngữ máy: sử dụng các ký hiệu nhị phân cùng với quy tắ
của máy nên rất khó áp dụng và hầu như khơng được dùng để viể

chương trình.
- Nhóm ngơn ngữ bậc thấp: sử dụng các ký hiệu là chữ cái, chi
số, dấu... hay còn gọi là các ký tự cùng với quy tắc gần với quy tắ
của máy nên cũng khá khó khi áp dụng. Chẳng hạn, như ngơn ng
Assembler. Các ngơn ngữ thuộc nhóm này thường áp dụng để vi(
chương trình phần mềm dạng hệ thống, can thiệp sâu bên trong cá
thiết bị vật lý để điều khiển.


8

KỸ THUẬT LẬP TRÌNH c ơ SỞ VỚI NGỐN NGỮ C/C++

-

Nhóm ngơn ngữ bậc cao: sử dụng các ký hiệu là các ký tự của

ngôn ngữ tự nhiên (tiếng Anh) để viết lệnh với quy tắc gần với quy tắc
của ngôn ngữ tự nhiên nên dễ áp dụng. Chẳng hạn như Pascal, C/C++,
Java,...
Ngơn ngữ lập trình về bản chất cung cấp cho người lập trình hai
yếu tố chính thứ nhất, cung cấp các ký hiệu và quy tắc viết mã lệnh để
sao cho đơn giản và dễ triển khai; thứ hai, cung cấp cơ chế để các
chương trình sau khi viết bàng ngôn ngữ này sẽ được chuyển về dạng
mã máy để thực hiện trên máy tính. Q trình chuyển đổi này được
gọi là biên dịch (compile) chương trình.
Chương trình được viết ra sử dụng một ngơn ngữ lập trình nào
đó được gọi là chương trình nguồn (source programs), sau khi biên
dịch sẽ tạo thành chương trình gồm các lệnh mã máy được gọi chương
trình thực thi (executive programs).

Hình vẽ sau minh họa quá trình lập trình phần mềm và biên dịch,
chạy thử chương trình trên máy tính.

1.2. Thuật tốn
1.2.1. Khái niệm thuật toán (algorithms)
Thuật toán là một hệ thống chặt chẽ và rõ ràng các quy tắc nhằm
xác định một dãy có thứ tự các thao tác trên những đối tượng, sao cho


KỸ THUẬT LẬP TRÌNH c ơ SỞ VỚI NGƠN NGỮ C/C++

9

sau một số hữu hạn bước thực hiện các thao tác này, ta thu được kết
quả mong muốn.
Thuật toán là khái niệm cơ bản trong tin học để diễn tả cách thức
máy tính xử lý thơng tin nhằm giải quyết một bài tốn nào đó. Vì vậy
để lập trình cho máy tính, trước hết, chúng ta phải thiết kế một thuật
tốn thích hợp mà các bước tính tốn trong đó là thực hiện được bởi
máy tính. Sự thích hợp của một thuật toán được thể hiện ở các đặc
trưng cần có và chúng ta sẽ xem xét chi tiết ở phần tiếp theo.
Chẳng hạn, để thực hiện bài toán giải phương trình bậc hai dạng
a.x2+b.x+c = 0 chúng ta cần phải thực hiện theo thứ tự các bước như
sau:
Bước 1) Xác định các hệ số của phương trình là ba số a, b và c.
Bước 2) Kiểm tra, nếu a bằng 0 thì trả lời đây khơng phải là
phương trình bậc hai và kết thúc. Ngược lại thực hiện tiếp bước 3.
Bước 3) Tính giá trị của delta = b2- 4a.c
Bước 4) Nếu delta < 0 thì trả lời phương trình khơng có nghiệm
thực và kết thúc. Ngược lại sang bước 5.

Bước 5) Nếu delta = 0 thì trả lời phương trình có nghiệm kép là
Xi = x2 = -b/(2.a) và kết thúc. Ngược lại sang bước 6.

Bước 6) Nếu delta > 0 thì trả lời phương trình có hai nghiệm
phân biệt là X] = (-b+delta1/2)/(2.a) và x2 = (-b-delta1/2)/(2.a) và kết
thúc.
Q trình thực hiện bài tốn trên có 6 bước, nội dung thực hiện
các bước là rõ ràng, chính xác và đơn nghĩa. Nếu chúng ta đảo lộn trật
tự của các bước thì có thể dẫn đến sai, tức là khơng giải quyết được
bài tốn đã đặt ra. Đây là đặc điểm có tính thứ tự của các thao tác
trong bất kỳ một thuật nào. Để tìm hiểu kỹ các đặc trưng của thuật
toán, chúng ta sẽ tiếp tục ở phần sau.


KỸ THUẬT LẬP TRÌNH c ơ s ở VỚI NGƠN NGỮ C/C++

10

1.2.2. Phương pháp trình bày thuật tuán
Vấn đề biểu diễn thuật tốn cũng rất quan trọng, nhàm mục đích
truyền đạt nội dung phương cách tính tốn và xử lý cho một bài toán
từ người thiết kế đến người lập trình một cách chính-xác. Dễ nhất là sử
dụng hệ thống các ký hiệu hình thức hóa, tuy nhiên với những thuật
tốn lớn và để gần gũi với ngơn ngữ tự nhiên của con người, chúng ta
thường sử dụng ngôn ngữ giả lập trình với mơ tả từng bước.
Như vậy, chúng ta có hai cách để biểu diễn thuật tốn:
-

Cách thứ nhất là nêu trình tự các bước từ bước 1 đến bước cuối


cùng, ở mỗi bước sử dụng ngôn ngữ giả lập trình cùng với ngơn ngữ
tự nhiên để trình bày thao tác cần tính tốn hoặc xử lý. Các mơ tả này
phải chính xác, rõ ràng, đom nghĩa và dễ hiểu.
Cấu trúc mơ tả một thuật tốn theo cách này thường gồm các
3hần như sau:
A lgorithm : tên_thuật_toán
Input: các_tham_số_đầu_vào
O utput: các_kết_quả_tính_tốn_đầu_ra
Actions:
B 1) Mơ _tả_thao_tác_xử_lý_cho_bước_ 1
B2) Mơ_tả_thao_tác_xử_lý_cho_bước_2

Bn) M ơ_tả_thao_tác_xử_lý_cho_bước_«
E nd. (kết thúc thuật tốn)
Trong đó, chúng ta có thể dịch chuyển từ bước sau lên bước
trước để cho lặp lại việc thực hiện một số thao tác nào đó. Tuy nhiên
điều này cần được thiết kế chặt chẽ để tránh việc lặp lại vơ tận, tức
khơng có điểm dừng cho thuật toán.


KỸ THUẬT LẬP TRỈNH c ơ s ở VỚI NGÔN NGỮ C/C++

11

Chúng ta xem ví dụ sau về tìm số lớn nhất trong ba số nguyên để
nắm rõ hơn về phương pháp trình bày :
A lgorithm : TM3S
In p u t: a, b, c (là 3 số nguyên)
O u tp u t: m (là số lớn nhất)
Actions:

B l) Nếu a>b thì đặt m = a;
Ngược lại, đặt m = b;
B2) Nếu mB3) Kết quả là m;
E nd. (kết thúc thuật toán)
- Cách thứ hai sử dụng sơ đồ khối: trong đó sử dụng các ký hiệu
hình vẽ với ý nghĩa như sau (xem bảng)
Hình vẽ

o

Ý nghĩa
thể hiện sự bắt đầu và kết thúc thuật toán

thể hiện sự tính tốn

/

/

--------- ►

thể hiện cho thao tác nhập dữ liệu vào, đưa kết
quả dữ liệu ra
thể hiện chiều đi của thuật toán

thể hiện sự lựa chọn đúng hoặc sai, có một chiều
đi vào và 2 chiều đi ra tương ứng với 2 trường
hợp đúng và sai
-




-


12

KỸ THUẬT LẬP TRÌNH c ơ SỞ VỚI NGƠN NGỮ C/C++

Trong đó, một thuật tốn thường chỉ có hai hình e-líp thể hiện
một điểm bắt đầu và một điểm kết thúc của thuật tốn. Các mũi tên
nổi các hình (thao tác) lại với nhau tạo nên tính thứ tự cần phải xem
xét cẩn trọng. Nếu một thao tác nào đó trong một hình vẽ mà quá lớn
và chưa cụ thể để dễ dàng lập trình thì có thể được thiết kế chi tiết
thành một thuật toán con khác với một sơ đồ khác tương ứng.
Chẳng hạn, với thuật toán giải phương trình bậc hai ở trên chúng
ta có thể biểu diễn bằng sơ đồ sau:
(^ B ắ t đ ầ ^ )
Nhập hệ số a,b,c



Trả lời khơng
,
(9) phải phương «—
trình bậc hai

(6)


X,

=

(1)
Ị (2 )

a*0^>

- b + VÃ

2a

,

X,

2

=

-ố -V Ã
2a

X,

=*,

_


~b
«
2a

(7)

T
.(10) ► (^K ẻtth u c^)
M ột thuật tốn được trình bày dưới dạng sơ đồ thường là rõ ràng,
tường minh và trực quan với cách tư duy lập luận của con người hom.
Người lập trình sẽ dễ dàng triển khai chương trình từ thuật tốn ở
dạng này. Tuy nhiên nếu thuật tốn q lớn thì việc trình bày bằng mơ
tả các bước sẽ đơn giản hơn, khi đó các bước phải được trình bày rõ


13

KỸ THUẬT LẬP TRÌNH c ơ SỞ VỚI NGƠN NGỮ C/C++

chi tiết từng thao tác để người lập trình có thể nắm bắt được và mã hóa
thành các câu lệnh xử lý, tính tốn trong chương trình được dễ dàng.
Để hiểu rõ và chắc chắn chính xác chi tiết từng thao tác trong
một thuật tốn, thơng thường, trước hết chúng ta hãy làm thử từng
bước của thuật toán đã cho với các trường hợp khác nhau của dữ liệu
đầu vào (input). Ở đây chúng ta sẽ làm thử một trường hợp của thuật
tốn giải phương trình bậc hai ở trên. Cụ thể với sơ đồ của ví dụ trên
ta có như sau:
Sau khi bắt đầu, chúng ta nhập các hệ số tại hình vẽ thứ (2) (hình
bình hành), giả sử là a = 2, b = 5, c = 2. Tiếp theo tại hình (3) kiểm tra
a * 0 là đúng nên sang hình (4) và tính A = 5 - 4 x 2 x 2 = 9. Tiếp tục

kiểm tra A > 0 tại hình (5) là đúng nên sang hình (6) để tính giá trị
nghiệm:
= -5 + V 9_ . _
, =
Xi = — ——■— = -0 ,5 và x2 =
2x2

2x2

-5 -V 9 _ .
—;—- = - 2

sau đó kết thức thuật tốn.

1.2.3. Các đặc trưng của thuật tốn
Thơng thường, để cho biết một thuật tốn là tốt hay khơng chúng
ta cần đưa ra các tiêu chí đánh giá. Sau đây là những tiêu chí thường
được đề cập,

có những tiêu chí là bắt

mức độ càng

cao càng tốt.

-

buộc, có những tiêu chí cần đạt ở

Tính kết thúc: thuật tốn phải được kết thúc sau một số hữu hạn


thao tác. Đây là tính bắt buộc của bất kỳ một thuật tốn nào.
Ví dụ sau đây là một thuật tốn để tìm ước số chung lớn nhất của
hai số nguyên dương mà khơng có tính kết thúc vì các bước trong đó
được lặp lại vơ hạn lần (thuật tốn bên dưới). Thực vậy, khi hai số
bàng nhau (a=b) thì tại bước 2 thuật toán sẽ trừ bớt của b và do đó giá
trị b sẽ bằng 0 (a khác 0), tiếp theo bước 3 sẽ khơng kết thúc vì sau bước
2 thì giá trị a khác b. Bước 4 sẽ lặp lại bước 1, bây giờ sẽ lặp vô hạn lần


14

KỸ THUẬT LẬP TRÌNH c ơ s ở VỚ! NGỒN NGỮ C/C++

VÌ b = 0 nên tại bước 1 giá trị a luôn không đổi dẫn đến không bao giờ
đạt được kết quả a = b ở bước 3 để dừng thuật tốn.
A lgorithm : USCLN (thuật tốn khơng có tính dừng)
Input: a, b (là 2 số nguyên dương)
Output: u (là ước số chung lớn nhất)
Actions:
B l) Nếu a>b thì đặt a = a-b; (giảm bớt của a đi b đom vị)
B2) Nếu aB3) Nếu a=b thì kết thúc và kết quả là a;
B3) Nếu a o b thì lặp lại bước 1;
End. (kết thúc thuật tốn)
Để thuật tốn trên có tính dừng, chúng ta có thể thay đổi điều
kiện xét ở bước 3. Theo đó, thay vì xét a = b thì ta sẽ xét điều kiện
a = 0 hoặc b = 0 để kết thúc thuật tốn.
-


Tính rõ ràng, chặt chẽ: các thao tác được trình bày trong thuật

tốn phải rõ ràng và đơn nghĩa, và phải thực hiện được bằng máy tính.
Các bước này có thứ tự nhất địrih, nếu thay đổi trật tự này thì thuật
tốn sẽ bị sai.
Chẳng hạn, nếu có một mơ tả kiểu như “nếu a là đủ lớn thì kết
thúc” thì sẽ khơng lập trình được cho máy tính vì khái niệm “đủ lớn”
là khơng rõ ràng. Hoặc mơ tả có dạng “nếu tốc độ gió trên 230km/h
thì ngắt nguồn điện tổng” trong lập trình điều khiển tại nhà máy điện
hạt nhân X nào đó, thì có hai việc mà bản thân máy tính khơng tự xác
định được đó là “đo tốc độ gió” và “ngắt nguồn điện” mà phải thông
qua các thiết bị ngoại vi hỗ trợ như là các cảm biến. Tất nhiên,
điều này sẽ đặt ra sự ghép nổi giữa thiết bị ngoại vi với máy tính trong
điều khiển.


KỸ THUẬT LẬP TRÌNH c ơ SỞ VỚI NGỐN NGỮ C/C++

15

- Tính phổ dụng: thuật tốn có thể mở rộng, áp dụng được cho
lớp các bài toán tương tự nhau, khơng chỉ giải quyết duy nhất một bài
tốn đã đặt ra.
Ví dụ: bài tốn đặt ra là lập trình để giải hệ 3 phương trình với 3
ẩn số (x, y, z) như sau:
'au .x + an .y + aìĩ.z = bì
ứ3| j + ứ32 .y + ữ33,z = ố3

Khi đó nếu chúng ta chỉ thiết kế thuật toán với hệ đúng như trên

mà không thể mở rộng để giải hệ với số phương trình là n * 3 thì có
thể nói là thuật tốn chưa có tính phổ dụng.
- Tính hiệu quả: thể hiện trong cả không gian và thời gian,

về

không gian thuật toán phải thực hiện được trong điều kiện khả năng
của máy tính hiện tại, về thời gian địi hỏi thuật tốn phải cho kết quả
sớm nhất có thể được.

1.2.4. Độ phức tạp của thuật toán
Với mỗi bài toán được cho chúng ta có thể thiết kế nhiều thuật
tốn khác nhau, và như vậy mỗi thuật tốn sẽ có những đặc trưng nhất
định. Thơng thường, các tiêu chí để lựa chọn một trong số các thuật
toán cùng giải một bài toán sẽ dựả trên một khái niệm gọi là độ phức
tạp của thuật toán.
Độ phức tạp của thuật toán thường được xem xét đến ở hai yếu
tố. Thứ nhất là thời gian, nó là sổ các thao tác xử lý tính tốn từ khi
bắt đầu cho đến khi kết thúc thuật tốn. Thứ hai là khơng gian, tức là
dung lượng bộ nhớ cần đến trong quá trình chạy của thuật tốn. Tuy
vậy, yếu tố khơng gian có thể mở rộng ở những mức độ chấp nhận
được và do đó thường được xem nhẹ và ít quan tâm. Trong đó, yếu tố
thời gian đóng vai trị lớn và quyết định đến tính hiệu quả của thuật
tốn. Vì vậy, yếu tổ này được quan tâm và đề cập chính đến việc đánh


KỸ THUẬT LẬP TRÌNH c ơ s ở VỚI NGƠN NGỮ C/C++

16


giá độ phức tạp của thuật toán, và chúng ta chỉ quan tâm đến yếu tố
này trong tài liệu.
Thông thường, độ phức tạp (xét yếu tố thời gian) của thuật tốn
được đánh giá dựa trên kích thước dữ liệu đầu vào của bài tốn, đó là
vì khi dữ liệu đầu vào có kích thước lớn sẽ dẫn đến số các thao tác xử
lý nhiều hơn. Thật vậy, chẳng hạn với bài tốn tính tổng của dãy các
số ngun, khi sổ lượng số nguyên là 2 (a, b) thì chỉ cần một phép tính
cộng (a+b), khi số lượng dãy là 3 (a, b, c) thì cần 2 phép tính cộng
(a+b+c),... tổng quát với dãy n số thì cần n-1 phép tính cộng.
Tuy nhiên, số các thao tác xử lý tính tốn của một thuật tốn
thường khơng xác định một cách tuyệt đối mà sẽ ước lượng ở mức
trung bình. Và chúng ta dùng khái niệm bậc o để thể hiện con số ước
lượng này. Sau đây là một số ước lượng hay được dùng trong việc
đánh giá các thuật toán (được sắp xếp theo độ phức tạp tăng dần):
Ký hiệu
0(log2n)
0(n)
0 (n.log2n)

Ý nghĩa
Độ phức tạp logarit của kích thước dữ liệu (n).
Độ phức tạp tuyến tính, tức là số thao tác xử lý tính tốn
sẽ tăng lên một cách tuyến tính cùng với kích thước của
dữ liệu đầu vào.
Độ phức tạp n nhân với logarit của n.

0(na)

Độ phức tạp đa thức bậc a của n (a là một hằng số).


0(a")

Độ phức tạp lũy thừa.

Chẳng hạn, với thuật tốn tính tổng của một dãy n số nguyên
theo cách mô tả như trên thì có độ phức tạp là O(n).
Một quy ước trong việc đánh giá là nếu số ước lượng là m ột biểu
thức theo n thì chúng ta sẽ lấy giá trị cao nhất, hoặc biểu thức theo n
mà nhân với một hàng số thì khơng tính hàng số đó. Ví dụ, một thuật
tốn có ước lượng là 5+n+3.n thì ta lấy 3.n và suy ra lấy n, vậy ta có
bậc O(n). M ột thuật tốn có ước lượng là n+n2+2" thì ta lấy là 2n và có
bậc 0(2").


17

KỸ THUẬT LẬP TRỈNH c ơ s ở VỚI NGÔN NGỮ C/C++

1.2.5. Một số ví dụ về thuật tốn

Ví dụ 1.1: Thuật tốn “đổi chỗ”, có hai thùng A và B, thùng A
đựng thóc và thùng B đựng ngơ, hãy đổi chỗ thóc và ngơ cho nhau.

A

B

(thóc)

(ngơ)


Để thực hiện thuật toán này chúng ta phải sử dụng thêm một
thùng trung gian thứ 3, ký hiệu là c và thuật toán được trình bày theo
cách 1 như sau:
Bước 1) Chuyển thóc ở thùng A vào thùng

c

Bước 2) Chuyển ngô ở thùng B vào thùng A
Bước 3) Chuyển thóc ở thùng

c vào thùng B

Hình minh họa như sau:

(trung gian)



Ví dụ 1.2: Thuật tốn “nấu cơm” :

“Nấu cơm ” là một cơng việc rất quen thuộc trong cuộc sống, tuy
nhiên nếu có ai đó chưa một lần thực hiện trong thực tế thì không thể
làm được và chúng ta phải đưa ra một thuật tốn cho người đó thực
hiện, thuật tốn được trình bày như sau:
Bước 1) Thu thập nguyên liệu như gạo, nước và xác định các
công cụ sử dụng để nấu cơm như nồi (giả sử nồi điện), nguồn điện.
Bước 2) Nếu ngun liệu khơng có hoặc thiếu cơng cụ thì
thơng báo không thể nấu cơm và chuyển đến bước 6.



KỸ THUẬT LẬP TRÌNH c ơ s ở VỚI NGƠN NGỮ C/C++

18

Bước 3) Lấy gạo cho vào nồi
Bước 4) Vo gạo và đổ nước, đóng nắp nồi
Bước 5) Cắm điện và bật công tắc sang chế độ nấu
Bước 6) Kết thúc


Ví dụ 1.3: Thuật tốn giải phương trình bậc 2 có dạng sau
ax2 +bx + c = 0

Thuật tốn trình bày dưới dạng sơ đồ như sau:


19

KỸ THUẬT LẬP TRÌNH c ơ SỞ VỚI NGƠN NGỮ C/C++



Ví dụ í .4: Thuật tốn tìm số nhỏ nhất trong một dãy số. Cho

một dãy số như sau: Xi,

x2, x3, x4, x5,..., xn.

Hãy tìm số nhỏ nhất


trong dãy số trên.
Ta ký hiệu X j là số thứ i trong dãy trên với i = 1,2,3,—, n và sử

dụng Min để lưu số nhỏ nhất, thuật tốn được trình bày (bằng cả mô tả
từng bước và sơ đồ khối) như sau:

Thuật tốn trên (dạng sơ đồ) được mơ tả từng bước như sau:
Bước 1) Xác định n và các giá trị X |, x 2,..., Xn
Bước 2) Nếu n < 1 thì thơng báo khơng có các số và kết thúc


KỸ THUẬT LẬP TRÌNH c ơ SỞ VỚI NGỔN NGỮ C/C++

20

Bước 3) Đặt Min = Xi, giả sử số nhỏ nhất là số đầu tiên
Bước 4) Đặt i = 2, bắt đầu kiểm tra từ số thứ 2
Bước 5) Nếu i > n thì chuyển sang bước 8
Bước 6) Nếu X j < Min thì đặt lại Min = X j
Bước 7) Tăng i lên 1 (i = i + 1) và quay lại bước 5
Bước 8) Thông báo kết quả là: Min và kết thúc

1.3. Một số bài tập
>

Bài tập 1.1
Trình bày thuật tốn “pha trà” bàng cách mơ tả từng bước.

>


Bài tập 1.2
Thuật toán đổi chỗ 2 số nguyên không cần trung gian: cho 2 số
nguyên A và B, hãy trình bày thuật tốn đổi chỗ hai sổ nguyên A và B
cho nhau mà không cần đến trung gian. Trình bày thuật tốn theo cả 2
cách.
>

Bài tập 1.3

Xỉ

Trình bày thuật tốn tìm số lớn nhất trong một dãy n sổ Xj,
x„ theo cách vẽ sơ đồ.

>

Bài tập 1.4

Trình bày thuật tốn để tìm xem một số A có nằm trong dãy n số
X], x 2,..., x„ hay không, theo cả 2 cách.

>

Bài tập 1.5
Trình bày thuật tốn giải hệ 2 phương trình 2 ẩn sau:
ịax + by = c
\d x + ey = f

theo cách vẽ sơ đồ.



KỸ THUẬT LẶP TRÌNH c ơ SỞ VỚI NGƠN NGỮ C/C++

>

21

Bài tập 1.6
Trình bày thuật tốn đế sắp xếp một dãy n số Xj, x 2,..., x„ tăng

dần, theo 2 cách.

>

Bài tập 1.7
Trình bày thuật tốn giải phương trình sau:
ax 4 + bx2 +c = 0

theo cách mô tả từng bước.

>

Bài tập 1.8
Trình bày thuật tốn tính tổng của một dãy n số X \, x 2,..., x„

theo cách vẽ sơ đồ.

>


Bài tập 1.9
Cho k số nguyên Xi,

x 2,..., X*. Trình bày các thuật tốn sau:

a) Tìm giá trị chẵn nhỏ nhất trong k số đã cho.
b) Tìm giá trị âm lớn nhất trong k số đã cho.
. c) Tìm giá trị dương nhỏ nhất trong k số đã cho.
theo cách vẽ sơ đồ.

>

Bài tập 1.10
Cho n số nguyên Xi,

x 2,..., X*. Trình bày các thuật tốn sau:

a) Tính trung bình cộng của các số đã cho.
b) Tính tổng các số lẻ trong các số đã cho.
c) Đếm số lượng các số nằm trong đoạn [5 , 15].

>

Bài tập 1.11
Hãy trình bày thuật tốn tìm ước số chung lớn nhất của 2 số

nguyên a và b theo cách vẽ sơ đồ.
Ví dụ: cặp số (24,9) có ước số chung lớn nhất là 3.



22

KỸ THUẬT LẬP TRÌNH c ơ s ở VỚI NGƠN NGỮ C/C++

>

Bài tập 1.12
Hãy trình bày thuật tốn để kiểm tra một số nguyên n có phải là
số nguyên tố hay khơng bàng cách vẽ sơ đồ.
Ví dụ: số n = 5 là sổ nguyên tố, nhưng số n = 21 không là số
nguyên tố.

>

Bài tập 1.13
Hãy vẽ sơ đồ thuật tốn phân tích một số ngun n thành tích các
thừa số nguyên tố.
Ví dụ: số n = 140 sẽ phân tích thành 2 X 2 X 5 X 7.


Chương 2
NGƠN NGỮ LẬP TRÌNH C/C++
2.1. Các thành phần cơ bản của ngơn ngữ lập trình
Chúng ta thấy trong ngơn ngữ tự nhiên, chẳng hạn như tiếng Anh
hay tiếng Việt được cấu tạo từ các phần tử nhỏ nhất, cơ bản nhất là
bảng các chữ cái và các dấu. Bằng các quy tắc, cú pháp và ngữ nghĩa
để ghép chúng lại với nhau tạo nên các từ, sau đó ghép các từ với nhau
tạo nên câu, đoạn văn và cuối cùng là tạo nên bài văn.
Ngơn ngữ lập trình cũng tương tự như vậy, được cấu tạo từ
những phần tử cơ bản được gọi là bảng ký hiệu. Một chương trình

phần mềm được hình thành từ các ký hiệu này bằng cách áp dụng các
quy tắc của ngôn ngữ lập trình chỉ định và dựa trên các quy trình đã
được thiết kế cho chương trình đó.
Sau đây là các khái niệm cơ bản trong ngơn ngữ lập trĩnh nói
chung và các quy tắc áp dụng trong ngơn ngữ lập trình C/C++.

2.1.1. Bảng ký hiệu
Như đề cập ở trên, bảng ký hiệu gồm các phần tử cơ bản nhất
của một ngôn ngữ lập trình. Hầu hết các ngơn ngữ đều sử dụng bảng
ký hiệu là các chữ cái, chữ số và các dấu trong ngôn ngữ tự nhiên
(tiếng Anh). Điều này sẽ làm cho đcm giản khi viết mã lệnh đối với
người lập trình.
Cụ thể với ngơn ngữ C/C++, bảng ký hiệu được sử dụng bao
gồm:


KỸ THUẬT LẬP TRÌNH c ơ SỞ VỚI NGƠN NGỮ C/C++

24

- Nhóm các chữ cái: chữ in hoa A, B, c,...,

z và chữ in thường a,

b, c,..., z
- Nhóm các chữ số: 0, 1, 2,..., 9
- Nhóm các dấu: +,

*, /, >, <, =, &,...


Một số ngôn ngữ, chẳng hạn Pascal, Visual B asic,... không phân
biệt chữ hoa hay chữ thường. Trong khi một số khác, ừong đó có
C/C++, sẽ phân biệt giữa chữ hoa và chữ thường, do đó chúng ta phải
thận trọng khi sử dụng các chữ cái hoa và chữ cái thường.

2.1.2. Tên và từ khóa
Tên (name) là một dãy các chữ cái, chữ số và dấu gạch nối. Tên
phải bắt đầu bàng chữ cái hoặc dấu gạch nối (không được bắt đầu
bằng chữ số), trong tên không dùng dấu cách và các dấu đặc biệt khác.
Trong các ngơn ngữ lập trình, tên được dùng để định danh các
thành phần của chương trình như tên biến, tên hàm, tên hàng, tên con
trỏ ,... sẽ đề cập chi tiết ở các phần sau.
Ví dụ:
B aitapl, Hanoi2, Viet3nam là những tên đúng.
lBaitap, Ha noi, Viet%nam là những tên sai, vì có chừ sổ đứng
đầu, có sử dụng dấu cách, có ký hiệu đặc biệt %.
Có một nhóm các tên do ngơn ngữ lập trình quy định để đưa ra
các quy tắc viết lệnh trong chương trình được gọi là từ khóa
(keywords). Người lập trình khơng được đặt các tên trong chương
trình trùng với hệ thống từ khóa của ngơn ngữ lập trình.
Trong C/C++, nhóm các từ khóa được giới thiệu trong bảng sau
(ý nghĩa của chúng sẽ được trình bày chi tiết và cách áp dụng ở các
phần tiếp theo).