Обработка данных в StringGrid

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
ATLANT1S
Сообщения: 2
Зарегистрирован: 19 май 2013, 20:39

Здравствуйте. Пишу универскую задачу, работает некорректно.
Задача - выбирается файл xls, в котором симметричная матрица. Цифры (float) из неё переносятся в StringGrid (далее - SG).
Так же пользователь указывает в SG2 последовательность цисел, они в дальшейшем имеют следующий смысл:
- это номера строк, которые не обрабатываются (пропускаются) в цикле
- это номера столбцов, с которыми работает цикл.

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

Кусок кода (пишу в С++ Builder 6.0):
[php]
// SG1 и SG2 -> FixedCol и FixedRow = 0;

int mass_OPZ[20];

// Берём содержимое SG2 и записываем в массив
for(i = 0; i < OPZ_Count; i++) // OPZ_Count - количество элементов массива mass_OPZ (он же SG2)
mass_OPZ = StrToInt(SG2->Cells[0]); // Записали

int temp = 0;
float min = 99999;

for (i = 0; i < Row_Counter-1; i++) // Ищем кратчайшие расстояния по всем строкам
{
for (j = 0; j < OPZ_Count; j++) // работаем с указанным кол-вом столбцов
{
temp = mass_OPZ[j] -1; // из mass_OPZ получаем введенный в SG2 номер строки, которую пропускаем,
// оно же номер столбца. А -1 потому, что нумерация строк/столбц начинается с нуля.

if (i == temp) // Если смотрим строку, которая указана,
break; // то переходим на следующую.

// если нет - продолжаем
if (StrToFloat(SG1->Cells[temp]) < min)
{ min = StrToFloat(SG1->Cells[temp]);
Memo1->Lines->Add("Для пункта " + IntToStr(i+1) + " минимальное расстояние в пункте " + IntToStr(mass_OPZ[j]) + " равное " + FloatToStr(min) + " км.");
}
}
Memo1->Lines->Add(""); // Разделяющая строка для пунктов
}
[/php]

Например:
Если имеем матрицу 6х6, а в SG2 указали строки 2 и 4, которые нам надо пропустить, то работаем с строками 1, 3, 5, 6. Берём каждую строку, смотрим значение ячейки 2 и 4, выбираем среди них меньшее и выводим его в Memo1.

Например например:
0 9 5 4 7 9
9 0 1 2 4 4
5 1 0 9 1 5
4 2 9 0 6 1
7 4 1 6 0 5
9 4 5 1 5 0

Должен быть результат:
Для пункта 1 минимальное расстояние в пункте 4 равное 4 км.
Для пункта 3 минимальное расстояние в пункте 2 равное 1 км.
Для пункта 5 минимальное расстояние в пункте 2 равное 4 км.
Для пункта 6 минимальное расстояние в пункте 4 равное 1 км.

У меня:
Для пункта 1 минимальное расстояние в пункте 2 равное 9 км. - лишняя строка, минимум в следующей
Для пункта 1 минимальное расстояние в пункте 4 равное 4 км. - верно
Для пункта 3 минимальное расстояние в пункте 2 равное 1 км. - верно
Дальше не пишет. Подскажите, где поправить?
ATLANT1S
Сообщения: 2
Зарегистрирован: 19 май 2013, 20:39

Нашел причину того, почему программа показываем в результате те строки, которые необходимо пропустить. Это из-за проверки:

Код: Выделить всё

     if (i == temp) // Если смотрим строку, которая указана,
     break;   //  то переходим на следующую. 
Текущий шаг цикла не всегда совпадает с значением temp (оно же mass_OPZ[j] - 1, оно же содержимое SG2). Т.е. всё в порядке будет, если в SG2 указать, например, 1-2-3, тогда оно будет совпадать с шагом цикла и будет пропускать указанные в SG2 строки. Но т.к. в действительности всё по-другому, то оно работает неверно.
Подскажите, какое условие вместо этого написать?
Ответить