Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.12.2011, 09:00   #1
Эльзара
Новичок
Джуниор
 
Регистрация: 08.12.2011
Сообщений: 2
По умолчанию Архиватор

Архиватор. 100 баллов.

Входной файл arh.in
Выходной файл arh.out
Ограничение по времени 1 секунда на тест
Ограничение по памяти 16 мегабайт

Денис очень хочет занять свое место в программировании. С недавних пор он увлекся архивированием файлов, и даже написал свой архиватор, который архивирует пока только текстовые файлы. Архивировать Денис может пока только английские тексты из заглавных букв. Кроме букв архиватор распознает и работает с символами «пробел» - 27ой символ в кодовой таблице и символ «запятая» - 28ой символ в кодовой таблице. Суть алгоритма сжатия файлов заключается в следующем:
1. для архивирования каждой строки создается временно нулевой двухмерный массив из n строк и 28 столбцов.
2. При чтении текстового файла в первую строку массива, обозначающую номер символа в предложении, в столбце соответствующем номеру буквы в алфавите записывается 1.
3. Далее во второй строке массива появляется 1 в столбце, соответствующем номеру второго символа предложения в алфавите (в кодовой таблице) и т д.
При окончании предложения архиватор, переводит, начиная с последних строк, последовательности из n нулей и единиц (снизу вверх), как числа, из двоичной системы в десятичную и записывает по порядку в двумерный массив десятичные числа. Количество строк в полученном массиве соответствует количеству предложений. А количество столбцов 28. Полученный массив представляет собой содержимое Денисова архива.
Ваша задача - написать программу, которая будет распаковывать Денисовы архивы.

Формат входного файла.
В первой строке файла arh.in записано одно число n (0<n<10) - число предложений в архивном файле.
В последующих n строках записано по 28 чисел, разделенных пробелами.
Гарантировано что число букв в предложении не превышает 30. В конце каждого предложения необходимо добавлять точку.

Формат выходного файла.
Восстановленный текст.

Примеры файлов входных и выходных данных:
arh.in
1
0 0 0 0 16416 0 0 8192 1 0 0 4 1152 0 2056 0 0 32768 0 4096 0 16 0 0 256 0 578 0

arh.out
I LOVE MY MOTHER.
Эльзара вне форума Ответить с цитированием
Старый 08.12.2011, 10:08   #2
TinMan
Форумчанин
 
Аватар для TinMan
 
Регистрация: 05.09.2011
Сообщений: 869
По умолчанию

а чего хочешь-то?.. ты забыла это сказать..
Предпочитаю на "ты".
TinMan вне форума Ответить с цитированием
Старый 08.12.2011, 18:50   #3
New man
Форумчанин
 
Регистрация: 24.01.2011
Сообщений: 774
По умолчанию

Я писал write(f,'Hello.')
a.k.a. Angelicos Phosphoros
Мой сайт
New man вне форума Ответить с цитированием
Старый 08.12.2011, 19:54   #4
Mad_Cat
Made In USSR!
Старожил
 
Аватар для Mad_Cat
 
Регистрация: 01.09.2010
Сообщений: 3,657
По умолчанию

файлы сами приделывайте
Код:
var mas:array[1..28] of string[30];
inp:string;
buf:integer;e,i:integer;
Res:string;
{Получение символа по номеру}
function getChar(ch:integer):char;
begin
case ch of
1..26:getChar:=chr(ord('A')+ch-1);
27:getChar:=' ';
28:getChar:=',';
else getchar:=';';
end;
end;
{Переворот строки}
Function GetOStr( vv:string):string;
var i:integer;
ch:char;
begin
for i:=1 to length(vv) div 2 do
begin
ch:=vv[i];
vv[i]:=vv[length(vv)-i+1];
vv[length(vv)-i+1]:=ch;
end;
GetOStr:=vv;
end;
{перевод 10-->2}
function DEC2BIN(DEC: LONGINT): string;
var
  BIN: string;
  I, J: LONGINT;
begin
  if DEC = 0 then
    BIN := '0'
  else
  begin
    BIN := '';
    I := 0;
    while (1 shl (I + 1))<=DEC do
      I := I + 1;
    for J := 0 to I do
    begin
      if (DEC shr (I - J)) = 1 then
        BIN := BIN + '1'
      else
        BIN := BIN + '0';
      DEC := DEC and ((1 shl (I - J)) - 1);
    end;
  end;
  DEC2BIN := BIN;
end;
begin
inp:='0 0 0 0 16416 0 0 8192 1 0 0 4 1152 0 2056 0 0 32768 0 4096 0 16 0 0 256 0 578 0';
i:=1;
while pos(' ',inp)<>0 do begin
    val(copy(inp,1,pos(' ',inp)-1),buf,e);
    mas[i]:=DEC2BIN(buf);
    inc(i);
    delete(inp,1,pos(' ',inp));
    end;
    val(inp,buf,e);
    mas[i]:=DEC2BIN(buf);
for i:=1 to 30 do
res:=res+';';
For i:=1 to 28 do begin
mas[i]:=GetOStr(mas[i]); end;
For i:=1 to 28 do
For e:=1 to length(mas[i]) do
if mas[i][e]='1' then res[e]:=getChar(i);
while res[length(res)]=';' do delete(res,length(res),1);
res:=res+'.';
writeln(res);
readln;
end.
результат в ПаскальABC
Цитата:
I LOVE MY MOTHER.
"...В жизни я встречал друзей и врагов.В жизни много всего перевидал.Солнце тело мое жгло, ветер волосы трепал,но я смысла жизни так и не узнал..."
(c) Юрий Клинских aka "Хой"

Последний раз редактировалось Mad_Cat; 08.12.2011 в 19:56.
Mad_Cat вне форума Ответить с цитированием
Старый 15.03.2014, 14:14   #5
В00М
 
Регистрация: 15.03.2014
Сообщений: 3
По умолчанию

наверно глупый вопрос задаю, но все же.
после запуска программы выдает "I LOVE MY MOTHER" как избавится от это записи? и второе мне очень нравится твоя программа мне препод задала как курсовую написать программный код архиватора на паскале. Прошу помощи просто неделю не сплю ничего путного пока не вышло а сроки сдачи поджимают...
В00М вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
архиватор дубль гис Софт 1 29.11.2011 06:42
C# архиватор Marik1993 Общие вопросы .NET 6 03.01.2011 11:04
Архиватор DMITRIG Общие вопросы C/C++ 2 03.05.2008 14:36
Архиватор Mcc_1 Фриланс 4 18.12.2007 18:19
Архиватор. Elektronbrain Фриланс 51 10.02.2007 10:09