Создание типизированного файла вещественных чисел.

OgriBah

Нужно: Создать типизированный файл вещественных чисел, задать с клавиатуры номер компоненты N, с которой необходимо удалить K элементов файла. Вывести компоненты исходного и усеченного файлов. Дополнительный файл для решения задачи не использовать.
6 ответов

OgriBah

Прошу помогите срочно!


OgriBah

uses crt;
 
var f: file of real;
x:real;
a:array [1..100] of real;
i,n,k,l,y:integer;
 
begin
clrscr;
     assign(f,'input.dat');
     rewrite(f);
Write('Количество чисел - '); readln(l);
for i:=1 to l do
   begin
   randomize;
   x:=random*10;
   write(f,x);
   end;
clrscr;
Writeln('Файл вещественных чисел создан!');
reset(f);
Write('С какой позиции удалять ? N(<=',filesize(f),') = '); readln(n);
write('Сколько чисел удалить ? K(<=',filesize(f)-n,') = '); readln(k);
Writeln('Компоненты исходного файла.');
while not eof (f) do
  begin
  read(f,x);
  write(x:0:2,' ');
  if (filepos(f)<n) or (filepos(f)>n+k) then
      begin
        inc(y);
        a[y]:=x;
      end;
  end;
rewrite(f); writeln;
Writeln('Компоненты усеченного файла.');
For i:=1 to y do
  begin
  write(f,a[i]);
  write(a[i]:0:2,' ');
  end;
close(f);
readln;
end.


OgriBah

У меня только один вопрос, почему все числа одинаковые?


OgriBah

Прошу прощения писал в abc и не проверил в TP . Вот рабочий код :
uses crt;
 
var f: file of real;
x:real;
a:array [1..100] of real;
i,n,k,l,y:integer;
 
begin
clrscr;
     assign(f,'input.dat');
     rewrite(f);
Write('Skol`ko chisel - '); readln(l);
randomize;
for i:=1 to l do
   begin
   x:=random*10;
   write(f,x);
   end;
clrscr;
Writeln('File sozdan!');
reset(f);
Write('S kakoi pozicii udoljat` N(<=',filesize(f),') = '); readln(n);
write('Skol`ko chisel udalit` ? K(<=',filesize(f)-n,') = '); readln(k);
Writeln('Ishodnyi file.');
while not eof (f) do
  begin
  read(f,x);
  write(x:0:2,' ');
  if (filepos(f)<n) or (filepos(f)>n+k) then
      begin
        inc(y);
        a[y]:=x;
      end;
  end;
rewrite(f); writeln;
Writeln('Usechennyi file.');
For i:=1 to y do
  begin
  write(f,a[i]);
  write(a[i]:0:2,' ');
  end;
close(f);
readln;
end.


OgriBah

В предыдущем варианте найдена серьёзная уязвимость переполнения буфера!Если передать переменной L значение больше 100,то массив переполнится и программа улетит в даун! Учителя мне говорили что в задачах на файлы не следует вообще пользоваться массивами. Предлагаю свой вариант:
Program Files;
Uses crt;
Var x:real;
    i,j,n,k,m:integer;
    F:File of real;
Begin
  Clrscr;
  Assign(F,'C:\t.dat');
  ReWrite(F);
  Write('Кол-во элементов в файле ');
  ReadLn(n);
  ////Создание файла////////
  Randomize;
  for i:=1 to n do
  begin
    X:={i;//}0.3*random(34);
    Write(F,x);
    Write(X:5:3,' ');
  end;
  Writeln;
  Write('Введите номер компоненты N ');
  ReadLn(n);
  Write('Введите сколько элементов нужно удалить ');
  ReadLn(k);
  ReSet(F);
  J:=FileSize(F);
  m:=K+n;
  if m<=J-1 then
  begin
    Seek(F,m+1);
    for i:=0 to k-1 do
    begin
      Seek(F,m+i-1);
      Read(F,x);
      Seek(F,FilePos(F)-k-1);
      Write(F,X);
    end;
    
    for i:=0 to j-m do
    begin
      Seek(F,m+i-1);
      Read(F,x);
      Seek(F,FilePos(F)-k-1);
      Write(F,X);
    end;
  end  else
  begin
    WriteLn('Ошибка ввода! ');
    Close(F);
    Halt;
  end;
Seek(F,J-k);
Truncate(F);
WriteLn('Получилось: ');
ReSet(F);
While Not eof(F) do
begin
  Read(F,x);
  Write(X:5:3,' ');
end;
readln;
Close(F);
end.


OgriBah

А можно ли создать такуюже программу только с выводом и текстового файла и типизированного. Причем в текст файле можно было прочесть результаты работы программы?