Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Обработка данных в StringGrid, циклы 
V
    Опции темы
atlant1s
Дата 19.5.2013, 18:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 17.10.2007
Где: Одесса

Репутация: нет
Всего: нет



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

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

Кусок кода (пишу в С++ Builder 6.0):
Код

  // SG1 и SG2 -> FixedCol и FixedRow = 0;

  int mass_OPZ[20];

  // Берём содержимое SG2 и записываем в массив
  for(i = 0; i < OPZ_Count; i++) // OPZ_Count - количество элементов массива mass_OPZ (он же SG2)
  mass_OPZ[i] = StrToInt(SG2->Cells[i][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][i]) < min)
    {  min = StrToFloat(SG1->Cells[temp][i]);
      Memo1->Lines->Add("Для пункта " + IntToStr(i+1) + " минимальное расстояние в пункте " + IntToStr(mass_OPZ[j]) + " равное " + FloatToStr(min) + " км.");
     }
   }
   Memo1->Lines->Add(""); // Разделяющая строка для пунктов
  }


Например:
Если имеем матрицу 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 - 20.5.2013, 18:35
PM MAIL ICQ Skype   Вверх
atlant1s
Дата 20.5.2013, 00:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 17.10.2007
Где: Одесса

Репутация: нет
Всего: нет



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

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


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

Это сообщение отредактировал(а) atlant1s - 20.5.2013, 00:30
PM MAIL ICQ Skype   Вверх
KaZepKa
Дата 20.5.2013, 03:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 29.10.2011

Репутация: нет
Всего: нет



не проще ли проверять: нет ли i-ой строки в массиве mass_OPZ, то есть типо:
Код

if(Find(i, mass_OPZ)
     break;


Find описать самому, или же загонять данные из SG2 в вектор и использовать реализованный метод.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0488 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.