Помощь - Поиск - Пользователи - Календарь
Полная версия: Задача по формированию файлов
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Nolan
Помогите пожалуйста найти ошибку в исходнике такой задачи:
Ввести целую квадратную матрицу A (N,N) (N<=10) Из положительных ее элементов сформировать файл F. Из файла F сформировать файл G, в который сначала записать сумму всех элементов файла F, затем максимальное значение файла F, затем все его компоненты в обратном порядке. Файл G выдать на печать.


program Project3;
 const
   Nmax = 10;
   Kmax = Nmax*Nmax;
  type
    MATRIX = array[1..Nmax,1..Nmax] of integer;
    aFile = File of integer;
    VECTOR = array[1..Kmax] of integer;
  var
  A : matrix;
  N : integer;
  F : aFile;
  G : aFile;
  procedure EnterMatrix(var X : matrix; var aN : integer; ch : char);
  var
  i,j : integer;
  begin
  write('Vvedite razmernost matrizi: ');
  readln(aN);
  for i := 1 to aN do
  for j := 1 to aN do
  begin
  write(ch,'[',i,',',j,']=');
  readln(X[i,j]);
  end;
  end;
  Procedure CreateF(Const x : Matrix; aN : integer; var aF : aFile);
   Var
   i:integer;
   j:integer;
   Begin
   Rewrite (aF);
   for i:=1 to N do
   begin
   for j:=1 to N do
   if x[i,j]>0 then
   Write (aF,A[i,j]);
   end;
   Close (aF);
   end;
function Sum(var aF : aFile): integer;
 var
 S,X : integer;
 begin
 Reset(aF);
 S:=0;
 while not EOF(aF) do
 begin
 read(aF,X);
 S:=S+X;
 end;
 Sum:=S;
 close(aF);
 end;
 function Maximum(var aF : aFile): integer;
 var
 Y,x,max : integer;
 begin
 Reset(aF);
 read(aF,Y);
 max:=Y;
 while not EOF(aF) do
 begin
 read(aF,x);
 if Y<x
 then begin
 max:=x;
 end;
 Y:=x;
 end;
 Maximum:=max;
 Close(aF);
 end;
 procedure Preobr(var aF,aG : aFile);
 var
 X,i,S,max : integer;
 begin
 Reset(aF);
 ReWrite(aG);
 S:=Sum(aF);
 max:=Maximum(aF);
 write(aG,S);
 write(aG,Max);
 for i := FileSize(aF)-1 downto 0 do
 begin
 read(aF,X);
 write(aG,X);
 end;
 Close(aF);
 Close(aG);
 end;
 procedure OutFile(var aG : aFile; ch : char);
 var
 X1 : integer;
 begin
 Reset(aG);
 while not EOF(aG) do
 begin
 read(aG,X1);
 writeln(ch,'[',FilePos(aG),']=',X1:4);
 end;
 Close(aG);
 end;
 begin
 Assign(F,'F.dat');
 Assign(G,'G.txt');
 EnterMatrix(A,N,'A');
 CreateF(A,N,F);
 Preobr(F,G);
 OutFile(G,'G');
 readln;
 end.
volvo
Ну, во-первых, недочет... Функцию Maximum я бы написал так:
function Maximum(var aF : aFile): integer;
var
  x,max : integer;
begin
  Reset(aF);
  max := -maxInt;
  while not EOF(aF) do begin
    read(aF, X);
    if max < X then max:=x;
  end;
  Maximum:=max;
  Close(aF);
end;

Ну, а во-вторых - ошибка:
for i := FileSize(aF)-1 downto 0 do begin
  read(aF,X);
  write(aG,X);
end;
не значит, что данные из файла aF будут читаться с конца в начало... Вот так правильно:
Reset(aF); { Если я не ошибаюсь, Maximum закрыл файл? }
for i := FileSize(aF)-1 downto 0 do begin
  Seek(aF, i); { <--- !!! }
  read(aF,X);
  write(aG,X);
end;
Nolan
После выполнения программы компилятор выдает сообщение что файл F не может быть открыт...

volvo
объясни пожалуйста смысл данной строки:
max := -maxInt;
klem4
MaxInt - паскалевская константа = 32767, тут используется для того чтобы уже перовое значение прочитанное из файла являлось максимумом, так как в integer нет числа меньше -MaxInt
volvo
Цитата
После выполнения программы компилятор выдает сообщение что файл F не может быть открыт...

blink.gif Это как так? У меня нормально компилируется и выполняется (с моими исправлениями)... Вот лог:
Цитата
Vvedite razmernost matrizi: 3
A[1,1]=2
A[1,2]=3
A[1,3]=4
A[2,1]=-4
A[2,2]=5
A[2,3]=10
A[3,1]=-11
A[3,2]=12
A[3,3]=-3
G[1]=  36
G[2]=  12
G[3]=  12
G[4]=  10
G[5]=  5
G[6]=  4
G[7]=  3
G[8]=  2
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.