Помощь - Поиск - Пользователи - Календарь
Полная версия: Сортировка в типизированном файле.
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
MrPerec
Здравствуйте.
Пожалуйста помогите с типизированным файлом. По заданию числовые данные должны хранится в текстовом файле (файл создается любым способом и данные заносятся так же любым способом) после из текстового файла они переносятся в:
- массив;
- типизированный файл.
Где обрабатываются по одному и тому же алгоритму и выполнить в виде 2х процедур не связанных между собой (например, при обработке типизированного файла не ссылаться на размер массива и т.д)
Алгоритм: Из исходных данных удалить повторяющиеся числа. Определить среднее арифметическое оставшихся чисел и записать его на первое место, сдвинув остальные числа.

В массиве я сделал как просилось в условии но в типизированном файле совершенного ничего не понимаю. Пожалуйста помогите.

Код:
uses crt;
const n=10;
var
f:text;
i:integer;

PROCEDURE MASSIV;
var
a:array[1..n] of integer;
j,k,m,summa:integer;
sr_a:real;
begin
{\\\Чтение из текстового файла в массив///}
clrscr;
writeln('Исходный массив:');
reset(f);
i:=0;
while not seekeof(f) do
begin inc(i);
read(f,a[i]);
write(a[i],' ');
end;
{\\\Удаление повторяющихся чисел, определение среднего арифметического оставшихся чисел и его запись на первое место///}
k:=0;
for i:=1 to n do
begin m:=0;
for j:= 1 to k do
if a[i]=a[j] then
inc(m);
if m=0 then
begin inc(k);
a[k]:=a[i];
end;
end;
writeln;
writeln('Результат:');
summa:=0;
for i:=1 to k do
begin summa:=summa+a[i];
end;
sr_a:=summa/k;
write(sr_a:0:2,' ');
for i:=1 to k do
write(a[i],' ');
end;

PROCEDURE TIP_FILE;
var
f1:file of real;
data:integer;
begin
writeln;
writeln;
{\\\Создание типизированного файла///}
assign(f1,'Tip_File.int');
rewrite(f1);
{\\\Чтение из текстового файла и запись в типизированный файл ///}
reset(f);
writeln('Даннные в типизированном файле:');
while not seekeof(f) do
begin read(f,data);
write(f1,data);
write(data,' ');
end;
{\\\Удаление повторяющихся чисел, определение среднего арифметического оставшихся чисел и его запись на первое место///}

close(f1);
end;

BEGIN
{\\\Создание и запись числовых данных в текстовый файл///}
assign(f,'File.txt');
rewrite(f);
for i:=1 to n do
repeat
write(f,random(9));
write(f,' ');
until i=i;

MASSIV;
TIP_FILE;
close(f);
end.
Rian

writeln('Даннные в типизированном файле:');
while not seekeof(f) do
begin read(f,data);
write(f1,data);
write(data,' ');
inc(max)//запомнить количество элементов в типизированном файле
end;
{\\\Удаление повторяющихся чисел, ///}
writeln('tipis file clear');
reset(f1);
zero:=0;
i:=0;

while not eof(f1) do begin
inc(i);
read(f1, k1);
write(k1:4:2, ' ');

for j:=i to max-1 do begin
seek(f1, j);
read(f1, k2);

if k2=k1 then begin
seek(f1, j);
write(f1, zero);
end;
end;

seek( f1, i );

end;





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

PROCEDURE TIP_FILE;
var
f1 : file of integer;
summa : integer;
curr_p, p, k, m : longint;
ai, aj : integer;
begin
writeln;
writeln;
{\\\Создание типизированного файла///}
assign(f1,'Tip_File.int');
rewrite(f1);
{\\\Чтение из текстового файла и запись в типизированный файл ///}
reset(f);
writeln('Даннные в типизированном файле:');
while not seekeof(f) do
begin
read(f,ai);
write(f1,ai);
write(ai,' ');
end;
writeln;

curr_p := 0;
k := -1;
summa := 0;
while curr_p < filesize(f1) do
begin
seek(f1, curr_p); read(f1, ai);
m := 0;
p := -1;
while p < k do
begin
inc(p);
seek(f1, p); read(f1, aj);
if ai = aj then inc(m);
end;
if m = 0 then
begin
inc(k);
seek(f1, k); write(f1, ai);
summa := summa + ai;
end;
inc(curr_p);
end;
inc(k);
seek(f1, k);
truncate(f1);

reset(f1);
write((summa / k):0:2, ' ');
while not eof(f1) do
begin
read(f1, ai);
write(ai, ' ');
end;
writeln;
close(f1);
end;
MrPerec
Спасибо за помощь smile.gif
NinaKkady
smile.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.