IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> Помогите написать архиватор для текстовых файлов на паскале, Я на первом курсе очень надо сдать, со кроком уже опаздываю... Помогит
-Антон-
сообщение 24.10.2007 18:03
Сообщение #1


Гость






Задача такая:

Программа архиватор- разархиватор текстовых файлов на русском языке ( Применяются только буквы русского алфавита, знаки припенания и пробелы, сжатие должно быть максимальным).

Примечание: Мне препод сказал, что как-то надо сделать так, чтобы на символ приходилось не 8 бит, а 5... можно 6. ( Сказал надо использовать SHL и SHR, а я только школу закончил, полтора месяца отучился, что такое бинарные операции и что с ними делать не представляю).
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
klem4
сообщение 30.10.2007 18:17
Сообщение #2


Perl. Just code it!
******

Группа: Модераторы
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


извиняюсь что с опозданием, времени совсем нету свободного в последнее время, вот написал, код конечно грязный, времени для сокращения к сожалению тоже нет, но хоть что-то ... пример файла состоящего из алфавита в аттаче, сжатие

232 байта ----> 174 байта (для прикрепленного файла)

uses crt;

const
alpha: String = 'abcdefghijklmnopqrstuvwxyz0123456789-.:,;!? '#10#13;

type
TArchiveFile = file of Byte;

procedure Archive(const txt_file_name, arc_file_name: String);
var
text_file: Text;
arch_file: TArchiveFile;

byte_a, byte_b: Byte;

archive_byte, left, right: Byte;

ch: Char;

begin
assign(text_file, txt_file_name);
reset(text_file);

assign(arch_file, arc_file_name);
rewrite(arch_file);

if not eof(text_file) then begin

left := 2;
right := 4;

repeat

if (left = 2) and not eof(text_file) then begin
read(text_file, ch);
byte_a := Pos(ch, alpha);
end else byte_a := byte_b;

if not eof(text_file) then begin
read(text_file, ch);
byte_b := Pos(ch, alpha);
end else
byte_b := 0;

archive_byte := byte(byte_a shl left) or byte(byte_b shr right);

write(arch_file, archive_byte);

if left < 6 then
left := left + 2
else
left := 2;

if right > 0 then
right := right - 2
else
right := 4;

until eof( text_file );

if (right <> 4) and (byte_b <> 0) then
write(arch_file, byte(byte_b shl left));

end;

close(text_file);
close(arch_file);
end;


procedure UnArchive(const arc_file_name, txt_file_name: String);
var
unarchive_byte, byte_a, byte_b, curr_unbyte_num, bytes_done: Byte;
txt_file: Text;
arc_file: TArchiveFile;

last_readed_byte, file_size: LongInt;

begin
assign(txt_file, txt_file_name);
rewrite(txt_file);

assign(arc_file, arc_file_name);
reset(arc_file);

curr_unbyte_num := 0;
last_readed_byte := -1;
bytes_done := 0;

repeat

inc(bytes_done);

if curr_unbyte_num < 4 then
inc(curr_unbyte_num)
else
curr_unbyte_num := 1;

if curr_unbyte_num = 4 then begin

seek(arc_file, last_readed_byte);
read(arc_file, byte_a);

unarchive_byte := byte(byte(byte_a shl 2) shr 2);

end else if curr_unbyte_num = 3 then begin

seek(arc_file, last_readed_byte);
read(arc_file, byte_a);

seek(arc_file, last_readed_byte + 1);
read(arc_file, byte_b);

unarchive_byte := byte(byte(byte_a shl 4) shr 2) + byte(byte_b shr 6);

inc(last_readed_byte);

end else if curr_unbyte_num = 2 then begin

seek(arc_file, last_readed_byte);
read(arc_file, byte_a);

seek(arc_file, last_readed_byte + 1);
read(arc_file, byte_b);

unarchive_byte := byte(byte(byte_a shl 6) shr 2) + byte(byte_b shr 4);

inc(last_readed_byte);

end else begin

inc(last_readed_byte);
seek(arc_file, last_readed_byte);
read(arc_file, byte_a);

unarchive_byte := byte(byte_a shr 2);
end;

if unarchive_byte <> 0 then
write(txt_file, alpha[unarchive_byte]);

until bytes_done = 8 * (filesize(arc_file)) div 6;

close(txt_file);
close(arc_file);
end;

begin
Archive('c:\text.txt', 'c:\archive.arc');
UnArchive('c:\archive.arc', 'c:\text1.txt');
Writeln('Done');
ReadLn;
end.


Прикрепленные файлы
Прикрепленный файл  text.txt ( 232 байт ) Кол-во скачиваний: 181


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме
-Антон-   Помогите написать архиватор для текстовых файлов на паскале   24.10.2007 18:03
blackhard   короче мой тебе совет напиши в платном разделе я з...   25.10.2007 23:00
klem4   я сделаю эту программу, только чуть позже, возможн...   26.10.2007 7:27
Malice   В 6 бит можно влезть без заглавных русских букв, в...   26.10.2007 10:40
Ozzя   можно без ё   26.10.2007 11:44
Malice   Ну в таком случае самый простой выход - задавать ч...   26.10.2007 12:45
volvo   Только если без знаков препинания. С ними число си...   26.10.2007 11:58
Гость   Спасибо, буду ждать. Мне сказали, что можно без...   26.10.2007 18:42
Гость   И вообще всем СПАСИБО, кто ответил   26.10.2007 18:42
Malice   Дел здесь на час максимум да и кода в полтора экра...   26.10.2007 19:02
Гость   Я бы поучавствовыл... но проблема, что с паскалем ...   26.10.2007 19:06
Malice   Алгоритм простой: Выбираем используемый алфавит, ч...   27.10.2007 12:02
klem4   извиняюсь что с опозданием, времени совсем нету св...   30.10.2007 18:17
Гость   Спасибо большое) Как нибудь постараюсь отблагодари...   30.10.2007 22:38


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 18.06.2025 21:26
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"