Показать сообщение отдельно
Старый 12.03.2012, 00:51   #1 (permalink)
ayPinki
Member
 
Регистрация: 27.11.2011
Сообщений: 29
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию Работа с числовым файлом

Задан числовой файл . Найти сумму компонент, стоящих между минимальной и максимальной. Заменить этой суммой все элементы из которых она сформирована (элементы между максимумом и минимумом). Файл вывести как до, так и после преобразования.

1)Во втором листинге есть ошибка,но я даже СМОТРЯ на правильный код, не могу сделать как надо, я уже просто люто бешено... найдите и объясните что не так
2)и ещё почему в первом листинге в 29 строке конец для цикла for выбран
"filesize(f)-1" откуда и зачем этот -1?
собственно вот рабочая программа:

[pascal]
program ABC;
uses crt;
var b,Imin,Imax,Max,Min,i,left,right,S:integer;
f:file of integer;
begin
clrscr;
assign(f,'f.dat');
writeLn('введите первую компоненту файла f (признак конца ввода: "555")');
//ввод файла
rewrite(f);
readLn(b);
i:=1; //номер компоненты файла
while b<>555 do
begin
write(f,b);
inc(i);
writeLn('введите ',i,'-ую компоненту файла f');
readLn(b);
end;
clrscr;
reset(f);
writeLn('файл f до изменения:');
read(f,min);//читаем первое число, оно пока мин и макс}
write(min:5);
max:=min;
imin:=0;
imax:=0;
for i:=1 to filesize(f)-1 do
begin
read(f,b);
write(b:5);
if b>max then
begin
max:=b;
imax:=i;{макс}
end;
if b<min then
begin
min:=b;
imin:=i;{мин}
end;
end;
writeLn;
close(f);
reset(f);
if imin<imax then //порядок
begin
left:=imin;
right:=imax;
end
else
begin
left:=imax;
right:=imin
end;
s:=0;
for i:=left+1 to right-1 do//считаем сумму
begin
seek(f,i);
read(f,b);
s:=s+b;
end;
close(f);
writeln('Сумма=',s);
reset(f);
for i:=left+1 to right-1 do // вставляем сумму
begin
seek(f,i);
write(f,s);
end;
close(f);
reset(f);
writeLn('файл f после изменения:');
while not EOF(f) do
begin
read(f,b);
write(b:5);
end;
readln;
close(f);
end.
[/pascal]

И вот второй вариант, проблема помечена
[pascal]
program ABC;
var a,b,i,maxin,minin,max,min,sum,right,left :integer;
f:file of integer;
begin
assign(f,'f.dat');
writeLn('введите первую компоненту файла f (признак конца ввода: "555")');
//ввод файла
rewrite(f);
readLn(b);
i:=1; //номер компоненты файла
while b<>555 do
begin
write(f,b);
inc(i);
writeLn('введите ',i,'-ую компоненту файла f');
readLn(b);
end;
reset(f); //вывод файла до изменения
writeLn('файл f до изменения:');
while not EOF(f) do
begin
read(f,b);
write(b:5);
end;
writeLn;
reset(f); // поиск максимума
while not EOF(f) do
begin read(f,b);
if b>max then
begin
max:=b; maxin:=filePos(f);
end; end;
reset(f); // поиск минимума
while not EOF(f) do
begin
read(f,b);
if b<min then
begin
min:=b; minin:=filePos(f);
end; end;
write('minin=',minin,'maxin=',maxin);
writeln;

if maxin>minin then //очередь
begin
left:=minin;
right:=maxin;
end
else
begin
left:=maxin;
right:=minin;
end;
sum:=0;
reset(f);
for i:=left+1 to right-1 do //ЗДЕСЬ ПРОБЛЕМА !!!!!!!!!!!!!!
begin
seek(f,i);
read(f,b);
sum:=sum+b;
end;
write(sum:5); //ВЫХОДИТ 0-ЛЮТО БЕШЕНО НЕНАВИЖУ
close(f);

end.






[/pascal]
ayPinki вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070