диагонали матрицы

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Crazy_shark
Начинающий
Начинающий
 
Сообщения: 15
Зарегистрирован: 07.12.2007 (Пт) 15:39

диагонали матрицы

Сообщение Crazy_shark » 07.12.2007 (Пт) 15:43

В квадратной матрице мне нужно поменять диагонали местами.
элементы главной как я понял элементы где i=j, а для побочной это как будет?

Если можно приведите пример их замены

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 07.12.2007 (Пт) 16:42

При нумерации с 0:
Индексация элементов побочной диагонали будет (i, N - 1 - i)
При нумерации с 1:
Индексация элементов побочной диагонали будет (i, N + 1 - i)

Первый индекс - строка, второй - столбец. N - размер матрицы.

В универсальном варианте будет:

(i, U + L - i), где
U - верхний индекс матрицы
L - нижний индекс матрицы

EDIT: поправил во избежание непрального толкования.
Последний раз редактировалось Viper 08.12.2007 (Сб) 11:30, всего редактировалось 2 раз(а).
Весь мир матрица, а мы в нем потоки байтов!

Crazy_shark
Начинающий
Начинающий
 
Сообщения: 15
Зарегистрирован: 07.12.2007 (Пт) 15:39

Сообщение Crazy_shark » 07.12.2007 (Пт) 19:03

Dim A(1 To 10, 1 To 10) As Integer

Private Sub Command1_Click()
Picture1.Cls
Picture2.Cls
n = val(text1)
Randomize
For i = 1 To n
For j = 1 To n
A(i, j) = Rnd * 10
Picture1.Print A(i, j);
Next j
Picture1.Print
Next i
For i = 1 To n
For j = 1 To n
If i = j Then k = A(i, j)
A(i, j) = A(i, n - 1 - i)
A(i, n - 1 - i) = k
Picture2.Print A(i, j);
Next j
Picture2.Print
Next i
End Sub

Выделенная строчка не нравится VB... тыкните пальцем где неправильно

GAGArin
Неистовый флудер
Неистовый флудер
 
Сообщения: 1777
Зарегистрирован: 23.12.2002 (Пн) 12:46
Откуда: я тут взялся, не знаю...

Сообщение GAGArin » 07.12.2007 (Пт) 19:14

n+1-i

Хотя за такой код ИМХО надо 3 ставить. У тебя вместо n операций n^2 идет.

Crazy_shark
Начинающий
Начинающий
 
Сообщения: 15
Зарегистрирован: 07.12.2007 (Пт) 15:39

Сообщение Crazy_shark » 08.12.2007 (Сб) 8:44

Dim A(1 To 10, 1 To 10) As Integer

Private Sub Command1_Click()
Picture1.Cls
Picture2.Cls
n = Val(Text1)
Randomize
For i = 1 To n
For j = 1 To n
A(i, j) = Rnd * 10
Picture1.Print Format(A(i, j), "00"); " ";
Next j
Picture1.Print
Next i
For i = 1 To n
For j = 1 To n
If i = j Then k = A(i, j)
A(i, j) = A(i, n + 1 - i)
A(i, n + 1 - i) = k
Picture2.Print Format(A(i, j), "00"); " ";
Next j
Picture2.Print
Next i
End Sub



Все заменил но вместо земены диагоналей выводит вот что: http://i001.radikal.ru/0712/b2/6659dbc8df30.jpg

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 08.12.2007 (Сб) 9:29

Нды... зачем двойной то цикл делаешь?

Код: Выделить всё
For i = 1 To N
    tmp = A(i, i)
    A(i, i) = A(i, N + 1 - i)
    A(i, N +1 - i) = tmp
Next i
Последний раз редактировалось Viper 08.12.2007 (Сб) 11:06, всего редактировалось 1 раз.
Весь мир матрица, а мы в нем потоки байтов!

Crazy_shark
Начинающий
Начинающий
 
Сообщения: 15
Зарегистрирован: 07.12.2007 (Пт) 15:39

Сообщение Crazy_shark » 08.12.2007 (Сб) 10:07

Выводится только столбец элементы которого равно элементам побочной диагонали. Как сделать норм вывод?

Код: Выделить всё
Dim A(1 To 10, 1 To 10) As Integer

Private Sub Command1_Click()
Picture1.Cls
Picture2.Cls
N = 5
Randomize
For i = 1 To N
For j = 1 To N
A(i, j) = Rnd * 10
Picture1.Print Format(A(i, j), "00"); " ";
Next j
Picture1.Print
Next i
For i = 1 To N
tmp = A(i, i)
A(i, i) = A(i, N + 1 - i)
A(i, N + 1 - i) = tmp

Picture2.Print A(i, i);

Picture2.Print
Next i

End Sub


Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 08.12.2007 (Сб) 10:56

Если тебе нужна замена с одновременным выводом ВСЕЙ матрицы, то юзай так:

Код: Выделить всё
For i = 1 To N
    For j = 1 To N
        If i = j Then
            tmp = A(i, i)
            A(i, i) = A(i, N + 1 - i)
            A(i, N + 1 - i) = tmp
        End If
        Picture2.Print A(i, j);
    Next j
    Picture2.Print
Next i
Весь мир матрица, а мы в нем потоки байтов!

Crazy_shark
Начинающий
Начинающий
 
Сообщения: 15
Зарегистрирован: 07.12.2007 (Пт) 15:39

Сообщение Crazy_shark » 08.12.2007 (Сб) 11:24

Viper
Все работает отлично, кроме 2ух элементов:http://i036.radikal.ru/0712/21/b5b52874e579.jpg
Они просто отказываются меняться....
тоесть не меняются элементы главной диагонали после середины матрицы
полный код:
Код: Выделить всё
Dim A(1 To 10, 1 To 10) As Integer

Private Sub Command1_Click()
Picture1.Cls
Picture2.Cls
N = 5
Randomize
For i = 1 To N
For j = 1 To N
A(i, j) = Rnd * 9
Picture1.Print A(i, j);
Next j
Picture1.Print
Next i
For i = 1 To N
    For j = 1 To N
        If i = j Then
            k = A(i, i)
            A(i, i) = A(i, N + 1 - i)
            A(i, N + 1 - i) = k
        End If
        Picture2.Print A(i, j);
    Next j
    Picture2.Print
Next i


End Sub

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 08.12.2007 (Сб) 11:51

Ага... вот она где собака покапалась! При одновременной замене и печати, у тебя не будут отображаться некоторые замененные элементы. Ибо печатаешь ты текущий элемент, а меняется при этом также и элемент с меньшим индексом, который уже напечатан. Выход - один цикл для замены, другой для печати.

ADD: поправил свои предыдущие посты, ибо была там одна ошибочка
Последний раз редактировалось Viper 08.12.2007 (Сб) 11:54, всего редактировалось 1 раз.
Весь мир матрица, а мы в нем потоки байтов!

Crazy_shark
Начинающий
Начинающий
 
Сообщения: 15
Зарегистрирован: 07.12.2007 (Пт) 15:39

Сообщение Crazy_shark » 08.12.2007 (Сб) 11:53

Viper
В VB всего неделю, а уже препод задание такое дал... не мог бы тыкнуть пальцем где и что нужно дописать... а то сдавать уже в понедельник

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 08.12.2007 (Сб) 11:55

Crazy_shark, выше смотри!
Весь мир матрица, а мы в нем потоки байтов!

Crazy_shark
Начинающий
Начинающий
 
Сообщения: 15
Зарегистрирован: 07.12.2007 (Пт) 15:39

Сообщение Crazy_shark » 08.12.2007 (Сб) 12:00

Viper
не вижу изменений. напиши плиз отдельным постом

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 08.12.2007 (Сб) 12:05

Вот ведь лениво человеку ответы на вопросы читать... :evil:

Код: Выделить всё
Dim A(1 To 10, 1 To 10) As Integer

Private Sub Command1_Click()
Picture1.Cls
Picture2.Cls
N = 5
' заполняем
Randomize
For i = 1 To N
    For j = 1 To N
        A(i, j) = Rnd * 9
        Picture1.Print A(i, j);
    Next j
    Picture1.Print
Next i
' меняем элементы
For i = 1 To N
    k = A(i, i)
    A(i, i) = A(i, N + 1 - i)
    A(i, N + 1 - i) = k
Next i
' печатем всю матрицу с замененными диагоналями
For i = 1 To N
    For j = 1 To N
        Picture2.Print A(i, j);
    Next j
    Picture2.Print
Next i
' радуемся содеянному
End Sub
Весь мир матрица, а мы в нем потоки байтов!

Crazy_shark
Начинающий
Начинающий
 
Сообщения: 15
Зарегистрирован: 07.12.2007 (Пт) 15:39

Сообщение Crazy_shark » 08.12.2007 (Сб) 12:12

Viper
Спасибо большое
все работает


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Majestic-12 [Bot] и гости: 2

    TopList