Giáo trình Lập trình C++ - Lê Phú Hiếu
Mục lục
BỘ GIÁO DỤC VÀ ĐÀO TẠO _________________________________ 1
CHƯƠNG 1. MỘT SỐ KHÁI NIỆM CƠ BẢN VỀ LẬP TRÌNH _____ 13
1. Thuật toán (Algorithm) ________________________________ 13
1.1. Khái niệm ________________________________________ 13
1.2. Các đặc trưng của thuật toán __________________________ 13
1.3. Các công cụ biểu diễn thuật toán_______________________ 14
2. Ngôn ngữ lập trình (NNLT)_____________________________ 15
3. Chương trình (máy tính) _______________________________ 16
4. Các bước xây dựng chương trình ________________________ 17
5. Câu hỏi và bài tập _____________________________________ 18
CHƯƠNG 2. CÁC YẾU TỐ CƠ BẢN CỦA NNLT C/C++ __________ 21
1. Bộ ký tự (character set) ________________________________ 21
2. Danh hiệu (identifier) __________________________________ 21
3. Từ khóa (keyword) ____________________________________ 22
4. Chú thích (comment) __________________________________ 22
5. Các kiểu dữ liệu cơ bản (base type) ______________________ 23
5.1. Số nguyên ________________________________________ 236
5.2. Số thực (độ chính xác đơn – 6 chữ số lẻ) ________________ 23
5.3. Số thực (độ chính xác kép – 15 chữ số lẻ): _______________ 24
5.4. Kí tự_____________________________________________ 24
6. Hằng (constant)_______________________________________ 25
Một số kí tự đặc biệt: ________________________________________ 26
7. Biến (variable)________________________________________ 27
8. Biểu thức (expression) _________________________________ 29
9. Chuyển đổi kiểu (type conversion) _______________________ 29
10. Các toán tử (operator) _________________________________ 30
10.1. Toán tử số học _____________________________________ 30
10.2. Toán tử quan hệ (so sánh) ____________________________ 30
10.3. Toán tử logic ______________________________________ 31
10.4. Toán tử gán _______________________________________ 31
10.5. Toán tử điều kiện ( ? : ) _____________________________ 32
10.6. Toán tử tăng (++), giảm (––) một đơn vị_________________ 33
Biểu thức có dạng __________________________________________ 33
10.7. Toán tử dịch chuyển số học ___________________________ 34
10.8. Toán tử thao tác trên từng bít _________________________ 347
10.9. Toán tử ép kiểu (đã nói ở trên) ________________________ 34
10.10.Toán tử “lấy địa chỉ của” ( & ) ________________________ 34
10.11.Toán tử sizeof: _____________________________________ 34
11. Độ ưu tiên và trật tự kết hợp các toán tử (precedence and
associativity) _____________________________________________ 35
12. Câu lệnh (statement, instruction) ________________________ 36
13. Xuất / Nhập dữ liệu đơn giản trong C/C++ ________________ 37
14. Một vài chương trình C/C++ đơn giản ___________________ 39
15. Câu hỏi ______________________________________________ 46
16. Bài tập về phép toán và biểu thức ________________________ 49
CHƯƠNG 3. CÁC CẤU TRÚC ĐIỀU KHIỂN (CONTROL
STRUCTURES) ____________________________________________ 62
1. Cấu trúc rẽ nhánh (if then else ) __________________ 62
2. Cấu trúc lựa chọn (switch . . .) ___________________________ 66
3. Cấu trúc lặp while ( ) _________________________________ 69
4. Cấu trúc lặp do while ( ) ____________________________ 71
5. Cấu trúc lặp for ( )___________________________________ 74
6. Câu lệnh break _______________________________________ 77
7. Câu lệnh continue (ít dùng) _____________________________ 788
8. Câu lệnh goto ________________________________________ 78
9. Câu hỏi ______________________________________________ 79
10. Bài tập ______________________________________________ 91
10.1. Cấu trúc rẻ nhánh___________________________________ 91
10.2. Cấu trúc lựa chọn ___________________________________ 92
10.3. Cấu trúc lặp _______________________________________ 93
CHƯƠNG 4. HÀM (FUNCTION) ____________________________ 102
1. Khái niệm __________________________________________ 102
2. Khai báo và định nghĩa hàm ___________________________ 103
3. Lệnh return _________________________________________ 104
4. Các dạng hàm _______________________________________ 104
4.1. Hàm không có tham số _____________________________ 104
4.2. Hàm với nhiều tham số _____________________________ 106
4.3. Hàm nguyên mẫu (function prototype) _________________ 107
4.4. Tổ chức một chương trình “C/C++” (trên cùng 1 tập tin) ___ 108
5. Các phương pháp truyền tham số_______________________ 109
6. Phạm vi (scope) và cấp lưu trữ (storage class) của các đối
tượng __________________________________________________ 111
6.1. Phạm vi _________________________________________ 1119
6.2. Cấp lưu trữ_______________________________________ 113
7. Cơ chế gọi hàm và bộ nhớ stack ________________________ 120
8. Hàm có tham số với giá trị ngầm định (Function with
default arguments) ______________________________________ 123
9. Nạp chồng hàm (Function overloading) __________________ 124
10. Một số gợi ý khi thiết kế hàm __________________________ 126
11. Một số ví dụ minh họa ________________________________ 127
12. Câu hỏi _____________________________________________ 127
13. Bài tập _____________________________________________ 131
CHƯƠNG 5. KIỂU MẢNG (ARRAY) _________________________ 134
1. Khái niệm __________________________________________ 134
2. Khai báo & khởi tạo giá trị các phần tử mảng trong
“C/C++” _______________________________________________ 134
3. Truy xuất các phần tử của mảng _______________________ 136
4. Truyền tham số mảng cho hàm_________________________ 137
5. Các thao tác cơ bản trên mảng 1 chiều ___________________ 138
5.1. Nhập giá trị cho các phần tử mảng. ____________________ 138
5.2. Xuất giá trị các phần tử mảng (ra màn hình). ____________ 140
5.3. Thêm 1 phần tử vào mảng. __________________________ 14110
5.4. Xóa một phần tử ra khỏi mảng. _______________________ 142
5.5. Tìm kiếm trên mảng. _______________________________ 143
5.6. Sắp xếp mảng. ____________________________________ 145
6. Câu hỏi _____________________________________________ 149
7. Bài tập _____________________________________________ 149
Mảng 1 chiều _____________________________________________ 149
Mảng 2 chiều _____________________________________________ 152
CHƯƠNG 6. CON TRỎ (POINTER) __________________________ 153
1. Khái niệm __________________________________________ 153
2. Khai báo biến con trỏ_________________________________ 153
3. Truy xuất biến trỏ ___________________________________ 154
4. Số học con trỏ _______________________________________ 155
5. Liên hệ giữa con trỏ và mảng __________________________ 156
6. Con trỏ đa cấp _______________________________________ 157
7. Truyền tham số con trỏ cho hàm _______________________ 158
8. Mảng các con trỏ ____________________________________ 158
9. Từ khóa const với con trỏ _____________________________ 159
10. Cấp phát động _______________________________________ 16011
11. Con trỏ hàm ________________________________________ 164
12. Con trỏ và chuỗi kí tự ________________________________ 165
13. Ứng dụng con trỏ ____________________________________ 167
14. Sơ lược về kiểu tham chiếu (Reference) - Chỉ có trong C++. _ 167
15. Bài tập _____________________________________________ 168
CHƯƠNG 7. KIỂU STRUCT ________________________________ 175
1. Khái niệm __________________________________________ 175
2. Khai báo và truy xuất biến struct trong ‘C’ ______________ 175
3. Lệnh typedef ________________________________________ 177
4. Kiểu enum __________________________________________ 178
Khai báo _________________________________________________ 178
5. Mảng các struct______________________________________ 179
6. Con trỏ trỏ đến biến kiểu struct ________________________ 180
7. Truyền tham số kiểu struct cho hàm ____________________ 181
8. Kiểu union __________________________________________ 181
9. Bài tập _____________________________________________ 182
CHƯƠNG 8. File __________________________________________ 183
1. Giới thiệu chung _____________________________________ 18312
2. Thao tác trên kiểu file ________________________________ 183
2.1. Mở File ( liên kết kênh nhập/xuất với file đĩa )___________ 183
2.2. Xử lý File________________________________________ 184
2.3. Đóng File ________________________________________ 185
2.4. Ví dụ Vào/Ra File định dạng _________________________ 185
2.5. Ví dụ Vào/Ra kí tự_________________________________ 188
2.6. Ví dụ Vào/Ra File nhị phân __________________________ 189
3. Bài tập _____________________________________________ 191
TÀI LIỆU THAM KHẢO ___________________________________ 193
huộc tính trong biến cấu trúc được cấp phát các vùng nhớ khác nhau, còn các trường của biến union được cấp phát chung vùng nhớ. Độ dài của biến union bằng độ dài của thành phần dài nhất trong biến. Khai báo biến union giống như khai báo biến struct Ví dụ: typedef union { unsigned int n; unsigned char ch[2]; 182 }VAL; VAL x; x.n=0x1B1A; khi đó: ch[0] = 1A và ch[1]=1B 9. Bài tập 1) Cho trước một thời điểm giờ, phút, giây. Viết chương trình tính thời điểm 1 giây sau, 1 giây trước. 2) Viết chương trình tính khoảng cách (số giây) giữa 2 thời điểm cho trước. 3) Cho trước một bộ ngày, tháng, năm. Viết chương trình tính ngày hôm sau, ngày hôm trước. 4) Viết chương trình tính khoảng cách (số ngày) giữa 2 bộ ngày, tháng, năm cho trước. 5) Viết chương trình thực hiện các phép tính (+, -, *, /) trên phân số. 6) Viết chương trình thực hiện các phép tính (+, -, *, /) trên số phức. 7) Viết chương trình thực hiện phép cộng, và phép nhân 2 ma trận. 183 CHƯƠNG 8. File 1. Giới thiệu chung File là cơ chế cho phép lưu trữ dữ liệu một cách lâu dài, với số lượng lớn (về mặt lý thuyết là không hạn chế). C++ xem File chỉ đơn thuần là một dãy các byte. File được đánh dấu kết thúc bằng kí hiệu đặc biệt (CTRL+Z cho DOS và CTRL+D cho UNIX, . . .) Để có thể làm việc với File đĩa, trước hết ta phải liên kết file với dòng (stream) nhập/xuất bằng cách tạo ra đối tượng File thuộc lớp: fstream (dùng cho việc Vào/Ra File), ofstream(dùng cho Ghi ra File), ifstream (dùng cho Đọc File). Các lớp này được khai báo trong tập tin tiêu đề . Có 2 loại Vào/Ra file đĩa cơ bản trong C++: Vào/Ra file định dạng (formatted file I/O), và Vào/Ra file nhị phân (binary file I/O) Quy trình thao tác file: mở file – kiểm tra – xử lý file – đóng file 2. Thao tác trên kiểu file 2.1. Mở File ( liên kết kênh nhập/xuất với file đĩa ) Dùng hàm thiết lập: filevar( ); Hoặc dùng hàm thành phần open của đối tượng luồng nhập/xuất: filevar; filevar.open( , ); Các chế độ mở file: 184 Chế độ Mô tả ios::in Mở để đọc ( mặc định cho ifstream ) ios::out Mở để ghi ( mặc định cho ofstream ) ios::ate Bắt đầu đọc/ghi ở cuối file ios::app Bắt đầu ghi ở cuối file ios::trunc Cắt bỏ file (TRUNCate) ios::nocreate Lỗi nếu file không tồn tại ios::noreplace Lỗi khi mở để ghi ra nếu file đã tồn tại, trừ khi ate hoặc app được thiết lập ios::binary Mở file trong chế độ nhị phân ( mặc định là văn bản) 2.2. Xử lý File Trước khi đọc/ghi file, cần kiểm tra file đã được mở thành công hay không: if (!file) else Trong quá trình làm việc với file, cần dùng hàm kiểm tra kết thúc tập tin trong vòng lặp: while(!file.eof()) Vào/Ra kí tự: hàm get() và put() làm các hàm thành phần của ofstream và ifstream cho phép đọc kí tự từ file, và ghi kí tự ra file. Vào/Ra file nhị phân: hàm read() và write() cho phép thực hiện việc đọc/ghi một số lượng lớn các byte dữ liệu từ bộ đệm sang file. Các tham số cho hàm read() và write() là địa chỉ của bộ đệm dữ liệu và kích thước của chúng. Địa chỉ phải ép thành kiểu char và kích thước được tính bằng byte. 185 Vào/Ra đối tượng (objects I/O): dùng chế độ mở file nhị phân, và các hàm read(), write(). Con trỏ file: mỗi đối tượng file kết hợp với nó 2 giá trị nguyên gọi là get pointer ( con trỏ đọc ) và put pointer ( con trỏ ghi ). Hai giá trị này cho biết vị trí đọc và vị trí ghi hiện tại của con trỏ trong quá trình làm việc với file. Để điều khiển con trỏ file phục vụ cho việc đọc/ghi file tại vị trí tùy ý, ta dùng hàm seekg(), seekp() (để di chuyển con trỏ file đến vị trí mong muốn), tellg(), tellp() (để đọc vị trí hiện hành của con trỏ file). Hàm seekg() và tellg() cho phép thiết lập và kiểm tra con trỏ đọc, còn các hàm seekp() và tellp() thực hiện tương tự đối với con trỏ ghi. Hàm seekg() và seekp() có 2 tham số: tham số thứ 1 biểu diễn độ lệch (offset), tính từ vị trí cụ thể xác định bởi tham số thứ 2 (ios::beg, ios::cur, ios:end) 2.3. Đóng File Dùng hàm close() của đối tượng file. 2.4. Ví dụ Vào/Ra File định dạng Hàm ghi file số nguyên void WriteIntFile() { ofstream outf( “test.dat”, ios::out ); if ( ! outf ) { cerr << “Cannot open file test.dat . . .\n”; exit( 1 ); 186 } for ( int i = 0; i < 100; i++ ) outf << i + 1 << ‘ ‘; outf.close(); } Hàm đọc file số nguyên void ReadIntFile() { ifstream inf( “test.dat”, ios::in ); if ( ! inf ) { cerr << “Cannot open file test.dat . . .\n”; exit( 1 ); } int i; while ( ! inf.eof() ) { inf >> i; cout << setw( 4 ) << i; } inf.close(); 187 } Hàm đọc/ghi file số nguyên void IntFile() { fstream file; file.open( “test.dat”, ios::out | ios::in ); if ( ! file ) { cerr << “Cannot open file test.dat . . .\n”; exit( 1 ); } for ( int i = 0; i < 100; i++ ) outf << i + 1 << ‘ ‘; file.seekg( 0, ios::beg ); // ve dau file while ( ! file.eof() ) { inf >> i; cout << setw( 4 ) << i; } file.close(); } 188 2.5. Ví dụ Vào/Ra kí tự Hàm ghi kí tự ra file void ReadCharFile() { ofstream outf( “test.txt”, ios::out ); if ( ! outf ) { cerr << “Cannot open file test.txt \n”; exit( 1 ); } char str[] = “KHOA TIN HOC”; int i = 0; while ( s[ i ] ) { outf.put( s[ i ] ); // outf << s[ i ] i++; } outf.close(); } Hàm đọc kí tự từ file void ReadCharFile() { 189 ifstream inf( “test.txt”, ios::in ); if ( ! inf ) { cerr << “Cannot open file test.txt . . .\n”; exit( 1 ); } char ch; while ( ! inf.eof() ) { inf.get( ch ); cout << ch; } inf.close(); } 2.6. Ví dụ Vào/Ra File nhị phân #include #include const int MAX = 100; void main() { int buffer[ MAX ] = { 0 }; 190 for ( int i = 0; i < MAX; i++ ) buffer[ i ] = i; ofstream outf( “test.dat”, ios::binary ); if ( ! outf ) { cout << “Cannot open file test.dat . . .\n”; exit( 1 ); } outf.write( ( char* ) buffer, MAX * sizeof( int ) ); for ( i = 0; i < MAX; i++ ) buffer[ i ] = 0; ifstream inf( “test.dat”, ios::binary ); if ( ! inf ) { cout << “Cannot open file test.dat . . .\n”; exit( 1 ); } inf.read( ( char* ) buffer, MAX * sizeof( int ) ); for ( i = 0; i < MAX; i++ ) if ( buffer[ i ] = i ) { 191 cerr << “Du lieu khong dung . . .\n”; return; } cout << “Du lieu dung . . .\n”; } 3. Bài tập 1) Viết chương trình nối hai tập tin văn bản, tập tin thứ hai được nối vào cuối tập tin thứ nhất. Hiển thị nội dung của tập tin sau khi nối ra màn hình. Tên hai tập tin được nhập từ bàn phím. 2) Viết chương trình đọc một tập tin văn bản, tên tập tin được nhập từ bàn phím. Sau đó đếm số từ trong tập tin và hiển thị ra màn hình. 3) Viết chương trình đọc một tập tin văn bản, đếm số lần xuất hiện của một chuỗi (nếu có) trong tập tin và hiển thị ra màn hình. Tên tập tin và chuỗi cần tìm được nhập từ bàn phím. 4) Viết chương trình sao chép một tập tin văn bản thành một tập tin văn bản khác và mỗi dòng trong tập tin đích phải được đánh số thứ tự phía bên trái. Tên hai tập tin được nhập từ bàn phím. 5) Viết chương trình đọc một tập tin văn bản có tên được nhập từ bàn phím, đếm số ký tự trên mỗi dòng. Chương trình phải hiển thị số dòng, chiều dài của dòng ngắn nhất, dài nhất, và giá trị trung bình của các ký tự trên mỗi dòng. 192 6) Viết chương trình chuẩn hoá một tập tin văn bản thành tập tin khác, tên hai tập tin được nhập từ bàn phím. Chương trình sẽ bỏ những dòng trống và khoảng trắng dư thừa với qui ước như sau: Chỉ giữ lại một khoảng trắng sau dấu phẩy hay dấu chấm và có 5 khoảng trắng cho mỗi đầu dòng. Giả sử tập tin chỉ chứa các ký tự chữ cái, khoảng trắng, dấu phẩy, và dấu chấm. 7) Viết chương trình đọc tập tin văn bản, đếm số ký tự khác trằng, số dòng khác trống, số từ, và số câu. Sau đó tính trung bình số ký tự trên mỗi từ và số từ trên mỗi câu. Giả sử tập tin chỉ chứa các ký tự chữ cái, khoảng trắng, dấu phẩy, dấu chấm, dấu chấm phẩy, và dấu hai chấm. Một từ là một dãy các ký tự chữ cái liên tiếp nhau, một câu là một dãy các từ được phân cách bằng khoảng trắng, dấu phẩy, dấu chấm phẩy, hay dấu hai chấm và kết thúc bằng dấu chấm. 8) Viết chương trình đọc tập tin văn bản và hiển thị nội dung của nó trong một khối có tối đa 20 dòng. Nếu sau khi hiển thị mà nội dung tập tin vẫn chưa được đọc hết thì cần thông báo cho người sử dụng biết có muốn hiển thị khối kế tiếp không. Ngược lại, kết thúc chương trình. 9) Giả sử mỗi dòng trong tập tin văn bản chứa thông tin về một sinh viên, bao gồm: Số thứ tự (từ 1 đến 100), họ tên, và điểm (số thực). Viết chương trình để nhập một số thứ tự từ bàn phím và hiển thị thông tin về sinh viên có số thứ tự tương ứng. 193 TÀI LIỆU THAM KHẢO 1. Nguyễn xuân Huy, Thuật toán, Nhà xuất bản Khoa Học và Kỹ Thuật. 2. Hoàng Kiếm, Giải một bài toán trên máy tính như thế nào, Nhà xuất bản Giáo dục. 3. Nguyễn Thanh Thủy (chủ biên), Nhập môn lập trình Ngôn ngữ C, Nhà xuất bản Khoa học và Kỹ thuật. 4. Trần Văn Lăng, Lập trình hướng đối tượng sử dụng C++, Nhà xuất bản Thống Kê. 5. GS. Phạm Văn Ất, C++ và lập trình hướng đối tượng, Nhà xuất bản Khoa học và Kỹ thuật. 6. Nguyễn Thanh Thủy, Lập trình hướng đối tượng, Nhà xuất bản Khoa học và Kỹ thuật. 7. Tô Oai Hùng, Giáo trình Cơ sở lập trình sử dụng ngôn ngữ C++, Tài liệu lưu hành nội bộ (Trường Đại Học Mở TP. HCM) 8. Joel Adams & Larry Nyhoff, C++ An Introduction to Computing, Prentice Hall 2002, Third Edition. 9. H.M. Deiteil & P.J. Deitel, C++ How to Program, Prentice Hall, New Jersey, 2003, Fourth Edition. 10. Bjarne Stroustrup, The C++ Programming Language, Addition Wesley Longman, 1997, Third Edition. 194 Biên soạn LÊ PHÚ HIẾU
File đính kèm:
- GiaoTrinhLapTrinhC++.pdf