Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > Delphi, Kylix and Pascal


Ответ
 
Опции темы Опции просмотра
Старый 20.08.2012, 10:55   #1 (permalink)
Gabarityanin
Member
 
Регистрация: 10.08.2012
Сообщений: 27
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 25
По умолчанию Есть ли такая функция?

Доброго времени суток всем. Прошу не кидать тухлыми помидорами, но последняя программка на Паскале родилась у меня лет 15 назад, все подзабыл. Сейчас пробую написать программу, озадачился вопросом, как задать массив вида NxN, вводя данные с клавиатуры. Хочется сделать это в общем виде, т.е. не

For i:=1 to 10 do

а примерно
Write('Введите размерность массива N ->'); ReadLn(N);
....

Понятно, что ручками больше 10x10 массив трудно вводить (да и 10x10 затруднительно), но я, как математик, хочу все сделать в общем виде. Программку пишу на PascalABC, нашел функцию для одномерного массива SetLength(X,N). Для двумерного она, есессно, не работает. Есть аналог для двумерного массива, или как-то по другому придется?
Если будет совсем сложно, за помощью, кэшна, обращусь, но ведь хочется сначала самому...
Gabarityanin вне форума   Ответить с цитированием

Старый 20.08.2012, 10:55
Helpmaster
Member
 
Аватар для Helpmaster
 
Регистрация: 08.03.2016
Сообщений: 0

Пожалуйста, обратите внимание - это похожие на вашу темы

Есть CPU, есть Sapphire Radeon HD 7850 920Mhz
Вот такая есть задумка

Старый 20.08.2012, 11:13   #2 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от Gabarityanin Посмотреть сообщение
Хочется сделать это в общем виде, т.е. не For i:=1 to 10 do а примерно Write('Введите размерность массива N ->'); ReadLn(N); ....
Ну, если Вас устроят статические массивы, то нет ничего проще. В начале задаете в виде константы максимально возможное значение размерности массива, например
Код:
Const
 Nmax=25;
Далее в разделе описания переменных:
Код:
Var
 N:Integer;
 A:Array[1..Nmax,1..Nmax];
 ...
Ну а потом собственно в теле программы
Код:
Begin
 write('N= ');
 readln(N);
 for i:=1 to N do
  for j:=1 to N do
   begin
     write('A[',i:2,',',j:2,']= ');
     readln(A[i,j]);
   end;
 ...
Но если Вы хотите использовать динамическую адресацию, то тут всё много сложнее и запутаннее: придется разворачивать двумерный массив в одномерный путем пересчета индексов. Иначе никак.
Подробнее этот вопрос рассмотрен мною здесь:
Перемножение матриц
Vladimir_S вне форума   Ответить с цитированием
Старый 20.08.2012, 13:55   #3 (permalink)
Gabarityanin
Member
 
Регистрация: 10.08.2012
Сообщений: 27
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 25
По умолчанию

Спасибо большое, Владимир. Как создавать статистический массив я помню еще со времен старика Бейсика Интересовал именно динамический массив. Наверное, слишком замудрено. Придется обойтись статическим. Еще раз большое спасибо.
Gabarityanin вне форума   Ответить с цитированием
Старый 20.08.2012, 14:02   #4 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от Gabarityanin Посмотреть сообщение
Еще раз большое спасибо.
Да не за что...
Vladimir_S вне форума   Ответить с цитированием
Старый 20.08.2012, 19:06   #5 (permalink)
kreol
Member
 
Аватар для kreol
 
Регистрация: 27.02.2010
Сообщений: 659
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 1312
По умолчанию

дельфи поддерживает динамические массивы.
нужно объявить просто переменную без длины.
Код:
var arr: array of integer;
потом использовать функцию
Код:
SetLength(arr,n);
можно ипользовать и двумерные массивы.
обхявляется как
Код:
 var arr: array of array of integer;
SetLength ну и в передавать уже три параметра.

как-то так
kreol вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Старый 20.08.2012, 19:25   #6 (permalink)
Gruvi
VIP user
 
Аватар для Gruvi
 
Регистрация: 10.03.2011
Сообщений: 765
Записей в дневнике: 1
Сказал(а) спасибо: 10
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 3453
По умолчанию

в делфи можно пользоваться статическими массивами.
Gruvi вне форума   Ответить с цитированием
Старый 21.08.2012, 06:05   #7 (permalink)
AlexZir
support
 
Аватар для AlexZir
 
Регистрация: 19.08.2007
Адрес: Зея
Сообщений: 15,797
Записей в дневнике: 71
Сказал(а) спасибо: 166
Поблагодарили 203 раз(а) в 86 сообщениях
Репутация: 75760
По умолчанию

Вообще-то топикстартера изначально интересовал механизм использования динамических массивов под PascalABC, спрашивается, при чем тут Delphi? Разве что упор сделан на ObjectPascal.

Однако согласен, что можно объявить массив именно так, как предложил Андрей, без явного объявления размерности.
AlexZir вне форума   Ответить с цитированием
Старый 21.08.2012, 11:14   #8 (permalink)
kreol
Member
 
Аватар для kreol
 
Регистрация: 27.02.2010
Сообщений: 659
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 1312
По умолчанию

Цитата:
Сообщение от AlexZir Посмотреть сообщение
Вообще-то топикстартера изначально интересовал механизм использования динамических массивов под PascalABC
ое-ей. точно. что-то я протупил. у меня как динамический массив так дельфи))) (из паскалевских)
kreol вне форума   Ответить с цитированием
Старый 21.08.2012, 11:55   #9 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от AlexZir Посмотреть сообщение
Однако согласен, что можно объявить массив именно так, как предложил Андрей, без явного объявления размерности.
Дорогие коллеги, еще раз обращаю внимание на одну тонкость. Это очень важно. Да, пожалуйста - можете задать двумерный массив без объявления размерности, не в этом суть. А вот попробуйте запустить программу отсюда: Перемножение матриц . Там двумерный массив изначально задан одноэлементным - ради Бога, при динамической адресации это не важно. Важно другое - оператор присваивания (и обращения к элементу) вида
A^[i,j]:=
устроен так, что не учитывает порядка расположения индексов, т.е. A^[2,3] и A^[3,2] указывают на ОДНУ И ТУ ЖЕ область памяти. Поэтому при последовательном заполнении двумерного массива введенное значение A^[2,3] будет потеряно, как только дойдем до A^[3,2]. Причем никаких сообщений об ошибках, предупреждений и т.п. выдано не будет! Вот на что я хочу обратить особое внимание. А как его там задать-описать - это не проблема.
Vladimir_S вне форума   Ответить с цитированием
Старый 11.11.2012, 16:25   #10 (permalink)
kreol
Member
 
Аватар для kreol
 
Регистрация: 27.02.2010
Сообщений: 659
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 1312
По умолчанию

Цитата:
Сообщение от Vladimir_S Посмотреть сообщение
Важно другое - оператор присваивания (и обращения к элементу) вида
A^[i,j]:=
устроен так, что не учитывает порядка расположения индексов, т.е. A^[2,3] и A^[3,2] указывают на ОДНУ И ТУ ЖЕ область памяти.
В дельфи эту проблему как-то обошли...
kreol вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




Часовой пояс GMT +4, время: 21:52.

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.