Để thực hiện được điều này, n ă m 1970 Thomcon đã xây d ự ng một ngôn ngữ hệ thống thông dịch với tên gọi là ngôn ngữ B... C.ÍÌC iiíìà iTip trinh của hệ thống trên... • Một ưu điếm thứ h
Trang 1H 9 C n Ệ H KỸ THUẬT QU&N s ự KHOA CÔNG NGHỆ THDNG TIN
Trang 2HOC VIÊN KỶ THUẬT QUÀN sự
KHOA C Ô N G NGHÊ THÔNG TIN
Trang 3MỜ ĐÀU
c.’ó t h ể nói ngôn ngữ c ỉà một ngôn ngừ "không t r u y ề n
th ố n g ” theo sự p h á t sinh và q u á t r i n h p h á t t r i ể n của mình Lịch sử phát tr i ể n của ngôn ngữ c được gắn liền với hệ điều
hành UNIX Đến lượt minh hệ điều hành U N I X lại liên quan chặt chẽ đến một hệ điều h àn h khác - hệ điều hành M U L T I C S ,
một hệ điều hành với sự phân chia thời gian Hệ điều hành
M Ư L T Ỉ C S là kết quả hợp tá c của A T & T Bell Laboratories, General Electric và M assachusetts Institute o f Techonology Trên
thực t ế nguyên m ẫu của hệ thống M Ư L T Ĩ C S đã đáp ứng được như cầu đặt ra n h ư n g lại tỏ ra chưa th u ậ n tiện và khó khăn tro n g việc sừ dụng Đây là một tro n g các nguyên n h ân để A T
iSi T đình chị không tiếp tục phát tr i ể n hệ thố n g hơn nữa Ảnh
h ư ở n g bởi ý tư ở n g đ ầ u tiê n củ a M Ư L T Ỉ C S , K en T h o m c o n -
m ột tro n g n h ữ n g người th a m gia thiết kế hệ th ố n g này đã xây dựng một hệ điều h à n h khác, mà một tro n g n h ữ n g điều khác
biệt với M Ư L T Ỉ C S là sự th u ậ n tiện và dễ d àn g tro n g khi sử dụng Hệ điều h à n h này là phiên bản đàu tiên của U N I X và được Thomcon v iế t t r ê n n g ô n ngữ A ssemblly d à n h cho m á y
P D P - 7 vào n á m 1969 Mặc dù hệ điều h à n h này ban đầu còn chưa cho phép làm việc t r o n g chế độ đa người sử dụng nhưng
nó đã tỏ r a có hiệu quả, t h u ậ n tiện và xứng đáng được p hát
t r i ể n t r ê n n h ữ n g m áy tính điện tử khác Để thực hiện được điều này, n ă m 1970 Thomcon đã xây d ự ng một ngôn ngữ hệ
thống (thông dịch) với tên gọi là ngôn ngữ B Khi xây dựng
ngỏn ngữ này, ông đã x u ấ t p h á t từ một ngôn ngữ khác - ngôn
ngừ BCPL được viết vào n ă m 1969 bởi M artin Richards Với hệ thông dịch này hệ điều h à n h U N I X đã được đư a sang máy vi tính PDP-11 vào n ả m 1971 T rong cùng giai đoạn này, Dennis
Ritchie - một n h à lập trìn h nổi tiếng đâ th a m gia vào tậ p th ể
Trang 4C.ÍÌC iiíìà iTip trinh của hệ thống trên N ăm 1972 Dennis Ritchie
cùng cac cộng sự đã phát triển ngôn ngữ B th à n h ngôn ngữ c
B à n g cách này cặp U N I X - c đã tỏ rõ nh ừ n g khả n ă n g hiếm
có của minh trong kỹ th u ậ t ìập trình Với ngôn ngữ c hệ điêu
h à n h Ư N ĨX đã được xây dựng vào n ãm 1973 và được xem như
hệ điều h à n h tương thích (Portable Operating System ) đa người
sử dụng N ă m 1975 phiên bản thứ 6 của hệ điều h à n h U N I X
b ắ t đầu được phổ biến rộng ,rãi Một điểm đặc biệt cần lưu ý là
h ầ u như toàn bộ hệ điều h ành UNIX, bao gồm các t r i n h điều
k h iể n thiết bị, trình biên dịch c đều được viết tr ê n ngòn ngữ
c T r o n g thời gian này ngôn ngủ c cũng b ắ t đ ầ u được phổ
b iế n và b án t r ê n th ị trư ờ n g Cho đ ến n ã m 1978 khi B rian
K e r n íg h a n v à D e n n is R i t c h i e ch o x u ấ t b ả n c u ố n T h e c
P r o g r a m m in g L anguage thi có thể xem như c chính th ứ c được
r a đời
C ùng v-ới sự ra đời và phát tr i ể n của kỹ t h u ậ t vi m ạ ch (các
hệ vi xử lý 8080 và Z80) nhiều trình biên dịch của c đã ra đời
và p h à n nào đã đáp ứ ng được nhu cầu của thực t ế về tốc độ,
k h ả n ă n g biên dịch v.v Ngày nay tối thiểu t a có th ể đếm được
đ ến 17 trìn h biên dịch c đang thực sự phổ biến tr ê n thị trư ờn g PC
Ngôn ngừ c đang là một trong các ngôn ngừ được đ á n h giá cao tr ê n thực t ế do nhiều nguyên nhân:
• Khả n ă n g tương thích trên nhiều loại máy khác n hau có
t h ể xem là ưu điểm được quảng cáo nhiều n h ấ t của ngôn ngữ
c Một chương trình được viết tu â n thủ theo các nguyên tác
c ủ a c và t r á n h sử d ụ n g các đặc tính mở rộng của một thư viện phụ thuộc trỉn h biên dịch đặc biệt, cd t h ể được xem như
m ộ t c h ư ơ n g t r ì n h có k h ả n ă n g t h à n h công n h iề u n h ấ t khi
m a n g s a n g sử d ụ n g t r o n g các môi trư ờ n g tr i n h biên dịch/hệ điều h à n h máy tính khác Đây là một đặc tính được đ á n h giá
n g à y càng cao của ngôn ngữ c
Trang 5• Một ưu điếm thứ hai của c lã sự súc tích và cô đọng của
ngồn ngữ Cú pháp của ngôn ngử c ban đàu rất đơn giản và
chi d ự a trê n 27 từ khóa Điều này làm cho ngôn ngữ có t h ể được p h á t t r i ể n và thực hiện một cách dễ d à n g ở trê n má}^ tính lớn và máy vi tính
• Ngôn ngữ c đưa ra những khả n ă n g cao cho lập trỉn h có cáu t r ú c , một cơ cấu truyền đạt, tru y ề n thông (Comniunication)
t h u ậ n tiện giữa các đơn vị chương trìn h khác nhau, khả n ă n g biên dịch độc lập, tính đệ qui v.v
• c còn được chú ý đến là do hiệu quả của \iệc kết sinh
mã (Code Generation) Điều này bắt nguồn từ việc ngôn ngữ c
đi s á t với cấu trú c ký ức và th a n h ghi của phần cứng, yếu tố nià dỉựa trê n ngôn ngữ được thiết k ế và phát triển Người ta
t h ư ờ n g x em c n h ư là m ộ t n g ô n n g ừ cấp cao n h ư P a s c a l ,
F o r t r a n v.v bởi sự th u ậ n tiện khi sử dụng và phương pháp lập t r ì n h có cấu trúc của nó Tuy vậý ngoài n h ừ ng chức n ă n g bậc c a o đó, c lại cho phép thực hiện nhiều công việc ở "mức
thấp'" n h ư n g ô n ngữ Assembly Các c h u y ê n gia đã t h ố n g kê được r ằ n g cổ đến 90% các trư ờng hợp có t h ể sử dụng ngôn ngữ
c thỉay t h ế cho ngôn ngữ Assembly, n h ấ t là trong các lỉnh vực liên iquan đến p hần cứng và các bài toán điều khiển Điều đó chứriig tỏ r ằ n g với các khả n ăng của một ngôn ngữ bậc cao, c
cd thiể đ ạ t đến kết quả đặc t r ư n g cho ngôn ngữ Assembly tr o n g
điều kiện t h u ậ n tiện, dễ d à n g hơn khi xây d ự n g và sửa đổi chươmg trỉnh
Miặt dù hiện nay trê n thị tr ư ờ n g đã tồn tại nhiều tài liệu viết về ngôn ngữ c nhưng có t h ể noi tài liệu này được biên soạn theo m ộ t pho n g cách khác h ẳ n Một t r o n g n h ữ n g đặc
trưngỊ đd là t í n h hệ thống, d ầ y đủ và được xây dựng theo mức
độ tĨẨ/ tháp đến cao và do đó có t h ể được sử dụng bởi nhiều đối
tượnịg với trìn h độ và khả n ă n g lập tr ì n h khác nhau
Cáic khái niệm và kiến thức tr o n g tài tiệư được minh họa với
5
Trang 6nhiều ví dụ, chương trình khác nhau Các ví dụ được t r i n h bày theo m ột ý tưởng thông nhất: mô tà các vấn đề đặt ra các dcìi lượng cần sử dụng tro n g chương trỉnh, giới thiệu t h u â t toán
(nếu càn), Listing của chương trình, giải thích v.v T r ê n thực
t ế k h ả n ãng lập trin h không th ể tách rời khỏi thực h à n h nên
c h ú n g tôi đề nghị các bạn nghiên cứu kỹ các ví dụ được đưa ra
T r o n g tà i liệu có sử d ụ n g các t h u ậ t ngữ và các ký hiệu
c h u ẩ n được công n h ậ n và phổ biến c hính thức trong các tài
liệu viết về ngôn ngữ c Các khái niệm và kiến thức về ngôn
n g ữ c được đư a r a tro n g tài liệu này m a n g ý nghĩa chung nià
k h ô n g phụ thuộc vào các khả n ă n g r i ê n g biệt của tùng loại
m á y khác nhau
H iệ n nay, tr ê n thực t ế đ a n g phổ biến n hiề u trỉnh biên dịch
c a o c ấ p được sử d ụ n g t r o n g môi t r ư ờ n g D O S và VHndoivs
n h ư n g n h ữ n g vấn đề được đư a r a tro n g tài liệu là những kiến
th ứ c b ạn không t h ể thiếu khi tiến tới làm việc vối nhửrg phiên
b ả n cao cấp của ngôn ngừ c
Chúc các bạn th à n h công.
6
Trang 7C h ư o n g I
NHỮNG KHÁI NIỆM CO BẢN CỦA NGÔN NGỮ c
T r o n g lỉnh vực tin học có một câu n gạn ngữ rấ t bổ ích d à n h cho c.ác bạn m uốn đi sâu vào kỹ th u ậ t lập trỉnh: "Máy tính chỉ thực h iệ n n h ữ n g điều m à con người mong muốn" C h ín h vì vậy đ ể m áy tín h thực hiện được n h ữ n g điều bạn muốn, b ạ n phải chi th ị chính xác các thông tin cho máy Thông th ư ờ n g các t h ô n g tin được đưa vào máy thông qua một chương tr ì n h viết b à n g m ộ t ngòn ngữ lập t r ì n h nào đó Để đạt được điềunày người lập tr ỉ n h phải nám chác nhữ ng khái niệm cơ bản,
n h ữ n g nguyên tá c lập trìn h của ngôn ngữ Một chương tr ì n h được tạo r a bao gồm các chỉ thị (các lệnh của máy) n h ằ m thự c hiện m ộ t m ục đích nào đó và thường được thiết lập d ự a t r ê n
cơ sở của m ộ t t h u ậ t toán đã lập trước T h u ật toán này diễn tảcác h à n h động khác nhau để đi đến mục đích cuối cùng
Chương I đ ư a Ị3 nh ữ n g khái niệm cơ bản của ngôn ngữ c -
h ằ n g số, chú giải, các kiểu dữ liệu, m ả n g và khởi tạo dữ liệu Trong chương này củng đưa r a n h ữ n g thông tin chung n h ấ t về hàm, cấu tr ú c và cách thực hiện một chương trìn h viết b à n g ngôn ngừ c Để thuậ n tiện cho việc theo dõi các ví dụ tr o n g chương trình, tr o n g phần này chúng tôi xin giới thiệu m ộ t số
h àm kết x u ấ t th ồ n g tin vào ra thường được sử dụng - p r in tf,
scanf, getchar N hững bạn đã cd ít nhiều kinh nghiệm tr o n g lập
trình c cd t h ể bỏ qua chương này n h ư n g chác chán r ằ n g m ộ t lúc nào đd b ạn cũng sẽ cần th a m khảo một số thông tin ở đây
Việc náni vữ ng các ký hiệu cơ bản của ngôn ngữ là điều đ àu tiên không t h ể bỏ qua đối với n h ữ n g ai muốn đi vào lĩnh vực
Trang 8lập trin h Các ký hiệu cơ bản bao gồm n h ữ n g ký tự cho phép dùng, tro n g ngôn ngữ như chữ cái số và tổ hợp các ký tự khác Ngôn ngừ c sử dụng một số ký tự sau:
- 52 chữ cái in thường, in hoa và ký tự gạch nối:
ký hiệu hay tập hợp các ký hiệu được đ ặt ở cuối dòng hiện thời
và cổ tá c dụng di chuyển con trỏ xuống đ ầu dòng sau Chu giải
được đ ư a vào chương trìn h nhầm mục đích giải thích th ê m cho
c hư ơng trình được rõ rà n g hơn và sẽ được đề cập chi tiết trong
p h ầ n 1.6.
T r o n g c có m ột số từ được dùng riêng gọi là các từ khđa Các từ này được d ù n g để viết và xây dựng các toán lệnh của
c h ư ơ n g trình Cần chú ý rằ n g trong c các từ này luôn được
v iế t với các chữ t h ư ờ n g và không được d ù n g chúng cho các
m ụ c đích riêng như đ ậ t tên cho các biến, các hàm
Các từ khóa tro n g c chuẩn bao gôm
Trang 91.2 H Ằ N G SỐ
H à n g số là các thông tin được đưa vào chương trình và có
gia trị k h ông đổi tro n g quá trình thực hiện chương trình H ằ n g riố baơ gôm các số hoặc dãv ký tự cđ giá trị không đổi Tồn tại
3 loại h ằ n g trong C: h ằ n g số học, hằng ký tự và h ằ n g kiểu chuỗi
Ịĩỉínỉỉ sỏ' học được p h â n ìàni h a i ỉoại: h à n g số n g u y ê n và hầ%g s6 thực Giá trị của các hằng này b ằng giá trị của các số
mà c h ú n g biểu diễn
Hang sff nguyên có t h ể được biểu díển dưới d ạng cơ số 10, cơ
số 8 và cơ sô 16
Các h ằ n g cơ số 10 có t h ể là số dương hoặc số âm Dấu của
hằng được viết trước số đó, trong trư ờ n g hợp số dương, d ấu có
t h ể được bỏ qua Cần chú ý J à k h ố n g dươc d ù n g sô' 0 n hư là chừ số đầu tiê n của hảng s ổ_nguyen
Ví dụ 1.1
+ 14 - H ằn g số nguyên dương cd giá trị là 14;
-12 - H àng số nguyên âm cd giá trị là -12;
012 - Không phài là số nguyên dương
Các hằng số nguyên cơ số 8 được viết không _có (Mu b ằ n g
c ác chữ số sử dụng trong hệ đếm cơ số 8 - các số từ 0 đến 7
C h ữ số đầu tiên trong trường hợp này phải là số 0 Đây chính
l à nguyên n h â n không cho phép sử d ụ n g số 0 như là chừ số điầư tiên của h ằ n g cơ số 10
Ví dụ 1.2
014 - Hằng cơ số 8 với giá trị 12 (cơ số 10);
0114 - Hằng cơ số 8 với giá trị 76 (cơ số 10);
Các hằng số nguyên cơ số 16 được viết không có d ấ u và
9
Trang 10luôn bát đầu bởi o x hoặc Ox Trong hệ dếin cơ số 16 người ta dùng các 30 từ 0 đến 9 Ngoài ra các số từ A đến F hoặc từ o đến f không phân biệt chữ thường hay chừ viết hoa biểu diền
các số t ừ ^"0"“đến 15
Ví dụ 1.3
o x c hoặc Oxc - H àn g cơ số 16 cd giá trị 12 (cơ số 10);
OXFF hoặc Oxff - H àn g cơ số 16 có giá trị 255 (cơ số 10);
Thông thư ờng các hằng số nguyên được lưu t r ử vào 2 byte của máy tính Các hằng này có t h ể n h ậ n các giá trị nguyên tro n g khoảng -32768 đến +32767 Trong trường hợp chúng ta muốn sử d ụ n g các h ằ n g sổ với giá trị ở ngoài khoảng này ta
cần biểu diễn chúng bằng kiểu long (4 byte) 0 d ạ n g này sau giá t r ị của các số t a p h ải đ ặ t th ê m ký tự L h a y vi dụ:
-50000L, -40000L, OXFEOOL Thực r a cách biểu diễn này sẽlàm cho chương trìn h được viết trở t h à n h rõ r à n g hơn, trong trư ờn g hợp h ằ n g số cd giá trị vượt q u á giá trị cho phép xihưng
không được biểu diễn bằng kiểu long máy sẽ tự động chuyển
chúng về kiểu này
Hăng số thục là một loại h ằ n g số học khác dùng để biểu diễn
các số thực cổ giá trị không đổi và Qhi được viết dưới d ạ i g cơ
số 10 Một h ằ n g só thực c d t h ể được vTết dưới dạng thập phân hay sổ mũ
Ví dụ 1.4
12.0 - H ằn g sô' thực dương có giá trị là 12.0;0.123 - H ằn g số thực dương có giá trị là 0.123;-12.15 - H ằn g số thực âm có giá trị là -12.15.Các h ằ n g số thực có giá trị r ấ t lớn hay r ấ t nhỏ được biểu
diễn dưới d ạng cơ số mũ
' U i
I
Trang 11Vi d u 1.5
1 2E1 hoặc 1.2el H ằng số thực với giá trị 12;
120E- hoặc e- 1 - H ằ n g số thực với giá trị 12;
0.123E2 - H ằ n g số thực với giá trị 12.3
Hấỉìỉỉ ký tư bao gòni các ký tự đơn được viết trong dấu nháy đơn,
vị dụ Mỗi ký tự có giá trị bàng mã A S C ĨI của nố ímã
ASCỈI là số thứ tự tương ứng của ký tự trong bảng mà ASCĩĩ) ví
dụ theo bảng này ’A ’ có giá trị là 65 và ’0 ’ có giá trị là 48
Một ký tự cd t h ể được biểu diễn bằng 2 cách: bằng tên của
ký tự và b ằ n g mã A S C ĩ ỉ của kv tự Chẳng hạn để niô tả hằng
ký tự A t a có t h ể viết ’A’ hoặc ’Ịổ5’ Càn chú ý r ằ n g m ã
A S C I Ỉ tr o n g trư ờng hợp này phải được viết sau dấu \ và cũng
phải đ ậ t tro n g dấu nháy
Khi sử d ụ n g h ằ n g ký tự t a củng phải chú ý đến sự khác
biệt giữa h ằ n g số học và h ằng ký tự Một hằng số học có giá
trị bằng giá trị của số mà nđ biểu diễn, trong khi hằng ký tự
có giá trị bằng mã A S C I I của nó v í dụ h ằng số 0 cd giá trị là
0 còn h àng ký tự ' 0 ’ có giá trị là 48.
Hăriịĩ kiều chuỗi là một dãy ký tự liên tục đưỢc đ ặ t trong
dấu nháy kép", ví dụ "This is a s t r i n g ” là một h ằ n g kiểu chuỗi
Độ dài của h ằ n g kiểu chuỗi (số lượng các ký tự trong chuỗi) là không h ạn chế và cố t h ể chỉ chứa một ký tự hoặc không chứa bất cứ ký tự nào Trong quá tr ì n h biên dịch, sau ký tự cuổi cùng của h ằ n g kiểu chuỗi, trỉn h biên dịch tự động đ ặt thêm
một byte cd giá trị là 0 (N U LL ) Để phân biệt với ký tự Byte này được viết dưới d ạ n g ' \ 0 \ N h ư vậy ký tự này được
dùng để xác định vị trí cuối cùng của chuỗi
Các ký tự dùng riêng (là n h ữ n g ký tự không in ra được) có
th ể được sử dụng như nh ữ n g ký tự bình thường nh ư n g trước chúng phải đặt ký tự \ Chẳng hạpi ký tự \ cd t h ể được sử dụng trong chuỗi nếu viết \\ ' \ ,
11
Trang 12Ví dụ 1.6
"\\ví dụ ve \"hầng chuỗi kiểu chuỗi 1" trong c\\" sẽ b iể u diễn
cho h àng kiểu chuỗi \vi dụ ve "hằng kiểu chuỗi" trong Ci được
viết tro n g chương trình
H ằ n g kiểu chuỗi được lưu trữ trong bộ nhớ của m á y tính như là một m ả n g một chiều với phần tử cuối c ù n g là \0 do trình biên dịch tự động đưa vào Như vậy số phần' tử c ủ a m ảng luôn lớn hơn 1 so với số ký tự của chuỗi
0 đâv ta củng phải chú ý r ằ n g cd sự khác biệt giữa h ằng ký
tự và chuỗi ký tự, chẳng h ạn ’A ’ và "A" Sự khác biệt này được xác định ở chỗ xâu ký tự "A" có t h ể được xem n h ư là một
12
Trang 13Mả ký tự \ooo được dùng để biểu diễn một ký tự trong bảng
A S C Ĩ Ỉ Dằng các số trong hệ đếm cơ số 8 Trong trường hỢp
ký tự C h ẳn g hạn h ằng kiểu chuỗi "{ABCD}" có thể được viết dưới d ạ n g "\173ABC\175\
Việc sử dụng các ký tự đậc biệt trong bảng L ỉ sẽ được giải
thích cụ t h ể frong các phần sau của giáo trình Ngoài các ký
tự này, t ấ t cả các ký tự khác sẽ không thay đổi ý nghĩa của
c h ú n g n ếu được viết sau ký tự \ Nói cách khác Ví’ có th ể được
viết dưới d ạng ' \ k \
1.3 B IẾ N
T ấ t cả các chương trình được viết tro n g máv tính đều nhằm mục đích cuối cùng là xử lý thông tin N h ữ n g thông tin có giá trị k h ông đổi trong suốt quá trình thực hiện chương trỉnh được
biểu diễn q u a các h ằng (phân 1.2) Các thông tin m à giá trị có
t h ể th a v đổi được gọi là biến.
Biến là một đại lượng thuộc một kiểu nhất, định (số nguyêri,
số thực v.v m à giá trị của nd cd th ể th a y đổi trong quá trinh thực hiện chương trình Giá trị của biến được sử dụng thông
q u a tên của biến Thực ra biến là một ô ký ức (hoặc một số ô
kv ức) trong bộ nhớ dùng đ ể lưu trữ giá trị tức thời của nó Bởi vì t ấ t cả các ô kỹ ức của bộ nhớ đều có một địa chỉ n h ấ t
định, do đó việc sử d ụ n g tê n của một biến hoàn to à n đồng
n h ấ t với việc truy nhập m ột địa chỉ tr o n g bộ nhớ và giá trị chứ a trong địa chỉ đó
Khi đặt tên cho biến càn phải thông q u a các quy tác sau:
1 Tên bao gồm một dãy các chữ cái và số và phải b ắt đầu
b ằ n g chữ cái Có th ể dùng ký tự gạch dưới (_) để đ ặ t tên cho
biến, ví dụ h o j e n là một tê n cho phép Cũng cần lưu ý rằng
độ dài của các tên biến cũng phải hạn c h ế và điều đđ hoàn
to à n phụ thuộc vào các trìn h biên dịch khác nhau
13