Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Типизированный файл

Автор: MayBe 13.03.2009 23:10

Помогите, пожалуйста, решить задачу
Создать файл целых чисел. Определить суммы между локальными минимумами, записав их в новый файл.

Автор: amega 13.03.2009 23:55

ну с файлом все просто


type
TFile = file of integer;
...
var
f:tfile;
...



Цитата
Определить суммы между локальными минимумами


незнаю как по руски но какой "окіл"?

Автор: Айра 14.03.2009 3:25

Цитата
незнаю как по руски но какой "окіл"?

Ну уж мы то тем более не знаем, что это на русском.. Может ты имел в виду интервал, на котором нужно искать минимум?

Автор: amega 14.03.2009 20:41

Цитата
Ну уж мы то тем более не знаем


Просто я с украин и у мну лекции на укр идут по вышке дак вспомнил определение типа лок минимуму, там типа знайдеться такий дельта окил(типа промежуткана котором расматривается).....

Цитата
Может ты имел в виду интервал

ага ток мне слово интервал роишло в голову когда прочитал сабж blum.gif

Автор: MayBe 14.03.2009 21:11

в условии задачи никакой интервал задан не был...

Автор: andriano 14.03.2009 23:08

Так в чем проблема?
Локальный минимум - любая точка от второй до предпоследней такая, что оба ее соседа больше. Т.к. в задании употреблено слово "между", значит, сами эти локальные минимумы не включаются. Естественно, никакая окрестность (по всей видимости, именно она имелась в виду, а не интервал) к данной задаче никакого отношения не имеет.

Автор: MayBe 22.03.2009 18:40

хееелп cray.gif

Автор: klem4 23.03.2009 0:59

В чем проблема ? Пока не достигли конца файла пытаетесь читать по три значения от текущего (пользуйтесь seek), если удалось прочитать 3 значения и если второе прочитанное меньше 1-го и третьего, значит оно - лок. мин.

Автор: amega 23.03.2009 1:59

Цитата
пытаетесь читать по три значения от текущего (пользуйтесь seek)
да но после сравнения нужно на 2 значения вернутся назад, и начинать считовать с 2 елемента

Автор: klem4 23.03.2009 2:07

Цитата
да но после сравнения нужно на 2 значения вернутся назад, и начинать считовать с 2 елемента


И что ? Юзая seek это не вызовет никаких трудностей с реализацией по крайней мере. Да и не надо никуда возвращаться. В каждый момент мы будем хранить номер текущего (первого в тройке) элемента.

Автор: amega 23.03.2009 3:16

все наши мысли можна проверить если автор даст исходные и результируещее данные smile.gif

Автор: Айра 23.03.2009 3:26

Ну как бы файл можно заполнить и рэндомно, а потом посмотреть самим smile.gif

Автор: MayBe 23.03.2009 19:31

файл итак надо заполнять рандомно...

Автор: Айра 23.03.2009 21:06

Ну вот) Какие у самого мысли, попытки - делись ))

Автор: MayBe 24.03.2009 2:07

на счёт рандомно - я имел ввиду первоначальный файл... его я создал (с этим проблем нет)
а вот с нахождением суммы возникли проблемы

Program z1;
uses crt;
var f, f1: file of integer;
a, b, c, d, i, min, sum, k, l: integer;
begin
clrscr;
randomize;
assign (f1, 'f1.pas');
assign (f, 'f.pas');
rewrite (f);
b:=10;
for i:=1 to b do
begin
a:=random(50)+25;
write (f,a);
end;
while not eof(f) do
begin
read (f,a);
write (a:4);
end;
close (f);
l:=0;
reset(f);
i:=0;
While i<filesize(f)-4 do
begin
read (f, b, c, d);
if (c<b) and (c<d) then
begin
sum:=sum+b;
seek(f,i);
i:=i+2;
end
else if c>d then
begin
sum:=sum+b;
seek(f,i);
i:=i+1;
end
else
begin
sum:=sum+b+c;
seek(f,i);
i:=i+2;
end;
rewrite(f1);
write (f1,sum);
close (f1);
sum:=0;
end;
reset(f);
for i:=0 to filesize(f)-1 do
begin
read (f,a);
write (a:4);
end;
writeln;
reset (f1);
read (f1,a);
write (a:4);
readln;
end.

Автор: amega 24.03.2009 2:29

давай по порядку
все вот это


b:=10;
for i:=1 to b do
begin
a:=random(50)+25;
write (f,a);
end;
while not eof(f) do
begin
read (f,a);
write (a:4);
end;
close (f);
l:=0;
reset(f);
i:=0;


можно записать как


writeln('введите количество чисел ');
readln(b);
for i:=1 to b do
begin
a:=random(50)+25;
write (f,a);
write(a:4);
end;
readln; //дляя просмотра чисел, можно и не писать.
seek(f,0)
l:=0;
i:=0;



все вот ето лудше переределать на фунции
 While i<filesize(f)-4 do
begin
read (f, b, c, d);
if (c<b) and (c<d) then
begin
sum:=sum+b;
seek(f,i);
i:=i+2;
end
else if c>d then
begin
sum:=sum+b;
seek(f,i);
i:=i+1;
end
else
begin
sum:=sum+b+c;
seek(f,i);
i:=i+2;
end;
rewrite(f1);
write (f1,sum);
close (f1);
sum:=0;
end;


тоесть нужно сначала провеку зделать вдруг там 2 или 1 число;
if filesize(f)<3 then 
begin
writeln('min nety');
readln;
halt;
end;


мини функция
function my(a,b,c:integer):boolean;
begin
my:=false;
if (b<c) and (b<a) then my:=true
end;


потом
i:=0;
while i<=filesize(f)-3 do
begin
read(f,a,b,c);
if my(a,b,c) then sum:=sum+b;
seek(f,i+2);
i:=i+1;
end;

и потом sum записіваеш в файл