Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Вывод матрицы в файл

Автор: Vasya_linux 12.01.2012 15:29

Здравствуйте уважаемые форумчане!
Задача: Ввод матрицы из файла и вывод этой же матрицы под
другим именем в другой файл (файлы задаются пользователем).
В итоге на экран вывод нормальный, а в файл только в строку или в столбец.
Где ошибка не пойму. Помогите пожалуйста.
Вот код:


const
n=2;
m=3;
type
a=array [1..n,1..m] of real;
var
i,j: integer;
f:text;
name,name1: string;
NRM:a; new_matr:a;
begin
writeln('WRITE NAME of DATA FILE');
readln(name); assign(f, name); reset(f);
for i:=1 to N do
for j:=1 to M do
read(f,NRM[i,j]);
readln(f);
close(f);
writeln('WRITE NAME of RESULT FILE');
readln(name1);
assign(f, name1);
rewrite(f);

for i:=1 to n do
for j:=1 to m do
new_matr[i,j]:=NRM[i,j];


writeln (f,'matrisa A' );
for i:=1 to n do
begin
for j:=1 to m do
write(f,new_matr[i,j]:8:3);
writeln;
end;

writeln(f);
close(f);
end.

Автор: TarasBer 12.01.2012 15:38

Ты забыл кое-что:

for j:=1 to m do
write(f,new_matr[i,j]:8:3);
writeln(f);
end;

Автор: Vasya_linux 12.01.2012 15:58

Цитата(TarasBer @ 12.01.2012 11:38) *

Ты забыл кое-что:

for j:=1 to m do
write(f,new_matr[i,j]:8:3);
writeln(f);
end;


Благодарю за оперативность.
Спасибо, выручили крепко.

Но... Появилось еще несколько вопросов.
Посоветуйте пожалуйста.
1. Где можно найти примеры программ на Паскале для сеточных вычислений.
Хотя бы алгоритмы.

2. Как обойти или расширить выделяемую Паскалем память.
Может быть есть какие-нибудь директивы. Боюсь для сеток не хватит памяти.
Или мне на Питон перейти, он вроде как родной для Линукса?

Заранее благодарен.

Автор: TarasBer 12.01.2012 17:11

Ограничения по памяти связаны с тем, что Турбопас под дос и реальный режим, у которого с памятью хреново. Короче, FPC линуксовый возьми, там нет ограничений на память.
Что такое сеточные вычисления - не знаю.

Автор: Vasya_linux 12.01.2012 19:28

На FPC линуксовом и работаю, спасибо.
Не знал, что там нет ограничений на память. blink.gif

Автор: TarasBer 12.01.2012 19:44

Ты только в настройках компилятора поройся хорошенько, там это есть.
Выставь 32-битный режим например.

Автор: Vasya_linux 12.01.2012 20:15

Тарас, благодарю за помощь. Прошу еще немного терпения.
Тема еще не закрыта.
Я хочу сделать модификацию этой самой программы,
но так, чтобы она считывала данные с исходного файла по частям.
Скажем, в файле несколько матриц размером 3х4, но они без
разрывов находятся в файле (т.е. одна матрица под другой).
Программа считывает 1-ю и умножает на 2-ю и выводит в 3-ю.
Так как матрицы одной размерности, то все должно быть хорошо.
Одно удручает - мой код совсем плох.
Если у тебя будет время, подскажи, где ошибка.
Может я неправильно мыслю.
Вот код:

const
n=3;
m=4;
type
a=array [1..n,1..m] of real;
var
i,j: integer;
f:text;
name,name1: string;
NRM,new_matr,old_matr:a;
begin
writeln('WRITE NAME of DATA FILE');
readln(name); assign(f, name); reset(f);
for i:=1 to 2 do {s4itivaem 1-y matrisy iz isxodnogo faila}
for j:=1 to M do
read(f,NRM[i,j]);

for i:=3 to N do {s4itivaem 2-y matrisy iz isxodnogo faila}
for j:=1 to M do
read(f,old_matr[i,j]);

readln(f);
close(f);
writeln('WRITE NAME of RESULT FILE');
readln(name1);
assign(f, name1);
rewrite(f);

for i:=1 to n do
for j:=1 to m do
new_matr[i,j]:=NRM[i,j]*old_matr[i,j];

writeln (f,'matrisa A' );
for i:=1 to 2 do
begin
for j:=1 to 3 do
write(f,new_matr[i,j]:8:2);
writeln(f);
end;

writeln(f);
close(f);
end.


Может мне пораспихивать эти матрицы по файлам.
Но тогда как открыть 3-4 файла на чтение сразу?

Автор: TarasBer 12.01.2012 20:27

В чём проблема? Матрицы последовательно считываются из файла, да.

> Но тогда как открыть 3-4 файла на чтение сразу?

В данном случае это не нужно, но вообще - заводишь 3-4 файловые переменные и каждую связываешь со своим файлом.

Автор: Vasya_linux 12.01.2012 20:49

>>> В чём проблема? Матрицы последовательно считываются из файла, да.

Проблема в том, что этот код не работает. Выводятся 0.

Автор: TarasBer 13.01.2012 13:22

хз.
Почему первая матрица читается в строки
for i:=1 to 2 do
а вторая в
for i:=3 to N do

Автор: Vasya_linux 13.01.2012 15:17

Цитата(TarasBer @ 13.01.2012 9:22) *

хз.
Почему первая матрица читается в строки
for i:=1 to 2 do
а вторая в
for i:=3 to N do


Эту задачу нужно решить двумя путями.
1. В исходном файле данных одна большая матрица, скажем
9х4 9 строк и 4 столбца.
Программа считывает первые 3 строки и 4 столбца - т.е. первую часть
этой матрицы, которая будет самостоятельной матрицей и
над которой можно будет выполнять преобразования.
Далее считываются строки от 4-й по 6-ю включительно и т.д.

2. Но можно и по другому (что в принципе проще)
открыть на чтение 3 файла со своими матрицами 3х4 и спокойно
считывать и работь с этими матрицами.

Автор: IUnknown 13.01.2012 15:38

Файл данных совсем нельзя привести, на котором у тебя происходит некорректная работа программы? Чтоб не выдумывать что-то свое, а взять то, что у тебя УЖЕ не работает и проверить...

Автор: TarasBer 13.01.2012 15:39

Но ты совместил эти пути, считывая в разные строки разных матриц.

Хотя обрабатываешь (делаешь покомпонентное умножение) ты их так, будто ты считывал в один строки.

Автор: Vasya_linux 13.01.2012 15:42

Цитата(IUnknown @ 13.01.2012 11:38) *

Файл данных совсем нельзя привести, на котором у тебя происходит некорректная работа программы? Чтоб не выдумывать что-то свое, а взять то, что у тебя УЖЕ не работает и проверить...


Да просто заполните матрицу так:

1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0
2.0 2.0 2.0 2.0
2.0 2.0 2.0 2.0
2.0 2.0 2.0 2.0
3.0 3.0 3.0 3.0
3.0 3.0 3.0 3.0
3.0 3.0 3.0 3.0

Вот и все данные (1- первая матрица, 2 -вторая ...).

Автор: TarasBer 13.01.2012 16:00

Ты работаешь с данными так, словно они находятся в разных матрицах:


for i:=1 to n do
for j:=1 to m do
new_matr[i,j]:=NRM[i,j]*old_matr[i,j];


Автор: Vasya_linux 13.01.2012 16:03

Цитата(TarasBer @ 13.01.2012 12:00) *

Ты работаешь с данными так, словно они находятся в разных матрицах:

for i:=1 to n do
for j:=1 to m do
new_matr[i,j]:=NRM[i,j]*old_matr[i,j];




Именно так и есть! Просто мне трудно объяснить.
Ладно вот код, который немного иначе построен -
это 2-й вариант:

const
n=3; m=4;
type
a=array [1..n,1..m] of real;
var
i,j: integer;
f1,f2,f3:text;
name1,name2,name3: string;
A,B,C:a;
begin
writeln('WRITE 1 NAME of DATA FILE');
readln(name1); assign(f1, name1); reset(f1);
for i:=1 to N do {s4itivaem 1-y matrisy iz isxodnogo faila 1}
for j:=1 to M do
read(f1,A[i,j]);
readln(f1);
close(f1);

writeln('WRITE 2 NAME of DATA FILE');
readln(name2); assign(f2, name2); reset(f2);
for i:=1 to N do {s4itivaem 2-y matrisy iz isxodnogo faila 2}
for j:=1 to M do
read(f2,B[i,j]);
readln(f2);
close(f2);

writeln('WRITE 3 NAME of RESULT FILE');
readln(name3); assign(f3, name3); rewrite(f3);
for i:=1 to N do
for j:=1 to M do
C[i,j]:=A[i,j]*B[i,j];

writeln(f3,'matrisa C' );
for i:=1 to N do
begin
for j:=1 to M do
write(f3,C[i,j]:8:2);
writeln(f3);
end;

writeln(f3);
close(f3);
end.



Но опять не работает. Я уже замучался сам, да и Вас замучал.
Помогите пожалуйста исправить ошибку(ки).

Автор: IUnknown 13.01.2012 16:13

Цитата
Да просто заполните матрицу так:
А теперь просто зайди в отладчик и посмотри, что прочиталось из файла smile.gif

Цитата
for i:=3 to N do {s4itivaem 2-y matrisy iz isxodnogo faila}
Почему индексация начинается с 3-х? Ты ж должен прочесть матрицу из файла? Файл без тебя передвигает указатель при чтении, твоя задача - затолкуть то, что прочитано, в правильные ячейки. Матрица должна заполняться с ПЕРВОЙ строки, а не с третьей, иначе при умножении одной частично инициализированной матрицы на другую, естественно, получишь нули. А если вынесешь все действия в процедуру - то вообще мусор.

Автор: Vasya_linux 13.01.2012 16:15

Цитата(IUnknown @ 13.01.2012 12:13) *

А теперь просто зайди в отладчик и посмотри, что прочиталось из файла smile.gif


А как это сделать?
У меня FPC под Linux.
И я начинающий. Подскажите.

Автор: IUnknown 13.01.2012 16:18

Читай выше, я написал в чем проблема...

Автор: Vasya_linux 13.01.2012 16:32

Хорошо, но в моей последней редакции кода все нормально.
Т.е. матрицы считываются каждая со своего файла, но воз и ныне там.
Код не работает. Где ошибка ???
3 файла, 2 матрицы, 3-я матрица результирующая.
И все, этого достаточно.
Помогите пожалуйста.

Автор: IUnknown 13.01.2012 17:22

Твоя последняя редакция даже не компилируется, потому что нельзя одновременно называть A и тип и переменную этого типа.

А если заменить название типа на TA, то все прекрасно работает. Содержимое третьего файла выходит таким:

Цитата
matrisa C
2.00 2.00 2.00 2.00
2.00 2.00 2.00 2.00
2.00 2.00 2.00 2.00

Автор: Vasya_linux 13.01.2012 17:48

Цитата(IUnknown @ 13.01.2012 13:22) *

Твоя последняя редакция даже не компилируется, потому что нельзя одновременно называть A и тип и переменную этого типа.

А если заменить название типа на TA, то все прекрасно работает. Содержимое третьего файла выходит таким:


Ура! Заработало!
Гора с плеч. А все потому, что у меня странный компилятор
Турбо Паскаль мне хоть ошибки показывал, а этот просто
не компилировался и все тут.

Новичкам, мне так кажется,
лучше учиться на компиляторе Турбо Паскаль из под Винды,
а потом переходить на fpc (если есть нужда smile.gif ).

Модераторам и ВСЕМ кто помогал огромная благодарность
за Ваше терпение.
Тема закрыта.

Автор: IUnknown 13.01.2012 17:59

Может надо в настройках IDE (http://forum.pascal.net.ru/index.php?showtopic=26854 я показывал, как это можно сделать, под Linux-ом то же самое) выставить показ ошибок (или делать это в ком. строке, если ты IDE не используешь)? Нормально компилятор показывает ошибки, даже больше того, не только ошибки, а и хинты и предупреждения.

Автор: Vasya_linux 13.01.2012 18:06

Цитата(IUnknown @ 13.01.2012 13:59) *

Может надо в настройках IDE (http://forum.pascal.net.ru/index.php?showtopic=26854 я показывал, как это можно сделать, под Linux-ом то же самое) выставить показ ошибок (или делать это в ком. строке, если ты IDE не используешь)? Нормально компилятор показывает ошибки, даже больше того, не только ошибки, а и хинты и предупреждения.


Очень полезно, буду знать.
Thanks.

Автор: TarasBer 13.01.2012 18:15

А что, ФПЦ по умолчанию ошибки не показывает? Смысл этой опции "не говорить, где"?