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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 08.04.2009, 16:36
Аватар для Sharky
Sharky Sharky вне форума
Активный
 
Регистрация: 20.03.2007
Сообщения: 202
Репутация: 10
По умолчанию Set'ы

Добрый день.У меня такая проблема :
мне нужно число разложить на цифры т е например число 432 на 4 на 3 и на 2 да еще и в возрастающем порядке я бы сделал сам с помощью массивов а нужно с помощью множеств я вообще не представляю с какой стороны подойти . Подскажите пожалуйста.
Ответить с цитированием
  #2  
Старый 08.04.2009, 17:44
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,099
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

А что должно быть в случае числа, например, 995?
вообще, можно, наверное, тк:

Код:
TDigit = (1,2,3,4,5,6,7,8,9,0);
TDigits = Set Of TDigit;

function ParceDigit(A  :Integer) : TDigits;
begin
  Result := [];
  While A > 0 Do
    Begin
      Result := Result + [A mod 10];
      A := A div 10;
    End;
end;

PS. Не пробовал запускать
По логике - понятно что делается.
Ответить с цитированием
  #3  
Старый 08.04.2009, 17:57
Аватар для Sharky
Sharky Sharky вне форума
Активный
 
Регистрация: 20.03.2007
Сообщения: 202
Репутация: 10
По умолчанию нельзя в качесте типа функции указывать сет

нельзя в качесте типа функции указывать сет
Ответить с цитированием
  #4  
Старый 08.04.2009, 18:00
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

Лучше, сделать в процедуре
Код:
procedure ParceDigit(A  :Integer; var d: TDigits);
И работать не с Result, а с d? Помоему, вариант.
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj
Ответить с цитированием
  #5  
Старый 08.04.2009, 18:03
Nyctos Kasignete Nyctos Kasignete вне форума
Активный
 
Регистрация: 29.03.2009
Сообщения: 300
Репутация: 94
По умолчанию

Цитата:
Сообщение от Sharky
да еще и в возрастающем порядке
Вот это, насколько я могу судить, точно выходит за сферу множеств. Потому что множества по определению неупорядочены, и порядок для них никакого значения не имеет...
Исходя из результата функции, которую написал lmikle, я бы отсортировала так:
Код:
var
  DigitSet: TDigits;
  i: TDigit;
  ExpandedStr: string;
begin
  DigitSet :=  ParceDigit(StrToInt(Edit1.Text)); // например, в поле Edit написано разлагаемое на цифры число
  ExpandedStr := '';
  for i := 0 to 9 do
    if (i in DigitSet) then ExpandedStr := ExpandedStr + IntToStr(i) + #13#10;
  ShowMessage(ExpandedStr);
end;

Цитата:
Сообщение от Sharky
нельзя в качесте типа функции указывать сет
Почему это?
Ответить с цитированием
  #6  
Старый 08.04.2009, 21:41
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,907
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

Строки спасут гиганта мысли.
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
  #7  
Старый 17.04.2009, 18:17
Аватар для Sharky
Sharky Sharky вне форума
Активный
 
Регистрация: 20.03.2007
Сообщения: 202
Репутация: 10
По умолчанию

Цитата:
Сообщение от lmikle
А что должно быть в случае числа, например, 995?
вообще, можно, наверное, тк:

Код:
TDigit = (1,2,3,4,5,6,7,8,9,0);
TDigits = Set Of TDigit;

function ParceDigit(A  :Integer) : TDigits;
begin
  Result := [];
  While A > 0 Do
    Begin
      Result := Result + [A mod 10];
      A := A div 10;
    End;
end;

PS. Не пробовал запускать
По логике - понятно что делается.
ну это то конечно да
1 но рекурсия представленная выше будет бесконечна т к она не дайдет до A := A div 10; ))
но смысл понятен спс
Ответить с цитированием
  #8  
Старый 17.04.2009, 18:30
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,099
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Здрасьте, тут нет рекурсии, тут просто цикл. Так что все дойдет.
Не путай специальную ПЕРЕМЕННУЮ result и имя функции. Как раз для того, что бы не надо было делать рекурсию эту переменную и ввели.
Ответить с цитированием
  #9  
Старый 18.04.2009, 19:01
Аватар для Sharky
Sharky Sharky вне форума
Активный
 
Регистрация: 20.03.2007
Сообщения: 202
Репутация: 10
По умолчанию all rigth

вообщем все я сделал. Может кому нибудь пригодиться вот код :
Код:
program qwert;
 uses
   crt;
 type
  TDigit= 0..9;
  TDigits = Set Of Tdigit;
 var
  digitSet:Tdigits;
  i:Tdigit;
  ExpandedStr,s:string;
  edit:longint;

procedure F (A:longint; var d :Tdigits);
var
 result:Tdigits;
begin
 result:=[];
 While A > 0 Do
   Begin
     result:= result + [A mod 10];
     A := A div 10;
   End;
 d:=result;
end;

function IntToStr(i:longint):String;
 var
  s:string;
 begin
  str(i,s);
  IntToStr:=s;
 end;

begin
  clrscr;
  Writeln('Введите число для разложения');
  readLn(edit);
  F(edit,Digitset);
  ExpandedStr :='';
  for i:= 0 to 9 do
    if (i in DigitSet)
    then
    ExpandedStr := ExpandedStr + IntTostr(i) + #13#10;
    Write(ExpandedStr,' ');
end.
ЗЫ код для турбо среды
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

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