Download as pdf or txt
Download as pdf or txt
You are on page 1of 12

Môn PPLTHĐT Tác giả:

Nguyễn Minh Huy


Hướng dẫn thực hành tuần 1 Phạm Minh Tuấn
Cập nhật:
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 iTuSo; // Tu so cua phan so.
int iMauSo; // 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 N 100 // Khong ro nghia.


#define 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 NumberOfElements 100 // Sai.


#define NUMBEROFELEMENTS 100 // Sai.
#define NUMBER_OF_ELEMENTS 100 // Dung.

Quy ước đặt tên biến


i) Tên biến phải thể hiện được ý nghĩa của nó.

int t, m; // Khong ro nghia.


int iTuSo, iMauSo; // 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 ituso, imauso; // Sai.


int iTuso, iMauso; // Sai.
int iTuSo, iMauSo; // 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 char cKyTu;
short – s short sSoNguyenNgan;
int – i int iSoNguyen;
long – l long lSoNguyenDai;
float – f float fSoThuc;
double – d double dSoThucDai;
int 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 *strChuoi;
char 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 // Sai.


struct PhanSo // Dung.

struct TinhDiemHocSinh // Sai.


class HocSinh // 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 // Sai.


struct PHANSO // Sai.
struct Phanso // Sai.
struct PhanSo // 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) // Sai.


int CheckForBadValue(long lValue) // 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. // Dung.
if (a > b) if (a > b)
cout << "a lon hon b"; cout << "a lon hon b";
for (int i = 0; i < n; i++)
x = x + 5; for (int i = 0; i < n; i++)
k = k * x; 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. // Dung.
int c = a; int c = a;
a = b; 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; int c = a;
a = b; a = b;
b = c; 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. // Dung.
if (a > b) if (a > b)
cout << "a lon hon b"; cout << "a lon hon b";
else else
cout << "a nho hon b"; cout << "a nho hon b";

for (int i = 0; i < n; i++) for (int i = 0; i < n; i++)


x = x + 5; 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; // int c = a;
a = b; // a = b;
b = c; // b = c;
} */ //}

12

You might also like