Tải bản đầy đủ (.doc) (22 trang)

Thuật toán kiểm tra các tính chất của quan hệ

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 (202.65 KB, 22 trang )

BÁO CÁO THỰC TẬP CƠ SỞ

MÃ ĐỀ 033

LỜI MỞ ĐẦU
Ngày nay, Công nghệ thông tin ngày càng phát triển và thể hiện rõ tầm quan
trọng trong tất cả các lĩnh vực, có thể nói Cơng nghệ thơng tin đã trở thành thước đo
để đánh giá sự phát triển của xã hội hiện đại, nơi mà con người đang dần thoát khỏi
cách làm việc thủ công, thô sơ và tiến đến tin học hóa trong tất cả các lĩnh vực để
cơng việc có hiệu quả hơn, tiết kiệm thời gian và nhân lực.
Việc nghiên cứu và lập trình ra các phần mềm, các ứng dụng mới là điều
hướng tới của các sinh viên theo học Công nghệ thông tin. Bản báo cáo này trình
bày kết quả của việc lập trình các bài tốn. Trong q trình thực hiện em nhận được
sự giúp đỡ nhiệt tình từ các giảng viên trong khoa Công nghệ thông tin trường Đại
học Vinh.
Nhân dịp này em xin gửi lời cảm ơn đến các thầy cô trong khoa Công nghệ
thông tin – trường Đại học Vinh đã tạo cơ hội giúp em được tham gia học hỏi, rèn
luyện các kỹ năng cần thiết cho đợt thực tập cuối khóa.
Đặc biệt em xin gửi lời cảm ơn đến ThS. Nguyễn Thị Hồng Anh đã quan tâm
góp ý cho bài làm thực tập cơ sở và sẵn sàng trả lời tất cả những thắc mắc khi cần
thiết giúp em hồn thành tốt bài làm của mình.
Mặc dù đã có nhiều cố gắng nhưng do kiến thức còn hạn chế cùng với kinh
nghiệm chưa có nên khơng tránh khỏi thiếu sót vì vậy em rất mong nhận được
những ý kiến đóng góp bổ sung của thầy giáo, cơ giáo và các bạn để đề tài làm thực
tập cơ sở của em được hoàn thiện hơn.
Em xin chân thành cảm ơn.
Sinh viên thực hiện

Page



BÁO CÁO THỰC TẬP CƠ SỞ

MÃ ĐỀ 033

LỜI CẢM ƠN
Trong thời đại công nghệ thông tin ngày nay, việc ứng dụng Công nghệ
Thông tin vào cuộc sống cũng như các ngành khoa học ngày càng trở nên quan
trọng. Trước đây khi Cơng nghệ Thơng tin chưa phát triển thì việc giải quyết các bài
toán phức tạp và kết quả đạt được với độ chính xác thấp. Những bài tốn này địi
hỏi phải có những thuật tốn hợp lý, cũng như cấu trúc lưu trữ thích hợp thì mới đạt
được kết quả tối ưu nhất. Chính vì thế việc tìm hiểu nó là một phần rất quan trọng
đối với một người lập trình. Thêm vào đó là những kỹ thuật về việc xử lý văn bản,
xử lí tệp là một kỹ năng tối thiểu với một người làm việc với máy tính.
Đợt thực tập cơ sở này chính là bước đầu tiên đi sâu vào tìm hiểu, đây là cơ
hội để chúng em tổng hợp lại tất cả những gì mà đã được học trong thời gian qua.
Chúng em xin chân thành cảm ơn sự hướng dẫn của các thầy giáo, cô giáo
trong Khoa Công Nghệ Thông Tin – Trường Đại học Vinh. Chúng em đặc biệt bày
tỏ lòng biết ơn chân thành tới cô giáo NGUYỄN THỊ HỒNG ANH, cô đã tạo mọi
điều kiện và luôn giúp đỡ, hướng dẫn chúng em tận tình để chúng em hồn thành tốt
đề tài thực tập cơ sở này.
Cuối cùng, chúng em xin chân thành cảm ơn và kính chúc các thầy giáo, cô
giáo sức khoẻ và hạnh phúc.

Page


BÁO CÁO THỰC TẬP CƠ SỞ

MÃ ĐỀ 033


MỤC LỤC
Trang

I. BÀI TOÁN.................................................................................................4
Họ và tên: Họ Tên ......................................................................................4
II. THUẬT TOÁN GIẢI QUYẾT CƠNG VIỆC CHO MỖI HÀM..............4
2.3. Chương trình...........................................................................................5
2.4. Bộ dữ liệu test và kết quả test tương ứng.............................................10
Phần II. Thuật Toán Kiểm Tra Các Tính Chất Của Quan Hệ.........................12
2.1. Bài tốn.................................................................................................12
2.2.1. Dùng ma trận lô-gic để biểu diễn quan hệ hai ngôi trên một tập
hợp...........................................................................................................12
2.2.1.1. Các khái niệm...........................................................................................12
2.2.1.2. Cách biễu diễn..........................................................................................12
2.2.1.3. Các tính chất của quan hệ.........................................................................12

2.2.3. Cài đặt thuật tốn kiểm tra các tính chất của quan hệ (phản xạ, đối
xứng, bắc cầu).........................................................................................13
2.2.3.1. Thuật tốn kiểm tra tính phản xạ..............................................................14
2.2.3.2. Thuật tốn kiểm tra tính đối xứng............................................................15
2.2.3.3. Thuật tốn kiểm tra tính bắc cầu..............................................................16
2.2.3.4. Chương trình.............................................................................................17
2.2.3.5. Dữ liệu và kết quả test:..............................................................................18

Page


BÁO CÁO THỰC TẬP CƠ SỞ

MÃ ĐỀ 033


PHẦN 1: BÀI TOÁN 1
I. BÀI TOÁN
Cho một tệp văn bản input.txt, mỗi dịng là một xâu họ và tên. Viết chương
trình tách tên và tách họ của các xâu họ và tên đọc được từ tệp input.txt. Kết quả
đưa vào tệp văn bản output.txt theo dạng:
Họ và tên:

Họ

Tên

II. THUẬT TOÁN GIẢI QUYẾT CƠNG VIỆC CHO MỖI HÀM
2.1. Thuật tốn chuẩn hóa xâu.
* Ý tưởng:
- Từ tệp input.txt mỗi dòng là một xâu họ tên chứa nhiều dấu cách trống,các
ký tự trong xâu họ tên chữ hoa chữ thường không theo quy luật đó là các chữ cái
đầu của họ tên phải viết hoa và sau đó là chữ cái thường.Nên ta tiến hành chuẩn hóa
xâu đó là cắt các ký tự trống liên tiếp,các chữ cái đầu của họ tên phải được viết hoa
Input: xâu họ tên listten
Nhập vào input.txt một xâu họ tên ngUYEN ThỊ HanH
Output: xâu listten đã chuẩn hóa.
Ở tệp output.txt được chuẩn hóa và lưu thành Nguyễn Thị Hạnh
Các bước thực hiện:
+Bước 1: Đọc dữ liệu từ tệp input.txt vào mảng 2 chiều listTen[n][m].
+Bước 2: Xóa các ký tự trống ở cuối chuỗi
+Bước 3: Xóa các ký tự trống ở đầu chuỗi
+Bước 4: Kiểm tra xâu có chữ hoa hay khơng.Nếu có chuyển tất cả về chữ
thường
+Bước 5: Xóa 2 ký tự trống liên tiếp trong xâu

+Bước 6: Duyệt xâu kể từ phẩn tử đầu tiên khi gặp khoảng trống thì chuyển
chữ cái đầu tiên ngay sau đó thành chữ hoa

Page


BÁO CÁO THỰC TẬP CƠ SỞ

MÃ ĐỀ 033

+Bước 7: Chuyển chữ cái đầu tiên của xâu thành chữ hoa
2.2. Thuật toán tách xâu họ tên
* Ý tưởng:
- Từ xâu họ và tên đã chuẩn hóa, tiến hành duyệt xâu từ vị trí đầu tiên cho
gặp dấu cách trống đầu tiên. Cắt xâu này thu được xâu họ. Sau khi cắt được họ tiếp
tục duyệt xâu từ cuối xâu, gặp dấu cách trống đầu tiên, cắt xâu này ta thu được xâu
tên. Nếu xâu trống thì xâu họ và tên là Null.
* Các bước:
-Bước 1: i=0. listen[i]

// Đọc xâu đầu tiên trong mảng đã

chuẩn hóa
-Bước 2: j=0. listTen[i][j] //Duyệt kí tự đầu tiên trong xâu
-Bước 3: j++
Nếu listen[i][j] !=’ ‘: listHo[i][j] = listen[i][j]
Ngược lại: Dừng chương trình. Xâu thu được là xâu họ.
-Bước 4: a=0,k = strlen(listen[i][j]), j=k. ListTen[i][j] //Duyệt kí tự cuối
cùng trong xâu
-Bước 5: j- Nếu listen[i][j]!=’ ‘: ListT[i][a] = listen[i][j]. a++

strrev(listT[i]) ;

//Đọc xâu theo chiều ngược lại

Ngược lại: Dừng chương trình. Xâu thu được là xâu tên.
2.3. Chương trình
#include "StdAfx.h"
#include<stdio.h>
#include<conio.h>
#include<iostream>
using namespace std;
void strdelete(char *listTen,int vt,int sl)
{
Page


BÁO CÁO THỰC TẬP CƠ SỞ

MÃ ĐỀ 033

int n=strlen(listTen),i;
for (i=vt;i<=n-sl;++i)
listTen[i]=listTen[i+sl];
}
void chuanhoachuoi(char listTen[])
{
int i;
while(listTen[strlen(listTen)-1]==' ')
listTen[strlen(listTen)-1]=0;
while(listTen[0]==' ')

strdelete(listTen,0,1);
for(i=0;iif((listTen[i]>=65)&&(listTen[i]<=90))
listTen[i]+=32;
i=0;
while(iif((listTen[i]==' ')&&(listTen[i+1]==' '))
strdelete(listTen,i,1);
else ++i;
for(i=0;iif(listTen[i]==' ')
listTen[i+1]-=32;
listTen[0]=toupper(listTen[0]);
}
int _tmain(int argc, _TCHAR* argv[])
{
FILE *f;

Page


BÁO CÁO THỰC TẬP CƠ SỞ

MÃ ĐỀ 033

char listTen[255][255];
int i=0;
f = fopen("D:\\input.txt", "rt");
while (!feof(f))
{

fgets(listTen[i], 255, f);
i++;
}
int l = i;

int testHo = 0, testTen = 0, j;
char listHo[255][255], listT[255][255];
for (i=0;i < l; i++)
{
chuanhoachuoi(listTen[i]);
for (j = 0; listTen[i][j] != ' '; j++)
{
listHo[i][j] = listTen[i][j];
}
listHo[i][j] = NULL;
int k = strlen(listTen[i]);
if (listTen[i][k-1] == '\n')
{
k -= 1;
listTen[i][k] = NULL;
}
int a = 0;

Page


BÁO CÁO THỰC TẬP CƠ SỞ

MÃ ĐỀ 033


for (j = k-1; listTen[i][j] != ' '; j--)
{
listT[i][a] = listTen[i][j];
a++;
}
listT[i][a] = NULL;
strrev(listT[i]) ;
}

FILE *d;
d=fopen("D:\\output.txt","wt");
for(i=0;i<1;i++)
{
fprintf(d,"****-_Ho va ten_-****");
fprintf(d,"%10s"," ");
fprintf(d,"****-_Ho_-****");
fprintf(d,"%10s"," ");
fprintf(d,"****-_Ten_-****");
fprintf(d,"\n");
}
for(i=0;i{
fprintf(d,"%20s",listTen[i]);
fprintf(d," ");
fprintf(d,"%20s",listHo[i]);
fprintf(d," ");
fprintf(d,"%20s",listT[i]);

Page



BÁO CÁO THỰC TẬP CƠ SỞ

MÃ ĐỀ 033

fprintf(d," ");
fprintf(d,"\n");

}

cout<<"\n===================MENU=========
===========*\n";
cout<<"\n*

1.DOC TEP

*\n";
cout<<"\n*

2.CHUAN HOA VA TACH

*\n";
cout<<"\n*

3.LUU TEP DA DUOC CHUAN

HOA VA TACH VAO TEP
output.txt

.


*\n";

cout<<"\n*

4.THOAT

*\n";

cout<<"\n*================================
============*\n";
for (i = 0; i < l; i++)
{ cout << "\n===__Xau thu "<tach___===";
cout << "\n\n-Ho va ten: " << listTen[i] <<
"\n\n-Ho: " << listHo[i] << "\t-Ten: " << listT[i] <<
endl;
}
cout << "\n\n______________THE
END___________________";
cout << endl;

Page


BÁO CÁO THỰC TẬP CƠ SỞ

MÃ ĐỀ 033

system("pause");

return 0;
}
2.4. Bộ dữ liệu test và kết quả test tương ứng
2.4.1 Tệp input.txt

2.4.2 Kết quả tương ứng

Page


BÁO CÁO THỰC TẬP CƠ SỞ

MÃ ĐỀ 033

Page


BÁO CÁO THỰC TẬP CƠ SỞ

MÃ ĐỀ 033

Phần II. Thuật Tốn Kiểm Tra Các Tính Chất Của Quan Hệ
2.1. Bài toán
1. Nêu cách dùng ma trận logic để biễu diễn quan hệ 2 ngơi trên một tập hợp.
2. Nêu ví dụ minh họa.
3. Cài đặt thuật toán kiểm tra các tính chất của quan hệ(phản xạ, đối xứng, bắc
cầu).
2.2 . Cách xây dựng
2.2.1. Dùng ma trận lô-gic để biểu diễn quan hệ hai ngôi trên một tập hợp
2.2.1.1. Các khái niệm

- Quan hệ hai ngôi R trên tập A là một quan hệ từ A đến A, nghĩa là R là tập
con của tích đề các A x A.
- Ma trận logic cỡ m x n là một ma trận có m dịng và n cột, trong đó các phần
tử của nó chỉ nhận một trong hai giá trị 0 hoặc 1.
2.2.1.2. Cách biễu diễn
Ta chọn tập A gồm n phần tử được đánh số thứ tự A={
}. Khi đó quan hệ R trên A được xác định bằng ma trận
vuông cấp n, ký hiệu

với mọi

A thỏa mãn:

Theo cách biểu diễn này, rõ ràng với mỗi quan hệ R trên A sẽ xác định duy nhất
một ma trận logic
, và ngược lại, khi biết ma trận logic của một quan hệ R, sẽ
xác định được chính xác quan hệ R.
2.2.1.3. Các tính chất của quan hệ
-

Một quan hệ có tính chất phản xạ khi và chỉ khi ∀a

-

Một quan hệ có tính chất đối xứng khi và chỉ khi ∀a, b

-

Một quan hệ có tính chất bắc cầu khi và chỉ khi ∀a,b,c


A thì aRa.
A thì aRb và bRa.
A thì aRb và bRc

thì aRc.
* Nếu sử dụng ma trận logic để biểu diễn qua hệ 2 ngôi trên một tập hợp thì ta có
các nhận xét sau đây:
- Một quan hệ có tính phản xạ khi và chỉ khi ma trận biểu diễn nó có tất cả
phần tử trên đường chéo chính đều bằng 1.

Page


BÁO CÁO THỰC TẬP CƠ SỞ

MÃ ĐỀ 033

-

Một quan hệ có tính chất đối xứng khi và chỉ khi ma trận biểu diễn nó là một
ma trận đối xứng qua đường chéo chính.

-

Một quan hệ có tính chất bắc cầu khi và chỉ khi ma trận biễu diễn nó có
=1 và

=1 thì

=1.


2.2.2. Ví dụ minh họa
Cho tập hợp A = {1, 2, 3, 4, 5}, ta định nghĩa quan hệ R trên A như sau: ∀a, b∈
A ta nói aRb khi và chỉ khi a + b là một số lẻ, khi đó quan hệ R có thể được biểu
diễn bằng các phương pháp sau:
- Quan hệ R được xác định bởi tập hợp sau:
R(A) = {(1, 2), (2, 1), (1, 4), (4, 1), (2, 3), (3, 2), (3, 4), (4, 3), (2, 5), (5, 2), (4, 5),
(5, 4)}.
- Ma trận logic của quan hệ R được xác định như sau:

2.2.3. Cài đặt thuật tốn kiểm tra các tính chất của quan hệ (phản xạ, đối xứng, bắc
cầu)

Page


BÁO CÁO THỰC TẬP CƠ SỞ

MÃ ĐỀ 033

2.2.3.1. Thuật toán kiểm tra tính phản xạ
- Input: Ma trận logic n x n thể hiện quan hệ R.
- Output: Cho kết quả là 1 nếu quan hệ có tính phản xạ, ngược lại trả về 0.
b
e
g
i
Nhập
n
n và

mảng
a
S
k
q
Đ

j

=
ii
1
=<
S
0m
?

Đ

i ++

j

S
<
j
Đ

Đ


r
e
t
u
r
n
k

in
= ?
0 =S
a
[j
i?
]
[
j
]
=
1
?

r
e
t
u
r
n
0
e

n
d
Page


BÁO CÁO THỰC TẬP CƠ SỞ

MÃ ĐỀ 033

2.2.3.2. Thuật toán kiểm tra tính đối xứng
- Input: Ma trận logic n x n thể hiện quan hệ R.
- Output: Cho kết quả là 1 nếu quan hệ có tính đối xứng, ngược lại trả về 0

be
gi
Nhập
n nvà
mảng
a

k
q
=
1
i
=
Đ 0

S


S

i
<
Đ

i
+
+

j
=
0

m
?

r
e
t
u
r
n

Đ

j
S

a <

[
i n
] ?
[
j
]r
=e
at
[u
jr
]n
[
i0
]

k
q

j
+
+

Page

e
n
d


BÁO CÁO THỰC TẬP CƠ SỞ


MÃ ĐỀ 033

2.2.3.3. Thuật toán kiểm tra tính bắc cầu
- Input: Nhập vào ma trận logic n x n
- Output: Cho kết quả là 1 nếu quan hệ có tính bắc cầu, ngược lại trả về 0.

be
Nhập
gi
n và
n
mảng
a
S
Đ
S
Đ
i

k
q
Đ =
1i

<
m
?

=

0

Đ
i
+
+

Đ
Đ

S

j

j
a
=
[
<
i
0
]
n
[
?
j
]
=
1
?


ak
k [
j<
= ]
[n
a
0 i?
[
]
i
=
]
1
[
?
k

S
S

S

j

r
e
t
u
r

nr
e
0t
u
r
n

+
+

Page

r
e
t
u
r
n
k
q

e
n
d


=
1
?
BÁO CÁO THỰC TẬP CƠ SỞ


0

MÃ ĐỀ 033
k

2.2.3.4. Chương trình
+
#include "conio.h"
+
#include <stdio.h>
void nhapmang(int a[50][50], int n)
{
int i,j,tg;
printf("\n moi nhap cac phan tu mang\n");
for(i=0;ifor(j=0;j{
printf("a[%d][%d]=",i,j);
scanf("%d",&tg);
a[i][j]=tg;
}
}
void hienmang(int a[50][50], int n)
{
int i,j;
for(i=0;i{
for(j=0;jprintf("%3d",a[i][j]);

printf("\n");
}
}
int phanxa(int a[50][50], int n)
{
int i,j,kq=1;
for(i=0;ifor(j=0;jif((i==j)&&( a[i][j]!=1))return 0;
return kq;
}
int doixung(int a[50][50], int n)
{
int i,j,kq=1;
for(i=0;ifor(j=0;jPage


BÁO CÁO THỰC TẬP CƠ SỞ

MÃ ĐỀ 033

if (a[i][j]!=a[j][i]) return 0;
return kq;
}
int baccau(int a[50][50], int n)
{
int i,j,k,kq=1;
for(i=0;i

for(j=0;jif(a[i][j]==1)
for(k=0;kif((a[j][k]==1)&&(a[i][k]!=1))return 0;
return kq;
}
void main()
{
int n, a[50][50];
clrscr();
printf("moi nhap kich thuoc cho mang:");
scanf("%d”,&n);
nhapmang(a,n);
hienmang(a,n);
if(phanxa(a,n)==1) printf("\nquan he co tinh phan xa");
else
printf("\nquan he khong co tinh phan xa");
if(doixung(a,n)==1) printf("\nquan he co tinh doi xung");
else
printf("\nquan he khong co tinh doi xung");
if(baccau(a,n)==1) printf("\nquan he co tinh bac cau");
else
printf("\nquan he khong co tinh bac cau");
getch();
}
2.2.3.5. Dữ liệu và kết quả test:
Nhập các ma trận:
- Ma trận a[5][5]

Page



BÁO CÁO THỰC TẬP CƠ SỞ

MÃ ĐỀ 033

Kết quả:

-

Ma trận a[4][4]

Page


BÁO CÁO THỰC TẬP CƠ SỞ

MÃ ĐỀ 033

Kết quả:

-

Ma trận a[3][3]

Kết quả:

Page



BÁO CÁO THỰC TẬP CƠ SỞ

MÃ ĐỀ 033

KẾT LUẬN
Công nghệ thông tin là công cụ đắc lực, là lĩnh vực có nhiều ứng dụng phục
vụ cho nhiều ngành khác nhau trong đời sống xã hội. Qua quá trình làm đề tài em
đã có dịp củng cố, bổ sung kiến thức và thu được những kinh nghiệm quý báu, phục
vụ cho việc học tập và làm việc sau này như là các kiến thức về tìm kiếm thơng tin
thơng dụng hiện nay, nâng cao khả năng làm việc theo nhóm, nâng cao kiến thức về
ngơn ngữ lập trình C, cấu trúc dữ liệu và giải thuật và cách tổ chức giải quyết yêu
cầu của một bài toán cụ thể…
Tuy nhiên do hạn chế về trình độ, thời gian khơng nhiều nên những kết quả
đạt được vẫn chưa đầy đủ và có thể có nhiều sai sót. Rất mong được sự đóng góp ý
kiến của các thầy cơ giáo và các bạn để đề tài của em được hoàn thiện hơn.
Cuối cùng chúng em xin chân thành cảm ơn ThS. Nguyễn Thị Hồng Anh đã
giúp đỡ nhiệt tình cho em hồn thiện đề tài này.

Page


BÁO CÁO THỰC TẬP CƠ SỞ

MÃ ĐỀ 033

TÀI LIỆU THAM KHẢO

[1] Đỗ Đức Giáo, “Toán rời rạc”. NXB Đại học quốc gia Hà Nội.
[2] Gs.Phạm Văn Ất, “Kỹ Thuật Lập trình C Cơ sở và Nâng cao”.
NXB Thời Đại.


Page



×