Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.84/19: Рейтинг темы: голосов - 19, средняя оценка - 4.84
1 / 1 / 0
Регистрация: 30.08.2010
Сообщений: 25
1

Диапазоны int64

28.01.2012, 13:00. Показов 3440. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Подскажите как можно получить диапазоны
например 4 диапазона из 100 (int64)
0 -24
25-49
50-74
75-100
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.01.2012, 13:00
Ответы с готовыми решениями:

Преобразование Int64 в string
Доброго времени суток. Не могу для себя объяснить один момент в битовых операциях. Почему i:=...

Ошибка: Not valid integer value int64
Программа рандомно добавляет-удаляет числа в зависимости от того что выбрано. Ругается на очень...

Деление cardinal или int64
var Global_EdiniaIzmerenia:cardinal; ... Global_EdiniaIzmerenia:=Global_EdiniaIzmerenia/100;...

Заполнить все биты единицами и нолями в int64
в интернете нашол как устанавливать ечейки битов в единицы и ноли однако в инт64 после 32 индэкса...

7
159 / 152 / 50
Регистрация: 03.08.2011
Сообщений: 299
Записей в блоге: 14
28.01.2012, 13:01 2
Рандомом. Тут главный вопрос, в каком виде диапазоны нужны.
1
1 / 1 / 0
Регистрация: 30.08.2010
Сообщений: 25
28.01.2012, 13:03  [ТС] 3
Есть конкретное число байт напимер 13255757 их нужно разбить на 5 диапазонов

диапазоны нужно получить в переменные
0
159 / 152 / 50
Регистрация: 03.08.2011
Сообщений: 299
Записей в блоге: 14
28.01.2012, 13:31 4
В Delphi нет типа данных, который хранит диапазоны. Если использовать множества - то невозможно получить диапазон длиной более 256 элементов. Если массивы - много-много гигабайт памяти.
Алгоритм на псевдокоде:
Код
константы
  число_диапазонов=5;
  максимальное_значение=13255757;
переменные
  а:массив диапазонов[1..число_диапазонов];
  б:массив целых[0..число_диапазонов];
начало программы
  б[0]:=0;
  б[число_диапазонов]:=максимальное_значение;
  для и от 1 до число_диапазонов-1
  начало цикла
    б[и]:=случайное_целое(максимальное_значение);
  конец цикла;
  сортировка(б,по_возрастанию);
  для и от 1 до число_диапазонов
  начало цикла
    а[и]:=(б[и-1],б[и]);
  конец цикла;
  вывод(а);
конец программы.
1
1 / 1 / 0
Регистрация: 30.08.2010
Сообщений: 25
28.01.2012, 13:58  [ТС] 5
Прошу прощения что не так излагаю но я имел в виду немного другое
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
var  a,b ,c :Int64;
     d1,d2 :string;
begin
 a:= 13255757;
 
 b:= a div 2; (разбиваю на 2 диапазона)
 c:= a-b ;
 d1:= '0-'+ IntToStr(a-1);
 d2:= IntToStr(a)+'-'+ IntToStr(b);
 
 memo1.Lines.Add(d1+','+d2);
 
end;
как всё ето сделать более правильнее и функциональнее тоесть при разбивке на 6
0
159 / 152 / 50
Регистрация: 03.08.2011
Сообщений: 299
Записей в блоге: 14
28.01.2012, 14:31 6
Более-менее рабочий код:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
program Project1;
 
{$APPTYPE CONSOLE}
 
uses
  System.SysUtils;
 
type
  TDiapasone=class
  private
    fstart,ffinish:Int64;
    function GetLength: Int64;
  public
    constructor Create(s,f:Int64);
    property Start:Int64 read FStart write FStart;
    property Finish:Int64 read FFinish write FFinish;
    property Length:Int64 read GetLength;
    function ToString:string;
    destructor Free;
  end;
 
constructor TDiapasone.Create(s, f: Int64);
begin
  inherited Create;
  Start:=s;
  Finish:=f;
end;
 
destructor TDiapasone.Free;
begin
  inherited Destroy;
end;
 
function TDiapasone.GetLength: Int64;
begin
  Result:=Finish-Start+1;
end;
 
procedure quicksort(var a: TArray<Int64>);
 
  procedure sort(l,r: integer);
  var
    i,j,x,y: integer;
  begin
    i:=l; j:=r; x:=a[random(r-l+1)+l];
    repeat
      while a[i]<x do i:=i+1;
      while x<a[j] do j:=j-1;
      if i<=j then
      begin
        if a[i] > a[j] then
        begin
          y:=a[i]; a[i]:=a[j]; a[j]:=y;
        end;
        i:=i+1; j:=j-1;
      end;
    until i>=j;
    if l<j then sort(l,j);
    if i<r then sort(i,r);
  end;
 
begin
  sort(0,length(a)-1);
end;
 
function TDiapasone.ToString: string;
begin
  Result:='['+IntToStr(Start)+';'+IntToStr(Finish)+']';
end;
 
function HasDublicate(a:TArray<Int64>):boolean;
var
  i:Integer;
begin
  Result:=false;
  for i:=1 to length(a)-1 do
    Result:=Result or (a[i]=a[i-1]);
end;
 
var
  x:TArray<TDiapasone>;
  y:TArray<Int64>;
  i:Integer;
const
  c=5;
  max=1234567;
 
begin
  randomize;//не убирать!
  try
    SetLength(x,c);
    SetLength(y,c+1);
    y[0]:=0;
    y[c]:=max;
    repeat
      for i:=1 to c-1 do
        y[i]:=random(max-1)+1;
        //если нужны равные диапазоны, то 
        //y[i]:=(max div c)*i;
      quicksort(y);
    until not HasDublicate(y);
    for i:=0 to c-1 do
      begin
        x[i]:=TDiapasone.Create(y[i]+1,y[i+1]);
        WriteLn(x[i].ToString,':',x[i].Length);
      end;
    {Тут делайте с диапазонами что вам надо}
    for i:=0 to c-1 do
      x[i].Free;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
  ReadLn;
end.
Добавлено через 10 минут
Оно же юнитом:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
unit Unit1;
 
interface
 
type
  TDiapasone=class
  private
    fstart,ffinish:Int64;
    function GetLength: Int64;
  public
    constructor Create(s,f:Int64);
    property Start:Int64 read FStart write FStart;
    property Finish:Int64 read FFinish write FFinish;
    property Length:Int64 read GetLength;
    function ToString:string;
    destructor Free;
  end;
 
function GetDiapasone(count:Integer;max:Int64;useRandom:boolean=true):TArray<TDiapasone>;
 
implementation
 
uses
  System.SysUtils;
 
{ TDiapasone }
 
constructor TDiapasone.Create(s, f: Int64);
begin
  inherited Create;
  Start:=s;
  Finish:=f;
end;
 
destructor TDiapasone.Free;
begin
  inherited Destroy;
end;
 
function TDiapasone.GetLength: Int64;
begin
  Result:=Finish-Start+1;
end;
 
procedure quicksort(var a: TArray<Int64>);
 
  procedure sort(l,r: integer);
  var
    i,j,x,y: integer;
  begin
    i:=l; j:=r; x:=a[random(r-l+1)+l];
    repeat
      while a[i]<x do i:=i+1;
      while x<a[j] do j:=j-1;
      if i<=j then
      begin
        if a[i] > a[j] then
        begin
          y:=a[i]; a[i]:=a[j]; a[j]:=y;
        end;
        i:=i+1; j:=j-1;
      end;
    until i>=j;
    if l<j then sort(l,j);
    if i<r then sort(i,r);
  end;
 
begin
  sort(0,length(a)-1);
end;
 
function TDiapasone.ToString: string;
begin
  Result:='['+IntToStr(Start)+';'+IntToStr(Finish)+']';
end;
 
function HasDublicate(a:TArray<Int64>):boolean;
var
  i:Integer;
begin
  Result:=false;
  for i:=1 to length(a)-1 do
    Result:=Result or (a[i]=a[i-1]);
end;
 
function GetDiapasone(count:Integer;max:Int64;useRandom:boolean):TArray<TDiapasone>;
var
  y:TArray<Int64>;
  i:Integer;
begin
  randomize;
  SetLength(Result,count);
  SetLength(y,count+1);
  y[0]:=0;
  y[count]:=max;
  repeat
    for i:=1 to count-1 do
      if useRandom then
        y[i]:=random(max-1)+1
      else
        y[i]:=(max div count)*i;
    quicksort(y);
  until not HasDublicate(y);
  for i:=0 to count-1 do
    Result[i]:=TDiapasone.Create(y[i]+1,y[i+1]);
end;
 
end.
1
1 / 1 / 0
Регистрация: 30.08.2010
Сообщений: 25
28.01.2012, 15:27  [ТС] 7
Круто !
а как этот юнит использовать , если можно то пример
0
159 / 152 / 50
Регистрация: 03.08.2011
Сообщений: 299
Записей в блоге: 14
28.01.2012, 15:41 8
Подключаете юнит к проекту. Перед функцией, где его используете пишете:
Delphi
1
uses Unit1;
Собственно использование:
Delphi
1
2
3
4
5
6
7
8
var
  x:TDipasone;
begin
  {...}
  for x in GetDiapasone(6,600) do
    Memo1.Lines.Add(x.ToString);
  {...}
end;
1
28.01.2012, 15:41
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.01.2012, 15:41
Помогаю со студенческими работами здесь

Есть ли целочисленный тип данных, диапазон которого больше Int64
Существует ли целочисленный тип данных, диапазон которого больше диапазона Int64, и с которым можно...

Перенос int64 в другую форму (Или что-то типа того)
Всем привет, нужна ваша помощь. Проблема такая: Есть 2 формы, в 2 форме используется (ниже),...

Диапазоны изменения аргументов
вроде бы знаю как сделать, но не догоняю с диапазоном ((

Расписать диапазоны чисел по наименьшей длине
Нужна помощь, как бы расписать двух- и более значные числа как диапазоны по наименьшей длине?...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru