Консультация № 152619
02.12.2008, 15:49
0.00 руб.
0 6 2
Здравствуйте, Уважаемые Эксперты!
Помогите, пожалуйста, с решением задачи: Используя датчик случайных чисел сформировать целочисленную матрицу и в каждой строке матрицы подсчитать число четных и нечетных элементов. Начало решения - ниже.

Sub EX6()
Dim x() As Integer, chet As Byte, nechet As Byte
Dim n As Byte, m As Byte, i As Byte, j As Byte, p As Byte, s 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 - 25: Cells(i, j) = x(i, j)
Next j
Next i

'с этого момента начинаются проблемы

For j = 1 To m
chet = 0: nechet = 0
For i = 1 To n
If x(i, j) Mod 2 = 0 Then chet = chet + 1 Else nechet = nechet + 1
Next i
p = 0
s = 0
For i = 1 To n
If x(i, j) Mod 2 = 0 Then p = p + 1 Else s = s + 1
MsgBox "число четных элементов строке=" & p
MsgBox "число нечетных элементов строке=" & s
Next i
Next j
End Sub


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

Обсуждение

Неизвестный
02.12.2008, 16:08
общий
Во-первых, у Вас два раз рассчитываются эти параметры
это лишнее:

chet = 0: nechet = 0
For i = 1 To n
If x(i, j) Mod 2 = 0 Then chet = chet + 1 Else nechet = nechet + 1
Next i

Во-вторых, если m - это число столбцов, a n - число строк, то циклы надо поменять местами: сначала цикл по n, а затем по m


For i = 1 To n
p = 0
s = 0
For j = 1 To m
...
Next j
Next i

В-третьих, я думаю, что надо привести к одному типу данные:
MsgBox "Число четных элементов строке " &STR(i) &" = " & Str(p)

Неизвестный
02.12.2008, 16:36
общий
Большое спасибо!))
Неизвестный
02.12.2008, 16:38
общий
это ответ
Здравствуйте, Amidala!
Вот исправленный вариант:

Sub EX6()
Dim x() As Integer, chet As Byte, nechet As Byte
Dim n As Byte, m As Byte, i As Byte, j As Byte, p As Byte, s 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 - 25: Cells(i, j) = x(i, j)
Next j
Next i

For j = 1 To n
chet = 0: nechet = 0
For i = 1 To m
If x(j, i) Mod 2 = 0 Then chet = chet + 1 Else nechet = nechet + 1
Next i
MsgBox "число четных элементов в " & j & " строке =" & chet
MsgBox "число нечетных элементов в " & j & " строке =" & nechet
Next j
End Sub
Неизвестный
02.12.2008, 19:41
общий
это ответ
Здравствуйте, Amidala!
Собирать информацию о четности, можно в заполняющем цикле:
Код:
Sub EX6()
Const element$ = "Строка № нечетных четных" & vbCrLf
Dim x() As Integer, n As Byte, m As Byte, i As Byte, j As Byte, s$
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 + 1)
Randomize
Cells.Clear
For i = 1 To n
For j = 1 To m
x(i, j) = 50 * Rnd - 25: Cells(i, j) = x(i, j)
If x(i, j) Mod 2 = 0 Then x(i, m + 1) = x(i, m + 1) + 1
Next
s = s + Space(5) & i & vbTab & vbTab & m - x(i, m + 1) & vbTab & x(i, m + 1) & vbCrLf
Next
MsgBox element & s
End Sub
в этом случае ошибки могут создаваться только в одном месте, и их легче будет выловить.
Евгений.
Неизвестный
02.12.2008, 19:57
общий
To Архипов Александр Леонидович.
"привести к одному" обязательно при объединении строк с числовыми значениями используя знак "+" ( + STR(i) + " =" + Str(p))
амперсанд позволяет выполнять конкатенацию без преобразования ( & i & " =" & p)
Неизвестный
04.12.2008, 09:19
общий
To Тесленко Евгений Алексеевич.
да, это верно... но я бы всё же использовал преобразование... привычка делать один раз, что бы потом не переделывать... хотя наверное, Вы правы... это не тот случай
Форма ответа