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

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

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

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


Гость






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

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

Примечание: Мне препод сказал, что как-то надо сделать так, чтобы на символ приходилось не 8 бит, а 5... можно 6. ( Сказал надо использовать SHL и SHR, а я только школу закончил, полтора месяца отучился, что такое бинарные операции и что с ними делать не представляю).
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #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 байт ) Кол-во скачиваний: 384


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

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


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

 





- Текстовая версия 2.09.2025 7:46
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name