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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.01.2014, 06:51   #1
royun
Пользователь
 
Регистрация: 20.05.2011
Сообщений: 67
По умолчанию Сравнение колонок StringGrid по строкам

Здравствуйте.
Есть StringGrid1 и в нем есть колонки КолA, КолB, кол-во повторов по строкам (см. вложения). Необходимо сделать:

1. сравнение по строкам, т.е. встречается ли пара StringGrid1.Cells[1,i], StringGrid1.Cells[2,i]
2. удалить повторы
3. вывести кол-во повторов

Код:
procedure TForm1.Button2Click(Sender: TObject);
var
kolvoAB, AllAB: array of integer;
i,j,k,kolAB, n: integer;
begin
n:=StringGrid1.RowCount;
SetLength(AllAB,n);
SetLength(kolvoAB,n);
for i:=1 to n do
    begin
    AllAB[i]:= StrToInt(StringGrid1.Cells[0,i]+StringGrid1.Cells[1,i]);
    end;
i:=1;
while i <= n  do
begin
kolAB:=1;
j:=i+1;
    while j <= n do
    begin
    if AllAB[i]=AllAB[j] then
      begin
      for k:=j to n-1 do AllAB[k]:=AllAB[k+1];
      kolAB:=kolAB+1;
      n:=n-1;
      end
    else j:=j+1;
    end;
kolvoAB[i]:=kolAB;
i:=i+1;
end;
StringGrid1.RowCount:=n;
for i := 1 to n do
StringGrid1.cells[2,i]:=IntToStr(kolvoAB[i]);
end;
Проблема заключается в том, что
1.ошибка "Invalid pointer operation" выскакивает на 2-й строке с конца и данные до конца не отображаются
2.Как решить задачу, если массив AllAB это массив чисел int64
Изображения
Тип файла: png sg.png (17.8 Кб, 53 просмотров)
Тип файла: png sg1.png (27.2 Кб, 50 просмотров)

Последний раз редактировалось royun; 28.01.2014 в 07:15.
royun вне форума Ответить с цитированием
Старый 28.01.2014, 07:04   #2
type_Oleg
Старожил
 
Аватар для type_Oleg
 
Регистрация: 02.03.2008
Сообщений: 2,504
По умолчанию

У динамических массивов индексы : 0 ... n-1, а не 1 .. n

Кстати, Cells - тоже динамичеческий.

Последний раз редактировалось type_Oleg; 28.01.2014 в 07:08.
type_Oleg вне форума Ответить с цитированием
Старый 28.01.2014, 07:13   #3
royun
Пользователь
 
Регистрация: 20.05.2011
Сообщений: 67
По умолчанию

Вот в этом коде все нормально работает.
Код:
m:=Form1.StringGrid2.RowCount;
SetLength(AbB,m);
SetLength(kolvoB,m);
StringGrid3.RowCount:=m;
for l:=1 to m do
    begin
    StringGrid3.Cells[1,l]:=deletesimbol(Form1.StringGrid2.Cells[3,l]);
    AbB[l]:= StrToInt64(StringGrid3.Cells[1,l]);
    end;
x:=1;
while x <= m  do
begin
kolB:=1;
y:=x+1;
    while y <= m do
    begin
    if AbB[x]=AbB[y] then
      begin
      for z:=y to m-1 do AbB[z]:=AbB[z+1];
      kolB:=kolB+1;
      m:=m-1;
      end
    else y:=y+1;
    end;
kolvoB[x]:=kolB;
x:=x+1;
end;
StringGrid2.RowCount:=m;
for x := 1 to m do
begin
StringGrid2.cells[0,x]:=IntToStr(x);
StringGrid2.cells[1,x]:=IntToStr(AbB[x]);
StringGrid2.cells[2,x]:=IntToStr(kolvoB[x]);
end;
AbB:=nil;
kolvoB:=nil;
Похоже я где-то что-то пропустил в предыдущем коде.
А как быть если массив AllAB это массив чисел int64 ?
royun вне форума Ответить с цитированием
Старый 28.01.2014, 07:33   #4
royun
Пользователь
 
Регистрация: 20.05.2011
Сообщений: 67
По умолчанию

Цитата:
Сообщение от type_Oleg Посмотреть сообщение
У динамических массивов индексы : 0 ... n-1, а не 1 .. n

Кстати, Cells - тоже динамичеческий.
Действительно Вы были правы.
А как быть если массив AllAB это массив чисел int64 ?
royun вне форума Ответить с цитированием
Старый 28.01.2014, 07:44   #5
type_Oleg
Старожил
 
Аватар для type_Oleg
 
Регистрация: 02.03.2008
Сообщений: 2,504
По умолчанию

А что такого в этом Int64.
AllAB:array of int64;
type_Oleg вне форума Ответить с цитированием
Старый 28.01.2014, 07:52   #6
royun
Пользователь
 
Регистрация: 20.05.2011
Сообщений: 67
По умолчанию

Когда цифры маленькие, то все работает, а когда большие (у меня в каждой колонке в среднем 10-значные цифры), то выскакивает ошибка во вложении
Изображения
Тип файла: png err.png (18.1 Кб, 42 просмотров)
royun вне форума Ответить с цитированием
Старый 28.01.2014, 08:02   #7
Vanta11a
Lawful Evil
Участник клуба
 
Аватар для Vanta11a
 
Регистрация: 13.05.2008
Сообщений: 1,208
По умолчанию

Вот тут обсуждалась аналогичная проблема. 19 знаков - максимум, правда.
А так - "длинная" арифметика только.

up: в вашем скриншоте - число из 20 знаков. Логично, что перебор.
Алгоритм - бесплатен. Поиск багов - бесплатен. Реализация алгоритма - за отдельную плату.
На форуме помогают советами и объясняют, а не пишут на халяву программы, лабы, курсачи и т.д. (c)

Последний раз редактировалось Vanta11a; 28.01.2014 в 08:04.
Vanta11a вне форума Ответить с цитированием
Старый 28.01.2014, 08:06   #8
royun
Пользователь
 
Регистрация: 20.05.2011
Сообщений: 67
По умолчанию

Действительно, 20-значное число выходит за рамки int64.
Я понимаю что механизм сравнения у меня неправильный. И хотел бы послушать Ваши предложения.
royun вне форума Ответить с цитированием
Старый 28.01.2014, 08:09   #9
type_Oleg
Старожил
 
Аватар для type_Oleg
 
Регистрация: 02.03.2008
Сообщений: 2,504
По умолчанию

royun, ну так смотрите справку по Int64 : -2^63..2^63-1
Примерно 9*10^18 - максимум
type_Oleg вне форума Ответить с цитированием
Старый 28.01.2014, 08:28   #10
royun
Пользователь
 
Регистрация: 20.05.2011
Сообщений: 67
По умолчанию

Цитата:
Сообщение от type_Oleg Посмотреть сообщение
royun, ну так смотрите справку по Int64 : -2^63..2^63-1
Примерно 9*10^18 - максимум
В том-то и дело что int64 не хватает.
royun вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Excel поиск и отбор колонок в stringGrid Ant1Player БД в Delphi 5 14.06.2013 20:50
Сортировка в stringgrid по определенныым строкам. F.A.(tm) Общие вопросы Delphi 2 06.02.2011 18:14
Список колонок в StringGrid artemavd Общие вопросы Delphi 15 26.01.2011 13:12
присвоить строкам StringGrid ранги MAX722 Общие вопросы Delphi 1 26.04.2010 10:24
Сравнение и вывод 4х колонок попарно andrew1232 Microsoft Office Excel 9 03.03.2010 19:37