Giáo trình Lập trình C++ - Lê Phú Hiếu
C++ hiện là ngôn ngữlập trình (NNLT) được ưa chuộng và
sửdụng rộng rãi do tính năng mạnh mẽ, đa dụng của nó.
Đây là NNLT được nhiều trường đại học và cao đẳng trong
và ngoài nước sửdụng đểgiảng dạy lập trình ban đầu cho
sinh viên.
Giáo trình “Lập trình C++” này được viết nhằm phục vụcho
đối tượng là sinh viên các hệCao đẳng và Đại học thuộc
khối ngành Kỹthuật (Không chuyên vềCông nghệThông
Tin). Mục tiêu của giáo trình nhằm cung cấp kiến thức cơ
bản vềngôn ngữlập trình C++, đủ đểgiải quyết những bài
toán lập trình trong nhiều lĩnh vực khác nhau như: tính toán,
kỹthuật, sinh học, quản lý,
Với sốlượng trang khiêm tốn, giáo trình này giới hạn,
không đềcập đến cách tiếp cận lập trình hướng đối tượng
mà chỉnhấn mạnh đến kiểu lập trình truyền thống,lập trình
đơn thể(module), theo tiếp cận hướng cấu trúc. Kiểu lập
trình truyền thống là quan trọng và theo ý kiến cá nhân là
bắt buộc phải giảng dạy cho người mới bắt đầu học lập trình
trước khi chuyển sang học lập trình theo tiếp cận hướng đối
tượng.
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:
Giáo trình Lập trình C++ - Lê Phú Hiếu.pdf

