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

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

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Word
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.03.2010, 17:17   #1
Tomoa
Пользователь
 
Регистрация: 27.11.2009
Сообщений: 31
Вопрос Вычисление сумм элементов матрицы А размера n x n, лежащих выше, ниже и на главной диагонали

Здравствуйте, уважаемые господа программисты!
Помогите найти ошибку в задаче
Необходимо составить программу вычисления сумм элементов матрицы А размера n x n, лежащих выше, ниже и на главной диагонали. Результат вычислений записать в одномерный массив.
написала следующий код:
Public Sub Var15()
Dim A() As Double, B() As Double, n As Integer, i As Integer, j As Integer, q As Integer, w As Integer, d As Integer
n = InputBox(" Введите размерность массива (n*n)")
ReDim A(1 To n, 1 To n)
ReDim B(1 To n)
For i = 1 To n
For j = 1 To n
A(i, j) = InputBox(" Введите элемент A (" & i & "," & j & ")")
Next j
Next i
q = 0
w = 0
d = 0
For i = 1 To n
For j = 1 To n
If i > j Then q = q + A(i, j)
ElseIf i = j Then w = w + A(i, j)
Else: d = d + A(i, j)
End If
Next j
Selection.TypeText Text:=B(i) & vbCrLf
Next i
End Sub

при запуске выдается ошибка Else without If
Tomoa вне форума Ответить с цитированием
Старый 07.03.2010, 07:07   #2
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию

Ошибка в том, что в условии If нельзя одновременно использовать ElseIf и Else. Только что-нибудь одно. В алгоритм не вникаю, попробуй использовать Select…Case:
Код:
  For i = 1 To n
    For j = 1 To n
      Select Case i
        Case Is > j
          q = q + A(i, j)
        Case Is = j
          w = w + A(i, j)
        Case Is < j
          d = d + A(i, j)
      End Select
    Next j
    Selection.TypeText Text:=B(i) & vbCrLf
  Next i
Лучше день потерять — потом за пять минут долететь!©
viter.alex вне форума Ответить с цитированием
Старый 07.03.2010, 16:39   #3
Aent
Форумчанин
 
Аватар для Aent
 
Регистрация: 17.07.2009
Сообщений: 519
По умолчанию

Цитата:
Ошибка в том, что в условии If нельзя одновременно использовать ElseIf и Else.
Почему же нельзя ? Вполне можно. В этом случае ELSE относится к вариантам, не удовлетворившим ни одному предыдущему условию.
Вот выдержка из HELP VBA
Цитата:
Syntax

If condition Then [statements] [Else elsestatements]

Or, you can use the block form syntax:

If condition Then
[statements]

[ElseIf condition-n Then
[elseifstatements] ...

[Else
[elsestatements]]

End If
А в приведённом выше случае просто нарушен синтаксис - смешаны однострочный и блочный варианты оператора if
Вот так синтаксической ошибки не будет.
Код:
'...
            If i > j Then
                 q = q + A(i, j)
            ElseIf i = j Then
                 w = w + A(i, j)
            Else
                d = d + A(i, j)
            End If
'...
P.S. В алгоритм так же не вникал.

Последний раз редактировалось Aent; 07.03.2010 в 16:56.
Aent вне форума Ответить с цитированием
Старый 07.03.2010, 16:51   #4
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию

Ага, значит это я перепутал. В этом случае ошибка состоит в том, что выполняемое по условию действие записано в одной строке c Then, т.е. является однострочным.
Лучше день потерять — потом за пять минут долететь!©
viter.alex вне форума Ответить с цитированием
Старый 12.03.2010, 19:35   #5
Alex-roz
Пользователь
 
Регистрация: 12.03.2010
Сообщений: 15
Подмигивание

Если результат представляет собой три суммы, то одномерный массив должен быть определен как В(1 to 3). Если это так, то....

Public Sub Var15()
Dim n, i, j, q, w, d As Integer
n = InputBox(" Введите размерность массива (n*n)")

ReDim A(n, n), B(1 To 3) As Double

For i = 1 To n
For j = 1 To n
A(i, j) = InputBox(" Введите элемент A (" & i & "," & j & ")")
Next j
Next i


q = 0
w = 0
d = 0

For i = 1 To n
For j = 1 To n

If i > j Then
q = q + A(i, j)
ElseIf i < j Then
w = w + A(i, j)
Else: d = d + A(i, j)
End If

Next j
Next i

B(1) = q
B(2) = w
B(3) = d

Selection.TypeText Text:=q & vbCrLf
Selection.TypeText Text:=w & vbCrLf
Selection.TypeText Text:=d & vbCrLf
End Sub
Alex
Alex-roz вне форума Ответить с цитированием
Старый 25.03.2010, 16:21   #6
Skif-F
Форумчанин
 
Регистрация: 24.03.2010
Сообщений: 349
По умолчанию

Цитата:
Сообщение от viter.alex Посмотреть сообщение
Ага, значит это я перепутал. В этом случае ошибка состоит в том, что выполняемое по условию действие записано в одной строке c Then, т.е. является однострочным.
Вообще, ошибка в том, что люди зачем-то экономят строки. Ну нельзя так! Для чего-то ведь придумали ВЫДЕЛЯТЬ структуру программы. Недаром в Бейсик вставили "странный" оператор Option Explicit - тоже для структурирования
Нет нерешаемых задач - есть недостаток времени и данных!
Skif-F вне форума Ответить с цитированием
Старый 25.03.2010, 18:07   #7
Sasha_Smirnov
Особый статус
Участник клуба
 
Аватар для Sasha_Smirnov
 
Регистрация: 24.11.2008
Сообщений: 1,535
По умолчанию

Цитата:
Сообщение от Tomoa Посмотреть сообщение
Здравствуйте, уважаемые господа программисты!
Помогите найти ошибку в задаче
Необходимо составить программу вычисления сумм элементов матрицы А размера n x n, лежащих выше, ниже и на главной диагонали. Результат вычислений записать в одномерный массив.
написала следующий код... при запуске выдается ошибка Else without If
А я написал следующий
Код:
For i = 1 To n
    For j = 1 To n
        If i > j Then q = q + A(i, j)
        If i = j Then w = w + A(i, j)
        If i < j Then d = d + A(i, j)
    Next
Next

Яснее на порядок, не так ли?

По условию задачи (о чём неустанно напоминает Alex-roz)
B(1) = q
B(2) = w
B(3) = d


Это, конечно, разработчиками «варианта 15» притянуто за уши, но уж как задали, так честный программист и выдаёт! Улыбаясь в душе.

Последний раз редактировалось Sasha_Smirnov; 26.03.2010 в 17:28. Причина: подредактировал.
Sasha_Smirnov вне форума Ответить с цитированием
Старый 26.03.2010, 12:48   #8
Sasha_Smirnov
Особый статус
Участник клуба
 
Аватар для Sasha_Smirnov
 
Регистрация: 24.11.2008
Сообщений: 1,535
По умолчанию

Цитата:
Сообщение от Skif-F Посмотреть сообщение
Недаром в Бейсик вставили "странный" оператор Option Explicit - тоже для структурирования
40 лет штудирую словари, ну ладно — 35, пытаясь для себя определить понятие "странный"... Странное оно какое-то.

Инструкция
PHP код:
Option Explicit 
не является ни STRANGE, ни DULL, ни тем более CRAZY/MAZY! Скорее, она MUZZY. Но если заглянуть в анналы...
(Предоставляю первому кто прочтёт — продолжить мысль.)

Последний раз редактировалось Sasha_Smirnov; 26.03.2010 в 17:27.
Sasha_Smirnov вне форума Ответить с цитированием
Старый 04.04.2010, 20:18   #9
Sasha_Smirnov
Особый статус
Участник клуба
 
Аватар для Sasha_Smirnov
 
Регистрация: 24.11.2008
Сообщений: 1,535
По умолчанию Хорошо темперированный клавир (код VBA)

Код:
Sub Krootor() 'шпигует словами и приставками-паразитами некоторые глаголы и прилагательные'
'(обрабатывает примерно 1000 слов в минуту)'
    With ActiveDocument.Words
    For n = 1 To .Count
    slovo = .Item(n)
        If Len(slovo) > 2 Then
        
            Select Case Right(slovo, 3) Like "*[!ая][агимоуыя][йоухя]*"
            Case True
'                MsgBox slovo, vbInformation'
                    Select Case Left(slovo, 1) Like "[А-ЯЁ]"
                    Case True   'когда (ожидаемое) имя прилагательное идёт с заглавной буквы'
                            .Item(n) = "Мега-" & slovo
                            n = n + 2
                    Case Else   'в иных случаях'
                            If Left(slovo, 1) Like "[!етэ]" Then .Item(n) = "мега" & slovo
                    End Select
            Case Else
                    Select Case Right(slovo, 3) Like "*[динтшюя][еилть]*" Or slovo Like "не?"
                    Case True
                            Select Case Left(slovo, 1) Like "[А-ЯЁ]"
                            Case True
                                    .Item(n) = StrConv(slovo, vbLowerCase)
                                    .Item(n) = "Типа " & slovo
                            Case Else
                                    .Item(n) = "типа " & slovo
                            End Select
                            n = n + 1 'чтобы пропустить добавленное слово'
                    End Select
            End Select
            
        End If
    Next
    End With
End Sub
Обычные (и даже трагичные) новости превращаются в нефильтрованный базар!
Sasha_Smirnov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[Pascal] найти сумму элементов лежащих ниже побочной диагонали Рамик Помощь студентам 12 28.03.2011 22:53
в сглаженой матрице найти сумму модулей элементов расположенных ниже главной диагонали Sergeo_89 Паскаль, Turbo Pascal, PascalABC.NET 8 07.12.2010 00:02
Вычислить сумму элементов матрицы, расположенные на главной диагонали и выше нее MariyaVo Паскаль, Turbo Pascal, PascalABC.NET 9 10.05.2009 21:19
Найти сумму парных элементов матрицы v[4][4].Расположенных ниже главной диагонали. Black_Angel91 Помощь студентам 11 21.04.2009 20:51
произведение всех элементов, расположенных на главной диагонали и выше ее матрицы размером 4х4, Pascal __FIRST__ Помощь студентам 2 12.12.2008 02:43