Помощь - Поиск - Пользователи - Календарь
Полная версия: Вывод матрицы в файл
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Vasya_linux
Здравствуйте уважаемые форумчане!
Задача: Ввод матрицы из файла и вывод этой же матрицы под
другим именем в другой файл (файлы задаются пользователем).
В итоге на экран вывод нормальный, а в файл только в строку или в столбец.
Где ошибка не пойму. Помогите пожалуйста.
Вот код:


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
Ты забыл кое-что:

for j:=1 to m do
write(f,new_matr[i,j]:8:3);
writeln(f);
end;
Vasya_linux
Цитата(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
Ограничения по памяти связаны с тем, что Турбопас под дос и реальный режим, у которого с памятью хреново. Короче, FPC линуксовый возьми, там нет ограничений на память.
Что такое сеточные вычисления - не знаю.
Vasya_linux
На FPC линуксовом и работаю, спасибо.
Не знал, что там нет ограничений на память. blink.gif
TarasBer
Ты только в настройках компилятора поройся хорошенько, там это есть.
Выставь 32-битный режим например.
Vasya_linux
Тарас, благодарю за помощь. Прошу еще немного терпения.
Тема еще не закрыта.
Я хочу сделать модификацию этой самой программы,
но так, чтобы она считывала данные с исходного файла по частям.
Скажем, в файле несколько матриц размером 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
В чём проблема? Матрицы последовательно считываются из файла, да.

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

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

Проблема в том, что этот код не работает. Выводятся 0.
TarasBer
хз.
Почему первая матрица читается в строки
for i:=1 to 2 do
а вторая в
for i:=3 to N do
Vasya_linux
Цитата(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
Файл данных совсем нельзя привести, на котором у тебя происходит некорректная работа программы? Чтоб не выдумывать что-то свое, а взять то, что у тебя УЖЕ не работает и проверить...
TarasBer
Но ты совместил эти пути, считывая в разные строки разных матриц.

Хотя обрабатываешь (делаешь покомпонентное умножение) ты их так, будто ты считывал в один строки.
Vasya_linux
Цитата(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
Ты работаешь с данными так, словно они находятся в разных матрицах:

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
Цитата(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
Цитата
Да просто заполните матрицу так:
А теперь просто зайди в отладчик и посмотри, что прочиталось из файла smile.gif

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

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


А как это сделать?
У меня FPC под Linux.
И я начинающий. Подскажите.
IUnknown
Читай выше, я написал в чем проблема...
Vasya_linux
Хорошо, но в моей последней редакции кода все нормально.
Т.е. матрицы считываются каждая со своего файла, но воз и ныне там.
Код не работает. Где ошибка ???
3 файла, 2 матрицы, 3-я матрица результирующая.
И все, этого достаточно.
Помогите пожалуйста.
IUnknown
Твоя последняя редакция даже не компилируется, потому что нельзя одновременно называть 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
Цитата(IUnknown @ 13.01.2012 13:22) *

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

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


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

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

Модераторам и ВСЕМ кто помогал огромная благодарность
за Ваше терпение.
Тема закрыта.
IUnknown
Может надо в настройках IDE (вот тут я показывал, как это можно сделать, под Linux-ом то же самое) выставить показ ошибок (или делать это в ком. строке, если ты IDE не используешь)? Нормально компилятор показывает ошибки, даже больше того, не только ошибки, а и хинты и предупреждения.
Vasya_linux
Цитата(IUnknown @ 13.01.2012 13:59) *

Может надо в настройках IDE (вот тут я показывал, как это можно сделать, под Linux-ом то же самое) выставить показ ошибок (или делать это в ком. строке, если ты IDE не используешь)? Нормально компилятор показывает ошибки, даже больше того, не только ошибки, а и хинты и предупреждения.


Очень полезно, буду знать.
Thanks.
TarasBer
А что, ФПЦ по умолчанию ошибки не показывает? Смысл этой опции "не говорить, где"?
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.