Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > C++ > Общие вопросы C/C++
Регистрация

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


Донат для форума - использовать для поднятия настроения себе и модераторам

А ещё здесь можно купить рекламу за 25 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru

Ответ
 
Опции темы
Старый 19.05.2013, 20:19   #1
ATL
Форумчанин
 
Аватар для ATL
 
Регистрация: 26.01.2007
Адрес: Одесса
Сообщений: 278
Репутация: 122

icq: 602960
По умолчанию

Здравствуйте. Пишу универскую задачу, работает некорректно.
Задача - выбирается файл 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 км. - верно
Дальше не пишет. Подскажите, где поправить?

Исходник ниже. Для пыток используйте .xls рядом с исходниками.

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

Последний раз редактировалось Stilet; 20.05.2013 в 08:23.
ATL вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сравнение ячеек данных Stringgrid и ячейками данных Access Gulden БД в Delphi 0 05.06.2012 11:26
отображение данных в Stringgrid Максон11 Помощь студентам 0 06.04.2011 12:44
Обработка нажатие правой кнопки мыши StringGrid TaYgA Помощь студентам 2 19.02.2011 15:36
StringGrid и база данных Irina_87 БД в Delphi 2 13.04.2010 08:14
Выборка данных из StringGrid quqer БД в Delphi 1 14.03.2008 13:56


17:04.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.