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

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

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > Общие вопросы .NET
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.04.2015, 08:50   #1
b0nny
Пользователь
 
Регистрация: 19.05.2014
Сообщений: 22
По умолчанию Возникли проблемы с for при переводе с VB на C#

Код:
namespace WindowsFormsApplication0
{
    public partial class Form1 : Form
    {
        int i, j, n;
        int[] A = new int[100];
        int[] B = new int[100];

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            dataGridView1.ColumnCount = 0;
            n = int.Parse(textBox1.Text);
            dataGridView1.Columns.Add("Колонка", "0");
            for (i = 1; i <= n; i++) //столбец i < n + 1
            {
                string nameColumns = Convert.ToString(i);
                dataGridView1.Columns.Add("Колонка", nameColumns);
                dataGridView1.Columns[i].Width = 30;
            }
            for (i = 0; i <= 1; i++) //строка
            {
                dataGridView1.Rows.Add();
            }
            dataGridView1.Rows[0].Cells[0].Value = "Исх. Массив";
            dataGridView1.Rows[1].Cells[0].Value = "Нов. Массив";
            dataGridView1.Rows[2].Cells[0].Value = "Сор. Массив";

            Random R = new Random();
            for (i = 1; i <= dataGridView1.ColumnCount - 1; i++)
            {
                dataGridView1[i, 0].Value = R.Next(-100, 201);
            }

            int counter = 0;
            for (i = 1; i <= dataGridView1.ColumnCount - 1; i++)
            {
                int value = Convert.ToInt32(dataGridView1[i, 0].Value);
                if (value % 2 == 0)
                {
                    counter++;
                    dataGridView1[counter, 1].Value = value;
                }
            }

            int[] B = new int[counter]; counter++;
            for (i = 1; i < counter; i++)
            {
                B[i - 1] = Convert.ToInt32(dataGridView1[i, 1].Value);
            }

            for (i = 0; i <= B.Length; i++)
            {
                var minIndex = i;
                for (j = i; i <= B.Length; j++)
                {
                    minIndex = j;
                    if (B[j] < B[minIndex])
                    {
                        minIndex = j;
                    }
                }
                //Swap
                var temp = B[i];
                B[i] = B[minIndex];
                B[minIndex] = temp;
            }

            for (i = 1; i < counter; i++)
            {
                dataGridView1[i, 2].Value = B[i - 1];
            }
        }
    }
}
Нужна помощь в цикле. Выходит за массив.
Код:
for (i = 0; i <= B.Length; i++)
            {
                var minIndex = i;
                for (j = i; i <= B.Length; j++)
                {
                    minIndex = j;
                    if (B[j] < B[minIndex])
                    {
                        minIndex = j;
                    }
                }
                //Swap
                var temp = B[i];
                B[i] = B[minIndex];
                B[minIndex] = temp;
            }
Оригинал, с которого переводил код. Он работает.
Код:
Public Class Form1

    Dim i, j, n, A(100), B(100) As Integer

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        DataGridView1.ColumnCount() = 0
        n = TextBox1.Text
        DataGridView1.Columns.Add("Колонка", 0)
        For Me.i = 1 To n  'столбец'
            DataGridView1.Columns.Add("Колонка", i)
            DataGridView1.Columns(i).Width = 30
        Next i
        For Me.i = 0 To 1  'строка'
            DataGridView1.Rows.Add()
        Next i
        DataGridView1.Rows(0).Cells(0).Value = "Исх. Массив"
        DataGridView1.Rows(1).Cells(0).Value = "Нов. Массив"
        DataGridView1.Rows(2).Cells(0).Value = "Сор. Массив"

        Dim R = New Random()
        For Me.i = 1 To DataGridView1.ColumnCount - 1
            DataGridView1(i, 0).Value = R.Next(-100, 201)
        Next

        Dim counter = 0
        For Me.i = 1 To DataGridView1.ColumnCount - 1
            Dim value = Int32.Parse(DataGridView1(i, 0).Value)
            If value Mod 2 = 0 Then
                counter += 1
                DataGridView1(counter, 1).Value = value
            End If
        Next

        Dim B(counter - 1) As Integer
        For Me.i = 1 To counter
            B(i - 1) = Integer.Parse(DataGridView1(i, 1).Value)
        Next

        For Me.i = 0 To B.Length - 1
            Dim minIndex = i
            For Me.j = i + 1 To B.Length - 1
                If B(j) < B(minIndex) Then
                    minIndex = j
                End If
            Next
            'Swap
            Dim temp = B(i)
            B(i) = B(minIndex)
            B(minIndex) = temp
        Next

        For Me.i = 1 To counter
            DataGridView1(i, 2).Value = B(i - 1)
        Next
    End Sub
End Class
b0nny вне форума Ответить с цитированием
Старый 02.04.2015, 09:04   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Цитата:
Нужна помощь в цикле. Выходит за массив.
Код:
for (i = 0; i <= B.Length; i++)
            {
                var minIndex = i;
                for (j = i; i <= B.Length; j++)
                {
                    minIndex = j;
                    if (B[j] < B[minIndex])
                    {
                        minIndex = j;
                    }
                }
                //Swap
                var temp = B[i];
                B[i] = B[minIndex];
                B[minIndex] = temp;
            }
Теперь также коротко приведи соответствующий ЭТОМУ исходный код, а там смотришь и помощь не понадобится, сам увидишь какая разница в диапазонах (условиях цикла).
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 02.04.2015, 09:21   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

evg_m, так вот же исходный:
Цитата:
Код:
 For Me.i = 0 To B.Length - 1
            Dim minIndex = i
            For Me.j = i + 1 To B.Length - 1
                If B(j) < B(minIndex) Then
                    minIndex = j
                End If
            Next
            'Swap
            Dim temp = B(i)
            B(i) = B(minIndex)
            B(minIndex) = temp
        Next
b0nny
я бы исправил так (строго меньше длины и второй цикл ошибочно проверяете i, хотя цикл по j:
Код:
for (i = 0; i < B.Length; i++)
            {
                var minIndex = i;
                for (j = i+1; j < B.Length; j++)
ну и j берётся не i, а i+1
Serge_Bliznykov вне форума Ответить с цитированием
Старый 02.04.2015, 16:53   #4
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,515
По умолчанию

Цитата:
evg_m, так вот же исходный:
Да знаю он там есть, но искать ... уж лучше пусть сам найдет
Цитата:
Теперь также коротко приведи соответствующий ЭТОМУ исходный код
а там увидев ДВЕ строки разом (рядом) глядишь додумается сам (додумался бы!).
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 02.04.2015, 17:44   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
а там увидев ДВЕ строки разом (рядом) глядишь додумается сам (додумался бы!)
ах вот Вы к чему вели.. Извините, что испортил процесс обучения...

в своё оправдание могу сказать, что, на мой взгляд, автор темы не сам писал данный код на C#, можно быть очень невнимательным и сделать несколько ошибок в двух строчках, но в процессе отладки не увидеть отличия - это, имхо, признак того, что автор топика в коде не ориентируется.

Впрочем, по ответу на ваш вопрос это было бы сразу видно...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 02.04.2015, 23:07   #6
b0nny
Пользователь
 
Регистрация: 19.05.2014
Сообщений: 22
По умолчанию

Да я знаю, что там строки разные, отличные от оригинала. Я сначала как положено сделал, потом пробывал различные варианты. Получилось так, что скипоровал такой. Код VB.Net мой, как и его перевод в C#. Вы сделали этот вывод только по этому циклу, а я в этом сообщении написал, почему такой вариант тут написал. Я перебирал варианты.

Последний раз редактировалось b0nny; 02.04.2015 в 23:12.
b0nny вне форума Ответить с цитированием
Старый 03.04.2015, 09:46   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

b0nny, ОК.
Ваша проблема решена? Тему закрываем?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 03.04.2015, 10:18   #8
b0nny
Пользователь
 
Регистрация: 19.05.2014
Сообщений: 22
По умолчанию

Нет конечно. У меня еще небыло доступа к компьютеру, чтобы сделать. Но сразу говорю, что если вариант чисто как в оригинале, то проблема сохраняется.
b0nny вне форума Ответить с цитированием
Старый 03.04.2015, 10:32   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от b0nny Посмотреть сообщение
Но сразу говорю, что если вариант чисто как в оригинале, то проблема сохраняется.
я Вас не понимаю.

что означает ваша фраза:
Цитата:
Оригинал, с которого переводил код. Он работает.
оригинальный код работает?!
Тогда в чём ваша проблема?
Ну и ещё, в C# (точнее в мс визуал студии) есть неплохие средства отладки. Почему бы не воспользоваться ими?!
Но, в любом случае, писать заведомо неверный код не стоит, это точно не поможет решить проблему.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 07.04.2015, 13:46   #10
b0nny
Пользователь
 
Регистрация: 19.05.2014
Сообщений: 22
По умолчанию

Вот, вроде верный код для исходного VB.Net
Цитата:
int[] B = new int[counter]; counter++;
for (i = 1; i < counter; i++)
{
B[i - 1] = Convert.ToInt32(dataGridView1[i, 1].Value);
}

for (i = 0; i < B.Length - 1; i++)
{
var minIndex = i;
for (j = i + 1; i < B.Length - 1; j++)
{
minIndex = j;
if (B[j] < B[minIndex])
{
minIndex = j;
}
}
//Swap
var temp = B[i];
B[i] = B[minIndex];
B[minIndex] = temp;
}

for (i = 1; i < counter; i++)
{
dataGridView1[i, 2].Value = B[i - 1];
}
Ошибка на if (B[j] < B[minIndex])
индекс находился вне границ массива.
Господи, там же for (j = i + 1; j < B.Length - 1; j++) надо писать. Что-то я не заметил...
Но только сортировка не правильная пока.
Я сделал. Не заметил ошибки сначала.

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


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Возникли проблемы с функцией gets() apeorin Visual C++ 16 23.10.2012 20:03
Возникли проблемы с функциями FRATER1234 Общие вопросы C/C++ 10 08.10.2011 20:51
При переносе программы с др компа возникли проблемы.. Jazzis БД в Delphi 3 09.06.2011 23:04