Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Разное
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 09.09.2011, 10:41
Rad Rad вне форума
Прохожий
 
Регистрация: 09.09.2011
Сообщения: 2
Репутация: 10
По умолчанию Сравнение чисел разделенных запятой

Добрый день, имеется на форме 2 полей едит, в каждую из них вводятся разные по длине цифры, разделенные запятыми, вопрос как сравнить эти поля едит на наличие одинаковых цифр, пример (12345,157,159). Заранее спасибо
Ответить с цитированием
  #2  
Старый 09.09.2011, 17:33
Pyro Pyro вне форума
Так проходящий
 
Регистрация: 18.07.2011
Сообщения: 805
Версия Delphi: 7Lite
Репутация: 6063
По умолчанию

Прочитать любую книжку по программированию
Ответить с цитированием
  #3  
Старый 09.09.2011, 17:35
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Э... Просьба разграничить понятия "цифра" и "число". Потому что
Цитата:
вводятся разные по длине цифры
и
Цитата:
наличие одинаковых цифр
Я не понимаю.
Если имеется в виду, что вводятся ЧИСЛА и надо найти одинаковые ЦИФРЫ - то просто проходим по двум строкам и сравниваем каждый символ первой строки с каждым второй (кроме запятых разумеется).
Если вводятся ЧИСЛА и надо найти одинаковые ЧИСЛА, то примерно так: ищем через POS первую запятую, вычленяем число до нее, удаляем из строки вместе с запятой, пишем число в массив. И так составляем два массива. А дальше проходим по ним и сравниваем элементы.
Алгоритм весь я привел. Если хотите, чтоб написали за вас всю программу -> в раздел "работа".

Upd: Решение от Pyro тоже очень хорошее.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #4  
Старый 09.09.2011, 20:17
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,026
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

простой и не самый эфф. метод (если правильно понял задачу):
Код:
var
  S : TStringList;
  I, J : Integer;
begin
  S := TStringList.Create;
  Try
    S.Text := StringReplace(Edit1.Text,',',#13#10,[rfReplaceAll]);
    For I := 0 To S.count-2 Do
      For J := I + 1 To S.count-1 Do
        If S[i] = S[J] Then
          Begin
            ShowMessage('Цифра встечается более одного раза: '+ S[i]);
            Exit;
          End;
    ShowMessage('Повторяющихся цифр нет.');
  Finally
    S.Free;
  End;
end;
Ответить с цитированием
  #5  
Старый 10.09.2011, 07:56
Pyro Pyro вне форума
Так проходящий
 
Регистрация: 18.07.2011
Сообщения: 805
Версия Delphi: 7Lite
Репутация: 6063
Радость

сори за офтоп но на руби это выглядит так:
a, b = '123,456,789,654,987', '456,654'
print a.split(',') - b.split(',')
print a.split(',') & b.split(',')

Последний раз редактировалось Pyro, 10.09.2011 в 08:00.
Ответить с цитированием
  #6  
Старый 11.09.2011, 18:50
chainik chainik вне форума
Начинающий
 
Регистрация: 30.06.2008
Сообщения: 140
Репутация: 8882
По умолчанию

вот решение
здесь в ListBox1-расщепленная на подстроки строка из Edit1
в ListBox2-формируется список совпадающих строк с строкой Edit2
Числа из строк сделаешь сам (StrToInt())

а вообще-то можно воспользоваться советом PYRO

Код:
function PrepareStr(s:string;term:char):string;
var
i:integer;
begin
Result:='';
for i:=1 to Length(s) do
if s[i]=term then
    Result:=Result+#13#10
else
    Result:=Result+s[i];
end;


procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
begin
ListBox2.Clear;
ListBox1.Items.Text:=PrepareStr(Edit1.Text,',');
for i:=0 to ListBox1.Items.Count-1 do
    if pos(ListBox1.Items[i],Edit2.Text) > 0 then
        ListBox2.Items.Add(ListBox1.Items[i])
end;
Ответить с цитированием
  #7  
Старый 11.09.2011, 20:11
chainik chainik вне форума
Начинающий
 
Регистрация: 30.06.2008
Сообщения: 140
Репутация: 8882
По умолчанию

а еще можно и так:

Код:
uses StrUtils;

procedure TForm1.Button1Click(Sender: TObject);
var
s:string;
OffsBeg,OffsEnd,i:integer;
begin
OffsBeg:=1;
    repeat
    OffsEnd:=PosEx(',', Edit1.Text, OffsBeg);
    if OffsEnd=0 then OffsEnd:=Length(Edit1.Text)+1;
ListBox1.Items.Add(Copy(Edit1.Text,OffsBeg, OffsEnd-OffsBeg));      //отладка

    if pos(Copy(Edit1.Text,OffsBeg+1, OffsEnd-OffsBeg), Edit2.Text) > 0 then
        ListBox2.Items.Add(Copy(Edit1.Text,OffsBeg, OffsEnd-OffsBeg));
    OffsBeg:=OffsEnd+1;
    until OffsEnd >= Length(Edit1.Text);
end;

Последний раз редактировалось chainik, 11.09.2011 в 20:15.
Ответить с цитированием
  #8  
Старый 13.09.2011, 15:57
Rad Rad вне форума
Прохожий
 
Регистрация: 09.09.2011
Сообщения: 2
Репутация: 10
По умолчанию

Спасибо большое
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 15:17.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter