Консультация № 152775
03.12.2008, 15:24
0.00 руб.
0 4 3
Здравствуйте!Помогите, пожалуйста, с задачей:"Дан двумерный массив.Нужно определить в каком из столбцов число перемен знака наибольшее".Возникают сложности с составлением условия.

Приложение:
Sub e2()
Dim x() As Integer, n As Byte, m As Byte, i As Byte, j As Byte, t As Byte
Do
n = Application.InputBox("число строк:", Type:=1)
Loop Until n > 0
Do
m = Application.InputBox("число столбцов:", Type:=1)
Loop Until m > 0
ReDim x(1 To n, 1 To m)
Randomize
Cells.Clear
For i = 1 To n
For j = 1 To m
x(i, j) = 50 * Rnd - 10: Cells(i, j) = x(i, j)
Next j
Next i
For j = 1 To m
t = 0
For i = 1 To n
If x(i, j) < 0 And x(i + 1, j) > 0 Or x(i, j) > 0 And x(i + 1, j) < 0 Then
t = t + 1
End If
Next i
Next j
End Sub

Обсуждение

Неизвестный
03.12.2008, 16:18
общий
это ответ
Здравствуйте, Kirill11!
Вот код, начало твое:

Sub e2()
Dim x() As Integer, n As Byte, m As Byte, i As Byte, j As Byte, t As Byte
Dim znak As Boolean ' true - плюс, false - минус
Dim max_el, max_st As Integer
Do
n = Application.InputBox("число строк:", Type:=1)
Loop Until n > 0
Do
m = Application.InputBox("-число столбцов:", Type:=1)
Loop Until m > 0
ReDim x(1 To n, 1 To m)
Randomize
Cells.Clear
For i = 1 To n
For j = 1 To m
x(i, j) = 50 * Rnd - 10: Cells(i, j) = x(i, j)
Next j
Next i

max_el = 0
max_st = 0

For j = 1 To m
t = 0:
znak = False
If x(1, j) >= 0 Then zhak = True
t = 1

For i = 2 To n
If (x(i, j) >= 0) <> zhak Then
t = t + 1:
If znak = True Then znak = False
Else: znak = True
End If
Next i
If max_el < t Then
max_el = t:
max_st = j:
End If
Next j

Cells(n + 2, 1) = "столбец с наибольш. переменами знаков = " & max_st

End Sub
Неизвестный
03.12.2008, 19:14
общий
это ответ
Здравствуйте, Kirill11!
Все так, но чуть-чуть недоделали. См. приложение.

Приложение:
Sub e2()
Dim x() As Integer, n As Byte, m As Byte, i As Byte, j As Byte, t As Byte
Dim MaxChangeValue as Byte, ColumnIndex as Byte
Do
n = Application.InputBox("число строк:", Type:=1)
Loop Until n > 0
Do
m = Application.InputBox("число столбцов:", Type:=1)
Loop Until m > 0
ReDim x(1 To n, 1 To m)
Randomize
Cells.Clear
For i = 1 To n
For j = 1 To m
x(i, j) = 50 * Rnd - 10: Cells(i, j) = x(i, j)
Next j
Next i
MaxChangeValue = 0
For j = 1 To m
t = 0
For i = 1 To n
If x(i, j) < 0 And x(i + 1, j) > 0 Or x(i, j) > 0 And x(i + 1, j) < 0 Then
t = t + 1
End If
Next i
If MaxChangeValue<t then
MaxChangeValue=t ' максимальное число перемены знаков
ColumnIndex = j ' индекс столбца
end if
Next j
End Sub
Неизвестный
03.12.2008, 19:37
общий
Иноземцева Ольга Ивановна, условие у меня-то неправильно.
6a3uji,спасибо,только почему-то результат не всегда правильно подсчитывается.
Неизвестный
03.12.2008, 20:12
общий
это ответ
Здравствуйте, Kirill11!
подсчет количества переходов через 0 в двумерном массиве можно выполнить следующим кодом:
Код:
Sub countChange()
Dim x() As Integer, n As Byte, i As Byte, j As Byte, t As Byte
Const m As Byte = 2, s0$ = "первый второй" + vbCrLf
Do: n = Application.InputBox(s0, Type:=1): Loop Until n > 0
ReDim x(1 To n + 1, 1 To m)
Randomize
Cells.Clear
For i = 1 To n
For j = 1 To 2 'm
x(i, j) = 50 * Rnd - 10:
Cells(i, j) = x(i, j)
If i > 1 Then
If Not x(i, j) * x(i - 1, j) = Abs(x(i, j) * x(i - 1, j)) Then _
x(n + 1, j) = x(n + 1, j) + 1
End If
Next
Next
MsgBox s0 & Space(3) & x(n + 1, 1) & Space(15) & x(n + 1, 2)
End Sub
Евгений.
Форма ответа