Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.04.2012, 13:37   #1
ayPinki
Пользователь
 
Регистрация: 11.12.2009
Сообщений: 97
По умолчанию Работа с числовым файлом. исправишь? код внутри)

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

говорят давай делай чтобы без использования дополнительного файла, но нельзя же сразу открыть на запись и на чтение.

код:
Код:
 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.

Последний раз редактировалось Stilet; 15.04.2012 в 15:45.
ayPinki вне форума Ответить с цитированием
Старый 15.04.2012, 13:46   #2
whatever
a.k.a. Skull
Форумчанин
 
Регистрация: 17.11.2009
Сообщений: 963
По умолчанию

Вместо втрого файла берешь массив и с ним работаешь. Мне кажется это изначально было очевидно, зачем со вторым файлом заморачиваться?
Все тривиальное просто
whatever вне форума Ответить с цитированием
Старый 15.04.2012, 13:46   #3
mekkanizer
 
Аватар для mekkanizer
 
Регистрация: 15.04.2012
Сообщений: 7
По умолчанию

Код:
//~~~~~~~~~~~~~~~ вот от сюда изменять
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);
//~~~~~~~~~~~~~~~ вот до сюда

Последний раз редактировалось Stilet; 15.04.2012 в 15:56.
mekkanizer вне форума Ответить с цитированием
Старый 15.04.2012, 15:39   #4
ayPinki
Пользователь
 
Регистрация: 11.12.2009
Сообщений: 97
По умолчанию

я уже пробовал по разному, не работает.
как по вашему это - реализуйте же.
mekkanizer, эмм что?)
ayPinki вне форума Ответить с цитированием
Старый 15.04.2012, 20:43   #5
mekkanizer
 
Аватар для mekkanizer
 
Регистрация: 15.04.2012
Сообщений: 7
По умолчанию

ну я может не понял чего но там вроже точки с запятой в конце строки не хватает
mekkanizer вне форума Ответить с цитированием
Старый 16.04.2012, 06:31   #6
whatever
a.k.a. Skull
Форумчанин
 
Регистрация: 17.11.2009
Сообщений: 963
По умолчанию

Объявляешь m: array of integer;
Потом так:
Код:
reset(f);
// assign(f1,'f1.dat');
// rewrite(f1);
 i:=0;
 while not EOF(f) do
  begin
   Inc(i);
Setlength(m,i)
   read(f,b);
   if (i<=left) or (i>=right) then
    m[i-1]:=b;
   else
    m[i-1]:=sum;
  end;
 close(f);
// close(f1);
// reset(f1);
 rewrite(f);
 for I:=0 to high (m) do
Write (f,m[i]);
 close(f);
// erase(f1);
p.s.пишу с мобилы, так что проверяй

p.p.s.mekkanizer, если не знаешь, то лучше запусти и проверь. Перед end символ ";" можно не ставить
Все тривиальное просто
whatever вне форума Ответить с цитированием
Старый 16.04.2012, 10:23   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от whatever
Объявляешь m: array of integer;
Ну ладно. пойдёт, если у автора вопроса Delphi (FreePascal).

НО Зачем в данной задаче динамические массивы и вообще массивы, когда можно банально ПОВТОРНО открыть файл и прочитать значения из него?!!

я бы предложил такой код для решения данной задачи (основываясь на коде TC ):
Код:
program ABC;
var
  b, i, MaxIn, MinIn, max, min,
    sum, left, right: integer;
  f: file of integer;
begin
  assign(f, 'f.dat');
  reset(f); {//вывод файла до изменения}
  writeLn('файл f до изменения:');
  while not EOF(f) do
  begin
    read(f, b);
    write(b: 5);
  end;
  writeLn;
  close(f);

  maxIn := -1;
  minIn := -1;
  reset(f); {// поиск максимума и минимума}
  i := 0;
  while not EOF(f) do
  begin
    read(f, b);
    if MaxIn = -1 then begin
      max := b;
      MaxIn := i;
    end
    else
      if b > max then begin
        max := b;
        MaxIn := i;
      end;

    if MinIn = -1 then begin
      min := b;
      MinIn := i;
    end
    else
      if b < min then begin
        min := b;
        MinIn := i;
      end;

    Inc(i);
  end;

  writeln('min=', min, ' at pos ', MinIn+1, ' max= ', max, ' at pos ', MaxIn+1);

  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);
    read(f, b);
    sum := sum + b;
    Write(b: 3);
    if i < (right-1) then Write('+')
  end;
  WriteLn;
  writeln('Sum= ', sum: 5);


  {заменим все элементы между min/max в файле на сумму}
  reset(f);
  for i := left + 1 to right - 1 do
  begin
    seek(f, i);
    write(f, sum);
  end;
  Close(f);


  reset(f);
  writeLn('файл f после изменения:');
  while not EOF(f) do
  begin
    read(f, b);
    write(b: 5);
  end;
  writeLn;
  close(f);

  readln
end.

Последний раз редактировалось Serge_Bliznykov; 16.04.2012 в 10:48.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 16.04.2012, 10:49   #8
TinMan
Форумчанин
 
Аватар для TinMan
 
Регистрация: 05.09.2011
Сообщений: 869
По умолчанию

Цитата:
Сообщение от ayPinki Посмотреть сообщение
но нельзя же сразу открыть на запись и на чтение.
[/CODE]
Это что за новости? Кто сказала, что это нельзя?...
Цитата:
Procedure Reset (var F) Открывает существующий файл для чтения или изменения.
Эта задача прекрасно решается без второго файла. Открой файл reset'ом, найди нужную сумму, а потом используй Seek, чтоб встать в нужное место - и пиши нужное число.

Упс, sorry - Серж уже это сделал! )).
Серж, только reset перед записью - лишний, мне кажется. Все будет прекарсно работать и без него.
Предпочитаю на "ты".

Последний раз редактировалось TinMan; 16.04.2012 в 10:53.
TinMan вне форума Ответить с цитированием
Старый 16.04.2012, 10:51   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от TinMan Посмотреть сообщение
Это что за новости? Кто сказала, что это нельзя?...

Эта задача прекрасно решается без второго файла. Открой файл reset'ом, найди нужную сумму, а потом используй Seek, чтоб встать в нужное место - и пиши нужное число.
Ага. всё точно так.
и мой код чуть выше (TinMan не мог его увидеть, когда писал свой пост) прекрасно иллюстрирует это.

Последний раз редактировалось Serge_Bliznykov; 16.04.2012 в 10:54.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 16.04.2012, 12:38   #10
whatever
a.k.a. Skull
Форумчанин
 
Регистрация: 17.11.2009
Сообщений: 963
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
НО Зачем в данной задаче динамические массивы и вообще массивы, когда можно банально ПОВТОРНО открыть файл и прочитать значения из него?!!
Так то да, не обратил внимания, что файл типизированый.
Все тривиальное просто
whatever вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Осуществить операцию типа. Код внутри TYMON C++ Builder 0 07.04.2012 13:33
ошибки в задаче(код внутри) skanku Общие вопросы C/C++ 2 10.01.2012 08:58
Переделать цикл. Код внутри =) Silverstone Помощь студентам 4 21.12.2011 22:12
Нахождение слов-анаграмм, Ошибка выдается. Задание внутри. Код внутри. TYMON Общие вопросы .NET 2 22.11.2010 21:07
Прошу помочь переделать.Код внутри.С++ BackSlash Помощь студентам 1 10.01.2010 20:36