Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
 Аватар для Cartmannn
1 / 1 / 0
Регистрация: 06.08.2015
Сообщений: 99

Вставить столбец в двумерный массив

10.02.2018, 23:06. Показов 2460. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Собственно, необходимо вставить столбец из единиц в двумерный массив(4,5), после столбца К (К вводится с клавиатуры)
Только вот пример подобной операции как в паскале не проходит
Pascal
1
2
3
4
5
6
7
  for i := n downto k1 +1 do
    for j := 1 to m do
      X[i+1, j] := X[i, j];{элементу столбца j присваиваем элемент этого же столбца, но из предыдущей строки}
  for j := 1 to m do
    X[k1+1, j] := 0;
  Inc(n);
End;
Нового ничего не могу придумать, в силу неопытности и отсутствия навыков.
Прошу подсказки
VB.NET
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
43
44
45
46
47
48
49
50
51
52
Public Class Form1
    Function Entering(ByVal t As TextBox) As Double
        Return (Val(t.Text))
    End Function
 
    Sub Array(ByRef a(,) As Double)
        Dim i, j As Integer
        Randomize()
        For i = 0 To 4
            For j = 0 To 3
                a(i, j) = -30 + 60 * Rnd()
            Next j
        Next i
    End Sub
    Sub PrintArray(ByRef x(,) As Double, ByRef LB As ListBox)
        Dim i, j, m, n As Integer
        Dim z, z1 As String
        m = x.GetLength(0) - 1 : n = x.GetLength(1) - 1
        LB.Items.Clear()
        For i = 0 To m
            z = ""
            For j = 0 To n
                z1 = Format(x(i, j), "0.0")
                If x(i, j) < 0 Then
                    z1 = Space(2) + z1
                Else
                    z1 = Space(3) + z1
                End If
                z = z + z1
            Next j
            LB.Items.Add(z)
        Next i
    End Sub
 
    Sub Solution(ByRef N(,) As Double)
        Dim k As Integer
        k = InputBox("Введите значение k:")
        If k < 0 And k > 5 Then MsgBox("Условие 0<=k<=5 не выполнено")
         For i = 
              For j =
----------------- КУСОК НЕОБХОДИМОГО КОДА ------------------
              Next 
         Next
    End Sub
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim a(4, 3) As Double
        Array(a)
        PrintArray(a, ListBox1)
        Solution(a)
        PrintArray(a, ListBox2)
    End Sub
End Class
По поводу способов объявления и вывода массива: делаю по методичкам и проверяю у преподавателей старой закалки, поэтому приходится делать ровно так, как написано, увы.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
10.02.2018, 23:06
Ответы с готовыми решениями:

Вставить число в столбец в БД Access
Ни как не могу вставить число в столбец в бд access пишет ошибка синтаксиса INSERT sqlQuery = &quot;INSERT INTO elementPPT...

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

Как вставить после каждого столбца, содержащего максимальный по модулю элемент, столбец из нулей?
Дан двумерный массив размером n*m, заполненный случайным образом. 1. Вставить после каждого столбца, содержащего максимальный по модулю...

9
 Аватар для Winney
307 / 248 / 40
Регистрация: 28.09.2013
Сообщений: 600
11.02.2018, 00:50
А вы попробуйте представить двумерный массив в виде одномерного массива векторов (столбцов), и многое прояснится
0
 Аватар для Cartmannn
1 / 1 / 0
Регистрация: 06.08.2015
Сообщений: 99
11.02.2018, 19:26  [ТС]
Все равно не могу понять, можете более развернуто?
0
4709 / 3662 / 857
Регистрация: 02.02.2013
Сообщений: 3,518
Записей в блоге: 2
11.02.2018, 20:13
Cartmannn, можно так (на форме две сетки и кнопка)
VB.NET
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
43
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    Dim xx(,) As Integer = createData(3, 4) 'моделируем исходную матрицу
    showGrid(xx, DataGridView1) 'смотрим исходную матрицу
    Dim x() As Integer = {111, 222, 333} 'вставляемый столбец
    xx = insertColumn(xx, x, 2) 'вставляем x на место столбца с индексом 2
    showGrid(xx, DataGridView2) 'смотрим преобразованную матрицу
End Sub
Private Function createData(ByVal nr As Integer, ByVal nc As Integer) As Integer(,)
    Dim a(nr - 1, nc - 1) As Integer
    Dim rnd As New Random
    For i = 0 To nr - 1
        For j = 0 To nc - 1
            a(i, j) = rnd.Next(0, 101)
        Next
    Next
    Return a
End Function
Private Function insertColumn(ByVal xx(,) As Integer, ByVal x() As Integer, ByVal col As Integer) As Integer(,)
    Dim rr As Integer = xx.GetUpperBound(0)
    Dim cc As Integer = xx.GetUpperBound(1) + 1
    Dim ar(rr, cc) As Integer
    For i = 0 To rr
        For j = 0 To cc
            If j < col Then
                ar(i, j) = xx(i, j)
            ElseIf j = col Then
                ar(i, j) = x(i)
            Else
                ar(i, j) = xx(i, j - 1)
            End If
        Next
    Next
    Return ar
End Function
Private Sub showGrid(ByVal xx(,) As Integer, ByRef dgv As DataGridView)
    dgv.ColumnCount = xx.GetUpperBound(1) + 1
    dgv.RowCount = xx.GetUpperBound(0) + 1
    For i = 0 To dgv.RowCount - 1
        For j = 0 To dgv.ColumnCount - 1
            dgv.Rows(i).Cells(j).Value = xx(i, j)
        Next
    Next
End Sub
Миниатюры
Вставить столбец в двумерный массив  
1
 Аватар для Winney
307 / 248 / 40
Регистрация: 28.09.2013
Сообщений: 600
11.02.2018, 21:33
Лучший ответ Сообщение было отмечено Cartmannn как решение

Решение

Цитата Сообщение от Cartmannn Посмотреть сообщение
Все равно не могу понять, можете более развернуто?
Попробую. Пример, который привел ovva, заточен под визуализацию и для вас там важна функция insertColumn. Постарайтесь разобрать его.

В вашем случае.
Вставка столбца - это переопределение размерности массива, то есть использование оператора Redim с дополнением Preserve. При его использовании переопределять допустимо только последнюю размерность. Поэтому для улучшения восприятия кода и алгоритма сдвига в целом я вам и посоветовал использовать массив массивов - представьте каждый столбец в виде массива, а полученные массивы поместите в массив.

Возвращаясь к вашему коду.
1) Перед началом цикла нужно переопределить размерность массива, увеличив ее на единицу.
2) Проверить, не является ли столбец К последним. В этом случае просто добавляем столбец, без сдвига.
3) Если К - не последний, то при условии j=k+1 присваиваем элементу j=k+2 значение j=k+1, а в позицию j=k+1 вставляем новое значение.
1
 Аватар для Cartmannn
1 / 1 / 0
Регистрация: 06.08.2015
Сообщений: 99
14.02.2018, 23:51  [ТС]
Winney, ovva


Так у меня и не выходит создать новый массив (4,6) со столбцом единиц после К-ого столбца. Происходит обычная замена столбца К+1 на единицы и всё.
(Использование listbox обязательно)
VB.NET
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
Public Class Form1
    Function Entering(ByVal t As TextBox) As Double
        Return (Val(t.Text))
    End Function
 
    Sub Array(ByRef a(,) As Double)
        Dim i, j As Integer
        Randomize()
        For i = 0 To 3
            For j = 0 To 4
                a(i, j) = -30 + 60 * Rnd()
            Next j
        Next i
    End Sub
    Sub PrintArray(ByRef x(,) As Double, ByRef LB As ListBox)
        Dim i, j, m, n As Integer
        Dim z, z1 As String
        m = x.GetLength(0) - 1 : n = x.GetLength(1) - 1
        LB.Items.Clear()
        For i = 0 To m
            z = ""
            For j = 0 To n
                z1 = Format(x(i, j), "0.0")
                If x(i, j) < 0 Then
                    z1 = Space(2) + z1
                Else
                    z1 = Space(3) + z1
                End If
                z = z + z1
            Next j
            LB.Items.Add(z)
        Next i
    End Sub
    Sub Solution(ByRef N(,) As Double)
 
        Dim k As Integer
        k = InputBox("Введите значение k:")
        If k > 0 And k < 5 Then
            Dim a(,) As Double
            ReDim Preserve a(3, 5)
            For i As Integer = 0 To 3
                For j As Integer = UBound(a) - 1 To k + 1 Step -1
                    a(i, k + 2) = a(i, k + 1)
                Next j
                N(i, k) = 1
            Next
        End If
    End Sub
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim a(3, 4) As Double
        Array(a)
        PrintArray(a, ListBox1)
        Solution(a)
        PrintArray(a, ListBox2)
    End Sub
End Class
0
4709 / 3662 / 857
Регистрация: 02.02.2013
Сообщений: 3,518
Записей в блоге: 2
15.02.2018, 00:00
Cartmannn, я привел код который выполняет вашу задачу. Если есть по нему вопросы я отвечу.
Не понял о каком listbox идет речь.
0
1 / 1 / 1
Регистрация: 31.08.2012
Сообщений: 9
15.02.2018, 06:14
Как минимум, ошибка в процедуре Solution. Вы используете массив N в конце второго цикла, а до этого используете массив a, изменения в котором за пределы процедуры не выходят совсем. Поэтому, в процедуре Solution единственное что работает - это присваивание значений в массив N, эта строчка то и меняет у вас всего один ряд. В вашей программе много наворочено непонятно зачем, но это , конечно, ваше дело.
Если хотите исправить ситуацию работайте в процедуре Solution с массивом который вы получили в ней по ссылке, то есть с массивом N, а массив "a" предлагаю забыть в этой процедуре.

Добавлено через 57 минут
Процедура Solution, а не Solusion, недоглядел немного.
0
 Аватар для Cartmannn
1 / 1 / 0
Регистрация: 06.08.2015
Сообщений: 99
17.02.2018, 00:35  [ТС]
Собственно, написал код
Может кому понадобится
VB.NET
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
Public Class Form1
    Function Entering(ByVal t As TextBox) As Double
        Return (Val(t.Text))
    End Function
 
    Sub Array(ByRef a(,) As Double)
        Dim i, j As Integer
        Randomize()
        For i = 0 To 3
            For j = 0 To 4
                a(i, j) = -30 + 60 * Rnd()
            Next j
        Next i
    End Sub
    Sub PrintArray(ByRef x(,) As Double, ByRef LB As ListBox)
        Dim i, j, m, n As Integer
        Dim z, z1 As String
        m = x.GetLength(0) - 1 : n = x.GetLength(1) - 1
        LB.Items.Clear()
        For i = 0 To m
            z = ""
            For j = 0 To n
                z1 = Format(x(i, j), "0.0")
                If x(i, j) < 0 Then
                    z1 = Space(2) + z1
                Else
                    z1 = Space(3) + z1
                End If
                z = z + z1
            Next j
            LB.Items.Add(z)
        Next i
    End Sub
    Sub Solution(ByRef N(,) As Double)
 
        Dim k As Integer
        k = InputBox("Введите значение k:")
        If k > 0 And k < 5 Then
            ReDim Preserve N(3, 5)
            For i As Integer = 0 To 3
                For j As Integer = 4 To k Step -1
                    N(i, j + 1) = N(i, j)
                Next j
                N(i, k) = 1
            Next
        ElseIf k = 5 Then
            ReDim Preserve N(3, 5)
            For i As Integer = 0 To 3
                N(i, 5) = 1
 
            Next
        End If
    End Sub
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim a(3, 4) As Double
        Array(a)
        PrintArray(a, ListBox1)
        Solution(a)
        PrintArray(a, ListBox2)
    End Sub
End Class
Много лишнего конечно, но иначе никак. Принуждают делать так, как говорят

Добавлено через 7 часов 11 минут
Еще один пример кода, без использования ReDim Preserve
Кроме того, работает для всех матриц и k
VB.NET
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
43
44
45
Public Class Form1
    Sub Array(ByRef N(,) As Integer, ByVal m As Integer, ByVal l As Integer)
        Dim i, j As Integer
        Randomize()
        For i = 0 To m
            For j = 0 To l
                N(i, j) = -30 + 60 * Rnd()
            Next j
        Next i
    End Sub
    Sub PrintArray(ByRef N(,) As Integer, ByRef LB As ListBox, ByVal m As Integer, ByVal l As Integer)
        Dim i, j As Integer
        Dim z As String
        For i = 0 To m
            z = " "
            For j = 0 To l
                z = z + Format(N(i, j), "0") + Space(4)
            Next j
            LB.Items.Add(z)
        Next i
    End Sub
    Sub Solution(ByRef N(,) As Integer, ByVal m As Integer, ByVal l As Integer)
        Dim k As Integer
        k = InputBox("Введите значение k:")
        For i As Integer = 0 To m
            For j As Integer = l - 1 To k Step -1
                N(i, j + 1) = N(i, j)
            Next
            N(i, k) = 1
        Next
    End Sub
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim m, l As Integer
        l = ((TextBox1.Text) + 1)
        m = (TextBox2.Text)
        Dim N(m, l) As Integer
        Array(N, m, l)
        PrintArray(N, ListBox1, m, l - 1)
        Solution(N, m, l)
        PrintArray(N, ListBox2, m, l)
    End Sub
    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        End
    End Sub
End Class
Спасибо всем за советы
0
4709 / 3662 / 857
Регистрация: 02.02.2013
Сообщений: 3,518
Записей в блоге: 2
17.02.2018, 13:32
Цитата Сообщение от Cartmannn Посмотреть сообщение
Собственно, написал код
Может кому понадобится
Не поленился и сделал небольшой анализ вашего последнего кода
VB.NET
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
'Вообще-то Array в NET это имя класса и я бы воздержался от использования его при именовании собственных объектов.
'Sub Array(ByRef N(,) As Integer, ByVal m As Integer, ByVal l As Integer)
'm, l - нет никакой необходимости в передачи этих параметров.
Private Sub myArray(ByVal N(,) As Integer)
    'Dim i, j As Integer 'нет необходимости
    'Randomize() 'в NET уже (практически) не используется
    Dim nij As New Random
    For i = 0 To N.GetUpperBound(0) 'Цикл по строкам от 0 до верхней границы
        For j = 0 To N.GetUpperBound(1) 'Цикл по столбцам от 0 до верхней границы
            'N(i, j) = -30 + 60 * rnd()
            N(i, j) = nij.Next(-50, 51) 'генерируем псевдослучайное целое число из интервала [-50,50] 
        Next j
    Next i
End Sub
'Sub PrintArray(ByRef N(,) As Integer, ByRef LB As ListBox, ByVal m As Integer, ByVal l As Integer)
Private Sub PrintArray(ByVal N(,) As Integer, ByVal LB As ListBox)
    'Dim i, j As Integer
    Dim z As String
    LB.Items.Clear()
    LB.Font = New Font(FontFamily.GenericMonospace, 9) 'числа в LB будут выглядеть ровнее
    For i = 0 To N.GetUpperBound(0)
        'z = " "
        z = ""
        For j = 0 To N.GetUpperBound(1)
            'z = z + Format(N(i, j), "0") + Space(4)
            z &= N(i, j).ToString.PadLeft(6)
        Next j
        LB.Items.Add(z)
    Next i
End Sub
'Sub Solution(ByRef N(,) As Integer, ByVal m As Integer, ByVal l As Integer)
Private Function Solution(ByRef N(,) As Integer) As Integer(,)
    Dim k As Integer = InputBox("Введите значение k:") 'предполагается что k это индекс столбца в матрице NN,
    'или индекс столбца в матрице N на место которого будет вставлен единичный столбец
    'проверка допустимости k тоже была бы не лишней
    Dim NN(N.GetUpperBound(0), N.GetUpperBound(1) + 1) As Integer
    For i As Integer = 0 To NN.GetUpperBound(0)
        For j As Integer = 0 To NN.GetUpperBound(1)
            If j < k Then
                NN(i, j) = N(i, j) 'до столбца k
            ElseIf j = k Then
                NN(i, j) = 1 'столбец k
            Else
                NN(i, j) = N(i, j - 1) 'после столбца k
            End If
        Next
    Next
    Return NN
End Function
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    'Обычно предполагается, что пользователь вводит размеры матрицы, т.е. число строк (m) и число столбцов (l). 
    'Ему не интересно как определяются нижняя и верхняя границы.
    'Здесь неплохо бы дополнительно проверять корректность введенного в TextBox'ы
    Dim m As Integer = CInt(TextBox2.Text)
    Dim l As Integer = CInt(TextBox1.Text)
    'l = ((TextBox1.Text) + 1)
    'm = (TextBox2.Text)
    Dim N(m - 1, l - 1) As Integer 'с учетом вышесказанного
    myArray(N)
    PrintArray(N, ListBox1)
    PrintArray(Solution(N), ListBox2)
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    'End
    'достаточно так (т.к. в настройках у вас уже стоит Shutdown mode: When startup form closes)
    Me.Close()
End Sub
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
17.02.2018, 13:32
Помогаю со студенческими работами здесь

Вставить одномерный массив в двумерный массив так, чтобы второй столбец был отсортирован по убыванию
Помогите пожалуйста решить задачку: Вставить в качестве новой строки одномерный массив В в двумерный массив А так, чтобы второй столбец...

Вставить в двумерный массив столбец после столбца с номером k
Здравствуйте. Помогите, пожалуйста, решить задачу. Абсолютно нет идей, как её решать. Дан двумерный массив. Вставить в него столбец из...

Двумерный массив: Вставить после столбцов, содержащих минимальное значение второй столбец
Помогите решить задание: Дан двумерный динамический массив, Вставить после столбцов, содержащих минимальное значение второй столбец. ...

дан двумерный массив размером 5x6, вставить после столбцов с максимальными элементами столбец с нулями
дан двумерный массив размером 5x6, заполненный случайным образом. вставить после столбцов с максимальными элементами столбец с нулями

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


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита "ПричинаСписания". . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Программное заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru