IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Задача по формированию файлов, Помогите найти ошибку
сообщение
Сообщение #1





Группа: Пользователи
Сообщений: 8
Пол: Мужской

Репутация: -  0  +


Помогите пожалуйста найти ошибку в исходнике такой задачи:
Ввести целую квадратную матрицу 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.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Ну, во-первых, недочет... Функцию 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;
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3





Группа: Пользователи
Сообщений: 8
Пол: Мужской

Репутация: -  0  +


После выполнения программы компилятор выдает сообщение что файл F не может быть открыт...

volvo
объясни пожалуйста смысл данной строки:
max := -maxInt;


Сообщение отредактировано: Nolan -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Perl. Just code it!
******

Группа: Пользователи
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


MaxInt - паскалевская константа = 32767, тут используется для того чтобы уже перовое значение прочитанное из файла являлось максимумом, так как в integer нет числа меньше -MaxInt


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Гость






Цитата
После выполнения программы компилятор выдает сообщение что файл 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
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 8.09.2025 6:21
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name