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

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

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 (515.64 KB, 27 trang )

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

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ô trong
trường Đại học Vinh, đặc biệt là các Thầy Cô trong khoa Công nghệ thông tin – những
ngườ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ành
ngườ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ực
tậ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ực
cơng nghệ thơng tin, trên cơ sở những kiến thức đã được học trong những năm học
vừa qua.
Để hoàn thành đợt thực tập chuyên ngành này, ngồi sự cố gắng nỗ lực của bản
thâ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 CNTT
Trườ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ô trong
khoa 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ững
thiế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ài
này được hoàn thiện hơn.
Sinh viên thực hiện

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


BÁO CÁO ĐỀ TÀI THỰC TẬP CƠ SỞ - MÃ ĐỀ 051
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 tố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 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.

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

Page 2


BÁO CÁO ĐỀ TÀI THỰC TẬP CƠ SỞ - MÃ ĐỀ 051
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 tố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 tốn.............................................................................................14
2.2 Phân tích bài tố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 tố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
LỚP 53K2 – KỸ SƯ CÔNG NGHỆ THÔNG TIN

Page 3



BÁO CÁO ĐỀ TÀI THỰC TẬP CƠ SỞ - MÃ ĐỀ 051
NỘI DUNG
Bài 1:
1.1. Xác định bài tố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 tốn:
Trong q 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ấy
nhấ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ự được
lặ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
kí tự ‘c’ và 1 kí tự ‘e’ và 1 kí tự “f”.
Kết quả của thuật toán nén RLE đoạn văn bản trên là:
a1b1c1d1f1
1.2.2 Đánh giá
Ưu điểm :
Đối với các dữ liệu có sự lặp đi lặp lại nhiều lần của một kí tự thì thuật tốn này
cực kì phù hợp. Nó giảm được đáng kể dung lượng của dữ liệu.
Nhược điểm:
vậy thuật toán này chỉ dùng được cho các loại dữ liệu như tập tin văn bản, hay
tập tin đồ họa bitmap… Còn những loại tập tin khác chẳng hạn như: tập tin chương
trình, tập tin cơ sở dữ liệu... nhiều lúc không làm giảm được dung lượng dữ liệu mà lại
làm cho dữ liệu tăng lên vì những tập tin này thường chỉ gồm những loạt chạy rất ngắn
của các kí tự.
Ví dụ:

Cho đoạn văn bản: abcd
Sau khi nén bằng RLE sẽ là: 1a1b1c1d1
1.2.3 Thuật tốn nén dữ liệu
1.2.2.1 Mơ tả thuật tốn
NGUYỄN TIẾN DŨNG
LỚP 53K2 – KỸ SƯ CƠNG NGHỆ THÔNG TIN

Page 4


BÁO CÁO ĐỀ TÀI THỰC TẬP CƠ SỞ - MÃ ĐỀ 051
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
1.2.4 Đoạn chương trình
char* RLE(char* original)
{
char* result = new char[100];
int i = 0, j = 0;
while (original[i] != 0)
{
result[j] = original[i];
int count = 0, tick = i;
while (original[i] == original[tick])
{

count ++;
tick ++;
}
int t = j;
while (count != 0)
{
result[t+1] = (count % 10) + 48;
count = count / 10;
t++;
}
j = t+1;
i = tick;
}
result[j] = 0;
return result;
}
1.2.5 Thuật toán kiểm tra dữ liệu
1.2.5.1 Mơ tả thuật tố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ệ
NGUYỄN TIẾN DŨNG
LỚP 53K2 – KỸ SƯ CÔNG NGHỆ THÔNG TIN

Page 5


BÁO CÁO ĐỀ TÀI THỰC TẬP CƠ SỞ - MÃ ĐỀ 051
- 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 tốn giải nén dữ liệu
1.2.6.1 Mơ tả thuật tố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ự
1.2.6.2 Đoạn chương trình
char *EncoderRLE(char* original)
{
char* result = new char[100];
int n = strlen(original);
if( n%2==1) return result = "E";
int num = 0,tick =0;
for(int x = 1; x{
tick += num;
num = original[x] - 48;
for(int i = 0; i{
result[tick + i] = original[x-1];
}
}
result[tick+num] = 0;
return result;
}
1.2.2. Sơ đồ khối mơ tả thuật tốn

START

i=0
j=0
false
Original[i]!=0


true
Result[j]= Original[i]
Count=0
Tick=i

NGUYỄN TIẾN DŨNG
Page 6
LỚP 53K2 – KỸ SƯ CÔNG NGHỆ THÔNG TIN
J=k+t
Result[t+1]=result

Result[j+1]=(count%10)+48

false
true
false

Count=count/10
Count++
K++
Tick++

Count!=0
t>j
Original[i]= Original[tick]
END
Result[j]=0
T=k


K=j
t-- I=tick


BÁO CÁO ĐỀ TÀI THỰC TẬP CƠ SỞ - MÃ ĐỀ 051
1.3. Chương trình
#include <conio.h>
#include <stdio.h>
#include <string.h>
#include <windows.h>
#include <stdlib.h>
char* RLE(char* original)
{
char* result = new char[100];
int i = 0, j = 0;
while (original[i] != 0)
{
result[j] = original[i];
int count = 0, tick = i;
while (original[i] == original[tick])
{
count ++;
tick ++;
}
int t = j;
while (count != 0)
{
result[t+1] = (count % 10) + 48;
count = count / 10;
t++;

}
j = t+1;
NGUYỄN TIẾN DŨNG
LỚP 53K2 – KỸ SƯ CÔNG NGHỆ THÔNG TIN

Page 7


BÁO CÁO ĐỀ TÀI THỰC TẬP CƠ SỞ - MÃ ĐỀ 051
i = tick;
}
result[j] = 0;
return result;
}
char *EncoderRLE(char* original)
{
char* result = new char[100];
int n = strlen(original);
if( n%2==1) return result = "E";
int num = 0,tick =0;
for(int x = 1; x{

tick += num;
num = original[x] - 48;
for(int i = 0; i{
result[tick + i] = original[x-1];
}


}
result[tick+num] = 0;
return result;
}
int main()
{
char* original = new char[100];
char *result;
int act;
nhap:
NGUYỄN TIẾN DŨNG
LỚP 53K2 – KỸ SƯ CÔNG NGHỆ THÔNG TIN

Page 8


BÁO CÁO ĐỀ TÀI THỰC TẬP CƠ SỞ - MÃ ĐỀ 051
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);
}
else

if(act == 2)
{
printf(" Moi nhap xau can giai nen : ");
gets(original);
result = EncoderRLE(original);
if(result[0] == 'E')
else

printf(" Xau nhap vao khong the giai nen ");
printf(" Xau sau khi duoc giai

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);
NGUYỄN TIẾN DŨNG
LỚP 53K2 – KỸ SƯ CÔNG NGHỆ THÔNG TIN

Page 9


BÁO CÁO ĐỀ TÀI THỰC TẬP CƠ SỞ - MÃ ĐỀ 051
if(act ==1 )
{


system("cls");
fflush(stdin);
goto nhap;

}
else exit(0);
getch();
return 0;
}
1.4. Dữ liệu test và kết quả tương ứng
1.4.1. Kết luận
Chương trình hoạt động nhanh và đúng yêu cầu
1.4.2. Thông tin sả phẩm
Sản phẩm được lập trình bằng ngơn ngữ lập trình trên phần mềm Dev c++
1.4.3. Bộ Test
-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
LỚP 53K2 – KỸ SƯ CÔNG NGHỆ THÔNG TIN

Page 10


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

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

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


Page 11


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

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

Page 12


BÁO CÁO ĐỀ TÀI THỰC TẬP CƠ SỞ - MÃ ĐỀ 051
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ức
gồ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ồm
cá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. Cho
biế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 x
trong danh sách thì thơng báo khơng tồn tại.
2.2 Phân tích bài tố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ếu
khơ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 Tốn Kiểm Tra Dữ Liệu
2.3.1.1 Mơ tả thuật tố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 5
Bước 5: Kết thúc.

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

Page 13


BÁO CÁO ĐỀ TÀI THỰC TẬP CƠ SỞ - MÃ ĐỀ 051
2.3.1.2 Sơ đồ khối mơ tả thuật tốn

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

Page 14


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

2.3.1.3 Đoạn chương trình

bool checkFile(FILE *fl)
Bắt đầu
{
int n = 0;
float x;
int n = 0;
while (!feof(fl))
Đọc dữ liệu
{
int isNumber = fscanf(fl, "%f", &x);
if (isNumber == 0) return false;
else n++;
}

Tệp=!feof

Sai

if (n % 2 == 1) return false;
Đúng
else return true;
}
thực

2.3.2
Xây dựng kiểu
trúc
phức,tạo danh sách các n%2=0
LIFO gồm các số
Đúng

Dữ cấu
số số
thực
liệu là
2.3.2.1 Khai báo

Sai3 thành phần:Sai
1 số phức (Complex) gồm
- real là dùng để chứa phần thực.
Return
- img là dùng để chưa
phần ảo
False
- *link dùng để liên kết tới Complex khác.

Đúng
Return
True

2.3.2.2 Đoạn chương trình
struct Complex
Kết thúc

{
float real, img;

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

Page 15



BÁO CÁO ĐỀ TÀI THỰC TẬP CƠ SỞ - MÃ ĐỀ 051
Complex *link;
};
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ếp như một chương trình Pascal
mà chương trình A gọi chương trình B, chương trình B
gọ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ương trì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 xong thì 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ương trình B được gọi sau sẽ được
trở về thực hiện trước chương trình A. Đó là nhờ điểm nhậ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 tố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 3
Bước 3: Kết thúc.

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


Page 16


BÁO CÁO ĐỀ TÀI THỰC TẬP CƠ SỞ - MÃ ĐỀ 051
2.3.3.3 Sơ đồ khối mơ tả thuật tốn:

Bắt đầu

Sai

checkFile()

Đúng
Sai
Sai

Tệp != eof

Đúng
Đưa dữ liệu vào danh sách

Kết thúc
2.3.3.4 Đoạn chương trình
Complex *ReadFromFile(Complex *f, FILE *fl)
{
fseek(fl, 0, SEEK_SET);
float x, y;
Complex *p;
if (checkFile(fl))

{
fseek(fl, 0, SEEK_SET);
printf("\n Danh sach so thuc doc tu tep la :\n\n");
while (!feof(fl))
{
NGUYỄN TIẾN DŨNG
LỚP 53K2 – KỸ SƯ CÔNG NGHỆ THÔNG TIN

Page 17


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

fscanf_s(fl, "%f %f", &x, &y);
printf("%9.2f %5.2f \n", x, y);
p = new(Complex);
p->real = x; p->img = y;
p->link = f;
f = p;
}
}
return f;
}
2.3.4. Thuật tố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ến
chạ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ủa

phầ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 3
Bước 3: Trả về giá trị -1 và kết thúc chương trình
Bước 4: Kết thúc
2.3.4.2 Đoạn chương trình:
int Find_Complex(Complex *f, Complex x)
{
Complex *p;
int n = 1;
NGUYỄN TIẾN DŨNG
LỚP 53K2 – KỸ SƯ CÔNG NGHỆ THÔNG TIN

Page 18


BÁO CÁO ĐỀ TÀI THỰC TẬP CƠ SỞ - MÃ ĐỀ 051
p = f;
while (p != NULL)
{
if ((p->img == x.img) && (p->real == x.real)) return n;
else
{
p = p->link;
n++;
}
}

return -1;
}
2.3.5 Chương trình chính.
2.3.5.1 Mơ tả thuật tốn:
Bước 1 : Mở tệp
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ả.
Bước 4 : Đóng tệp.
Bước 5: Kết thúc chương trình
2.3.5.2 Đoạn chương trình:
int main()
{
system("color 1f");
system("Title Tong cac so phuc");
FILE *fl;
fl = fopen("input.txt", "rt");
if (!fl)
NGUYỄN TIẾN DŨNG
LỚP 53K2 – KỸ SƯ CÔNG NGHỆ THÔNG TIN

Page 19


BÁO CÁO ĐỀ TÀI THỰC TẬP CƠ SỞ - MÃ ĐỀ 051
{
printf("\n\aFile not found !");

_getch();
exit(1);
}

if (checkFile(fl))
{
Complex *f = NULL;
printf("\n Danh sach so thuc doc tu tep la :\n\n");
f = ReadFromFile(f, fl);
printf("\n Danh sach so phuc doc tu tep la :\n\n");
Display(f);
Complex x;
printf("Nhap phan thuc va phan ao : ");
scanf("%f%f", &x.real, &x.img);
printf("VI tri xuat hien : %d", Find_Complex(f, x));
}
else
{
printf("Error reading from file");
}
fclose(fl);
_getch();
return 0;
}
2.4 Chương trình
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
NGUYỄN TIẾN DŨNG
LỚP 53K2 – KỸ SƯ CÔNG NGHỆ THÔNG TIN


Page 20


BÁO CÁO ĐỀ TÀI THỰC TẬP CƠ SỞ - MÃ ĐỀ 051
struct Complex
{
float real, img;
Complex *link;
};
void Display(Complex *f)
{
Complex *p;
p = f;
while (p != NULL)
{
if (p->img>0) printf(" %9.2f + %3.2fi \n", p->real, p->img);
else

printf(" %9.2f - %3.2fi \n", p->real, p->img*-1);

p = p->link;
}
}
Complex *ReadFromFile(Complex *f, FILE *fl)
{
fseek(fl, 0, SEEK_SET);
float x, y;
Complex *p;
while (!feof(fl))

{
fscanf(fl, "%f %f", &x, &y);
printf("%9.2f %5.2f \n", x, y);
p = new(Complex);
p->real = x; p->img = y;
p->link = f;
f = p;
}
NGUYỄN TIẾN DŨNG
LỚP 53K2 – KỸ SƯ CÔNG NGHỆ THÔNG TIN

Page 21


BÁO CÁO ĐỀ TÀI THỰC TẬP CƠ SỞ - MÃ ĐỀ 051
fclose(fl);
return f;
}

int Find_Complex(Complex *f, Complex x)
{
Complex *p;
int n = 1;
p = f;
while (p != NULL)
{
if ((p->img == x.img) && (p->real == x.real)) return n;
else
{
p = p->link;

n++;
}
}
return -1;
}
bool checkFile(FILE *fl)
{
float x;
int n = 0;
while (!feof(fl))
{
int isNumber = fscanf(fl, "%f", &x);
if (isNumber == 0) return false;
else n++;
}
NGUYỄN TIẾN DŨNG
LỚP 53K2 – KỸ SƯ CÔNG NGHỆ THÔNG TIN

Page 22


BÁO CÁO ĐỀ TÀI THỰC TẬP CƠ SỞ - MÃ ĐỀ 051
if (n % 2 == 1) return false;
else return true;
}
int main()
{
system("color 1f");
system("Title Tong cac so phuc");
FILE *fl;

fl = fopen("input.txt", "rt");
if (!fl)
{
printf("\n\aFile not found !");
_getch();
exit(1);
}

if (checkFile(fl))
{
Complex *f = NULL;
printf("\n Danh sach so thuc doc tu tep la :\n\n");
f = ReadFromFile(f, fl);
printf("\n Danh sach so phuc doc tu tep la :\n\n");
Display(f);
Complex x;
printf("Nhap phan thuc va phan ao : ");
scanf("%f%f", &x.real, &x.img);
printf("VI tri xuat hien : %d", Find_Complex(f, x));
}
else
{
NGUYỄN TIẾN DŨNG
LỚP 53K2 – KỸ SƯ CÔNG NGHỆ THÔNG TIN

Page 23


BÁO CÁO ĐỀ TÀI THỰC TẬP CƠ SỞ - MÃ ĐỀ 051
printf("Error reading from file");

}
fclose(fl);
_getch();
return 0;
}
2.5. Dữ liệu test và kết quả tương ứng
2.5.1 Bộ Test

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

Page 24


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

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

Page 25


×