Bài giảng Ngôn ngữ lập trình C/C++ - pdf 17

Download miễn phí Bài giảng Ngôn ngữ lập trình C/C++



MỤC LỤC
Chương 1. CÁC KHÁI NIỆM CƠBẢN CỦA C++
I. CÁC YẾU TỐCƠBẢN .1
1. Bảng ký tựcủa C++ . 1
2. Từkhoá . 2
3. Tên gọi. 2
4. Chú thích trong chương trình . 3
II. MÔI TRƯỜNG LÀM VIỆC CỦA C++ .3
1. Khởi động - Thoát khỏi C++. 3
2. Giao diện và cửa sổsoạn thảo . 4
3. Cấu trúc một chương trình trong C++. 7
III. CÁC BƯỚC ĐỂTẠO VÀ THỰC HIỆN MỘT CHƯƠNG TRÌNH .8
1. Qui trình viết và thực hiện chương trình . 8
2. Soạn thảo tệp chương trình nguồn . 8
3. Dịch chương trình . 9
4. Chạy chương trình. 9
IV. VÀO/RA TRONG C++ .9
1. Vào dữliệu từbàn phím. 9
2. In dữliệu ra màn hình . 10
3. Định dạng thông tin cần in ra màn hình . 12
4. Vào/ra trong C . 14
Chương 2. KIỂU DỮLIỆU, BIỂU THỨC VÀ CÂU LỆNH
I. KIỂU DỮLIỆU ĐƠN GIẢN.20
1. Khái niệm vềkiểu dữliệu . 20
2. Kiểu ký tự. 21
3. Kiểu sốnguyên. 22
4. Kiểu sốthực . 22
II. HẰNG - KHAI BÁO VÀ SỬDỤNG HẰNG .23
1. Hằng nguyên . 23
2. Hằng thực . 23
3. Hằng kí tự. 24
4. Hằng xâu kí tự. 25
5. Khai báo hằng. 26
III. BIẾN - KHAI BÁO VÀ SỬDỤNG BIẾN .27
1. Khai báo biến . 27
2. Phạm vi của biến . 28
3. Gán giá trịcho biến (phép gán) . 28
4. Một số điểm lưu ý vềphép gán . 29
IV. PHÉP TOÁN, BIỂU THỨC VÀ CÂU LỆNH.30
5. Phép toán . 30
6. Các phép gán . 32
7. Biểu thức . 33
8. Câu lệnh và khối lệnh. 37
V. THƯVIỆN CÁC HÀM TOÁN HỌC .38
1. Các hàm sốhọc . 38
2. Các hàm lượng giác. 38
Chương 3. CẤU TRÚC ĐIỀU KHIỂN VÀ DỮLIỆU KIỂU MẢNG
I. CẤU TRÚC RẼNHÁNH .41
1. Câu lệnh điều kiện if . 41
2. Câu lệnh lựa chọn switch . 43
3. Câu lệnh nhảy goto. 45
II. CẤU TRÚC LẶP .47
1. Lệnh lặp for . 47
2. Lệnh lặp while . 51
3. Lệnh lặp do . while . 55
4. Lối ra của vòng lặp: break, continue . 57
5. So sánh cách dùng các câu lệnh lặp . 58
III. MẢNG DỮLIỆU .59
1. Mảng một chiều. 59
2. Xâu kí tự. 63
IV. MẢNG HAI CHIỀU.73
Chương 4. HÀM VÀ CHƯƠNG TRÌNH
I. CON TRỎVÀ SỐHỌC ĐỊA CHỈ.83
1. Địa chỉ, phép toán & . 83
2. Con trỏ. 84
3. Các phép toán với con trỏ. 86
4. Cấp phát động, toán tửcấp phát, thu hồi new, delete. 88
5. Con trỏvà mảng, xâu kí tự. 90
6. Mảng con trỏ. 94
II. HÀM .95
1. Khai báo và định nghĩa hàm. 95
2. Lời gọi và sửdụng hàm. 98
3. Hàm với đối mặc định . 100
4. Khai báo hàm trùng tên . 101
5. Biến, đối tham chiếu. 102
6. Các cách truyền tham đối . 104
7. Hàm và mảng dữliệu . 109
8. Con trỏhàm . 119
III. ĐỆQUI.123
1. Khái niệm đệqui . 123
2. Lớp các bài toán giải được bằng đệqui . 124
3. Cấu trúc chung của hàm đệqui . 125
4. Các ví dụ. 125
IV. TỔCHỨC CHƯƠNG TRÌNH.127
1. Các loại biến và phạm vi . 127
2. Biến với mục đích đặc biệt. 132
3. Các chỉthịtiền xửlý . 135
Chương 5. DỮLIỆU KIỂU CẤU TRÚC VÀ HỢP
I. KIỂU CẤU TRÚC.145
1. Khai báo, khởi tạo . 145
2. Truy nhập các thành phần kiểu cấu trúc. 147
3. Phép toán gán cấu trúc . 148
4. Các ví dụminh hoạ. 150
5. Hàm với cấu trúc . 152
6. Cấu trúc với thành phần kiểu bit . 164
7. Câu lệnh typedef. 165
8. Hàm sizeof() . 166
II. CẤU TRÚC TỰTRỎVÀ DANH SÁCH LIÊN KẾT.166
1. Cấu trúc tựtrỏ. 167
2. Khái niệm danh sách liên kết . 169
3. Các phép toán trên danh sách liên kết . 170
III. KIỂU HỢP .176
1. Khai báo . 176
2. Truy cập. 176
IV. KIỂU LIỆT KÊ.177
Chương 6. ĐỒHỌA VÀ ÂM THANH
I. ĐỒHOẠ.184
1. Khái niệm đồhoạ. 184
2. Vào/ra chế độ đồhoạ. 185
3. Vẽ điểm, đường, khối, màu sắc. 188
4. Viết văn bản trong màn hình đồhọa . 195
5. Chuyển động . 197
6. Vẽ đồthịcủa các hàm toán học. 200
II. ÂM THANH .207
Chương 7. LỚP VÀ ĐỐI TƯỢNG
I. LẬP TRÌNH CẤU TRÚC VÀ LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG .212
1. Phương pháp lập trình cấu trúc . 212
2. Phương pháp lập trình hướng đối tượng . 214
II. LỚP VÀ ĐỐI TƯỢNG .216
1. Khai báo lớp . 217
2. Khai báo các thành phần của lớp (thuộc tính và cách) . 217
3. Biến, mảng và con trỏ đối tượng . 219
III. ĐỐI CỦA PHƯƠNG THỨC, CON TRỎthis .224
1. Con trỏthis là đối thứnhất của cách . 224
2. Tham số ứng với đối con trỏthis . 225
3. Các đối khác của cách . 226
IV. HÀM TẠO (Constructor) .230
1. Hàm tạo (hàm thiết lập) . 230
2. Lớp không có hàm tạo và hàm tạo mặc định . 235
3. Hàm tạo sao chép (Copy constructor) . 238
V. HÀM HỦY (Destructor) . 246
1. Hàm hủy mặc định . 246
2. Quy tắc viết hàm hủy . 246
3. Vai trò của hàm hủy trong lớp DT . 247
4. Ví dụ. 247
VI. CÁC HÀM TRỰC TUYẾN (inline) . 253
1. Ưu nhược điểm của hàm . 253
2. Các hàm trực tuyến . 253
3. Cách biên dịch và dùng hàm trực tuyến . 254
4. Sựhạn chếcủa trình biên dịch . 255
Chương 8. HÀM BẠN, ĐỊNH NGHĨA PHÉP TOÁN CHO LỚP
I. HÀM BẠN (friend function) . 258
1. Hàm bạn . 258
2. Tính chất của hàm bạn . 259
3. Hàm bạn của nhiều lớp . 261
II. ĐỊNH NGHĨA PHÉP TOÁN CHO LỚP . 266
1. Tên hàm toán tử. 266
2. Các đối của hàm toán tử. 266
3. Thân của hàm toán tử. 267
Chương 11. CÁC DÒNG NHẬP/XUẤT VÀ FILE
I. NHẬP/XUẤT VỚI CIN/COUT . 276
1. Toán tửnhập >> . 276
2. Các hàm nhập kí tựvà xâu kí tự. 277
3. Toán tửxuất << . 279
II. ĐỊNH DẠNG. 279
1. Các cách định dạng . 280
2. Các cờ định dạng . 281
3. Các bộvà hàm định dạng . 283
III. IN RA MÁY IN.283
IV. LÀM VIỆC VỚI FILE.284
1. Tạo đối tượng gắn với file. 284
2. Đóng file và giải phóng đối tượng . 285
3. Kiểm tra sựtồn tại của file, kiểm tra hết file. 289
4. Đọc ghi đồng thời trên file . 290
5. Di chuyển con trỏfile. 290
V. NHẬP/XUẤT NHỊPHÂN.292
1. Khái niệm về2 loại file: văn bản và nhịphân. 292
2. Đọc, ghi kí tự. 293
3. Đọc, ghi dãy kí tự. 293
4. Đọc ghi đồng thời. 294



Để tải bản Đầy Đủ của tài liệu, xin Trả lời bài viết này, Mods sẽ gửi Link download cho bạn sớm nhất qua hòm tin nhắn.
Ai cần download tài liệu gì mà không tìm thấy ở đây, thì đăng yêu cầu down tại đây nhé:
Nhận download tài liệu miễn phí

Tóm tắt nội dung tài liệu:

mảng, trong khai báo ta chỉ cần thêm [n] vào sau tên mảng với n là số
lượng tối đa các con trỏ. Ví dụ sau minh hoạ cách sử dụng này. Trong ví dụ chúng ta
xây dựng 4 hàm cộng, trừ, nhân, chia 2 số thực. Các hàm này giống nhau về kiểu, số
lượng đối, … Chúng ta có thể sử dụng 4 con trỏ hàm riêng biệt để trỏ đến các hàm này
hay cũng có thể dùng mảng 4 con trỏ để trỏ đến các hàm này. Chương trình sẽ in ra
kết quả cộng, trừ, nhân, chia của 2 số nhập vào từ bàn phím.
Ví dụ 17 :
void cong(int a, int b) { cout << a << " + " << b << " = " << a+b ; }
void tru(int a, int b) { cout << a << " - " << b << " = " << a-b ; }
void nhan(int a, int b) { cout << a << " x " << b << " = " << a*b ; }
void chia(int a, int b) { cout << a << ": " << b << " = " << a/b ; }
main()
{
122
Chương 4. Hàm và chương trình
clrscr();
void (*f[4])(int, int) = {cong, tru, nhan, chia}; // khai báo, khởi tạo 4 con trỏ
int m, n;
cout "Nhập m, n " ; cin >> m >> n ;
for (int i=0; i<4; i++) f(m,n);
getch();
}
III. ĐỆ QUI
1. Khái niệm đệ qui
Một hàm gọi đến hàm khác là bình thường, nhưng nếu hàm lại gọi đến chính nó
thì ta gọi hàm là đệ qui. Khi thực hiện một hàm đệ qui, hàm sẽ phải chạy rất nhiều lần,
trong mỗi lần chạy chương trình sẽ tạo nên một tập biến cục bộ mới trên ngăn xếp (các
đối, các biến riêng khai báo trong hàm) độc lập với lần chạy trước đó, từ đó dễ gây tràn
ngăn xếp. Vì vậy đối với những bài toán có thể giải được bằng phương pháp lặp thì
không nên dùng đệ qui.
Để minh hoạ ta hãy xét hàm tính n giai thừa. Để tính n! ta có thể dùng phương
pháp lặp như sau:
main()
{
int n; doule kq = 1;
cout > n;
for (int i=1; i<=n; i++) kq *= i;
cout << n << "! = " << kq;
}
Mặt khác, n! giai thừa cũng được tính thông qua (n-1)! bởi công thức truy hồi
n! = 1 nếu n = 0
n! = (n-1)!n nếu n > 0
do đó ta có thể xây dựng hàm đệ qui tính n! như sau:
double gt(int n)
{
123
Chương 4. Hàm và chương trình
if (n==0) return 1;
else return gt(n-1)*n;
}
main()
{
int n;
cout > n;
cout << gt(n);
}
Trong hàm main() giả sử ta nhập 3 cho n, khi đó để thực hiện câu lệnh cout <<
gt(3) để in 3! đầu tiên chương trình sẽ gọi chạy hàm gt(3). Do 3 ≠ 0 nên hàm gt(3) sẽ
trả lại giá trị gt(2)*3, tức lại gọi hàm gt với tham đối thực sự ở bước này là n = 2.
Tương tự gt(2) = gt(1)*2 và gt(1) = gt(0)*1. Khi thực hiện gt(0) ta có đối n = 0 nên
hàm trả lại giá trị 1, từ đó gt(1) = 1*1 = 1 và suy ngược trở lại ta có gt(2) = gt(1)*2 =
1*2 = 2, gt(3) = gt(2)*3 = 2*3 = 6, chương trình in ra kết quả 6.
Từ ví dụ trên ta thấy hàm đệ qui có đặc điểm:
− Chương trình viết rất gọn,
− Việc thực hiện gọi đi gọi lại hàm rất nhiều lần phụ thuộc vào độ lớn của đầu
vào. Chẳng hạn trong ví dụ trên hàm được gọi n lần, mỗi lần như vậy chương
trình sẽ mất thời gian để lưu giữ các thông tin của hàm gọi trước khi chuyển
điều khiển đến thực hiện hàm được gọi. Mặt khác các thông tin này được lưu
trữ nhiều lần trong ngăn xếp sẽ dẫn đến tràn ngăn xếp nếu n lớn.
Tuy nhiên, đệ qui là cách viết rất gọn, dễ viết và đọc chương trình, mặt khác có
nhiều bài toán hầu như tìm một thuật toán lặp cho nó là rất khó trong khi viết theo thuật
toán đệ qui thì lại rất dễ dàng.
2. Lớp các bài toán giải được bằng đệ qui
Phương pháp đệ qui thường được dùng để giải các bài toán có đặc điểm:
− Giải quyết được dễ dàng trong các trường hợp riêng gọi là trường hợp suy
biến hay cơ sở, trong trường hợp này hàm được tính bình thường mà không
cần gọi lại chính nó,
− Đối với trường hợp tổng quát, bài toán có thể giải được bằng bài toán cùng
dạng nhưng với tham đối khác có kích thước nhỏ hơn tham đối ban đầu. Và
sau một số bước hữu hạn biến đổi cùng dạng, bài toán đưa được về trường hợp
124
Chương 4. Hàm và chương trình
suy biến.
Như vậy trong trường hợp tính n! nếu n = 0 hàm cho ngay giá trị 1 mà không cần
phải gọi lại chính nó, đây chính là trường hợp suy biến. Trường hợp n > 0 hàm sẽ gọi
lại chính nó nhưng với n giảm 1 đơn vị. Việc gọi này được lặp lại cho đến khi n = 0.
Một lớp rất rộng của bài toán dạng này là các bài toán có thể định nghĩa được
dưới dạng đệ qui như các bài toán lặp với số bước hữu hạn biết trước, các bài toán
UCLN, tháp Hà Nội, ...
3. Cấu trúc chung của hàm đệ qui
Dạng thức chung của một chương trình đệ qui thường như sau:
if (trường hợp suy biến)
{
trình bày cách giải // giả định đã có cách giải
}
else // trường hợp tổng quát
{
gọi lại hàm với tham đối "bé" hơn
}
4. Các ví dụ
Ví dụ 1 : Tìm UCLN của 2 số a, b. Bài toán có thể được định nghĩa dưới dạng đệ qui
như sau:
− nếu a = b thì UCLN = a
− nếu a > b thì UCLN(a, b) = UCLN(a-b, b)
− nếu a < b thì UCLN(a, b) = UCLN(a, b-a)
Từ đó ta có chương trình đệ qui để tính UCLN của a và b như sau.
int UCLN(int a, int b) // qui uoc a, b > 0
{
if (a < b) UCLN(a, b-a);
if (a == b) return a;
if (a > b) UCLN(a-b, b);
}
125
Chương 4. Hàm và chương trình
Ví dụ 2 : Tính số hạng thứ n của dãy Fibonaci là dãy f(n) được định nghĩa:
− f(0) = f(1) = 1
− f(n) = f(n-1) + f(n-2) với ∀n ≥ 2.
long Fib(int n)
{
long kq;
if (n==0 || n==1) kq = 1; else kq = Fib(n-1) + Fib(n-2);
return kq;
}
Ví dụ 3 : Chuyển tháp là bài toán cổ nổi tiếng, nội dung như sau: Cho một tháp n tầng,
đang xếp tại vị trí 1. Yêu cầu bài toán là hãy chuyển toàn bộ tháp sang vị trí 2 (cho
phép sử dụng vị trí trung gian 3) theo các điều kiện sau đây
− mỗi lần chỉ được chuyển một tầng trên cùng của tháp,
− tại bất kỳ thời điểm tại cả 3 vị trí các tầng tháp lớn hơn phải nằm dưới các
tầng tháp nhỏ hơn.
Bài toán chuyển tháp được minh hoạ bởi hình vẽ dưới đây.
trước khi chuyển sau khi chuyển
1 2 3 1 2 3
Bài toán có thể được đặt ra tổng quát hơn như sau: chuyển tháp từ vị trí di đến vị
trí den, trong đó di, den là các tham số có thể lấy giá trị là 1, 2, 3 thể hiện cho 3 vị trí.
Đối với 2 vị trí di và den, dễ thấy vị trí trung gian (vị trí còn lại) sẽ là vị trí 6-di-den (vì
di+den+tg = 1+2+3 = 6). Từ đó để chuyển tháp từ vị trí di đến vị trí den, ta có thể xây
dựng một cách chuyển đệ qui như sau:
• chuyển 1 tầng từ di sang tg,
• chuyển n-1 tầng còn lại từ di sang den,
• chuyển trả tầng tại vị trí tg về lại vị trí den
126
Chương 4. Hàm và chương trình
hiển nhiên nếu số tầng là 1 thì ta chỉ phải thực hiện một phép chuyển từ di sang den.
Mỗi lần chuyển 1 tầng từ vị trí i đến j ta kí hiệu i → j. Chương trình sẽ nhập vào
input là số tầng và in ra các bước chuyển theo kí hiệu trên.
Từ đó ta có thể xây dựng hàm đệ qui sau đây ;
void chuyen(int n, int di, int den) // n: số tầng, di, den: vị trí đi, đến
{
if (n==1) cout << di << " → " << den << endl;
else {
cout << di << "→" << 6-di-den << endl; // 1 tầng từ di qua trung gian
chuyen(n-1, di, den) ; // n-1 tầng từ di qua den
cout << 6-di-den << "→" den << endl; // 1 ...
Music ♫

Copyright: Tài liệu đại học © DMCA.com Protection Status