C1. Giới thiệu máy tính và lập trình. C2. Kiểu dữ liệu, toán tử và phát biểu C3. Các thành tố cơ bản của C++ C4. Cấu trúc lựa chọn C5. Cấu trúc lặp vòng C6. Hàm và con trỏ C7. Lớp C8. Thao tác trên đối tượng C9. Kế thừa Đa xạ Tổng quát hóa
Trang 1Môn học : Kỹ thuật lập trình
Giảng viên : Nguyễn Xuân Minh
Kiến thức ₫ầu vào : Biết nghe, biết ghi chép, biết đọc sách
Chương trình : C1 Giới thiệu máy tính và lập trình.
C2 Kiểu dữ liệu, toán tử và phát biểu C3 Các thành tố cơ bản của C++
C4 Cấu trúc lựa chọn C5 Cấu trúc lặp vòng C6 Hàm và con trỏ C7 Lớp
C8 Thao tác trên đối tượng C9 Kế thừa - Đa xạ - Tổng quát hóa
Tài liệu tham khảo :
[1] G.J.Bronson, Program Development and Design Using C++, 2 nd
Edition, Brooks/COLE Thomson Learning, 2000.
Trang 2Chương 1
Giới thiệu
máy tính và lập trình
Trang 4Thiết bị nhập
Trang 5Màn hình CRT Màn hình LCD
Thiết bị xuất
Máy in laser
Trang 6Bộ nhớ
ROM (Read only memory)
• Chứa thông tin cố định, ít hay không đổi như chương trình khởi động máy tính, các bảng thông số dùng để tra cứu
• Còn được gọi là bộ nhớ non-volatile.
RAM (Random access memory)
• Là bộ nhớ bay hơi.
Chứa tạm chương trình hay dữ liệu khi máy tính đang
Trang 7 Có 2 thanh ghi chứa toán hạng
Thường là một bộ phận của CPU và có nhiệm
vụ xử lý thông tin cho CPU.
Trang 8 Điều khiển mọi hoạt động trong máy tính.
Quản lý mọi tài nguyên trong máy tính.
Kiểm soát các khối còn lại để thực hiện các công việc được giao.
Hoạt động dưới hình thức thi hành lệnh (instruction), chương trình (program).
Trang 9Lưu trữ
Trang 10Phần mềm (software)
Chương trình là tập hợp các lệnh bắt máy tính thực hiện một công việc và cho ra kết quả xác định.
Víết chương trình được gọi là lập trình.
Ngôn ngữ dùng để lập trình gọi là ngôn ngữ lập trình.
Trang 11 Lệnh ngôn ngữ máy thường có 2 phần : mã tác
vụ (opcode) và địa chỉ toán hạng.
Mã tác vụ cho CPU biết phải làm gì.
Địa chỉ toán hạng giúp xác định vị trí dữ liệu.
Trang 12Hợp ngữ
Hợp ngữ là dạng ngôn ngữ máy đã cải tiến bằng cách dùng mã gợi nhớ (mnemonic) thay cho số nhị phân để biểu diễn mã tác vụ và toán hạng.
CPU không thể thực thi lệnh hợp ngữ một cách trực tiếp nên cần phải có bước chuyển đổi từ lệnh hợp ngữ ra lệnh ngôn ngữ máy.
Trang 13 Hợp ngữ và ngôn ngữ máy là ngôn ngữ cấp
Trang 14Ngôn ngữ lập trình cấp cao
Ngôn ngữ lập trình cấp cao giúp con người viết chương trình dễ dàng, nhanh chóng hơn hợp ngữ vì sử dụng lệnh dễ hiểu, gần gủi với ngôn ngữ con người hoặc công thức toán.
Chương trình viết bằng ngôn ngữ cấp cao cũng cần phải dịch trước ra ngôn ngữ máy rồi mới chạy được.
Lệnh của ngôn ngữ cấp cao thường được gọi là phát biểu (statement).
Trang 15 Phần mềm hệ thống giúp con người khai thác máy tính tốt hơn.
Phần mềm hệ thống quan trọng nhất là phần
Trang 17Cú pháp (syntax)
Cú pháp của ngôn ngữ lập trình là một tập các qui tắc ràng buộc để viết cho đúng các phát biểu.
Ngôn ngữ C ra đời năm 1970 là ngôn ngữ lập trình cấu trúc (structure programming).
Ngôn ngữ C++ là bản mở rộng của ngôn ngữ C
có bổ sung khả năng lập trình hướng đến đối tượng (Object-Oriented Programming).
Trang 18Ngôn ngữ C
Ngôn ngữ C được dùng đầu tiên trong hệ điều hành UNIX Sau đó, mới phát triển trên các hệ điều hành khác.
Điểm mạnh của ngôn ngữ C so với các ngôn ngữ lập trình khác là giống với hợp ngữ.
Chương trình viết bằng ngôn ngữ C chạy nhanh
và hiệu quả hơn khi viết trên các ngôn ngữ khác.
Trang 19Ngôn ngữ C++
Ngôn ngữ C++ được dùng nhiều để viết các chương trình đồ họa dưới hệ điều hành Windows hay Macintosh.
Cung cấp khả năng lập trình hướng đến đối tượng.
Trang 20 MFC là thư viện các lớp đối tượng phát sinh phần tử giao diện sẳn có cho các ứng dụng dưới Windows.
Trang 22Giải quyết vấn ₫ề và
khai thác phần mềm (tt.)
Giai đoạn làm tài liệu có 5 loại
1. Mô tả chương trình.
2. Hướng phát triển giải thuật và những thay đổi.
3. Bảng sao kê chương trình có chú thích đầy đủ.
4. Mẫu thử chương trình.
5. Sổ tay người sử dụng.
Giai đoạn bảo trì sản phẩm liên quan đến các vấn đề sửa chữa lỡi khi đang vận hành, rà soát
Trang 23Giải thuật (Algorithms)
Có thể biểu diễn giải thuật bằng lưu đồ
Trang 24Ví dụ xác ₫ịnh số nguyên tố
Bắt đầu Nhập n đếm = 2
Trang 25 Ví dụ :
Nhập biến n cho đến khi n không nhỏ hơn 0
Gọi hàm n giai thừa
Trang 26Giải thuật (tt.)
Num ← 4
SqNum ← Num 2
Print Num, SqNum
dãy số.
Trang 29o Dòng đầu tiên của hàm dùng để mô tả gồm 3 thông tin :
~ Kiểu dữ liệu trả về (nếu có).
~ Tên hàm.
~ Danh sách thông số (nếu có).
Trang 31Đối tượng cout
o cout là đối tượng xuất, dùng để gởi thông tin ra màn hình
o Xuất thông tin ra đối tượng cout như sau :
cout << "text";
Trong đó, dấu << là toán tử kết xuất có thể dùng liên tiếp, text
là chuỗi ký tự cần hiện ra màn hình Dấu nháy kép " là dấu
Trang 32o Chỉ thị include có nhiệm vụ chèn nội dung tập tin theo đi sau
nó vào module hiện tại trước khi dịch
Trang 33Điều khiển xuất nhập
o Điều khiển xuất nhập (i/o manipulator) là hàm đặc biệt được dùng trong phát biểu xuất nhập để tạo ra các định dạng dữ liệu mong muốn
o Điều khiển xuất nhập endl của lớp iostream cung cấp ký tự xuống dòng-về đầu dòng (cr-lf)
o Ví dụ :
cout << "Khu nien kim nhat thu mon trung" << endl;
cout << "Nhan dien dao hoa tuong anh hong" << endl;
o Phát biểu dài có thể viết xuống nhiều dòng
cout << "Nhan dien bat tri ha xu khu, "
<< "Dao hoa y cuu tieu dong phong."
<< endl;
Trang 34Tổng quát về code của 1 ứng dụng VC++
lệnh định nghĩa các phần tử cấu thành chương trình : kiểu dữ liệu mới, hằng, biến, hàm
bậc các thành phần cấu thành 1 ứng dụng
Trang 35Tổng quát về code của 1 ứng dụng VC++ (tt.)
o Trong 1 project VC++ có 2 loại phần tử có chứa code (do đó ta cần biết cú pháp VC++ để xây dựng các loại phần từ này) :
~ File *.h (hay *.hxx) định nghĩa interface sử dụng của 1 (hay nhiều) module (hay class) có mối quan hệ mật thiết với nhau.
~ File *.cpp (hay *.cxx) định nghĩa sự hiện thực của 1 (hay nhiều) module (hay class) có mối quan hệ mật thiết với nhau.
~ Vì file *.h và *.cpp có thể định nghĩa hoặc các class hoặc các module
(đơn vị phần mềm nhỏ có 1 chức năng rõ ràng nào đó cấu thành phần mềm cổ điển) ⇒ VC++ hỗ trợ cả 2 phương pháp lập trình : có cấu trúc
và OOP.
o Ngoài một vài ngoại lệ nhỏ, tổ chức code cho 2 loại file trên hoàn toàn giống nhau : đó là danh sách nhiều lệnh VC++ phục vụ định nghĩa kiểu, hằng, biến và function trong module đó.
o Trong định nghĩa function, ta sẽ dùng các lệnh thực thi để miêu tả
Trang 36Cú pháp của C++
o VC++ cho phép dùng hầu hết các ký tự mà bạn có thể nhập từ bàn phím, trong đó các ký tự chữ và số được dùng chủ yếu.
o Qui tắc đật tên (danh hiệu):
~ VC++ có phân biệt chữ HOA và chữ thường.
+ Base1_ball + Base.1 : vì có dấu chấm
+ ThisIsLongButOk + Base&1 : vì có dấu &
Trang 37Cú pháp của C++ (tt.)
cứu từng loại câu lệnh và qui tắc cấu thành nó, nhưng may mắn số lượng loại câu lệnh VC++ là không nhiều (dưới 20 loại)
~ Các lệnh định nghĩa và khai báo : xác định 1 hành động nào
đó tại thời điểm dịch.
~ Các lệnh thực thi : xác định 1 hành động nào đó tại thời điểm thực thi.
Trang 38Cú pháp dùng giá trị trong C++
o Giá trị luận lý : TRUE | FALSE
o Giá trị thập phân nguyên : [+|-] [decdigit]+ (Vd: 125, -548)
Lưu ý ta dùng | để miêu tả sự chọn lựa, [ ] để miêu tả có từ 0 tới 1, [ ]* để miêu tả có từ 0 tới n, [ ]+ để miêu tả có từ 1 tới n (n>1).
o Giá trị thập lục phân nguyên : [+|-] 0x[hexdigit]+ (Vd: 0xFF)
o Giá trị bát phân nguyên : [+|-] 0[ocdigit]+ (Vd: 0577)
o Giá trị thập phân thực :
[+|-] [decdigit]+ [.[decdigit]*] [E [+|-] [decdigit]+]
(Vd: 3.14159, 0.31459e1, -83.1e-9, )
o Giá trị chuỗi : "Nguyen Van A"
"\t\"Nguyen Van A\"\n"
o Lưu ý dùng ký tự '\' để thực hiện cơ chế 'escape' dữ liệu hầu giải quyết nhầm lẫn.
Trang 39Chú thích
o Chú thích trong chương trình dùng để làm rõ nghĩa một phát biểu, một đoạn lệnh hay một hàm
o Có 2 loại chú thích :
~ Cuối dòng phát biểu Mở đầu bằng dấu //.
~ Khối chú thích Bắt đầu bằng dấu /* và kết thúc bằng dấu */.
o Ví dụ :
Void main()
{ /* Dong chu thich 1 cua khoi chu thich
Dong chu thich 2 */
cout << "chu thich trong chuong trinh";
// Ket thuc chuong trinh
}
Trang 40Chú thích (tt.)
o Dùng chú thích viết va trang trí tiêu đề cho hàm
/*
-Hàm xử lý biến cố khi ấn nút CE (Clear Entry)
của form giao diện chương trình MiniCalculator
Trang 41Kiểu dữ liệu
o Kiểu dũ liệu là phân loại thông tin chứa trong biến
o Kiểu dũ liệu cung cấp bởi C++ chia ra thành kiểu có sẳn (tên kiểu do C++ qui định) và kiểu của người sử dụng (tên kiểu do người sử dụng đặt thông qua đặc tả kiểu)
Trang 42Kiểu dữ liệu có sẳn của C++
o void : 0 byte (không có giá trị nào), được dùng để miêu tả kiểu trả về của
hàm mà không muốn trả về giá trị.
o char : 1 byte từ -128 đến 127
o BYTE = unsigned char : 1 byte, 0 to 255
o BOOL = unsigned char : 1 bytes, True <> 0 or False = 0
o short : 2 bytes, -32,768 to 32,767
o WORD = unsigned short : 2 bytes, 0 to 65535
o int = long (long integer) : 4 bytes
-2,147,483,648 to 2,147,483,647
o DWORD = unsigned int = unsigned long : 4 bytes
0 to 4,294,967,295
o float (single-precision floating-point) :4 bytes
-3.402823E38 to -1.401298E-45 ;1.401298E-45 to 3.402823E38
o double (double-precision floating-point) : 8 bytes
-1.79769313486231E308 to -4.94065645841247E-324;
Trang 43Kiểu dữ liệu của người sử dụng
o Nếu trong 1 module nào đó cần dữ liệu có cấu trúc đặc thù mà VC++ chưa cung cấp, người lập trình sẽ dùng phát biểu enum , struct , typedef , class để định nghĩa kiểu này Phát biểu typedef kết hợp tên kiểu (tự đặt) với 1 kiểu có trước (vừa định nghĩa hay đã định nghĩa trước đó) Có 5 loại chính : kiểu liệt kê, kiểu array, kiểu union, kiểu struct (record) và class.
o Một kiểu rất quan trọng trong C++ là kiểu pointer Giá trị thuộc kiểu pointer là địa chỉ luận lý của 1 ô nhớ chương trình (thường để xác định 1 vùng nhớ dữ liệu nào đó) Nhờ kiểu pointer, ta có thể truy xuất dữ liệu 1 cách gián tiếp, nhờ đó ta truy xuất được thông tin trong các vùng nhớ được cấp phát động (nhờ hàm mallloc và free).
o Kiểu pointer luôn kèm theo kiểu của dữ liệu ở vùng nhớ mà pointer
Trang 44chữ HOA và chữ thường)
biến đó Ví dụ :
~ Biến pointer có giá trị ngầm định là pointer NULL.
(tốt nhất nên định nghĩa: const int NULL = 0; trước khi dùng)
~ Biến số có giá trị ngầm định là 0.
biến trước khi dùng chúng
cho biến, giá trị cũ của biến sẽ bị mất đi
Trang 45Tầm vực truy xuất biến
o Tầm vực của một biến là tập các lệnh được phép truy xuất biến đó.
o VC++ cho phép 3 cấp độ tầm vực sau :
~ Cục bộ trong function : bất kỳ lệnh nào trong function đều có thể truy xuất được biến cục bộ trong function đó.
void Command1_Click() { char strGreeting[256] // Khai báo cục bộ .
Trang 46Thời gian sống của biến
o Biến là 1 thực thể nên cũng có thời gian sống hữu hạn, thời gian sống của biến thường phụ thuộc vào tầm vực của biến đó :
~ Biến cục bộ trong function : được tạo ra lúc function được gọi
và mất đi khi thủ tục kết thúc việc xử lý và điều khiển được trả về lệnh gọi.
~ Biến cục bộ trong module : được tạo ra lúc module được tạo
ra và mất đi khi module bị xóa
Các modules có thời gian sống từ lúc chương trình chạy cho đến khi chương trình kết thúc.
Các đối tượng của class được tạo ra khi có yêu cầu cụ thể Tạo đối tượng nghĩa là tạo các thuộc tính của nó, các thuộc tính của đối tượng sẽ mất đi khi đối tượng bị xóa.
~ Biến toàn cục : được tạo ra lúc chương trình bắt đầu chạy và chỉ mất đi khi chương trình kết thúc.
Trang 47Thời gian sống của biến (tt.)
cách sau :
~ Nâng cấp tầm vực : từ cục bộ trong function lên cục bộ trong module hay lên toàn cục Cách này ít được dùng tường minh vì
nó sẽ thay đổi tầm vực của biến.
~ Ghi giá trị biến ra môi trường chứa tin bền vững (file trên
đĩa) trước khi biến bị xóa Khi cần lại giá trị của biến này, ta đọc giá trị của nó từ file vào Đây là phương pháp thông dụng để trao đổi dữ liệu giữa 2 ứng dụng khác nhau hay giữa 2 lần chạy khác
Trang 48Các lệnh ₫ịnh nghĩa
o File *.h thường chỉ chứa các lệnh định nghĩa và khai báo, còn file
*.cpp sẽ chứa thêm các lệnh thực thi Các lệnh định nghĩa cho phép
ta định nghĩa tính chất của các thuộc tính dữ liệu, các lệnh thực thi dùng để hiện thực giải thuật thi hành của các method (function).
o Lệnh định nghĩa dữ liệu gồm có định nghĩa biến, định nghĩa hằng và định nghĩa kiểu
o Cú pháp định nghĩa hằng gợi nhớ cơ bản :
const <type> <name> = <value> ;
hay #define <ConstName> <value>
Lưu ý : ta dùng dấu <> để miêu tả phần tử do người sử dụng đặt
Trang 49Phát biểu ₫ịnh nghĩa biến
o Cú pháp cơ bản của định nghĩa biến toàn cục :
<type> <variable> [=<ConstExpr>];
o Cú pháp cơ bản của khai báo lại biến toàn cục để sử dụng lại trong module :
extern <type> <variable> ;
o Cú pháp cơ bản của định nghĩa biến cục bộ trong module :
static <type> <variable> [=<ConstExpr>];
o Cú pháp cơ bản của định nghĩa biến (thuộc tính) cục bộ trong class đối tượng :
[ private | protected | public]: <type> <variable> ;
o Lưu ý trong 1 ngữ cảnh xác định, ta chỉ được phép định nghĩa 1 biến 1 lần, nhưng ta có thể khai báo biến nhiều lần miễn sao các lệnh khai báo này không mâu thuẩn nhau (về kiểu).
Trang 50Kiểu dữ liệu của người sử dụng
o Ngoài các kiểu dữ liệu định sẵn, VC++ còn cung cấp cho người lập trình 1 phương tiện để họ có thể định nghĩa bất kỳ kiểu dữ liệu chưa cung cấp sẵn nhưng lại cần thiết cho ứng dụng của họ, ta gọi các kiểu này là kiểu do người sử dụng định nghĩa Có 5 loại chính :
kiểu liệt kê , kiểu array , kiểu union , kiểu struct (record) và class
Ví dụ định nghĩa kiểu Days chứa các trị ngày trong tuần
enum Days // Declare enum type Days
{ saturday, // saturday = 0 by default
Trang 51Xử lý dữ liệu liệt kê (enum)
void lich(Days today); // Variable today has type Days
Trang 52Kiểu dãy (array)
Dãy là kiểu dữ liệu gồm nhiều phần tử có cùng kiểu dữ liệu cơ sở, dùng chung một tên và phân biệt với nhau bởi chỉ số ( index ).
Trang 54Xử lý dãy
#define N 100
// đoạn chương trình tính tổng 2 ma trận
double a[N][N],b[N][N],c[N][N]; int i,j;
for(i=0;i<N;i++) // duyệt theo hàng
for(j=0;j<N;j++) // duyệt theo cột
for(i=0;i<M;i++) // duyệt theo hàng
for(j=0;j<N;j++) // duyệt theo cột
Trang 55Kiểu chuỗi (string)
Ví dụ : char hoten[50];
mà chỉ có thể làm thông qua các hàm có sẳn trong thư viện string.lib
Ví dụ : strcpy(hoten,"Kim Dung");
như hoten[8]='\r'; hoten[9]='\n'; hoten[10]='\0';
Trang 56Kiểu hợp nhất (union)
o union là kiểu dữ liệu hợp lại bởi nhiều biến thành viên thuộc các kiểu dữ liệu khác nhau nhưng có cùng địa chỉ nghĩa là dữ liệu của chúng sẽ chồng chập lên nhau
mà thôi
các biến thành viên còn lại
Trang 57ng đ
ịa chỉ
Trang 58Kiểu cấu trúc (struct)
các kiểu dữ liệu khác nhau theo một cấu trúc nào đó
Trang 59Xử lý dữ liệu cấu trúc
struct Person { // Khai báo kiểu cấu trúc Person
int age; // Khai báo vùng
float weight;
char name[25];
} family_member; // family_member là biến
struct Person sister; // khai báo theo phong cách C
Person brother; // khai báo theo phong cách C++
typedef struct Person T_Person;
T_Person T_brother;
Trang 61Kiểu con trỏ (pointer)
o Kiểu con trỏ cho phép truy xuất dữ liệu một cách gián tiếp thông qua địa chỉ của nó
o Toán tử '&' cho phép lấy địa chỉ của một biến như sau :
Trang 63param = (double**) malloc(m*sizeof(double*));
// cấp phát m dãy kiểu double (mỗi dãy có n phần tử)
for (i = 0; i < m; i++)
Trang 64Ví dụ về con trỏ
o int* pi; // pointer to int
o char** ppc ; // pointer to pointer to char
o int* ap [15]; // array of 15 pointers to ints
o int (* fp )(char*); // pointer to function taking a char*
// argument; returns an int
o int* f (char*); // function taking a char* argument; returns
// a pointer to int