Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Разное - Несколько затруднений про массивы (Pascal)

Ответить
Настройки темы
Разное - Несколько затруднений про массивы (Pascal)

Аватара для blackeangel

Старожил


Сообщения: 329
Благодарности: 3

Профиль | Отправить PM | Цитировать


Вопрос номер один:
Пишу функцию, она должна принимать двумерный текстовый массив. Как это описать в скобочках?
Вопрос номер 2
Как определить размеры двумерного массива? Один параметр знаю: Length(mass),а как второй?
Вопрос номер 3:
Как создать двумерный массив на основе уже имеющегося? Типа дублера, либо как вариант одинаковый по второму параметру.

Прошу прощения за нубские вопросы, но паскаль был в школе. Сейчас пишу в Lazarus.
___

-------
Забудем боль, забудем страх -
И только ветер в парусах!


Отправлено: 15:32, 10-10-2017

 

Ветеран


Сообщения: 3806
Благодарности: 824

Профиль | Отправить PM | Цитировать


  1. передать ссылку на массив
  2. "определить" - это "узнать" или "задать"? Врочем, это одно и то же: размер массива - константа.
  3. никак

Отправлено: 19:30, 10-10-2017 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для blackeangel

Старожил


Сообщения: 329
Благодарности: 3

Профиль | Отправить PM | Цитировать


Busla,
1. Так?
Код: Выделить весь код
function DelRow(A,B: array of string):array of string;
2. Определить == узнать, причем и кол-во строк и кол-во столбцов
Так?
Код: Выделить весь код
"Высота" = Length(ms);
"(ширина" = Length(ms[0]);
3. Странно, в других языках есть, а тут нет. Сомнительно.
Может не так выразился. Создать новый массив имеющий такую же размерность как у другого массива?
Тогда это будет так?
Код: Выделить весь код
new_mass:array[0..Length(old_mass),0..Length(old_mass[0])] of string;

-------
Забудем боль, забудем страх -
И только ветер в парусах!


Последний раз редактировалось blackeangel, 10-10-2017 в 20:10.


Отправлено: 19:37, 10-10-2017 | #3


Ветеран


Сообщения: 3806
Благодарности: 824

Профиль | Отправить PM | Цитировать


blackeangel, массивы в Pascal (в Lasarus в том числе) определяются на этапе компиляции
Код: Выделить весь код
program
...
var 
  variablename: array [startindex..endindex] of type;
begin
а это:
Код: Выделить весь код
var
  ...
  variablename: array of type;
уже другой язык - ObjectPascal и т.п., и не массивы как таковые

Отправлено: 17:08, 12-10-2017 | #4


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Busla, ему любое подойдёт, лишь бы работало. Суть в том, что определение размера массива должно происходить динамически, в процессе исполнения приложения.

P.S. Я уже несколько раз предлагал коллеге blackeangel перейти к словарям/коллекциям, но он не видит в этом нужды.

Отправлено: 17:24, 12-10-2017 | #5


Аватара для blackeangel

Старожил


Сообщения: 329
Благодарности: 3

Профиль | Отправить PM | Цитировать


Iska, как оказалось на паскале невозможно динамически создавать массивы по ходу кода.

И я рад Вас видеть
На счёт словарей/коллекций/эрей листов.
Если вы мне обьясните как это работает простым деревенским языком, то пойму и буду их использовать.
Если массивы окружают нас в жизни, то словарь только толковый или орфографический.
Массивы это тетрадь в клетку, таблица экселя, 9 стаканов на столе(3х3), графический ключ на телефоне(3х3) и т.д.

-------
Забудем боль, забудем страх -
И только ветер в парусах!


Отправлено: 18:38, 12-10-2017 | #6


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Цитата blackeangel:
Iska, как оказалось на паскале невозможно динамически создавать массивы по ходу кода. »
Как это невозможно? На чистом Паскале — да, но неужто в Object Pascal нет динамических массивов? Вот же ж коллега Busla писал выше об этом:
Dynamic arrays
Dynamic array - Free Pascal wiki

Отправлено: 21:43, 12-10-2017 | #7


Ветеран


Сообщения: 27449
Благодарности: 8086

Профиль | Отправить PM | Цитировать


Цитата blackeangel:
Если вы мне обьясните как это работает простым деревенским языком, то пойму и буду их использовать. »
Простым языком… Ну, давайте попробуем.

Простейший вариант реализован в WSH, в VB и в VBA. Пример демонстрации свойств и методов словаря на WSH, исполнять под консольным cscript.exe:
Скрытый текст
Код: Выделить весь код
Option Explicit

Dim objDictionary
Dim strKey, strValue
Dim arrKeys, arrValues
Dim i


Set objDictionary = WScript.CreateObject("Scripting.Dictionary")

' Сравнение ключей будем производить в текстовом виде
' (тогда будет игнорироваться различие строчных и заглавных букв)
objDictionary.CompareMode = vbTextCompare

' Заполняем словарь парами Ключ/Значение
objDictionary.Add "Ключ1", "Значение1"
objDictionary.Add "Ключ2", "Значение2"
objDictionary.Add "Ключ3", "Значение3"
objDictionary.Add "Ключ4", "Значение4"
objDictionary.Add "Ключ5", "Значение5"
objDictionary.Add "Ключ6", "Значение6"

' Добавим ещё три пары Ключ/Значение
objDictionary.Add "Ключ7", "Значение7"
objDictionary.Add "Ключ8", "Значение8"
objDictionary.Add "Ключ9", "Значение9"

' Заменим значение ключей Ключ3 и Ключ4
objDictionary.Item("Ключ3") = "Мама мыла раму"
objDictionary.Item("Ключ4") = "Рабы не мы, мы не рабы"

' Удалим две пары Ключ/Значение
objDictionary.Remove "Ключ4"
objDictionary.Remove "Ключ5"

' Попытка добавления уже существующего ключа или удаления несуществующего
' вызовет ошибку времени исполнения.
' Чтобы этого избежать, мы можем проверять существование ключа перед данными операциями
If Not objDictionary.Exists("Ключ10") Then
	objDictionary.Add "Ключ10", "Значение10"
End If

If objDictionary.Exists("Ключ6") Then
	objDictionary.Remove "Ключ6"
End If

' Тип значения словаря
WScript.Echo TypeName(objDictionary)
WScript.Echo

' Количество элементов словаря
WScript.Echo objDictionary.Count
WScript.Echo

' Выводим содержимое словаря в виде пары Ключ/Значение, перебирая ключи
For Each strKey In objDictionary.Keys
	WScript.Echo strKey, objDictionary.Item(strKey)
Next
WScript.Echo

' К предыдущему: тип значения objDictionary.Keys — массив типа Variant
WScript.Echo TypeName(objDictionary.Keys)
WScript.Echo

' Поэтому можно задействовать не только цикл вида For Each, но и обычный For…To…Next,
' несмотря на то, что обратиться напрямую по индексу к паре Ключ/Значение нельзя
' (только через промежуточную переменную, иначе лексический анализатор WSH спотыкается)
arrKeys = objDictionary.Keys

For i = LBound(arrKeys) To UBound(arrKeys)
	WScript.Echo i, arrKeys(i), objDictionary.Item(arrKeys(i))
Next
WScript.Echo

' Выводим только значения:
For Each strValue In objDictionary.Items
	WScript.Echo strValue
Next
WScript.Echo

' И аналогично — через For…To…Next
arrValues = objDictionary.Items

For i = LBound(arrValues) To UBound(arrValues)
	WScript.Echo i, arrValues(i)
Next
WScript.Echo

' Выводим пары Ключ/Значение словаря Ключ2 и Ключ10
WScript.Echo objDictionary.Item("Ключ2")
WScript.Echo objDictionary.Item("Ключ10")
WScript.Echo

' Хотя обычно с индексами в словарях не работают, но можно сделать и так
' Выводим третью и четвёртую пары словаря (памятуя, что нумерация массивов идёт с нуля)
WScript.Echo arrKeys(2), objDictionary.Item(arrKeys(2))
WScript.Echo arrKeys(3), objDictionary.Item(arrKeys(3))
WScript.Echo

' Удалим все пары Ключ/Значение
objDictionary.RemoveAll

Set objDictionary = Nothing

WScript.Quit 0

Пример практической реализации — подсчёт количества одинаковых символов в произвольном тексте (дабы не усложнять кодировками, чтением из файла — используем банальную строковую переменную):
Скрытый текст
Код: Выделить весь код
Option Explicit

Dim strText, strSymbol

Dim objDictionary
Dim strKey
Dim i


strText = _
	"И я рад Вас видеть" & _
	"На счёт словарей/коллекций/эрей листов." & _
	"Если вы мне обьясните как это работает простым деревенским языком, то пойму и буду их использовать." & _
	"Если массивы окружают нас в жизни, то словарь только толковый или орфографический." & _
	"Массивы это тетрадь в клетку, таблица экселя, 9 стаканов на столе(3х3), графический ключ на телефоне(3х3) и т.д."

Set objDictionary = WScript.CreateObject("Scripting.Dictionary")

For i = 1 To Len(strText)
	' Извлекаем из строки очередной символ
	strSymbol = Mid(strText, i, 1)
	
	' Если его ещё нет в словаре…
	If Not objDictionary.Exists(strSymbol) Then
		' …то добавляем его и задаём ему значение количества равным 1
		objDictionary.Add strSymbol, 1
	Else
		' …иначе увеличиваем его значение количества на единицу
		objDictionary.Item(strSymbol) = objDictionary.Item(strSymbol) + 1
	End If
Next


WScript.Echo "Symbol", vbTab, "Count"
WScript.Echo "======", vbTab, "====="

For Each strKey In objDictionary.Keys
	WScript.Echo strKey, vbTab, objDictionary.Item(strKey)
Next

objDictionary.RemoveAll

Set objDictionary = Nothing

WScript.Quit 0

В более серьёзных языках, особенно в .Net, добавлены классы, которые не только полностью покрывают такой тип данных как Словарь, но и заметным образом расширяют его возможности, например прямое обращение к паре по индексу (поскольку класс сделан перечислимым), проверка существования значения, сортировка пар и прочее. Что-то похожее есть и во Free Pascal.

Отправлено: 02:22, 13-10-2017 | #8


Новый участник


Сообщения: 21
Благодарности: 1

Профиль | Цитировать


Определите полностью тип передаваемых в функцию данных.
Так что бы в заголовке функции было что-то типа
Код: Выделить весь код
function FunctionName(var Name:TypeName):ReturnTypeName
Не знаю как в Lazarus, а в классическом Паскале вроде нельзя описывать тип переменных сложными структурами типа массивов или записей.

Отправлено: 12:14, 05-12-2017 | #9



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Разное - Несколько затруднений про массивы (Pascal)

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Разное - Pascal. Массивы. Вывод матрицы на экран MAKS-I Программирование и базы данных 2 09-01-2013 01:20
несколько вопросов про RIS и один про Pxelinux ) vevs Автоматическая установка Windows 2000/XP/2003 1 22-06-2007 00:28
задача С++ про массивы lrad Программирование и базы данных 3 24-01-2007 23:35
*Теория* | Определите несколько формул для Pascal MaxxSoftware Программирование и базы данных 2 23-02-2005 19:56
Сайт про PASCAL Wisp Программирование и базы данных 1 28-02-2004 17:56




 
Переход