Консультация № 182254
19.02.2011, 04:22
0.00 руб.
0 11 2
Добрый вечер дорогие эксперты.
Требуется помощь в написании программы на Delphi 7 с использованием консольного приложения.

Вот задание.
Дан файл вещественных чисел.
Заменить числа в файле со второго по предпоследнее средним арифметическим данного, предыдущего и последующего.

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

Жду от вас помощи, эксперты.
Спасибо.

Обсуждение

давно
Мастер-Эксперт
425
4118
19.02.2011, 04:49
общий
Есть такой класс - TStringList. С помощью него Ваше затруднение решается элементарно, потому как TStringList читает текстовый файл и представлет собой массив строк. Вам остаётся только создать текстовый файл с числами, где каждое число расположено на отдельной строке.
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
Неизвестный
19.02.2011, 12:38
общий
А можно как нибудь без класса по старинке? через стандартные процедуры и функции

Кстати вот что я сделал:
Код:
program lab1b;
{$APPTYPE CONSOLE}
type masiv=array [1..65420] of real;
procedure sred_arph(var a:masiv; n:integer);
{процедура выполняет: вычисление среднего арифметического предыдущего, слудующего и последующего}
var tmp:masiv;
i:integer;
ar:real;
begin
tmp[1]:=a[1];
for i:=1 to n-2 do
begin
ar:=(a[i]+a[i+1]+a[i+2])/3;
tmp[i+1]:=ar;
end;
tmp[n]:=a[n];
for i:=1 to n do
a[i]:=tmp[i];
end;
var f:file of real;
k,i,j:integer;
mass:masiv;
tm:real;
begin
j:=0;
assignfile(f,'input.txt');
reset(f);
k:=filesize(f);
for i:=0 to k-1 do
begin
read(f,tm);
mass[i]:=tm;
seek(f,j+1);
inc(j);
end;
sred_arph(mass,k);
rewrite(f);
j:=0;
for i:=1 to k do
begin
write(f,mass[i]);
seek(f,j+1);
inc(j);
end;
close(f);
end.


давно
Мастер-Эксперт
425
4118
19.02.2011, 14:06
общий
Цитата: 324791
А можно как нибудь без класса по старинке?

Можно, но будет раз в 40 сложнее и в 40 раз больше кода.
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
Неизвестный
19.02.2011, 19:00
общий
Адресаты:
жеательно без классов=)сегодня это преподаватель сказал
Неизвестный
19.02.2011, 20:01
общий
это ответ
Здравствуйте, Юдин Евгений Сергеевич!
Немного переделал Ваш код. Обращаю Ваше внимание, что файл открывается как File of real.
Код в приложении.
Удачи!

Приложение:
program Project2;

{$APPTYPE CONSOLE}

uses
SysUtils;

type masiv=array of real;
function sred_arph(a:masiv; n:integer):real;
{процедура выполняет: вычисление среднего арифметического предыдущего, слудующего и последующего}
begin
result:=(a[n-1]+a[n]+a[n+1])/3;
end;

var f:file of real;
k,i:integer;
mass:masiv;
tm:real;
begin
assignfile(f,'input.dat');
reset(f);
k:=filesize(f);
SetLength(mass,k);
for i:=0 to k-1 do
read(f,mass[i]);
rewrite(f);
write(f,mass[0]);
for i:=1 to k-2 do
begin
tm:=sred_arph(mass,i);
write(f,tm);
end;
write(f,mass[k-1]);
close(f);
end.
Неизвестный
19.02.2011, 20:17
общий
здравствуйте! у меня вопрос такого плана:
как выглядит типизированный фаил вещественных чисел в блокноте?как правильно формировать его для удобства работы
давно
Мастер-Эксперт
319965
1463
19.02.2011, 20:38
общий
это ответ
Здравствуйте, Юдин Евгений Сергеевич!
Код:
program PMain;

{$APPTYPE CONSOLE}

uses
Classes, SysUtils;

var
fs: TFileStream;
FileName: String;
data: array of Real;
x,y,z:Real;
cnt:Integer;
i:Integer;

begin
FileName:='.....................';
fs:=TFileStream.Create(FileName,fmOpenReadWrite);
cnt:=fs.Size div SizeOf(Real);
SetLength(data,cnt);
fs.Read(x,SizeOf(Real));
fs.Read(y,SizeOf(Real));
data[0]:=x;
for i:=1 to cnt-1 do
begin
fs.Read(z,SizeOf(Real));
data[i]:=(x+y+z)/3;
x:=y;
y:=z;
end;
data[cnt-1]:=z;
fs.Seek(0,soFromBeginning);
for i:=0 to cnt-1 do fs.Write(data[i],SizeOf(Real));
fs.Free;
Writeln('cnt=',cnt);
Readln;
end.
Неизвестный
19.02.2011, 21:15
общий
Здравствуйте! Число типа real занимает в памяти ПК 8 байт и в блокноте каждое число будет выглядеть как 8 "кракозяб". В текстовом формате необходимо разделять числа между собой. Если каждое число в тексте начинается с новой строки, то можно читать, например, так:

assignfile(f,'input.txt');
reset(f);
k:=0;
SetLength(mass,k);
while not EOF(f) do
begin
readln(f,tm);
inc(k);
SetLength(mass,k);
mass[k-1]:=tm;
end;
rewrite(f);
writeln(f,mass[0]);
for i:=1 to k-2 do
begin
tm:=sred_arph(mass,i);
writeln(f,tm);
end;
writeln(f,mass[k-1]);
close(f);

Разница в том, что нельзя использовать функцию filesize и вместо методов read, write используются readln, writeln

Формируется типизированный файл программно. Последний цикл в ответе пример такого формирования.
Неизвестный
19.03.2011, 00:53
общий
Здравствуйте...возник такой вопрос...хоть он и запоздал, но все же...
Я создаю фаил, в котором через пробел записаны 5 чисел....
Выполняя трассировку с просмотром значений переменных я увидел, что к присваивается значение 2.....хотя это не есть истина....это не число компонент в фаиле...поэтому работа неправильно ведется с массивом....инициализируется всего то 2 ячейки а должны быть все 5, раз мы работаем с ними
Неизвестный
19.03.2011, 00:55
общий
В интернете сказано - что функция filesize - определяет размер фаила, но никак не колличество компонент....
Неизвестный
19.03.2011, 17:59
общий
Здравствуйте Юдин Евгений Сергеевич!
Для типизированного файла функция filesize возвращает количество компонентов файла.
Для текстового файла, как было сказано ранее, нельзя использовать эту функцию. В примере с текстовым файлом каждое число записывалось с новой строки. Если Вы хотите записать числа через пробел, то при чтении данных необходимо в строке данных искать пробелы. Если дана текстовая строка S в которой через пробел записаны вещественные числа, прочитать их можно примерно так:

var
S,S1:string;
tmp:masiv;
i,j:integer;
begin
i:=1; j:=0;
SetLength(tmp,0); //определяем длину массива
S:=Trim(S); //удаляем из строки пробелы в начале и конце
S:=S+' '; //и добавляем пробел в конце строки
while i<=Length(S) do
begin
S1:=''; //это пустая строка
while S[i]<>' ' do //здесь в кавычках пробел
begin
S1:=S1+S[i];
inc(i);
end;
SetLength(tmp,j+1);
tmp[j]:=StrToFloat(S1);
inc(j); inc(i);
end;
end;

Это примерный код для чтения данных записанных через пробел. На самом деле для корректного чтения необходимо четко согласовывать правила записи - чтения. Так в данном примере не рассмотрен случай двух пробелов подряд между числами и т.д.
Форма ответа