Помощь - Поиск - Пользователи - Календарь
Полная версия: Сортировка в типизированном файле.
Форум «Всё о Паскале» > 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
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.