Консультация № 162656
18.03.2009, 15:11
0.00 руб.
0 13 0
Доброго времени суток Помогите пожалуйста реализовать задачу с помощью динамических перемнных, т.е. Сначала из файла считываются все данные в память, обрабатываются и оттуда записываются в файл. Ниже дан листинг программы (задание было удвоить в тексте каждую букву в тексте). Заранее благодарен

Приложение:
Program DoubleLitersInTxtFile;
uses CRT;

Procedure OpenTxtFiles(var t1,t2:text);
begin
assign(t1,'text1.txt');
reset(t1);
assign(t2,'text2.txt');
rewrite(t2);
end;

Procedure DoubleLiters(var t1,t2:text; var s:string);
const liters=[65..90,97..122,168,184,192..255];{коды букв по ANSI}
var i:integer;
begin
while not eof(t1) do
begin
readln(t1,s);
i:=1;
while i<=length(s) do
begin
if ord(s[i]) in liters then insert(s[i],s,i+1);
inc(i,2);
end;
writeln(t2,s);
end;
end;

Procedure CloseTxtFiles(var t1,t2:text);
begin
close(t1);
close(t2);
end;

var t1,t2:text;
s:string;
i:byte;
begin
clrscr;
OpenTxtFiles(t1,t2);
DoubleLiters(t1,t2,s);
CloseTxtFiles(t1,t2);
writeln('All liters was doubled. Please press "Enter" to close this session.');
readln;
end.

Обсуждение

Неизвестный
18.03.2009, 15:28
общий
А что не так с Вашей программой?

Кроме небольшой ошибки в DoubleLiters:
Код:

Procedure DoubleLiters(var t1,t2:text; var s:string);
const liters=[65..90,97..122,168,184,192..255];{коды букв по ANSI}
var i:integer;
begin
while not eof(t1) do
begin
readln(t1,s);
i:=1;
while i<=length(s) do
begin
if ord(s[i]) in liters then
begin
insert(s[i],s,i+1);
inc(i,2);
end
else inc(i);
end;
writeln(t2,s);
end;
end;
Неизвестный
18.03.2009, 17:07
общий
Единственно, тут нет динамических переменных
давно
Старший Модератор
31795
6196
18.03.2009, 18:08
общий
И ошибка переполнения - выход за пределы определенной области.

к примеру строка имеет длину 150 символов из которых 120 букв.
150+120=270, при максимальной длине 256.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Неизвестный
18.03.2009, 18:14
общий
Эта мысль приходила в голову, но подобную проблему можно представить и для строк большей длины чем 255 символов. Имхо лучше читать файл по символам.
Неизвестный
18.03.2009, 19:24
общий
Ну а мою программу можно как-то модифицировать с динамическими переменными???
Неизвестный
18.03.2009, 20:55
общий
Помогите пожалуйста
Неизвестный
18.03.2009, 21:04
общий
Конечно, можно. Но уточните, что нужно использовать. Можно выделить область в динамической памяти размеров в 2 размера файла и в ней работать. Можно организовать список ... Можно создать класс (объект), который можно разместить вместе с данными и методами в динамической области памяти
Неизвестный
19.03.2009, 19:49
общий
Через выделеление области в динамической памяти размером в 2 размера файла.
Неизвестный
19.03.2009, 20:02
общий
Если размер файла больше 1Гб(для Turbo Pascal 32Кб) будет ошибка выделения памяти.
Неизвестный
20.03.2009, 20:42
общий
А как это реализовать? Я не знаю
давно
Старший Модератор
31795
6196
20.03.2009, 21:00
общий
Sanyaoo:
Вам под ВТР или pascalABC?
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Неизвестный
20.03.2009, 21:41
общий
Под Borland TurboPascal 7
давно
Старший Модератор
31795
6196
20.03.2009, 22:47
общий
Ваша задача сводится к:
Код:
Procedure DoubleLiters(var t1,t2:text);
const liters=[65..90,97..122,168,184,192..255];{коды букв по ANSI}
var
ch:char;
begin
while not eof(t1) do
begin
read(t1,ch);
if ord(s[i]) in liters then write(t2,ch) ;{продублировать символ}
write(t2,ch);
end;
end;

Лично я не вижу смысла, вводить динамику.
Но при желании:
Считываете размер открытого файла с помощью Filesize получаете число longint, проверяете больше ли оно размера 32767.
Если больше, то практически в цикле, пока больше, выполняете загрузить 32767 байт, зарезервировать 65535 байт, обработать этот участок кода, контролируя размеры полученной области данных(пригодится потом при записи), записать количество полученное ранее(вот и пригодилось), очистить память, вычесть из размера файла 32767 байт, повтрить.
Если меньше, то считываете оставшеся количество, умножаете на два, проверяетя и и соответственно изменняете + контроль, полученный результат записываете. Вот и Все.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Форма ответа