Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
0 / 0 / 0
Регистрация: 28.01.2014
Сообщений: 31
1

Округлить элементы матрицы до ближайшего, кратного заданному для каждой строки.

28.01.2014, 12:24. Показов 2016. Ответов 24
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Подскажите пожалуйста, не понимаю, в чем проблема, при запуске программа наглухо виснет.
Собственно, дано 6 столбцов по 14 строк, первый из которых являет сбой кратность, остальные 5 - числа.
Необходимо установить, кратны ли числа заданному числу из первого столбца, если да, то ничего не меняется, если нет, то необходимо уменьшить или увеличить число(в ближайшую сторону) и добавить примечание.
До примечания еще не добрался, пытаюсь сделать первую часть.
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
Private Sub Êíîïî÷êà_Click()
Const n = 5, m = 14, x = 14, y = 5
Dim a(2 To m, 2 To n)    As Variant
Dim b(2 To m, 2 To n) As Variant
Dim c(2 To m, 2 To n) As Variant
 
 
 
With Range("A1:F15")
.NumberFormat = "General"
.Value = .Value
End With
 
For i = 2 To m
For j = 2 To n
For k = 2 To m
For l = 2 To n
a(k, l) = Cells(i, j) \ Cells(2, 1)
b(k, l) = Cells(i, j) / Cells(2, 1)
c(k, l) = b(k, l) - a(k, l)
 
 
Do While c(k, l) > 0
If c(k, l) < 0.5 Then Cells(i, j) = Cells(i, j) - 1 And Cells(i, j).Interior.Color = 6
 
If c(k, l) >= 0.5 Then Cells(i, j) = Cells(i, j) + 1 And Cells(i, j).Interior.Color = 4
 
 
Loop
Next
Next
Next
Next
 
End Sub
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.01.2014, 12:24
Ответы с готовыми решениями:

Для каждой матрицы найти наибольшие элементы каждой строки
Дано матрицы А (5,2) и Y (3,2). Для каждой из них найти самые элементы каждой строки и записать в...

Из всех положительных элементов матрицы извлечь квадратный корень и округлить до ближайшего целого
Очень прошу, помогите с задачей: Дана матрица A(n,n). Из всех положительных извлечь квадратный...

Массив: Для каждой строки заменить все элементы матрицы меньшие среднего арифметического этой строки на нулевое значение.
Задана вещественная матрица размером NхM. Для каждой строки заменить все элементы матрицы меньшие...

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

24
6922 / 2832 / 543
Регистрация: 19.10.2012
Сообщений: 8,645
28.01.2014, 12:38 2
Вы ведь в цикле (Do While) никак не меняете массив c() - конечно оно будет бегать по кругу пока задачу не снимете.
0
Модератор
Эксперт MS Access
11962 / 4830 / 779
Регистрация: 07.08.2010
Сообщений: 14,144
Записей в блоге: 4
28.01.2014, 12:39 3
не знаю, какие должны быть данные, но проверка на цикл не помешает
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
Private Sub Кнопочка_Click()
Const n = 5, m = 14, x = 14, y = 5
Dim a(2 To m, 2 To n)    As Variant
Dim b(2 To m, 2 To n) As Variant
Dim c(2 To m, 2 To n) As Variant
 Dim i, j, k, l, j4
 
 
With Range("A1:F15")
.NumberFormat = "General"
.Value = .Value
End With
 
For i = 2 To m
For j = 2 To n
For k = 2 To m
For l = 2 To n
a(k, l) = Cells(i, j) \ Cells(2, 1)
b(k, l) = Cells(i, j) / Cells(2, 1)
c(k, l) = b(k, l) - a(k, l)
 j4 = 0
Debug.Print i, j, k, l, a(k, l), b(k, l), c(k, l)
Do While c(k, l) > 0
Debug.Print c(k, l);
j4 = j4 + 1
If j4 > 1000 Then
MsgBox "слишком много циклов по c(k,l) "
Exit Sub
End If
If c(k, l) < 0.5 Then Cells(i, j) = Cells(i, j) - 1 And Cells(i, j).Interior.Color = 6
 
If c(k, l) >= 0.5 Then Cells(i, j) = Cells(i, j) + 1 And Cells(i, j).Interior.Color = 4
 
 
Loop
 
Next
Next
Next
Next
 
End Sub
0
0 / 0 / 0
Регистрация: 28.01.2014
Сообщений: 31
28.01.2014, 12:41  [ТС] 4
А каким образом его можно поменять?
От меня постоянно ускользает понимание определения ячеек как элементов массива и соответственно доступ к ним. Проблема еще так же в том, что конкретно в этом случае, у меня сами цифровые значения начинаются не с А(1,1), а с А (2,1)
0
Модератор
Эксперт MS Access
11962 / 4830 / 779
Регистрация: 07.08.2010
Сообщений: 14,144
Записей в блоге: 4
28.01.2014, 12:47 5
и почему-то деление не на столбик, а на ячейку
Visual Basic
1
2
a(k, l) = Cells(i, j) \ Cells(2, 1)
b(k, l) = Cells(i, j) / Cells(2, 1)
0
0 / 0 / 0
Регистрация: 28.01.2014
Сообщений: 31
28.01.2014, 12:48  [ТС] 6
Да, действительно, слишком много циклов...
Очень прошу объяснить, каким образом можно сделать, чтобы соотносилось значение каждое значение С с каждой ячейкой. И как уменьшить количество циклов. Абсолютно запутался.
Прилагаю само задание для наглядности.
Вложения
Тип файла: xls Домашнее задание_v2 (2).xls (29.5 Кб, 10 просмотров)
0
0 / 0 / 0
Регистрация: 28.01.2014
Сообщений: 31
28.01.2014, 13:16  [ТС] 7
Деление происходит на значение ячейки, в самом начале же прописывалось, что все значения в ячейках привожу к числовым

Добавлено через 26 минут
Объясните пожалуйста, каким образом надо менять массив с, чтобы это все дело на зацикливалось и не отваливалось в итоге?
0
6922 / 2832 / 543
Регистрация: 19.10.2012
Сообщений: 8,645
28.01.2014, 13:26 8
Ну как - если Вы проверяете Do While c(k, l) > 0 значит нужно менять переменную k, чтоб эти проверяемые значения менялись.
Т.к. в данном случае эта переменная внешняя - значит тут нужна другая переменная.

В задачу целиком не вникал.
0
0 / 0 / 0
Регистрация: 28.01.2014
Сообщений: 31
28.01.2014, 13:32  [ТС] 9
Так l меняется до n.
0
6922 / 2832 / 543
Регистрация: 19.10.2012
Сообщений: 8,645
28.01.2014, 13:40 10
Где тут меняются значения этого массива?

Visual Basic
1
2
3
4
5
6
Do While c(k, l) > 0
 
If c(k, l) < 0.5 Then Cells(i, j) = Cells(i, j) - 1 And Cells(i, j).Interior.Color = 6
If c(k, l) >= 0.5 Then Cells(i, j) = Cells(i, j) + 1 And Cells(i, j).Interior.Color = 4
 
Loop
0
0 / 0 / 0
Регистрация: 28.01.2014
Сообщений: 31
28.01.2014, 13:41  [ТС] 11
Эм. Нигде.
Но как они должны меняться, я тоже не понимаю, к сожалению.
Объясните пожалуйста, если Вам не трудно
0
Заблокирован
28.01.2014, 13:48 12
Kolesnichkov, приложите файл с данными Расширенный режим - скрепка (что есть, что надо получить), иначе гадать можно бесконечно.
0
0 / 0 / 0
Регистрация: 28.01.2014
Сообщений: 31
28.01.2014, 13:49  [ТС] 13
Выше по теме смотрите, уже был приложен.
0
6922 / 2832 / 543
Регистрация: 19.10.2012
Сообщений: 8,645
28.01.2014, 13:52 14
Обычно в цикле do while меняют одну переменную (или обе в данном примере), чтоб дойти до того момента, пока значение массива не изменится согласно критерию.
Чтоб не зациклится - можно добавить аварийный выход, как уже выше подсказано.
0
0 / 0 / 0
Регистрация: 28.01.2014
Сообщений: 31
28.01.2014, 13:54  [ТС] 15
Да. Добавил аварийный выход, выполнение прерывается, программа не работает.
Это не тот результат,который нужен.
0
Заблокирован
28.01.2014, 14:10 16
Лучший ответ Сообщение было отмечено Kolesnichkov как решение

Решение

Проверяй:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Private Sub Кнопочка_Click()
Dim r&, c&, N&
For r = 2 To 15
  For c = 2 To 6
    N = Cells(r, c) / Cells(r, 1)
    N = N * Cells(r, 1)
    If N > Cells(r, c) Then
      Cells(r, c).Interior.Color = RGB(0, 255, 0)
    ElseIf N < Cells(r, c) Then
      Cells(r, c).Interior.Color = RGB(255, 255, 0)
    End If
    Cells(r, c) = N
  Next c
Next
End Sub
1
0 / 0 / 0
Регистрация: 28.01.2014
Сообщений: 31
28.01.2014, 14:13  [ТС] 17
Да, все работает, но с одним НО. При повторном нажатии кнопки, все ячейки окрашиваются в желтый цвет.
Огромное Вам спасибо.
0
Заблокирован
28.01.2014, 14:15 18
Цитата Сообщение от Kolesnichkov Посмотреть сообщение
все ячейки окрашиваются в желтый цвет
Поправь 9-ю строку кода
Цитата Сообщение от Апострофф Посмотреть сообщение
Visual Basic
1
ElseIf N < Cells(r, c) Then
0
0 / 0 / 0
Регистрация: 28.01.2014
Сообщений: 31
28.01.2014, 14:19  [ТС] 19
Еще подскажите пожалуйста, там необходимо, если значение меняется, добавить примечание. Но я не понимаю, каким образом он будет видеть предыдущее значение ячейки. Как это реализуется?
0
Заблокирован
28.01.2014, 14:35 20
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Private Sub Кнопочка_Click()
Cells.ClearFormats
Cells.ClearComments
'ещё добавить вставку исходных данных, которые искажены предыдущими запусками
 
Dim r&, c&, N&
For r = 2 To 15
  For c = 2 To 6
    N = Cells(r, c) / Cells(r, 1)
    N = N * Cells(r, 1)
    If N > Cells(r, c) Then
      Cells(r, c).Interior.Color = RGB(0, 255, 0)
      Cells(r, c).NoteText "Значение увеличено на " & N - Cells(r, c)
    ElseIf N < Cells(r, c) Then
      Cells(r, c).Interior.Color = RGB(255, 255, 0)
      Cells(r, c).NoteText "Значение уменьшено на " & Cells(r, c) - N
    End If
    Cells(r, c) = N
  Next c
Next
End Sub
0
28.01.2014, 14:35
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.01.2014, 14:35
Помогаю со студенческими работами здесь

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

Для каждой строки заданной матрицы найти номера столбцов, содержащих ненулевые элементы
Здравствуйте, помогите пожалуйста! Для каждой строки заданной матрицы A (n, m) найти номера...

Для каждой строки заданной матрицы А найти и напечатать номера столбцов, содержащих НЕнулевые элементы, m=5, n=4.
Необходимо решить следующую задачу: Для каждой строки заданной матрицы А найти и напечатать номера...

Для каждой строки заданной матрицы А{5,4) найти и напечатать номера столбцов, содержащих ненулевые элементы
Помогите пожалуйста, не могу сделать! Составить программу в системе Mathcad для заданной ...

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

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru