Автор Тема: Помогите найти ошибку в задаче. Basic  (Прочитано 1722 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Cimilia

  • Новичок
  • *
  • Сообщений: 8
    • Просмотр профиля
Помогите найти ошибку в задаче. Basic
« : 13 Февраля 2012, 16:01:56 »
Option Explicit On
Option Strict On
Imports System.Math
Public Class Form1

    Function vvod(ByVal T As TextBox) As Integer
        Return CInt(Val(T.Text))
    End Function

    Sub vvodmatr(ByRef A(,) As Double, ByVal m As Integer, ByVal n As Integer)
        Dim i, j As Integer
        For i = 0 To m
            For j = 0 To n
                A(i, j) = Rnd()         
            Next
        Next
    End Sub

    Sub vivodmatr(ByRef A(,) As Double, ByRef L As ListBox)
        Dim i, j, n, m As Integer
        Dim s As String
        m = 8
        n = 8
        Randomize()
        For i = 0 To m - 1
            s = ""
            For j = 0 To n - 1
                s = s + Format(A(i, j), "00.0") + Space(3)
            Next
            L.Items.Add(s)
        Next
    End Sub

    Sub minmax(ByRef B(,) As Double)
        Dim i, j, m, n As Integer
        Dim max, min As Single
        m = B.GetLength(0)
        n = B.GetLength(1)
        min = 3 * 10 ^ 6
        max = (-3) * 10 ^ 6
        For i = 0 To m - 1
            For j = 0 To n - 1
                If B(i, j) < min Then
                    min = CSng(B(i, j))
                    B(i, j) = B(i, m - 1)
                    B(i, m - 1) = min
                End If
                If B(i, j) > max Then
                    max = CSng(B(i, j))
                    B(i, j) = B(i, 1)
                    B(i, 1) = max
                End If

            Next
        Next
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim S(,) As Double
        Dim m, n As Integer
        m = vvod(TextBox1)
        n = vvod(TextBox2)
        vvodmatr(S, m, n)
        vivodmatr(S, ListBox1)
    End Sub
End Class

Там, где текст выделен красным, происходит остановка. Пишет "Ссылка на объект не указывает на экземпляр объекта". Не понимаю, что сие означает)). Помогите, пожалуйста

Оффлайн Selyd

  • Старожил
  • ****
  • Сообщений: 408
    • Просмотр профиля
Re: Помогите найти ошибку в задаче. Basic
« Ответ #1 : 13 Февраля 2012, 21:02:32 »
Посмотрите как работает генератор, точнее синтаксис этой функции.
Возможно оно понимает Rnd() как елемент массива.

Оффлайн wital1984

  • Постоялец
  • ***
  • Сообщений: 189
    • Просмотр профиля
Re: Помогите найти ошибку в задаче. Basic
« Ответ #2 : 13 Февраля 2012, 21:39:54 »
цитата из  http://msdn.microsoft.com:
Цитировать
Перед вызовом Rnd для инициализации генератора случайных чисел с начальным значением на основе системного таймера воспользуйтесь оператором Randomize без указания аргументов.
А у вас оператор Randomize стоит в совсем в другой подпрограмме.

Оффлайн sp

  • Пользователь
  • **
  • Сообщений: 51
    • Просмотр профиля
Re: Помогите найти ошибку в задаче. Basic
« Ответ #3 : 14 Февраля 2012, 01:46:31 »
А задание где?
В программе масса мелких не точностей. Вы входите в подпрограммы в каждую по разному. То передаёте размерности как параметры, то жёстко внутри.
Брать минимальным элементом самоё большое число, представимое в компьютере, и, аналогично максимальным, не очень красиво. Обычно берут первый элемент. Он минимальный и максимальный одновременно.
Я не вижу управляющей структуры. Кто минмах вызывает?
« Последнее редактирование: 14 Февраля 2012, 01:54:06 от sp »

Оффлайн Cimilia

  • Новичок
  • *
  • Сообщений: 8
    • Просмотр профиля
Re: Помогите найти ошибку в задаче. Basic
« Ответ #4 : 14 Февраля 2012, 11:44:08 »
цитата из  http://msdn.microsoft.com:
Цитировать
Перед вызовом Rnd для инициализации генератора случайных чисел с начальным значением на основе системного таймера воспользуйтесь оператором Randomize без указания аргументов.
А у вас оператор Randomize стоит в совсем в другой подпрограмме.
Исправила, не помогло

Оффлайн Cimilia

  • Новичок
  • *
  • Сообщений: 8
    • Просмотр профиля
Re: Помогите найти ошибку в задаче. Basic
« Ответ #5 : 14 Февраля 2012, 11:47:40 »
А задание где?
Задание: сформировать произвольно двумерный массив. Найти в каждой строке массива макс и мин элементы и поменять их местами соответственно с первым и последним элементами строки. Вывести полученный массив.



Код немного переделала + изначальный был не полным:
Option Explicit On
Option Strict On
Imports System.Math
Public Class Form1

    Function vvod(ByVal T As TextBox) As Integer
        Return CInt(Val(T.Text))
    End Function

    Sub vvodmatr(ByRef A(,) As Double)
        Dim i, j, n, m As Integer
        m = vvod(TextBox1)
        n = vvod(TextBox2)
        Randomize()
        For i = 0 To m - 1
            For j = 0 To n - 1
                A(i, j) = Rnd()
            Next
        Next
    End Sub

    Sub vivodmatr(ByRef A(,) As Double, ByRef L As ListBox)
        Dim i, j, n, m As Integer
        Dim s As String
        m = A.GetLength(0)
        n = A.GetLength(1)
        For i = 0 To m - 1
            s = ""
            For j = 0 To n - 1
                s = s + Format(A(i, j), "00.0") + Space(3)
            Next
            L.Items.Add(s)
        Next
    End Sub

    Sub minmax(ByRef B(,) As Double)
        Dim i, j, m, n As Integer
        Dim max, min As Single
        m = B.GetLength(0)
        n = B.GetLength(1)
        min = 3 * 10 ^ 6
        max = (-3) * 10 ^ 6
        For i = 0 To m - 1
            For j = 0 To n - 1
                If B(i, j) < min Then
                    min = CSng(B(i, j))
                    B(i, j) = B(i, m - 1)
                    B(i, m - 1) = min
                End If
                If B(i, j) > max Then
                    max = CSng(B(i, j))
                    B(i, j) = B(i, 1)
                    B(i, 1) = max
                End If

            Next
        Next
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim S(,) As Double
        vvodmatr(S)
        vivodmatr(S, ListBox1)
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Dim S(,) As Double
        minmax(S)
        vivodmatr(S, ListBox2)
    End Sub
End Class


Проблема пока остаётся та же.

Оффлайн Cimilia

  • Новичок
  • *
  • Сообщений: 8
    • Просмотр профиля
Re: Помогите найти ошибку в задаче. Basic
« Ответ #6 : 14 Февраля 2012, 11:49:09 »
Брать минимальным элементом самоё большое число, представимое в компьютере, и, аналогично максимальным, не очень красиво. Обычно берут первый элемент. Он минимальный и максимальный одновременно.
Да, знаю. Это личное требование преподавательницы. Без понятия, почему. Другого варианта не приемлет)