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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.02.2012, 21:41   #1
Cimilia
 
Регистрация: 18.02.2012
Сообщений: 3
По умолчанию Ошибка в подпрограмме. Basic. Двумерные массивы

Подпрограммка должна искать в каждой строчке макс и мин элементы и менять их местами соответственно с первым и последним элементами строки. Перекраивала по-разному. Нужен свежий взгляд)

Код:
Sub minmax(ByRef B(,) As Double) 
Dim i, j, m, n, jmin, jmax As Integer 
Dim max, min, k, c As Single 
m = B.GetLength(0) - 1 
n = B.GetLength(1) - 1 
For i = 0 To m - 1 
For j = 0 To n - 1 
B(i, 0) = min 
If B(i, j) < min Then 
min = CSng(B(i, j)) 
jmin = j 
End If 
Next 
k = CSng(B(i, jmin)) 
B(i, jmin) = B(i, m - 1) 
B(i, m - 1) = k 
Next 
For i = 0 To m - 1 
For j = 0 To n - 1 
B(i, 0) = max 
If B(i, j) > max Then 
max = CSng(B(i, j)) 
jmax = j 
End If 
Next 
c = CSng(B(i, jmax)) 
B(i, jmax) = B(i, 0) 
B(i, 0) = c 
Next 

End Sub

Последний раз редактировалось ACE Valery; 19.02.2012 в 02:06.
Cimilia вне форума Ответить с цитированием
Старый 18.02.2012, 23:23   #2
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,311
По умолчанию

Поправлю только первый фрагмент.
Код:
For i = 0 To m - 1
  min = B(i, 0)      ' Первый элемент примем за min
                        ' до начала цикла, в котором ищем минимум
  For j = 0 To n - 1
    If B(i, j) < min Then
       min = CSng(B(i, j))
       jmin = j
    End If
  Next
Примечание: Поиск максимума можно организовать в том же цикле.

Как то так ...
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 19.02.2012, 14:53   #3
Cimilia
 
Регистрация: 18.02.2012
Сообщений: 3
По умолчанию

Переделала, но это ничего не изменило. Возможно, ошибка где-то ещё. Я даже не могу понять, что программа вообще делает). Она как-то меняет элементы, но явно не правильно. Причём какие-то элементы почему-то обнуляются. Прилагаю код программы и скрин нынешнего результата.

Код:
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 = A.GetLength(0) - 1
        n = A.GetLength(1) - 1
        Randomize()
        For i = 0 To m - 1
            For j = 0 To n - 1
                A(i, j) = Rnd() + 3 / 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) - 1
        n = A.GetLength(1) - 1
        For i = 0 To m - 1
            s = ""
            For j = 0 To n - 1
                s = s + Format(A(i, j), "0.0") + Space(4)
            Next
            L.Items.Add(s)
        Next
    End Sub

    Sub minmax(ByRef B(,) As Double)
        Dim i, j, m, n, jmin, jmax As Integer
        Dim max, min, k, c As Single
        m = B.GetLength(0) - 1
        n = B.GetLength(1) - 1
        For i = 0 To m - 1
            B(i, 0) = min
            For j = 0 To n - 1
                If B(i, j) < min Then
                    min = CSng(B(i, j))
                    jmin = j
                End If
            Next
            k = CSng(B(i, jmin))
            B(i, jmin) = B(i, m - 1)
            B(i, m - 1) = k
        Next
        For i = 0 To m - 1
            B(i, 0) = max
            For j = 0 To n - 1
                If B(i, j) > max Then
                    max = CSng(B(i, j))
                    jmax = j
                End If
            Next
            c = CSng(B(i, jmax))
            B(i, jmax) = B(i, 0)
            B(i, 0) = c
        Next
    End Sub

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

End Class
Помогите, пожалуйста
Изображения
Тип файла: jpg Безымянный.jpg (33.1 Кб, 118 просмотров)
Cimilia вне форума Ответить с цитированием
Старый 20.02.2012, 21:19   #4
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,311
По умолчанию

А Вы внимательно прочитали мое замечание?
Вы пишите на VB, а не на Ассемблре.
Например, как понимать этот код?
B(i, 0) = min
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 20.02.2012, 21:38   #5
Hacker19_90
Delphi Warrior
Старожил
 
Аватар для Hacker19_90
 
Регистрация: 15.08.2008
Сообщений: 2,502
По умолчанию

Цитата:
Вы пишите на VB, а не на Ассемблре.
покажите мне пожалуйста место где язык ассемблера используется
Цитата:
Например, как понимать этот код?
B(i, 0) = min
Если индексация начинается с 0
То первому элементу в строке присвоить значение которое хранится в min
Что не понятно?
Mess with the best, die like the rest. (с) Hackers
Лабораторные, курсовые на Delphi\Pascal\C++
ya.flex-freelance@yandex.ru Icq - 636-954-303
Hacker19_90 вне форума Ответить с цитированием
Старый 20.02.2012, 21:47   #6
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,311
По умолчанию

Hacker19_90
Цитата:
Если индексация начинается с 0
То первому элементу в строке присвоить значение которое хранится в min
Что не понятно?
А Вы внимательно прочитали условие?
Ищется min.
Полагаем, что первый элемент min и тогда надо:
min = B(i, 0) ' Положить текущее значение равным минимальному.

Цитата:
покажите мне пожалуйста место где язык ассемблера используется
.
Еще раз перечитайте мою фразу и покажите, что я это утверждаю

Где-то так ...
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 20.02.2012, 21:48   #7
Hacker19_90
Delphi Warrior
Старожил
 
Аватар для Hacker19_90
 
Регистрация: 15.08.2008
Сообщений: 2,502
По умолчанию

В общем алгоритм такой (писал с потолка)
Код:
For i = 0 To m - 1
     min = 0
     max = 0
     For j = 0 To n - 1  
         If B(i, j) < B(i, min) Then 
             min = j 
         End If 
         If B(i, j) > B(i, max) Then
             max = j
         End If 
     Next j
     temp = B(i, min)
     B(i, min) = B(i, 0);
     B(i, 0) = temp;
     temp = B(i, max)
     B(i, max) = B(i, n-1);
     B(i, n-1) = temp;
Next i
Mess with the best, die like the rest. (с) Hackers
Лабораторные, курсовые на Delphi\Pascal\C++
ya.flex-freelance@yandex.ru Icq - 636-954-303
Hacker19_90 вне форума Ответить с цитированием
Старый 20.02.2012, 21:52   #8
Hacker19_90
Delphi Warrior
Старожил
 
Аватар для Hacker19_90
 
Регистрация: 15.08.2008
Сообщений: 2,502
По умолчанию

Так так! Не гоним! А разбираемся
Цитата:
А Вы внимательно прочитали условие?
Ищется min.
Полагаем, что первый элемент min и тогда надо:
min = B(i, 0) ' Положить текущее значение равным минимальному.
Мне как-то фиолетого что там ищется, НО
был задан вопрос
Цитата:
Например, как понимать этот код?
B(i, 0) = min
Я вам ответил!

Теперь касаемо вопроса про ассемблер
1) Это не мне надо
Цитата:
Еще раз перечитайте мою фразу и покажите, что я это утверждаю
А скорее вам обьяснить в честь каких это вы про асм то вообще вспомнили?
Mess with the best, die like the rest. (с) Hackers
Лабораторные, курсовые на Delphi\Pascal\C++
ya.flex-freelance@yandex.ru Icq - 636-954-303
Hacker19_90 вне форума Ответить с цитированием
Старый 20.02.2012, 22:24   #9
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,311
По умолчанию

Прошу простить за флейм, но:
1. Про Asm - это так, шутка в сторону автора поста.

2. Вопрос о порядке действий был задан так же адресно.
Ранее мной была дана подсказка, которой автор воспользовался неправильно. Так бывает. Вот и решил вопросом поправить.

Ну в общем то, Вами уже дано решение. Пусть автор думает дальше.
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 24.02.2012, 14:58   #10
Cimilia
 
Регистрация: 18.02.2012
Сообщений: 3
По умолчанию

Цитата:
Сообщение от Hacker19_90 Посмотреть сообщение
В общем алгоритм такой (писал с потолка)
Код:
For i = 0 To m - 1
     min = 0
     max = 0
     For j = 0 To n - 1  
         If B(i, j) < B(i, min) Then 
             min = j 
         End If 
         If B(i, j) > B(i, max) Then
             max = j
         End If 
     Next j
     temp = B(i, min)
     B(i, min) = B(i, 0);
     B(i, 0) = temp;
     temp = B(i, max)
     B(i, max) = B(i, n-1);
     B(i, n-1) = temp;
Next i
Спасибо огромное! Разобралась. Программа заработала.

Итоговая подпрограмма:
Код:
Sub minmax(ByRef B(,) As Double)
        Dim i, j, m, n, min, max As Integer
        Dim k As Double
        m = B.GetLength(0) - 1
        n = B.GetLength(1) - 1
        For i = 0 To m - 1
            min = 0
            max = 0
            For j = 0 To n - 1
                If B(i, j) < B(i, min) Then
                    min = j
                End If
                If B(i, j) > B(i, max) Then
                    max = j
                End If
            Next j
            k = B(i, min)
            B(i, min) = B(i, n - 1)
            B(i, n - 1) = k
            k = B(i, max)
            B(i, max) = B(i, 0)
            B(i, 0) = k
        Next i
    End Sub

Последний раз редактировалось Cimilia; 24.02.2012 в 15:00.
Cimilia вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Двумерные массивы(матрица) 2)Строковые массивы(строки): 3)Структуры nuriyat Помощь студентам 1 21.01.2012 16:16
Составить полную спецификацию к подпрограмме ... petrower Помощь студентам 4 05.01.2012 16:56
Двумерные массивы(массивы указателей на массивы) krytishka99 Помощь студентам 1 29.12.2011 19:51
Basic. Двумерные массивы. Nafanya99 Помощь студентам 1 14.05.2010 11:00
Basic. двумерные массивы. Марька Помощь студентам 5 10.04.2010 07:06