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

cài đặt thuật toán nén và giải nén dữ liệu RLE (run length code)

27 75 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 27
Dung lượng 489,95 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

LỜI MỞ ĐẦULời đầu tiên, em xin được gửi lời cảm ơn chân thành tới các Thầy, các Cô trongtrường Đại học Vinh, đặc biệt là các Thầy Cô trong khoa Công nghệ thông tin – nhữngngười đã trực t

Trang 1

LỜI MỞ ĐẦU

Lời đầu tiên, em xin được gửi lời cảm ơn chân thành tới các Thầy, các Cô trongtrường Đại học Vinh, đặc biệt là các Thầy Cô trong khoa Công nghệ thông tin – nhữngngười đã trực tiếp giảng dạy, giúp đỡ em trong suốt những năm tháng học tập ởtrường, cảm ơn nhà trường và khoa CNTT đã tạo điều kiện cho em thực tập cơ sở đểchuẩn bị tốt cho công việc học tập và rèn luyện các kỹ năng cần thiết khi trở thànhngười kỹ sư CNTT thực sự

Sinh viên CNTT ngày nay phải không ngừng học hỏi, cập nhật những cái mới

và biết ứng dụng những kiến thức đã được học vào thực tiễn của cuộc sống Đợt thựctập cơ sở này chính là những bước đầu tiên để em đi sâu vào tìm hiểu trong lĩnh vựccông nghệ thông tin, trên cơ sở những kiến thức đã được học trong những năm họcvừa qua

Để hoàn thành đợt thực tập chuyên ngành này, ngoài sự cố gắng nỗ lực của bảnthân còn có sự tận tình giúp đỡ và giảng dạy của các thầy, cô giáo trong khoa CNTTTrường Đại học Vinh Em xin được gửi lời cảm ơn chân thành đến các thầy cô trongkhoa Công nghệ thông tin, đặc biệt là cô Trần Thị Kim Oanh đã nhiệt tình hướng dẫn

em trong quá trình thực hiện đề tài này

Vì thời gian và trình độ còn hạn chế nên chắc chắn em không tránh khỏi nhữngthiếu sót Em rất mong nhận được những góp ý của các thầy cô và các bạn để để tàinày được hoàn thiện hơn

Sinh viên thực hiện

Page 1LỚP 53K2 – KỸ SƯ CÔNG NGHỆ THÔNG TIN

Trang 2

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ôngtin 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 toán này đòi hỏi phải có nhữngthuật toá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 ưunhấ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ậptrì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ăngtố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 trongKhoa Công Nghệ Thông Tin – Trường Đại học Vinh Chúng em đặc biệt bày tỏ lòngbiết ơn chân thành tới thầy giáo Lê Văn Thành, thầy đã 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 hoà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

Trang 3

MỤC LỤC

LỜI MỞ ĐẦU 1

LỜI CẢM ƠN 2

Bài 1: 4

Tìm hiểu và cài đặt thuật toán nén và giải nén dữ liệu RLE (Run Length Code) cho một tệp dữ liệu 4

1.2.1 Ý tường thuật toán: 4

1.2.2 Đánh giá 4

1.2.3 Thuật toán nén dữ liệu 4

1.2.5 Thuật toán kiểm tra dữ liệu 6

1.2.6 Thuật toán giải nén dữ liệu 6

1.2.2 Sơ đồ khối mô tả thuật toán 7

1.3 Chương trình 8

1.4 Dữ liệu test và kết quả tương ứng 11

1.4.1 Kết luận 11

1.4.2 Thông tin sả phẩm 11

1.4.3 Bộ Test 11

Bài 2 : 14

2.1 Xác định bài toán 14

2.2 Phân tích bài toán 14

2.2.1 Thông tin ngôn ngữ lập trình 14

2.2.2 Xác định đầu vào, đầu ra của bài toán 14

2.3.1 Thuật Toán Kiểm Tra Dữ Liệu 14

2.3.2 Xây dựng kiểu cấu trúc số phức,tạo danh sách các LIFO gồm các số thực 16 2.3.3 Thuật Toán Đọc Từ Tệp Vào Danh Sách LIFO : 17

2.3.4 Thuật toán tìm vị trí 19

2.3.5 Chương trình chính 20

2.5 Dữ liệu test và kết quả tương ứng 25

2.5.1 Bộ Test 25

KẾT LUẬN: 27

NGUY N TI N DŨNGỄN TIẾN DŨNG ẾN DŨNG Page 3 LỚP 53K2 – KỸ SƯ CÔNG NGHỆ THÔNG TIN

Trang 4

NỘI DUNG Bài 1:

1.1 Xác định bài toán

Tìm hiểu và cài đặt thuật toán nén và giải nén dữ liệu RLE (Run Length Code) cho một tệp dữ liệu.

1.2 Thuật Toán

1.2.1 Ý tường thuật toán:

Trong quá trình thao tác với dữ liệu, chúng ta thường thấy sự lặp đi lặp lại các

dữ liệu có sự tương đồng hay trùng lặp nhau, liên tiếp hay không liên tiếp Dễ thấynhất là tập tin văn bản, hay trong các tập tin đồ họa dạng bitmap

Xét dữ liệu là đoạn văn bản sau:

abcdef

Thuật toán RLE để nén đoạn văn bản trên bằng việc thay thế chuỗi kí tự đượclặp lại nhiều lần bằng một kí tự duy nhất và kèm theo sau là một số chỉ số lần kí tự đóđược lặp lại liên tục Nói cách khác, với chuỗi trên xuất hiện 1 kí tự ‘a’, 1 kí tự ‘b’, 1

Ví dụ:

Cho đoạn văn bản: abcd

Sau khi nén bằng RLE sẽ là: 1a1b1c1d1

Trang 5

1.2.3 Thuật toán nén dữ liệu

1.2.2.1 Mô tả thuật toán

Bước 1 : Khai báo xâu kết quả : String dest = null;

Bước 2: Đọc từng ký tự trong xâu

Trong khi chưa kết thúc xâu:

- Kiểm tra ký tự tiếp theo có trùng với ký tự trước

- Nếu trùng : tăng bộ đếm lên 1 đơn vị, tăng vị trí đọc ký tự lên 1 đơn vị

- Ngược lại : Ghép bộ đếm và ký tự đếm vào xâu “dest” dưới dạng ký tựKhi kết thúc xâu : Chuyển sang bước 3

Bước 3: Trả về kết quả xâu “dest”, kết thúc

int count = 0, tick = i;

while (original[i] == original[tick]){

Trang 6

1.2.5 Thuật toán kiểm tra dữ liệu

1.2.5.1 Mô tả thuật toán

- Kiểm tra ký tự bắt đầu là chữ cái là không hợp lệ

- Kiểm tra ký tự kết thúc là số là không hợp lệ

- Kiểm tra 2 ký tự là chữ cái liên tục là không hợp lệ

1.2.6 Thuật toán giải nén dữ liệu

1.2.6.1 Mô tả thuật toán

- Sử dụng vòng for duyệt từng ký tự của chuỗi source

- Nếu kí tự duyệt là số thì tiếp tục duyệt đến khi gặp ký tự là chữ cái

- Sau đó lấy ra được phần số và phần ký tự

if( n%2==1) return result = "E";

int num = 0,tick =0;

Trang 7

result[tick+num] = 0;

return result;

}

1.2.2 Sơ đồ khối mô tả thuật toán

NGUY N TI N DŨNGỄN TIẾN DŨNG ẾN DŨNG Page 7LỚP 53K2 – KỸ SƯ CÔNG NGHỆ THÔNG TIN

START

Result[t+1]=result t

J=k+t I=tick

T=k Count!=0

K=j

i=0j=0

truefalse

Trang 8

int count = 0, tick = i;

while (original[i] == original[tick]){

Trang 9

if( n%2==1) return result = "E";

int num = 0,tick =0;

Trang 10

printf(" Moi chon chuc nang : \n");

printf(" 1 Nen du lieu \n");

printf(" 2 Giai nen du lieu \n");

nhap2: scanf("%d",&act);

fflush(stdin);

if(act == 1 ){

printf("\n\n Moi nhap xau can nen : ");

gets(original);

result = RLE(original);

printf(" Xau sau khi duoc nen la %s",result);

}elseif(act == 2){

printf(" Moi nhap xau can giai nen : ");

gets(original);

result = EncoderRLE(original);

if(result[0] == 'E') printf(" Xau nhap vao khong the giai nen ");

nen la %s",result);

}else {

printf("\n\n Nhap vao khong dung Vui long nhap lai \n\n");

goto nhap2;

}

printf("\n\n Ban muon thu lai khong (1.Co - 2.Khong) : \n");

scanf("%d",&act);

Trang 11

-Dữ liệu nén và kết quả sau khi thực hiện thuật toán nén:

NGUY N TI N DŨNGỄN TIẾN DŨNG ẾN DŨNG Page 11LỚP 53K2 – KỸ SƯ CÔNG NGHỆ THÔNG TIN

Trang 12

-Dữ liệu và kết quả sau khi thực hiện thuật toán giải nén:

Trang 13

NGUY N TI N DŨNGỄN TIẾN DŨNG ẾN DŨNG Page 13LỚP 53K2 – KỸ SƯ CÔNG NGHỆ THÔNG TIN

Trang 14

Bài 2 :

2.1 Xác định bài toán

Tạo một tệp văn bản mỗi dòng chứa 2 số thực Xây dựng kiểu cấu trúc số phứcgồm 2 thành phần là phần thực và phần ảo Viết chương trình tạo danh sách LIFO gồmcác số phức có phần thực và phần ảo đọc ra từ tệp trên Nhập vào một số phức x Chobiết vị trí đầu tiên số phức x có mặt trong danh sách LIFO, nếu không có số phức xtrong danh sách thì thông báo không tồn tại

2.2 Phân tích bài toán

2.2.1 Thông tin ngôn ngữ lập trình

Chương trình được lập trình bằng ngôn ngữ C, với phần mềm DevC++

2.2.2 Xác định đầu vào, đầu ra của bài toán

INPUT : Cho tệp văn bản mỗi dòng chứa 2 số thực theo thứ tự là phần thực vàphần ảo của số phức

OUTPUT: Xây dựng kiểu cấu trúc số phức Tạo danh sách LIFO gồm các sốphức đọc từ tệp Cho biết vị trí đầu tiên số phức x có mặt trong danh sách LIFO, nếukhông có số phức x trong danh sách thì thông báo không tồn tại

2.3.1 Thuật Toán Kiểm Tra Dữ Liệu

2.3.1.1 Mô tả thuật toán:

Bước 1: Đọc dữ liệu từ tệp input.txt để kiểm tra

Trong khi chưa kết thúc tệp: đưa dữ liệu vào biến, chuyển sang bước 2.Ngược lại, chuyển sang bước 3

Bước 2: Kiểm tra dữ liệu:

Nếu dữ liệu dữ liệu đọc vào đúng là số thực Quay lại bước 1

Nếu sai Chuyển sang bươc 4

Bước 3: Kiểm tra số lượng các số thực đọc vào Nếu lẽ : Chuyển sang bước 4

Nếu chẵn : Trả về True, chuyển sang bước 5

Bước 4: Trả về false, chuyển sang bước 5Bước 5: Kết thúc

Trang 15

2.3.1.2 Sơ đồ khối mô tả thuật toán

NGUY N TI N DŨNGỄN TIẾN DŨNG ẾN DŨNG Page 15LỚP 53K2 – KỸ SƯ CÔNG NGHỆ THÔNG TIN

Trang 16

int isNumber = fscanf(fl, "%f", &x);

if (isNumber == 0) return false;

- img là dùng để chưa phần ảo

- *link dùng để liên kết tới Complex khác

Bắt đầu đầu int đầu n = 0; 0;

d Đọc dữ liệu ữ liệu liệu d Đọc dữ liệu ữ liệu liệu

r Ret đầuu nFalse

r Ret đầuu nr

T ue

r Ret đầuu nr

T ue

Trang 17

2.3.3 Thuật Toán Đọc Từ Tệp Vào Danh Sách LIFO :

2.3.3.1 Tìm hiểu về cơ chế LIFO

LIFO (Last In First Out) nghĩa là vào sau ra trước Có thể hình dung ngăn xếpnhư một chương trình Pascal mà chương trình A gọi chương trình B, chương trình Bgọi chương trình C Khi chương trình C được thực hiện xong thì sự điều khiển chươngtrình sẽ trở về thực hiện chương trình B, rồi khi chương trình B được thực hiện xongthì sự điều khiển chương trình sẽ trở về thực hiện chương trình A Như vậy chươngtrình B được gọi sau sẽ được trở về thực hiện trước chương trình A Đó là nhờ điểmnhập (entry point) trở về của các chương trình được chứa trong Stack

Ta có thể hình dung danh sách LIFO gồm các số thực qua sơ đồ trên

2.3.3.2 Mô tả thuật toán:

Bước 1: Kiểm tra File đọc vào có hợp lệ không

- Nếu hợp lệ : chuyển sang bước 2

- Ngược lại chuyển sang bước 3

Bước 2: Đọc các dữ liệu từ tệp input.txt

- Trong khi chưa kết thúc tệp:

- Đọc dữ liệu vào biến, ghi vào danh sách LIFO, Quay lại bước 2

- Ngược lại, chuyển sang bước 3Bước 3: Kết thúc

2.3.3.3 Sơ đồ khối mô tả thuật toán:

NGUY N TI N DŨNGỄN TIẾN DŨNG ẾN DŨNG Page 17LỚP 53K2 – KỸ SƯ CÔNG NGHỆ THÔNG TIN

Đúng

Bắt đầu đầuBắt đầu đầu

Sai

Tệp != 0; eof Tệp != 0; eofSai

c dữ liệuhec dữ liệukFile()

Trang 18

BÁO CÁO ĐỀ TÀI THỰC TẬP CƠ SỞ - MÃ ĐỀ 051

fscanf_s(fl, "%f %f", &x, &y);

Trang 19

f = p;

}}

return f;

}

2.3.4 Thuật toán tìm vị trí

2.3.4.1 Mô tả thuật toán:

Bước 1: Khai báo 1 số thực x (Complex x) và mảng số thực f, một biếnchạy n để duyệt các phần tử trong mảng

Bước 2:

- Trong khi chưa hết danh sách :

Nếu phần thực của phần tử p bằng phần thực củaphần tử x, và phần ảo của phần ảo của p bằng phần ảo của x thì return vị trí n

-Ngược lại:

Chuyển đến số thực tiếp theo trong danh sách LIFO và tăng biến đếm n lên mộtđơn vị

- Quay lại bước 2

- Ngược lại: Chuyển sang bước 3Bước 3: Trả về giá trị -1 và kết thúc chương trìnhBước 4: Kết thúc

if ((p->img == x.img) && (p->real == x.real)) return n;

else{

NGUY N TI N DŨNGỄN TIẾN DŨNG ẾN DŨNG Page 19LỚP 53K2 – KỸ SƯ CÔNG NGHỆ THÔNG TIN

Trang 20

p = p->link;

n++;

}}

Nếu tệp tồn tại : Chuyển sang bước 2

Nếu tệp không tồn tại : Thông báo lỗi, chuyển sang bước 5

Bước 2: Đọc tệp vào danh sách LIFO

Nếu tệp có dữ liệu : Chuyển sang bước 3

Nếu tệp không có dữ liệu : Thông báo lỗi, chuyển sang bước 4.Bước 3: Tìm kiếm số phức, thông báo kết quả

Trang 21

printf("Nhap phan thuc va phan ao : ");

scanf("%f%f", &x.real, &x.img);

printf("VI tri xuat hien : %d", Find_Complex(f, x));

Trang 23

p = p->link;

n++;

}}

int isNumber = fscanf(fl, "%f", &x);

if (isNumber == 0) return false;

Trang 24

system("Title Tong cac so phuc");

printf("Nhap phan thuc va phan ao : ");

scanf("%f%f", &x.real, &x.img);

printf("VI tri xuat hien : %d", Find_Complex(f, x));

Trang 25

2.5 Dữ liệu test và kết quả tương ứng

2.5.1 Bộ Test

NGUY N TI N DŨNGỄN TIẾN DŨNG ẾN DŨNG Page 25LỚP 53K2 – KỸ SƯ CÔNG NGHỆ THÔNG TIN

Trang 26

KẾT LUẬN

Trang 27

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ụ choviệ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ôngdụ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ônngữ 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ủamộ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ếncủ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 Lê Văn Thành đã giúp đỡnhiệt tình cho em hoàn thiện đề tài này

NGUY N TI N DŨNGỄN TIẾN DŨNG ẾN DŨNG Page 27LỚP 53K2 – KỸ SƯ CÔNG NGHỆ THÔNG TIN

Ngày đăng: 29/08/2021, 19:57

TỪ KHÓA LIÊN QUAN

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

TÀI LIỆU LIÊN QUAN

w