Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
1 / 1 / 3
Регистрация: 18.11.2009
Сообщений: 11
1

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

19.05.2013, 19:49. Показов 950. Ответов 7
Метки нет (Все метки)

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

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

Кусок кода (пишу в С++ Builder 6.0):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
  // 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 рядом с исходниками.
Вложения
Тип файла: rar source.rar (380.3 Кб, 5 просмотров)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.05.2013, 19:49
Ответы с готовыми решениями:

Перенос данных из одного StringGrid в другой StringGrid
Здравствуйте . Есть очередной вопрос с матрицами. Есть два StringGrid. В одном столбце первой...

Обработка данных в StringGrid
в таблице заполнены три первые столбца и последний. Далее генерация и заполняются еще 4-6 столб:...

Вывод в Stringgrid и обработка данных в формате дата/время
В edit1 задаётся город, в edit2 и edit3 промежуток времени, и по этим параметрам должен идти поиск...

"Обработка числовых данных двумерного массива с использованием компонента StringGrid." Решение задачи с 4 пунктами
Использовать Delphi 7. Сформировать двумерный массив m*k случайным образом. Выполнить...

7
1 / 1 / 3
Регистрация: 18.11.2009
Сообщений: 11
20.05.2013, 01:28  [ТС] 2
Нашел причину того, почему программа показываем в результате те строки, которые необходимо пропустить. Это из-за проверки:
C++
1
2
     if (i == temp) // Если смотрим строку, которая указана,
     break;   //  то переходим на следующую.
Текущий шаг цикла не всегда совпадает с значением temp (оно же mass_OPZ[j] - 1, оно же содержимое SG2). Т.е. всё в порядке будет, если в SG2 указать, например, 1-2-3, тогда оно будет совпадать с шагом цикла и будет пропускать указанные в SG2 строки. Но т.к. в действительности всё по-другому, то оно работает неверно.
Подскажите, какое условие вместо этого написать?
0
1090 / 588 / 121
Регистрация: 11.11.2008
Сообщений: 1,544
20.05.2013, 06:33 3
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 
int min_j;
bool wrong(int i)
{
for (int j = 0; j < OPZ_Count; j++) if(i == mass_OPZ[j]-1) return true;
return false;
}
 
for (i = 0; i < Row_Counter-1; i++)   // Ищем кратчайшие расстояния по всем строкам
  {
   if (wrong(i)) // Если смотрим строку, которая указана,
   continue;   //  то переходим на следующую.
   min = 99999; 
   for (j = 0; j < OPZ_Count; j++) // работаем с указанным кол-вом столбцов
   if (StrToFloat(SG1->Cells[i][j]) < min)
     {
     min = StrToFloat(SG1->Cells[i][mass_OPZ[j]-1]);
     min_j = j;
     }
   Memo1->Lines->Add("Для пункта " + IntToStr(i+1) + " минимальное расстояние в пункте " + IntToStr(mass_OPZ[min_j]) + " равное " + FloatToStr(min) + " км.");
    Memo1->Lines->Add(""); // Разделяющая строка для пунктов
  }
   }
как-то так...
1
1 / 1 / 3
Регистрация: 18.11.2009
Сообщений: 11
20.05.2013, 08:21  [ТС] 4
Спасибо, но не могу заставить этот кусок работать.
C++
1
2
3
4
5
6
int min_j;
bool wrong(int i)
{
for (int j = 0; j < OPZ_Count; j++) if(i == mass_OPZ[j]-1) return true;
return false;
}
Вылетают ошибки. То не хватает ; после wrong(int i), то выделяет return true
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32835 / 21172 / 8148
Регистрация: 22.10.2011
Сообщений: 36,431
Записей в блоге: 8
20.05.2013, 10:00 5
Нет никаких ошибок, всё нормально компилируется. Показывай, что намудрил. Скорее всего, реализацию функции wrong вставил прямо в середину своего метода? Напрасно, надо вынести наружу.
1
1 / 1 / 3
Регистрация: 18.11.2009
Сообщений: 11
20.05.2013, 16:41  [ТС] 6
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
void __fastcall TForm1::Button4Click(TObject *Sender)
{ int mass_OPZ[20];
 
  // Ìåíÿåì ðàçìåð ôîðìû
  Form1->Height = 582;
 
  // Î÷èùàåì è ïîêàçûâàåì Memo1
  Memo1->Clear();
  Memo1->Visible = True;
 
  // Áåð¸ì ïåðå÷åíü íàñåë¸ííûõ ïóíêòîâ è çàïèñûâàåì â ìàññèâ
  for(i = 0; i < OPZ_Count; i++)
  mass_OPZ[i] = StrToInt(SG2->Cells[i][0]);  // Çàïèñàëè
 
  int min_j;
  bool wrong(int i)
  {
    for (int j = 0; j < OPZ_Count; j++) if(i == mass_OPZ[j]-1) return true;
    return false;
  }
 
  int temp = 0; float min;
  /*
     temp - çàïèñûâàåì àäðåñ ÿ÷åéêè èç SG2, îò êîòîðîãî èùåì êðàò÷àéøåå ðàññòîÿíèå.
  */
 
  for (i = 0; i < Row_Counter-1; i++)   // Èùåì êðàò÷àéøèå ðàññòîÿíèÿ ïî âñåì ñòðîêàì
  {
    if (wrong(i)) // Åñëè ñìîòðèì ñòðîêó, êîòîðàÿ óêàçàíà,
    continue;   //  òî ïåðåõîäèì íà ñëåäóþùóþ.
    min = 99999;
    for (j = 0; j < OPZ_Count; j++) // ðàáîòàåì ñ óêàçàííûì êîë-âîì ñòîëáöîâ
    if (StrToFloat(SG1->Cells[i][j]) < min)
    {
       min = StrToFloat(SG1->Cells[i][mass_OPZ[j]-1]);
       min_j = j;
    }
    Memo1->Lines->Add("Äëÿ ïóíêòà " + IntToStr(i+1) + " ìèíèìàëüíîå ðàññòîÿíèå â ïóíêòå " + IntToStr(mass_OPZ[min_j]) + " ðàâíîå " + FloatToStr(min) + " êì.");
    Memo1->Lines->Add(""); // Ðàçäåëÿþùàÿ ñòðîêà äëÿ ïóíêòîâ
  }
 
}
[C++ Error] Unit1.cpp(127): E2141 Declaration syntax error на строке 17
0
1408 / 571 / 127
Регистрация: 31.10.2011
Сообщений: 1,960
20.05.2013, 17:55 7
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
bool wrong(int i)
  {
    for (int j = 0; j < OPZ_Count; j++) if(i == mass_OPZ[j]-1) return true;
    return false;
  }
 
void __fastcall TForm1::Button4Click(TObject *Sender)
{ int mass_OPZ[20];
 
  // Меняем размер формы
  Form1->Height = 582;
 
  // Очищаем и показываем Memo1
  Memo1->Clear();
  Memo1->Visible = True;
 
  // Берём перечень населённых пунктов и записываем в массив
  for(i = 0; i < OPZ_Count; i++)
  mass_OPZ[i] = StrToInt(SG2->Cells[i][0]);  // Записали
 
  int min_j;
  
  int temp = 0; float min;
  /*
     temp - записываем адрес ячейки из SG2, от которого ищем кратчайшее расстояние.
  */
 
  for (i = 0; i < Row_Counter-1; i++)   // Ищем кратчайшие расстояния по всем строкам
  {
    if (wrong(i)) // Если смотрим строку, которая указана,
    continue;   //  то переходим на следующую.
    min = 99999;
    for (j = 0; j < OPZ_Count; j++) // работаем с указанным кол-вом столбцов
    if (StrToFloat(SG1->Cells[i][j]) < min)
    {
       min = StrToFloat(SG1->Cells[i][mass_OPZ[j]-1]);
       min_j = j;
    }
    Memo1->Lines->Add("Для пункта " + IntToStr(i+1) + " минимальное расстояние в пункте " + IntToStr(mass_OPZ[min_j]) + " равное " + FloatToStr(min) + " км.");
    Memo1->Lines->Add(""); // Разделяющая строка для пунктов
  }
 
}
1
1 / 1 / 3
Регистрация: 18.11.2009
Сообщений: 11
20.05.2013, 19:37  [ТС] 8
Да, что-то я тупил и пихал функцию в тело кнопки. Всем большое спасибо за помощь.
0
20.05.2013, 19:37
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.05.2013, 19:37
Помогаю со студенческими работами здесь

Обработка матриц в StringGrid
Приветствую. Не хочется выглядеть каким-то иждивенцем, но завтра нужно сдать несколько работ в...

StringGrid - обработка нажатий
Как сделать в StringGrid обработку нажатий? Код из интренет не работает

Обработка. области selection stringgrid
как, разными вариантами если можно, залить вделенную облась (более одной клетки выделено) цветом по...

Delphi 7 Stringgrid Нужно сделать цикл для заполнения Stringgrid данными из другого Stringgrid
Нужно чтобы из Stringgrid1 данные переносились в Stringgrid2 Но ТОЛЬКО ПО УСЛОВИЮ Таблицы...

Сравнение ячеек данных Stringgrid и ячейками данных Access
Помогите пожалуйста! Как сравнивать данные ячеек стринггрида и данные базы аксесс типа стринг, и...

запись данных из базы данных в stringgrid
Подскажите пожалуйста как считать данные из базы данных и вывести их в stringgrid(можно и в dbgrid...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru