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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.04.2013, 21:16   #1
Ingez
Пользователь
 
Регистрация: 23.03.2013
Сообщений: 24
По умолчанию И снова VBA.....

Уважаемые, форумчане!
Нужна ваша помочь!
Нужно решить пару задач на VBA:

1.Дан массив A размера N и целое число K (1 ≤ K ≤ N). Вывести элементы массива с порядковыми номерами, кратными K: A с индексом К, A с индексом 2K, A с индексом 3K, … . Условный оператор не использовать.

2.Дан массив A размера N. Сформировать новый массив B того же размера по следующему правилу: элемент B( с индексом К) равен сумме элементов массива A с номерами от 1 до K.


Желательно создать программу легко понимаемую начинающим программистом.

Буду очень благодарен.
Ingez вне форума Ответить с цитированием
Старый 03.04.2013, 21:52   #2
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,309
По умолчанию

Первую задачу можно так:
1. Определим максимальную кратность:
Код:
MaxKr = N \ K ' целочисленное деление, если  с памятью все Ок
2. Организуем цикл
Код:
for i = 1 to MaxKr
         'вывод элементов массива: A[i*K] 
    Next
Со второй можно поступить так:
Код:
Sum = 0  
' Организовать цикл по i
For i = 1 to N
   Sum = Sum + A[i]
   B[i] = Sum
Next

Как-то так ...
PS: Это только алгоритм, работу не проверял
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 03.04.2013, 22:04   #3
Sasha_Smirnov
Особый статус
Участник клуба
 
Аватар для Sasha_Smirnov
 
Регистрация: 24.11.2008
Сообщений: 1,535
По умолчанию

А я испытал... только первую. Обошлось без \
Код:
Option Base 1   'нумерация в массивах начиная с 1
Option Explicit 'необходимость объявить все переменные


Sub FitToK() 'вывод элементов массива, индекс которых кратен K (1 <= K <= N)
Const K = 3

Dim i As Long, N As Long, S As String, A As Variant
    A = Array(1, 2, 3, 4, 5, 5, 4, 3, 2, 1)

    N = UBound(A)                           'число элементов массива
    
    'контроль числа элементов массива
    Select Case N
        Case Is = -1: MsgBox "Массив не задан. ": Exit Sub
        Case Is < K: MsgBox "Массив слишком мал для заданного K.": Exit Sub
    End Select
    
    
    For i = K To N Step K
        S = S & A(i) & " "  'добавляем в строку S каждый K-й элемент (через пробел)
    Next
    
MsgBox "Исходный массив: " & vbTab & Join(A, " ") & Chr(13) & Chr(13) & _
       "Желанный массив: " & vbTab & S
End Sub
Изображения
Тип файла: jpg КратныеКа.jpg (45.1 Кб, 116 просмотров)
Sasha_Smirnov вне форума Ответить с цитированием
Старый 03.04.2013, 23:22   #4
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,309
По умолчанию

Небольшое замечание:
Код:
Select Case N
        Case Is = -1: MsgBox "Массив не задан. ": Exit Sub
        Case Is < K: MsgBox "Массив слишком мал для заданного K.": Exit Sub
End Select
Оператор Case - другая форма условного оператора. Ее использовать, по условию задачи нельзя.

Код:
N = UBound(A)                           'число элементов массива
По условию задачи N уже определено.

Код:
For i = K To N Step K
А вот об этом не задумался, хотя в хелпе увидел.
Конежно, это хорошая версия.



Вроде так ...
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 04.04.2013, 00:00   #5
Sasha_Smirnov
Особый статус
Участник клуба
 
Аватар для Sasha_Smirnov
 
Регистрация: 24.11.2008
Сообщений: 1,535
По умолчанию

Цитата:
Сообщение от ViktorR Посмотреть сообщение
Оператор Case - другая форма условного оператора. Ее использовать, по условию задачи нельзя.
Да и не надо. Без него можно.
Цитата:
Сообщение от ViktorR Посмотреть сообщение
По условию задачи N уже определено.
Задал чисто для испытания.

Каждый волен брать мой код и переделывать. Например, в функцию с параметрами.

Последний раз редактировалось Sasha_Smirnov; 04.04.2013 в 00:03.
Sasha_Smirnov вне форума Ответить с цитированием
Старый 04.04.2013, 22:46   #6
Ingez
Пользователь
 
Регистрация: 23.03.2013
Сообщений: 24
По умолчанию

Цитата:
Сообщение от ViktorR Посмотреть сообщение
Со второй можно поступить так:
Код:
Sum = 0  
' Организовать цикл по i
For i = 1 to N
   Sum = Sum + A[i]
   B[i] = Sum
Next
Спасибо большое за решения !
только вот не пойму
Код:
 B[i] = Sum
разве такое возможно?

мой код пока не рабочий:
Код:
Sub massiv1()
Dim N,i, A() As Byte
N = Cells(1, 1)
ReDim A(1 To N)
Sum = 0
For i = 1 To N: A(i) = Cells(2, i): Next i
   Sum = Sum + A(i)
   B(i) = Sum 'не знаю как тут быть 
Next i: Cells(3, i) = B(i): End Sub
Ingez вне форума Ответить с цитированием
Старый 06.04.2013, 00:23   #7
Ingez
Пользователь
 
Регистрация: 23.03.2013
Сообщений: 24
По умолчанию

Тема все еще актуальна.
Ingez вне форума Ответить с цитированием
Старый 06.04.2013, 03:39   #8
Sasha_Smirnov
Особый статус
Участник клуба
 
Аватар для Sasha_Smirnov
 
Регистрация: 24.11.2008
Сообщений: 1,535
По умолчанию

Менее очевидно (на мой взгляд), но в принципе аналогично:
Код:
Option Base 1   'нумерация в массивах начиная с 1


Sub SumToK() 'создание массива B, причём каждый его элемент B(i) = сумме A(i) (для i = 1..K)

Dim i As Long, K As Long, N As Long, S As String, A As Variant, B As Variant
    A = Array(0, 1, 2, 3, 4, 5)
    N = UBound(A)                           'число элементов массива A
ReDim B(1 To N) 'определение массива B как соразмерного массиву A
    
    For i = 1 To N
        For K = 1 To i      'вычисляем K-й элемент массива B, т. е. B(K)
        B(i) = B(i) + A(K)  'добавляем к элементу B(i) K-й элемент массива A
        Next
    Next
    
MsgBox "Исходный массив:" & vbTab & Join(A) & Chr(13) & Chr(13) & _
       "Желанный массив:" & vbTab & Join(B)
End Sub
Изображения
Тип файла: jpg beta-test.jpg (11.7 Кб, 133 просмотров)

Последний раз редактировалось Sasha_Smirnov; 06.04.2013 в 14:56.
Sasha_Smirnov вне форума Ответить с цитированием
Старый 07.04.2013, 21:07   #9
Ingez
Пользователь
 
Регистрация: 23.03.2013
Сообщений: 24
По умолчанию

Спасибо большое, Вам Sasha_Smirnov !
Не совсем понял данный кусок кода:
Код:
 For i = 1 To N
        For K = 1 To i      'вычисляем K-й элемент массива B, т. е. B(K)
        B(i) = B(i) + A(K)  'добавляем к элементу B(i) K-й элемент массива A
        Next
    Next
а конкретно говоря
Код:
For K = 1 To i
это как получается от К=1 до i-того элемента, что-то понять не могу?
i-тый элемент в данном случае это какой элемент?
Не могли ли Вы привести наглядный пример на элементах массива?
Ingez вне форума Ответить с цитированием
Старый 07.04.2013, 23:35   #10
Ingez
Пользователь
 
Регистрация: 23.03.2013
Сообщений: 24
По умолчанию

Цитата:
Сообщение от Sasha_Smirnov Посмотреть сообщение
Да и не надо. Без него можно.

.
А как задать условие 1 ≤ K ≤ N не используя case и счетный оператор цикла?
Ingez вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
И снова COM.... kineziz Общие вопросы C/C++ 6 22.07.2012 23:10
Снова и снова. ladose Общие вопросы Delphi 1 11.04.2012 03:37
VBA Word,VBA Excel решить 2 задачи fafolo4ka Фриланс 6 05.03.2012 01:15
и снова С++ ltony Помощь студентам 5 04.02.2012 02:16
MDIChild снова и снова... Siber_Dec Общие вопросы Delphi 2 13.12.2009 03:24