TRƯỜNG ĐẠI HỌC THƯƠNG MẠI
Chủ biên: TS. Nguyễn Thị Thu Thủy
Ths. Đinh Thị Hà
Giáo trình
co sở LẬP TRÌNH
NHÀ XUẤT BẢN THỐNG KÊ
TRƯỜNG ĐẠI HỌC THƯƠNG MẠI
KHOA HỆ THỐNG THÔNG TIN KINH TÉ
Chủ biên: TS. Nguyễn Thị Thu Thủy
Ths. Đinh Thị Hà
Giáo trình
Ctf sft lập trinh
NHÀ XUẤT BẢN THỐNG KÊ
Hà Nội-2014
LỜI NĨI ĐẰU
Tư duy thuật tốn và khả năng lập trình cơ bản là một trong những
yêu cầu cơ bản đổi với các sinh viên thuộc các lĩnh vực có liên quan đến
Tin học như quản trị hệ thổng thông tin; thương mại điện tử,... Đe
nâng cao tỉnh tự học, niềm đam mê, u thích viết chương trình cho
máy tính, cũng như rèn luyện cho mình thói quen tư duy của một người
lập trình chuyên nghiệp, tập thể giảng viên của Bộ môn Tin học, Khoa
Hệ thống Thông tin Kinh tế biên soạn và trân trọng giới thiệu cuốn
“Giáo trĩnh Cơ sở lập trình”.
Giáo trình cơ sở lập trình được biên soạn làm giáo trình cho sinh
viên hệ đại học chuyên ngành Quản trị hệ thống thông tin thị trường và
thương mại thuộc Khoa Hệ thống Thông tin Kinh tế của trường Đại học
Thương mại; đồng thời là tài liệu tham khảo cho các giáo viên trong quá
trĩnh giảng dạy mơn học. Hơn thể nữa giáo trình cịn làm tài liệu tham
khảo cho các sinh viên có chuyên ngành gần như thương mại điện tứ,
hay cho các sinh viên yêu thích mơn học lập trình.
Nội dung giảo trình gồm 5 chương như sau:
Chương 1:
Tổng quan về cơ sở lập trình. Chương này trình bày
các khái niệm chung về cơ sở lập trình, tổng quan về
ngơn ngữ c. Các cách thiết kế chương trình,...
Chương 2:
Các thành phần cơ sở. Chương này trình bày các yếu
tổ cơ bản của ngơn ngữ lập trình, và câu lệnh có cấu
trúc trong c, bao gồm câu lệnh rẽ nhảnh và các câu
lệnh lặp.
Chương 3:
Mảng, xâu ký tự và con trỏ. Chương này trình bày các
kiến thức về dữ liệu mảng, xâu ki tự và con trỏ.
Chương 4:
Hàm. Chương này giới thiệu về hàm và cách truyền
các tham so cho hàm.
3
Chương 5:
Kiểu dữ liệu có cấu trúc. Chương này trình bày về kiểu
dữ liệu struct, kiểu tệp bao gồm tệp nhị phân và tệp
văn bản.
Tập thể tác giả biên soạn đã bám sát với đề cương được soạn theo
chương trình khung của Bộ Giáo dục và Đào tạo ban hành, đồng thời có
tham khảo và biên soạn sao cho có tỉnh cập nhật các kiến thức theo
chuyên ngành và đặc thù của trường kinh tế cho phù hợp với tình hình
thực tiễn của xã hội. Tham gia biên soạn giáo trình gồm các tác giả:
• TS. Nguyễn Thị Thu Thủy, chủ biên và biên soạn chương 1,
chương 2 và tham gia vào các chương cịn lại
• Ths Đinh Thị Hà biên soạn các chương 3, chương 4 và chương 5
• Ngồi ra cịn có sự đóng góp ỷ kiến, nhận xét của các giảng viên
khác trong bộ môn.
Chủng tôi xin cảm ơn các đồng nghiệp đã công bổ các giáo trình,
sách và tài liệu liên quan để chúng tơi có thể tham khảo cho giáo trình
của mình trong quá trình biên soạn. Mặc dù đã cổ gắng hồn chỉnh giáo
trình, tuy nhiên khơng thể tránh khỏi thiếu sót. Rất mong các đồng
nghiệp, sinh viên đóng góp ỷ kiến để giảo trình ngày càng hồn thiện hơn.
TẬP THẺ TÁC GIẢ
4
Chương 1
TƠNG QUAN VÈ cơ SỞ LẬP TRÌNH
Chương này bao gồm các kiến thức về thuật tốn, tính chất thuật
tốn, sơ đồ khối và các khái niệm về chương trình và ngơn ngữ lập trình.
Đồng thời chương này cịn bao gồm cả việc giới thiệu về các phương
pháp lập trình và các kỹ thuật thiết kế chương trình như kỹ thuật chương
trình con và kỹ thuật đệ quy.
1.1. THUẬT TỐN
1.1.1. Khái niệm
Thuật toán là một tập hữu hạn các bước lệnh đã được xác định theo
một thứ tự nhất định để theo đó máy tính có thể thực hiện được một cách
tự động nhằm mục đích giải một bài tốn hay một nhiệm vụ nào đó.
Thơng thường các lệnh ở các bước chính là các phép vào thơng tin, phép
xử lý hoặc ra thơng tin. Thuật tốn phải được thể hiện rõ ràng trong các
bước của nó và khi thuật tốn được thực hiện thơng qua dãy hữu hạn các
bước thì phải đảm bảo dừng và cho ra kết quà theo mong muốn của
người sử dụng.
Ví dụ 1.1.1: Viết thuật toán giải phương trinh bậc hai ax2+bx+c=0
(aoO)
Bước 1: Nhập các giá trị của 3 hệ số a, b, c
Bước 2: Nếu a=0 thì
2.1. u cầu đầu vào khơng đảm bảo.
2.2. Chuyển đến bước 4
Bước 3: Trường hợp a khác 0 thì
3.1. Tính giá trị D = b2 - 4ac
5
3.2. Nếu D > 0 thì
3.2.1. Phương trình có hai nghiệm phân biệt X] và x2
3.2.2. Giá fri của hai nghiệm được tính theo cơng thức sau
3.2.3. Chuyển đến bước 4.
3.3. Nếu D = 0 thì
3.3.1. Phương trình có nghiệm kép x0
3.3.2. Giá trị của nghiệm kép là
„ -b
x°~ 2a
3.3.3. Chuyển đến bước 4
3.4. Nếu D < 0 thì
3.4.1. Phương trình vơ nghiệm.
3.4.2. Chuyu. đến bước 4
Bước 4: Kết thúc
1.1.2. Tính chất của thuật tốn
Trong khn khổ giáo trình một số tính chất cơ bản sẽ được giới
thiệu bao gồm:
■ Tính xác định: Tính chất này có nghĩa là các bước của thuật tốn
phải rõ ràng, chính xác, khơng gây nên sự nhập nhằng, đa nghĩa. Thực
hiện đúng các bước của thuật tốn thì với một bộ dữ liệu vào, chỉ cho
duy nhất một bộ kết quả ra.
Ví dụ: Ở ví dụ giải phương trình bậc 2 nói trên, việc tính D = b2-4ac
và phân chia các trường hợp của D để đảm bảo rằng trong mọi trường
6
hợp của D thì thuật tốn ln có câu trả lời kết quả tương ứng (Có 2
nghiệm riêng biệt; có nghiệm kép; hay vơ nghiệm).
■ Tính dừng: Tính chất này có nghĩa là khi áp dụng thuật tốn cho
một bộ dữ liệu cụ thể thì sau hữu hạn bước thực hiện sẽ cho kết quà và
kết thúc.
Tính dừng là một trong các tính chất dễ bị vi phạm khi trình bày các
bước của thuật tốn. Điều đó có nghĩa là khi thực hiện hết các bước của
thuật toán, người sử dụng sẽ nhận được kết quả mong muốn. Tuy nhiên,
có những thuật tốn mà khi thực thi nó sẽ “chạy mãi khơng dừng” (hay
cịn gọi là “lặp vơ tận”) thì chúng sẽ được gọi là thuật tốn “vi phạm tính
dừng”.
Ví dụ: Viết thuật tốn để tính tổng các sổ ngun dương lẻ < n (n
nhập từ bàn phím). Thuật tốn như sau:
Bước 1. Nhập n.
Bước 2. s = 0
Bước 3. i = 0
Bước 4. Nếu i = n+1 thì sang Bước 8, ngược lại sang Bước 5
Bước 5. s=s+i
Bước 6. I=i+2
Bước 7. Quay lại bước Bước 4.
Bước 8. In ra s
Rõ ràng, thuật toán kết thúc khi giá trị của i vượt quá n, nhưng điều
kiện "i=n+l" không phải lúc nào cũng đạt được. Vì nếu n là số chẵn thì
n+1 là một số lẻ thì sau một số hữu hạn bước, i sẽ bằng n+1. Tuy nhiên,
nếu n là một số lẻ thì n+l là một số chẵn nên khơng đạt được i= n+1.
Hay nói cách khác thuật tốn sẽ không dừng.
7
■ Tính phổ dụng: Tính chất này có nghĩa ỉà thuật tốn khơng chỉ
giải cho một bài tốn mà giải cho một lớp các bài tốn và có thể làm việc
trên các dữ liệu khác nhau.
■ Tính đúng: Tính chất này có nghĩa là sau khi thực hiện tất cả các
bước của thuật tốn theo đúng trình tự, ta phải được kết quả mong muốn
với mọi bộ dữ liệu đầu vào. Kết quả đó được kiểm chứng bằng yêu cầu
của bài tốn.
■ Tính khả thi: Tính chất hày thể hiện ưên ba yêu cầu sau:
- Kích thước phải đủ nhỏ. Một thuật tốn sẽ có tính hiệu quả bằng 0
nếu lượng bộ nhớ mà nó yêu cầu vượt quá khà năng lưu trữ của hệ thống
máy tính.
- Thuật tốn phải được máy tính thực hiện trong thời gian cho phép.
Ví dụ như xếp thời khóa biểu thì khơng thể cho máy tính chạy lâu tới
mức mà việc xếp thời khóa biểu chỉ có thể áp dụng cho các kì tiếp theo.
- Thuật toán phải dễ hiểu và dễ cài đặt.
1.2. Sơ ĐỊ KHỐI
1.2.1. Khái niệm
Đổ thể hiện thuật tốn người ta có thể dùng nhiều phương pháp để
biểu diễn, ví dụ như cách viết ở trên (mục 1.1) được gọi là phương pháp
liệt kê theo các bước. Ngoài ra, một trong các phương pháp thể hiện thuật
toán thường được dùng là sơ đồ khối.
Vậy, sơ đồ khối là cách thể hiện thuật tốn bàng các hình khối hình
học nối với nhau bằng các đường đi có hướng. Ở đây, chúng ta quy ước
trong sơ đồ khối sử dụng các hình khối như sau:
8
Khối kiểm tra điều kiện
Hướng thực hiện
Khối vào ra
1.2.2. Các dạng cấu trúc cơ bản của sơ đồ khối
Sơ đồ khối thể hiện thuật toán thường được thể hiện ở 3 dạng cơ bản
như sau:
• Sơ đồ khối dạng tuần tự: Là sơ đồ khối thể hiện thuật toán gồm n
khối mà khi thực hiện thuật toán với một bộ dữ liệu cụ thể sẽ lần lượt
thực hiện từ khối đầu tiên đến khối cuối cùng theo thứ tự viết của nó.
• Sơ đồ khối dạng rẽ nhánh: Là sơ đồ khối thể hiện thuật toán gồm
n nhánh mà khi thực hiện thuật toán với một bộ dữ liệu cụ thể sẽ thực
hiện một trong n nhánh mà thơi.
1.2.3. Ví dụ
Ví dụ 1.2.1: Vẽ sơ đồ khối thể hiện thuật tốn để giải bài tốn giải
phương trình bậc hai nói trên.
9
Hình 1.1: Sơ đồ khối giải phương trình bậc hai ax2+bx+c=0 (aoO)
• Sơ đồ khối dạng chu trình: Là sơ đồ khối thể hiện thuật toán gồm n
khối mà khi thực hiện thuật toán với một bộ dữ liệu cụ thể sẽ có một số khối
lặp đi lặp lại nhiều lần phụ thuộc vào một điều kiện nào đó vẫn thỏa mãn.
Ví dụ 1.2.2: Cho một dãy A gồm N số nguyên khác nhau ab a2,
aN. Tìm và in ra chỉ số I và giá trị aj, mà ai chia hết cho k (k nguyên, và
nhập từ bàn phím) hoặc thơng báo khơng có số hạng nào của dãy A mà
chia hết cho k.
Trên thực tế, sơ đồ khối dùng để giải bài tốn nào đó có thể được sử
dụng một cách hỗn hợp với 3 dạng cơ bản nói trên. Nghĩa là trong sơ đồ
10;
khối, có thể đoạn khối này là tuần tự, đoạn khác là rẽ nhánh, và đoạn
khác nữa là chu trình, hoặc trong đoạn khối rẽ nhánh lại chứa đoạn khối
rẽ nhánh, hoặc trong đoạn khối chu trình lại chứa chu trình v.v...
Hình 1.2. Sơ đồ khối thể hiện bài tốn ờ ví dụ 1.2.2
11
Giả mã (Pseudo Code)
Mặc dù sơ đồ khối thể hiện rất rõ q trình xử lý Tuy nhiên, để có
thể chuyển hóa từ sơ đồ thành ngơn ngữ lập trình là việc khơng hề dễ
dàng. Vì thế, khi thể hiện thuật toán bằng cách thức giả lập mã, cách viết
này sẽ minh họa dưới dạng sử dụng các cú pháp của một ngơn ngữ lập
trình nào đó để thể hiện thuật toán. Điều này giúp cho việc vừa tận dụng
được các khái niệm trong ngơn ngữ lập trình, vừa giúp người cài đặt dễ
dàng nắm bắt nội dung thuật tốn.
Ví dụ một đoạn giả mã của thuật tốn giải phưig trình bậc hai
Neu delta > 0 thì làm các việc:
X1 =(-b-sqrt(delta))/(2 *a)
x2=(-b+sqrt(delta))/(2*a)
In ra màn hình: phương trình có hai nghiệm là X] và x2
Ngược lại
Neu delta = 0 thực hiện:
In ra kết quả: phương trình có nghiệm kép là -b/(2*a)
Ngược lại {delta < 0 }
In ra kết quả: phương trình vơ nghiệm
1.3. CHƯƠNG TRÌNH VÀ NGƠN NGỮ LẬP TRÌNH
1.3.1. Khái niệm chương trình
Chương trình là một tập hợp các lệnh để thể hiện một thuật toán giải
quyết một bài toán hay một nhiệm vụ nào đó. Trong đó, lệnh chính là
một chỉ thị cho máy tính để theo đó máy tính có thể thực hiện một cách
tự động.
Ví dụ như việc viết các dịng lệnh để máy tính có thể giải phương
trình bậc 2: ax2 + bx +c =0 (a#0) một cách tự động mà khơng cần có sự
can thiệp của con người trong quá trình xử lý.
12
1.3.2. Ngơn ngữ lập trình
Ngơn ngữ lập trình là ngơn ngữ để viết chương trình. Có nhiều loại
ngơn ngữ lập trình khác nhau mà sự liên quan của chúng phụ thuộc vào
kiến trúc và hoạt động của máy tính. Có thể phân chia chúng thành các
mức:
• Ngơn ngữ máy: Là ngơn ngữ chương trình được viết ở dưới dạng
nhị phân hoặc ở dạng hexa, mà máy tính có thể hiểu được một cách trực
tiếp và thực hiện được. Tuy nhiên, nó khơng thuận lợi cho con người
trong việc hiểu và viết chương trình.
• Họp ngữ: Là ngơn ngữ cấp thấp mà con người có thể sử dụng
được để viết chương trình. Điểm khơng thuận lợi của ngơn ngữ này là
chúng phụ thuộc chặt chẽ vào kiến trúc của máy tính.
• Ngơn ngữ lập trình bậc cao: Là ngơn ngữ mà câu lệnh của nó
gần gũi với ngơn ngữ tự nhiên. Chúng có tính độc lập, nghĩa là khơng
phụ thuộc vào một loại máy cụ thể nào. Ngơn ngữ lập trình phải bao gồm
các yếu tố sau đây:
• Tập các ký tự; Tập hợp từ vựng.
• Tập hợp các quy tắc ngữ pháp và quy tắc viết các lệnh.
Đối với các chương trình viết bằng họp ngữ hoặc ngơn ngữ lập trình
bậc cao thì chúng cần có một chương trình dịch tương ứng để dịch chúng
sang ngơn ngữ máy. Chương trình dịch cho hợp ngữ gọi là hợp dịch
(dịch từ ngôn ngữ cấp thấp ra ngôn ngữ máy). Để dịch chương trình viết
bằng ngơn ngữ lập trình bậc cao sang ngơn ngữ máy gồm có trình biên
dịch (dịch từ ngơn ngữ bậc cao sang ngôn ngữ cấp thấp) và hợp dịch
(dịch tiếp ra ngơn ngữ máy).
1.3.3. Quy trình giải bài tốn trên máy tính điện tử
Việc giải bài tốn trên máy tính điện tử thường được tiến hành qua
các bước sau đây:
13
• Bước 1: Xác định bài toán: Phải xác định mục đích của bài tốn,
xác định dữ liệu vào, xác định cách xử lý và dữ liệu đưa ra.
• Bước 2: Tìm cấu trúc biểu diễn bài tốn: Phải định nghĩa tập dữ
liệu để mô tả, biểu diễn các thông tin của bài tốn cũng như các thao tác
có thể thực hiện trong thuật tốn. Đây là bước khơng thể tách rời bước
tìm kiếm thuật tốn để giải quyết vấn đề.
• Bước 3: Tìm thuật tốn để giải bài tốn.
• Bước 4: Lập trình giải bài tốn: Chọn ngơn ngữ lập trình thích hợp
để thể hiện thuật tốn thành chương trình.
• Bước 5: Thử nghiệm chương trình: Thực hiện chương trình với
những bộ dữ liệu giả định và đánh giá kết quả.
• Bước 6: Tối ưu chương trình. Một chương trình chạy đúng khơng
có nghĩa là việc lập trình đã xong mà cần phải sửa đổi một số chi tiết để
chương trình có thể chạy nhanh hơn, hiệu quả hơn.
1.3.4. Đánh giá chất lưựng chương trình
về cơ bản một chương trình được đánh giá thơng qua các yếu tố sau:
• Chất lượng output: Tùy thuộc vào yêu cầu của người sử dụng mà
kết quả thu được của chương trình phải thỏa mãn về các yêu cầu này (tối
ưu nhất có thể được).
• Thuật tốn: Thuật tốn của chương trình phải càng được đơn giản
càng tốt, vì nếu thuật tốn q phức tạp dẫn đến việc gây khó khăn trong
việc kiểm thử (nếu chương trình bị lỗi khi thực thi).
• Thời gian thực hiện: Càng nhanh càng tốt
• Tiết kiệm bộ nhớ: Mặc dù vấn đề bộ nhớ không phải là yêu cầu
hàng đầu bong thời đại công nghệ bộ nhớ được cải thiện nhiều như hiện
nay. Tuy nhiên, một chương trình mà sử dụng lãng phí bộ nhớ cũng
khơng được coi là tối ưu, nhất là khi kĩ thuật xử lí qua mạng, tốc độ kết
nối, tải, duyệt,... là một bong những ưu tiên hàng đầu hiện nay.
14
1.4. CÁC PHƯƠNG PHÁP LẬP TRÌNH
Có hai phương pháp lập trình cơ bàn như sau:
1.4.1. Lập trình hướng thủ tục
Phương pháp này còn được biết đến là cách thực hiện phương pháp
hướng chức năng. Phương pháp hướng thủ tục chia một chương trình
(chức năng) lớn thành các khối chức năng hay hàm (thủ tục) đủ nhỏ để
dễ lập trình và kiểm ưa.
Trong một hệ thống chương trình, cạc biến có các phạm vi mà nó có
thể hoạt động nhất định. Dữ liệu hoạt động độc lập và được chuyển đổi
qua lại thơng qua các tham số gọi hàm.
1.4.2. Lập trình hướng đối tưựng
Là kĩ thuật lập trình hỗ ượ cơng nghệ đối tượng. Nghĩa là việc tổ
chức chương trình được xây dựng dựa ưên các đối tượng mà nó cần xử
lý. Những đổi tượng ưong một ngơn ngữ lập trình hướng đôi tượng là các
két hợp giữa mã và dữ liệu mà chúng được nhìn nhận như là một đơn vị
duy nhất. Mỗi đối tượng có một tên riêng biệt và tất cả các tham chiếu
đến đối tượng đó được tiến hành qua tên của nó. Như vậy, mỗi đối tượng
có khả năng nhận vào các thơng báo, xử lý dữ liệu (bên ưong của nó), và
gửi ra hay ưả lời đến các đối tượng khác hay đến môi trường. Nghĩa là
lập ưình hướng đối tựợng cho phép phân tích bài toán thành các thực thể
được gọi là đối tượng và sau đó xây dựng các dữ liệu cùng các hàm xung
quanh các đối tượng đó. Các đối tượng có thể tác động, frao đổi thông tin
với nhau thông qua cơ chế thông báo (message) thông qua các phương
thức (hàm).
?
1.5. KỸ THUẬT THIÉT KÉ CHƯƠNG TRÌNH
1.5.1. Kỹ thuật thiết kế trên xuống (top-down design)
Kỹ thuật này chính là cách thiết kế chương trình mơ tả cách thức giải
quyết bài tốn theo chiến lược “chia để trị” và phương pháp tinh chỉnh
15
từng bước. Đó là cách phân tích tổng qt tồn bộ vấn đề, xuất phát từ dữ
kiện và các mục tiêu đặt ra, để đề ra những công việc chủ yếu, rồi sau đó
mới đi dần vào giải quyết các phần cụ thể một cách chi tiết hơn. Vì vậy,
ban đầu giải thuật được trình bày bằng ngơn ngữ tự nhiên, phản ánh ý
chính của cơng việc cần làm. Từ các bước sau, các ý đó sẽ được chi tiết
hóa dần dần tương ứng với các công việc nhỏ hơn mà ta gọi đó là các
bước tinh chỉnh. Sự tinh chỉnh này sẽ hướng đến bước cuối cùng là đặc tà
các ý, các chi tiết đó bằng các câu lệnh của ngơn ngữ lập trình để tạo
thành chương trình hồn chỉnh.
1.5.2. Kỹ thuật chương trình con (lập trình cấu trúc)
Một chương trình con thường được viết mã sao cho nó có thể được
chạy (hay được gọi) nhiều lần từ nhiều nơi trong chương trình lớn hơn,
thậm chí có thể được gọi bởi chính nó. Việc sử dụng họp lý chương trinh
con sẽ dẫn đến việc giảm đáng kể kích thước và chi phí của một chương
trình, đồng thời nâng cao tính dễ đọc và độ tin cậy của chương trình. Các
chương trình con hay sử dụng cịn được tập trung thành các thư viện
chương trình để có thể chia sẻ và tái sử dụng mã nhiều lần.
1.5.3. Kỹ thuật đệ quỵ
Là kỹ thuật mà chia các bài toán thành các bài tốn đơn giản hơn
cùng loại. Trong lập trình, một chương trình con (hàm, thủ tục) được gọi
là đệ qui nếu trong q trình thực hiện nó có phần phải gọi đến chính nó.
Thơng thường một chương trình con đệ qui cơ bản gồm hai phần:
• Phần cơ sở: Phần này chứa các tác động của hàm hoặc thủ tục với
một số giá trị cụ thể ban đầu của tham số;
• Phần đệ qui: Phần này định nghĩa các tác động cần được thực
hiện cho giá trị hiện thời của các tham sổ bằng các tác động dẫ được định
nghĩa trước đây với kích thước tham số nhỏ hơn.
16
Chương 2
CÁC THÀNH PHÀN cơ SỞ
Tổng quan về ngôn ngữ lập trình c
c là ngơn ngữ lập trình được thiết kế bởi Dennis Ritchie tại phịng
thí nghiệm Bell Telephone 1972 và được viết ra với mục tiêu xây dựng
hệ điều hành UNIX. Vì vậy, ban đầu nó khơng hướng tới sự tiện dụng
cho người lập trình. Ngơn ngữ c được phát triển trên nền ngôn ngữ B (là
ngôn ngữ được viết bời Ken Thompson tại Bell labs). cỏ thể nói, c là
ngơn ngữ mạnh, mềm dẻo, linh hoạt và nó nhanh chóng trở thành một
ngơn ngữ phổ biến khơng chi trong phạm vi cùa Bell. Hơn thế nữa, c đã
được các lập trình viên sử dụng để viết nhiều loại ứng dụng ở các mức độ
khác nhau.
Cũng chính vì ngơn ngữ c được sử dụng ở nhiều nơi, nên các phiên
bản phát triển ngôn ngữ c là không thống nhất. Đổ giải quyết vấn đề này,
vào năm 1983, viện tiêu chuẩn Mĩ (ANSI) đã thiết lập một chuẩn và hoàn
thành năm 1989, gọi là chuẩn ANSI-C (ANSI Standard C) dành riêng
cho ngơn ngữ c. Nói chung các chương trình dịch c hiện nay đều tuân
theo chuẩn này ngoại trừ một số ít điểm khác biệt nhỏ.
Nhìn chung ngơn ngữ c ngày nay được phổ biến bởi vì nó có các
đặc điểm sau:
• c là ngơn ngữ mạnh, mềm dẻo, đặc biệt phù hợp trong các bài tốn
lập trình hệ thống, hệ điều hành, đồ họa, chương trình dịch v.v...
• c có tính linh hoạt: Tức là nếu ngơn ngữ c được viết trên một hệ
thống này thì chúng có thể dễ dàng dịch lại và chạy lại trên một hệ
thống khác.
• c là ngơn ngữ cơ đọng vì số lượng từ khóa khơng nhiều (32 từ
khóa chuẩn).
17
• c là ngơn ngữ lập trình cấu trúc định kiểu mạnh: Chương trình
gồm các hàm 1 mức, khơng có thủ tục, khơng có định nghĩa hàm này
ữong hàm kia. Trừ khai báo biến, mọi câu lệnh, biểu thức, phép tốn đều
phải thực hiện ứong một hàm nào đó. Các hàm của c có thể được sử
dụng lại khơng chỉ trong một chương trình mà ở cả các chương trình khác.
2.1. CÁC U TĨ Cơ BẢN CỦA NGƠN NGỮ LẬP TRÌNH
2.1.1. Bảng chữ cái (Bộ ký tự)
Bộ kí tự mà c sử dụng là các ký tự trong bộ kí tự ASCII 256 kí tự.
Đó là:
• Chữ cái: A—> z, a->z
• Dấu gạch nối: _
• số: 0 -> 9
• Các dấu phép tốn số học: 4-, -, *, / ...
• Các cặp dấu ngoặc (){}[]
Mỗi kí tự tương ứng với một số nguyên duy nhất gọi là mã, trong đó
có 128 kí tự đầu (mã từ 0 tới 127) là kí tự cố định và 128 kí tự cịn lại
(mã từ 128 tới 255) là các kí tự mở rộng, tức là nó có thể thay đổi tùy
theo ngơn ngữ của mỗi quốc gia sử dụng.
2.1.2. Từ khóa
Mỗi một ngơn ngữ đều có một tập các từ riêng với ý nghĩa đặc biệt
của nó. Đó cịn gọi là tập từ khóa. Tập các từ khóa được dùng cho mục
đích định trước như tên kiểu dữ liệu, tên toán tử v.v...
Sau đây là danh sách tất cả các từ khóa của ANSI c chuẩn:
Auto
Int
Break
long
registered
Case
18
Char
return
Const
short
Continue
signed
Default
sizeof
Do
static
Double
struct
Else
switch
Enum
typedef
Extern
union
Float
unsigned
For
void
Goto
volatile
If
while
2.1.3. Ten ggi
Be dinh danh cac yeu td dugc su dung trong cac ngon ngtr nhu bien,
hang, ham,... chung se dugc ddt ten thong qua cac quy tdc dat ten. Ten la
mgt day cac ky tu dat canh nhau bao gom cac chu cai, chu so, dau gach
ndi _ va thuong dugc dat mang tinh chat ggi nhd gdn lien vdi chuc ndng
cua no. Trong ngon ngu C, ten dugc dat theo cac quy tdc sau:
• Ten chi dugc chua cac chu cai, chu so va diu gach ndi _.
• Ten phai bat ddu bang chu cai hodc ddu gach ndi
• Khong dugc trung vdi tu khoa
• Phan bi?t gitra chu hoa va chu thuong. Vi dy, ten bien “HANOI”
khac vdi biAn “Hanoi” hay “hanoi”.
• Do dai toi da cua ten mac dinh la 32
19
2.1.4. Chú thích
Mỗi khi viết chương trình, người lập trình nên viết thêm lời chú
thích để cho dễ hiểu và làm sáng sủa chương trình. Các chú thích này chi
có ý nghĩa giải thích, làm rõ nghĩa cho một câu lệnh nào đó và được trình
biên dịch bỏ qua khi dịch chương trình. Để chú thích, nội dung của nó
được đặt nằm giữa cặp ký hiệu mở /* và cặp ký hiệu đóng */. Ví dụ: /*
Đây là phần chú thích */. Lời chú thích có thể viết băng tiếng Việt một
cách thoải mái.
Trong c, hoặc c++ lời chú thích fren một dịng có thể nằm sau hai
dấu gạch chéo //, khơng có ký hiệu đóng lại. Mỗi cặp ký hiệu // chỉ có giá
trị trên một dịng.
Ví dụ:
// Đây là lời chú thích 1
// Đây là lời chú thích 2
2.1.5. Các kiểu dữ liệu CO’ sở
Trong biểu diễn thông tin, các thông tin phải được tổ chức trong máy
theo một cấu trúc xác định nào đó và gọi là kiểu dữ liệu. Mỗi một kiểu
dữ liệu sẽ có một miền giá trị xác định nào đó, và thơng tin về một kiểu
dữ liệu phải có:
• Tên kiêu
• Miền giá trị của nó
• Vùng nhớ nó được cấp phát
• Các phép tốn trên nó.
Có hai loại kiểu dữ liệu được thể hiện trong C đó là: kiểu dữ liệu cơ
sở và kiểu dữ liệu có cấu trúc. Trước hết, chúng ta đi tìm hiểu về các kiểu
dữ liệu cơ sở trong C.
20
2.1.5.1. Nhóm các kiểu số nguyên
Nhóm các kiểu nguyên gồm có: char, int, short, long. Mỗi kiểu trong
các kiểu này lại được chia nhỏ thành các dạng nhỏ hon là unsigned hay
signed (khơng dấu hay có dấu) - xem bàng sau:
Kiểu
dữ liệu
Tên
kiểu
Kích
thước
Miền
giá trị
Kí tự có dấu
(signed) char
Kí tự khơng dấu
Unsigned char IB
0->255
Số nguyên có dấu
int
2B
-215 -> 215 - 1
Sổ nguyên khơng dấu
unsigned int
2B
0->216-l
Sổ ngun ngắn có dấu
short
2B
-215 ->215- 1
IB
-128->127
Sổ ngun ngắn khơng dấu unsigned short 2B
0->216-l
Số ngun dài có dấu
long
-231 -> 231 - 1
Số nguyên dài không dấu
unsigned long 4B
4B
0-> 232-l
2.1.5.2. Kiểu kí tự - char
Kiểu kí tự (Char) được dùng để biểu diễn các thông tin được coi là
các kí tự. Đối với dữ liệu có kiểu kí tự, về bản chất cũng được hệ thống
quy định bởi một giá ưị nguyên để biểu diễn. Tuy nhiên, về mặt hình
thức, kiểu char dùng để biểu diễn các kí tự chứ khơng phải là các số. Ví
dụ như kí tự A sẽ có mã là 65. Khi biên dịch, nếu trình biên dịch biết
được nó đang dịch một đối tượng có kiểu kí tự, có mã là 65 thì trình biên
dịch sẽ hiểu là đang làm việc với kí tự A.
Như bảng ưên, cỏ hai loại kiểu kí tự là signed char và unsigned
char. Tuy nhiên, khi khai báo thường chỉ cần viết là char. Khi đó trình
biên dịch sẽ tự hiểu đó là signed char, có miền giá trị từ -128->127
21
Phân loại:
• Nhóm các kí tự điều khiển: Các kí tự điều khiển khi in ra sẽ khơng
có mã xuất hiện trên màn hình mà nó thực thi một lệnh điều khiển của
chương trình. Ví dụ như mã 10 là lệnh xuống dịng.
• Nhóm các kí tự văn bàn: Nhóm mã này sẽ cho các kí tự hiện lên
màn hình. Ví dụ như ‘a’ có giá trị 97, cịn ‘A’ có giá trị 65. Chú ý, c quy
định khi viết một kí tự phải đặt chúng trong cặp ‘ ’
• Nhóm các kí tự đồ họa: Nhóm này dùng để hiện lên trên màn hình
các kí tự đồ họa đơn giàn, ví dụ: Hình A có mã 127.
2.1.5.3. Kiểu số nguyên
Kiểu số nguyên dùng để biểu diễn các dữ liệu tốn học, phục vụ cho
các phép tính như cộng, trừ, nhân, chia lấy dư, chia lấy phần nguyên
v.v... Thông tin dữ liệu kiểu nguyên có thể tham khảo ở bảng frên.
Khuôn dạng của số nguyên: Như ta đã biết, một bit thì biểu diễn
được hai giá ưị là 0 và 1. Vậy một nhóm có 2 bít (2 số nhị phân) thì có
thể lưu được giá frị nhỏ nhất là 00 và lớn nhất là 11. Có nghĩa là nó có
thể lưu được các giá trị là 0, 1, 2, 3 trong hệ cơ số 10 tức là 22 giá trị khác
nhau. Với số nguyên 1B (28) tức là unsigned char thì giá trị của nó sẽ lưu
là 0, 1, 2, ..., 255. Tổng qt nếu dữ liệu có kích thước n bit thì có thể
biểu diễn được 2" giá trị khác nhau: 0, 1,2, ..., 2n-l (trường hợp tất cả
các bit đều dùng để biểu diễn số). Nó ứng với unsigned char, unsigned
iht, unsigned short và unsigned long.
Đối với số nguyên âm: Trong trường hợp này bit cao nhạt được dùng
làm bit dấu. Vậy chỉ còn n-1 bit để biểu diễn giá trị. Nếu là số âm, bit cao
nhất này mang giá trị 1, cịn ngược lại thì mang giá frị 0. Ví dụ với kiểu
char (chính là signed char), kích thước của nó là 1B, tức là có 7 bit để
biểu diễn các con số. Vậy nó biểu diễn các số dương 0, 1 ,2, ..., 127 và
cảc sổ âm là -1, -2....... -128. Miền giá trị của các kiểu dữ liệu khác cũng
iằm việc theo cơ chế tương tự như vậy.
22
Chú ý. Đối với kiểu dữ liệu nguyên và có miền giá trị short hoặc
int: Tùy theo hệ thống đang sử dụng và chuẩn mà bộ chương trình dịch
đang tuân theo, có thể qui định short và int cùng có vùng nhớ được cấp
phát là 2B hay kiểu short là 2B cịn kiểu int là 4B.
2.1.5.4. Nhóm các kiểu sổ thực
Khuôn dạng của kiểu thực không giống như khuôn dạng của kiểu số
nguyên. Một số thực nói chung được biểu diễn theo ký pháp khoa học
bao gồm phần định trị và phần mũ:
±
•
e± ,
Định trị
Mũ
Chính vì khn dạng khác mà miền giá trị của số thực so với số
nguyên có cùng kích thước cũng khác nhau. Các kiểu dữ liệu thực dùng
để biểu diễn các số thực được thể hiện dưới đây:
2.1.5.5. Kiểu thực
Dữ liệu kiểu thực dùng để biểu diễn các số có giá trị lớn hơn phạm
vi số nguyên có thể biểu diễn được. Mặt khác nó có thể biểu diễn được
các số thập phân.
Bảng các kiểu dữ liệu sổ thực:
Kiểu dữ liệu
Tên kiểu
Kích Miền giá trị
thước
Số thực với độ chính xác đơn
float
4B
3.4e'38 -> 3.4e38
Số thực với độ chính xác kép
double
8B
1.7e'308 -> 1.7e308
ÌOB
S^e^l.le4932
Số thực dài với độ chính xác kép long double
Trong bảng trên, mỗi kiểu dữ liệu được biểu diễn miền giá trị có giá
trị dương lớn nhất và số âm nhỏ nhất bằng số dương lấy đối. Đồng thời
23
nó cũng cho biết giá trị dương nhỏ nhất cỏ thể phân biệt được với số 0.
Ví dụ kiểu float có giá trị dương lớn nhất là 3.4 e‘38, giá trị dương nhỏ
nhất là 3.4 e’38 và giá trị âm nhỏ nhất là -3.4e38. Tuy nhiên, do số chữ sổ
phần định trị là giới hạn nên kiểu float thường lấy 7-8 chữ số, kiểu
double lấy 15 chữ sổ và kiểu long double là 18-19 chữ số.
2.1.5.6. Kiểu void
Kiểu void hay cịn gọi là kiểu dữ liệu khơng xác định. Nếu một biến
đối tượng có kiểu void (ví dụ biến x), thì ta gọi đó là biến khơng định
kiểu. Nói chung, dữ liệu kiểu void ít gặp đối với các bài toán cơ sở mà
chủ yếu gặp ứong kiểu giá trị trả về của hàm.
Chú ý. Một số công cụ hỗ trợ lập trình c hiện đại như Dev-cpp, MS
Visual c, nếu người lập trình khai báo hàm main có kiểu void, trình biên
dịch sẽ khơng chấp nhận. Vì thế khuyến khích người viết chương trình
khai báo hàm main có kiểu int.
2.1.6. Các đại lưựng
2.I.6.I. Hằng
Hăng là đại lượng có giá trị khơng thay đổi trong q trình tỉnh tốn.
Có hai loại hằng là hằng khơng có tên, nó mang giá trị bình thường tức
thời như là: 8, 15.7 hay ‘a’. Loại thứ hai là hằng có tên. Sau này gọi
chung là hằng.
Khai báo của hằng có tên:
const <kiểu_dữ_liệu> <tên_hằng> - <giá_trị>;
Trong đó:
const: Từ khóa khai báo hằng
kiễu_dữ_liệu: kiểu dữ liệu của hằng, do người dùng định nghĩa hoặc
theo kiểu có sẵn
tên_hằng: Tên của hằng đặt theo qui tắc đặt tên
giá_trị: Giá trị của hằng.
24