Professional Documents
Culture Documents
Bait Apke T Thuc
Bait Apke T Thuc
Exam: Lập chương trình nhập vào tọa độ các đỉnh của 1 tam giác bất kỳ trong mặt
phẳng. Tính diện tích và chu vi của tam giác đó. In kết quả lên màn hình.
- Tiếp cận hướng thủ tục:
o Xây dựng các hàm:
typedef struct Tamgiac{
float xA, yA, xB,yB, xC, yC;
}
void Nhap(Tamgiac &t){
cout<<“Nhap toa do dinh thu nhat:”;
cin>>t.xA>>t.yA;
cout<<“Nhap toa do dinh thu hai:”;
cin>>t.xB>>t.yB;
cout<<“Nhap toa do dinh thu ba:”;
cin>>t.xC>>t.yC;
}
- Tiếp cận hướng đối tượng:
o Xây dựng lớp class:
class Tamgiac{
private:
float xA, yA, xB,yB, xC, yC;
public:
void Nhap();
float Dientich();
float Chuvi();
};
2. KHÁI NIỆM LỚP – KHAI BÁO LỚP
- Lớp là một khái niệm mở rộng của cấu trúc dữ liệu, nó có thể chứa
đựng cả dữ liệu và các hàm.
- Đối tượng (object) là một thể hiện của lớp. Trong lập trình lớp được
xem như là một kiểu dữ liệu, đối tượng là các biến.
EX: class class_name{
access_speccifier_1:
member1;
access_speccifier_2:
member2;
…
};
*NOTE:
- class_name: tên của lớp.
- access_specifier: các dặc tả (private, protected, public)
- member: các thành phần của lớp (thuộc tính hoặc các hàm)
EX: Khai báo lớp biểu diễn các sinh viên cho các phương thức tính tổng
điểm trung bình và xếp hạng.
class SinhVien{
private:
char Ten;
int Tuoi;
float diemToan,diemLy,diemHoa;
public:
void nhap();
void xuat();
void DiemTB();
void xephangsv();
};
3. CÀI ĐẶT CÁC PHƯƠNG THỨC.
- Ta có thể cài đặt các phương thức bên trong lớp hoặc bên ngoài lớp.
- Cài đặt phương thức bên ngoài lớp:
DataType class_name::Func_name([Argument_list]){
Các câu lệnh;
}
EX:
class chuongtrinh{
private:
int x,y;
public:
void Nhap();
};
void chuongtrinh::Nhap(){
cout<<”nhap so x: “<<endl;
cin>>x;
cout<<”nhap so y: “<<endl;
cin>>y;
}
c. Chèn:
- Hình ảnh phép toán insert(p, X), phép toán trả lại vị trí q
d. Xóa:
c. Chèn:
- phép toán Insert(p, X), phép toán trả lại vị trí q
EX:
#include <iostream>
using namespace std;
int max_value(int a, int b)
{
if (a > b)
return a;
else
return b;
}
int main(){
int x1, y1, x2, y2, x3, y3;
cin >> x1 >> y1 >> x2 >> y2 >> x3 >> y3;
// Lời gọi hàm.
cout << "Max giữa x1 và y1 là: " << max_value(x1, y1) << endl;
cout << "Max giữa x2 và y2 là: " << max_value(x2, y2) << endl;
cout << "Max giữa x3 và y3 là: " << max_value(x3, y3);
return 0;
}
- Trong đó:
o h được gọi là hàm băm (hash function)
o K là tập giá trị khóa
o 0..m-1 là bảng địa chỉ (là các số nguyên)
o m là kích thước của bảng
- Yêu cầu khi xây dựng hàm băm:
o Hàm phải dải đều các địa chỉ trên bảng địa chỉ
o Hàm băm phải được tính toán đơn giản.
b. Một số phương pháp xây dựng hàm băm
- Phương pháp chia
o Để tính địa chỉ dải của đối tượng ta lấy giá trị khóa chia cho
kích thước của bảng. Địa chỉ dải là phần dư của phép chia đó.
H(K) = K % m
o Yêu cầu:
hàm h phải dải đều các đối tượng trên bảng một cách
ngẫu nhiên. Để có được điều đó h phải phụ thuộc vào m.
Phụ thuộc vào m
Thông thường người ta chọn m là một số nguyên tố nhỏ
hơn gần với (10,100, 1000,...) nhất.
- Phương pháp nhân
o Giá trị khóa được phân ra thành nhiều đoạn bằng nhau
Người ta sử dụng hai kỹ thuật phân đoạn sau đây:
Tách: Tách các đoạn ra và mỗi đoạn được xếp thành một
hàng, dóng lề trái hoặc lề phải.
Gấp: Gấp các đoạn lại theo đường biên tương tự như gấp
giấy, các chữ rơi vào cùng một chỗ được đặt thành hàng
thẳng nhau.
c. Bảng băm - Hash table
- Một bảng băm là một cấu trúc dựa trên mảng để lưu trữ các phần tử,
mỗi phần tử là một cặp Khóa-Giá trị (key-value)
- Các thành phần cấu thanh lên bảng băm:
o Mảng chứa
o Mỗi phần tử mảng quản lý một danh sách các phần tử có khóa
qua ánh xạ h cho cùng một địa chỉ.
o Hàm băm h(k) - Hash function, h(k)
o Mã băm
EX: Giả sử có hàm h(k) = k % 5 Có các giá trị: 11, 21, 44, 23, 41,
4, 34, 12
if (i<j){
swap(i,j);
o B1: chọn phần tử nhỏ nhất -1 đặt vào vị trí thứ nhất
o B4: chọn phần tử nhỏ thứ 4 là 6 đặt vào vị trí tư và phần tử lớn
nhất được đẩy về cuối
- Chương trình:
int i, j, idx, temp;
for (i = 0; i < N-1; i++)
{
idx = i;
for (j = i+1; j < N; j++)
{
if (arr[i] < arr[j])
{
idx = j;
swap(&arr[i], &arr[idx]);
}
}
}
}
3. Sắp xếp nhanh – Quick sort
- Thuật toán:
o Chọn điểm đánh dấu cho mảng, ở đây mình sẽ chọn điểm đánh
sấu là số cuối cùng của mảng.
o Tạo hai biến là trái và phải để trỏ tới bên trái và bên phải của
danh sách.
o Thực hiện so sánh các phần tử với điểm đánh dấu. Nếu phần tử
nhỏ hơn điểm đánh dấu thì dịch chuyển qua bên trái và ngược
lại.
o Sau khi dịch chuyển thực hiện công việc sắp xếp các phần tử
trong mảng con mới, trước khi tiếp tục phân đoạn tiếp theo.
- Chương trình :
void quickSort(int a[], int l, int r){
int p = a[(l+r)/2];
int i = l, j = r;
while (i < j){
while (a[i] < p){
i++;
}
while (a[j] > p){
j--;
}
if (i <= j){
int temp = a[i];
a[i] = a[j];
a[j] = temp;
i++;
j--;
}
}
if (i < r){
quickSort(a, i, r);
}
if (l < j){
quickSort(a, l, j);
}
}
4. Sắp xếp trộn – Merge sort
- Ý tưởng:
o Tìm chỉ số nằm giữa mảng đề chia mảng thành 2 nửa.
o Gọi đệ quy hàm mergeSort cho nửa đầu tiền.
o Gọi đệ quy hàm mergeSort cho nửa thứ hai.
o Gộp 2 nửa mảng đã sắp xếp ở trên.
- Chương trình:
void merge(int arr[], int l, int m, int r)
{
int i, j, k;
int n1 = m - l + 1;
int n2 = r - m;
int L[n1], R[n2];//tạo 2 mảng tạm thời để chứa các phần tử sau khi chia
// Copy dữ liệu sang các mảng tạm
for (i = 0; i < n1; i++)
L[i] = arr[l + i];
for (j = 0; j < n2; j++)
R[j] = arr[m + 1+ j];
// khởi tạo các giá trị ban đầu
i = 0;
j = 0;
k = l;
//gộp hai mảng tạm thời vào mảng arr
while (i < n1 && j < n2)
{
if (L[i] <= R[j])
{
arr[k] = L[i];
i++;
}
else
{
arr[k] = R[j];
j++;
}
k++;
}
// Copy các phần tử còn lại của mảng L vào arr nếu có
while (i < n1)
{
arr[k] = L[i];
i++;
k++;
}
// Copy các phần tử còn lại của mảng R vào arr nếu có
while (j < n2)
{
arr[k] = R[j];
j++;
k++;
}
}
// l là chỉ số trái và r là chỉ số phải của mảng cần được sắp xếp
void mergeSort(int arr[], int l, int r)
{
if (l < r)
{
int m = l+(r-l)/2;
// Gọi hàm đệ quy tiếp tục chia đôi từng nửa mảng
mergeSort(arr, l, m);
mergeSort(arr, m+1, r);
merge(arr, l, m, r);
}
}
5. Sắp xếp vun đống – Heap sort
- là một cấu trúc dữ liệu dạng cây, trong đó các nút trên cây được sắp xếp
theo một thứ tự ràng buộc nhất định giữa khóa của nút cha và khóa của
nút con (thường là nút cha nhỏ hơn hoặc lớn hơn nút con). Nút ở gốc
của Heap luôn luôn là nút có mức ưu tiên cao nhất, nghĩa là lớn nhất
hoặc nhỏ nhất.
- giải thuật:
o Chia mảng ban đầu thành hai mảng con: Một mảng bao gồm
các phần tử đã sắp xếp và một mảng bao gồm các phần tử còn
lại chưa được sắp xếp. Ban đầu, mảng đã sắp xếp là mảng rỗng,
mảng chưa sắp xếp chính là mảng ban đầu.
o Tìm phần tử nhỏ nhất/lớn nhất trong mảng chưa sắp xếp và đưa
nó vào cuối mảng đã sắp xếp (tùy vào cách sắp xếp là tăng dần
hay giảm dần). Đây chính là bước cần sử dụng đến cấu trúc dữ
liệu Heap.
- Các bước chạy lệnh:
EX: sắp xếp dãy số Cho mảng a=(2,3,5,6,4,1,7), Ở đây n = 7. Các
phần tử từ a[4] đến a[7] là lá
o Bước 1: Tạo đống
Vun cây gốc a[3] ta được mảng a=(2,3,7,6,4,1,5)
Vun cây gốc a[2] ta được mảng a=(2,6,7,3,4,1,5)
Vun cây gốc a[1] ta được mảng a=(7,6,5,3,4,1,2)
Bây giờ a=(7,6,5,3,4,1,2) đã là đống.
o Bước 2: Sắp xếp vun đống
Đổi chỗ a[1] với a[7]: a=(2,6,5,3,4,1,7) và vun lại mảng
a[1..6] ta được mảng a=(6,4,5,3,2,1,7)
Đổi chỗ a[1] với a[6]: a=(1,4,5,3,2,6,7) và vun lại mảng
a[1..5] ta được mảng a=(5,4,1,3,2,6,7)
Đổi chỗ a[1] với a[5]: a=(1,4,2,3,5,6,7) và vun lại mảng
a[1..4] ta được mảng a=(4,3,1,2,5,6,7)
Đổi chỗ a[1] với a[4]: a=(1,3,2,4,5,6,7) và vun lại mảng
a[1..3] ta được mảng a=(3,2,1,4,5,6,7)
Đổi chỗ a[1] với a[3]: a=(2,1,3,4,5,6,7) và vun lại mảng
a[1..2] ta được mảng a=(2,1,3,4,5,6,7)
Đổi chỗ a[1] với a[2]:a=(1,2,3,4,5,6,7) Mảng còn lại chỉ
một phần tử.
Quá trình sắp xếp đã xong.
- Chương trình:
void heapify(int arr[], int n, int i)
{
int largest = i; // khoi tao largest nhu la root
int l = 2 * i + 1; // left = 2*i + 1
int r = 2 * i + 2; // right = 2*i + 2
int main()
{
int arr[] = { 12, 11, 13, 5, 6, 7 };
int n = sizeof(arr) / sizeof(arr[0]);
heapSort(arr, n);
cout << "Sorted array is \n";
printArray(arr, n);
cin.get();
getchar();
return 0;
}
CHƯƠNG 7: VECTOR
1. Khái niệm về vector
- Vector là một mảng động có thể thay đổi kích thước,không nhất thiết phải
khai báo kích thước cố định như mảng tĩnh.Nó có thể tự động tăng hay
giảm kích thước khi ta xóa hoặc chèn phần tử khác vào vector
Algorithm preOrder(v)
If(v!=null)
visit(v)
preorder (w)
b. Inorder (trung thứ tự) : Con cả đến Gốc rồi các con còn lại
- Duyệt theo thứ tự giữa, tức là: nút con được thăm trước sau đó thăm
nút cha
- Ứng dụng: Tính toán không gian sử dụng bởi các files và
các thư mục con
Algorithm inOrder(v)
If(v!=null)
w = con cả của v
inOrder(w)
visit(v)
for mỗi nút con w1#w của v
inOrder (w1)
Algorithm postOrder(v)
If(v!=null)
postOrder (w)
visit(v)