Sự thay đổi căn bản ở chỗ, một chương trình hướng đối tượng được thiết kế xoay quanh dữ liệu mà chúng ta có thể làm việc trên đó, hơn là theo bản thân chức năng của chương trình.. Một số
Trang 1Bài giảng
NGÔN NGỮ LẬP TRÌNH
BẬC CAO
Ths Trần Thị Ngọc Linh
Trang 2Chương 1 Giới thiệu ngôn ngữ C và C++
Chương 2 Các thành phần cơ bản, các kiểu dữ
liệu cơ sở và các phép toán Chương 3 Các thao tác xử lý INPUT/OUTPUT Chương 4 Cấu trúc điều khiển
NỘI DUNG
Trang 3Chương 1 Giới thiệu ngôn ngữ C và C++
- Có nhiều ngôn ngữ C:
Hãng Borland: Turbo C→ C++→DelphiHãng Microsoft: MicrosoftC→C++→Visual C++
Trang 41.2 Lịch sử phát triển của lập trình hướng đối
tượng
Lập trình hướng đối tượng(LTHĐT) không phải là đặc quyền của một ngôn ngữ đặc biệt nào Các khái niệm trong LTHĐT được thể hiện trong nhiều ngôn ngữ lập trình khác nhau Những ngôn ngữ cung cấp được khả năng LTHĐT được gọi là ngôn ngữ LTHĐT Do đó
sự phát triển của lập trình hướng đối tượng Ta
có thể tổng quan chúng như sau:
Trang 5SIMULAR(66) SMALLTALK(71) SMALLTALK(80)
JAVA(95)
ADA(95)
EIFFEL(90)
Trang 6Khái niệm về lập trình hướng đối tượng
Lập trình hướng đối tượng (Object Oriented Programming- gọi tắt là OOP) chính là phương pháp lập trình lấy đối tượng (Object) làm nền tảng để xây dựng thuật giải, xây dựng chương trình
Khái niệm hướng đối tượng được xây dựng trên nền tảng của khái niệm lập trình có cấu trúc và sự trừu tượng hóa dữ liệu Sự thay đổi căn bản ở chỗ, một chương trình hướng đối tượng được thiết kế xoay quanh dữ liệu mà chúng ta có thể làm việc trên đó, hơn
là theo bản thân chức năng của chương trình Điều này hoàn toàn tự nhiên một khi chúng ta hiểu rằng mục tiêu của chương trình là xử lý dữ liệu
Trang 71.3 Một số khái niệm trong lập trình hướng đối tượng
Đối tượng
- Trong thế giới thực, khái niệm đối tượng được hiểu như là một thực thể, nó có thể là người, vật hoặc một bảng dữ liệu cần xử lý trong chương trình, Trong
LTHĐT thì đối tượng là biến thể hiện của lớp.
đó
Trang 8- Mỗi đối tượng có riêng cho mình một bản sao các phần tử dữ liệu của lớp Mỗi lớp bao gồm: danh sách các thuộc tính (attribute) và danh sách các phương thức
để xử lý các thuộc tính đó
- Công thức phản ánh bản chất của kỹ thuật LTHĐT là:
Đối tượng = Dữ liệu + Phương thức
Ví dụ: Xét lớp HINH_CN bao gồm các thuộc tính: (x1,y1) toạ độ góc trên bên trái, d,r là chiều dài và chiều rộng của HCN Các phương thức nhập số liệu cho HCN, hàm tính diện tích, chu vi và hàm hiển thị Lớp HINH_CN có thể được mô tả như sau:
Trang 9Phương thức:
Nhập_sl Diện tích Chu vi Hiển thị
Trang 10Chú ý: Trong LTHĐT thì lớp là khái niệm tĩnh, có thể nhận biết ngay từ văn bản chương trình, ngược lại đối tượng là khái niệm động, nó được xác định trong bộ nhớ của máy tính, nơi đối tượng chiếm một vùng bộ nhớ lúc thực hiện chương trình Đối tượng được tạo ra để xử lý thông tin, thực hiện nhiệm vụ được thiết kế, sau đó
bị hủy bỏ khi đối tượng đó hết vai trò.
Trang 11Trừu tượng hóa:
Là cách biểu diễn những đặc tính chính và bỏ qua những chi tiết vụn vặt hoặc những giải thích Khi xây dựng các lớp, ta phải sử dụng khái niệm trừu tượng hóa
Ví dụ:
Ta có thể định nghĩa một lớp để mô tả các đối tượng trong không gian hình học bao gồm các thuộc tính trừu tượng như là kích thước, hình dáng, màu sắc và các phương thức xác định trên các thuộc tính này
Trang 12BAO GÓI THÔNG TIN
- Việc đóng gói dữ liệu và các phương thức vào một đơn vị cấu trúc lớp được xem như một nguyên tắc bao gói thông tin
- Dữ liệu được tổ chức sao cho các đối tượng ở lớp khác không truy nhập vào, mà chỉ cho phép các phương thức trong cùng lớp hoặc trong những lớp có quan hệ kế thừa với nhau mới được quyền truy nhập Chính các phương thức của lớp sẽ đóng vai trò như là giao diện giữa dữ liệu của đối tượng và phần còn lại của chương trình
- Nguyên tắc bao gói dữ liệu để ngăn cấm sự truy nhập trực tiếp trong lập trình được gọi là sự che giấu thông tin
Trang 13KẾ THỪA
Là quá trình mà các đối tượng của lớp này được quyền sử dụng một số tính chất của các đối tượng của lớp khác Sự kế thừa cho phép ta định nghĩa một lớp mới trên cơ sở một hay nhiều lớp đã có,
ta còn nói các phương thức đó trong lớp con cháu (descendant) được dẫn xuất (derivation) từ các lớp
tổ tiên (ancestor)
Lớp mới này, ngoài những thành phần được kế thừa, sẽ có thêm những thuộc tính và các hàm mới Nguyên lý kế thừa hỗ trợ cho việc tạo ra cấu trúc phân cấp các lớp
Trang 14Tương ứng bội
- Là khả năng của một khái niệm (chẳng hạn các phép toán) có thể sử dụng với nhiều chức năng khác nhau
Ví dụ:
Phép cộng (+) có thể dùng để thực hiện cho các toán hạng là số, là xâu và
Trang 15Liên kết động
Là dạng liên kết các thủ tục và hàm khi chương trình thực hiện lời gọi tới các hàm, thủ tục đó Như vậy trong liên kết động, nội dung của đoạn chương trình ứng với thủ tục, hàm sẽ không được biết cho đến khi thực hiện lời gọi tới thủ tục, hàm đó
Trang 16TRUYỀN THÔNG BÁO
- Truyền thông báo cho một đối tượng là yêu cầu đối tượng thực hiện một việc gì đó Cách ứng
xử của đối tượng được mô tả bên trong lớp thông qua các phương thức.
- Trong chương trình, thông báo gửi đến cho một đối tượng chính là yêu cầu thực hiện một công việc cụ thể, nghĩa là sử dụng những hàm tương ứng để xử lý dữ liệu đã được khai báo trong đối tượng đó Vì vậy, trong thông báo phải chỉ ra được hàm cần thực hiện trong đối tượng nhận thông báo Thông báo truyền đi cũng phải xác định tên đối tượng và thông tin truyền đi
Trang 17Ví dụ: Lớp CONGNHAN có thể là đối tượng cụ thể được đại diện bởi Hoten nhận được thông báo cần tính lương thông qua hàm TINHLUONG đã được xác định trong lớp CONGNHAN Thông báo đó sẽ được xử lý như sau:
CONGNHAN.TINHLUONG (Hoten)
↑
Trong chương trình hướng đối tượng, mỗi đối tượng chỉ tồn tại trong thời gian nhất định Đối tượng được tạo ra khi nó được khai báo và sẽ bị hủy bỏ khi chương trình ra khỏi miền xác định của đối tượng đó Sự trao đổi thông tin chỉ có thể thực hiện trong thời gian đối tượng tồn tại
Trang 18Các ưu điểm của lập trình
hướng đối tượng
Thông qua thừa kế, loại bỏ được đoạn chương trình dư thừa khi mô tả dữ liệu
Chương trình được xây dựng từ các đơn thể có khả năng trao đổi với nhau nên việc thiết kế và lập trình sẽ tuân theo quy trình nhất định
Sự che giấu thông tin đảm bảo cho sự an toàn, không bị ảnh hưởng bởi chương trình khác
Trang 19 Dễ mở rộng và nâng cấp hệ thống
Kỹ thuật truyền thông báo giúp cho việc
mô tả giao diện với các hệ thống bên ngoài trở nên đơn giản hơn
Có thể quản lý được độ phức tạp của phần mềm
Có thể xây dựng được ánh xạ giữa các đối tượng có thực bên ngoài với các đối tượng trong chương trình
Trang 201.4 Cài đặt C++
- Có sẵn trong bộ nhớ gốc
- Chạy chương trình Install trong disk 1 và làm theo hướng dẫn
1.5 Môi trường Borland C++
1.6 Thiết lập cấu hình cho môi trường
Trang 21Chương 2 Các thành phần cơ bản, các kiểu dữ liệu cơ sở và các phép toán
Trang 23KHAI BÁO THƯ VIỆN
2.2 Các kiểu dữ liệu và cách khai báo
2.2.1 Khái niệm về kiểu dữ liệu
- Là kiểu được định nghĩa trong C để giải quyết các bài toán Gồm kiểu dữ liệu cơ sở, kiểu dẫn xuất, kiểu do người dùng định nghĩa
Trang 242.2.2 Kiểu dữ liệu cơ sở và khai báo
2.2.2.1 Kiểu số nguyên
- Các kiểu số nguyên bao gồm:
byte
short int (enum, int)
unsigned int
có dấu: -32768 to 32767 không dấu: 0 to 65535
2
long
Unsigned long
có dấu:-2147483648 to 2147483647 không dấu: 0 to 4294967295
4
Trang 252.2.2.2 Kiểu số thực
- Gồm các kiểu sau:
2.2.2.3 Kiểu ký tự
long double 1.2e + / - 4932 (19 digits) 10
char
unsigned char
có dấu: -128 to 127
Trang 28struct, nhưng cho phép các biến chia sẻ vùng nhớ, giống như bản ghi động trong Pascal
Trang 29<:baselist>: Các lớp cơ sở (ancestor).
Trang 30Enum Color {White, Black, Red=3,
Yellow};
Như trên, While=0, Black=1, Red=3 và Yellow=4
Trang 312.2.4 Sự tương thích giữa các kiểu
Mặc dù một số kiểu có cùng số
byte nhưng chúng không tương
thích Để gán giá trị cho nhau, phải
sử dụng phép quy đổi kiểu Cú
pháp: (<Type>) <BThức>;
Ví dụ:
Trang 322.2.5 Định nghĩa và khai báo hằng
- Hằng là đại lượng có giá trị không đổi Có các loại hằng(int, long, Float, double, xâu, ký tự)
- Định nghĩa: #define <ConstName> < BThức >
- Khai báo hằng như sau:
Sử dụng const: const <Type>
Trang 332.2.6 Các hình thức chuyển đổi kiểu giá trị
- Với các kiểu dữ liệu chuẩn ta có thể thực hiện các phép chuyển kiểu ngầm định
- Có hai loại chuyển kiểu:
Chuyển kiểu ngầm định(tự động): được thực hiện bởi trình biên dịch
Chuyển kiểu tường minh(ép kiểu): thường được dùng trong các câu lệnh gọi hàm để gửi các tham số có kiểu khác với các tham số hình thức tương ứng
Cú pháp:
Kiểu(biểu thức) hoặc (kiểu)biểu thức
Trang 342.2.7 Các tham chiếu
của biến khác đã được khai báo, và được sử dụng như với biến bình
thường Ví dụ: Int m=10, n,
&Rm=m, &Rn=n;
tham chiếu của m và n, được sử
dụng như m và n Giá trị của biến sẽ thay đổi khi thay đổi giá trị của biến tham chiếu tương ứng với nó
Trang 352.2.8 Biến con trỏ
Biến con trỏ được sử dụng rộng rãi trong Borland C++ Mỗi con trỏ chiếm bốn byte và trỏ tới vùng nhớ gồm một số byte liên tục Kích thước vùng nhớ này phụ thuộc kiểu mà con trỏ trỏ tới.
Trang 36Các con trỏ s và t đều trỏ tới kiểu char, tức là xâu ký tự Vùng nhớ của s gồm 18 byte đã được cấp phát, byte cuối cùng là ký tự NULL báo kết thúc xâu, có dạng:
Các con trỏ r và t đều chưa được cấp phát vùng nhớ Chúng có thể được sử dụng để trỏ tới các vùng nhớ của các con trỏ cùng kiểu.
Đặc biệt, với khai báo: char u[20]=” This is a
pointer”; thì thực chất u là mảng các ký tự
(char) Ta có thể cho s hoặc t trỏ tới u, nhưng
không thể thay đổi địa chỉ của u và cũng không thể trực tiếp thay đổi giá trị của u.
Trang 37- Toán tử(operator): được viết ra bằng dấu phép toán
- Toán hạng(operand): Có thể là hàng, biến, là hàm.
Trang 382.3 BIỂU THỨC CÂU LỆNH VÀ CÁC PHÉP
TOÁN
Biểu thức được phân loại:
- Biểu thức số học: là biểu thức tính ra giá trị bằng số.
- Biểu thức logic: là biểu thức về nguyên tắc chỉ
nhận hai giá trị True hoặc False
- Biểu thức quan hệ: là biểu thức chứa các toán tử quan hệ
Trang 39Toán tử đảo bit !
Toán tử tăng lên 1 ++
Toán tử giảm đi 1
Phép lấy phần bù một ~
Trang 40Phép nhân, chia, chia dư *, /,%
Trang 412.3.2 QUY TĂC THỰC HIỆN BT HAY THỨ TỰ ƯU TIÊN
CÁC PHÉP TOÁN
Quy tắc
Khi viết các biểu thức phức tạp với nhiều toán hạng chúng ta chưa
rõ được toán hạng nào được tính trước, toán hạng nào được tính sau
Trang 422.3.2 QUY TĂC THỰC HIỆN BT HAY THỨ TỰ ƯU TIÊN
4 * / % Toán tử số học Trái
Trang 432.3.2 QUY TĂC THỰC HIỆN BT HAY THỨ TỰ
ƯU TIÊN CÁC PHÉP TOÁN
5 + - Toán tử số học Trái
6 << >> Dịch bit Trái
7 < <= > >= Toán tử quan hệ Trái
8 == != Toán tử quan hệ Trái
9 & ^ | Toán tử thao tác bit Trái
10 && || Toán tử logic Trái
11 ?: Toán tử điều kiện Phải
Trang 442.3.3 CÂU LỆNH
Câu lệnh được cách nhau bởi dấu chấm phẩy
Câu lệnh được chia ra làm hai lạo: câu lện đơn giản và câu lệnh có cấu trúc.
Lện đơn giản: là những lệnh không chứa các lênh khác, như lệnh gán, lời gọi hàm loại hàm Void
Lệnh có cấu trúc: là khối lệnh, lệnh rẽ nhánh
và lệnh lặp, như if( ) else,
switch,for( ),do while
Trang 452.3.4 LỆNH HỢP THÀNH
hay hay nhiều lệnh đơn giản thậm chí
có cả lệnh ghép bên trong nó Lệnh ghép được đặt trong cập { }.
phẩy(;),
cách các câu lệnh chứ không phải là dấu kết thúc câu lệnh và nó không phụ thuộc vào câu lệnh.
Trang 462.3.5 CÁC HÀM SỐ HỌC CHUẨN
Các hàm số học chuẩn là các hàm được định nghĩa sẵn, được sử dụng với số nguyên
và đối số là số thực Chúng được nằm trong tệp thư viện <Math.h>
Việc chuyển số thực sang sô nguyên nhờ hai hàm chuản: hàm làm tròn và hàm cắt
Quy ước tham số nguyên là i, tham số thực
là f
Trang 482.3.6 CÁC PHÉP TOÁN THEO BIT
được dùng với các phép tính theo bit: Như Not(^), And(&), Or(|) Các tác vụ này không dùng được với kiểu dữ liệu float, double.
diễn nhị phân trong máy.
và 1.
Trang 492.3.6 CÁC PHÉP TOÁN THEO BIT Bảng toán tử theo bít
Trang 512.3.8 Toán tử điều kiện
Toán tử điều kiện này thực hiện như sau: Thoạt đầu tính toán biểu thức điều kiện nếu giá trị của biểu thức này đúng thì nhận giá trị của Bt1, trái lại nhận giá trị của Bt2.
VDụ: (a>b)? (max=a): (max=b);
Trang 522.3.9 CÁC PHÉP TĂNG, GIẢM ĐI 1
Phép tăng và giảm đi 1 C++ cho phép viết gọn lại như sau:
Sự khác nhau giữa hai cách viết i++ và ++i là: trong biểu thức: Biến= biểuthức;
- nếu biểu thức ++i thì i sẽ được tăng giá trị trước khi gán
- nếu biểu thức i++ thì i sẽ được tăng giá trị sau khi thực hiện phép gán
i = i +1 i ++ hoặc ++ ii= i -1 i hoặc i
Trang 532.3.10 Toán tử dãy
Là dãy các biểu thức tính toán được cách nhau bởi dấu phẩy, có dang: tb1,bt2 , trong đó biểu thức có thể chứa một dãy các lệnh.
Vdu1: a*b,x+y, trong đó biểu thức tính a*b như một giá trị,sau đó tính giá trị biểu thức x+y.
Vd2: (a>b)? (max=a, min=b): (max=b,min=a);
Trang 54Chương 3 Các thao tác xử lý INPUT/
Trang 55 cin chỉ bắt đầu sử lý dữ liệu nhập từ bàn phím sau khi phím Enter được gõ Vì vậy dù bạn chỉ nhập một kí tự thì cin vẫn sẽ kiên nhẫn chờ cho đến khi bạn gõ phím Enter
Trang 56The value you entered is 702 and its double is 1404.
Trang 57Bạn có thể dùng cin để nhập một lúc nhiều dữ liệu từ người dùng:
Trang 583.1.2 OUTPUT
- Dòng cout được sử dụng với toán tử đã quá tải
<< (overloaded - bạn sẽ hiểu rõ hơn về thuật ngữ này trong phần lập trình hướng đối tượng)
cout << "Output sentence";
// Hiển thị Output sentence lên màn hình
cout << 120; // Hiển thị số 120 lên màn hình
cout << x; // Hiển thị nội dung biến x lên màn hình
- Toán tử << được gọi là toán tử chèn vì nó chèn dữ liệu
đi sau nó vào dòng dữ liệu đứng trước
Trang 59Chú ý rằng ở dòng đầu tiên chúng ta sử dụng dấu ngoặc kép vì đó là một chuỗi kí tự Khi chúng ta muốn sử dụng các hằng xâu kí tự ta phải đặt chúng trong cặp dấu ngoặc kép để chúng có thể được phân biệt với các biến
Ví dụ: hai lệnh sau đây là hoàn toàn khác nhau:
cout << "Hello"; // Hiển thị Hello lên màn hình
cout << Hello; // Hiển thị nội dung của biến Hello lên màn hình
Trang 60- Toán tử chèn (<<) có thể được sử dụng nhiều lần trong một câu lệnh:
cout << "Hello, " << "I am " << "a C++ sentence";
- Câu lệnh trên sẽ in thông báo:
Hello, I am a C++ sentence lên màn hình
- Sự tiện lợi của việc sử dụng lặp lại toán tử chèn (<<) thể hiện
rõ khi chúng ta muốn hiển thị nhiều biến và hằng hơn là chỉ một biến:
cout << "Hello, I am " << age << " years old and my email address is " << email_add;
Trang 61- Cần phải nhấn mạnh rằng cout không nhảy xuống dòng sau khi xuất dữ liệu, vì vậy hai câu lệnh sau :
cout << "This is a sentence.";cout << "This is another sentence.";
sẽ được hiển thị trên màn hình:
This is a sentence.This is another sentence
- Bởi vậy khi muốn xuống dòng chúng ta phải sử dụng kí
tự xuống dòng, trong C++ là \n:
cout << "First sentence.\n ";
cout << "First sentence.\n ";
cout << "Second sentence.\nThird sentence.";
sẽ viết ra màn hình như sau: