1. Trang chủ
  2. » Luận Văn - Báo Cáo

Xây dựng chương trình thống kê kí tự đơn và kí tự đôi trong file văn bản tiếng Việt mã ABC

35 440 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 35
Dung lượng 248,85 KB

Nội dung

Xây dựng chương trình thống kê kí tự đơn và kí tự đôi trong file văn bản tiếng Việt mã ABC

Luận văn Xây dựng chương trình thống tự đơn tự đôi trong file văn bản tiếng Việt ABC I. Đặt vấn đề *Mục đích của đề tài Từ khi máy vi tính trở nên phổ biến rộng rãi trong nước, nhu cầu sử dụng chữ Việt trên máy vi tính đã trở thành nhu cầu cấp thiết đối với người sử dụng. Việc đưa tiếng Việt vào máy tính là một vấn đề có tầm quan trọng trong việc tin học hóa, phổ cập tin học phát triển công nghệ phần mềm trong nước. Do vậy đã có nhiều cá nhân, tập thể trong ngoài nước đã tập trung nhiều công sức trong việc đưa tiếng Việt vào các máy tính nói chung máy vi tính nói riêng. Hiện nay có rất nhiều phần mềm đưa tiếng Việt vào máy tính, số lượng các phần mềm này lớn cho ta thấy được ý nghĩa của việc đưa tiếng Việt vào máy tính. Tuy nhiên mỗi phần mềm này lại có một cách thức thể hiện khác nhau (cách hóa ký tự tiếng Việt khác nhau). Có rất nhiều cách hóa ký tự Tiếng Việt. Mặc dù khác nhau, không thống nhất theo những quy tắc chung, các giải pháp tiếng Việt đã phần nào đáp ứng được nhu cầu thực tiễn, ít nhất cũng trong phạm vi của một tổ chức, cơ quan góp phần vào việc “Việt hóa” các ứng dụng cho máy tính. ở cấp độ các cơ quan nhà nước, một bộ tiếng Việt duy nhất được thống nhất sử dụng, đó là bộ TCVN3 hay còn gọi là ABC. Mặc dù vẫn còn nhiều khiếm khuyết nhưng trên thực tế, bộ tiếng Việt 8 bit này đã được chấp nhận lưu hành rộng rãi tại Hà Nội các tỉnh phía Bắc sau một số năm áp dụng. Việc xử lý các văn bản sử dụng bảng ABC vẫn có ý nghĩa quan trọng trong thời điểm hiện tại. *Giói thiệu bài toán cụ thể của đề tài Chuyên đề thực tập này có nội dung như sau: “Xây dựng chương trình thống tự đơn tự đôi trong file văn bản tiếng Việt ABC”. Đề tài gồm hai phần: Phần thứ nhất thống tất cả các tự đơn của file văn bản Phần thứ hai liệt số lần xuất hiện của một tự đơn sau một tự đơn khác là bao nhiêu lần trong toàn bộ file văn bản (ví dụ ta có tự đôi “ca”, vậy tự “a” sẽ đứng sau tự “c” là bao nhiêu lần trong văn bản), sau đó tính tần suất xuất hiện tự đôi. II. Cơ sở lý thuyết của đề tài thực tập Trình bầy tổng quan các nghiên cứu trong lý thuyết 1) File văn bản Để giải bài toán đặt ra, trước hết ta phải xác định kiểu file đầu vào cho chương trình. Trong Turbo Pascal, file văn bản được hiểu theo nghĩa chuẩn, các dữ liệu được lưu trữ dưới dạng các ký tự trong bảng ASCII. Các ký tự được liên kết thành từng dòng, dấu hết dòng được ghi nhận bởi cặp ký tự điều khiển có 13 (ký tự trở về đầu dòng - CR) tự 10 (ký tự xuống dòng - Lf). Không có quy định về chiều dài dòng cho file văn bản. Turbo Pascal dùng tên chuẩn Text để đặt cho file văn bản. Vì thế lời khai báo biến file văn bản sẽ là: Var f: text; File văn bản chỉ có thể truy cập tuần tự chứ không thể truy cập trực tiếp như file định kiểu. cũng không thể vừa đọc vừa ghi trên file văn bản như file định kiểu. Tuy nhiên vì file văn bản không phụ thuộc vào định nghĩa kiểu thành phần nên nó là công cụ giao tiếp chung giữa các chương trình. Bất cứ chương trình nào cũng có thể đọc dữ liệu từ file văn bản kết xuất dữ liệu dưới dạng văn bản. Việc soạn thảo file văn bản có thể dùng bất cứ một hệ soạn thảo nào (là những chương trình tiện ích vốn rất phong phú hiện nay). Chẳng hạn, có thể dùng ngay hệ soạn thảo của chính Turbo Pascal để xây dựng hiệu chỉnh file văn bản. Các bước thao tác trên file văn bản tuân theo quy trình như sau: đầu tiên cần đăng ký biến file văn bản (f) với tên file trên đĩa (name) bằng thủ tục Assign (f, name). Sau đó mở file bằng thủ tục Reset (f) nếu nó đã có để chuẩn bị đọc, hoặc mở bằng thủ tục Rewrite (f) nếu muốn tạo mới để chuẩn bị ghi. Sau Reset chỉ có thể đọc sau Rewrite chỉ có thể ghi. Mỗi lần đọc ghi xong con trỏ lại định vị đến vị trí kế tiếp. Việc đọc dữ liệu từ file văn bản tương tự như đọc từ bàn phím, cũng dùng các thủ tục Read (f, var1, var2, ), Readln nếu muốn đọc từng dòng. Các biến ký tự được đọc theo từng đơn vị ký tự, các biến xâu ký tự được đọc đúng độ dài của nó hoặc cho đến khi gặp dấu xuống dòng. Việc ghi ra file văn bản cũng tương tự như ghi ra màn hình (cũng dùng các thủ tục write writeln). Sau khi thao tác xong cần đóng file nhờ thủ tục Close (f) để đảm bảo an toàn dữ liệu. Ngoài ra còn có thủ tục Append (f) để mở một văn bản có sẵn để ghi kế tiếp, hàm Eof (f) để kiểm tra đã định vị đến cuối file chưa 2) Kiểu con trỏ Trong Pascal, kiểu con trỏ là một kiểu dữ liệu đặc biệt, dùng để biểu diễn những giá trị địa chỉ. Như thế kiểu con trỏ là những biến dùng để lưu những giá trị địa chỉ của bộ nhớ. Nhờ các biến con trỏ, ta có thể thao tác trên các giá trị địa chỉ cũng như truy cập dữ liệu ở các vùng nhớ một cách linh hoạt. Ngoài ra, biến con trỏ còn là công cụ để xin cấp phát trên vùng Heap (cấp phát động) xây dựng kiểu dữ liệu động, cho phép chương trình có thể khai thác tối đa hiệu quả bộ nhớ. Có hai kiểu con trỏ là con trỏ định kiểu con trỏ không định kiểu. Với bài toán đã cho, con trỏ định kiểu được sử dụng. Con trỏ định kiểu cần xác định kiểu dữ kiệu nó trỏ đến. Turbo Pascal dùng ký hiệu ^ trước tên kiểu dữ liệu để khai báo con trỏ định kiểu: Type PtrType = ^DataType; trong đó: PtrType là tên kiểu con trỏ DataType là tên kiểu dữ liệu xác định kiểu dữ liệu được trỏ. Vì kiểu con trỏ chỉ lưu địa chỉ nên nó có thể khai báo trước kiểu dữ liệu được trỏ. Chẳng hạn, có quyền khai báo: PtrType = ^ DataType; DataType = record end; Hai biến con trỏ có thể gán giá trị cho nhau trong các trường hợp tương thích. Khi đó chúng cùng trỏ tới một địa chỉ. tuy nhiên, hai con trỏ định kiểu trỏ tới các kiểu dữ liệu khác nhau là không tương thích. Để truy cập dữ liệu con trỏ p đang trỏ, Turbo Pascal dùng ký hiệu p^. Ký hiệu này đóng vai trò như một biến, có nội dung là nội dung vùng dữ liệu p đang trỏ. Dùng p^ có thể thay cho các mảng Mem các biến tuyệt đối trong việc truy cập bộ nhớ. Khi p là con trỏ định kiểu. Khi đó p^ là biến định kiểu có địa chỉ đựợc p lưu giữ. Kiểu của p^ được xác định là kiểu con trỏ p trỏ tới. Mọi thao tác trên biến dịnh kiểu thông thường đều được áp dụng cho p^. Tuy nhiên, p^ là một biến định kiểu đặc biệt, nó có thể thay đổi địa chỉ trong quá trình hoạt động bằng cách gán địa chỉ tương ứng cho p, vì thế p^ có thể truy cập vào bất cứ vùng nhớ nào theo kiểu dữ liệu của nó. Có thể xem p^ như một biến tuyệt đối có khả năng thay đổi địa chỉ nhờ phép gán. 3) Cấp phát động Việc dùng p^ bằng cách gán cho p một giá trị địa chỉ không phải là việc cung cấp một biến p^ mới, vì thế phải hết sức thận trọng khi truy cập p^. Muốn p^ thực sự được cấp phát như một biến, phải dùng kỹ thuật cấp phát động cho p. Cấp phát động được thực hiện bằng câu lệnh trong thân chương trình (chứ không phải bằng khai báo) được thu hồi nếu cần (cũng bằng câu lệnh trong chương trình). Vùng cấp phát động bao giờ cũng là vùng nhớ tự do (Heap). Địa chỉ vùng cấp phát động được quản lý bởi các biến con trỏ. Việc cấp phát động cho phép người lập trình sử dụng bộ nhớ linh hoạt tiết kiệm đặc biệt, nhờ cấp phát động, người ta có thể xây dựng được những kiểu dữ liệu động, cho phép khai thác tối đa bộ nhớ. Cấp phát động là một ứng dụng quan trọng của con trỏ. Việc dùng con trỏ thường được gắn liền với cấp phát động. Nhứng biến được xin trong vùng Heap nhờ cấp phát động, được gọi là những biến động (dynamic variable) để phân biệt với những biến thông thường được xin từ khai báo. Pascal tổ chức hai cách cấp phát động: Một, dành cho các con trỏ định kiểu hai, dành cho con trỏ bất kỳ (không quan tâm đến kiểu). ở đây chúng ta chỉ quan tâm đến cấp phát cho con trỏ định kiểu - được gọi là cấp phát định kiểu. Giả sử p là một con trỏ định kiểu. thủ tục New (p) sẽ cấp một vùng nhớ trên Heap cho con trỏ p với kích thước bằng kích thước của kiểu dữ liệu gán địa chỉ cua vùng này cho p. Khi đó biến động định kiểu p^ sẽ truy cập vùng được cấp phát chừng nào p còn giữ địa chỉ vùng này. Mọi thao tác trên biến thông thường đều được áp dụng cho p^. Vùng nhớ đã cấp phát cho con trỏ p bằng thủ tục New(p) sẽ được thu hồi nhờ thủ tục Dispose (p). Vùng nhớ đã cấp phát sẽ được hệ thống bảo vệ cho đến khi được thu hồi. 4) Danh sách liên kết Một trong những ứng dụng quan trọng nhất của cấp phát động là tạo ra những cấu trúc dữ liệu động, cho phép khai thác linh hoạt tối đa bộ nhớ. Các cài đặt dùng cấu trúc dữ liệu động không bị hạn chế (về lôgic) bởi kích thước của dữ liệu, và đặc biệt thuận lợi khi phải dùng thường xuyên các thao tác chèn hoặc xóa. Danh sách liên kết là một dãy các phần tử có cùng kiểu dữ liệu, trong đó cần chỉ rõ mối liên kết trước-sau của các phần tử trong danh sách. Một dạng cài đặt thường gặp của danh sách liên kết là dùng mảng, trong đó mối liên kết được ẩn dưới các giá trị kề nhau của chỉ số. Việc dùng mảng cho phép truy cập nhanh đến các phần tử của danh sách nhờ các giá trị chỉ số. Tuy nhiên các hạn chế của việc dùng mảng là:  Khai thác bộ nhớ không linh hoạt bộ nhớ do phải khai báo trước.  Không thể làm việc với những danh sách lớn hơn 64 Kb vì mảng cần được cấp một vùng nhớ liên tục.  Các thao tác chèn, xóa đòi hỏi phải dồn chỉ số cho các phần tử mảng. Việc cấp phát động cho các phần tử của danh sách cho phép khai thác bộ nhớ tốt hơn. Một mặt, nó không phụ thuộc vào kích thước danh sách vì không phải khai báo trước. Mặt khác, do các phần tử của danh sách được cấp phát riêng rẽ nên danh sách không bị hạn chế bởi giới hạn 64 Kb. Ngoài ra, các thao tác chèn, xóa đòi hỏi không phải dồn phần tử. Để xây dựng danh sách liên kết bằng cấp phát dộng mỗi phần tử của nó (mà ta sẽ gọi là nút - node) cần phải xác định hai thành phần: Một là nội dung dữ liệu nút lưu trữ, hai là địa chỉ của nút kế tiếp. Ta dùng kiểu bản ghi để định nghĩa một nút như vậy: Type DataType = {kiểu dữ liệu} PtrType = ^Node; Node = record Data: DataType; {lưu trữ dữ liệu} Next: PtrType; {trỏ đến nút kế tiếp} End; Khai báo trên định nghĩa kiểu PtrType trỏ tới Node, trong đó Node là kiểu bản ghi mô tả một nút gồm hai trường. Trường Data dùng để lưu với giả thiết tên kiểu là DataType (là một kiểu dữ liệu nào đấy đã được định nghĩa, có thể gồm nhiều thành phần) còn trường Next thuộc kiểu PtrType, dùng để lưu địa chỉ của nút kế tiếp. Trong những khai báo như ở trên thì PtrType cần được định nghĩa trước Node. Để quản lý danh sách, cần có một biến toàn thể thuộc kiểu PtrType lưu địa chỉ của nút đầu tiên trong danh sách. Ta sẽ đặt tên cho biến này là First: Var First: PtrType; Từ giá trị của First ta có thể truy cập đến nút đầu tiên, sau đó từ trường Next của nút này, ta có thể truy cập tới nút thứ hai, Để báo hết danh sách, trường Next của nút cuối cần trỏ vào Nil. Bằng cách như vậy, ta có thể truy cập được toàn bộ các nút của danh sách. - Để khởi tạo danh sách rỗng (chưa có nút nào), ta gán Nil cho con trỏ First: First:=Nil; - Duyệt danh sách: Để lần lượt đi qua các nút của danh sách, cần phải khởi động một con trỏ CurrPtr trỏ đến nút đầu tiên, rồi đi tiếp qua danh sách theo các trường liên kết xử lý dữ liệu trong mỗi nút. - Xây dựng danh sách: Đây là công việc sẽ gặp trong bài toán của đề tài. Trong bài toán thường xảy ra tình huống chèn một nút mới vào cuối danh sách. Công việc này đòi hỏi phải tổ chức thêm con trỏ Last luôn trỏ tới cuối danh sách nhằm không phải tìm kiếm lại. Như thế sau mỗi lần nối, phải cập nhập lại giá trị cho con trỏ này. Ngoài ra việc nối vào một danh sách rỗng phải được xử lý riêng vì khi đó không có nút đi trước. First := Nil; While not Stop do Begin New (TempPtr); TempPtr^.Data:= Item; If First = Nil then First:= TempPtr; else Last^.Next:=Tempptr; Last:=Tempptr; Last^.Next:=Nil; End; - Tìm kiếm một nút trong danh sách: Giả sử cần tìm một nút trong danh sách có nội dung dữ liệu là Item (có kiểu DataType). Việc tìm kiếm được tiến hành tuần tự theo chiều duyệt danh sách bắt đầu từ First nhờ con trỏ CurrPtr. Mỗi khi đi đến một nút, vùng dữ liệu của Currptr lại được so sánh với Item. Nếu tìm thấy, con trỏ Currptr sẽ xác định nút cần tìm, trái lại con trỏ Currptr sẽ có giá trị Nil. III.Xây dựng phương án giải quyết bài toán [...].. .Chương trình để giải quyết bài toán sẽ thực hiện 2 công việc chính, thống tự đơn (liệt các tựtrong văn bản, số lần xuất hiện của mỗi tự) và thống số lần xuất hiện của tự đơn sau một tự đơn khác trong tự đôi (xét xem tự này đứng sau tự kia bao nhiêu lần trong toàn bộ văn bản) 1) Mô tả phương án giải quyết bài toán Để làm được các việc đó, chương trình cần... liên quan đến việc thống tự đôi Vì vậy ta cần có một danh sách chứa tự đơn của văn bản vẫn giữ nguyên trật tự như trong văn bản, tự nào đứng trước trong văn bản thì vẫn đứng trước trong danh sách Sau khi có được một danh sách chứa các tự đôi của văn bản được xếp đúng trật tự, ta chuyển sang bước 2 - Bước 2: Lập danh sách thống tự từ đơn đưa kết quả ra file văn bản Từ danh sách... toán: thống tự đơn trong văn bản Để thống tự đơn rồi đưa kết quả ra một file văn bản, trước hết cần phải lập một danh sách thống tự đơn hoàn chỉnh với phần nội dung gồm hai trường: Trường 1: Term: char - chứa tự Trường 2: lanxh: integer; chứa số lần xuất hiện của tự đó Tiến hành duyệt từng nút của danh sách thu được từ bước 1 để lấy ra lần lượt từng tự đơn của file văn bản. .. bộ tự đơn của văn bản Mỗi nút của danh sách chứa một tự đơn: Đầu tiên tiến hành đọc file văn bản đầu vào theo từng ký tự, dùng thủ tục Read(f, ch); nhận các ký tự chuẩn (các ký tự tạo thành từ) Sau mỗi lần có được một tự thì tiến hành tạo nút mới có phần nội dung chứa tự đó tiến hành chèn nút này vào cuối danh sách Như vậy sau bước này ta có một danh sách liên kết chứa các tự đơn. .. văn bản Các tự này sẽ qua một thủ tục để kiểm tra đã có trong danh sách thống hay chưa, nếu chưa có thì thêm một nút có nội dung term là tự đó đưa vào cuối danh sách, số lần xuất hiện của tự lúc này được đưa vào là 1 Nếu tự đã có trong danh sách thì tìm đến vị trí nút chứa tự đó, tăng trường số lần xuất hiện của tự lên 1 Sau khi đã có một danh sách thống tự đơn hoàn chỉnh,... đơn của file văn bản nguồn Đây chỉ là danh sách trung chuyển để tiện cho việc xử lý dữ liệu sau này chưa phải là danh sách thống tự chuẩn Thực ra ngay từ khi đọc file văn bản nguồn như ở bước này ta đã có thể tạo ra danh sách thống tự đơn hoàn chỉnh Danh sách này sẽ có phần nội dung gồm 2 trường: Trường 1: Chứa nội dung tự Trường 2: Chứa số lần xuất hiện tự trong file văn bản Tuy... thông tin về nội dung số lần xuất hiện của tự , ta sẽ tiến hành duyệt danh sách này để đưa ra file kết quả File kết quả cũng là file văn bản, có tên do người dùng tự đặt, tên file được nhập từ bàn phím - Bước 3: Thống số lần xuất hiện của một tự liền sau một tự (thống từ đôi) Với danh sách thu được từ bước 1, tổ chức 2 con trỏ currptr back Ban đầu currptr chỉ vào nút đầu tiên của... '); readln; END V Kết quả thử nghiệm Chương trình được chạy thử cho file văn bản có tên là A.TXT kết quả được ghi trên 2 file: KETQUA1.TXT: chứa kết quả thống tự đơn KETQUA2.TXT: chứa kết quả thống tự đôi Nội dung file A.TXT được thử: cộng hòa xã hội chủ nghĩa việt nam độc lập tự do hạnh phúc Kết quả trên file KETQUA1.TXT: c xuat hien: 4 lan ộ xuat hien: 3 lan n xuat hien: 4 lan g xuat... currptr:=currptr^.nextrec; end; close(f); end; - Phần thân chương trình của thủ tục procedure thongkekytudon (name: string);là begin firstrec: =nil; lastrec: =firstrec; taodanhsachkytudon; ghirafile; end; +) Thủ tục procedure thongkekytudoi(name: string); thống số lần lặp lại của một ký tự đơn sau một ký tự đơn khác trongtự đôi ghi kết quả ra file văn bản Thủ tục này có nội dung như sau: var currptr,... string; {các tên file văn bản} Chương trình gồm 3 thủ tục chính: procedure Creatlist (name: string); procedure Thongkekytudon (name: string); procedure Thongkekytudoi (name: string); +) Thủ tục procedure Creatlist (name: string); thực hiện bước 1: tạo danh sách chứa toàn bộ ký tự đơn của file văn bản có tên name, vẫn giữ nguyên trật tự như trong file văn bản Thủ tục này gồm một số hàm thủ tục sau: . sau: Xây dựng chương trình thống kê kí tự đơn và kí tự đôi trong file văn bản tiếng Việt mã ABC . Đề tài gồm hai phần: Phần thứ nhất thống kê tất. Luận văn Xây dựng chương trình thống kê kí tự đơn và kí tự đôi trong file văn bản tiếng Việt mã ABC I. Đặt vấn đề *Mục

Ngày đăng: 16/02/2014, 03:05

TỪ KHÓA LIÊN QUAN

TRÍCH ĐOẠN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w