Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ПЗ АиСД.docx
Скачиваний:
2
Добавлен:
01.05.2025
Размер:
771 Кб
Скачать
☆

Приложение б руководство пользователя

Программа предназначена для кодирования и декодирования файлов методом Хаффмана. Основная задача программы – это уменьшение размера файла.

При запуске, откроется главное меню, в котором необходимо выбрать действие:

  • архивация;

  • декодирование.

В правой части экрана находится кнопка «?», для предоставления справки о построении дерева Хаффмана. Выход из программы осуществляется нажатием на крестик в правом верхнем углу.

Пользователь может выбрать архивацию файла, после чего программа откроет проводник для выбора сжимаемого файла. Заархивированный файл будет сохранен под именем исходного с расширением «.kbk». В конце на экране будут отображены данные с информацией о размерах файлов:

  • размер исходного файла;

  • размер сжатого файла;

  • процент сжатия.

При выборе функции декодирования, программа откроет проводник для выбора файла и в конце выведет разархивированный файл.

Приложение В

ЭКРАННЫЕ ФОРМЫ

Рисунок В.1 – Исходный файл

Рисунок В.2 – Проводник для выбора файла

Рисунок В.3 – Результаты работы программы

Приложение Г

РЕЗУЛЬТАТ АРХИВАЦИИ

0000000000100010000010100001011100000000010001000001101000101000101101000100000000000100100011010110001101010000001111000010101101001001101011110100101101010001011000011000000100110111100000100100111001101110000110000111100011010111100101000000010011000111111100001100110111011110001111111001100001010111110010011000010001101010001001000110100101100011011001110011111001100101011100010000010110101100111110100100110111000011001101010011010001101011111101110001000010100000101010010110100101101011000100001010111101011000101010010001111101111010001001111110111100000001000001000001100011010110001101010000000011010111001111011010110011001100001010101001100100010110111000001000010101000110011110001101011001011011111000110110100010000001001101111001000001100001101100100111110011110100111011001111101110100010010010001010011111000110101000000101000010010111011100110100100111110010110111100110000101010100111001110100100110101101110010100010101001111000110101111101000011011110001011111010001001011000110111000011001111101000010011001010100011010100110110011000101101000011000011011111110001100100100000000110001101010000001111011111000101010100001011100001010101001110000010010111010100110111101111101111001011110000011000001111111110000111100011010100010101010011101000010010001011001101011010111101000011101100001101100110011011110111110000011001000011000000011110001101011111010000110111100100000110011101100101101111110111100111101101011001100110001101101111110000011111111110010001101011011110111111111010010111111000110000000101101111101110101100100111111010100010110111010110000110010000110000000000110001101011001101000010111010101000011011011111100111010111100111000001001001111111100110001101001011111001011101100111001111000110101111110111110110100001001010111110000111110101000010000101100001001011101011000101110101110011011111000011110001101010100101010100111000110111100111010001101111010000111011110000101011010010011010110111111100110111110100000101110111100100011010111101010101000001001001101111010111110101100101110111001010011101011100110111110000000110001101011001101011110011101010100111110101000111010010110011010010110011110000101010100101010011111001101001011011111011100010000101011101010011010001101011111110011100001010111110011000001010111111111110111000100001011001011111001101110100001101110011011100000000001000001000001100011010110011001001100001100111110101101001010001001001001010100101111011100000100110000110100110011100110100111000011111010100011101001011000011001111001100101100110011100011010100000000000111110100001001100101010001100011011001110011111010110001010011110011101010111010000101011011100010111101110000010100111110001101011001100010100110001100101100001100111110011000101101000010011001010010111101110000000111110111101000011011110001101111001110111100000110001101010001010101001100100010110011111001001101110000011001110011111001001101110100011101010110001101010001001000110100101100110001011010110001010010100010010010010110111001111110000011010110001000111100111010101001111000110101011001011000010010111101110011000101100111000100000101101110011111100000110011010010010011011101000111010101000001100011010110001101010000001111000010101101001001101011110100101101010001011000011000000100110111100000100100111001101110000110000111100011010101101011110000110011111010000111011101000101111101100101101010011011001100010110100001110110100110010011010000000000110001101011001101010010001101001011000110110011111001111001001101111000011111001101011110100100110111000011000011110001101010110001011010000100110010101110111101111100001100110000000010001100101010011101101000011111001111100011001110110100000100110000100011010111101101111000000001000110111010001011110111110111100100000100010110101110100010111100100000100001010100111100011010101001101110100011101010111010000111011011101111100010000100101111010010101000100101111111110011001111100111001111000110101111011011110101000101100001001011111000101101011101001011011111010000101011101001110011111011101101111000000001000110111010010100011010110000111011010001111100100000111101000000100010111010110001011011110001110111101100101010010110100001010010011111001110000011000110101100011010100000010110111110111100011110101000110000011010100110110100101100001101111110100110101111010111111101001101101000101101001001111000110101101000101100001111100001111101111011001001110001001000100000011000100001111111111001100111011010100000001111001110110010000001000001000001100011010100000011110111110001010101101110011010000110000110111111100011011101001011010010110011100010111110010010001011101001011010100110100011010100010111000100000111101100101101001101111001111011000100011111011110100001101111001000001100001101100101111011100000001111100001011100010000011110110010101001111|/О2/|000000000|/л27/|01000|/ь20/|100000|/г20/|101000|/а51/|0101|/ 131/|110|/Б1/|0000000010|/е58/|0010|/р30/|00001|/о79/|1011|/ц2/|000000100|/ 40/|10001|/

40/|10101|/Я4/|00000011|/т60/|0001|/й10/|1010010|/н46/|0110|/и35/|10010|/к25/|01001|/в24/|01110|/у30/|11100|/ю13/|001100|/,28/|00111|/м22/|01111|/д31/|11101|/я16/|111100|/:3/|100110000|/б14/|001101|/ы17/|100111|/-6/|10100110|/с33/|11111|/ч8/|1111010|/.15/|000001|/З1/|0000000011|/х3/|101001110|/!3/|101001111|/П2/|000000101|/з9/|1000010|/п9/|1000011|/ш8/|1111011|/Н2/|100110100|/ж4/|10011011|/Т2/|100110101|/И1/|1001100100|/"2/|100110011|/?1/|1001100101|/Е1/|1001100010|/щ1/|1001100011|/э3/|00000001

Приложение Д

ЛИСТИНГ ПРОГРАММЫ

import java.awt.Desktop;

import java.awt.Dimension;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.io.BufferedReader;

import java.io.File;

import java.io.FileReader;

import java.io.IOException;

import java.io.PrintWriter;

import java.util.ArrayList;

import javax.swing.JButton;

import javax.swing.JFileChooser;

import javax.swing.JFrame;

import javax.swing.JLabel;

import javax.swing.JPanel;

import javax.swing.JTextField;

public class huffman extends JFrame {

private JTextField textField;

public huffman() {

super("Архивация методом Хаффмана");

createGUI();

}

public void createGUI() {

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

final JPanel panel = new JPanel();

panel.setLayout(null);

JLabel k = new JLabel ("Выберите действие:");

k.setBounds(35,25,200,30);

panel.add(k);

JButton button1 = new JButton("Архивация файла");

button1.setBounds(30, 80, 200, 40);

panel.add(button1);

JButton button2 = new JButton("Декодирование файла");

button2.setBounds(265, 80, 200, 40);

panel.add(button2);

JButton button3 = new JButton("?");

button3.setBounds(420, 160, 45, 35);

panel.add(button3);

button1.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {

JFileChooser fileopen = new JFileChooser();

int ret = fileopen.showDialog(null, "Открыть файл");

if (ret == JFileChooser.APPROVE_OPTION) {

File file = fileopen.getSelectedFile();

String label;

label = file.getName();

float[] sum = Archiver(label);

JLabel k = new JLabel ("Вес исходного файла: " +String.valueOf(sum[0]));

k.setBounds(35,210,300,30);

panel.add(k);

k = new JLabel ("Вес сжатого файла: " +String.valueOf(sum[1]));

k.setBounds(35,230,300,30);

panel.add(k);

k = new JLabel ("Сжатие в " +String.valueOf(100-100*sum[1]/sum[0]) +"%");

k.setBounds(35,250,300,30);

panel.add(k);

}

}

});

button2.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {

JFileChooser fileopen = new JFileChooser();

int ret = fileopen.showDialog(null, "Открыть файл");

if (ret == JFileChooser.APPROVE_OPTION) {

File file = fileopen.getSelectedFile();

String label;

label = file.getName();

UnArchiver(label);

}

}

});

button3.addActionListener(new ActionListener() {

public void actionPerformed(ActionEvent e) {

InFile("Huffmanручнойпросчет.doc");

}

});

getContentPane().add(panel);

setPreferredSize(new Dimension(500, 350));

}

public class TestActionListener implements ActionListener {

public void actionPerformed(ActionEvent e) {

textField.setText(e.getActionCommand());

}

}

public static void main(String[] args) {

javax.swing.SwingUtilities.invokeLater(new Runnable() {

public void run() {

JFrame.setDefaultLookAndFeelDecorated(true);

huffman frame = new huffman();

frame.pack();

frame.setLocationRelativeTo(null);

frame.setVisible(true);

}

});

}

// Архивация файла

public static float[] Archiver(String file)

{

int i = 0, j = 0;

float []sum = {0, 0};

ArrayList<Character> chars = new ArrayList();

ArrayList<String> a = new ArrayList <String>();

ArrayList< Integer > b = new ArrayList< Integer >();

BufferedReader reader = null;

try {

reader = new BufferedReader(new FileReader(new File(file)));

int c;

while ((c = reader.read()) != -1) {

chars.add((char) c);

}

reader.close();

} catch (IOException e) {

e.printStackTrace();

} finally {

if (reader != null) {

try {

reader.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

sum[0] = chars.size()*8;

for(i=0; i<chars.size(); i++)

{

a.add(String.valueOf(chars.get(i)));

}

for(i=0; i<a.size(); i++)

{

b.add(1);

for(j = i+1; j<a.size(); j++)

{

if(a.get(i).equals(a.get(j)))

{

b.set(i, b.get(i)+1);

a.remove(j);

j--;

}

}

}

String [][]mas = new String [a.size()+1][a.size()+1];

int [][]mas1 = new int [a.size()+1][a.size()+1];

int size1=a.size();

for(i=0; i<size1; i++)

{

mas[0][i] = String.valueOf(a.get(i));

mas1[0][i] = b.get(i);

mas[1][i] = String.valueOf(a.get(i));

mas1[1][i] = b.get(i);

}

int size2 = size1;

for (i=2; i<size1+1; i++)

{

Mas1(mas1[i-1], mas[i-1], size2);

for(j=0; j<size2-1; j++)

{

mas[i][j] = String.valueOf(mas[i-1][j]);

mas1[i][j] = mas1[i-1][j];

}

size2--;

}

size2 = size1;

/*for(i=0; i<size1; i++)

{

for(j=0; j<size2; j++)

{

System.out.print(" " +mas[i][j]);

}

size2--;

// System.out.println();

}*/

String []dz; //двоичный код символа

dz = new String[chars.size()];

String []fgh; //динамический массив а в статическом виде

fgh = new String[chars.size()];

for(i=0; i<size1; i++)

{

fgh[i] = String.valueOf(a.get(i));

}

for(i=0; i<size1; i++)

{

Coding(dz, fgh, mas, size1);

}

String nfile = "";

nfile = Name(file)+".kbk";

try

{

PrintWriter pw = new PrintWriter(new File(nfile));

for(i=0; i<chars.size(); i++)

{

for(j=0; j<size1; j++)

{

if(String.valueOf(chars.get(i)).equals(a.get(j)))

{

byte rg;

for(int k = 0; k<dz[j].length(); k++)

{

rg = 0;

rg = Byte.parseByte( String.valueOf(dz[j].charAt(k)) );

pw.print(rg);

}

sum[1] = sum[1] + dz[j].length();

}

}

}

sum[1] = sum[1] + a.size()*8;

for(i=0; i<size1; i++)

{

pw.print("|/" +a.get(i));

byte hj;

for(int k = 0; k<String.valueOf(b.get(i)).length(); k++)

{

hj = 0;

hj = Byte.parseByte(String.valueOf((String.valueOf(b.get(i)).charAt(k))));

pw.print((byte) hj);

sum[1] += 1;

}

pw.print("/|");

byte rg;

for(int k = 0; k<dz[i].length(); k++)

{

rg = 0;

rg = Byte.parseByte( String.valueOf(dz[i].charAt(k)) );

pw.print((byte)rg);

}

}

pw.close();

}

catch(Exception e)

{

e.printStackTrace();

}

return sum;

}

// Декодирование файла

public static void UnArchiver(String file)

{

int i = 0, j = 0, k = 0, g = 0, n = 0;

ArrayList<Character> chars = new ArrayList();

ArrayList<String> a = new ArrayList <String>();

ArrayList<String> d = new ArrayList <String>();

ArrayList<String> r = new ArrayList <String>();

ArrayList< Integer > b = new ArrayList< Integer >();

BufferedReader reader1 = null;

try {

reader1 = new BufferedReader(new FileReader(new File(file)));

int c;

while ((c = reader1.read()) != -1) {

chars.add((char) c);

}

reader1.close();

} catch (IOException e) {

e.printStackTrace();

} finally {

if (reader1 != null) {

try {

reader1.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

i=0;

String str = new String();

str = "";

while(chars.get(i)=='0'||chars.get(i)=='1')

{

str+=String.valueOf(chars.get(i));

i++;

}

i += 2;

j = 0;

g = 0;

k = 0;

n = chars.size();

a.add(String.valueOf(chars.get(i)));

j++; i++;

while(i!=n-1)

{

if((chars.get(i)>= '0' && chars.get(i) <= '9'))

{

d.add("");

b.add(0);

while((chars.get(i)>= '0' && chars.get(i) <= '9'))

{

d.set(g, d.get(g)+String.valueOf(chars.get(i)));

b.set(g, Integer.parseInt(d.get(g)));

if (i!=n-1)

i++;

}

g++;

}

else

{

if(chars.get(i)=='/')

{i++;

if(chars.get(i)=='|')

{

if (i!=n-1)

i++;

r.add("");

while((chars.get(i)== '0' || chars.get(i) == '1'))

{

r.set(k, r.get(k)+String.valueOf(chars.get(i)));

if (i!=n-1)

i++;

else break;

}

k++;

}

}

else

{

if(chars.get(i)=='|')

{

i++;

if(chars.get(i)=='/')

{

if (i!=n-1)

i++;

a.add(String.valueOf(chars.get(i)));

if (i!=n-1)

i++;

}

}

}

}

}

/*System.out.println();

System.out.println();

System.out.print(" " +a);

System.out.print(" " +b);

System.out.println(" " +r);*/

String wer = new String();

String str1 = new String();

str1 = "";

while(str.length()>0)

{

for(i=0; i<a.size(); i++)

{

wer = "";

wer = r.get(i);

if(str.startsWith(wer)==true)

{

b.set(i, b.get(i)-1);

str1 += a.get(i);

str = new StringBuffer(str).

delete(0, wer.length()).toString();

}

else

{

for(j=0; j<i; j++)

{

if(b.get(j)!=0)

{

wer = r.get(j);

if(str.startsWith(wer)==true)

{

b.set(j, b.get(j)-1);

str1 += a.get(j);

str = new StringBuffer(str).

delete(0, wer.length()).toString();

}

}

}

}

}

}

String nfile = Name(file)+".txt";

try

{

PrintWriter pw = new PrintWriter(new File(nfile));

pw.print(str1);

pw.close();

}

catch(Exception e)

{

e.printStackTrace();

}

InFile(nfile);

}

// Построение дерева Хаффмана

public static void Mas1(int y[], String x[], int n)

{

int min = 0, min1 = 0, i, j;

String k, k1;

String []w;

int []w1;

w = new String [n];

w1 = new int [n];

min = y[0]; k = String.valueOf(x[0]);

min1 = y[1]; k1 = String.valueOf(x[1]);

for (i=1; i<n; i++)

{

if(min>y[i])

{

min1 = min; k1 = String.valueOf(k);

min = y[i]; k = String.valueOf(x[i]);

}

else

{

if(min1>y[i])

{

min1 = y[i]; k1 = String.valueOf(x[i]);

}

}

}

for(i=0; i<n; i++)

{

if(x[i]==k)

{

w[i]=k+k1;

w1[i]=min+min1;

for(j=i+1; j<n; j++)

{

if(x[j]==k1)

{

for(int g=j+1; g<n; g++)

{

w[j] = String.valueOf(x[g]);

w1[j] = y[g];

j++;

}

}

else

{

w[j] = String.valueOf(x[j]);

w1[j] = y[j];

}

}

break;

}

else

{

if(x[i]==k1)

{

w[i]=k1+k;

w1[i]=min1+min;

for(j=i+1; j<n; j++)

{

if(x[j]==k)

{

for(int g=j+1; g<n; g++)

{

w[j] = String.valueOf(x[g]);

w1[j] = y[g];

j++;

}

break;

}

else

{

w[j] = String.valueOf(x[j]);

w1[j] = y[j];

}

}

break;

}

else

{

w[i] = String.valueOf(x[i]);

w1[i] = y[i];

}

}

}

for(i=0; i<n-1; i++)

{

x[i] = String.valueOf(w[i]);

y[i] = w1[i];

}

}

// Кодирование текста

public static void Coding(String dz[], String a[], String mas[][], int n)

{

int i, j, g, z, q, f;

outer:

for(i=0; i<n; i++)

{

dz[i]="";

z = 1;

outer1:

for(j=n-2; j>-1; j--)

{

z++;

f = 0;

for(g=0; g<z-1;g++)

{

if(mas[j+1][g].indexOf(a[i]) != -1)

{

for(q=0; q<z; q++)

{

if(mas[j+1][g].indexOf(mas[j][q]) != -1)

{

if(mas[j][q].indexOf(a[i]) != -1)

{

if(mas[j][q]==mas[j+1][g])

{

if(a[i]==mas[j][q])

{

continue outer;

}

else

continue outer1;

}

else

{

if(f==1)

{

dz[i] += "1";

continue outer1;

}

else

{

dz[i] += "0";

continue outer1;

}

}

}

else

{

f = 1;

}

}

}

}

}

}

}

}

public static void InFile(String file)

{

Desktop desktop = null;

if (Desktop.isDesktopSupported())

{

desktop = Desktop.getDesktop();

}

try {

desktop.open(new File(file));

} catch (IOException ioe) {

ioe.printStackTrace();

}

}

public static String Name(String file)

{

int k = 0;

String nfile;

k = file.lastIndexOf(".");

nfile = file.substring(0, k);

return nfile;

}

}