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

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

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.06.2011, 12:39   #1
Apostol13
Пользователь
 
Регистрация: 02.06.2011
Сообщений: 31
Восклицание Цикл и Сравнение

Хотел сравнить весь столбец с текущим значением(при отсутствии совпадений прибавляем к сравниваемому значению +1 и повторяем), но нет результата. Вот то, чем пользовался:
while k=0 do
begin


for i:=0 to 30 do

begin
AdoTable1.RecNo:=i; //обращение к строкам от 0 до 30-ой
//сравниваем значение столбцов построчно
if (StrToInt(Adotable1.Fields.Fields[2].AsString)=Pr) then

begin
k:=1;
DBGrid1.Columns.Items[1].FieldName:=FloatToStr(i);
DBGrid1.Columns.Items[0].FieldName:=IntToStr(ADOTable1.RecN O);
end;


end;

Pr:=Pr+1;
end;
Apostol13 вне форума Ответить с цитированием
Старый 02.06.2011, 13:07   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

а кто будет задавить НАЧАЛЬНЫЕ значения?
Код:
k:=0;
Pr:=0;
while (k=0) do
if Adotable1.Fields.Fields[2].AsInteger=Pr then просто нагляднее

DBGrid1.Columns.Items[1].FieldName:=FloatToStr(i);
наверно хотелось поменять название колонки?
DBGrid1.Columns.Items[1].Title.caption:=FloatToStr(i);
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 02.06.2011 в 13:13.
evg_m вне форума Ответить с цитированием
Старый 02.06.2011, 20:02   #3
Apostol13
Пользователь
 
Регистрация: 02.06.2011
Сообщений: 31
По умолчанию

Спасибо, но это все задается заранее - > k:=0 и Pr - произвольное, оно обязательно совпадет с чем то из массива столбика Adotable1.Fields.Fields[2].AsString
хотя Pr ограничен 20000. не могу решить задачу.

когда пытаюсь компиллировать выдает ошибку:
Аргументы имеют неверный тип, выходят за пределы допустимого диапазона или вступают в конфликт друг с другом
Apostol13 вне форума Ответить с цитированием
Старый 02.06.2011, 20:07   #4
Apostol13
Пользователь
 
Регистрация: 02.06.2011
Сообщений: 31
По умолчанию

Ошибка на этапе обращения к строкам

AdoTable1.RecNo:=i;
Apostol13 вне форума Ответить с цитированием
Старый 02.06.2011, 20:43   #5
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
Ошибка на этапе обращения к строкам
НЕ ВИЖУ. текст ошибки не приведен.
Обычно для навигеции (перемещения по записям) используют методы
first Last Next Prev. и цикл while
Код:
f.first;
while not f.EOF do begin
.....
f.next;
end;
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 03.06.2011, 02:41   #6
Apostol13
Пользователь
 
Регистрация: 02.06.2011
Сообщений: 31
По умолчанию

Переделал, но значение он всегда выдает из последней строки. Как сделать так, чтобы после того как он посмотрел все значения столбца, только тогда прибавлял к Pr еденицу и повторял цикл? не знаю куда воткнуть Pr:=Pr+1. я уже совсем близок = ) выручайте

Код:
k:=0;
    AdoTable1.First;
    while not AdoTable1.Eof do
  begin
    while k=0 do

    begin


      if Adotable1.Fields.Fields[2].AsInteger=Pr then
        begin
          k:=1;
          DBGrid1.Columns.Items[0].FieldName:=FloatToStr(Pr);
          DBGrid1.Columns.Items[1].FieldName:=FloatToStr(i);
        end
      else AdoTable1.Next;
Pr:=Pr+1; // <-- куда вот ето деть правильно? ибо он сразу после выбора следуюющей строки тоже инкреминирует Pr, а должен когда просмотрит ВСЕ строки
if Pr>20000 then k:=1; // <- и это к нему же = )
end;



___________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE] (это кнопочка с решёточкой #)
Не забывайте об этом!
Модератор.

Последний раз редактировалось Serge_Bliznykov; 03.06.2011 в 08:24.
Apostol13 вне форума Ответить с цитированием
Старый 03.06.2011, 08:25   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

а можно "разжевать" - что у Вас есть и что Вы хотите получить?..
прямо приведите небольшой примерчик (с циферками) и расскажите...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 03.06.2011, 10:09   #8
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
Хотел сравнить весь столбец с текущим значением
Код:
var 
  Fld: TField;
  n: integer;
  dbl: boolean;

f.first;
n:=200; .// сравнивать будем с числом 200
fld:=f.field[1]; // будем сравнивать столбец с номером 1
dbl:=false; // совпадений пока нет
while not f.eof do begin 
  dbl:=( fld.asinteger = n ); // проверяем совпадение и устанавливаем флаг
  if dbl then // проверяем уже наш флаг и если есть совпадения (взведен флаг) 
               break;  // досрочно заканчиваем цикл проверки.
  f.Next;
end;
// дальнейшие действия в зависимости от значения флага
if dbl then
else
все выше сказанное это можно заменить на
Код:
n:=200; .// сравнивать будем с числом 200
fld:=f.field[1]; // будем сравнивать столбец с номером 1
if f.locate( fld.fieldname, n, []) // найти в указанном столбце заданное значение
then  // дальнейшие действия в зависимости от  нашли  
else // или не нашли
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 03.06.2011 в 10:21.
evg_m вне форума Ответить с цитированием
Старый 03.06.2011, 17:53   #9
Apostol13
Пользователь
 
Регистрация: 02.06.2011
Сообщений: 31
По умолчанию

Все работает, но только если Pr отличается менее чем на +\-2 от того, что есть в базе данных, тогда d (кол-во выполнения цикла верно (1или2), в ином случае оно 50-72 тысячи достигает.
Делаю я все то же самое: сравниваю столбцы строк[0..20] по столбцу 2 со значением Pr, при отсутствии совпадений Pr:=Pr+1 и опять сравниваем содержимое столбца 2 построчно в
AdoTable1, в чем может быть проблема?

Код:
var Pr: Real; X: Integer;
X:=StrToInt(Edit1.Text);

d:=0;
k:=0;
AdoTable1.First;
   while not AdoTable1.Eof do

        begin
        if k=1 then break;
        while k=0 do

                 begin
                 d:=d+1;
                 if Adotable1.Fields.Fields[2].AsInteger=Pr then

                       begin
                       k:=1;
                       DBGrid1.Columns.Items[0].FieldName:=FloatToStr(Pr);
                       DBGrid1.Columns.Items[1].FieldName:=FloatToStr(d);
                       break;
                       end
                 else AdoTable1.Next;
                 if d mod 20 = 1 then

                                begin // так как у меня в БД 20 строк то по их проверке инкремен Pr и вновь проводим сравнение
                                Pr:=Pr+1;
                                if Pr>20000 then k:=1;
                                end;
                 end;
     end;

Последний раз редактировалось Apostol13; 03.06.2011 в 23:26.
Apostol13 вне форума Ответить с цитированием
Старый 03.06.2011, 19:04   #10
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Не надо всЕ пихать в о внутренний код. чем больше ты из него вынесешь тем лучше. может он вовсе окажеся не нужным.
Вот держи разбирайся.
Код:
fld:=Adotable1.Fields.Fields[2]; // по столбцу 2
// в качестве признака будем использовать номер строки совпадения 1..20
d:=0; //совпадений еще не было
for Pr=1 to 2000 do begin // проверяем значения от 1 lj 2000
  // сравниваю столбцы строк[0..20] по столбцу 2 со значением Pr, 
  // и опять сравниваем содержимое столбца 2 построчно в
  AdoTable1.First; // начинаем сначала
  //while not AdoTable1.Eof do begin // разумнее так но можно и 
  for j;=1 to 20 do begin       // если уверены что 20 строк будет обязательно
    if fld.asinteger =Pr then // со значением Pr
    begin 
      d;=j; //при совпадении запоминаем НОМЕР строки
      break;//и заканчиваем просмор строк
    end;
    AdoTable1.Next; 
  end;
  if d>0 then begin // d>0 означет что было совпадение в строке d = 1..20
    DBGrid1.Columns.Items[0].FieldName:=FloatToStr(Pr);
    DBGrid1.Columns.Items[1].FieldName:=FloatToStr(d);
    break; // больше сравнивать не надо
  end;
end;
Не забывайте про кнопочку # для оформления кода.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 03.06.2011 в 19:06.
evg_m вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
сравнение slavsmo Microsoft Office Excel 2 05.04.2010 17:51
Цикл по времени - Как сделать так чтобы цикл выполнялся к примеру 10 секунд ? Anarki Общие вопросы C/C++ 3 13.11.2009 19:23
Цикл с предусловием. ( цикл while) Цикл с постусловием. (цикл repeat ... until) Mr.User Помощь студентам 9 23.11.2007 01:34