Tải bản đầy đủ (.docx) (21 trang)

NỐI 2 QUAN HỆ BẰNG PHƯƠNG PHÁP CHỌN TRÊN TÍCH VÀ PHƯƠNG PHÁP SẮP NỐI

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (188.51 KB, 21 trang )

Nhóm Moon
MỤC LỤC
LỜI MỞ ĐẦU Trang 3
CHƯƠNG I: BÀI TOÁN ĐẶT RA Trang 4
1. Bài toán Trang 4
2. Thiết kế cơ sở dữ liệu Trang 4
3. Thuật toán tạo ngẫu nhiên 2 quan hệ R và S Trang 5
4. Cài đặt chương trình tạo ngẫu nhiên 2 flie R.DAT và S.DAT Trang 5
CHƯƠNG II: NỐI 2 QUAN HỆ BẰNG PHƯƠNG PHÁP CHỌN
TRÊN TÍCH Trang 7
1. Thuật toán Trang 7
2. Chi phí Trang 7
3. Ví dụ Trang 7
4. Cài đặt và chạy thử chương trình chọn trên tích Trang 9
CHƯƠNG III: NỐI 2 QUAN HỆ BẰNG PHƯƠNG PHÁP SẮP NỐI Trang 12
1. Thuật toán Trang 12
2. Chi phí Trang 12
3. Ví dụ Trang 13
4. Cài đặt chương trình tạo 2 quan hệ R2 và bằng cách sắp xếp
2 quan hệ R và S tăng dần theo thuộc tính B Trang 16
5. Cài đặt và chạy thử chương trình sắp nối Trang 18
CHƯƠNG IV: TÀI LIỆU THAM KHẢO Trang 22
CHƯƠNG V: KẾT LUẬN Trang 22
Danh sách nhóm Moon:
- Nguyễn Trọng Nghĩa 11CNTT2
- Dương Phú Nhân 11CNTT2
- Huỳnh Ngọc Nam 11CNTT2
- Lý Giang San 11CNTT2
- Nguyễn Văn Phúc 11CNTT2
1
Nhóm Moon


PHÂN CÔNG CÔNG VIỆC
STT Họ và tên Công việc Chữ kí Nhận xét
1 Nguyễn Trọng Nghĩa -Viết chương trình cài đặt
thuật toán bằng phương pháp
chọn trên tích
- Viết chương trình cài đặt
thuật toán bằng phương pháp
phương pháp sắp nối
2 Dương Phú Nhân -Viết chương trình sắp xếp
R2 và S2 theo R và S
-Viết chương trình cài đặt
thuật toán bằng phương pháp
chọn trên tích
3 Huỳnh Ngọc Nam -Viết chương trình tạo ngẫu
nhiên R và S
- Viết chương trình cài đặt
thuật toán bằng phương pháp
phương pháp sắp nối
4 Lý Giang San -Viết báo cáo
- Viết chương trình cài đặt
thuật toán bằng phương pháp
chọn trên tích
5 Nguyễn Văn Phúc - Viết chương trình cài đặt
thuật toán bằng phương pháp
phương pháp sắp nối
2
Nhóm Moon
LỜI MỞ ĐẦU
Cơ sở dữ liệu là một trong các môn cơ sở quan trọng của nghành Tin học, có thể
nói rằng cơ sở dữ liệu là môn học về phương pháp tổ chức lưu trữ và khai thác dữ liệu.

Đây là môn học cực kì quan trọng, bởi vì không một ứng dụng tin học nào mà không
chứa đựng vấn đề tổ chức lưu trữ và khai thác dữ liệu.
Cơ sở dữ liệu trở thành một trong những môn học quan trọng nhất, không thể thiếu
được trong chương trình đào tạo tin học hiện đại. Các chuyên viên hệ thống thông tin cần
phải được trang bị kiến thức để phân tích các yêu cầu của cơ sở dữ liệu, có thể thiết kế và
cài đặt cơ sở dữ liệu chính xác và hiệu quả.
Hiệu năng thực hiện một yêu cầu xử lí dữ liệu là vấn đề tối quan trọng đối với một
hệ quản trị CSDL. Xử lí vấn tin (query processor) là một đơn thể trong các hệ quản trị
CSDL có nhiệm vụ xác định thứ tự thực hiện một câu vấn tin nhằm tối ưu hóa câu vấn
tin, nâng cao hiệu năng xử lý, tiết kiệm chi phí.
Các phép toán lấy nối và tích có chi phí rất cao so với các phép toán đơn ngôi như
phép chọn hay phép chiếu. Vì vậy trình tối ưu hóa vấn tin phải hạ thấp tối đa chi phí của
phép nối và tích nếu có thể. Một trong những chiến lược giảm chi phí nối là tận dụng chỉ
mục hoặc tiền xử lí các quan hệ trước khi nối. Phương pháp sắp nối là một trong những
cách tiếp cận đó.
3
Nhóm Moon
CHƯƠNG I: BÀI TOÁN ĐẶT RA
1/ Bài toán:
1) Viết chương trình cài đặt thuật toán nối hai quan hệ bằng phương pháp chọn trên tích.
2) Viết chương trình cài đặt thuật toán nối hai quan hệ bằng phương pháp sắp nối.
2/ Phân tích thiết kế cấu trúc dữ liệu:
Mô tả các quan hệ:
-Đầu vào: 2 quan hệ R(A,B) , S(B,C) có chỉ mục tụ nhóm trên B
T
R
=1000 >

T
S

=500
Trường A,C là các số ngẫu nhiên từ 0 đến 999
Trường B là các số ngẫu nhiên từ 0 đến 99
-Đầu ra : quan hệ RS là nối tự nhiên của quan hệ R và S, RS(A,B,C)
Khai báo các quan hệ và kiểu dữ liệu
-Quan hệ R(A,B):
R.A có kiểu int
R.B có kiểu int
Khai báo: Struct R {
int A, B;
};
Cài đặt quan hệ R dưới dạng file có tên là R.DAT chứa các bản ghi kiểu R , các bản ghi
có trường B giống nhau được đặt liên tiếp nhau và được xếp chặt, có giá trị R.B
Quan hệ S(B,C):
S.B có kiểu int
S.C có kiểu int
Khai báo: Struct S {
int B, C;
4
Nhóm Moon
};
Cài đặt quan hệ S dưới dạng file có tên là S.DAT chứa các bản ghi có S.B giống nhau
được đặt liên tiếp nhau và được sắp xếp. Có 1 giá trị S.B ta giả định S.B R.B => J<1
-Quan hệ RS: là nối tự nhiên của 2 quan hệ R và S
=> RS.A có kiểu int
RS.B có kiểu int
RS.C có kiểu int
-Dung lượng khối d= 120 byte.Mỗi khối chứa được 15 bản ghi của R hoặc S, 10 bản ghi
của RS .Khối bộ nhớ để đọc R có cấu trúc struct Rbanghi MSkhoi[15].
Khối bộ nhớ để đọc S trong phương pháp chon trên tích có cấu trúc Struct Sbanghi MS

Khoi[Mmax][15]
Mmax là hằng chỉ số khối đểbộ nhớ trong tối đa. Khi đọc R và S phải khai số bản ghi đọc
là 15.Khối bộ nhớ để ghi RS khai báo dạng mảng Struct RSbanghi MRSkhoi 10.
Kết quả nối là file RS.DAT chứa các bản ghi kiểu RS
Vậy : đầu vào: hai quan hệ ngẫu nhiên R và S 2file : R.DAT và S.DAT.
đầu ra: file RS.DAT.
3/ Thuật toán tạo hai quan hệ ngẫu nhiên R và S:
-Mở hai file R.DAT và S.DAT.
+ Tạo phần tử ngẫu nhiên các phần tử A là các số từ 0 đến 999, B là các số từ 0 đến 99.
+Gán từng phần tử A trong quan hệ R cho rand()%1000
+Gán từng phần tử B trong quan hệ R cho rand()%100
-Ghi tất cả các phần tử A, B vào file R.DAT
-Tương tự đối với file S.DAT, ta có dữ liệu đầu vào C là các số ngẫu nhiên từ 0 đến 999,
B là các số ngẫu nhiên từ 0 đến 99.
4.Cài đặt thuật toán ngẫu nhiên 2 file R.DAT và S.DAT:
#include<conio.h>
#include<stdio.h>
#include<stdlib.h>
#include <time.h>
typedef struct{
5
Nhóm Moon
int A, B;
}Rbanghi;
typedef struct{
int B, C;
}Sbanghi;
void ghiFile(Rbanghi r[],Sbanghi s[]){
int i;
FILE *f1, *f2, *f3, *f4;

f1 = fopen("R.DAT","wt");
f2 = fopen("S.DAT","wt");
srand(time(NULL));
for(i=0;i<1000;i++){
r[i].A=rand()%(1000);
r[i].B=rand()%(100);
fprintf(f1, "%d\t%d\n", r[i].A, r[i].B);
}
for(i=0;i<500;i++){
s[i].C=rand()%(1000);
s[i].B=rand()%(100);
fprintf(f2, "%d\t%d\n", s[i].B, s[i].C);
}
fclose(f1);
fclose(f2);
}
int main(){
Rbanghi r[1000];
Sbanghi s[500];
ghiFile(r,s);
getch();
}
6
Nhóm Moon
CHƯƠNG II: NỐI 2 QUAN HỆ BẰNG PHƯƠNG PHÁP CHỌN TRÊN
TÍCH
1/ Thuật toán nối 2 quan hệ bằng phương pháp chọn trên tích:
Cho quan hệ R(A,B) và S(B,C). Các đơn giản để tính nối RS là đọc R và S tính tích
RxS theo (giả sử S là quan hệ nhỏ hơn R) nhưng chỉ kết xuất những bộ khớp với những
thuộc tính chung R và S. Giả sử bộ nhớ trong có M khối, thuật toán cụ thể như sau:

Dành(M-1) khối bộ nhớ chính để chứa các khối của S và 1 khối bộ nhớ chính để chứa các
khối của R .
Chia S thành những đoạn dài M=1 khối. Với mỗi đoạn D của S được đọc vào bộ nhớ
chính, ta nạp lần lượt từng khối K của R vào 1 khối trong bộ nhớ chính và thực hiện:
for mỗi bộ v trong D do
for mỗi bộ u trong D do
Nếu u(B)=v(B)
kết xuất bộ uv= (u(A),u(B),v(C))
2/ Chi phí nối hai quan hệ bằng phương pháp chọn trên tích:
Chiến lược trên sẽ cần B
S
, lần truy suất khối s để đọc quan hệ S và mỗi khối của R sẽ
được truy xuất d lần,trong đó d là số đoạn M-1 khối của S , vì d xấp xỉ bằng nên chi phí
đọc dữ liệu sẽ là: B
S
+
Ta ước lượng số lượng các khối chứa kết quả phép nối. Gọi I
B
là kích thước miền kích
thuộc tính B chung trong R và S. Vì số lượng bộ trung bình của nối RS bằng số bộ
của tích Đề -Các chia cho I
B
nên số khối trung bình của RS cũng bằng số khối của
tích Đề -Các chia cho I
B
chi phí xuất dữ liệu là:

Chi phí của phương án này là chi phí nhập cộng với chi phí xuất:
B
S

+ +
3/ Ví dụ:
Cho R(A,B) và S(B,C) như sau:
R
A a b c d e f
B 4 5 2 3 1 2
S
B 1 2 1 2 4 3
C b e h d b a
7
Nhóm Moon
Giả sử mỗi khóa chứa được 2 bản ghi, bộ nhớ trong M=3. Khi đó số khối của R và S là
B
R
= 4 và B
S
= 3. Ta dành M -1=2 khối, ký hiệu M
S
, để đọc S, 1 khối ký hiệu M
R
, để đọc
R.Cấu trúc M
R
và M
S
như sau :
M
R
A
B

M
S
B
C
Thực hiện vòng nối như sau.
Vòng 1: Đọc 2 khối của S vào M
S
, ta được:
M
S
B 1 2 1 2
C b e h d
Sau đó đọc lần lượt từng khối của R vào M
R
so sánh các bản ghi của M
S
vs các bản ghi
của M
R
và nối những cặp khớp nhau ( có thuộc tính B trùng nhau).
- Đọc khối thứ nhất của R vào M
R
ta được :
M
R
A a b
B 4 5
Các bản ghi của M
S
và M

R
không nối được vs nhau. R S rỗng.
- Đọc khối thứ 2 của R vào M
R
ta có
M
R
A 12 13
B 2 3
So sánh các bản ghi của M
S
vs các bản ghi của M
R
ta thấy bản ghi (2,e) và (2,d) của M
S

nối được vs bản ghi (c,2) của M
R
.Ta nhận được
R S
A c c
B 2 2
C e d
Đọc khối thứ 3 của R vào M
R
ta có
M
R
A e f
B 1 2

So sánh các bản ghi của MS vs ác bản ghi của MR, ta thấy bản ghi (1,b) và (1,h) của MS
nối được vs các bản ghi (e,1) của MR và bản ghi (2,e) và (2,d) của MS nối được vs bản
ghi (f,2) của MR. Ghi tiếp các nối vào R S ta nhân được:
8
Nhóm Moon
R S
A c c e e f f
B 2 2 1 1 2 2
C e d b h e d
Tương tự cho đến hết.
Vòng 2 tương tự vòng 1 khi ta đọc khối còn lại của S vào MS, ta nhân được nối R S
như sau:
R S
A c c e e f f a d
B 2 2 1 1 2 2 4 3
C e d b h e d b a
Kết thúc.
4/ Cài đặt và chạy thử chương trình nối 2 quan hệ bằng phương pháp chọn trên
tích:
#include<conio.h>
#include<stdio.h>
typedef struct{
int A, B;
}Rbanghi;
typedef struct{
int B, C;
}Sbanghi;

typedef struct{
int A, B, C;

}RSbanghi;

void noi(Rbanghi r[], Sbanghi s[], Rbanghi mr[], Sbanghi ms[], RSbanghi rs[], int m){
int i,j,d;
int k=0,l,n=0;
int x,y,t,u;
FILE *f1, *f2, *f3;
f1 = fopen("R.DAT","rt");
f2 = fopen("S.DAT","rt");
f3 = fopen("RS.DAT","wt");
d=(m-1)*15;
x=500/d;
y=x*d;
for(i=0;i<1000;i++)
fscanf(f1, "%d\t%d\n", &r[i].A, &r[i].B);
9
Nhóm Moon
for(i=0;i<500;i++)
fscanf(f2, "%d\t%d\n", &s[i].B, &s[i].C);
for(t=0;t<(x+1);t++){
if(t==x) d=500-y;
for(i=0;i<d;i++){
ms[i].B = s[k].B;
ms[i].C = s[k].C;
k++;
}
l=0;
for(u=0;u<67;u++){
if(u==66){
for(j=0;j<10;j++){

mr[j].A = r[l].A;
mr[j].B = r[l].B;
l++;
}
for(i=0;i<d;i++){
for(j=0;j<10;j++){
if(mr[j].B==ms[i].B){
fprintf(f3, "%d\t%d\t
%d\n", mr[j].A, ms[i].B, ms[i].C);
n++;
}
}
}
}
else{
for(j=0;j<15;j++){
mr[j].A = r[l].A;
mr[j].B = r[l].B;
l++;
}
for(i=0;i<d;i++){
for(j=0;j<15;j++){
if(mr[j].B==ms[i].B){
fprintf(f3, "%d\t%d\t
%d\n", mr[j].A, ms[i].B, ms[i].C);
n++;
}
}
}
}

10
Nhóm Moon
}
}
fclose(f1);
fclose(f2);
fclose(f3);
}
int main(){
int m;
Rbanghi r[1000];
Sbanghi s[500];
Rbanghi mr[15];
RSbanghi rs[10000];
printf("Nhap vao so khoi bo nho trong(1<M<34): M=");
scanf ("%d",&m);
while(m<2 || m>33){
printf("Nhap lai so khoi bo nho trong(M<34): M=");
scanf ("%d",&m);
}
Sbanghi ms[(m-1)*10];
noi(r,s,mr,ms,rs,m);
getch();
}
11
Nhóm Moon
CHƯƠNG III: NỐI 2 QUAN HỆ BẰNG PHƯƠNG PHÁP SẮP NỐI
1/ Thuật toán:
Dành vùng nhớ M


(mảng hoặc con trỏ ) lưu các bản ghi của R và S nối được với nhau
( có cùng giá trị thuộc tính B)
Trỏ con trỏ đọc và bản ghi đầu của R và của S, đọc bản ghi u của R,đọc bản ghi v của S
Do
 Nếu u(B) = v(B)
Nếu u(B) = v(B) bằng giá trị thuộc tính B của các bản ghi trong vùng nhớ M

(kết xuất các nối trong M

ra đĩa,ghi u,v vào M

)
Đọc tiếp bản ghi u R và v
 Nếu u(B) < v(B)
Nếu u(B) bằng giá trị thuộc tính B của các bản ghi trong vùng nhớ M

(Ghi u vào M

)
Nếu u(B) khác giá trị thuộc tính B của các bản ghi trong vùng nhớ M

(Kết xuất các nối trong M

ra đĩa)
Đọc tiếp bản ghi uR
 Nếu u(B) > v(B)
Nếu v(B) bằng giá trị thuộc tính B của các bản ghi trong vùng nhớ M

(Ghi v vào M


)
Nếu v(B) khác giá trị thuộc tính B của các bản ghi trong vùng nhớ M

(Kết xuất các nối trong M

ra đĩa)
Đọc tiếp bản ghi v
Until đọc hết hoặc R hoặc S
Nếu S hoặc R còn bản ghi thì đọc và ghi các bản ghi có giá trị thuộc tính B bằng giá trị
thuộc tính B trong M

vào M

.
Kết xuất các nối trong M

ra đĩa
2/ Chi phí nối hai quan hệ bằng phương pháp sắp nối:
Như vậy,với phương pháp trên mỗi khối của R và S chỉ cần đọc một lần, nên chi phí đọc
của thuật toán là:
B
S
+B
R
(1.5)
12
Nhóm Moon
Vấn đề còn lại là chọn phương pháp và tính chi phí sắp xếp R và S.Một trong các phương
pháp sắp xếp ngoại phổ biến là phương pháp sắp xếp trộn đa dòng ta sẽ ước lượng chi phí
của phương pháp này:

Sắp xếp trộn đa dòng(multiway merge sort):
Sắp xếp trộn đa dòng hoạt động bằng cách xây dựng các dòng chạy(run).Mỗi dòng chạy
là một chuỗi các bản ghi kế tiếp nhau trong R đã được sắp xếp thứ tự .Qua mỗi vòng lặp
số dòng chạy trong R lại được giảm và thuật toán kết thúc chỉ khi còn một dòng chạy tức
là R đã được sắp xếp. Ý tưởng của thuật toán như sau:
Giả sử ta có M khối bộ nhớ trong để lưu các khối đọc từ R và ít nhất một khối, thứ M+1,
dành riêng để lưu các bộ đã được sắp xếp chờ ghi ra bộ nhớ thứ cấp. Ở vòng đầu ta đọc
các khối của R vào bộ nhớ chính, mỗi lần M khối và sắp xếp các bộ trong M khối này
bằng một thuật toán sắp xếp thích hợp( ở đây dùng Quicksort).Ta bỏ qua chi phí sắp xếp
nối vì nó không đáng kể so với chi phí đọc các khối. Kết quả là R được phân hoạch thành
B
R
/M dòng chạy, mỗi dòng dài M khối.
Ta chia R thành các nhóm, mỗi nhóm có M dòng chạy, nghĩa là mỗi nhóm, trừ nhóm
cuối,có tối thiểu M
P
khối. Sau đó chúng ta trộn mỗi nhóm này thành một dòng chạy bằng
thuật toán trộn sử dụng M khối bộ nhớ như sau: đọc lần lượt từng khối của mỗi dòng
chạy vào khối bộ nhớ chính, dành riêng cho dòng chạy đó; so sánh và sắp xếp các bộ lưu
vào khối bộ nhớ thứ M+1 chờ để ghi ra bộ nhớ thứ cấp.
Sau [log
M
B] vòng các dòng chạy được tạo ra có chiều dài tối thiểu là BR. Khi đó R chỉ có
một sòng chạy tức là đã được sắp xếp.
Bây giờ ta sẽ tính chi phí sắp xếp quan hệ R của thuật toán này. Mỗi vòng phải đọc B
R

khối của R và ghi B
R
khối đã sắp xếp tức là cần 2.B

R
thao tác truy xuất khối.Vì vậy, tổng
chi phí truy xuất khối để sắp xếp R là:
2.R
R
.[log
M
B
R
] (1.7)
Tương tự chi phí truy xuất khối để sắp xếp S là:
2.B
S
[log
M
B
S
] (1.8)
Tổng hợp (1.5), (1.6), (1.7),(1.8) ta nhận được tổng chi phí truy xuất khối của phương
pháp sắp nối là :
2.B
R
.[log
M
B
R
]+2.B
R
.[log
M

B
S
]+B
R
+B
S
+
3/ Ví dụ:
Cho R(A,B) và S(B,C) như sau:
13
Nhóm Moon
R
A a b c d
B 1 1 2 3
S
B 1 2 2
C e f g
Bộ nhớ M có cấu trúc như sau:
M
A
B Null
C
Ban đầu M rỗng và giá trị thuộc tính B trong M chưa xác định.
Nối RS có cấu trúc
RS
A
B
C
Ta thực hiện thuật toán 4.2 để nối R và S như sau:
u↓

R
A a B c d
B 1 1 2 3
v↓
S B 1 2 2
C e F g
u(B)== v(B). Vì M rỗng nên ta đưa u,v vào
M
A a
B 1
C e
Đọc tiếp u,v
u↓
R
A a B c d
B 1 1 2 3
v↓
S B 1 2 2
14
Nhóm Moon
C e F g
u(B)<v(B). Đưa u vào M
M
A a b
B 1
C e
Đọc tiếp u
u↓
R
A a B c D

B 1 1 2 3
v↓
S
B 1 2 2
C e F g
u(B)== v(B). Nối các bản ghi ra RS, sau đó làm rỗng M và đưa u,v vào
RS
A a b
B 1 1
C e e
M
A c
B 2
C f
Đọc tiếp u,v

u↓
R
A a b c D
B 1 1 2 3
v↓
S
B 1 2 2
C e f g
v(B)<u(B), ta đưa v vào M
M
A c
B 2
C f g
Lúc này S hết và r vẫn còn bản ghi

Vì u(B)=3>M.B=2, ta nối các bản ghi trong M , ghi ta RS
15
Nhóm Moon
RS
A a b c c
B 1 1 2 2
C e e f g
Kết thúc.
4/ Cài đặt chương trình tạo 2 quan hệ R2 và S2 bằng cáchsắp xếp 2 quan hệ R và S
tăng dần theo thuộc tính B:
#include<conio.h>
#include<stdio.h>
#include<stdlib.h>
#include <time.h>
typedef struct{
int A,B;
}Rbanghi;
typedef struct{
int B, C;
}Sbanghi;
void ghiFile(Rbanghi r[],Sbanghi s[]){
int i,j;
Rbanghi r1;
Sbanghi s1;
FILE *f1, *f2, *f3, *f4;
f1 = fopen("R2.DAT","wt");
f2 = fopen("S2.DAT","wt");
f3 = fopen("R.DAT","rt");
f4 = fopen("S.DAT","rt");
for(i=0;i<1000;i++)

fscanf(f3, "%d\t%d\n", &r[i].A, &r[i].B);
for(i=0;i<500;i++)
fscanf(f4, "%d\t%d\n", &s[i].B, &s[i].C);
for(i=0;i<999;i++){
for(j=i+1;j<1000;j++){
if(r[i].B>r[j].B){
r1.A=r[i].A;
r1.B=r[i].B;
r[i].A=r[j].A;
r[i].B=r[j].B;
r[j].A=r1.A;
r[j].B=r1.B;
16
Nhóm Moon
}
}
}
for(i=0;i<1000;i++){
fprintf(f1, "%d\t%d\n", r[i].A, r[i].B);
}
for(i=0;i<499;i++){
for(j=i+1;j<500;j++){
if(s[i].B>s[j].B){
s1.B=s[i].B;
s1.C=s[i].C;
s[i].B=s[j].B;
s[i].C=s[j].C;
s[j].B=s1.B;
s[j].C=s1.C;
}

}
}
for(i=0;i<500;i++){
fprintf(f2, "%d\t%d\n", s[i].B, s[i].C);
}
fclose(f1);
fclose(f2);
}
int main(){
Rbanghi R2[1000];
Sbanghi S2[500];
ghiFile(R2,S2);
getch();
}
5/ Cài đặt và chạy thử chương trình nối 2 quan hệ bằng phương pháp sắp nối:
#include<conio.h>
#include<stdio.h>
typedef struct{
int A;
int B;
}Rbanghi;
typedef struct{
17
Nhóm Moon
int B;
int C;
}Sbanghi;

typedef struct{
int A;

int B;
int C;
}RSbanghi;
void noi(Rbanghi r[], Sbanghi s[], RSbanghi rs[]){
int i, j, x, y,;
int k=0,l=0;
FILE *f1, *f2, *f3;
RSbanghi m[1000];
f1 = fopen("R2.DAT","rt");
f2 = fopen("S2.DAT","rt");
f3 = fopen("RS2.DAT","wt");
for(i=0;i<1000;i++)
fscanf(f1, "%d %d\n", &r[i].A, &r[i].B);
for(i=0;i<500;i++)
fscanf(f2, "%d %d\n", &s[i].B, &s[i].C);
m[0].B=-1;
i=0;j=0;
while(i<1000 && j<500){
if(r[i].B==s[j].B){
if(r[i].B==m[0].B || m[0].B==-1){
m[k].A=r[i].A;
m[0].B=r[i].B;
m[l].C=s[j].C;
k++; l++; i++; j++;
}
else if(r[i].B!=m[0].B){
if(m[0].B!=-1){
for(x=0;x<k;x++){
for(y=0;y<l;y++){
fprintf(f3,"%d\t%d\t

%d\n", m[x].A, m[0].B, m[y].C);
}
}
m[0].B=-1;
k=0;l=0;
}
18
Nhóm Moon
m[k].A=r[i].A;
m[0].B=r[i].B;
m[l].C=s[j].C;
k++; l++; i++; j++;
}

}
if(r[i].B<s[j].B){
if(r[i].B==m[0].B){
m[k].A=r[i].A;
k++; i++;
}
else{ if(m[0].B!=-1){
for(x=0;x<k;x++){
for(y=0;y<l;y++){
fprintf(f3,"%d\t%d\t
%d\n", m[x].A, m[0].B, m[y].C);
}
}
m[0].B=-1;
k=0;l=0;
}

m[k].A=r[i].A;
k++; i++;
}

}
if(r[i].B>s[j].B){
if(s[j].B=m[0].B){
m[l].C=s[j].C;
l++; j++;
}
else{ if(m[0].B!=-1){
for(x=0;x<k;x++){
for(y=0;y<l;y++){
fprintf(f3,"%d\t%d\t
%d\n", m[x].A, m[0].B, m[y].C);
}
}
m[0].B=-1;
k=0;l=0;
}
m[l].C=s[j].C;
19
Nhóm Moon
l++; j++;
}
}
}
if(j<500){
l=0;
j-=1;

}
if(i<1000){
k=0;
i-=1;
}
if(i<1000){
while(i<1000){
m[k].A=r[i].A;
k++; i++;
}
for(x=0;x<k;x++){
for(y=0;y<l;y++){
fprintf(f3,"%d\t%d\t%d\n", m[x].A, m[0].B, m[y].C);
}
}
}
fclose(f1);
fclose(f2);
fclose(f3);
}
int main(){
Rbanghi r2[1000];
Sbanghi s2[500];
RSbanghi rs2[10000];
noi(r2,s2,rs2);
getch();
}
20
Nhóm Moon
CHƯƠNG IV: TÀI LIỆU THAM KHẢO

- Gíao trình Cơ Sở Dữ Liệu Nâng Cao -PGS-TSKH TRẦN QUỐC CHIẾN.
CHƯƠNG V: KẾT LUẬN
Sau quá trình tìm hiểu,nghiên cứu và được sự quan tâm giúp đỡ của thầy cô,nhóm chúng
em đã hoàn thành Bài Báo Cáo của mình.Trong quá trình làm đề tài không thể tránh khỏi
những sai sót, chúng em mong nhận được những ý kiến đóng góp từ phía thầy cô và bạn
bè.
Cuối cùng, nhóm chúng em chân thành cảm ơn các thầy cô và đặc biệt là là giảng viên
hướng dẫn TRẦN QUỐC CHIẾN đã giúp đỡ nhóm chúng em thực hiện đề tài này.
Chúc thầy và các bạn sức khỏe !



21

×