Skip to content

Instantly share code, notes, and snippets.

@Vesely
Last active May 27, 2016 18:09
Show Gist options
  • Save Vesely/b913e8e3cbf6f8f1c6a2 to your computer and use it in GitHub Desktop.
Save Vesely/b913e8e3cbf6f8f1c6a2 to your computer and use it in GitHub Desktop.
Delphi, užitečné funkce: Převody číselných soustav, prvočíslo, odstranění přebytečných mezer, faktoriál...
//*********
// Developed by David Veselý
// http://davidvesely.cz/
//*********
function cifernySoucet(cislo:integer):integer;
var cifra, soucet:integer;
begin
//Pokud je číslo záporne, dej převeď ho na kladné
if cislo < 0 then
cislo:=-cislo;
soucet := 0;//vynulování součtu
//Pokud je cislo 0, ukonči cyklus
repeat
cifra := cislo mod 10; // posledni cifra cisla
soucet := soucet + cifra; //přičti cifru k součtu
cislo := cislo div 10; // odstraní poslední cifru cisla
until cislo = 0;
Result := soucet;
end;
//Příklad použití: showMessage(IntToStr(cifernySoucet(StrToInt(Edit1.Text))));
function jePrvocislo(cislo:integer):boolean;
var cifra, i:integer;
begin
//Pokud je číslo záporne, dej převeï ho na kladné
if cislo < 0 then
cislo:=-cislo;
if cislo = 1 then //jednička není prvočíslo
begin
Result := false;
exit;
end;
i:=2;
while i<(sqrt(cislo)) do
begin
if (cislo mod i) = 0 then //Pokud jde vydělit, není to prvočíslo
begin
Result := false;
exit;
end;
inc(i);
end;
//je to prvocislo
Result := true;
end;
//Příklad použití
// if jePrvocislo(StrToInt(Edit1.Text)) then
// showMessage('Je to prvočíslo')
// else
// showMessage('Není to prvočíslo');
function decToBin(dec:integer):integer;
var vysledek, d:integer;
begin
vysledek:=0;
d:=1;
while dec<>0 do begin
vysledek := vysledek + (dec mod 2 * d); //(zbytek po dělení * ciferná pozice) + výsledek
dec := dec div 2; //podělí
d := d*10; //"určuje cifernou pozici"
end;
Result:=vysledek;
end;
//showMessage(IntToStr(decToBin(StrToInt(Edit1.Text))));
function decToBin2(dec:integer):integer;
var i, polovina, zbytek:integer;
ResultStr:string;
begin
//**** pomocí stringu ****
ResultStr := '';
while dec<>0 do
begin
zbytek := dec mod 2;
if (zbytek <> 0) then
ResultStr := '1' + ResultStr
else
ResultStr := '0' + ResultStr;
dec := dec div 2;
end;
Result := StrToInt(ResultStr);
end;
//showMessage(IntToStr(decToBin2(StrToInt(Edit1.Text))));
function binToDec(bin:integer):integer;
var i, vysledek:integer;
begin
i:=0;
vysledek:=0;
while bin<>0 do
begin
if (bin mod 10)=1 then //Je poslední znak jednička?
vysledek := vysledek + trunc(Power(2,i));
bin:= bin div 10; //umaž poslední znak
inc(i);
end;
Result:=vysledek;
end;
//showMessage(IntToStr(binToDec(StrToInt(Edit1.Text))));
function decToHex(dec:integer):string;
var znak:char;
vysledek:string;
begin
vysledek := '';
while dec <> 0 do
begin
znak := ' ';
case (dec mod 16) of //pokud číslo podělím 16, je zbytek..
10: znak := 'A';
11: znak := 'B';
12: znak := 'C';
13: znak := 'D';
14: znak := 'E';
15: znak := 'F';
end;
if znak = ' ' then
vysledek := intToStr(dec mod 16) + vysledek //Pokud není zbytek (10 až 15) přičti číslo
else
vysledek := znak + vysledek;
dec := dec div 16; //Poděl číslo šestnácti
end;
Result := vysledek;
end;
//showMessage(decToHex(StrToInt(Edit1.Text)));
function binToHex(bin:integer):string;
//matice (binární číslo X hexadecimální číslo) (const == proměnná která nelze přepsat/upravit)
const binArray: array[0..15, 0..1] of string = (
('0000', '0'),
('0001', '1'),
('0010', '2'),
('0011', '3'),
('0100', '4'),
('0101', '5'),
('0110', '6'),
('0111', '7'),
('1000', '8'),
('1001', '9'),
('1010', 'A'),
('1011', 'B'),
('1100', 'C'),
('1101', 'D'),
('1110', 'E'),
('1111', 'F')
);
var binStr, bin4pack, vysledek:string;
i:integer;
begin
vysledek := '';
binStr := IntToStr(bin);
//Získáme zbytek po dělení (délka binárního čísla / 4) a doplníme nuly
case length(binStr) mod 4 of
1: binStr := '000'+BinStr;
2: binStr := '00'+BinStr;
3: binStr := '0'+BinStr;
end;
while (length(binStr)>0) do
begin
bin4pack := copy(binStr, length(binStr)-3, 4); //zkopírujeme poslední 4 znaky
Delete(BinStr, length(binStr)-3, 4); //odstraníme poslední 4 znaky
for i:=1 to 16 do
begin
if bin4pack=binArray[i-1, 0] then
vysledek := binArray[i-1, 1]+vysledek; //Vezmeme z matice příslušný hexadecimální znak a přidáme k výsledku
end;
end;
Result := vysledek;
end;
//showMessage(binToHex(StrToInt(Edit1.Text)));
function hexToBin(hex:string):integer;
//Pole binárních čísel
const bins: array[0..15] of string = (
'0000', '0001','0010','0011','0100','0101','0110', '0111',
'1000', '1001','1010','1011','1100', '1101','1110','1111'
);
var i:integer;
vysledek:string;
begin
vysledek := '';
for i:=length(hex) downto 1 do
vysledek := bins[strToInt('$'+hex[i])]+vysledek;
Result := StrToInt(vysledek);
{
Vysvětlivka pro: "('$'+hex[i])"
- Převede písmena z hexadecimálního čísla na binární čísla
- Např.: A => 10,
7B => 711,
3F6 => 3156
}
end;
//showMessage(IntToStr(hexToBin(Edit1.Text)));
function hexToDec(hex:string):integer;
begin
Result := StrToInt64('$'+hex);
end;
//showMessage(IntToStr(hexToDec(Edit1.Text)));
function odstranPrebytecneMezery(retezec:string):string;
var poziceDvojmezery:integer;
begin
poziceDvojmezery := pos(' ', retezec);
while poziceDvojmezery <> 0 do
begin
Delete(retezec, poziceDvojmezery, 1);
poziceDvojmezery := pos(' ', retezec);
end;
Result := retezec;
end;
//showMessage(odstranPrebytecneMezery(Edit1.Text));
function faktorial(cislo:integer):integer;
var vysledek, i:integer;
begin
//Pokud je číslo záporné vypiš chybu
if cislo < 0 then
raise Exception.Create('Faktoriál nelze udělat ze záporného čísla!');
vysledek := 1;
for i:=1 to cislo do
vysledek := vysledek * i;
Result := vysledek;
end;
//showMessage(IntToStr(faktorial(StrToInt(Edit1.Text))));
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment