Bài giảng lập trình căn bản với C - Công nghệ thông tin | Trường Đại học Quy Nhơn
Bài giảng lập trình căn bản với C - Công nghệ thông tin | Trường Đại học Quy Nhơn được sưu tầm và soạn thảo dưới dạng file PDF để gửi tới các bạn sinh viên cùng tham khảo, ôn tập đầy đủ kiến thức, chuẩn bị cho các buổi học thật tốt. Mời bạn đọc đón xem!
Môn: Công nghệ thông tin (BLA2001)
Trường: Đại học Quy Nhơn
Thông tin:
Tác giả:
Preview text:
Mục lục 1
MỤC LỤC
CHƯƠNG 1. GIỚI THIỆU
1.1. Thuật toán ................................................................................................... 7
1.2. Ngôn ngữ lập trình ..................................................................................... 9
1.3. Ngôn ngữ lập trình C .................................................................................. 9
1.3.1. C là ngôn ngữ bậc trung ............................................................................. 10
1.3.2. C là ngôn ngữ có cấu trúc .......................................................................... 11
1.3.3. Cấu trúc của một chương trình C ............................................................... 12
1.3.4. Chương trình đầu tiên ................................................................................. 12
1.4. Câu hỏi trắc nghiệm và bài tập ................................................................. 15
1.4.1. Câu hỏi trắc nghiệm ................................................................................... 15
1.4.2. Bài tập ......................................................................................................... 16
CHƯƠNG 2. BIỂU THỨC (EXPRESSION) ...................................17
2.1. Kiểu dữ liệu cơ sở (Basic Data Type) ...................................................... 17
2.2. Bổ ngữ kiểu dữ liệu cơ sở (Modifying the Basic Type) ........................... 17
2.3. Định danh (Identifier) .............................................................................. 18
2.4. Biến (Variable) ......................................................................................... 18
2.5. Hằng (Constant) ....................................................................................... 19
2.6. Phép toán (Operator) ............................................................................... 20
2.6.1. Phép toán gán ............................................................................................. 20
2.6.2. Phép toán số học ......................................................................................... 21
2.6.3. Phép toán quan hệ và logic ........................................................................ 21
2.6.4. Phép toán ? ................................................................................................. 22
2.6.5. Phép toán bit ............................................................................................... 22
2.6.6. Phép toán sizeof ...................................................................................... 23
2.6.7. Phép toán () và [
] .................................................................................... 23
2.6.8. Ép kiểu ........................................................................................................ 23
2.6.9. Độ ưu tiên của tất cả các phép toán ........................................................... 24
2.7. Biểu thức (Expression) ............................................................................. 24
2.7.1. Chuyển đổi kiểu trong biểu thức ................................................................. 24
2.7.2. Khoảng trống và dấu ngoặc đơn ................................................................ 25
2.7.3. Viết nhanh của phép toán gán .................................................................... 25
2.7.4. Các hàm toán học cơ bản ........................................................................... 25
2.8. Vào ra dữ liệu cơ bản ............................................................................... 26
2.8.1. In giá trị ra màn hình (hàm printf()) .................................................... 26
2.8.2. Nhập dữ liệu từ bàn phím (hàm scanf()) ................................................ 29
2.9. Một số ví dụ cơ bản .................................................................................. 31
Khoa Công nghệ thông tin 2
Lập trình cơ bản
2.10. Câu hỏi trắc nghiệm và bài tập ............................................................... 32
2.10.1. Câu hỏi trắc nghiệm ................................................................................. 32
2.10.2. Bài tập ....................................................................................................... 33
CHƯƠNG 3. CÂU LỆNH (STATEMENT).................................... .35
3.1. True và False trong C ............................................................................... 35
3.2. Lệnh lựa chọn (Selection)......................................................................... 35
3.2.1. Lệnh if ....................................................................................................... 35
3.2.2. Các lệnh if lồng nhau ............................................................................... 37
3.2.3. Các lệnh if-else-if liên tục .................................................................. 38
3.2.4. Lệnh switch .............................................................................................. 39
3.3. Lệnh lặp (Iteration) .................................................................................. 42
3.3.1. Lệnh lặp for .............................................................................................. 42
3.3.2. Lệnh lặp while .......................................................................................... 46
3.3.3. Lệnh lặp do-wihle ................................................................................... 47
3.4. Lệnh nhảy (Jump) ..................................................................................... 49
3.4.1. Lệnh return .............................................................................................. 49
3.4.2. Lệnh goto .................................................................................................. 49
3.4.3. Lệnh break ................................................................................................ 50
3.4.4. Lệnh continue .......................................................................................... 50
3.5. Câu hỏi trắc nghiệm và bài tập ................................................................. 51
3.5.1. Câu hỏi trắc nghiệm ................................................................................... 51
3.5.2. Bài tập ......................................................................................................... 53
CHƯƠNG 4. MẢNG VÀ CHUỖI (ARRAY & STRING) .............. 59
4.1. Khái niệm ................................................................................................. 59
4.2. Mảng một chiều ........................................................................................ 59
4.2.1. Một số vấn đề cơ bản .................................................................................. 59
4.2.2. Một số ví dụ cơ bản .................................................................................... 60
4.3. Chuỗi kí tự ................................................................................................ 62
4.3.1. Một số vấn đề cơ bản .................................................................................. 62
4.3.2. Một số ví dụ cơ bản .................................................................................... 64
4.4. Mảng hai chiều ......................................................................................... 66
4.4.1. Một số vấn đề cơ bản .................................................................................. 66
4.4.2. Một số ví dụ cơ bản .................................................................................... 67
4.4.3. Mảng chuỗi ................................................................................................. 69
4.5. Khởi gán một mảng .................................................................................. 70
4.5.1. Khởi gán mảng một chiều ........................................................................... 70
4.5.2. Khởi gán mảng hai chiều ............................................................................ 70
4.5.3. Khởi gán mảng không kích thước ............................................................... 71
4.6. Câu hỏi trắc nghiệm và bài tập ................................................................. 71
Trường Đại học Quy Nhơn
Mục lục 3
4.6.1. Câu hỏi trắc nghiệm ................................................................................... 71
4.6.2. Bài tập ......................................................................................................... 73
CHƯƠNG 5. CON TRỎ (POINTER) ..............................................77
5.1. Khái niệm con trỏ ..................................................................................... 77
5.2. Biến con trỏ .............................................................................................. 78
5.3. Phép toán trên con trỏ .............................................................................. 78
5.4. Biểu thức con trỏ ...................................................................................... 79
5.4.1. Phép toán gán ............................................................................................. 79
5.4.2. Phép toán số học trên con trỏ ..................................................................... 79
5.4.3. So sánh con trỏ ........................................................................................... 80
5.5. Con trỏ và mảng ....................................................................................... 81
5.6. Mảng các con trỏ ...................................................................................... 82
5.7. Trỏ gián tiếp ............................................................................................. 83
5.8. Cấp phát bộ nhớ độn
g .............................................................................. 85
5.8.1. Các hàm liên quan ...................................................................................... 85
5.8.2. Cấp phát bộ nhớ động cho mảng một chiều ............................................... 85
5.8.3. Cấp phát bộ nhớ động cho mảng hai chiều ................................................ 86
5.9. Một số chú ý khi làm việc với con trỏ ..................................................... 90
5.9.1. Xác định con trỏ trước khi sử dụng ............................................................ 90
5.9.2. Không nên gán giá trị cụ thể cho con trỏ ................................................... 91
5.9.3. Giá trị con trỏ thay đổi ............................................................................... 91
5.10. Câu hỏi trắc nghiệm và bài tập ............................................................... 92
5.10.1. Câu hỏi trắc nghiệm ................................................................................. 92
5.10.2. Bài tập ....................................................................................................... 93
CHƯƠNG 6. HÀM (FUNCTION) ...................................................95
6.1. Giới thiệu .................................................................................................. 95
6.2. Các luật phạm vi của hàm ........................................................................ 97 6.3. Lệnh retur
n ........................................................................................... 98
6.4. Tham số của hàm ..................................................................................... 99
6.4.1. Gọi hàm theo tham trị và theo tham chiếu ................................................. 99
6.4.2. Gởi mảng đến hàm .................................................................................... 101
6.4.3. Tham số trong hàm main() ..................................................................... 104
6.5. Đệ quy (Recursion) ................................................................................ 105
6.6. Con trỏ hàm ............................................................................................ 107
6.7. Câu hỏi trắc nghiệm và bài tập ............................................................... 110
6.7.1. Câu hỏi trắc nghiệm ................................................................................. 110
Khoa Công nghệ thông tin 4
Lập trình cơ bản
6.7.2. Bài tập ....................................................................................................... 112
CHƯƠNG 7. KIỂU CẤU TRÚC, HỢP, LIỆT KÊ VÀ KIỂU
NGƯỜI DÙNG ĐỊNH NGHĨA ...................................................... 115
7.1. Cấu trúc (Structure) ................................................................................ 115
7.1.1. Khái niệm .................................................................................................. 115
7.1.2. Mảng cấu trúc ........................................................................................... 117
7.1.3. Con trỏ cấu trúc ........................................................................................ 119
7.1.4. Mảng bên trong cấu trúc .......................................................................... 120
7.1.5. Cấu trúc bên trong cấu trúc ..................................................................... 122
7.1.6. Trường bit ................................................................................................. 126
7.2. Kiểu hợp (Union) ................................................................................... 126
7.3. Kiểu liệt kê (Enumeration) ..................................................................... 128 7.4. Dùng toán tử sizeo
f để đảm bảo tính khả chuyển .............................. 130
7.5. Kiểu người dùng định nghĩa (User-Defined) ......................................... 131
7.6. Câu hỏi trắc nghiệm và bài tập ............................................................... 131
7.6.1. Câu hỏi trắc nghiệm ................................................................................. 131
7.6.2. Bài tập ....................................................................................................... 132
CHƯƠNG 8. VÀO/RA DỮ LIỆU TRÊN CONSOLE ................. 137
8.1. Đọc và viết một kí tự .............................................................................. 137
8.1.2. Một vấn đề với hàm getchar() ............................................................. 138
8.1.3. Biến thể của hàm getchar() ................................................................. 138
8.2. Đọc và viết chuỗi .................................................................................... 139
8.3. Bài tập ..................................................................................................... 141
CHƯƠNG 9. ĐỌC/GHI DỮ LIỆU TRÊN FILE ......................... 143
9.1. Luồng và file .......................................................................................... 143
9.1.1. Luồng (stream) ......................................................................................... 143
9.1.2. File ............................................................................................................ 143
9.2. Các hàm cơ sở trên file ........................................................................... 144
9.2.1. Con trỏ file ................................................................................................ 144
9.2.2. Mở một file (hàm fopen()) ..................................................................... 145
9.2.3. Đóng một file (hàm fclose()) ............................................................... 146
9.2.4. Đọc/ghi một kí tự trên file (hàm getc()/putc()) ................................ 146
9.2.5. Kiểm tra cuối file (hàm feof()) ............................................................. 149
9.2.6. Đọc/ghi chuỗi kí tự trên file (hàm fgets()/fputs()) .......................... 150
9.2.7. Hàm rewind() ........................................................................................ 152
9.2.8. Hàm ferror() ........................................................................................ 153
9.2.9. Xóa một file (hàm remove()) ................................................................. 155
Trường Đại học Quy Nhơn
Mục lục 5
9.2.10. Làm sạch một luồng (hàm fflush()) ................................................... 155
9.3. Đọc/ghi khối byte (hàm fread() và fwrite( )
) ................................ 156
9.4. Hàm fseek() và truy cập ngẫu nhiên .................................................. 158
9.5. Đọc/ghi dữ liệu theo mẫu (hàm fprintf() và fscanf()) ................ 160
9.6. Luồng chuẩn ........................................................................................... 162
9.6.1. Luồng chuẩn stdin, stdout, stderr ................................................... 162
9.6.2. Hàm freopen() truy cập gián tiếp vào luồng chuẩn ............................. 162
9.7. Câu hỏi trắc nghiệm và bài tập ............................................................... 163
9.7.1. Câu hỏi trắc nghiệm ................................................................................. 164
9.7.2. Bài tập ....................................................................................................... 166
CHƯƠNG 10. TIỀN XỬ LÝ VÀ CHÚ THÍCH.......................... .169 10.1. Dẫn hướng #defin
e ........................................................................... 169
10.1.1. Định nghĩa Macro tương tự như hàm ..................................................... 171 10.2. Dẫn hướng #erro
r.............................................................................. 171 10.3. Dẫn hướng #includ
e ......................................................................... 172
10.4. Chỉ thị biên dịch có điều kiện .............................................................. 176
10.4.1. Dẫn hướng #if, #else, #elif, #endif ............................................ 176
10.4.2. Dẫn hướng #ifdef và #ifndef ........................................................... 178 10.5. Dẫn hướng #unde
f.............................................................................. 178 10.6. Dẫn hướng define
d ........................................................................... 179 10.7. Dẫn hướng #lin
e................................................................................ 179
10.8. Toán tử tiền xử lý # và ## .................................................................... 180
10.9. Các macro định nghĩa trước ................................................................. 181
10.10. Chú thích trong C chuẩn .................................................................... 181
10.11. Câu hỏi trắc nghiệm và bài tập ........................................................... 182
10.11.1. Câu hỏi trắc nghiệm ............................................................................. 182
10.11.2. Bài tập ................................................................................................... 182
TÀI LIỆU THAM KHẢO .............................................................. 185
Khoa Công nghệ thông tin
Chương 1. Giới thiệu 7
CHƯƠNG 1. GIỚI THIỆU
1.1. Thuật toán
Thuật toán là dãy hữu hạn các bước tính toán nhận các giá trị đầu vào chuyển đổi
thành các giá trị đầu ra.
Khi đã hình thành thuật toán, ta không xét đến việc chứng minh thuật toán đó mà
chỉ chú trọng đến việc áp dụng các bước theo sự hướng dẫn để có kết quả mong muốn.
Việc chứng minh tính đúng của thuật toán phải được tiến hành trước khi hình thành
các bước của thuật toán. Khái niệm thuật toán hiện nay dùng để chỉ cách giải quyết
một bài toán nào đó bằng máy tính.
Các tính chất của thuật toán:
+ Tính chính xác: một dữ liệu đầu vào chỉ cho một dữ liệu đầu ra, không thể có
một dữ liệu đầu vào nhưng cho nhiều kết quả khác nhau.
+ Tính rõ ràng: thuật toán phải thể hiện bằng các câu lệnh rõ ràng và có thứ tự.
+ Tính phổ dụng: thuật toán có thể áp dụng cho nhiều đầu vào tương tự nhau.
+ Tính kết thúc: thuật toán phải bao gồm một số hữu hạn các bước.
+ Tính đơn trị: một thuật toán được viết bởi nhiều người trên nhiều máy tính
khác nhau đều cho kết quả giống nhau.
Để biểu diễn thuật toán ta có thể sử dụng nhiều cách khác nhau. Thông thường có
ba cách biểu diễn thuật toán: dùng ngôn ngữ tự nhiên, dùng sơ đồ khối và dùng ngôn
ngữ lập trình. Ví dụ thuật toán giải phương trình bậc 1 ax+b=0 được biểu diễn bằng
ngôn ngữ tự nhiên như sau:
Bước 1: nếu a ≠ 0 thì thông báo phương trình có 1 nghiệm duy nhất là x=-b/a và
Khoa Công nghệ thông tin 8
Lập trình cơ bản
kết thúc thuật toán, nếu a=0 thì chuyển sang bước 2.
Bước 2: nếu b=0 th ìthông báo phương trình vô số nghiệm, kết thúc thuật toán.
Nếu b≠0 thì thông báo phương trình vô nghiệm, kết thúc thuật toán.
Thuật toán giải phương trình bậc 1 ở trên sẽ nhận các giá trị đầu vào là hai số
thực a và b. Sau hai bước tính toán, thuật toán sẽ cho kết quả (phụ thuộc vào hai giá trị
a, b tương ứng) là có nghiệm hoặc không có nghiệm.
Cùng một thuật toán như trên, ta cũng có thể sử dụng các kí hiệu để biểu diễn.
Việc sử dụng các kí hiệu để biểu diễn thuật toán ta gọi là sơ đồ khối. Qui ước các kí hiệu như sau: Begin End ,
: điểm bắt đầu và kết thúc thuật toán.
: nhận dữ liệu đầu vào, thông báo dữ liệu đầu ra.
: thực hiện các bước tính toán của thuật toán. : kiểm tra điều kiện.
: chuyển đến bước tiếp theo của thuật toán.
Từ các kí hiệu qui ước ở trên, ta có thể mô tả thuật toán giải phương trình bậc 1 như hình 1-1 sau:
Hình 1-1. Sơ đồ khối biểu diễn thuật toán giải phương trình bậc 1.
Trường Đại học Quy Nhơn
Chương 1. Giới thiệu 9
Việc sử dụng ngôn ngữ tự nhiên và sơ đồ khối để biểu diễn thuật toán mục đích
để người đọc hiểu và làm theo các bước trong đó. Tuy nhiên, để máy tính "hiểu" và
thực hiện được các bước của thuật toán ta phải sử dụng một công cụ khác, đó chính là ngôn ngữ lập trình.
1.2. Ngôn ngữ lập trình
Ngôn ngữ lập trình là một hệ thống được kí hiệu hóa để mô tả thuật toán máy
tính ở dạng mà cả máy tính và con người hiểu được.
Tập hợp các chỉ thị được biểu thị qua ngôn ngữ lập trình nhằm mục đích thực
hiện thao tác nào đó được gọi là chương trình máy tính.
Lập trình là khái niệm chỉ quá trình con người tạo ra chương trình máy tính thông
qua ngôn ngữ lập trình. Ta cũng có thể nói lập trình là quá trình chuyển cách giải bài
toán bằng ngôn ngữ tự nhiên về ngôn ngữ mà máy tính hiểu và thực hiện được bằng
ngôn ngữ lập trình. Văn bản được viết bằng ngôn ngữ lập trình để tạo nên chương trình
máy tính gọi là mã nguồn.
Thao tác chuyển đổi mã nguồn thành chuỗi các chỉ thị máy tính gọi là biên dịch
chương trình. Chương trình để thực hiện công việc trên gọi là chương trình dịch.
Ngôn ngữ lập trình thường phân thành nhiều loại khác nhau, ví dụ ngôn ngữ lập
trình bậc cao, bậc thấp. Hay phân thành ngôn ngữ lập trình hướng cấu trúc, hướng đối
tượng, …tuy nhiên hầu hết các ngôn ngữ lập trình hiện nay đều có những điểm chung
đó là có từ khóa, định danh, kiểu dữ liệu, cấu trúc điều khiển.
1.3. Ngôn ngữ lập trình C
Ngôn ngữ lập trình C được phát minh và cài đặt lần đầu tiên bởi Dennis Ritchie
và được sử dụng trong hệ điều hành Linux. C là kết quả của một quá trình phát triển
bắt đầu bằng ngôn ngữ B (được phát minh bởi Ken Thompson). Từ ngôn ngữ B đã phát
triển ngôn ngữ C vào năm 1970.
Hè năm 1983, thành lập một ủy ban để tạo ra chuẩn ANSI (American National
Standards Intitute) định nghĩa ngôn ngữ C. Quá trình tiêu chuẩn hóa mất 6 năm.
Chuẩn ANSI C đã được chấp nhận vào tháng 12 năm 1989. Tiêu chuẩn này cũng được
Khoa Công nghệ thông tin 10
Lập trình cơ bản
tổ chức tiêu chuẩn quốc tế (ISO) chấp nhận và được gọi là C chuẩn. Ngày nay, tất cả
các trình biên dịch ngôn ngữ C/C++ đều tuân theo C chuẩn.
1.3.1. C là ngôn ngữ bậc trung
C thường được gọi là ngôn ngữ máy bậc trung. Điều này không có nghĩa là C ít
mạnh và khó sử dụng hoặc ít phát triển hơn các ngôn ngữ bậc cao như là Basic hoặc
Pascal. C có ý tưởng như là một ngôn ngữ bậc trung bởi vì nó tích hợp tốt nhất các
thành phần của ngôn ngữ bậc cao kết hợp với tính mềm dẻo của ngôn ngữ cấp thấp.
C cho phép lập trình với bit, byte và địa chỉ. Mã nguồn của ngôn ngữ C cũng
tương thích với nhiều chương trình dịch, nhiều hệ điều hành khác nhau. Ví dụ ta có thể
dễ dàng chuyển đổi một chương trình C viết trên hệ điều hành DOS sang một chương
trình C thực thi trên Windows. Bậc cao Ada Modula-2 Pascal COBOL FORTRAN BASIC Bậc trung Java C++ C FORTH
Bậc thấp Macro-assembler Assembler
Bảng 1-1. Ngôn ngữ C so với các ngôn ngữ lập trình khác.
Tất cả các ngôn ngữ lập trình bậc cao đều hỗ trợ khái niệm kiểu dữ liệu. Kiểu dữ
liệu định nghĩa các tập giá trị mà một biến có thể lưu trữ và tập các phép toán có thể
thao tác trên giá trị đó. Kiểu dữ liệu cơ bản nhất là số nguyên, kí tự và số thực. Mặc dù
C có năm kiểu dữ liệu cơ bản, nhưng nó không phải là một ngôn ngữ định kiểu mạnh
như là Pascal. C cho phép chuyển đổi qua lại giữa các kiểu dữ liệu với nhau. Ví dụ ta
có thể trộn lẫn kiểu kí tự và kiểu số trong một biểu thức.
Không giống như ngôn ngữ bậc cao, C không kiểm tra các lỗi thời gian thực thi.
Ví dụ C không kiểm tra xem các biên của mảng có tràn hay không. Các kiểu kiểm tra
này là trách nhiệm của người lập trình.
Trường Đại học Quy Nhơn