Меняем местами подэлементы двумерного массива 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Меняем местами подэлементы двумерного массива



Задача: поменять в двумерном массиве числа A и B местами

Меняем трёхэтапным способом

 

Arr=# (# (13, 31, 59), # (13, 32, 60), # (13, 35, 58), # (13, 36, 68), # (13, 31, 58), # (13, 32, 59), # (13, 35, 68), # (13, 36, 60))
A=13
B=58
 
tmp=0
for i = 1 to Arr.count do -- Для каждого элемента, начиная с i=1 до i=количеству элементов массива (то-есть среди восьми скобок в главном массиве) делать
for j = 1 to Arr [ i ].count do -- Для каждого элемента, начиная с j=1 до j=количеству элементов подмассива массива (то-есть того массива содержащего по 3 числа) делать
if Arr [ i ][ j ] ==A do Arr [ i ][ j ] =tmp -- Если каждый элемент подмассива Arr[i][j] есть число A (то-есть равное 13) то делать: Этот элемент Arr[i][j] сделать равным tmp (то-есть временно нулю)
Arr -- проверяем что получилось (но не обязательно)
-- Далее то же самое что и в первом блоке
for i = 1 to Arr.count do -- Для каждого элемента, начиная с i=1 до i=количеству элементов массива...
for j = 1 to Arr [ i ].count do -- Для каждого элемента, начиная с j=1 до j=количеству элементов подмассива...
if Arr [ i ][ j ] ==B do Arr [ i ][ j ] =A -- Если каждый элемент подмассива Arr[i][j] есть число B (то-есть равное 58) то делать: Этот элемент Arr[i][j] сделать равным A (то-есть 13)
Arr -- проверяем что получилось (но не обязательно)
-- И меняем оставшееся временное значение tmp на нужное значение B
for i = 1 to Arr.count do
for j = 1 to Arr [ i ].count do
if Arr [ i ][ j ] ==tmp do Arr [ i ][ j ] =B -- Если каждый элемент подмассива Arr[i][j] есть число tmp (то-есть равное 0) то делать: Этот элемент Arr[i][j] сделать равным B (то-есть 58)
Arr -- проверяем что получилось

Листенер вернёт:

#(#(58, 31, 59), #(58, 32, 60), #(58, 35, 13), #(58, 36, 68), #(58, 31, 13), #(58, 32, 59), #(58, 35, 68), #(58, 36, 60))

_______________________________________________________________

Немного логики и интересный способ присвоения значений переменным.

a=0 --эту переменную надо обязательно объявить, иначе код не будет работать

tmp = (-- переменная tmp не была объявлена, поэтому пока её значение undefined

       a+=1 -- это то же самое что и a=a+1

1 -- /*просто любая цифра, которая вернётся в листенер и присвоится переменной tmp*/

)

tmp==1 -- проверяем, tmp есть 1?

-- Листенер вернет

true

 

А вот такой же пример, но с маленькими изменениями

a=0

tmp = (

       a+=1

off -- булевое значение, тоже самое что и false ( on соответствует true)

)

tmp==false -- Проверяем, переменная имеет значение false?

-- Листенер вернёт

true

В общем на последнюю линию в блоке можно ставить всё что угодно, чему мы хотим, чтобы равнялась переменная, которой приравнивается блок

_______________________________________________________________

Работа с внешним текстовым файлом

 

Просьба дополнить по-возможности:

Как удалять строку (или узнать длину строки), как записывать текст на кириллице

 

Основные операции с файлом

--Создание текстового файла "test.txt" в корне диска "С"
f = createFile "C: \\ test.txt"
--Открытие текстового файла "test.txt" из корня диска "С"
f = createFile "C: \\ test.txt"
--Закрытие текстового файла "test.txt" используя переменную f
close f
--Запуск текстового файла "test.txt" из корня диска "С" сторонней программой, заданной по-умолчанию (Например: блокнот)
ShellLaunch "explorer.exe" "C: \\ test.txt"

 

Примечание: Файл обязательно нужно закрывать командой "close",

после открытия/создания и редактирования, иначе могут возникнуть проблемы

с редактированием и удалением файла (пока не будет закрыт 3ds Max)

 

Создание нового файла

Примечание: кириллица не записывается в файл. Все примеры ниже, использованы в целях лучшего понимания.

--Запись текста в конце строки

format "Какой-то текст" to:f

Результат повторного выполнения:

"Какой-то текстКакой-то текст"

 

--Переход на следующую строку

"\n" (Например: format "Какой-то текст\n" to:f)

Результат повторного выполнения:

"Какой-то текст

Какой-то текст"

 

--Пример кода полностью:

f = createFile "C: \\ test.txt"
format "The first line \n " to:f
format "The second line \n " to:f
for i = 3 to 6 do
(
format ("Line #" + i as string + " \n ") to:f
)
close f
ShellLaunch "explorer.exe" "C: \\ test.txt"

 

Результат:
“The first line

The second line

Line #3

Line #4

Line #5

Line #6”

 

3) Открытие файла:

f = openFile "C: \\ test.txt" mode:"r+"

 

Есть множество режимов открытия файла (mode:) Основные:

r - чтение

rt - чтение текста

rb - чтение как бинарный код

r+ - чтение и запись (с сохранением содержимого)

w - запись

wt - запись текста (все содержимое удаляется)

wb - запись бинарного кода (все содержимое удаляется)

w+ - чтение/запись текста (все содержимое удаляется)

Внимание! эти атрибуты добавляются с кавычками, как строковые значения!

--Количество символов в файле:
filepos f
--Переход к десятому символу в строке:
seek f 10

 

Примеры кода полностью.

--Замена символов текстом "999999" в третьей позиции:
--(Допустим, в файле есть всего одна строка "The first line")
f = openFile "C: \\ test.txt" mode:"r+"
seek f 3
format "999999" to:f
close f
ShellLaunch "explorer.exe" "C: \\ test.txt"

 

Результат: "The999999 line"

 

--Вставка текста"999999" в третью позицию, без замены:

--(Допустим, в файле есть всего одна строка "The first line")

f = openFile "C: \\ test.txt" mode:"r+"
seek f #eof; maxlen=filepos f; seek f 3
res = readChars f maxlen errorAtEOF: false
seek f 3; format "999999" to:f; format res to:f
close f
ShellLaunch "explorer.exe" "C: \\ test.txt"

 

Результат: "The999999 first line"

 

-- Если файла по указанному пути не существует, то создать его

fPath=”c:\\tmp.txt”
if not doesFileExist fPath do (
       f = createFile fPath
       close f
)

 

Если файл существует, и надо добавлять в него данные, то:

f = openFile fPath mode:"a" -- файл открывается и готов к изменению, об этом говорит параметр “а”

format (“tmp” + \n) to:f -- печатать в файле строку “tmp” и перейти на следующую строку.

close f

 

Пример работы с файлами, скрипт выполняет чтение из файла вершин и выделяет их в объекте сцены 3dsMax

(
Arr = #()
try (s = openFile "c: \\ Vertex_ID_selector.txt") catch()
if (selection.count==1 and s!= undefined) then
       (
       while not eof s do -- пока не есть eof (конец файла s) делать
                   (
                   a = readValue s
                   append Arr a
                  )
       For i=1 to Arr.count do
       Arr[i] += 1
       try(PolyOp.SetVertSelection $ Arr) catch(messagebox("Some ID is not exist"))
       if getCommandPanelTaskMode()!= #modify then (max modify mode)
       subobjectlevel = 1
       redrawViews()
       close ssizeразмер
      )
)

 

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

_______________________________________________________________

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

macroScript UserScriptName category:"NewTools" tooltip:"toolName" silentErrors: true

Ну или можно локально сам код организовать с помощью конструкции перехвата ошибокtry () Catch (), по русски это можно понять как

try - пробовать выполнить ()

Catch если возникнет ошибка, тогда выполнять ()

Если при ошибке делать ничего не нужно, то Catch() так и остаётся с пустыми скобками.

_______________________________________________________________



Поделиться:


Последнее изменение этой страницы: 2021-04-13; просмотров: 48; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.222.67.251 (0.015 с.)