Советы по Delphi. Версия 1.4.3 от 1.1.2001 [Валентин Озеров] (fb2) читать постранично, страница - 5
[Настройки текста] [Cбросить фильтры]
Математика
Как научить Delphi делать правильное округление дробных чисел?
Nomadic советует: Целая коллекция способов - Для решения этой проблемы мною написана функция, которую можно модифицировать для всех случаев. Смысл заключается в том, что рассматривается строка. После этого все проблемы с округлением снялись. Function RoundStr(Zn:Real;kol_zn:Integer):Real; {Zn-значение; Kol_Zn-Кол-во знаков после запятой} Var snl,s,s0,s1,s2:String; n,n1:Real; nn,i:Integer; begin s:=FloatToStr(Zn); if (Pos(',',s)>0) and (Zn>0) and (Length(Copy(s,Pos(',',s)+1,length(s)))>kol_zn) then begin s0 := Copy(s,1,Pos(',',s)+kol_zn-1); s1 := Copy(s,1,Pos(',',s)+kol_zn+2); s2 := Copy(s1,Pos(',',s1)+kol_zn,Length(s1)); n := StrToInt(s2)/100;nn := Round(n); if nn >= 10 then begin snl := '0,'; For i := 1 to kol_zn - 1 do snl := snl + '0'; snl := snl+'1'; n1 := StrToFloat(Copy(s,1,Pos(',',s)+kol_zn))+StrToFloat(snl); s := FloatToStr(n1); if Pos(',',s) > 0 then s1 := Copy(s,1,Pos(',',s)+kol_zn); end else s1 := s0 + IntToStr(nn); if s1[Length(s1)]=',' then s1 := s1 + '0'; Result := StrToFloat(s1); end else Result := Zn; end; Все-таки работа со строками здесь излишество - function RoundEx( X: Double; Precision : Integer ): Double; {Precision : 1 - до целых, 10 - до десятых, 100 - до сотых...} var ScaledFractPart, Temp : Double; begin ScaledFractPart := Frac(X)*Precision; Temp := Frac(ScaledFractPart); ScaledFractPart := Int(ScaledFractPart); if Temp >= 0.5 then ScaledFractPart := ScaledFractPart + 1; if Temp <= -0.5 then ScaledFractPart := ScaledFractPart - 1; RoundEx := Int(X) + ScaledFractPart/Precision; end;Разное
Генерация еженедельных списков задач
Мне необходима программа, которая генерировала бы еженедельные списки задач. Программа должна просто показывать количество недель в списке задач и организовывать мероприятия, не совпадающие по времени. В моем текущем планировщике у меня имеется 12 групп и планы на 11 недель. Мне нужен простой алгоритм, чтобы решить эту проблему. Какие идеи?Вот рабочий код (но вы должны просто понять алгоритм работы): unit Unit1;
interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type TForm1 = class(TForm) ListBox1: TListBox; Edit1: TEdit; Button1: TButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end;
var Form1: TForm1;
implementation
{$R *.DFM}
const maxTeams = 100; var Teams: Array[1..maxTeams] of integer; nTeams, ix, week, savix: integer;
function WriteBox(week: integer): string; var str: string; ix: integer; begin Result := Format('Неделя=%d ',[week]); for ix := 1 to nTeams do begin if odd(ix) then Result := Result+' ' else Result := Result+'v'; Result := Result+IntToStr(Teams[ix]); end; end;
procedure TForm1.Button1Click(Sender: TObject); begin nTeams := StrToInt(Edit1.Text); if Odd(nTeams) then inc(nTeams); {должны иметь номера каждой группы} ListBox1.Clear; for ix := 1 to nTeams do Teams[ix] := ix; ListBox1.Items.Add(WriteBox(1));
for week := 2 to nTeams-1 do begin Teams[1] := Teams[nTeams-1]; {используем Teams[1] в качестве временного хранилища} for ix := nTeams downto 2 do if not Odd(ix) then begin savix := Teams[ix]; Teams[ix] := Teams[1]; Teams[1] := savix; end; for ix := 3 to nTeams-1 do if Odd(ix) then begin savix := Teams[ix]; Teams[ix] := Teams[1]; Teams[1] := savix; end; Teams[1] := 1; {восстанавливаем известное значение} ListBox1.Items.Add(WriteBox(week)); end; end;
end.
Mike Orriss
Генерация случайного пароля
The_Sprite советует: Вам понадобилось, чтобы Ваше приложение само создавало пароли ? Возможно данный способ Вам пригодится. Всё очень просто: пароль создаётся из символов, выбираемых случайным образом из таблицы. Совместимость: Delphi 5.x (или выше) Собственно сам исходничек: Пароль создаётся из символов, содержащихся в таблице. Внимание: Длина пароля должна быть меньше, чем длина таблицы! // запускаем генератор случайных чисел (только при старте приложения). procedure TForm1.FormCreate(Sender: TObject); begin Randomize; end;function RandomPwd(PWLen: integer): string; // таблица символов, используемых в пароле const StrTable: string = '!#$%&/()=?@<>|{[]}\*~+#;:.-_' + 'ABCDEFGHIJKLMabcdefghijklm' + '0123456789' + 'ДЦЬдцьЯ' + 'NOPQRSTUVWXYZnopqrstuvwxyz'; var N, K, X, Y: integer; begin // проверяем максимальную длину пароля if (PWlen > Length(StrTable)) then K := Length(StrTable)-1 else K := PWLen;SetLength(result, K); // устанавливаем длину конечной строки Y := Length(StrTable); // Длина Таблицы для внутреннего цикла N := 0; // начальное значение цикла while N < K do begin // цикл для создания K символов X := Random(Y) + 1; // берём следующий случайный
Последние комментарии
1 день 13 часов назад
1 день 13 часов назад
1 день 14 часов назад
2 дней 1 час назад
2 дней 2 часов назад
2 дней 2 часов назад