Показать полную графическую версию : Задачка на PASCAL
Crazy Wolf
09-01-2003, 21:48
Приветствую ALL
Недавно подкинули задачу на Паскале.. помогите решить плиз
С помощью ООП составить описание объектного типа TMatrix обеспечивающего размещение матрицы произвольного размера с вариантностью изменения числа строки столюцов и вывода на экран подматрицы любого размера и всей матрицы
Я сам потихоньу изучаю Си и как это сделать на Си++ в принципе знаю... (я надеюсь) но как это сделать на Паскале?
vasketsov
10-01-2003, 12:56
Crazy Wolf
но как это сделать на Паскале?
Точно так же.
XXXX Pro
12-01-2003, 12:43
Чтобы матрица была произвольного размера, память для нее надо выделять динамически, и адреса подсчитывать вручную. (Т.е. к смещению базового адреса прибавить (номер строки-1)*(число столбцов)*размер элемента+(номер столбца-1)*размер элемента)
Все остальное - примерно также, как и в C.
Crazy Wolf
12-01-2003, 17:16
XXXX Pro
А попдробнее....как в Паскале с адресами работать.. если можно кусок любого кода для примера....
Если это учебная программа должна быть написана под ДОС, то мои соболезнования.
Сейчас языки срастаются потихоньку, дерут друг у друга самое ороше, а вот Паскаль 7.... там например выделение памяти через new совсем не так как в С работает.
В С как просто было
char *str = new char[20];
//не нужно стало
delete []str;
А в паскале так и не получилось динамически выделять память, (у меня конечно) он постоянно хотел знать сколько надо выделять и до маразма дошло - на каждый вариант свой тип данных вводить, под который он уже тогда память динамически выделял. Может и проще можно
Crazy Wolf
14-01-2003, 16:40
Ну тогда рискуя вызвать общий гнев попрошу привести кусок кода с использованием ООП в ПАСКАЛЕ....
Добавлено:
Т.е. я так понимаю что в Паскале нужно создать подобие класса в Си++.... как это делать?
vasketsov
14-01-2003, 18:33
type
TElement = Integer;
TRow = class
Items:array of TElement;
end;
TMatrix = class
Rows:array of TRow;
end;
Вот примерно так.
Я извиняюсь, конечно, это работать будет только в Delphi мне кажется, потому что границы массива не определены. (учитывая стиль T??????, тем более)
а под ДОС можно было *в функцию передавать массив без границ, только он его извлекать не хотел.
Crazy Wolf
А на чем писать надо, может "мой" досовский паскаль и не нужен?
Исправлено: Crew, 8:14 15-01-2003
shurikan
15-01-2003, 09:09
Crew
(учитывая стиль T??????, тем более)
Не факт, что это Delphi. Нормальное Поскакальное обьявление. Похоже на стандарт Delphi - да, но и только.
vasketsov
А это тягомотно. Можно проще, правда без функций-членов:
Crazy Wolf
(допустим, тебя попросили в данный момент создать матрицу 6x7)
TMatrix = class
public:
*V: Variant;
*constructor Create(const Bounds: array of Integer);
end;
constructor TMatrix.Create(const Bounds: array of Integer);
begin
*V := VarArrayCreate(Bounds, varInteger);
end;
Matrix: TMatrix;
begin
*Matrix.Create([1,6,1,7]); {Первая пара нач. и конеч. индексы первого измерения,
вторая пара - соотв для второго. Нумеруются от 1 до 6 и от 1 до 7}
*Matrix.V[1,1] := 1; {и т.д.}
end.
Исправлено: shurikan, 9:12 15-01-2003
Да! Это на Delphi
Исправлено: shurikan, 9:17 15-01-2003
Crazy Wolf
15-01-2003, 20:22
Crew
А на чем писать надо, может "мой" досовский паскаль и не нужен?
Как я понял он то и нужен.... поэтому и затеял эту дискуссию... Просто не слышал что бы в обычном Паскале такие вещи вершить можно.....
Crazy Wolf
На обычном досовском Паскале можно, но я тебе примерчик без ООП сделал, просто по работе с динам. памятью:
uses crt,dos;
Type
pint=^integer;
pbyte=^byte;
pstring=^string;
Var
x,y,i,j,N,temp:integer;
size:longint;
Matrix:pointer;
{А вот это универсальная функция, позволяющая}
{работать с динам. данными, как с обычным массивом}
{p - имя динам. переменной, V - размер одного элемента в матрице в байтах, N - число столбцов, i - координата по вертикали, j - координата по горизонтали}
{координаты считаются от единицы!}
function GetElem(var p:pointer;N,V,i,j:integer):pointer;
var adr:longint;
* * p1:pointer;
begin
adr:=((i-1)*N+(j-1))*V;
p1:=pointer(longint(p)+adr);
GetElem:=p1;
end;
BEGIN
clrscr;
{спросим размерность матрицы}
readln(x);{число столбцов}
readln(y);{число строк}
N:=x
{Допустим матрица со значениями типа integer
в досевом паскале переменная типа integer занимает 2 байта,
в Delphi - 4 байта}
{Выделяем динамич. память}
size:=(x)*(y)*2;
getmem(Matrix,size);
//Пример бестолковой работы с матрицей
i:=3;{номер строки}
j:=4;{номер столбца}
pint(GetElem(Matrix,N,2,i,j))^:=temp;
temp := pint(GetElem(Matrix,N,2,i,j))^;
{Освобождаем динамич. память}
freemem(Matrix,size);{можно не делать, если конец программы}
END.
Успешной сдачи!
Исправлено: Animal, 23:34 15-01-2003
Animal
Этот даже я себе скопирую, пригодится :bow:
shurikan
16-01-2003, 03:57
Animal
{Выделяем динамич. память}
size:=(x)*(y)*2;
getmem(Matrix,size);
Я бы не стал использовать константу, представляющую в д. случае размер типа Integer. Лучше использовать sizeof
shurikan
Я не писал оптимальный с т.зрения эффективности или с т.зрения красоты/краткости написания код. Это просто пример по работе с динамической памятью в досовском паскале, на мой взгляд довольно наглядный. Кстати, если смотреть формально, то использование функции вместо константы замедлит работу.
vasketsov
16-01-2003, 12:52
shurikan
Тем более что он будет равен 4, если в Win32.
Crazy Wolf
17-01-2003, 00:28
2ALL
Большое сенкс...дошло до меня теперь....
Будете в Славном городе Стерлитамаке, что в Башкирии
:beer: :oszone:
shurikan
17-01-2003, 04:06
Animal
использование функции вместо константы замедлит работу.
sizeof вовсе не функция, если применяется для типа, вместо неё компилятор подставляет константу. В случае DOS - это будет 2, ну а для Win32, как правильно заметил vasketsov - 4. И не в красоте дело, просто её использование позволяет писать переносимый код. :)
shurikan
17-01-2003, 07:38
Я тут глянул и понял, что немного облажался: :(
Matrix.Create([1,6,1,7]); {Первая пара нач. и конеч. индексы первого измерения,
*вторая пара - соотв для второго. Нумеруются от 1 до 6 и от 1 до 7}
Должно быть так:
Matrix := TMatrix.Create([1,6,1,7]);
Поскольку конструктор - функция класса.
Извините...:shuffle:
Исправлено: shurikan, 7:39 17-01-2003
vasketsov
17-01-2003, 14:51
shurikan
Animal
В случае .NET вообще sizeof запрещено как небезопасный код.
shurikan
Да знал я, знал, что в Win32 тип integer 4 байта, в коментариях ведь написано в моем первом посте - почитай! Смысл то примера - простая работа с динам. памятью на стандартном паскале DOS и только.
vasketsov
Странно, что может быть небезопасного в функции sizeof. Это ни к тому, что я тебе не верю, просто любопытно.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.