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

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

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

2 страниц V  1 2 >  
 Ответить  Открыть новую тему 
> Вывод матрицы в файл, Матрица выводится в файл в виде строки или столбца
сообщение
Сообщение #1


Новичок
*

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

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


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


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.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Злостный любитель
*****

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

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


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

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

Сообщение отредактировано: TarasBer -


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


Новичок
*

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

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


Цитата(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. Как обойти или расширить выделяемую Паскалем память.
Может быть есть какие-нибудь директивы. Боюсь для сеток не хватит памяти.
Или мне на Питон перейти, он вроде как родной для Линукса?

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


Злостный любитель
*****

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

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


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


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


Новичок
*

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

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


На FPC линуксовом и работаю, спасибо.
Не знал, что там нет ограничений на память. blink.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Злостный любитель
*****

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

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


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


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


Новичок
*

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

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


Тарас, благодарю за помощь. Прошу еще немного терпения.
Тема еще не закрыта.
Я хочу сделать модификацию этой самой программы,
но так, чтобы она считывала данные с исходного файла по частям.
Скажем, в файле несколько матриц размером 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 файла на чтение сразу?


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


Злостный любитель
*****

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

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


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

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

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


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


Новичок
*

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

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


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

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

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


Злостный любитель
*****

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

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


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


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


Новичок
*

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

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


Цитата(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 и спокойно
считывать и работь с этими матрицами.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Гуру
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик

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


Файл данных совсем нельзя привести, на котором у тебя происходит некорректная работа программы? Чтоб не выдумывать что-то свое, а взять то, что у тебя УЖЕ не работает и проверить...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


Злостный любитель
*****

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

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


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

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


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


Новичок
*

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

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


Цитата(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 -вторая ...).
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #15


Злостный любитель
*****

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

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


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

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



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


Новичок
*

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

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


Цитата(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.



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

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


Гуру
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик

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


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

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

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


Новичок
*

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

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


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

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


А как это сделать?
У меня FPC под Linux.
И я начинающий. Подскажите.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #19


Гуру
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик

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


Читай выше, я написал в чем проблема...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #20


Новичок
*

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

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


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

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

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

 





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