Для лентяев

  • Автор темы gerich
  • Дата начала
Статус
Закрыто для дальнейших ответов.
L

Lalique

Помогите, очень очень надо решить задачку в VBA: Седловой точкой в матрице называется элемент, являющийся одновременно наибольшим в столбце и наименьшим в строке. Седловых точек может быть и несколько (в этом случае они имеют равные значения). В матрице A(m,n) найти седловую точку и ее координаты p,q, либо установить, что такой точки нет.
 
S

SkaMaggotGhost

Я Вас категорически приветствую!! Помогите с решением задачи. Дан документ (*.doc) в котором содержаться: шифр статьи, название и имена авторов. Что б в ручную не копипастить все эти данные нужно сделать макрос, я вижу решение таким: выделяем шифр название и авторов символами, к примеру вот так- }Шифр} , ©Авторы©, {Название{. Макрос пробегаеться по всему документу, находит нужные символы, выделяет и переносит все это в БД.


примерно получился такой код.. для одного символа .. далее по анологии.. проблема в том как сделать чтобы он выделял область внутри символов и делал перенос в БД?? (MySQL)..

Sub Макрос3()
'
'
Selection.HomeKey Unit:=wdStory
Selection.Find.ClearFormatting
Selection.Find.Text = "{"
While Selection.Find.Execute=True
i = 0
While Selection.Text <> "}"
Selection.MoveRight Unit:=wdCharacter, Count:=1
i = i + 1
Wend
Selection.MoveRight Unit:=wdCharacter, Count:=1
i = i + 1
Selection.MoveLeft Unit:=wdCharacter, Count:=i, Extend:=wdExtend
Selection.Font.Italic = True
Selection.MoveRight Unit:=wdCharacter, Count:=1
Wend
End Sub


Заранее спасибо..
 
B

BGD9517

Lalique, Вам повезло, т. к. я решал похожую задачу! (А сейчас и не вспомнил бы). В общем решение такое:
Код:
dim a(m,n), p(10), e(10) as integer
for i = 1 to m
for j = 1 to n
a(i,j) =cint(rnd*(20-1)+1) 'Заполняем массив случайным образом
next j
next i
min = a(1,1)
for i = 1 to m
for j = 1 to n
if a(i,j)<min then min = a(i,j)
t = i
t1 = j
next j
p(i) = min
next i
for j = 1 to m
for i = 1 to n
if a(i,j)>max then max = a(i,j)
next
e(j) = max
next
for i = 1 to 10
if p(i) = m(i) then 
msg box "Седловая точка", a(t,t2)
else 
msgbox "нет"
end if
next
З.Ы код немного надо подправить, буквы и тп.
 
L

Lalique

спасибо большое.а можно еще такой вопрос:как правильно задать случайным образом многомерный массив с выводом на лист Excel?
 
J

Jumpy

спасибо большое.а можно еще такой вопрос:как правильно задать случайным образом многомерный массив с выводом на лист Excel?

dim a as integer
dim b as integer

dim M as integer
dim N as integer

M = 10 'задаем размерность массива
N = 5

for a = 1 to M
for b =1 to N
cells(a,:) = rnd()*10000 'случайное число от 0 до 10000
next b
next a

в итоге получим поле 10 на 5 заполненное случайными числами
 
B

BGD9517

Lalique, вы помоему то сообщение, где я вам код написал, так и не прочитали :)
a(i,j) =cint(rnd*(20-1)+1) 'Заполняем массив случайным образом
А на счёт экселя, эт я пока не знаю :)
Jumpy, твое решение мне кажется не очень правильно(может я не прав)
 
L

Lalique

BGD9517, я нашла как заполнить массив в Excel, вдруг пригодится :(
Dim a() As Variant
m = UserForm1.TextBox1.Value
n = UserForm1.TextBox2.Value
ReDim a(1 To m, 1 To n) As Variant
For i = 1 To m
For j = 1 To n
a(i, j) = Fix(Rnd(1) * 50)
Next j
Next i
For i = 1 To m
For j = 1 To n
Worksheets(1).Range(Cells(1, 1), Cells(i, j)).Value = a
Next j
Next i
 
J

Jumpy

Lalique, вы помоему то сообщение, где я вам код написал, так и не прочитали :(

А на счёт экселя, эт я пока не знаю :)
Jumpy, твое решение мне кажется не очень правильно(может я не прав)

А я не знаю что такое "заполнить массив в экселе" ))
что такое заполнить массив в VBA - знаю.
Что такое заполнить таблицу из массива - догадываюсь :)

по факту паходу надо было заполнить массив и вывести на лист :)
 
L

Lalique

Jumpy, признаю, не правильно сформулировала :( бывает
 
L

Lalique

BGD9517, преподша забраковала программу. Седловая точка точка находится немного не так: нужно найти max всех столбцов,а затем среди этих чисел определить min. Аналогично по строкам, найти min всех строк, а среди них max. И если min=max это и есть седловая точка. Теперь вопрос, как это сделать? :)
 
J

Jumpy

BGD9517, преподша забраковала программу. Седловая точка точка находится немного не так: нужно найти max всех столбцов,а затем среди этих чисел определить min. Аналогично по строкам, найти min всех строк, а среди них max. И если min=max это и есть седловая точка. Теперь вопрос, как это сделать? :)

Эм... правильно ли я понял:
1) В Каждом столбце найти максимальное значение
2) Среди найденных максимальных значений - найти минимальное
3) В каждой строке найти минимальное значение
4) Среди найденных минимальных значений - найти максимальное.

если найденное в 2) равно найденном в 4) это и есть седловая точка ?
Вопрос: чего делать если все всему равны, т.е. в таблице 2на2:

3 3
3 3

Ноль седловых точек или 4ре ?
 
L

Lalique

Эм... правильно ли я понял:
1) В Каждом столбце найти максимальное значение
2) Среди найденных максимальных значений - найти минимальное
3) В каждой строке найти минимальное значение
4) Среди найденных минимальных значений - найти максимальное.

если найденное в 2) равно найденном в 4) это и есть седловая точка ?
Вопрос: чего делать если все всему равны, т.е. в таблице 2на2:

3 3
3 3

Ноль седловых точек или 4ре ?

получается, что 4.но этот случай не надо рассматривать
 
J

Jumpy

ыыыы щас чо нить наваяю...

дан массив A(m,n)

Код:
dim a as integer
dim b as integer
dim MAX as double 'максимальное значение в столбце
dim CURRENT_MAX as double 'минимальное значение среди всех максимальных значений в столбцах
dim MIN as double 'аналог, только для строк
dim CURRENT_MIN as double 

current_max = A(1,1)
for a = 1 to m
MAX = A(a,1) 'по умолчанию считаем что первый элемент и есть максимальный
CURRENT_MAX = MAX
for b = 1 to n
if MAX < A(a,b) then
MAX = A(a,b)
end if
next b
if CURRENT_MAX > MAX then 'если текущее минимальное значение среди максимальных больше чем данное максимальное
CURRENT_MAX = MAX 'считаем его наименьшим максимальным :)
end if
next a

'тож самое для строк
CURRENT_MIN = A(1,1)
for b = 1 n
MIX = A(1,b) 
for a = 1 to m
if MIN > A(a,b) then
MIN = A(a,b)
end if
next b
if CURRENT_MIN < MIN then 
CURRENT_MIN = MIN 'считаем его наименьшим максимальным :)
end if
next a

if CURRENT_MIN = CURRENT_MAX then
'седловая точка есть, ее значение = CURRENT_MIN
'если ее надо вывести то
for a = 1 to m
for b = 1 to n 
if A(a,b) = CURRENT_MIN then 
msgbox ("Элемент массива А(" & a & ":" & b & ") является седловой." )
'ну или выписать a,b - если эти индексы надо сохранить
end if
next b
next a
else
call msgbox("Чота нету седловой, нет в жизни счастья :( ")
end if
 
L

Lalique

ыыыы щас чо нить наваяю...

Спасибо большое, Вы мне очень помогли!!!
Еще один вопрос: как сделать, чтобы программа запоминала индексы имеено седловой точки, а то например, когда вбиваешь матрицу

4 5 3
6 7 4
5 2 3

седловой точко является А(2,3)=4, а
программа выводит А(1,1), т.к. значение тоже =4. кстати в любым примерах А(1,1) показывает ( задавали current_max = A(1,1) и current_max = A(1,1))
 
J

Jumpy

Спасибо большое, Вы мне очень помогли!!!
Еще один вопрос: как сделать, чтобы программа запоминала индексы имеено седловой точки, а то например, когда вбиваешь матрицу

4 5 3
6 7 4
5 2 3

седловой точко является А(2,3)=4, а
программа выводит А(1,1), т.к. значение тоже =4. кстати в любым примерах А(1,1) показывает ( задавали current_max = A(1,1) и current_max = A(1,1))

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

Код:
dim a as integer
dim b as integer
dim MAX as double 'максимальное значение в столбце
dim CURRENT_MAX as double 'минимальное значение среди всех максимальных значений в столбцах
dim MIN as double 'аналог, только для строк
dim CURRENT_MIN as double 

Dim IND_MAX_A as integer 
Dim IND_MAX_B as integer
Dim IND_MIN_A as integer
Dim IND_MIN_B as integer

Dim CURRENT_IND_MAX_A as integer
Dim CURRENT_IND_MAX_B as integer
Dim CURRENT_IND_MIN_A as integer
Dim CURRENT_IND_MIN_B as integer

current_max = A(1,1)
CURRENT_IND_MAX_A = 1
CURRENT_IND_MAX_B = 1

for a = 1 to m
MAX = A(a,1) 'по умолчанию считаем что первый элемент и есть максимальный
CURRENT_MAX = MAX
for b = 1 to n
if MAX < A(a,b) then
MAX = A(a,b)
CURRENT_IND_MAX_A = a
CURRENT_IND_MAX_B = b
end if
next b
if CURRENT_MAX > MAX then 'если текущее минимальное значение среди максимальных больше чем данное максимальное
CURRENT_MAX = MAX 'считаем его наименьшим максимальным :)
IND_MAX_A = CURRENT_IND_MAX_A
IND_MAX_B = CURRENT_IND_MAX_B
end if
next a

'тож самое для строк
CURRENT_MIN = A(1,1)
CURRENT_IND_MIN_A = 1
CURRENT_IND_MIN_B = 1
for b = 1 n
MIX = A(1,b) 
for a = 1 to m
if MIN > A(a,b) then
MIN = A(a,b)
CURRENT_IND_MIN_A = a
CURRENT_IND_MIN_B = b
end if
next b
if CURRENT_MIN < MIN then 
CURRENT_MIN = MIN 'считаем его наименьшим максимальным :)
IND_MIN_A = CURRENT_IND_MIN_A
IND_MIN_B = CURRENT_IND_MIN_B
end if
next a

if IND_MIN_A = IND_MAX_A and IND_MIN_B = IND_MAX_B then
'седловая точка есть, ее значение = CURRENT_MIN, координаты A(IND_MIN_A, IND_MIN_B)
else
call msgbox("Чота нету седловой, нет в жизни счастья :( ")
end if

но, в этой проге есть один большой минус - она определяет только одну седловую точку
если надо определять все седловые - то нужно заводить другой массив в котором будут храниться нас устраивающие координаты элементов.
 
L

Lalique

:) спасибо и на этом

Jumpy, теперь вообще всегда выводит (0,0) :)
 
Y

YoYap

Всем привет!Помогите подалуйста написать программу.Условия:Определить количество отрицательного значения функция на отрезке заданным шагом y=xcoskx,xE[a,b]
Буду очень благодарен!
 
G

Goodfriend

Здравствуйте! Помогите,пожалуйста,с простенькой задачкой:
Найти сумму элементов массива A(M) находящихся между первым из максимальных и последним из минимальных элементов. Спасибо
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!