Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > Delphi, Kylix and Pascal


Ответ
 
Опции темы Опции просмотра
Старый 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 вне форума   Ответить с цитированием

Старый 12.03.2012, 00:51
Helpmaster
Member
 
Аватар для Helpmaster
 
Регистрация: 08.03.2016
Сообщений: 0

Рекомендую не терять времени, а ознакомиться с похожими топиками

База данных одним файлом
Операции с файлом
Работа с текстовым файлом, Pascal
Проблема с файлом

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

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

Цитата:
Сообщение от ayPinki Посмотреть сообщение
где кнопка редактировать?
- Выходит не 0, а первый положительный(или если их нет первый отрицательный) + правая граница диапазона, как я понял. т.е. вообще бред.
вообще уже голова не варит.
ayPinki вне форума   Ответить с цитированием
Старый 12.03.2012, 10:53   #4 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от ayPinki Посмотреть сообщение
ВЫХОДИТ 0-ЛЮТО БЕШЕНО НЕНАВИЖУ
Дорогой друг, прежде всего - позволю себе дать Вам один совет, основанный на, увы, собственном горьком опыте. Много лет назад, когда я начинал заниматься программированием, я также эмоционально реагировал на неподатливые к выявлению ошибки. Кончилось это плачевно - визитами к врачам. С тех пор я сказал себе раз и навсегда:
"Я - программист, а следовательно, могу отладить любую, по крайней мере собственную, программу и найти любую ошибку, нужно лишь спокойно и не торопясь взяться за дело, и всё получится".
Так оно и было. Чего и Вам от души советую.
Теперь по Вашей программе. Ниже приведен полностью отлаженный листинг. Да, есть несколько ошибок. В частности, обратите внимание: оператор Seek(f,i) нумерует компоненты файла не с 1, а с 0, и это надо учитывать. Что касается нулевой суммы, то она возникает, если максимальный и минимальный элемент (поиск которых я, кстати, загнал в один цикл) расположены в соседних позициях - так и быть должно. Ну или если элементы сложатся так, что получится 0 - тоже возможно.
Кроме того, Вы не задали исходных значений максимума и минимума - тоже ошибка.
Ну, вроде, так, в основном, всё.
Код:
program ABC;
var
 a,b,i,maxin,minin,max,min,sum,right,left :integer;
 f,f1:file of integer;
begin
 assign(f,'f.dat');
 write('введите первую компоненту файла f (признак конца ввода: "555") ');
 //ввод файла
 rewrite(f);
 readLn(b);
 i:=1; //номер компоненты файла
 while b<>555 do
  begin
   write(f,b);
   inc(i);
   write('введите ',i:2,'-ую компоненту файла f ');
   readLn(b);
  end;
 reset(f); //вывод файла до изменения
 writeLn('файл f до изменения:');
 while not EOF(f) do
  begin
   read(f,b);
   write(b:5);
  end;
 writeLn;
 max:=-32000;
 min:=32000;
 reset(f); // поиск максимума и минимума
 while not EOF(f) do
  begin
   read(f,b);
   if b>max then
    begin
     max:=b;
     maxin:=filePos(f);
    end;
   if b<min then
    begin
     min:=b;
     minin:=filePos(f);
    end;
  end;
 writeln('minin= ',minin,'  maxin= ',maxin);
 sum:=0;
 if maxin>minin then //очередь
  begin
   left:=minin;
   right:=maxin;
  end
 else
  begin
   left:=maxin;
   right:=minin;
  end;
 for i:=left+1 to right-1 do
 begin
  seek(f,i-1);
  read(f,b);
  sum:=sum+b;
 end;
 writeln('Sum= ',sum:5);
 close(f);
 writeLn('файл f после изменения:');
 reset(f);
 assign(f1,'f1.dat');
 rewrite(f1);
 i:=0;
 while not EOF(f) do
  begin
   Inc(i);
   read(f,b);
   if (i<=left) or (i>=right) then
    write(f1,b)
   else
    write(f1,Sum);
  end;
 close(f);
 close(f1);
 reset(f1);
 rewrite(f);
 while not EOF(f1) do
  begin
   read(f1,b);
   write(f,b)
  end;
 close(f);
 close(f1);
 erase(f1);
 reset(f);
 while not EOF(f) do
  begin
   read(f,b);
   write(b:5);
  end;
 readln
end.
Vladimir_S вне форума   Ответить с цитированием
Старый 12.03.2012, 18:00   #5 (permalink)
ayPinki
Member
 
Регистрация: 27.11.2011
Сообщений: 29
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

вы несете светлую толику разума в этот мир, я вас понимаю
однако я учусь не на компьютерщика, а на управленца)
ayPinki вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Старый 13.03.2012, 01:07   #6 (permalink)
ayPinki
Member
 
Регистрация: 27.11.2011
Сообщений: 29
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Вопросики:
что значит
конструкция в конце
writeLn('файл f после изменения:');
reset(f);
assign(f1,'f1.dat');
rewrite(f1);
i:=0;
~~~~~~~~~~~~~~~~`
close(f);
close(f1);
reset(f1);
rewrite(f);
while not EOF(f1) do
begin
read(f1,b);
write(f,b)
end;
close(f);
close(f1);
erase(f1);
reset(f);
while not EOF(f) do
begin
read(f,b);
write(b:5);
end;
readln
end. //
т.е. зачем вы f продублировали в f1? ведь если в массиве не будет изменений(замен на сумму) то можно повторно его же и вывести...
зачем эти reset close постоянно использовать?
в общем там какоето хитросплетение если то, то одно удаляем(эрейзом) и тд... зачем так намудрёно,
объясните, пожалст
ayPinki вне форума   Ответить с цитированием
Старый 13.03.2012, 10:42   #7 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от ayPinki Посмотреть сообщение
т.е. зачем вы f продублировали в f1? ведь если в массиве не будет изменений(замен на сумму) то можно повторно его же и вывести... зачем эти reset close постоянно использовать? в общем там какоето хитросплетение если то, то одно удаляем(эрейзом) и тд... зачем так намудрёно, объясните, пожалст
Пожалст.
Перво-наперво, имеем мы тут дело не с массивами, а с файлами. С массивами было бы проще.
Напомню, что в задаче требуется преобразовать именно исходный файл и результат вывести на экран. Конечно, можно было бы считать данные исходного файла в массив, дальше в массиве заменить в нужном диапазоне исходные элементы сосчитанной суммой, а потом перезаписать файл. Но у меня предлагается решение без перехода к массивам.
Итак, пусть элементы исходного файла f с номерами от i1 до i2 требуется заменить значениями суммы S. Решено так:
1. Открывается на запись второй файл по имени f1.
2. Исходный файл f открывается на чтение.
3. Организуется цикл: из файла f считывается элемент, если его номер (позиция) лежит вне диапазона i1..i2, то он записывается в файл f1, если внутри - то в f1 записывается S.
4. Оба файла закрываются.
5. Файл f1 открывается на чтение, файл f - на запись.
6. Содержимое файла f1 переносится в файл f.
7. Оба файла закрываются.
8. Файл f1 уничтожается - он больше не нужен.
9. Содержимое файла f выводится на экран.
Таким образом, условие задачи выполнено в точности: содержимое файла f преобразовано по требуемому алгоритму, причем без помощи массивов.
P.S. Что-то я не понял вот этой сентенции:
Цитата:
ведь если в массиве не будет изменений(замен на сумму) то можно повторно его же и вывести...
Это, само собой, так - ну а если будут изменения?
Vladimir_S вне форума   Ответить с цитированием
Старый 14.03.2012, 21:10   #8 (permalink)
ayPinki
Member
 
Регистрация: 27.11.2011
Сообщений: 29
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Цитата:
Сообщение от Vladimir_S Посмотреть сообщение
1. Открывается на запись второй файл по имени f1.
2. Исходный файл f открывается на чтение.
3. Организуется цикл: из файла f считывается элемент, если его номер (позиция) лежит вне диапазона i1..i2, то он записывается в файл f1, если внутри - то в f1 записывается S.
4. Оба файла закрываются.
5. Файл f1 открывается на чтение, файл f - на запись.
6. Содержимое файла f1 переносится в файл f.
7. Оба файла закрываются.
8. Файл f1 уничтожается - он больше не нужен.
9. Содержимое файла f выводится на экран.
мб вы просто хотели сказать, что сразу нельзя открывать файл на чтение и на запись?)
ayPinki вне форума   Ответить с цитированием
Старый 15.03.2012, 09:56   #9 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от ayPinki Посмотреть сообщение
мб вы просто хотели сказать, что сразу нельзя открывать файл на чтение и на запись?)
А Вы этого не знали? Ну извините за многословие.
Vladimir_S вне форума   Ответить с цитированием
Старый 15.03.2012, 10:27   #10 (permalink)
ayPinki
Member
 
Регистрация: 27.11.2011
Сообщений: 29
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

ничего страшного, главное я же понял.
спс)
ayPinki вне форума   Ответить с цитированием
Ads

Яндекс

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


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




Часовой пояс GMT +4, время: 19:48.

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.