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

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

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

3 страниц V  1 2 3 >  
Closed Topic Открыть новую тему 
> Обработка прямоугольных матриц
сообщение
Сообщение #1


Новичок
*

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

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


Задана большая матрица вещественных чисел размером 1000 на 2000 в текстовом файле.

Необходимо произвести попарную обработку обработку ее строк, т.е.
для каждой пары СТРОКАi и СТРОКАj строк необходимо вычислить функцию от элементов этих строк, например, Ain - элементы СТРОКИi и Bjn - элементы СТРОКИj.
Из результатов вычисления функции F(Ai1,...,Ai1000;Bj1,...,Bj2000) сформировать новую матрицу и записать в новый файл.

Подскажите как мне действовать.
Насколько я понимаю с большими массивами Borland Pascal не работает.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Пионер
**

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

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


Цитата(ProtasSoft @ 12.08.05 18:18)
Насколько я понимаю с большими массивами Borland Pascal не работает.


Используй динамическую матрицу.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Гость






Цитата(ProtasSoft @ 12.08.05 17:18)
Насколько я понимаю с большими массивами Borland Pascal не работает.

Borland Pascal - нет. Зато Free Pascal прекрасно работает... Вот это только что откомпилировалось у меня в FPC:
var
a: array[1 .. 1000, 1 .. 2000] of real;
begin
a[1, 1] := 0;
end.

И никаких ошибок не возникло. Будем изобретать велосипед, или перенести тему в 32-битные компиляторы, и будем решать задачу?

P.S.
Цитата(kent @ 12.08.05 17:27)

Дело все в том, что
Array[1 .. 1000, 1 .. 2000] Of Real
это почти 12Мб. Сможешь получить столько памяти в "куче"?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Новичок
*

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

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


У меня нет Free Pascal. Если поделитесь дистрибутивом, то буду благодарен и готов решать задачу на этом компиляторе.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Гость






Последнюю версию (2.0.0) можно взять на официальном сайте (российское зеркало): http://www.freepascal.org/down-i386-win32-russia.html (21 Мб)

Ссылка на 1.0.10 - здесь: FPC
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Профи
****

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

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


Цитата(ProtasSoft @ 12.08.05 17:18)
Насколько я понимаю с большими массивами Borland Pascal не работает.


Совсем не обязательно считывать сразу весь массив. Достаточно считать две строки, записать результат и продолжить в том же духе smile.gif
Есть и другие варианты.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Гость






Цитата(Malice @ 12.08.05 19:05)
Есть и другие варианты.

... изобретения велосипеда. А зачем? Если на 32-битном компилере задача решается "влет", и нет ограничения на использование этих компиляторов?

Тем более, что придется как минимум 2000 раз проходить по файлу (и значительная часть проходов будет "холостыми"), потому как
Цитата
т.е. для каждой пары СТРОКАi и СТРОКАj строк необходимо вычислить функцию от элементов этих строк
. Я бы не заморачивался с построчным чтением...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Профи
****

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

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


Согласен, не подумай, что я против FP, но вдруг это нужно по условию. Если нет, то нет, конечно же.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


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

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

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


А вот мое мнение что FPC тут не выход, так как наверняка задание пишется не "для себя" , а для препода в универе smile.gif А в универах наших FPC пока не ставят, так что сдать такой код не получится...надо думать.


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


Гость






klem4,
Цитата(ProtasSoft @ 12.08.05 17:51)
Если поделитесь дистрибутивом, то буду ... готов решать задачу на этом компиляторе.

Если бы тебе предложили тот компилятор, которого нет в институте, ты бы такое написал? Давайте все-таки будем исходить не из своих мнений, а из решений автора...

А поэтому - вопрос к автору топика, скачал ли он FPC и будет решать задачу с его помощью или все-таки нужно извращаться с TP?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Новичок
*

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

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


FPC я скачал и установил.

Вопрос следующий: подскажите как считывать матрицы из текстового файла, когда ее элементы расположены в строке и разделены пробелами.
К примеру,
файл может быть таким
================
12,3 23,4 34,6 34,98
23,34 34,5 45,78 56,78
1,06 34,08 34,67 34,67
================
:fire: :fire:
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


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

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

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


Не очень ясен вопрос... могу предположить что тебе нужно следующее :

Считываешь из файла строку, разбиваешь её на числа (наборы символов между пробелами) если надо, сохраняешь в массиве с элементами типа string, и после сохранения или непосредственно после выделения очередного числа переводишь его в числовое представление и работаешь с ним.


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


Гость






ProtasSoft,
не путай такое (Паскаль не использует "," в вещественных числах, используется точка: ".")
Цитата
12,3 23,4 34,6 34,98
23,34 34,5 45,78 56,78
1,06 34,08 34,67 34,67

и правильный вариант:
Цитата
12.3 23.4 34.6 34.98
23.34 34.5 45.78 56.78
1.06 34.08 34.67 34.67

При использовании второго варианта - делать так:
j := 1;
while not eof(f) do begin
for i := 1 to {количество чисел в строке} do begin
read(f, a[j]); inc(j);
end;
readln(f);
end;
 К началу страницы 
+ Ответить 
сообщение
Сообщение #14


Новичок
*

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

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


procedure EnterMatrixFromFile (var Matr: Matrix);

const
n=5;
m=6;
var
i,j: integer;
f:text;
TextElem:string;

begin
assign(f,'matrixdat.txt');
reset(f);
i := 1;
while not eof(f) do
begin
while not eoln(f)do
begin
j:=1;
read(f, Matr[i,j]);
inc(j);
end;
readln(f);
inc(i);
end;


Что здесь не так?

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


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

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

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


у тебя файл текстовый и информация в нем записана в виде строк, а ты пытаешься прочитать число, да и вообще странно как-то твоя процедура выглядит ... тебе нужно либо менять файл на file of single (другой вещественный тип), либо делать то что я тебе писал выше, если хочешь оставить файл текстовым

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


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


Профи
****

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

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


Цитата(ProtasSoft @ 15.08.05 16:32)
Что здесь не так?

j всегда равен 1 ? Поставь j=1 до цикла While.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #17


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

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

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


примерно это должно выглядеть вот так :

{$N+}
uses crt;

const n=3;

type

TArr = array[1..n,1..n] of Extended;
TFile = Text;

var
f_: TFile;
x_: TArr;

procedure ReadFromFile(var x: TArr; var f: TFile);
var

e,i,j,t,back : integer;
tempE : extended;
s,tempS : string;

begin

i:=1; j:=0;

while not(eof(f)) do begin
readln(f, s);
t:=1;
while(t<=length(s)) do begin
while(s[t]=#32) do
inc(t);

if t<=length(s) then begin
back:=t;
while(t<=length(s))and(s[t]<>#32) do
inc(t);

tempS:=copy(s, back, t-back);

Val(tempS,tempE,e);

if j=n then begin
j:=1;
inc(i);
end
else
inc(j);

x[i,j]:=tempE;

end;

end;

end;

end;



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


Гость






klem4, смысл читать содержимое, как строку? Внимательно читаем условие задачи:
Цитата
Задана большая матрица вещественных чисел размером 1000 на 2000 в текстовом файле.
И, если читать 2000 чисел строкой, то в какую строку это должно помещаться? Строка в FPC также ограничена 256 символами...
Так не проще:
ix := 1; iy := 1;
while not eof(f) do begin
for i := 1 to {количество чисел в строке} do begin
read(f, a[ix, iy]); inc(iy);
end;
readln(f); inc(ix)
end;
?

ProtasSoft, в следующий раз, если ты приводишь фрагмент программы с введенными тобой типами, приводи и описания типов тоже. Как, например, я из поста №15 должен знать, что из себя представляет Matrix?
И пользуйся тегами [CОDE][/CОDE]

P.S. Если хочется воспользоваться EoLn(f), то вот так:
ix := 1; iy := 1;
while not eof(f) do begin
while not eoln(f) do begin
read(f, a[ix, iy]); inc(iy);
end;
readln(f); inc(ix)
end;
 К началу страницы 
+ Ответить 
сообщение
Сообщение #19


Профи
****

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

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


Цитата(volvo @ 15.08.05 18:44)
ix := 1; iy := 1;
while not eof(f) do begin
  while not eoln(f) do begin
    read(f, a[ix, iy]); inc(iy);
  end;
  readln(f); inc(ix)
end;



iy тоже, имхо, сбрасывать надо..
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #20


Гость






Да, rolleyes.gif тогда iy := 1 между первым и вторым While-ом
 К началу страницы 
+ Ответить 

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

 





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