Giáo trình Kỹ thuật lập trình C - Trường Đại học Hàng Hải

BỘ GIAO THÔNG VẬN TẢI  
TRƢỜNG ĐẠI HỌC HÀNG HẢI  
́ ́  
BỘ MÔN: KHOA HOC MAY TINH  
̣
KHOA: CÔNG NGHỆ THÔNG TIN  
BÀI GIẢNG  
KỸ THUẬT LẬP TRÌNH C  
TÊN HỌC PHẦN : KỸ THUẬT LẬP TRÌNH C  
MÃ HỌC PHẦN : 17206  
TRÌNH ĐỘ ĐÀO TẠO : ĐẠI HỌC CHÍNH QUY  
DÙNG CHO SV NGÀNH : CÔNG NGHỆ THÔNG TIN  
HẢI PHÕNG - 2008  
MỤC LỤC  
2
 
11.6. Tên học phần: Kỹ thuật lập trình (C)  
Bộ môn phụ trách giảng dạy: Khoa học Máy tính  
Mã học phần: 17206  
Loại học phần: 2  
Khoa phụ trách: CNTT  
Tổng số TC: 4  
TS tiết Lý thuyết Thực hành/Xemina Tự học Bài tập lớn  
Đồ án môn học  
75  
45  
30  
0
0
0
Điều kiện tiên quyết:  
Sinh viên phải học xong các học phần sau mới đƣợc đăng ký học phần này:  
Tin đại cƣơng, Toán rời rạc, Đại số, Giải tích 1.  
Mục tiêu của học phần:  
Cung cấp cho sinh viên kiến thức và rèn luyện kỹ năng lập trình dựa trên ngôn ngữ lập  
trình C  
Nội dung chủ yếu  
- Những vấn đề cơ bản về ngôn ngữ lập trình C.  
- Cách thức xây dựng một chƣơng trình dựa trên ngôn ngữ lập trình C.  
- Các vấn đề về con trỏ, file và đồ họa trong C  
Nội dung chi tiết của học phần:  
PHÂN PHỐI SỐ TIẾT  
TS LT TH/Xemina BT  
TÊN CHƢƠNG MỤC  
Chƣơng 1: Giới thiệu  
KT  
2
2
0
1.1. Giới thiệu ngôn ngữ lập trình C.  
1.1.1. Xuất xứ của ngôn ngữ lập trình C.  
1.1.2. Trình biên dịch C và cách sử dụng.  
1.2. Thuật toán và sơ đồ khối  
Chƣơng 2. Các khái niệm cơ bản về ngôn ngữ C  
2.1. Các phần tử cơ bản của ngôn ngữ lập trình C.  
2.2. Cấu trúc chung của chƣơng trình C  
2.3. Các bƣớc cơ bản khi lập chƣơng trình  
2.4. Các kiểu dữ liệu cơ sở  
8
4
4
2.5. Các khai báo trong chƣơng trình C  
2.6. Biểu thức  
2.7. Các hàm toán học  
Chƣơng 3. Các câu lệnh điều khiển của C  
3.1. Lệnh gán giá trị, lệnh gộp  
3.2. Hàm viết dữ liệu ra màn hình  
3.3. Hàm nhập dữ liệu vào từ bàn phím  
3.4. Câu lệnh điều kiện  
13  
7
5
1
3.5. Câu lệnh lựa chọn  
3.6. Câu lệnh lặp for  
3.7. Câu lệnh lặp while  
3.8. Câu lệnh do…while.  
3.9. Câu lệnh break.  
3.10. Lệnh continue  
3.11. Toán tử goto và nhãn (label)  
Chƣơng 4. Hàm  
14  
8
6
4.1. Khái niệm về chƣơng trình con  
4.2. Hàm trong C  
4
PHÂN PHỐI SỐ TIẾT  
TÊN CHƢƠNG MỤC  
4.3. Chuyển tham số cho hàm  
TS LT TH/Xemina BT  
KT  
4.4. Biến toàn cục và biến địa phƣơng  
4.5. Tính đệ quy của hàm  
4.6. Đối dòng lệnh của hàm  
4.7. Một số hàm đặc biệt  
Chƣơng 5. Mảng và kiểu dữ liệu có cấu trúc  
5.1. Dữ liệu kiểu mảng/con trỏ  
5.1.1. Mảng 1 chiều và nhiều chiều  
5.1.2. Con trỏ và địa chỉ  
21  
12  
8
1
5.1.3. Liên hệ giữa mảng và con trỏ  
5.1.4. Con trỏ và hàm  
5.2. Dữ liệu kiểu xâu ký tự. Liên hệ giữa con trỏ và  
xâu ký tự  
5.3. Dữ liệu kiểu bản ghi  
5.4. Một số ví dụ tổng hợp  
Chƣơng 6. File  
6.1. Khái niệm.  
6.2. Cấu trúc và phân loại tệp.  
6.3. Tạo tệp mới để đọc / ghi dữ liệu.  
6.4. Một số hàm xử lý tệp của C.  
6.5. Bài tập áp dụng  
Chƣơng 7. Đồ hoạ trong C  
7.1. Giới thiệu chung  
10  
7
5
4
4
3
1
7.2. Các hàm đặt màu, vẽ điểm, tô màu  
7.3. Các hàm vẽ hình cơ bản  
Nhiệm vụ của sinh viên :  
Tham dự các buổi thuyết trình của giáo viên, tự học, tự làm bài tập do giáo viên giao,  
tham dự các bài kiểm tra định kỳ và cuối kỳ.  
Tài liệu tham khảo:  
1. Phạm Văn Ất, Kỹ thuật lập trình C - Cơ sở và nâng cao, NXB KHKT, 1998.  
2. Quách Tuấn Ngọc, Ngôn ngữ lập trình C, NXB GD, 1998.  
3.  
Hình thức và tiêu chuẩn đánh giá sinh viên:  
Một  
số  
website  
liên  
quan:  
Hình thức thi cuối kỳ : Thi vấn đáp trên máy tính, thời gian làm bài 45 phút  
Sinh viên phải đảm bảo các điều kiện theo Quy chế của Nhà trƣờng và của Bộ  
Thang điểm: Thang điểm chữ A, B, C, D, F  
Điểm đánh giá học phần: Z = 0,3X + 0,7Y.  
Bài giảng này là tài liệu chính thức và thống nhất của Bộ môn Khoa học máy tính,  
Khoa Công nghệ thông tin và đƣợc dùng để giảng dạy cho sinh viên.  
Ngày phê duyệt:  
/
/20  
Trƣởng Bộ môn: ThS. Nguyễn Hữu Tuân (ký và ghi rõ họ tên)  
5
CHƢƠNG 1. GIỚI THIỆU  
1.1. Giới thiệu ngôn ngữ lập trình C.  
1.1.1. Xuất xứ của ngôn ngữ lập trình C.  
Khoảng cuối những năm 1960 đầu 1970 xuất hiện nhu cầu cần có các ngôn ngữ bậc cao để hỗ  
trợ cho những nhà tin học trong việc xây dựng các phần mềm hệ thống, hệ điều hành. Ngôn  
ngữ C ra đời từ đó, nó đã đƣợc phát triển tại phòng thí nghiệm Bell. Đến năm 1978, giáo trình  
" Ngôn ngữ lập trình C " do chính các tác giả của ngôn ngữ là Dennish Ritchie và B.W.  
Kernighan viết, đã đƣợc xuất bản và phổ biến rộng rãi.  
C là ngôn ngữ lập trình vạn năng. Ngoài việc C đƣợc dùng để viết hệ điều hành UNIX,  
ngƣời ta nhanh chóng nhận ra sức mạnh của C trong việc xử lý cho các vấn đề hiện đại của tin  
học. C không gắn với bất kỳ một hệ điều hành hay máy nào, và mặc dầu nó đã đƣợc gọi là "  
ngôn ngữ lập trình hệ thống" vì nó đƣợc dùng cho việc viết hệ điều hành, nó cũng tiện lợi cho  
cả việc viết các chƣơng trình xử lý số, xử lý văn bản và cơ sở dữ liệu.  
1.1.2. Trình biên dịch C và cách sử dụng..  
A. Turbo C (TC)  
1. Giới thiệu chung TC  
Khởi động C cũng nhƣ mọi chƣơng trình khác bằng cách nhấp đúp chuột lên biểu tƣợng của  
chƣơng trình. Khi chƣơng trình đƣợc khởi động sẽ hiện ra giao diện gồm có menu công việc  
và một khung cửa sổ bên dƣới phục vụ cho soạn thảo. Một con trỏ nhấp nháy trong khung cửa  
sổ và chúng ta bắt đầu nhập nội dung (văn bản) chƣơng trình vào trong khung cửa sổ soạn  
thảo này. Mục đích của giáo trình này là trang bị những kiến thức cơ bản của lập trình thông  
qua NNLT C cho các sinh viên mới bắt đầu nên chúng tôi vẫn chọn trình bày giao diện của  
các trình biên dịch quen thuộc là Turbo C hoặc Borland C. Về các trình biên dịch khác độc  
giả có thể tự tham khảo trong các tài liệu liên quan.  
Để kết thúc làm việc với C (soạn thảo, chạy chƣơng trình ...) và quay về môi trƣờng Windows  
chúng ta ấn Alt-X.  
2. Giao diện và cửa sổ soạn thảo của TC  
a. Mô tả chung  
Khi gọi chạy C trên màn hình sẽ xuất hiện một menu xổ xuống và một cửa sổ soạn thảo. Trên  
menu gồm có các nhóm chức năng: File, Edit, Search, Run, Compile, Debug, Project,  
Options, Window, Help. Để kích hoạt các nhóm chức năng, có thể ấn Alt+chữ cái biểu thị  
cho menu của chức năng đó (là chữ cái có gạch dƣới). Ví dụ để mở nhóm chức năng File ấn  
Alt+F, sau đó dịch chuyển hộp sáng đến mục cần chọn rồi ấn Enter. Để thuận tiện cho NSD,  
một số các chức năng hay dùng còn đƣợc gắn với một tổ hợp các phím cho phép ngƣời dùng  
có thể chọn nhanh chức năng này mà không cần thông qua việc mở menu nhƣ đã mô tả ở trên.  
Một số tổ hợp phím cụ thể đó sẽ đƣợc trình bày vào cuối phần này. Các bộ chƣơng trình dịch  
hỗ trợ ngƣời lập trình một môi trƣờng tích hợp tức ngoài chức năng soạn thảo, nó còn cung  
cấp nhiều chức năng, tiện ích khác giúp ngƣời lập trình vừa có thể soạn thảo văn bản chƣơng  
trình vừa gọi chạy chƣơng trình vừa gỡ lỗi … Các chức năng liên quan đến soạn thảo phần  
lớn giống với các bộ soạn thảo khác (nhƣ WinWord) do vậy chúng tôi chỉ trình bày tóm tắt  
mà không trình bày chi tiết ở đây.  
b. Các chức năng soạn thảo  
Giống hầu hết các bộ soạn thảo văn bản, bộ soạn thảo của Turbo C hoặc Borland C cũng sử  
dụng các phím sau cho quá trình soạn thảo:  
− Dịch chuyển con trỏ: các phím mũi tên cho phép dịch chuyển con trỏ sang trái, phải một kí  
tự hoặc lên trên, xuống dƣới 1 dòng. Để dịch chuyển nhanh có các phím nhƣ Home (về đầu  
6
   
dòng), End (về cuối dòng), PgUp, PgDn (lên, xuống một trang màn hình). Để dịch chuyển xa  
hơn có thể kết hợp các phím này cùng phím Control (Ctrl, ^) nhƣ ^PgUp: về đầu tệp, ^PgDn:  
về cuối tệp.  
− Chèn, xoá, sửa: Phím Insert cho phép chuyển chế độ soạn thảo giữa chèn và đè. Các phím  
Delete, Backspace cho phép xoá một kí tự tại vị trí con trỏ và trƣớc vị trí con trỏ (xoá lùi).  
− Các thao tác với khối dòng: Để đánh dấu khối dòng (thực chất là khối kí tự liền nhau bất  
kỳ) ta đƣa con trỏ đến vị trí đầu ấn Ctrl-KB và Ctrl-KK tại vị trí cuối. Cũng có thể thao tác  
nhanh hơn bằng cách giữ phím Shift và dùng cácphím dịch chuyển con trỏ quét từ vị trí đầu  
đến vị trí cuối, khi đó khối kí tự đuợc đánh dấu sẽ chuyển mầu nền. Một khối đƣợc đánh dấu  
có thể dùng để cắt, dán vào một nơi khác trong văn bản hoặc xoá khỏi văn bản. Để thực hiện  
thao tác cắt dán, đầu tiên phải đƣa khối đã đánh dấu vào bộ nhớ đệm bằng nhóm phím Shift-  
Delete (cắt), sau đó dịch chuyển con trỏ đến vị trí mới cần hiện nội dung vừa cắt và ấn tổ hợp  
phím Shift-Insert. Một đoạn văn bản đƣợc ghi vào bộ nhớ đệm có thể đƣợc dán nhiều lần vào  
nhiều vị trí khác nhau bằngcách lặp lại tổ hợp phím Shift-Insert tại các vị trí khác nhau trong  
văn bản. Để xoá một khối dòng đã đánh dấu mà không ghi vào bộ nhớ đệm, dùng tổ hợp phím  
Ctrl-Delete. Khi một nội dung mới ghi vào bộ nhớ đệm thì nó sẽ xoá (ghi đè) nội dung cũ đã  
có, do vậy cần cân nhắc để sử dụng phím Ctrl-Delete (xoá và không lƣu lại nội dung vừa xoá  
vào bộ đệm) và Shift-Delete (xoá và lƣu lại nội dung vừa xoá) một cách phù hợp.  
− Tổ hợp phím Ctrl-A rất thuận lợi khi cần đánh dấu nhanh toàn bộ văn bản.  
c. Chức năng tìm kiếm và thay thế  
Chức năng này dùng để dịch chuyển nhanh con trỏ văn bản đến từ cần tìm. Để thực hiện tìm  
kiếm bấm Ctrl-QF, tìm kiếm và thay thế bấm Ctrl-QA. Vào từ hoặc nhóm từ cần tìm vào cửa  
sổ Find, nhóm thay thế (nếu dùng Ctrl-QA) vào cửa sổ Replace và đánh dấu vào các tuỳ chọn  
trong cửa sổ bên dƣới sau đó ấn Enter. Các tuỳ chọn gồm: không phân biệt chữ hoa/thƣờng,  
tìm từ độc lập hay đứng trong từ khác, tìm trong toàn văn bản hay chỉ trong phần đƣợc đánh  
dấu, chiều tìm đi đến cuối hay ngƣợc về đầu văn bản, thay thế có hỏi lại hay không hỏi lại …  
Để dịch chuyển con trỏ đến các vùng khác nhau trong một menu hay cửa sổ chứa các tuỳ  
chọn ta sử dụng phím Tab.  
d. Các chức năng liên quan đến tệp  
− Ghi tệp lên đĩa: Chọn menu File\Save hoặc phím F2. Nếu tên tệp chƣa có (còn mang tên  
Noname.cpp) máy sẽ yêu cầu cho tên tệp. Phần mở rộng của tên tệp đƣợc mặc định là CPP.  
− Soạn thảo tệp mới: Chọn menu File\New. Hiện ra cửa sổ soạn thảo trắng và tên file tạm thời  
lấy là Noname.cpp.  
− Soạn thảo tệp cũ: Chọn menu File\Open hoặc ấn phím F3, nhập tên tệp hoặc dịch chuyển  
con trỏ trong vùng danh sách tệp bên dƣới đến tên tệp cần soạn rồi ấn Enter. Cũng có thể áp  
dụng cách này để soạn tệp mới khi không nhập vào tên tệp cụ thể.  
− Ghi tệp đang soạn thảo lên đĩa với tên mới: Chọn menu File\Save As và nhập tên tệp mới  
vào rồi ấn Enter.  
e. Chức năng dịch và chạy chương trình  
− Ctrl-F9: Khởi động chức năng dịch và chạy toàn bộ chƣơng trình.  
− F4: Chạy chƣơng trình từ đầu đến dòng lệnh hiện tại (đang chứa con trỏ)  
− F7: Chạy từng lệnh một của hàm main(), kể cả các lệnh con trong hàm.  
− F8: Chạy từng lệnh một của hàm main(). Khi đó mỗi lời gọi hàm đƣợc xem là một lệnh  
(không chạy từng lệnh trong các hàm đƣợc gọi). Các chức năng liên quan đến dịch chƣơng  
trình có thể đƣợc chọn thông qua menuCompile (Alt-C).  
f. Tóm tắt một số phím nóng hay dùng  
− Các phím kích hoạt menu: Alt+chữ cái đại diện cho nhóm menu đó. Ví dụ Alt-F mở menu  
File để chọn các chức năng cụ thể trong nó nhƣ Open (mở file), Save (ghi file lên đĩa), Print  
(in nội dung văn bản chƣơng trình ra máy in), … Alt-C mở menu Compile để chọn các chức  
năng dịch chƣơng trình.  
− Các phím dịch chuyển con trỏ khi soạn thảo.  
− F1: mở cửa sổ trợ giúp. Đây là chức năng quan trọng giúp ngƣời lập trình nhớ tên lệnh, cú  
7
pháp và cách sử dụng.  
− F2: ghi tệp lên đĩa.  
− F3: mở tệp cũ ra sửa chữa hoặc soạn thảo tệp mới.  
− F4: chạy chƣơng trình đến vị trí con trỏ.  
− F5: Thu hẹp/mở rộng cửa sổ soạn thảo.  
− F6: Chuyển đổi giữa các cửa sổ soạn thảo.  
− F7: Chạy chƣơng trình theo từng lệnh, kể cả các lệnh trong hàm con.  
− F8: Chạy chƣơng trình theo từng lệnh trong hàm chính.  
− F9: Dịch và liên kết chƣơng trình. Thƣờng dùng chức năng này để tìm lỗi cú pháp của  
chƣơng trình nguồn trƣớc khi chạy.  
− Alt-F7: Chuyển con trỏ về nơi gây lỗi trƣớc đó.  
− Alt-F8: Chuyển con trỏ đến lỗi tiếp theo.  
− Ctrl-F9: Chạy chƣơng trình.  
− Ctrl-Insert: Lƣu khối văn bản đƣợc đánh dấu vào bộ nhớ đệm.  
− Shift-Insert: Dán khối văn bản trong bộ nhớ đệm vào văn bản tại vị trí con trỏ.  
− Shift-Delete: Xoá khối văn bản đƣợc đánh dấu, lƣu nó vào bộ nhớ đệm.  
− Ctrl-Delete: Xoá khối văn bản đƣợc đánh dấu (không lƣu vào bộ nhớ đệm).  
− Alt-F5: Chuyển sang cửa sổ xem kết quả của chƣơng trình vừa chạy xong.  
− Alt-X: thoát C về lại Windows.  
B. Dev C  
C. Visual C++  
1.2. Thuật toán và sơ đồ khối  
Khái niệm: thuật toán hay giải thuật dùng để chỉ phƣơng pháp hay cách thức  
(method) để giải quyết vấn đề.  
Sơ dồ khối: sử dụng các khối để biểu diễn thuật toán  
Bài tập:  
1. Vẽ sơ đồ khối giải thuật giải phƣơng trình bậc nhất ax+b=0  
2. Vẽ sơ đồ khối giải thuật giải bất phƣơng trình bậc nhất ax+b>0  
3. Vẽ sơ đồ khối giải thuật giải phƣơng trình bậc hai ax2+bx+c=0  
4. Vẽ sơ đồ khối giải thuật tìm ƣớc số chung lớn nhất của 2 số nguyên dƣơng  
5. Vẽ sơ đồ khối giải thuật tìm số nhỏ nhất của 2 số  
8
 
CHƢƠNG 2. CÁC KHÁI NIỆM CƠ BẢN VỀ NGÔN NGỮ LẬP TRÌNH C  
2.1. Các phần tử cơ bản của ngôn ngữ lập trình C.  
2.1.1. Tập ký tự dùng trong ngôn ngữ C  
Mọi ngôn ngữ lập trình đều đƣợc xây dựng từ một bộ ký tự nào đó. Các ký tự đƣợc  
nhóm lại theo nhiều cách khác nhau để tạo nên các từ. Các từ lại đƣợc liên kết với nhau theo  
một qui tắc nào đó để tạo nên các câu lệnh. Một chƣơng trình bao gồm nhiều câu lệnh và thể  
hiện một thuật toán để giải một bài toán nào đó. Ngôn ngữ C đƣợc xây dựng trên bộ ký tự sau  
:
-
-
-
-
-
-
26 chữ cái hoa : A B C .. Z  
26 chữ cái thƣờng : a b c .. z  
10 chữ số : 0 1 2 .. 9  
Các ký hiệu toán học : + - * / = ( )  
Ký tự gạch nối : _  
Các ký tự khác : . , : ; [ ] {} ! \ & % # $ ...  
Dấu cách (space) dùng để tách các từ. Ví dụ chữ VIET NAM có 8 ký tự, còn  
VIETNAM chỉ có 7 ký tự.  
Chú ý : Khi viết chƣơng trình, ta không đƣợc sử dụng bất kỳ ký tự nào khác ngoài các ký tự  
trên. Ví dụ nhƣ khi lập chƣơng trình giải phƣơng trình bậc hai ax2 +bx+c=0 , ta cần tính biệt  
thức Delta = b2 - 4ac, trong ngôn ngữ C không cho phép dùng ký tự , vì vậy ta phải dùng  
ký hiệu khác để thay thế.  
2.1.2. Từ khoá:  
Từ khoá là những từ đƣợc sử dụng để khai báo các kiểu dữ liệu, để viết  
các toán tử và các câu lệnh. Bảng dƣới đây liệt kê các từ khoá của TURBO C :  
asm  
break  
const  
double  
far  
case  
cdecl  
default  
enum  
for  
char  
continue  
else  
do  
extern  
goto  
float  
huge  
long  
if  
int  
interrupt  
register  
sizeof  
tipedef  
volatile  
near  
pascal  
signed  
switch  
void  
return  
static  
union  
while  
short  
struct  
unsigned  
ý nghĩa và cách sử dụng của mỗi từ khoá sẽ đƣợc đề cập sau này, ở đây ta cần chú ý :  
- Không đƣợc dùng các từ khoá để đặt tên cho các hằng, biến, mảng, hàm ...  
9
   
- Từ khoá phải đƣợc viết bằng chữ thƣờng, ví dụ : viết từ khoá khai báo kiểu nguyên  
là int chứ không phải là INT.  
2.1.3. Tên: Tên là một khái niệm rất quan trọng, nó dùng để xác định các đại lƣợng khác nhau  
trong một chƣơng trình. Chúng ta có tên hằng, tên biến, tên mảng, tên hàm, tên con trỏ, tên  
tệp, tên cấu trúc, tên nhãn,...  
Tên đƣợc đặt theo qui tắc sau: Tên là một dãy các ký tự bao gồm chữ cái, số và gạch nối. Ký  
tự đầu tiên của tên phải là chữ hoặc gạch nối. Tên không đƣợc trùng với khoá. Độ dài cực đại  
của tên theo mặc định là 32 và có thể đƣợc đặt lại là một trong các giá trị từ 1 tới 32 nhờ chức  
năng : Option-Compiler-Source-Identifier length khi dùng TURBO C.  
Ví dụ :Các tên đúng : a_1  
delta x1  
3MN  
_step GAMA  
Ký tự đầu tiên là số  
Các tên sai:  
m#2  
f(x)  
do  
Sử dụng ký tự #  
Sử dụng các dấu ( )  
Trùng với từ khoá  
Sử dụng dấu trắng  
Sử dụng dấu -  
te ta  
Y-3  
Chú ý: Trong TURBO C, tên bằng chữ thƣờng và chữ hoa là khác nhau ví dụ tên AB khác  
với ab. Trong C, ta thƣờng dùng chữ hoa để đặt tên cho các hằng và dùng chữ thƣờng để đặt  
tên cho hầu hết cho các đại lƣợng khác nhƣ biến, biến mảng, hàm, cấu trúc. Tuy nhiên đây  
không phải là điều bắt buộc.  
2.2. Cấu trúc chung của chƣơng trình C  
Một chƣơng trình C có thể đƣợc đặt trong một hoặc nhiều file văn bản khác nhau. Mỗi file  
văn bản chứa một số phần nào đó của chƣơng trình. Với những chƣơng trình đơn giản và  
ngắn thƣờng chỉ cần đặt chúng trên một file.  
Một chƣơng trình gồm nhiều hàm, mỗi hàm phụ trách một công việc khác nhau của chƣơng  
trình. Đặc biệt trong các hàm này có một hàm duy nhất có tên hàm là main(). Khi chạy  
chƣơng trình, các câu lệnh trong hàm main() sẽ đƣợc thực hiện đầu tiên. Trong hàm main() có  
thể có các câu lệnh gọi đến các hàm khác khi cần thiết, và các hàm này khi chạy lại có thể gọi  
đến các hàm khác nữa đã đƣợc viết trong chƣơng trình (trừ việc gọi quay lại hàm main()). Sau  
khi chạy đến lệnh cuối cùng của hàm main() chƣơng trình sẽ kết thúc.  
Cụ thể, thông thƣờng một chƣơng trình gồm có các nội dung sau:  
− Phần khai báo các tệp nguyên mẫu: khai báo tên các tệp chứa những thành phần có sẵn (nhƣ  
các hằng chuẩn, kiểu chuẩn và các hàm chuẩn) mà NSD sẽ dùng trong chƣơng trình.  
− Phần khai báo các kiểu dữ liệu, các biến, hằng ... do NSD định nghĩa và đƣợc dùng chung  
trong toàn bộ chƣơng trình.  
− Danh sách các hàm của chƣơng trình (do NSD viết, bao gồm cả hàm main()). Cấu trúc chi  
tiết của mỗi hàm sẽ đƣợc đề cập đến trong chƣơng 4.  
Dƣới đây là một đoạn chƣơng trình đơn giản chỉ gồm 1 hàm chính là hàm main().  
Nội dung của chƣơng trình dùng in ra màn hình dòng chữ: Chào các bạn, bây giờ là 2giờ.  
#include <stdio.h>// khai báo tệp nguyên mẫu để đƣợc sử dụng hàm printf, scanf  
void main()  
10  
 
{
int h = 2; // Khai báo và khởi tạo biến h = 2  
printf( “Chào các bạn, bây giờ là %d giờ”,h) ;// in ra màn hình  
}
Dòng đầu tiên của chƣơng trình là khai báo tệp nguyên mẫu stdio.h. Đây là khai báo bắt buộc  
vì trong chƣơng trình có sử dụng hàm chuẩn printf() (in ra màn hình), hàm này đƣợc khai báo  
và định nghĩa sẵn trong stdio.h.  
Không riêng hàm main(), mọi hàm khác đều phải bắt đầu tập hợp các câu lệnh của mình bởi  
dấu { và kết thúc bởi dấu }. Tập các lệnh bất kỳ bên trong cặp dấu này đƣợc gọi là khối lệnh.  
Khối lệnh là một cú pháp cần thiết trong các câu lệnh có cấu trúc nhƣ ta sẽ thấy trong các  
chƣơng tiếp theo.  
Vậy nói tóm lại cấu trúc cơ bản của chƣơng trình nhƣ sau :  
Các #include  
Các #define  
Khai báo các đối tƣợng dữ liệu ngoài ( biến, mảng, cấu trúc vv..).  
Khai báo nguyên mẫu các hàm.  
Hàm main().  
Định nghĩa các hàm ( hàm main có thể đặt sau hoặc xen vào giữa các hàm khác  
).  
2.3. Các bƣớc cơ bản khi lập chƣơng trình  
2.3.1. Qui trình viết và thực hiện chƣơng trình  
Trƣớc khi viết và chạy một chƣơng trình thông thƣờng chúng ta cần:  
1. Xác định yêu cầu của chƣơng trình. Nghĩa là xác định dữ liệu đầu vào (input) cung cấp cho  
chƣơng trình và tập các dữ liệu cần đạt đƣợc tức đầu ra (output).Các tập hợp dữ liệu này ngoài  
các tên gọi còn cần xác định kiểu của nó.Ví dụ để giải một phƣơng trình bậc 2 dạng: ax2 + bx  
+ c = 0, cần báo cho chƣơng trình biết dữ liệu đầu vào là a, b, c và đầu ra là nghiệm x1 và x2  
của phƣơng trình. Kiểu của a, b, c, x1, x2 là các số thực.  
2. Xác định thuật toán giải.  
3. Cụ thể hoá các khai báo kiểu và thuật toán thành dãy các lệnh, tức viết thành chƣơng trình  
thông thƣờng là trên giấy, sau đó bắt đầu soạn thảo vào trong máy. Quá trình này đƣợc gọi là  
soạn thảo chƣơng trình nguồn.  
4. Dịch chƣơng trình nguồn để tìm và sửa các lỗi gọi là lỗi cú pháp.  
5. Chạy chƣơng trình, kiểm tra kết quả in ra trên màn hình. Nếu sai, sửa lại chƣơng trình, dịch  
và chạy lại để kiểm tra. Quá trình này đƣợc thực hiện lặp đi lặp lại cho đến khi chƣơng trình  
chạy tốt theo yêu cầu đề ra của NSD.  
2.3.2. Soạn thảo tệp chƣơng trình nguồn  
Soạn thảo chƣơng trình nguồn là một công việc đơn giản: gõ nội dung của chƣơng trình (đã  
viết ra giấy) vào trong máy và lƣu lại nó lên đĩa. Thông thƣờng khi đã lƣu lại chƣơng trình lên  
đĩa lần sau sẽ không cần phải gõ lại. Có thể soạn chƣơng trình nguồn trên các bộ soạn thảo  
(editor) khác nhƣng phải chạy trong môi trƣờng tích hợp C++ (Borland C, Turbo C). Mục  
đích của soạn thảo là tạo ra một văn bản chƣơng trình và đƣa vào bộ nhớ của máy. Văn bản  
chƣơng trình cần đƣợc trình bày sáng sủa, rõ ràng. Các câu lệnh cần gióng thẳng cột theo cấu  
trúc của lệnh (các lệnh chứa trong một lệnh cấu trúc đƣợc trình bày thụt vào trong so với điểm  
bắt đầu của lệnh). Các chú thích nên ghi ngắn gọn, rõ nghĩa và phù hợp.  
2.3.3. Dịch chƣơng trình  
Sau khi đã soạn thảo xong chƣơng trình nguồn, bƣớc tiếp theo thƣờng là dịch (ấn tổ hợp phím  
11  
 
Alt-F9) để tìm và sửa các lỗi gọi là lỗi cú pháp. Trong khi dịch C++ sẽ đặt con trỏ vào nơi gây  
lỗi (viết sai cú pháp) trong văn bản. Sau khi sửa xong một lỗi NSD có thể dùng Alt-F8 để  
chuyển con trỏ đến lỗi tiếp theo hoặc dịch lại. Để chuyển con trỏ về ngƣợc lại lỗi trƣớc đó có  
thể dùng Alt-F7. Quá trình sửa lỗi − dịch đƣợc lặp lại cho đến khi văn bản đã đƣợc sửa hết  
lỗi cú pháp.  
Sản phẩm sau khi dịch là một tệp mới gọi là chƣơng trình đích có đuôi EXE tức là tệp mã  
máy để thực hiện.Tệp này có thể lƣu tạm thời trong bộ nhớ phục vụ cho quá trình chạy  
chƣơng trình hoặc lƣu lại trên đĩa tuỳ theo tuỳ chọn khi dịch của NSD. Trong và sau khi dịch,  
C++ sẽ hiện một cửa sổ chứa thông báo về các lỗi (nếu có), hoặc thông báo chƣơng trình đã  
đƣợc dịch thành công (không còn lỗi). Các lỗi này đƣợc gọi là lỗi cú pháp.  
Để dịch chƣơng trình ta chọn menu \Compile\Compile hoặc \Compile\Make hoặc nhanh  
chóng hơn bằng cách ấn tổ hợp phím Alt-F6.  
2.3.4. Chạy chƣơng trình  
Ấn Ctrl-F9 để chạy chƣơng trình, nếu chƣơng trình chƣa dịch sang mã máy, máy sẽ tự động  
dịch lại trƣớc khi chạy. Kết quả của chƣơng trình sẽ hiện ra trong một cửa sổ kết quả để NSD  
kiểm tra. Nếu kết quả chƣa đƣợc nhƣ mong muốn, quay lại văn bản để sửa và lại chạy lại  
chƣơng trình. Quá trình này đƣợc lặp lại cho đến khi chƣơng trình chạy đúng nhƣ yêu cầu đã  
đề ra. Khi chƣơng trình chạy, cửa sổ kết quả sẽ hiện ra tạm thời che khuất cửa sổ soạn thảo.  
Sau khi kết thúc chạy chƣơng trình cửa sổ soạn thảo sẽ tự động hiện ra trở lại và che khuất  
cửa sổ kết quả. Để xem lại kết quả đã hiện ấn Alt-F5 (hoặc thêm lệnh getch() vào cuối hàm  
main()). Sau khi xem xong để quay lại cửa sổ soạn thảo ấn phím bất kỳ.  
2.4. Các kiểu dữ liệu cơ sở  
Trong C sử dụng các các kiểu dữ liệu cơ sở sau :  
2.4.1. Kiểu ký tự (char):  
Một giá trị kiểu char chiếm 1 byte ( 8 bit ) và biểu diễn đƣợc một ký tự thông qua bảng  
mã ASCII. Ví dụ:  
Ký tự  
Mã ASCII  
048  
0
1
049  
2
050  
A
B
a
065  
066  
097  
b
098  
Có hai kiểu dữ liệu char : kiểu signed char và unsigned char.  
Kiểu  
Phạm vi biểu diễn  
-128 đến 127  
0 đến 255  
Số ký tự  
256  
Kích thƣớc  
1 byte  
char (signed char )  
unsigned char  
256  
1 byte  
Ví dụ sau minh hoạ sự khác nhau giữa hai kiểu dữ liệu trên. Xét đoạn chƣơng trình  
sau:  
char ch1;  
12  
 
unsigned char ch2;  
......  
ch1=200; ch2=200;  
Khi đó thực chất :  
ch1=-56;  
ch2=200;  
Nhƣng cả ch1 và ch2 đều biểu diễn cùng một ký tự có mã 200.  
Phân loại ký tự :  
Có thể chia 256 ký tự làm ba nhóm :  
Nhóm 1: Nhóm các ký tự điều khiển có mã từ 0 đến 31. Chẳng hạn ký tự mã 13 dùng  
để chuyển con trỏ về đầu dòng, ký tự 10 chuyển con trỏ xuống dòng dƣới ( trên cùng một cột  
). Các ký tự nhóm này nói chung không hiển thị ra màn hình.  
Nhóm 2 : Nhóm các ký tự văn bản có mã từ 32 đến 126. Các ký tự này có thể đƣợc  
đƣa ra màn hình hoặc máy in.  
Nhóm 3 : Nhóm các ký tự đồ hoạ có mã số từ 127 đến 255. Các ký tự này có thể đƣa  
ra màn hình nhƣng không in ra đƣợc ( bằng các lệnh DOS ).  
2.4.2. Kiểu số nguyên :  
Trong C cho phép sử dụng số nguyên kiểu int, số nguyên dài kiểu long và số nguyên  
không dấu kiểu unsigned. Kích cỡ và phạm vi biểu diễn của chúng đƣợc chỉ ra trong bảng  
dƣới đây :  
Kiểu  
int  
Phạm vi biểu diễn  
-32768 đến 32767  
Kích thƣớc  
2 byte  
unsigned int  
long  
0 đến 65535  
2 byte  
-2147483648 đến 2147483647  
0 đến 4294967295  
4 byte  
unsigned long  
4 byte  
Chú ý: Kiểu ký tự cũng có thể xem là một dạng của kiểu nguyên.  
2.4.3. Kiểu dấu phảy động (số thực):  
Trong C cho phép sử dụng ba loại dữ liệu dấu phảy động, đó là float, double và long  
double. Kích cỡ và phạm vi biểu diễn của chúng đƣợc chỉ ra trong bảng dƣới đây :  
Số chữ số  
có nghĩa  
7 đến 8  
Kích  
thƣớc  
4 byte  
8 byte  
10 byte  
Kiểu  
Phạm vi biểu diễn  
float  
double  
3.4E-38 đến 3.4E+38  
1.7E-308 đến 1.7E+308  
3.4E-4932 đến 1.1E4932  
15 đến 16  
17 đến 18  
long double  
13  
Giải thích:  
Máy tính có thể lƣu trữ đƣợc các số kiểu float có giá trị tuyệt đối từ 3.4E-38 đến  
3.4E+38. Các số có giá trị tuyệt đối nhỏ hơn3.4E-38 đƣợc xem bằng 0. Phạm vi biểu diễn của  
số double đƣợc hiểu theo nghĩa tƣơng tự.  
Chú ý: Trong C không có kiểu logic Boolean (thể hiện giá trị True, False). C sử dụng kiểu số  
nguyên để xây dựng kiểu logic, 0 ứng với False, ≠ 0 ứng với trị True. Ví dụ: biểu thức 6>8  
nhận giá trị 0, 6>3 nhận giá trị 1.  
2.4.4. Định nghĩa kiểu bằng typedef :  
Công dụng: Từ khoá typedef dùng để đặt tên cho một kiểu dữ liệu. Tên kiểu sẽ đƣợc dùng  
để khai báo dữ liệu sau này. Nên chọn tên kiểu ngắn và gọn để dễ nhớ. Chỉ cần thêm từ khoá  
typedef vào trƣớc một khai báo ta sẽ nhận đƣợc một tên kiểu dữ liệu và có thể dùng tên này  
để khai báo các biến, mảng, cấu trúc, vv...  
Cách viết: Viết từ khoá typedef, sau đó kiểu dữ liệu ( một trong các kiểu trên ), rồi đến tên  
của kiểu. Ví dụ câu lệnh:  
typedef int nguyen;  
sẽ đặt tên một kiểu int là nguyen. Sau này ta có thể dùng kiểu nguyen để khai báo các biến,  
các mảng int nhƣ ví dụ sau ;  
nguyen x, y;  
2.4.5. Các phép toán số học, quan hệ và logic  
Các phép toán số học.  
Các phép toán hai ngôi số học là  
Phép toán  
Ý nghiã  
Phép cộng  
Phép trừ  
Ví dụ  
+
-
a+b  
a-b  
*
Phép nhân  
a*b  
a/b  
/
Phép chia  
( Chia số nguyên sẽ chặt phần thập phân )  
a%b  
%
Phép lấy phần dƣ  
( Cho phần dƣ của phép chia a cho b )  
Có phép toán một ngôi - ví du -(a+b) sẽ đảo giá trị của phép cộng (a+b).  
Ví dụ :11/3=3  
11%3=2  
-(2+6)=-8  
Các phép toán + và - có cùng thứ tự ƣu tiên, có thứ tự ƣu tiên nhỏ hơn các phép * , / ,  
% và cả ba phép này lại có thứ tự ƣu tiên nhỏ hơn phép trừ một ngôi.  
14  
Các phép toán số học đƣợc thực hiện từ trái sang phải. Số ƣu tiên và khả năng kết hợp  
của phép toán đƣợc chỉ ra trong một mục sau này  
Các phép toán quan hệ và logic :  
Phép toán quan hệ và logic cho ta giá trị đúng ( 1 ) hoặc giá trị sai ( 0 ). Nói cách khác,  
khi các điều kiện nêu ra là đúng thì ta nhận đƣợc giá trị 1, trái lại ta nhận giá trị 0.  
Các phép toán quan hệ là :  
Phép toán Ý nghĩa  
Ví dụ  
a>b  
>
>=  
<
So sánh lớn hơn  
4>5 có giá trị 0  
a>=b  
So sánh lớn hơn hoặc bằng  
So sánh nhỏ hơn  
6>=2 có giá trị 1  
a<b  
6<=7 có giá trị 1  
a<=b  
<=  
= =  
!=  
So sánh nhỏ hơn hoặc bằng  
So sánh bằng nhau  
8<=5 có giá trị 0  
a==b  
6==6 có giá trị 1  
a!=b  
So sánh khác nhau  
9!=9 có giá trị 0  
Bốn phép toán đầu có cùng số ƣu tiên, hai phép sau có cùng số thứ tự ƣu tiên nhƣng  
thấp hơn số thứ tự của bốn phép đầu. Các phép toán quan hệ có số thứ tự ƣu tiên thấp hơn so  
với các phép toán số học, cho nên biểu thức: i<n-1 đƣợc hiểu là i<(n-1).  
Các phép toán logic :  
Trong C sử dụng ba phép toán logic :  
Phép phủ định một ngôi !  
a
1
0
!a  
0
1
Phép và (AND) &&  
Phép hoặc ( OR ) ||  
A
1
B
1
0
1
A&&B  
A || B  
1
0
0
1
1
1
1
0
15  
0
0
0
0
Các phép quan hệ có số ƣu tiên nhỏ hơn so với ! nhƣng lớn hơn so với && và ||, vì vậy  
biểu thức nhƣ: (a<b)&&(c>d) có thể viết lại thành: a<b&&c>d  
Chú ý:Cả a và b có thể là nguyên hoặc thực.  
Phép toán tăng giảm :  
C đƣa ra hai phép toán một ngôi để tăng và giảm các biến ( nguyên và thực ). Toán tử  
tăng là ++ sẽ cộng 1 vào toán hạng của nó, toán tử giảm -- thì sẽ trừ toán hạng đi 1.  
Ví dụ: n=5  
++n Cho ta n=6  
--n  
Cho ta n=4  
Ta có thể viết phép toán ++ và -- trƣớc hoặc sau toán hạng nhƣ sau : ++n, n++, --n, n--.  
Sự khác nhau của ++n và n++ ở chỗ: trong phép n++ thì tăng sau khi giá trị của nó đã đƣợc sử  
dụng, còn trong phép ++n thì n đƣợc tăng trƣớc khi sử dụng. Sự khác nhau giữa n-- và --n  
cũng nhƣ vậy.  
Ví dụ: n=5  
x=++n  
x=n++  
Cho ta x=6 và n=6  
Cho ta x=5 và n=6  
Thứ tự ƣu tiên các phép toán :  
Các phép toán có độ ƣu tiên khác nhau, điều này có ý nghĩa trong cùng một biểu thức  
sẽ có một số phép toán này đƣợc thực hiện trƣớc một số phép toán khác.  
Thứ tự ƣu tiên của các phép toán đƣợc trình bày trong bảng sau :  
TT  
1
Phép toán  
Trình tự kết hợp  
Trái qua phải  
Phải qua trái  
Trái qua phải  
Trái qua phải  
Trái qua phải  
Trái qua phải  
Trái qua phải  
Trái qua phải  
Trái qua phải  
Trái qua phải  
Trái qua phải  
Trái qua phải  
() [] ->  
2
! ~ & * - ++ -- (type ) sizeof  
3
* ( phép nhân ) / %  
4
+ -  
5
<< >>  
6
< <= > >=  
7
== !=  
8
&
9
^
10  
11  
12  
|
&&  
||  
16  
13  
14  
15  
?:  
Phải qua trái  
Phải qua trái  
Trái qua phải  
= += -= *= /= %= <<= >>= &= ^= |=  
,
Chú thích: Các phép toán tên một dòng có cùng thứ tự ƣu tiên, các phép toán ở hàng trên có  
số ƣu tiên cao hơn các số ở hàng dƣới. Đối với các phép toán cùng mức ƣu tiên thì trình tự  
tính toán có thể từ trái qua phải hay ngƣợc lại đƣợc chỉ ra trong cột trình tự kết hợp.  
Ví dụ: *--px=*(--px) ( Phải qua trái )  
8/4*6=(8/4)*6 ( Trái qua phải )  
Nên dùng các dấu ngoặc tròn để viết biểu thức một cách chính xác.  
Các phép toán lạ :  
Dòng 1  
[ ] Dùng để biểu diễn phần tử mảng, ví dụ : a[i][j]  
. Dùng để biểu diễn thành phần cấu trúc, ví dụ : ht.ten  
-> Dùng để biểu diễn thành phần cấu trúc thông qua con trỏ  
Dòng 2  
* Dùng để khai báo con trỏ, ví dụ : int *a  
& Phép toán lấy địa chỉ, ví dụ : &x  
( type) là phép chuyển đổi kiểu, ví dụ : (float)(x+y)  
Dòng 15  
Toán tử , thƣờng dùng để viết một dãy biểu thức trong toán tử for.  
2.5. Các khai báo trong chƣơng trình C  
2.5.1. Hằng: Hằng là các đại lƣợng mà giá trị của nó không thay đổi trong quá trình tính  
toán.  
Tên hằng: Nguyên tắc đặt tên hằng ta đã xem xét trong mục đặt tên ở phần trƣớc.  
Để đặt tên một hằng, ta dùng dòng lệnh sau:  
Để khai báo hằng ta dùng các câu khai báo sau:  
#define tên_hằng giá_trị_hằng  
hoặc:  
const tên_hằng = giá_trị_hằng ;  
Ví dụ:  
#define sosv 50  
#define MAX 100  
const sosv = 50 ;  
Lúc này, tất cả các tên MAX trong chƣơng trình xuất hiện sau này đều đƣợc thay bằng  
100. Vì vậy, ta thƣờng gọi MAX là tên hằng, nó biểu diễn số 100.  
Một ví dụ khác : #define pi 3.141593  
Đặt tên cho một hằng float là pi có giá trị là 3.141593.  
17  
 
Các loại hằng :  
Hằng int: Hằng int là số nguyên có giá trị trong khoảng từ -32768 đến 32767.  
#define number1 -50  
#define sodem 2732  
Định nghiã hằng int number1 có giá trị là -50  
Ví dụ :  
Định nghiã hằng int sodem có giá trị là 2732  
Chú ý: Cần phân biệt hai hằng 5056 và 5056.0 : ở đây 5056 là số nguyên còn 5056.0 là hằng  
thực.  
Hằng long: Hằng long là số nguyên có giá trị trong khoảng từ -2147483648 đến 2147483647.  
Hằng long đƣợc viết theo cách : 1234L hoặc 1234l ( thêm L hoặc l vào đuôi )  
Một số nguyên vƣợt ra ngoài miền xác định của int cũng đƣợc xem là long.  
#define sl 8865056L  
#define sl 8865056  
Định nghiã hằng long sl có giá trị là 8865056  
Định nghiã hằng long sl có giá trị là 8865056  
Ví dụ :  
Hằng int hệ 8: Hằng int hệ 8 đƣợc viết theo cách 0c1c2c3....ở đây ci là một số nguyên dƣơng  
trong khoảng từ 1 đến 7. Hằng int hệ 8 luôn luôn nhận giá trị dƣơng.  
#define h8 0345  
Định nghiã hằng int hệ 8 có giá trị là  
Ví dụ:  
3*8*8+4*8+5=229  
Hằng int hệ 16:  
Trong hệ này ta sử dụng 16 ký tự : 0,1..,9,A,B,C,D,E,F.  
Cách viết  
a hoặc A  
b hoặc B  
c hoặc C  
d hoặc D  
e hoặc E  
f hoặc F  
Giá trị  
10  
11  
12  
13  
14  
15  
Hằng số hệ 16 có dạng 0xc1c2c3... hặc 0Xc1c2c3... ở đây ci là một số trong hệ 16.  
Ví dụ :  
#define h16 0xa5  
#define h16 0xA5  
#define h16 0Xa5  
#define h16 0XA5  
Cho ta các hắng số h16 trong hệ 16 có giá trị nhƣ nhau. Giá trị của chúng trong hệ 10 là:  
10*16+5=165.  
Hằng ký tự: Hằng ký tự là một ký tự riêng biệt đƣợc viết trong hai dấu nháy đơn, ví dụ 'a'.  
Giá trị của 'a' chính là mã ASCII của chữ a. Nhƣ vậy giá trị của 'a' là 97. Hằng ký tự có thể  
tham gia vào các phép toán nhƣ mọi số nguyên khác. Ví dụ : '9'-'0'=57-48=9  
18  
#define kt 'a'  
Định nghiã hằng ký tự kt có giá trị là 97  
Ví dụ :  
Hằng ký tự còn có thể đƣợc viết theo cách sau: ' \c1c2c3' .Trong đó c1c2c3 là một số  
hệ 8 mà giá trị của nó bằng mã ASCII của ký tự cần biểu diễn.  
Ví dụ : chữ a có mã hệ 10 là 97, đổi ra hệ 8 là 0141. Vậy hằng ký tự 'a' có thể viết dƣới dạng  
'\141'. Đối với một vài hằng ký tự đặc biệt ta cần sử dụng cách viết sau ( thêm dấu \ ) :  
Cách viết  
Ký tự  
'\''  
'\"'  
'\\'  
'
"
\
'\n'  
'\0'  
'\t'  
\n (chuyển dòng )  
\0 ( null )  
Tab  
'\b'  
'\r'  
'\f'  
Backspace  
CR ( về đầu dòng )  
LF ( sang trang )  
Chú ý: Cần phân biệt hằng ký tự '0' và '\0'. Hằng '0' ứng với chữ số 0 có mã ASCII là 48,  
còn hằng '\0' ứng với kýtự \0 ( thƣờng gọi là ký tự null ) có mã ASCII là 0.  
Hằng ký tự thực sự là một số nguyên, vì vậy có thể dùng các số nguyên hệ 10 để biểu  
diễn các ký tự, ví dụ lệnh printf("%c%c",65,66) sẽ in ra AB.  
Hằng xâu ký tự:  
Hằng xâu ký tự là một dãy ký tự bất kỳ đặt trong hai dấu nháy kép.  
Ví dụ : #define xau1 "Ha noi"  
#define xau2 "My name is Giang"  
Xâu ký tự đƣợc lƣu trữ trong máy dƣới dạng một bảng có các phần tử là các ký tự  
riêng biệt. Trình biên dịch tự động thêm ký tự null \0 vào cuối mỗi xâu ( ký tự \0 đƣợc xem là  
dấu hiệu kết thúc của một xâu ký tự ).  
Chú ý: Cần phân biệt hai hằng 'a' và "a". 'a' là hằng ký tự đƣợc lƣu trữ trong 1 byte, còn "a" là  
hằng xâu ký tự đƣợc lƣu trữ trong 1 mảng hai phần tử : phần tử thứ nhất chứa chữ a còn phần  
tử thứ hai chứa \0.  
2.5.2. Biến. Là đại lƣợng mà giá trị có thể thay đổi đƣợc trong chƣơng trình. Mỗi biến cần  
phải đƣợc khai báo trƣớc khi đƣa vào sử dụng, giá trị của biến có thể thay đổi đƣợc trong  
chƣơng trình. Việc khai báo biến đƣợc thực hiện theo mẫu sau:  
Kiểu_dữ_liệu_của_biến tên biến ;  
int a,b,c;  
Khai báo ba biến int là a,b,c  
Ví dụ :  
long dai,mn;  
Khai báo hai biến long là dai và mn  
19  
char kt1,kt2;  
Khai báo hai biến ký tự là kt1 và kt2  
Khai báo hai biến float là x và y  
float x,y  
double canh1, canh2;  
Khai báo hai biến double là canh1 và canh2  
Biến kiểu int chỉ nhận đƣợc các giá trị kiểu int. Các biến khác cũng có ý nghĩa tƣơng  
tự. Các biến kiểu char chỉ chứa đƣợc một ký tự. Để lƣu trữ đƣợc một xâu ký tự cần sử dụng  
một mảng kiểu char.  
Vị trí của khai báo biến: Các khai báo cần phải đƣợc đặt ngay sau dấu { đầu tiên của thân  
hàm và cần đứng trƣớc mọi câu lệnh khác. Sau đây là một ví dụ về khai báo biến sai :  
( Khái niệm về hàm và cấu trúc chƣơng trình sẽ nghiên cứu sau này)  
main()  
{
int a,b,c;  
a=2;  
int d; /* Vị trí của khai báo sai */  
.....  
}
Khởi đầu cho biến: Nếu trong khai báo ngay sau tên biến ta đặt dấu = và một giá trị nào đó  
thì đây chính là cách vừa khai báo vừa khởi đầu cho biến.  
Ví dụ :int a, b=20, c, d=40;  
float e=-55.2, x=27.23, y, z, t=18.98;  
Việc khởi đầu và việc khai báo biến rồi gán giá trị cho nó sau này là hoàn toàn tƣơng đƣơng.  
Lấy địa chỉ của biến: Mỗi biến đƣợc cấp phát một vùng nhớ gồm một số byte liên tiếp. Số  
hiệu của byte đầu chính là địa chỉ của biến. Địa chỉ của biến sẽ đƣợc sử dụng trong một số  
hàm ta sẽ nghiên cứu sau này ( ví dụ nhƣ hàm scanf ). Để lấy địa chỉ của một biến ta sử dụng  
phép toán: &tên_biến  
2.5.3. Chuyển đổi kiểu giá trị:  
Việc chuyển đổi kiểu giá trị thƣờng diễn ra một cách tự động trong hai trƣờng hợp sau :  
+ Khi gán biểu thức gồm các toán hạng khác kiểu.  
+ Khi gán một giá trị kiểu này cho một biến ( hoặc phần tử mảng ) kiểu khác. Điều  
này xảy ra trong toán tử gán, trong việc truyền giá trị các tham số thực sự cho các đối.  
Ngoài ra, ta có thể chuyển từ một kiểu giá trị sang một kiểu bất kỳ mà ta muốn bằng  
phép chuyển sau: ( type ) biểu thức  
Ví dụ :(float) (a+b)  
Chuyển đổi kiểu trong biểu thức :  
20  
Tải về để xem bản đầy đủ
pdf 96 trang Thùy Anh 19320 Free
Bạn đang xem 20 trang mẫu của tài liệu "Giáo trình Kỹ thuật lập trình C - Trường Đại học Hàng Hải", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

File đính kèm:

  • pdfgiao_trinh_ky_thuat_lap_trinh_c_truong_dai_hoc_hang_hai.pdf