Помощь - Поиск - Пользователи - Календарь
Полная версия: Файл\\\
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Rocket
Дан файл вещественных чисел. Посчитать произведение компонентов файлов,которые больше удвоенного минимального компонента. Вот сама программа:
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
мисс_граффити
вот тут в циклах ошибка.
если отформатируешь программу по-человечески, она станет очевидна:
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
Цитата(мисс_граффити @ 4.03.2007 20:15) *
вот тут в циклах ошибка.

Спасибо. А как тогда переделать?
мисс_граффити
 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
Ребят, а можно вопрос "на засыпку"? Зачем надо тянуть еще и массив? Что, нельзя:
...
  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
Большое Тебе человеческое спасибо))) smile.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.