Báo cáo thực tập cơ sở - Trần Thị Kim Oanh
Câu 3: Tìm hiểu và sử dụng Outlook Express
Câu 4: Từ điển
Cho tệp văn bản trong đó có chứa các từ, các dấu phân cách từ: dấu cách, dấu phẩy, dấu chấm, dấu chấm phẩy, dấu hai chấm, dấu chấm than, dấu hỏi. Mọi từ bắt đầu bằng chữ cái ‘A’.’Z’ (không phân biệt chữ hoa và chữ thường).
1. Viết thủ tục đọc các từ trong tệp văn bản và lưu trữ vào mảng các danh sách liên kết:
Type DanhSach=^PhanTu;
PhanTu=Record
lorer.Vào Tool / Internet Options / Content . Trong Content Advisor chọn Enable. Click Setting để cài đặt level cho các thông số cấm như : Cấm các trang web Sex, Nudity, Violence (bạo lực) lên mức 4 là mức cao nhất. Chọn Tab Approverd Sites , gõ địa chỉ website cần cấm vào , nhấn Nerver để cấm truy cập. ( ví dụ : ) Chọn Tab General , đánh dấu tích vào Supervisor can type a password to allow users to view restricted content để xác lập mật khẩu cho việc sử dụng Restrited Content. Click vào Change Password, nhập password và nhấn OK để hoàn tất. Kiểm tra bằng các mở trình duyệt và gõ vào : sẽ hiện thông báo website đã bị cấm truy nhập, cần có mật khẩu để có thể truy cập được. Các phương pháp tìm kiếm trong 2.1-Bài toán tìm kiếm Bài toán tìm kiếm được phát biểu như sau : Cho một bảng gồm n bản ghi R1, R2 , , Rn ; mỗi bản ghi Ri tương ứng với một khoá Ki ; ( 1 <= i <= n ) . Hãy tìm bản ghi có giá trị khoá bằng X cho trước . X được gọi là khoá tìm kiếm hay đối trị tìm kiếm . Công việc tìm kiếm sẽ được hoàn thành khi có một trong hai tình huống sau đây xảy ra : Tìm được bản ghi có giá trị khóa bằng X , lúc đó ta nói phép tìm kiếm được thỏa mãn . Không tìm được bản ghi nào có giá trị khóa bằng X , khi đó ta nói phép tìm kiếm không thỏa mãn . Nếu sau phép tìm kiếm không thỏa mãn, còn có yêu cầu bổ sung thêm một bản ghi mới có giá trị khóa bằng X thì giải thuật tương ứng được gọi là giải thuật tìm kiếm có bổ sung . 2.2-Thuật toán tìm kiếm tuần tự 2.2.1 Thuật toán “ Bắt đầu từ vị trí khoá thứ nhất ta lần lượt so sánh khoá thứ K với các khoá trong dãy cho đến khi tìm được khoá mong muốn hoặc hết dãy mà không tìm thấy “ . Giải thuật sau đây sẽ trả về vị trí đầu tiên tìm thấy khoá X trong dãy khoá K1 , K2 , , Kn hoặc trả về giá trị 0 nếu không tìm thấy . Function tim_kiem_tt(K,n,X) 1.{ Khởi tạo } i:=1; 2.{ Tìm kiếm } While ( i X ) do i := i + 1 ; 3.{ Trả về giá tri } If ( i > n ) then return(0) Else return(i) ; 2.2.2-Ví dụ minh họa Bài toán : Cho mảng a một chiều chứa 5 số nguyên . Tìm vị trí đầu tiên có mặt X=3 trong mảng đã cho . Phân tích : Giả sử mảng a một chiều có các giá trị được cho dưới bảng : a[0] a[1] a[2] a[3] a[4] 8 5 9 12 3 Mảng gồm 5 phần tử a[i] kiểu nguyên được đánh địa chỉ và được gán các giá trị theo bảng trên . Phép tìm kiếm được bắt đầu từ giá trị tại địa chỉ a[0] của mảng , nếu a[0] X . Tăng i lên một đơn vị và tiếp tục so sánh , nếu chưa thấy thoả mãn , lặp lại quá trình tìm kiếm cho đến khi hết mảng . -Trong bài toán này ta thấy a[4] = X , khi đó phép tìm kiếm trên mảng được thoả mãn ,vi trí con trỏ đầu tiên trả về là i = 4 . -Nếu ta xét hết mảng mà không tìm được giá trị bằng X , khi đó phép tìm kiếm không được thỏa mãn . 2.2.3-Cài đặt thuật toán #include #include #include void nhapmang(int a[],int &n) { printf("\n nhap so phan tu cua mang :"); scanf("%d",&n); for(int i=1;i<=n;i++){ printf("\n nhap phan tu thu %d la :",i); scanf("%d",&a[i]); } } void inmang(int a[],int n){ printf("\n mang vua nhap :"); for(int i=1;i<=n;i++)printf("%d ,",a[i]); } int tim(int x,int a[],int n){ for(int i=1;i<=n;i++) { if (a[i]==x) return i;} return -1; } void main(){ clrscr(); int a[100]; int n,i,x; nhapmang(a,n); inmang(a,n); printf("\n nhap gia tri x= ");scanf("%d",&x); n=tim(x,a,n); if(n!=-1){printf("\n Gia tri %d o tai vi tri thu:%d",x,n); } else printf("\n Khong tim thay gia tri %d trong mang !",x); getch(); } 2.3 Thuật toán tìm kiếm nhị phân 2.3.1 Thuật toán Phép tìm kiếm nhị phân luôn luôn chọn khóa ở giữa dãy đang xét để so sánh với khóa tìm kiếm . Giả sử dãy khóa đang xét là Kl , Kl+1 , , Kr thì khóa ở giữa dãy là khóa K[m] với m=(l+r)/2 ; - Nếu X = K[m] thì ta nói phép tìm kiếm được thỏa mãn . - Nếu X < K[m] thì phép tìm kiếm được thực hiện trên dãy khóa Kl , K2 , , Km với cách tìm tương tự . - Nếu X > K[m] thì phép tìm kiếm sẽ được thực hiện tiếp trên dãy khóa Km+1 , Km+2 , , Kr với cách làm cũng tương tự . Như vậy rỏ ràng ở đây ta thấy để thực hiện tìm kiếm nhị phân được đòi hỏi dãy khóa đã được sắp xếp tăng dần . “ Cho dãy khóa K1 , K2 , , Kn đã được sắp xếp tăng dần . Giải thuật tìm kiếm nhị phân sẽ trả về vị trí tìm thấy khóa X hoặc trả về giá trị 0 nếu không thấy khóa X “. Function tim_kiem_np( K , n , X ) 1.{ Khởi tạo } l := 1 ; r := n ; 2.{Tìm kiếm } While ( l <= r ) do Begin m := (l+r)/2 ; if ( X < K[m] ) then r := m - 1 else if ( X > K[m] ) then l := m+1 else return(m) ; End ; 3. Return( 0 ) ; 2.3.2 Ví dụ minh họa Minh họa quá trình tìm kiếm nhị phân khóa 23 ,71 trên dãy khóa được cho sau đây : 11 , 23 , 37 , 42 , 56 , 66 , 78 , 88 , 95 , 98 - Đối với khóa X=23 : [ 11 , 23 , 37 , 42 , 56 , 66 , 78 , 88, 95 , 98 ] So sánh khóa 23 với khóa 56 ta thấy 23 < 56 ta có : [ 11, 23 , 37 , 42 ] So sánh khóa 23 với khóa 23 ta thấy 23 = 23 => phép tìm kiếm được thỏa và giá trị vị trí trả về m = 2 . -Đối với khóa X=71 : [ 11 , 23 , 37 , 42 , 56 , 66 , 78 , 88 , 95 , 98 ] So sánh khóa 71 với khóa 56 ta thấy 71 > 56 ta có : [ 66 , 78 , 88 , 95 ,98 ] So sánh khóa 71 với khóa 88 ta thấy 71 < 88 ta có : [ 66 , 78 ] So sánh khóa 71 với khóa 66 ta thấy 71 > 66 ta có : [ 78 ] So sánh 71 với 78 ta thấy 71 < 78 ta có : [ ] => phép tìm kiếm không được thỏa mãn . 2.3.3 Cài đặt thuật toán #include #include #include void nhapmang(int a[],int &n) { printf("\n nhap so phan tu cua mang n=");scanf("%d",&n); for(int i=0;i<n;i++) { printf("\n nhap phan tu thu %d la :",i); scanf("%d",&a[i]); } } void inmang(int a[],int n) { printf("\n mang vua nhap : "); for(int i=0;i<n;i++) printf("%4d",a[i]); } void sapxep(int a[],int n){ int i,j,tg; for(i=0;i<n-1;i++) for(j=i+1;j<n;j++) if(a[i]>a[j]){ tg=a[i]; a[i]=a[j]; a[j]=tg; } printf("\n Mang sau khi sap xep tang dan la:"); for(i=0;i<n;i++) printf("%4d",a[i]); } int tim_kiem_np(int x,int a[],int n) {int start=0,end=n-1,i; while(start<= end){ i=(start+end)/2; if (x>a[i]) start=i+1 ; else if (x<a[i]) end=i; else return(i); } return -1; } void main(){ clrscr(); int a[100]; int n,i,x; nhapmang(a,n); inmang(a,n); sapxep(a,n); printf("\n nhap gia tri x= ");scanf("%d",&x); n=tim_kiem_np(x,a,n); if(n!=-1) printf("\n Gia tri %d trong mang tai vi tri thu : %d",x,n); else printf("\n Khong tim thay gia tri %d trong mang !",x); getch(); } 2.4 Cây nhị phân tìm kiếm 2.4.1 Khái niệm cây nhị phân tìm kiếm Cây nhị phân tìm kiếm ứng với n khóa K1 , K2 , , Kn là một cây nhị phân mà mỗi nút được gắn một giá trị khóa sao cho mọi nút trên cây đều thỏa mãn các tính chất dưới đây : - Mọi khóa thuộc cây con trái của một nút đều có giá trị nhỏ hơn khóa ở nút đó . - Mọi khóa thuộc cây con phải của một nút đều có giá trị lớn hơn khóa ở nút đó . 2.4.2 Giải thuật tìm kiếm Để tìm kiếm xem khóa tìm kiếm X có trên cây hay không ta thực hiện như sau . So sánh X với khóa ở gốc khi đó một trong bốn tình huống sau đây sẽ xuất hiện ; Không có gốc (cây rổng) : X không có trên cây , phép tìm kiếm không thỏa mãn . X trùng với khóa ở gốc , phép tìm kiếm được thỏa mãn . X nhỏ hơn khóa ở gốc , phép tìm kiếm được thực hiện tiếp trên cây con trái . X lớn hơn khóa ở gốc , phép tìm kiếm được thực hiện tiếp trên cây con phải . Nếu phép tìm kiếm không thỏa , ta bổ sung X vào cây thì dể thấy phép bổ sung này được thực hiện đơn giản . Không làm ảnh hưởng đến tính chất của cây nhị phân tìm kiếm . Giả sử cây nhị phân tìm kiếm được lưu trữ móc nối mà mỗi nút có dạng LPTR KEY RPTR Trong đó : KEY : chứa giá trị khóa LPTR : là con trỏ trỏ đến nút con trái RPTR : là con trỏ trỏ đến nút con phải Cho cây nhị phân tìm kiếm có gốc trỏ bởi T , giải thuật sau tìm kiếm có bổ sung khóa X được viết như sau : Function BST(T,X) 1.{ Khởi tạo } P : = T ; Q : =NIL; 2.{ Tìm kiếm } While P NIL do Case X < KEY( P ) : Begin Q : = P ; P : = LPTR( P ) ; End ; X = KEY( P ) : Return( P ) ; X > KEY( P ) : Begin Q : = P ; P : = RPTR( P ) ; End ; Endcase ; 3.{ Tạo nút mới } New( P ) ; KEY( P ) : = X ; LPTR( P ) : = RPTR( P ) : = NIL ; 4.{ Xét các trường hợp bổ sung } Case T : = NIL ; T : = P ; X < KEY( Q ) : LPTR( Q ) : = P ; X > KEY( Q ) : RPTR( Q ) : = P ; Endcase ; 5. Return( P ) ; 2.4.3-VÍ DỤ MINH HỌA Cho dãy khóa : 42 23 74 11 65 58 94 36 99 87 Cây nhị phân tìm kiếm được xây dựng như sau: 42 11 74 23 94 65 36 87 99 58 Với khóa X=68 , X=36 bằng thuật toán cây nhị phân tìm kiếm , tìm xem trong cây nhị phân trên có khóa nào thỏa mãn X=68 , X=36 ? Giải : - Đối với khóa X=68 , quá trình tìm kiếm được thực hiện như sau : Bắt đầu từ khóa gốc của cây nhị phân tìm kiếm , so sánh khóa 68 với khóa 42 ta thấy 68 > 42 => chuyển 68 sang cây con phải và tìm kiếm tiếp . So sánh khóa 68 với khóa 74 ta thấy 68 chuyển sang cây con trái và tìm kiếm tiếp . So sánh khóa 68 với khóa 65 ta thấy 68 > 65 => chuyển sang cây con phải , cây con phải rổng . => Vậy phép tìm kiếm không thỏa mãn . - Đối với khóa X=36 , quá trình tìm kiếm được thực hiện như sau : Bắt đầu từ khóa gốc của cây nhị phân tìm kiếm , so sánh khóa 36 với khóa 42 ta thấy 36 chuyển sang cây con trái và tìm kiếm tiếp . So sánh khóa 36 với khóa 23 ta thấy 36 > 23 => chuyển sang cây con phải và tìm kiếm tiếp . So sánh khóa 36 với khóa 36 ta thấy 36=36 , phép tìm kiếm được thỏa . 2.4.4 Cài đặt thuật toán #include #include #include struct node { int key ; node *l , *r ; }*t ; void insert( node *&t , int x ) { If ( t == NULL ) { t = new node ; t -> key = x ; t -> l = NULL ; t -> r = NULL ; return ; } If ( x key ) insert( t -> l , x ) ; else insert( t-> r , x ) ; } void nhapcay( node *&t ) { int n , x ; printf("\nNhap so nut cua c
File đính kèm:
- TTCS.doc