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

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

Форум «Всё о Паскале» _ Задачи _ Файл\\\

Автор: Rocket 5.03.2007 0:11

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

Program ZE;
type file_=file of real;
var f:file_;

function Z(var f:file_):real;

var
i:integer;
min:real;
a:array[0..10] of real;
p:real;

begin

reset(f);
p:=1;

begin

for i:=0 to filesize(f)-1 do
begin
read(f,a[i]);
min:=a[0];
for i:=1 to filesize(f)-1 do
begin
if a[i]<min then
min:=a[i];
end;

for i:=0 to filesize(f)-1 do
begin
if a[i]>2*min then begin
p:=p*a[i];
Z:=p;
end;
end;
end;
end;
close(f);
end;

procedure ZE_(var f:file_);
var
x:real;
begin
Reset(f);
While not eof(f) do
begin
read(f,x);
write(x,' ');
end;
Writeln;
Close(f);
end;


Begin
assign(f,'da.dat');
Reset(f);
close(f);
ZE_(f);
writeln('Proiz= ', Z(f));
readln;
end.

Процедура выполняется,а вот функция выдает результат 0. Помогите найти косяк.
yes2.gif

Автор: мисс_граффити 5.03.2007 0:15

вот тут в циклах ошибка.
если отформатируешь программу по-человечески, она станет очевидна:

for i:=0 to filesize(f)-1 do
begin
read(f,a[i]);
min:=a[0];
for i:=1 to filesize(f)-1 do //идем по массиву - но ведь он еще не заполнен!
begin
if a[i]<min then
min:=a[i];
end;

вложенный цикл по той же переменной... то есть вообще результаты слабо предсказуемы.

Автор: Rocket 5.03.2007 0:27

Цитата(мисс_граффити @ 4.03.2007 20:15) *
вот тут в циклах ошибка.

Спасибо. А как тогда переделать?

Автор: мисс_граффити 5.03.2007 0:53

 function Z(var f:file_):real;
var
i:integer;
min:real;
a:array[0..10] of real;
p:real;
begin
reset(f);
p:=1;
for i:=0 to filesize(f)-1 do
read(f,a[i]);
min:=a[0];
for i:=1 to filesize(f)-1 do
if a[i]<min then
min:=a[i];
for i:=0 to filesize(f)-1 do
if a[i]>2*min then
p:=p*a[i];
Z:=p;
close(f);
end;

может быть, так?

Автор: volvo 5.03.2007 1:09

Ребят, а можно вопрос "на засыпку"? Зачем надо тянуть еще и массив? Что, нельзя:

...
reset(f);
min := maxlongint; { <-- В принципе, можно занести и макс. число для Real }
while not eof(f) do begin
read(f, X);
if X < min then min := X;
end;

reset(f);
p := 1;
while not eof(f) do begin
read(f, X);
if X > 2 * min then p:=p*X;
end;

close(f);
Z:=p;
...

?

Автор: Rocket 5.03.2007 1:09

Большое Тебе человеческое спасибо))) smile.gif