Модераторы: Poseidon

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Visual Basic]одномерный и двумерный массив 
:(
    Опции темы
Fortop
Дата 25.5.2008, 16:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 1
Всего: 42



Цитата(Пума @  25.5.2008,  14:51 Найти цитируемый пост)
3)если их положит. эл-ты расположены выше главной диагонали, то удаляем эти столбцы

Вот в этом куске твоего кода я и не разобрался smile Где он у тебя?

Цитата(Пума @  25.5.2008,  14:51 Найти цитируемый пост)
ColumnsState, ToDelete мы такого не проходили. Хотя для меня програм-е так далеко что даже комментарии не помогут

Это просто названия переменных.
Мы для начала помечаем столбцы которые нужно удалить и храним это в ColumnsState. 
ToDelete - просто счетчик, сколько столбцов нужно удалить (как в твоем коде переменная "r"). 

Логика такова, сначала проходимся по матрице и находим столбцы для удаления.(прошлись по магазину выбрали нужные вещи, попутно посчитали сколько сумок надо, чтобы все это унести)

Затем создаем новый массив с уже меньшим числом столбцов (берем нужное число сумок)
и копируем в него поэлементно только то, что нужно (складываем только выбраные вещи).


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
Пума
Дата 25.5.2008, 18:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 18.5.2008

Репутация: нет
Всего: нет



Цитата

Вот в этом куске твоего кода я и не разобрался  Где он у тебя?

Я эти коды от балды писала  smile , при помощи книжки одной. Там такое зад.: из матр. удалить столбцы, произведение элементов которых больше 0. И приведены коды:
Код

For j=1 To n
p=1
For i=1 To m
p=p*a(i,j)
Next i
If p>0 Then r=r+1
For k=j To n-r
For t=1 To m
a(t,k)=a(t,k+1)
Next t
Next k
Next j

m-кол-во строк, n-столбцов
i,k текущий индекс строки
j,t-текущий индекс столбца
Вот я пыталась эти коды под свою задачу переделать
PM MAIL   Вверх
Fortop
Дата 25.5.2008, 19:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 1
Всего: 42



Цитата(Пума @  25.5.2008,  18:30 Найти цитируемый пост)
Я эти коды от балды писала  

Понятно, тогда лучше осмысли мной вариант. 

Там нет проверки на квадратность матрицы
И стоит комментарий в том случае если все столбцы должны быть удалены.

Все остальное должно работаь.


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
Пума
Дата 26.5.2008, 22:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 18.5.2008

Репутация: нет
Всего: нет



Вот мои коды, переделанные под твои, но они не работают. Я уже замучалась smile 
Код

Private Sub task4()
    Frame2.Visible = True
   Pic2.Visible = True
   Pic2.Cls
   ReDim a(str, st)
   str = Val(txtstr.Text)
   st = Val(txtst.Text)
    If str = st Then f = 0 Else MsgBox "Матрица не квадратная", vbOKOnly + 48
   For j = 1 To st - 1
   Rem признак наличия в столбце позитивных элементов выше диагонали
       G(j) = True
           For i = 1 To j
        If a(i, j) > 0 Then
    Rem помечаем столбец для удаления
            G(j) = False
    Rem количество столбцов к удалению
            r = r + 1
                    Exit For
        End If
    Next i
Next j
If r = st Then
    Rem удаляем весь массив
    End
Else
    Rem новый массив с удаленными столбцами.
    Dim B(str, st - r) As Single
    Rem Номер столбца
    For j = 1 To st
            If G(j) Then
            T = T + 1
                        For i = 1 To str
                B(i, T) = a(i, j)
            Next i
        End If
    Next j
End If
Rem присваиваем результат
a = B
    For j = 1 To st
    For i = 1 To str
    Pic2.Print a(i, j)
    Next i
    Next j
End Sub


PM MAIL   Вверх
Fortop
Дата 26.5.2008, 23:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 1
Всего: 42



Код

Private Sub task4()
    Frame2.Visible = True
    Pic2.Visible = True
    Pic2.Cls

    Dim Lne As String
    Dim I As Integer, J As Integer, T As Integer
    Dim Col As Integer, Row As Integer
    Dim upperbound As Integer, lowerbound As Integer
    
    Row = Val(txtstr.Text)
    Col = Val(txtst.Text)
   
    ReDim G(Col) As Boolean
    ReDim a(Row, Col) As Single
    
    
    upperbound = 8
    lowerbound = 0
    
    Rem Инициализируем массив значениями
    For I = 1 To Row
        Lne = ""
        For J = 1 To Col
            a(I, J) = Int((upperbound - lowerbound + 1) * Rnd + lowerbound) - 7
            Lne = Lne & ":" & Format(a(I, J), "00;-0")
        Next
        Debug.Print Lne & vbCrLf
    Next
   
    If Row <> Col Then
        MsgBox "Матрица не квадратная", vbOKOnly + 48
        End
    End If
    
    For J = 1 To Col
    Rem признак наличия в столбце позитивных элементов выше диагонали
        G(J) = True
        For I = 1 To J
            If a(I, J) > 0 Then
                Rem помечаем столбец для удаления
                G(J) = False
                Rem количество столбцов к удалению
                R = R + 1
                Exit For
            End If
        Next I
    Next J
    If R = Col Then
        Rem удаляем весь массив
        End
    Else
        MsgBox "Удаляем " + Str(r) + " столбцов ", vbOKOnly
        Rem новый массив с удаленными столбцами.
        ReDim B(Row, Col - R) As Single
        Rem Номер столбца
        For J = 1 To Col
                If G(J) Then
                    T = T + 1
                    For I = 1 To Row
                        B(I, T) = a(I, J)
                    Next I
                End If
            Next J
        End If
    Rem присваиваем результат
    a = B
    
    For J = 1 To Col - R
        Lne = ""
        For I = 1 To Row
            Lne = Lne & ":" & Format(a(I, J), "00;-0")
        Next I
        Pic2.Print Lne & vbCrLf
        Debug.Print Lne & vbCrLf
    Next J
    Debug.Print "End"
End
End Sub


Добавлено через 4 минуты и 10 секунд
Во-первых, str - Это имя функции и для переменных лучше не использовать.
Во-вторых, массив нужно заполнить значениями.
В-третьих, когда выводишь, то новый массив имеет уже меньшее количество столбцов, поэтому для вывода тоже надо было ставить "Col - R"

Это сообщение отредактировал(а) Fortop - 26.5.2008, 23:42


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
Пума
Дата 27.5.2008, 20:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 18.5.2008

Репутация: нет
Всего: нет



Когда запускаю выводит сообщение об ошибке:Compile error:Expected array и выделяет в строчке MsgBox "Удаляем " + str® + " столбцов ", vbOKOnly   функцию str, типа здесь где-то ошибка

Цитата

Во-вторых, массив нужно заполнить значениями.

Какими значениями?
PM MAIL   Вверх
Fortop
Дата 27.5.2008, 20:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 1
Всего: 42



Цитата(Пума @  27.5.2008,  20:07 Найти цитируемый пост)
Когда запускаю выводит сообщение об ошибке:Compile error:Expected array и выделяет в строчке MsgBox "Удаляем " + str® + " столбцов ", vbOKOnly   функцию str, типа здесь где-то ошибка

Извини, но отладкой придется заниматься самостоятельно.

Проверял в Excel 2007 - VBA, работает без запинки.


Цитата(Пума @  27.5.2008,  20:07 Найти цитируемый пост)
Какими значениями?

Какими-нибудь smile
У тебя изначально массив пустой.

В моем коде я добавил его инициализацию значениями от -7 до 1
Цикл после 

Код

Rem Инициализируем массив значениями



--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
Пума
Дата 27.5.2008, 20:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 18.5.2008

Репутация: нет
Всего: нет



Я переделала у себя кое-что , теперь ошибка связанная с str не появляется. Но проблемы другие:
1) прог-ма не всегда удаляет нужные столбцы;
2)после ввода матрицы выскакивает сообщение, к примеру : "Удаляем 1 столбец!". После нажатия кнопки Ok происходит выход из программы, а новая матрица (без удаленных столбцов) не печатается.
PM MAIL   Вверх
Fortop
Дата 27.5.2008, 20:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 1
Всего: 42



Цитата(Пума @  27.5.2008,  20:40 Найти цитируемый пост)
1) прог-ма не всегда удаляет нужные столбцы;

Что значит не всегда? smile

Если тебе не нужно учитывать диагональ (для определения удалять/неудалять), то измени вот эту строку

Код

  For I = 1 To J

на

Код

  For I = 1 To J-1


Цитата(Пума @  27.5.2008,  20:40 Найти цитируемый пост)
2)после ввода матрицы выскакивает сообщение, к примеру : "Удаляем 1 столбец!". После нажатия кнопки Ok происходит выход из программы, а новая матрица (без удаленных столбцов) не печатается. 

А вот этого быть не должно. Там просто негде выходить. Пробуй отлаживать по шагам.


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
Пума
Дата 27.5.2008, 22:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 18.5.2008

Репутация: нет
Всего: нет



Цитата

Что значит не всегда? 

По-моему у меня удаляются нужные столбцы не выше а ниже диагонали.
Например:
-9 -7 -6 0
-9 8 7 -7
6 -10 -6 1
-5 1 8 3
Выводится сообщение "удаляем  2 столбца".
И еще: vbCrLf, + Str® +, Debug.Print "End" что это за функции? и для чего двоеточие в Lne = Lne & ":" & Format(q(I, J), "00;-0")
PM MAIL   Вверх
Fortop
Дата 27.5.2008, 23:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 1
Всего: 42



vbCrLf - константа. Означает перевод строки.
Str() - переводит число в строку
Debug.Print "End" - просто печать в окно отладочной информации.

Цитата(Пума @  27.5.2008,  22:55 Найти цитируемый пост)
для чего двоеточие в Lne = Lne & ":" & Format(q(I, J), "00;-0") 

Просто чтобы разделить между собой данные внутри одной строки.

Добавлено через 1 минуту и 44 секунды
Цитата(Пума @  27.5.2008,  22:55 Найти цитируемый пост)
По-моему у меня удаляются нужные столбцы не выше а ниже диагонали.
Например:
-9 -7 -6 0
-9 8 7 -7
6 -10 -6 1
-5 1 8 3
Выводится сообщение "удаляем  2 столбца".

Согласно условию должны удалиться 2й (8ка на диагонали) и 4й (1ца над диагональю) столбец.

Если не захватывать диагональ (я писал об этом выше), то только 4й и должно сообщать "удаляем 1 столбец"


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
Пума
Дата 28.5.2008, 19:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 18.5.2008

Репутация: нет
Всего: нет



Цитата

Согласно условию должны удалиться 2й (8ка на диагонали) и 4й (1ца над диагональю) столбец.

Само задание: Из матрицы удалить столбцы, ПЕРВЫЕ положительные эл-ты которых расположены выше главной  диагонали. Тогда по идее в приведенной матрице вообще ничего не должно удаляться, т. к. все первые элементы столбцов отрицательные, а последний столбец начинается с 0.

PM MAIL   Вверх
Fortop
Дата 28.5.2008, 21:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 1
Всего: 42



Читаем внимательно.

Цитата(Пума @  28.5.2008,  19:02 Найти цитируемый пост)
Само задание: Из матрицы удалить столбцы, ПЕРВЫЕ положительные эл-ты которых расположены выше главной  диагонали. Тогда по идее в приведенной матрице вообще ничего не должно удаляться, т. к. все первые элементы столбцов отрицательные, а последний столбец начинается с 0.


первые положительные элементы которых....

А не первые элементы которых положительны...

Добавлено @ 21:15
Короче нам достаточно чтобы любой положительный элемент в столбце был выше диагонали....

Это сообщение отредактировал(а) Fortop - 28.5.2008, 21:16


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
Пума
Дата 28.5.2008, 22:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 18.5.2008

Репутация: нет
Всего: нет



Слушай, а ты мозг! smile Спасибо тебе большое!!!
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.1283 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.