Tài liệu hướng dẫn thực hành môn Phương pháp lập trình hướng đối tượng - Tuần 1: Hàm toán tử
Tác giả:
Môn PPLTHĐT
Nguyễn Minh Huy
Phạm Minh Tuấn
Cập nhật:
Hướng dẫn thực hành tuần 1
Trương Phước Lộc
Trần Duy Quang
Mục tiêu
Giới thiệu sơ lược về nhập xuất trong C++, tìm hiểu một số khái niệm cơ bản như hàm
toán tử và function template, thống nhất một số chuẩn và quy ước trong lập trình.
Nội dung
-
-
-
Hàm toán tử.
Function Template.
Các chuẩn và quy ước lập trình.
Yêu cầu
Nắm vững phương pháp lập trình cấu trúc trong C++ và biết cách sử dụng môi trường lập
trình Visual Studio 2010
1
Hướng dẫn thực hành tuần 1
Hàm toán tử
Mục lục
1. Hàm toán tử ................................................................................................................. 3
Bài tập:............................................................................................................................ 4
2. Function Template....................................................................................................... 5
Khai niệm........................................................................................................................ 5
Nhận xét.......................................................................................................................... 6
Bài tập ............................................................................................................................. 6
3. Các chuẩn và quy ước lập trình ................................................................................... 7
Quy ước đặt tên hằng...................................................................................................... 7
Quy ước đặt tên biến....................................................................................................... 7
Quy ước đặt tên kiểu dữ liệu tự định nghĩa .................................................................... 8
Quy ước đặt tên hàm....................................................................................................... 8
Quy ước viết câu lệnh ..................................................................................................... 9
Quy ước cách khoảng ................................................................................................... 10
Quy ước viết chú thích.................................................................................................. 11
2
Hướng dẫn thực hành tuần 1
Hàm toán tử
1. Hàm toán tử
Trong C++, chúng ta được phép dùng các toán tử (+, -, *, /, >, <, =,…) để đặt tên hàm
nhưng với điều kiện kèm theo từ khóa “operator” phía trước. Để hiểu rõ hơn về hàm toán
tử trong C++, chúng ta cùng xây dựng chương trình cho phép thực hiện phép toán + và so
sánh > trên phân số.
Bước 1: vào Visual studio, tạo project dạng Console Application.
Bước 2: thêm vào đầu chương trình dòng sau “#include <iostream>” và “using
namespace std;” để sử dụng thư viện “iostream”.
Bước 3: xây dựng struct PhanSo để lưu thông tin phân số.
struct PhanSo
{
int
int
iTuSo;
iMauSo;
// Tu so cua phan so.
// Mau so cua phan so.
};
Bước 4: xây dựng các hàm toán tử cho phép thực hiện các phép toán trên phân số.
Toán tử + hai phân số
PhanSo operator +(const PhanSo &a, const PhanSo &b)
{
PhanSo
c;
c.iTuSo = a.iTuSo * b.iMauSo + b.iTuSo * a.iMauSo;
c.iMauSo = a.iMauSo * b.iMauSo;
return c;
}
Toán tử so sánh > hai phân số
bool operator >(const PhanSo &a, const PhanSo &b)
{
long lMauSoQuyDong = (long)a.iMauSo * b.iMauSo;
long lTuSoQuyDongA = (long)a.iTuSo * b.iMauSo;
long lTuSoQuyDongB = (long)b.iTuSo * a.iMauSo;
if (lMauSoQuyDong > 0)
return lTuSoQuyDongA > lTuSoQuyDongB;
return lTuSoQuyDongA < lTuSoQuyDongB;
}
Bước 5: sử dụng các phép toán đã xây dựng.
3
Hướng dẫn thực hành tuần 1
Hàm toán tử
void main()
{
PhanSo
a, b, c;
cout << "Nhap tu so a = ";
cin >> a.iTuSo;
cout << "Nhap mau so a = ";
cin >> a.iMauSo;
cout << "Nhap tu so b = ";
cin >> b.iTuSo;
cout << "Nhap mau so b = ";
cin >> b.iMauSo;
if (a > b)
cout << "a lon hon b";
else
cout << "a nho hon b";
c = a + b;
cout << "\nTu so c = " << c.iTuSo;
cout << "\nMau so c = " << c.iMauSo;
}
Với các hàm toán tử đã xây dựng, chúng ta có thể thực hiện các phép toán + và so sánh >
giữa hai phân số một cách rất tự nhiên như giữa các kiểu dữ liệu cơ bản.
Bài tập:
1. Xây dựng chương trình cho phép thực hiện các phép toán +, -, *, /, so sánh >, <, ==
trên phân số.
2. Xây dựng chương trình cho phép thực hiện các phép toán +, -, *, /, so sánh >, <, ==
trên số phức (biểu diễn dưới dạng a + bi, với
).
a,b R
4
Hướng dẫn thực hành tuần 1
Function Template
2. Function Template
Khai niệm
Xét ví dụ hàm tìm Min giữa 2 số cho nhiều kiểu dữ liệu khác nhau:
// min for ints.
int min(int a, int b)
{
return (a < b) ? a : b;
}
// min for floats.
float min(float a, float b)
{
return (a < b) ? a : b;
}
// min for chars.
char min(char a, char b)
{
return (a < b) ? a : b;
}
Với mỗi kiểu dữ liệu khác nhau (int, float, char…) chúng ta phải viết hàm tìm Min tương
ứng với kiểu dữ liệu đó (overload). Điều này gây ra sự dư thừa không đáng có trong
chương trình. Và hơn nữa các hàm trên vẫn không đủ dùng trong mọi trường hợp.
=> Dùng Function Template.
Function Template là hàm tổng quát cho phép dùng nhiều kiểu dữ liệu khác nhau cho
tham số và kết quả trả về của nó. Chúng ta không phải viết nhiều hàm cho từng kiểu dữ
liệu cụ thể.
template < template-argument-list > declaration
Tất cả các function template được định nghĩa bắt đầu với từ khóa template theo sau là
một danh sách các tham số hình thức vây quanh trong cặp dấu (< và >). Mỗi tham số hình
thức được đặt trước bởi từ khóa class và được phân cách bởi dấu phẩy:
template <class T>
hoặc
template <class T1, class T2,…>
Lúc này các hàm tìm Min có thể được thay thế bởi một hàm Function Template duy nhất:
template <class T>
T min(T a, T b)
5
Hướng dẫn thực hành tuần 1
Function Template
{
return (a < b) ? a : b;
}
Nhận xét
-
Dùng function template chúng ta chỉ cần viết một hàm duy nhất cho nhiều kiểu dữ
liệu khác nhau thay vì phải viết nhiều hàm cho từng kiểu dữ liệu cụ thể.
Dùng function template giúp giảm được kích thước và tăng tính linh động của
chương trình.
-
Bài tập
Áp dụng function template để giải các bài tập sau:
1. Tìm min, max giữa 2 phần tử kiểu T (int, float, PhanSo, …).
2. Tìm phần tử dương lớn nhất trong mảng kiểu T (int, float, PhanSo, …).
3. Sắp xếp tăng dần mảng kiểu T (int, float, PhanSo, ...).
6
Hướng dẫn thực hành tuần 1
Các chuẩn và quy ước lập trình
3. Các chuẩn và quy ước lập trình
Quy ước đặt tên hằng
Trong C++, hằng số được khai báo bằng từ khóa “#define” hoặc “const”. Một số quy ước
trong việc đặt tên hằng như sau:
i) Tên hằng phải thể hiện được ý nghĩa của nó.
#define
#define
N 100
// Khong ro nghia.
NUMBER_OF_ELEMENTS 100 // Ro nghia.
ii) Tên hằng được viết hoa toàn bộ và các từ trong tên cách nhau bằng ký tự “_”.
#define
#define
#define
NumberOfElements 100
NUMBEROFELEMENTS 100
NUMBER_OF_ELEMENTS 100 // Dung.
// Sai.
// Sai.
Quy ước đặt tên biến
i) Tên biến phải thể hiện được ý nghĩa của nó.
int
int
t, m;
iTuSo, iMauSo;
// Khong ro nghia.
// Ro nghia.
ii) Tên biến được viết hoa các ký tự đầu mỗi từ trong tên, các ký tự còn lại viết
thường.
int
int
int
ituso, imauso;
iTuso, iMauso;
iTuSo, iMauSo;
// Sai.
// Sai.
// Dung..
iii) Tên biến có phần tiếp đầu ngữ (prefix) thể hiện kiểu dữ liệu của biến (phong
cách Hungarian):
Kiểu dữ liệu số
char – c
short – s
int – i
long – l
float – f
double – d
char
short
int
long
float
double
int
cKyTu;
sSoNguyenNgan;
iSoNguyen;
lSoNguyenDai;
fSoThuc;
dSoThucDai;
nSo;
Kiểu dữ liệu luận lý
bool - b
bool
bLuanLy;
7
Hướng dẫn thực hành tuần 1
Các chuẩn và quy ước lập trình
Kiểu dữ liệu mảng
[] – arr
int
arrSoNguyen[50];
HocSinh
arrDanhSach[50];
Kiểu dữ liệu chuỗi
char *, char [] – str
char
char
*strChuoi;
strChuoi[50];
Kiểu dữ liệu con trỏ
* - p
int
*pConTro;
HocSinh
*pDanhSach;
Quy ước đặt tên kiểu dữ liệu tự định nghĩa
i) Tên kiểu dữ liệu tự định nghĩa (struct, class) thường là danh từ và phải thể
hiện được ý nghĩa của kiểu dữ liệu đó.
struct TinhPhanSo
struct PhanSo
// Sai.
// Dung.
struct TinhDiemHocSinh
class HocSinh
// Sai.
// Dung.
ii) Tên kiểu dữ liệu tự định nghĩa được viết hoa các ký tự đầu mỗi từ trong tên,
các ký tự còn lại viết thường.
struct phanso
struct PHANSO
struct Phanso
struct PhanSo
// Sai.
// Sai.
// Sai.
// Dung.
Quy ước đặt tên hàm
i) Tên hàm thường là động từ và phải thể hiện hành động cần thực hiện.
int DataFile(char *strFileName)
// Sai.
int LoadDataFile(char *strFileName)
// Dung.
int BadValue(long lValue)
// Sai.
int CheckForBadValue(long lValue)
// Dung.
ii) Tên hàm được viết hoa các ký tự đầu mỗi từ trong tên, các ký tự còn lại viết
thường.
int checkforbadvalue(long lValue)
// Sai.
8
Hướng dẫn thực hành tuần 1
Các chuẩn và quy ước lập trình
int CheckforBadvalue(long lValue)
int CheckForBadValue(long lValue)
// Sai.
// Dung.
Quy ước viết câu lệnh
i) Viết mỗi câu lệnh riêng trên một dòng.
// Sai.
x = 3; y = 5;
// Dung.
x = 3;
y = 5;
// Sai.
if (a > b) cout << "a lon hon b";
else cout << "a nho hon b";
// Dung.
if (a > b)
cout << "a lon hon b";
else
out << "a nho hon b";
// Sai.
for (int i = 0; i < n; i++) x = x + 5;
// Dung.
for (int i = 0; i < n; i++)
x = x + 5;
ii) Viết các dấu “{“ “}” riêng trên một dòng.
// Sai.
// Dung.
void Swap(int &a, int &b) {
void Swap(int &a, int &b)
int c = a;
{
a = b;
int c = a;
b = c;
}
a = b;
b = c;
}
void Swap(int &a, int &b)
{
int c = a;
a = b;
b = c;
}
9
Hướng dẫn thực hành tuần 1
Các chuẩn và quy ước lập trình
iii) Viết các câu lệnh if, while, for riêng trên một đoạn.
// Sai.
if (a > b)
// Dung.
if (a > b)
cout << "a lon hon b";
cout << "a lon hon b";
for (int i = 0; i < n; i++)
x = x + 5;
k = k * x;
for (int i = 0; i < n; i++)
x = x + 5;
k = k * x;
iv) Viết các câu lệnh cùng thực hiện một công việc riêng trên một đoạn.
// Sai.
int c = a;
a = b;
// Dung.
int c = a;
a = b;
b = c;
b = c;
k = k * a;
x = b + c;
k = k * a;
x = b + c;
Quy ước cách khoảng
i) Viết cách vào một khoảng tab đối với các câu lệnh nằm giữa dấu “{“ “}”.
// Sai.
// Dung.
void Swap(int &a, int &b)
void Swap(int &a, int &b)
{
{
int c = a;
a = b;
b = c;
}
int c = a;
a = b;
b = c;
}
ii) Viết cách vào một khoảng tab đối với câu lệnh ngay sau if, else, while, for.
// Sai.
if (a > b)
// Dung.
if (a > b)
cout << "a lon hon b";
else
cout << "a lon hon b";
else
cout << "a nho hon b";
cout << "a nho hon b";
for (int i = 0; i < n; i++)
x = x + 5;
for (int i = 0; i < n; i++)
x = x + 5;
iii) Viết cách một khoảng trắng xung quanh các toán tử 2 ngôi.
10
Hướng dẫn thực hành tuần 1
Các chuẩn và quy ước lập trình
x=x+5*a-c;
// Sai.
x = x + 5 * a - c; // Dung.
if (a>=b) // Sai.
if (a >= b) // Dung.
iv) Viết cách một khoảng trắng sau các dấu “,” “;”.
void CalculateValues(int a,int b,int c); // Sai.
void CalculateValues(int a, int b, int c); // Dung.
for (int i = 0;i < n;i++) // Sai.
for (int i = 0; i < n; i++) // Dung.
Quy ước viết chú thích
Trong C++, chúng ta dùng dấu “//” hoặc “/*” “*/” để viết chú thích cho chương trình.
Một số quy ước khi viết chú thích như sau:
i) Chú thích phải rõ ràng, dễ hiểu và diễn giải được ý nghĩa của đoạn lệnh.
// Vi du chu thich so sai.
// Merge sort, gan : n * log(2)n, can mang phu b
void msort(int a[], int n, int l, int r, int b[])
{
int
m, i, j, k;
m = (l + r) / 2;
if (l < m)
msort(a, n, l, m, b);
if (m + 1 < r)
msort(a, n, m + 1, r, b);
for (i = l; i <= m; i++)
b[i] = a[i];
for (i = m + 1; i <= r; i++)
b[i] = a[m + 1 + r - i];
for (i = l, j = l, k = r; i <= r; i++)
if (b[j] < b[k])
a[i] = b[j++];
else
a[i] = b[k--];
11
Hướng dẫn thực hành tuần 1
Các chuẩn và quy ước lập trình
}
// Vi du chu thich ro rang, day du.
// Merge sort, gan : n * log(2)n, can mang phu b
void msort(int a[], int n, int l, int r, int b[])
{
int
m, i, j, k;
// Lay vi tri giua cua a
m = (l + r) / 2;
// Thuc hien merge sort tren a tu vi tri l den m
if (l < m)
msort(a, n, l, m, b);
// Thuc hien merge sort tren a tu vi tri m + 1 den r neu m < r
if (m + 1 < r)
msort(a, n, m + 1, r, b);
// Do cac phan tu cua a tu vi tri l den m co thu tu vao b
for (i = l; i <= m; i++)
b[i] = a[i];
// Do cac phan tu cua a tu vi tri m + 1 den r co thu tu vao b theo thu tu
// nguoc
for (i = m + 1; i <= r; i++)
b[i] = a[m + 1 + r - i];
// Tron b tu vi tri l den m co thu tu va b tu vi tri r den m + 1 co thu tu vao a
for (i = l, j = l, k = r; i <= r; i++)
if (b[j] < b[k])
a[i] = b[j++];
else
a[i] = b[k--];
}
ii) Dùng dấu “//” thay cho “/*” “*/” khi viết chú thích.
// Sai.
// Dung.
/* void Swap(int &a, int &b)
{
//void Swap(int &a, int &b)
//{
int c = a;
a = b;
b = c;
} */
//
//
//
//}
int c = a;
a = b;
b = c;
12
Bạn đang xem tài liệu "Tài liệu hướng dẫn thực hành môn Phương pháp lập trình hướng đối tượng - Tuần 1: Hàm toán tử", để tải tài liệu gốc về máy hãy click vào nút Download ở trên
File đính kèm:
tai_lieu_huong_dan_thuc_hanh_mon_phuong_phap_lap_trinh_huong.pdf

