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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.05.2022, 11:15   #1
funny.weirdo
Пользователь
 
Регистрация: 24.05.2022
Сообщений: 15
По умолчанию Поиск в StringGrid'е

Здравствуйте, люди добрые
Помогите пожалуйста с заданием
Для кнопки реализовать поиск по таблице StringGrid1 [город][улица][число домов]
улиц с самым маленьким и самым большим числом домов в КАЖДОМ городе
Вывод можно сделать в StringGrid2
funny.weirdo вне форума Ответить с цитированием
Старый 24.05.2022, 11:21   #2
mr.stranger
Пользователь
 
Регистрация: 02.05.2022
Сообщений: 52
По умолчанию

Ну ввод в таблицу у тебя в принципе такой же, как у меня
Код:
procedure TForm1.Button1Click(Sender: TObject);
 var a,b,c,f1,f2,f3,q1,q2,q3,q4:integer;
begin
q1 := 0;
q2 := 0;
q3 := 0;
q4 := 0;

for a := 1 to StringGrid1.RowCount-1 do
if StringGrid1.Cells[1,a] = Trim(Edit1.Text) then
q1 := 1;
for a := 1 to StringGrid1.RowCount-1 do
if StringGrid1.Cells[2,a] = Trim(Edit2.Text) then
q2 := 1;
for a := 1 to StringGrid1.RowCount-1 do
if StringGrid1.Cells[3,a] = Trim(Edit3.Text) then
q3 := 1;
q4 := q1 + q2 + q3;

Val(Trim(Edit1.Text),b,f1);
Val(Trim(Edit2.Text),b,f2);
Val(Trim(Edit3.Text),c,f3);

if (Length(Edit1.text) <> 0) and (Length(Edit2.text) <> 0) and (Length(Edit3.text) <> 0) and (f3 = 0) and (f1 <> 0) and (f2 <> 0) and (c > 0) then
begin
if q4 <> 3 then
begin
with StringGrid1 do
InsertRowWithValues(RowCount, [Edit1.Text, Edit2.Text, Edit3.Text]);
end
else
ShowMessage('Дублированная запись');
end
else
ShowMessage('Ошибки в записи');
end;
А насчет поиска - хз
Ну мне понятно только, что надо просмотреть записи с одним и тем же городом, минимуму и максимуму приравнять допустим первую улицу, и смотреть, если следующие больше/меньше

Последний раз редактировалось mr.stranger; 24.05.2022 в 11:24.
mr.stranger вне форума Ответить с цитированием
Старый 24.05.2022, 11:25   #3
funny.weirdo
Пользователь
 
Регистрация: 24.05.2022
Сообщений: 15
По умолчанию

Хм, за ввод спасибо
А вот это что-то не совсем понятно
Цитата:
Сообщение от mr.stranger Посмотреть сообщение
надо просмотреть записи с одним и тем же городом, минимуму и максимуму приравнять допустим первую улицу, и смотреть, если следующие больше/меньше
funny.weirdo вне форума Ответить с цитированием
Старый 24.05.2022, 15:54   #4
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Он имел ввиду следующее:
Код:
with StringGrid1 do for i := 0 to RowCount - 1 do if (Cells[1,i] = 'Москва') and (Cells[2,i] = 'Ленина') then StringGrid2.InsertRowWithValue(StringGrid2.RowCount, [inttostr(StringGrid2.RowCount), Cells[1, i], Cells[2, i], Cells[3, i]]);
macomics вне форума Ответить с цитированием
Старый 24.05.2022, 21:38   #5
funny.weirdo
Пользователь
 
Регистрация: 24.05.2022
Сообщений: 15
По умолчанию

Цитата:
Сообщение от macomics Посмотреть сообщение
if (Cells[1,i] = 'Москва') and (Cells[2,i] = 'Ленина')
Простите, мне что-то не очень понятен этот момент
Я не ищу конкретную улицу, можно сказать, я даже не знаю, что введет в первую таблицу преподаватель при проверке
funny.weirdo вне форума Ответить с цитированием
Старый 24.05.2022, 21:50   #6
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Так замените 'Москва' и 'Ленина' на имена соответствующих переменных, содержащих искомые значения. Я привел это в таком виде для наглядности.
Код:
with StringGrid1 do for i := 0 to RowCount - 1 do if ((Edit1.Text = '') or (Cells[1,i] = Edit1.Text)) and ((Edit2.Text = '') or (Cells[2,i] = Edit2.Text)) then StringGrid2.InsertRowWithValue(StringGrid2.RowCount, [inttostr(StringGrid2.RowCount), Cells[1, i], Cells[2, i], Cells[3, i]]); // Так это вообще не понятно что ищет применительно к вашему случаю

Последний раз редактировалось macomics; 24.05.2022 в 22:02.
macomics вне форума Ответить с цитированием
Старый 24.05.2022, 22:24   #7
funny.weirdo
Пользователь
 
Регистрация: 24.05.2022
Сообщений: 15
По умолчанию

А как найти город с минимальным числом домов? Пытаюсь писать и выходит откровенный бред
Код:
procedure TForm1.Button2Click(Sender: TObject);
var i:integer;
  buf1:array of string;
  q:array of integer;
  min,max:integer;
begin
min := 0;
max := 0;
q[i] := 0;
with StringGrid1 do
for i := 0 to RowCount-1 do
buf1 := StringGrid1.Cells[1,i];
if buf1 = StringGrid1.Cells[1,i] then
q[i] := StringGrid1.Cells[3,i];
if q[i] < min then
min := q[i];
If q[i] > max then
max := q[i];
//if (StringGrid1.Cells[1,i] = 'Москва') and (StringGrid1.Cells[2,i] = 'Ленина') then
//StringGrid2.InsertRowWithValue(StringGrid2.RowCount, [IntToStr(StringGrid2.RowCount), StringGrid1.Cells[1, i], StringGrid1.Cells[2, i], StringGrid1.Cells[3, i]]);
end;

Последний раз редактировалось funny.weirdo; 24.05.2022 в 22:36.
funny.weirdo вне форума Ответить с цитированием
Старый 24.05.2022, 22:49   #8
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Код:
var
  city: array of String;
  count: array of Integer;
  f, i, j: Integer;  
begin
// Сначала надо посчитать суммы домов сгруппированные по именам городов
  SetLength(city, 0); SetLength(count, 0);
  with StringGrid1 do for i := 0 to RowCount -1 do begin
      f := low(city) - 1; // Поиск совпадения с именем города в массиве
      for j := f + 1 to high(city) do if lowercase(Cells[1, i]) = city[j] then begin f := j; // Совпадение найдено, изменяем флаг
          inc(count[j], strtoint(Cells[3, i])); // Учет количества в соответствующем городе
          break; // Конец поиска
        end;
      if f < low(city) then begin // Флаг показывает, что совпадения не было, тогда добавляем новый город в массивы
        f := Length(city);
        SetLength(city, f + 1); // Расширяем массив имен
        SetLength(count, f + 1); // Расширяем массив счетчиков
        f := high(city);
        city[f] := lowercase(Cells[1, i]); // Добавление имени города в массив
        count[f] := strtoint(Cells[3, i]); // Добавление количества домов в массив
      end;
    end;
  j := low(city); f := count[j]; // Поиск минимального элемента в массиве
  for i := j + 1 to high(city) do if f > count[i] then begin
    j := i;
    f := count[i];
  end;
  Edit1.Text := city[j]; // Наименование города
  Edit2.Text := inttostr(count[j]); // Минимально количество домов
end;

Последний раз редактировалось macomics; 24.05.2022 в 22:52.
macomics вне форума Ответить с цитированием
Старый 25.05.2022, 16:11   #9
funny.weirdo
Пользователь
 
Регистрация: 24.05.2022
Сообщений: 15
По умолчанию

Не работает почему-то
Изображения
Тип файла: png цвыак.png (23.9 Кб, 13 просмотров)
funny.weirdo вне форума Ответить с цитированием
Старый 25.05.2022, 16:22   #10
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Код:
function safe_strtoint(Value: String; Failure: PBoolean = nil): Integer;
begin
  if Failure <> nil then Failure^ := False;
  try
    Result := strtoint(Value);
  except
    Result := 0;
    if Failure <> nil then Failure^ := True;
  end;
end;
Если вы решили вводить отсебятину, то используйте эту функцию для перевода строк в числа.
Вызывать можно как
Код:
count[j] := safe_strtoint(Cells[3, i]);
так и с использованием флага ошибки преобразования
Код:
count[j] := safe_strtoint(Cells[3, i], @flag);
if flag then break;
Хотя судя по всему в 0 строке у вас заголовок. Тогда цикл лучше начинать не с 0, а с FixedRows для заполнения суммы сгруппированной по городам.
Код:
var
  city: array of String;
  count: array of Integer;
  f, i, j: Integer;  
begin
// Сначала надо посчитать суммы домов сгруппированные по именам городов
  SetLength(city, 0); SetLength(count, 0);
  with StringGrid1 do for i := FixedRows to RowCount -1 do begin
      f := low(city) - 1; // Поиск совпадения с именем города в массиве
      for j := f + 1 to high(city) do if lowercase(Cells[1, i]) = city[j] then begin f := j; // Совпадение найдено, изменяем флаг
          inc(count[j], safe_strtoint(Cells[3, i])); // Учет количества в соответствующем городе
          break; // Конец поиска
        end;
      if f < low(city) then begin // Флаг показывает, что совпадения не было, тогда добавляем новый город в массивы
        f := Length(city);
        SetLength(city, f + 1); // Расширяем массив имен
        SetLength(count, f + 1); // Расширяем массив счетчиков
        f := high(city);
        city[f] := lowercase(Cells[1, i]); // Добавление имени города в массив
        count[f] := safe_strtoint(Cells[3, i]); // Добавление количества домов в массив
      end;
    end;
  j := low(city); f := count[j]; // Поиск минимального элемента в массиве
  for i := j + 1 to high(city) do if f > count[i] then begin
    j := i;
    f := count[i];
  end;
  Edit1.Text := city[j]; // Наименование города
  Edit2.Text := inttostr(count[j]); // Минимально количество домов
end;

Последний раз редактировалось macomics; 25.05.2022 в 16:31.
macomics вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск в StringGrid Retiree Компоненты Delphi 1 27.04.2012 09:52
Поиск по БД в StringGrid Anny_Apple БД в Delphi 12 27.05.2011 00:14
Поиск в StringGrid program123 Общие вопросы Delphi 6 13.09.2010 09:45
Поиск в StringGrid program123 Помощь студентам 5 11.04.2009 19:10
Поиск по StringGrid'у monushka Помощь студентам 3 09.02.2008 20:03