Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Компонента

Автор: Анна 21.11.2005 23:31

Нужна помошь. Задание:

Код
Создать компонентный файл компонентами которого являются действительные числа.
Найти сумму компонент файла и сумму абсолютных значений.
В качестве результата  вывести на экран имя файла и полученные суммы.


Altair помог! Спасибо! give_rose.gif Но ещё вопрос. В этой программе все вводимые числа сразу же записываются файл и прям на месте же и считаются, а нужно -- создать файл, записать туда все данные, закрыть его, а потом открыть и сосчитать уже из файла.


Вот как было:

var
f:file of real;
t,summ,summabs:real;
s:string;
i,n:integer;
begin
summ:=0; summabs:=0;
write('Enter file name: ' ); readln(s);
write('N='); readln(N);
assign(f,s);
rewrite(f);
for i:=1 to n do begin
write('= '); readln(t);
write(f,t);
summ:=summ+t;
summabs:=summabs+abs(t);
end;
close(f);
writeln('summ=',summ:0:2,' abs summ=',summabs:0:2,' filename=',s);
readln;
end.



А вот исправленный вариант:
var
f:file of real;
t,summ,summabs:real;
s:string;
i,n:integer;
begin
summ:=0; summabs:=0;
write('Enter file name: ' ); readln(s);
write('N='); readln(N);
assign(f,s);
rewrite(f);

for i:=1 to n do begin
write('= '); readln(t);
write(f,t);
end; close(f);

begin
reset(f);
for i:=1 to length(s) do
read(f,t);
summ:=summ+t;
summabs:=summabs+abs(t);
end;

writeln('summ=',summ:0:2,' abs summ=',summabs:0:2,' filename=',s);
readln;
close (f);
end.

Автор: klem4 21.11.2005 23:38


assign(f, s);
reset(f); // открываем для чтения
while(not(eof(f))) do begin // пока не достигнут конец файла
read(f, t);
//делаем с t что угодно ...
end;

close(f);

Автор: volvo 21.11.2005 23:44

Анна, если файл открыт для записи, его совершенно не обязательно закрывать, чтобы открыть для чтения. Можно сразу после окончания записи сделать Reset(f) и файл будет ПЕРЕоткрыт для чтения, при этом гарантируется, что потерь данных не будет...

Автор: Анна 21.11.2005 23:55

Я понимаю, задача бужет выглядеть след. образом:


var
f:file of real;
t,summ,summabs:real;
s:string;
i,n:integer;
begin
summ:=0; summabs:=0;
write('Enter file name: ' ); readln(s);
write('N='); readln(N);
assign(f,s);
rewrite(f);

for i:=1 to n do begin
write('= '); readln(t);
write(f,t);
end; close(f);

begin
assign(f,s);
reset(f);
while(not(eof(f))) do begin
read(f,t);
summ:=summ+t;
summabs:=summabs+abs(t);
end;

writeln('summ=',summ:0:2,' abs summ=',summabs:0:2,' filename=',s);
readln;
close (f);
end.

Автор: klem4 22.11.2005 0:06

Что-то у тебя с begin-ами нелады smile.gif)

uses crt;

var
f : file of real;
r, sum, sumAbs : real;
n ,i : byte;
s : string;

begin
clrscr;

s := 'c:\real.rl';

write('n='); readln(n);

assign(f,s);

rewrite(f);

for i := 1 to n do begin
readln( r);
write(f, r);
end;

sum := 0;
sumAbs := 0;

reset(f);

while(not(eof(f))) do begin
read(f, r);
sum := sum + r;
sumAbs := sumAbs + abs( r);
end;

writeln('sum = ', sum:3:3);
writeln('sumAbs = ', sumAbs:3:3);

close(f);

readln;
end.

Автор: Анна 22.11.2005 0:10

Вопрос:
Можно

while(not(eof(f))) do begin
заменить на
for i:=1 to length(s) do

Автор: klem4 22.11.2005 0:13

А причем здесь вообще S ? - этоже имя файла ... while(not(eof(f))) - ты будешь читать из файла значения до тех пор пока они на закончатся, а точнее пока не будет достигнут конец файла f ... EOF - End Of File.