IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Типизированные файлы
сообщение
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 26
Пол: Мужской

Репутация: -  0  +


Доброго времени суток! Прошу помощи в решении задачи. Заранее спасибо!

Текст задачи.

Сформировать файл G. Определить сумму и произведение наибольшего и наименьшего из значений компонент. Заменить значением суммы первую и последнюю компоненты, а на значение произведения – увеличить каждую третью компоненту файла. Файл вывести до и после преобразования.

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Цитата
Прошу помощи в решении задачи.
"Помощь" и "Получение готового кода" - это разные вещи, если что. Начинай, говори, что сделал, что и где непонятно, подскажем. А делать за тебя - извини, это никому не сдалось...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Новичок
*

Группа: Пользователи
Сообщений: 26
Пол: Мужской

Репутация: -  0  +


Цитата(volvo @ 4.03.2011 22:47) *

"Помощь" и "Получение готового кода" - это разные вещи, если что. Начинай, говори, что сделал, что и где непонятно, подскажем. А делать за тебя - извини, это никому не сдалось...

Здравствуйте! Я разграничиваю эти понятия и прошу именно помощи.

Program Files_1;
var
F: file of integer;
buf:integer;
begin
Assign(F,'.dat');
rewrite(F);
writeLn('Введите первую компоненту файла');
readLn(buf);
while buf<>999 do
begin
write(F,buf);
writeLn('Введите следующую компоненту:');
readLn(buf);
end;
reset(F);
while not EOF(F) do


Дальше, так думаю, необходимо найти экстремельные значения. По аналогии с массивами сделать не удалось, не сумел.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Новичок
*

Группа: Пользователи
Сообщений: 26
Пол: Мужской

Репутация: -  0  +


Вот что еще написал.

     read(F,Min);
write(Min:5);
Max:=Min;
Imin:=0;
Imax:=0;
for i:=1 to filesize(F)-1 do
begin
read(F,buf);
write(buf:5);
if buf>Max then
begin
Max:=buf;
Imax:=i;
end;
if buf<Min then
begin
Min:=buf;
Imin:=i;
end;
end;
writeLn('Наибольшее из значений констант',Max);
writeLn('Наименьшее из значений констант',Min);
close(F);
end.


Ошибка: Попытка чтения за концом файла. Вот на этой стороке read(F,buf);
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


М
Просьба использовать теги! Правила Форума, п.5, и правила раздела Задачи, п.2


Цитата(mfractus @ 4.03.2011 23:37) *
Ошибка: Попытка чтения за концом файла. Вот на этой стороке read(F,buf);
Я правильно понял, что эти два куска нужно соединить? Если да, то..
Ты сначала читаешь файл до конца вот тут:
while not EOF(F) do read(F,Min);
- а потом пытаешься читать дальше. Конечно, будет ошибка.

Я бы искал max и min как-то так: (добавлено: тут ошибка, читайте дальше сообщение volvo)
  reset(f);
read(f,min);
max:= min;
while not eof(f) do begin
read(f,a);
if a<min then min:=a else if a>max then max:=a
end;

А дальше собствено замена, примерно вот так:
  s:= max+min;
p:= max*min;
reset(f);
write(f,s);
seek(f,l-1);
write(f,s);
l:= filesize(f);
n:=2;
while n<l do begin
seek(f,n);
read(f,a);
seek(f,n);
write(f,a+p);
Inc(n,3)
end;
close(f);

Еще замечу, что условие не вполне однозначное. Если последняя компонента в файле окажется еще и "каждой третьей", то результат зависит от порядка выполнения операций. Я в приведенном фрагменте сделал тот порядок, который в условии (не факт, что преп не придерется)). Вникни.


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Новичок
*

Группа: Пользователи
Сообщений: 26
Пол: Мужской

Репутация: -  0  +


Спасибо за ответ! Да, два куска соединить. Вот я тут работал с другой программой, которая вычисляет сумму и произведение.

Текст программы:
Код
[code=pas]
Program Files_0;
var
   F: file of integer;
   S,P, buf:integer;
begin
     Assign(F,'.dat');
     rewrite(F);
     writeLn('Введите первую компоненту файла');
     readLn(buf);
     while buf<>999 do
           begin
                write(F,buf);
                writeLn('Введите следующую компоненту:');
                readLn(buf);
           end;
     S:=0;
     P:=1;
     reset(F);
     while not EOF(F) do
           begin
                read(F,buf);
                S:=S+buf;
                P:=P*buf;
           end;
           writeLn('Найденная сумма равна:',S);
           writeLn('Найденное произведение равно:',P);
           close(F);
end.



Возник вопрос, read(F,buf); тоже стоит после while not EOF(F) do, тем не менее программа исправно работает. В чем тут дело не пойму.

Сообщение отредактировано: mfractus -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Гость






Цитата
Возник вопрос, read(F,buf); тоже стоит после while not EOF(F) do, тем не менее программа исправно работает. В чем тут дело не пойму.
При чем тут, где стоит Read? Как только дойдешь до конца файла, цикл While тут же завершится, то есть если сейчас ты прочел последнюю запись, то следующая итерация начнется с проверки EOF(f). Проверка вернет "ложь", и цикл прекратит выполняться, ты сразу перейдешь к строке, печатающей результаты.

А ты в приведенном выше фрагменте нигде на EOF не проверял, отсюда и ошибка. Да, да... Даже если тебе и кажется, что ее там нет: твои ощущения - очень ненадежная штука; оставь заботу о том, чтоб не читать за концом файла, компилятору. У него это получится лучше.

И, наконец, пользуйся комбобоксом CODE, неужели ты действительно не видишь разницы, как выглядит код с подветкой, а как - без нее?

Добавлено через 8 мин.
И потом. Почему вы так любите делать ненужную работу? Первая компонента файла отличается от всех остальных? За что ей такая честь, быть прочитанной отдельно, вне цикла? Если я сделаю цикл:

Min := maxint; Imin := -1;
Max := -maxint; Imax := -1;

while not Eof(f) do
begin
read(f, buf);

if buf > Max then
begin
Max:=buf; Imax:=i;
end;
if buf < Min then
begin
Min:=buf; Imin:=i;
end;
end;
, я что-то упущу? Нет, мой код будет выполняться ровно так, как и должен. Зато ошибки не будет.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


> Возник вопрос, read(F,buf); тоже стоит после while not EOF(F) do, тем не менее программа исправно работает. В чем тут дело не пойму.

read(F, buf) стоит внутри цикла, в условии которого стоит while not EOF(F).
А то, что оно по тексту после - ну базовые управляющие структуры надо же знать, что после чего там должно выполняться.


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(volvo @ 5.03.2011 11:13) *
Зато ошибки не будет.

Совершенно согласен, +1.
Сглупил я, однако )).

(Добавлено: ) хотя, else я все же оставил бы..


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


> За что ей такая честь, быть прочитанной отдельно, вне цикла?

Для инициализации максимума и минимума первым элементом.
Для целых чисел можно обойтись -MaxInt-1, а для вещественных или строк или ещё чего придётся уже делать иначе. Но выносить первый элемент наружу всё равно не надо.



first := true;
while not Eof(f) do begin
read(f, buf);

if (buf > Max) or first then begin
first := false;
Max:=buf;
Imax:=i;
end;

if (buf < Min) or first then begin
first := false;
Min:=buf;
Imin:=i;
end;

end;




--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Интересно, как иногда совсем несложный вопрос становится интересным предметом для обсуждения.. smile.gif

Во-первых, должен признать, что вот тут:
Цитата(Lapp @ 5.03.2011 11:43) *
(Добавлено: ) хотя, else я все же оставил бы..
- я снова ощибся. Если вносить чтение первого элемента в цикл, то ELSE применять нельзя. Извиняюсь. Но это наводит на другие мысли (см. ниже)..

Цитата(TarasBer @ 5.03.2011 12:18) *
Для целых чисел можно обойтись -MaxInt-1, а для вещественных или строк или ещё чего придётся уже делать иначе. Но выносить первый элемент наружу всё равно не надо.
first := true;
while not Eof(f) do begin
read(f, buf);

if (buf > Max) or first then begin
first := false;
Max:=buf;
Imax:=i;
end;

if (buf < Min) or first then begin
first := false;
Min:=buf;
Imin:=i;
end;

end;

А мне не нравится добавление новой (логической) переменной и проверка ее на каждом проходе цикла..

Короче, я повторюсь, что в первом моем фрагменте кода есть ошибка, и ее необходимо исправить. Предложено два варианта, но в обоих есть некоторый недостаток - трата времени в цикле. Если мой код подправить вот так:
  reset(f);
if not eof(f) then begin
read(f,min);
max:= min;
while not eof(f) do begin
read(f,a);
if a<min then min:=a else if a>max then max:=a
end;
{обработка результатов}
end
else writeln('файл пуст');

- то, может, с потерей элегантности, исполняться он будет более эффективно smile.gif. Лишний код - не всегда лишняя работа (компьютера) smile.gif. И не надо забывать, что после нахождения макс и мин все равно придется обрабатывать ситуацию с пустым файлом при обработке результатов (см. задание). А в этом варианте она обрабатывается за один раз..


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


> - то, может, с потерей элегантности, исполняться он будет более эффективно

Соглашусь, что иногда и так приходится делать.

(хотя в данном случае, при работе с файлами, смысла нет)


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


Новичок
*

Группа: Пользователи
Сообщений: 26
Пол: Мужской

Репутация: -  0  +


Спасибо всем, кто принял участие в дискуссии! А оператор close(F); один раз должен встречаться в программе?

Добавлено через 3 мин.
Как участок кода вставить в исходный?

Код

s:= max+min;
  p:= max*min;
  reset(f);
  write(f,s);
  seek(f,l-1);
  write(f,s);
  l:= filesize(f);
  n:=2;
  while n<l do begin
    seek(f,n);
    read(f,a);
    seek(f,n);
    write(f,a+p);
    Inc(n,3)
  end;
  close(f);


Вот сюда:

Код

Program Files_1;
var
   F: file of integer;
   buf,Imin,Imax,Min,Max,i:integer;
begin
     Assign(F,'.dat');
     rewrite(F);
     writeln('Введите компоненты файла целые числа, окончание ввода 999:');
     while buf<>999 do
      begin
       readLn(buf);
       if buf<>999 then write(F,buf);
      end;
     reset(F);
     writeln('Исходный файл:');
     read(F,Min);
     write(Min,' ');
     Max:=Min;
     Imin:=0;
     Imax:=0;
     for i:=1 to filesize(F)-1 do
      begin
       read(F,buf);
       write(buf,' ');
       if buf>Max then
        begin
         Max:=buf;
         Imax:=i;
        end;
       if buf<Min then
        begin
         Min:=buf;
         Imin:=i;
        end;
      end;
     close(F);
     writeln;
     writeLn('Наибольшее из значений компонент=',Max);
     writeLn('Наименьшее из значений компонент=',Min);
end.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #14


Новичок
*

Группа: Пользователи
Сообщений: 26
Пол: Мужской

Репутация: -  0  +


Вот что получилось, но где то ошибка, точнее код - одна сплошная ошибка smile.gif

Program Files_1;
var
F: file of integer;
buf,Imin,Imax,Min,Max,i,S,P,b,a:integer;
begin
Assign(F,'.dat');
rewrite(F);
writeln('Ââåäèòå êîìïîíåíòû ôàéëà öåëûå ÷èñëà, îêîí÷àíèå ââîäà 999:');
while buf<>999 do
begin
readLn(buf);
if buf<>999 then write(F,buf);
end;
reset(F);
writeln('Èñõîäíûé ôàéë:');
read(F,Min);
write(Min,' ');
Max:=Min;
Imin:=0;
Imax:=0;
for i:=1 to filesize(F)-1 do
begin
read(F,buf);
write(buf,' ');
if buf>Max then
begin
Max:=buf;
Imax:=i;
end;
if buf<Min then
begin

Min:=buf;
Imin:=i;
end;
end;
close(f);
writeLn;
S:=0;
P:=1;
S:=Min+Max;
writeLn('Ñóììà=',S);
P:=Min*Max;
writeLn('Ïðîèçâåäåíèå=',P);
reset(F);
begin
reset(F);
seek(F,0);
read(F,a);
seek(F,filesize(F)-1);
read(F,b);
a:=S;
b:=S;


end;
if i mod 3=2 then
begin
read(F,buf);
buf:=buf+p;
seek(F,i);
write(F,buf);
end;


close(F);
reset(F);
while not eof(f) do
begin
read(f,buf);
write(buf,' ');
end;

close(f);
writeLn('Íàèáîëüøåå èç çíà÷åíèé êîìïîíåíò=',Max);
writeLn('Íàèìåíüøåå èç çíà÷åíèé êîìïîíåíò=',Min);
writeln('Ñîäåðæàíèå èçìåíåííîãî ôàéëà:');
writeLn('ïåðâûé êîìïîíåíò=',a);
writeLn('ïîñëåäíèé êîìïîíåíò=',b);
end.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 20.04.2024 21:11
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name