Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.03.2010, 20:49   #1
Mikle1990
Пользователь
 
Регистрация: 13.03.2010
Сообщений: 16
По умолчанию Работа с двумерными массивами (visual basic)

Сформировать произвольно двумерный массив R(8,3) Найти и вывести значение и индексы элемента, являющегося одновременно наименьшим в своей строке и наибольшим в своем столбце. При отсутствии такого элемента вывести сообщение.


Как реализовать алгоритм поиска седловой точки?
Я видел, что подобная тема есть, но там другой язык и немного другое. Как я понял этот элемент называется - седловая точка. Ещё я понял, что их может быть несколько.

Проблема заключается в том, что я не знаю как эту процедуру составить. То что в неё массив будет передаваться и что там будут циклы - это ясно.

Помогите пожалуйста, а то я уже столько над этим сижу...
Mikle1990 вне форума Ответить с цитированием
Старый 13.03.2010, 20:56   #2
Rusat
Пользователь
 
Регистрация: 25.02.2010
Сообщений: 17
По умолчанию

Завтра код пришлю.
Контактная ин-фа 479-275-762, DmitriK181988@gmail.com
Rusat вне форума Ответить с цитированием
Старый 13.03.2010, 21:32   #3
ImmortalAlexSan
Участник клуба
 
Аватар для ImmortalAlexSan
 
Регистрация: 13.01.2009
Сообщений: 1,353
По умолчанию

На языке Дельфи это будет так:
Код:
For j:=1 to 3 do {перебираем слева направо по всем элементам каждой строки 3 раза, так как строк 3}
For i:=1 to 8 do
begin
If a[i,j]<a[i+1,j] then
min:=a[i,j];
If i=8 then
mini[1,j]:=min;
end;
For i:=1 to 8 do
For j:=1 to 3 do
begin
If a[i,j+1]<a[i,j] then
max:=a[i,j];
if j=3 then
maxi[i,1]:=a[i,j];
end;
For i:=1 to 8 do
For j:=1 to 3 do
If mini[1,j]=maxi[i,1] then
showmessage('седловая точка');
Я не уверен в правильности. Написано за 2 минуты буквально. Но может этот код наведет вас на мысли. Локига такова: ищите минимальные максимальные элементы в строках и столбцах, сравниваете. Я могу ошибаться, но попробуйте так.
"Тебе то может на меня и насрать, но твои глаза меня обожают!"
ImmortalAlexSan вне форума Ответить с цитированием
Старый 14.03.2010, 00:10   #4
Mikle1990
Пользователь
 
Регистрация: 13.03.2010
Сообщений: 16
По умолчанию

Rusat это было бы хорошо.

В процедуру передаётся сам массив(по значению) и листбокс(по ссылке).

Вот пока что у меня на у уме:
1) Находим минимальный элемент первой строки и записываем его индексы в переменные.
2) Зная индексы его второго измерения мы сравниваем его со всеми элемента в его столбце при чём в этом цикле мы добавляем новую переменную, которая при положительном сравнении прибавляется на единицу
3) Потом если эта новая переменная равна (числу строк - 1), то выводим в листбокс этот массив и его значение.
4) Находим минимальный элемент второй строки и опять то же самое делаем.

ппц, 1-ый курс только, а голова кипит как будто атомную бомбу изобретаю

P.S. Если что, то нам запретили использовать встроенные ф-ции min и max. Хотя мне кажется они здесь не нужны...

Последний раз редактировалось Mikle1990; 14.03.2010 в 00:12.
Mikle1990 вне форума Ответить с цитированием
Старый 14.03.2010, 14:49   #5
Rusat
Пользователь
 
Регистрация: 25.02.2010
Сообщений: 17
По умолчанию

Извиняюсь за опоздание, не совсем конечно уверен, но посмотри:
Sub Main()
Dim a(4, 4) As Integer 'объявляем массив
Dim i, j, k, max, imax, min, jmin As Integer 'для циклов
For i = 1 To 4
For j = 1 To 4 'заполняем массив случайными числами
a(i, j) = Int(Rnd() * 8) 'Задаем значение
Console.Write(a(i, j) & " ") 'и сразу же печатаем
Next
Console.WriteLine()
Next
For j = 1 To 4
max = a(1, j)
imax = 1
For i = 1 To 4
If a(i, j) > max Then
max = a(i, j)
imax = i
End If
Next
min = a(imax, 1)
jmin = 1
For k = 1 To 4
If a(imax, j) < min Then
min = a(imax, j)
jmin = j
End If
Next
Next
If min = max Then
Console.WriteLine(imax) 'искомая строка
Console.WriteLine(jmin) 'искомый столбец
ElseIf (j = 4) And (min <> max) Then
Console.Write("Ne takogo stolbca")
End If
Console.ReadLine()
End Sub
Контактная ин-фа 479-275-762, DmitriK181988@gmail.com
Rusat вне форума Ответить с цитированием
Старый 14.03.2010, 16:15   #6
Mikle1990
Пользователь
 
Регистрация: 13.03.2010
Сообщений: 16
По умолчанию

Почти то, что нужно и даже чуть больше.
Надо было мне наверно сразу написать, но я написал потом и не всё(, и Вы видно не заметили.

Вот что хочу сказать:

1) Значения элементов массива уже задано. Так как "Сформировать произвольно" имелось ввиду, что самому надо данные вбивать. Такую процедуру я уже написал(и даже сделал вывод в листбокс)

2) Процедура которая нужна выглядит так:
Код:
    Sub Poisk(ByVal a(,) As Single, ByRef LB As ListBox)
    'код процедуры
    End Sub
как Вы видите - туда передаётся массив и листбокс.

3) Как я понял при нахождении седловой точки она(её индексы и значение) должны вставляться в какуе-то переменную с типом string...
И надо учесть, что седловых точек может быть несколько.

4) На всякий случай привожу процедуру вывода массива, дабы показать как нас учат делать.
Код:
    'Процедура форматированного вывода массива в ListBox'
    Sub PrintMass(ByRef a(,) As Single, ByRef LB As ListBox)
        Dim i As Integer
        Dim j As Integer
        Dim m As Integer
        Dim n As Integer
        Dim z1 As String
        Dim z2 As String
        m = a.GetLength(0) - 1
        n = a.GetLength(1) - 1
        LB.Items.Clear()
        For i = 0 To m
            z1 = ""
            For j = 0 To n
                z2 = Format(a(i, j), "000.000")
                If a(i, j) < 0 Then
                    z2 = Space(3) + z2
                Else
                    z2 = Space(4) + z2
                End If
                z1 = z1 + z2
            Next
            LB.Items.Add(z1)
        Next
    End Sub

Ну вот такие дела. Если есть возможность, то подправьте пожалуйста Ваш код к моему примеру, а я уже буду отлаживать и напишу результат.
Mikle1990 вне форума Ответить с цитированием
Старый 14.03.2010, 17:40   #7
Rusat
Пользователь
 
Регистрация: 25.02.2010
Сообщений: 17
По умолчанию

ппц, 1-ый курс только, а голова кипит как будто атомную бомбу изобретаю


Понимаю. На с++ не легче
Контактная ин-фа 479-275-762, DmitriK181988@gmail.com
Rusat вне форума Ответить с цитированием
Старый 14.03.2010, 20:10   #8
Mikle1990
Пользователь
 
Регистрация: 13.03.2010
Сообщений: 16
По умолчанию

Попробую блок-схему составить. Так думаю... сделать то я кое-как смогу. Но уверен в том, что если сделаю как сам желаю, а не по каком-ту известному алгоритму нахождению седловой точки, то заставят переделывать( А у меня заочка тем более, времени на переделывание будет очень мало.

Пока сделаем паузу в теме.
Посмотрим что выйдет после попытки создания блок-схемы.
Как что-то похожее на нужное составлю, так или фотку блок схемы выложу или уже "готовый" код.
Mikle1990 вне форума Ответить с цитированием
Старый 15.03.2010, 15:01   #9
Mikle1990
Пользователь
 
Регистрация: 13.03.2010
Сообщений: 16
По умолчанию

Оказывается то, про что я говорил - это не седловая точка, хотя почти она.

Вот я даже не могу справится с поиском наименьшей точки в строке. (
Код:
        m = a.GetLength(0) - 1 'строки
        n = a.GetLength(1) - 1 'столбцы

        'Старт - Нахождение и вывод наименьшего элемента в первой строке 
        i = 0
        max = 10 ^ 38
        For j = 0 To n
            If a(i, j) < max Then
                max = a(i, j)
                st = i
                sb = j
            End If
        Next
        z1 = CStr("a(") + Format(st) + CStr(",") + Format(sb) + CStr(")=") + Format(a(st, sb)) + CStr(";")
        LB.Items.Add(z1)
        'Конец - Нахождение и вывод наименьшего элемента в первой строке
Вот казалось бы код находит наименьшую точку в строке. Но если строка состоит из (1, 1, 1) или (2, 1, 1), то точка все-равно находится((( please помогите
Mikle1990 вне форума Ответить с цитированием
Старый 15.03.2010, 16:02   #10
Mikle1990
Пользователь
 
Регистрация: 13.03.2010
Сообщений: 16
По умолчанию

Вот как я передумал:

Код:
        'Старт - Нахождение и вывод наименьшего элемента в первой строке 
        i = 0
        max = 10 ^ 38
        For j = 0 To n
            If a(i, j) < max Then
                max = a(i, j)
                st = i
                sb = j
            End If
            zs = 0
            For k = 0 To n
                If a(st, sb) = a(st, k) Then
                    zs = zs + 1
                End If
            Next
        Next
        If zs = 1 Then
            z1 = CStr("a(") + Format(st) + CStr(",") + Format(sb) + CStr(")=") + Format(a(st, sb)) + CStr(";")
            LB.Items.Add(z1)
        End If
        'Конец - Нахождение и вывод наименьшего элемента в первой строке
Проверьте пожалуйста кто понимает.

P.S. Удивительно, но код-то вроде работает) Интересно, меня в инсте отругают за такой алгоритм или похвалят)

Последний раз редактировалось Mikle1990; 15.03.2010 в 16:08.
Mikle1990 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
работа с двумерными массивами curly182 Паскаль, Turbo Pascal, PascalABC.NET 1 16.05.2009 17:56
Подпрограммы(работа с двумерными массивами) DimoniusX Помощь студентам 0 15.04.2009 09:52
задача Visual Basic. Работа с массивами ProgramBad Помощь студентам 3 14.02.2009 02:10
Работа с двумерными массивами KJIOyH Помощь студентам 4 03.11.2007 20:03