Dobrý den,
jsem začátečnice s Delphi a chtěla bych požádat o radu. Ráda bych si postavila program se dvěma Edity, dvěma Labely a dvěma Buttony, kde by byly dvě funkce:
1. Po zápisu čísla v dekadické soustavě do Editu1 by se po stisku Buttonu1 objevilo převedené číslo v binární soustavě v Labelu1.
2. Po zápisu binárního čísla do Editu2 by se po stisku Buttonu2 objevilo převedné číslo v dekadické soustavě v Labelu2.
Mohli bystě mi poradit nebo mě postrčit správným směrem jak bych měla docílit převodů? Mám trochu (opravdu trochu) tušení jak s dekadickou na binární, ale zpět mi to nejde, nemůžu na to přijít. Neměli byste nápad prosím?
Fórum › Delphi
Převod z binární soustavy do dekadické

Šlo by to i lépe, ale:
Function NumberToBits(Number: Int64): String;
var
i: Integer;
begin
Result := StringOfChar('0',SizeOf(Number)*8);
For i := (SizeOf(Number)*8) downto 1 do
begin
If (Number and 1) <> 0 then Result[i] := '1';
Number := Number shr 1;
end;
end;
Function BitsToNumber(BitString: String): Int64;
var
i: Integer;
begin
Result := 0;
For i := 1 to Length(BitString) do
begin
Result := Result shl 1;
If BitString[i] <> '0' then Result := Result or 1;
end;
end;
To Aqua : A z jakékoliv do binární bych na to šel přes bitový posuv. Prostě využiješ toho, že číslo je uloženo v proměnné binárně. V Delphi nedělám, takže to popíšu slovně.
inicializace:
Přiřaď i rovno 0.
Do hodnoty integer h vlož převáděné číslo.
Vytvoř si pole integerů stejně velké jako je počet bitů datového typu Integer a vyplň jej nulami.
začátek:
Vezmi hodnotu h a udělej bitový součin (and) s hodnotou 1.
Ulož si výsledek do pole na pozici i.
Zvětši hodnotu i o jedna.
Proveď bitový posuv hodnoty h o jednu pozici do prava
Pokud je h větší než 0 přejdi na začátek
Vypiš pole pozpátku.
Samozřejmě to lze vylepšit třeba tak, že budeš do pole vkládat hodnoty pozpátku. Případně můžeš místo pole použít řetězec vyplněný znaky 0 a pokud je výsledek bitového součinu 1, vložit na příslušnou pozici znak 1. Pak při výpisu nebudeš muset řešit převod integerů na znaky. Nebo místo pole integerů můžeš použít pole znaků a postupovat podobně jako v případě řetězce. Fantazii při optimalizaci se meze nekladou.
EDIT: Než jsem to dopsal, Sniper tu vložil stejný algoritmus :)
Moc děkuji za rady, jsem z toho ale trochu zmatená. :smile10: Zkoušela jsem do Delphi dostat Sniperův kód, ale neustále na mě program ječí, že nezná Result a kdesi cosi.. navíc netuším, jak to přimět ke spolupráci s Edity a Labely.
Proceduru pro převod Dec na Bin načítající Dec z Editu a vyhazující Bin do Labelu mám udělanou takto:
procedure TForm1.Button1Click(Sender: TObject);
begin
Value:= StrToInt(Edit1.Text);
x:='';
for y:=0 to SizeOf(Value)*8-1 do
begin
x:=IntToStr(Value mod 2)+x;
Value:= Value div 2;
if Value=0 then Break;
end;
Label6.Caption:=x;
end;
Ale nevím jak to programově udělat zpátky.. vím, že mám postupovat tak, jak říkal amertak, ale nevím, jak přimět proceduru, aby dělala "x na prvou, x na druhou..". Vím, že Sniper to určitě má správně a šlo by to aplikovat, ale mohli byste mě please ještě postrčit?
Řekněme, že máš proměnnou y, kterou inicializuješ na 1. Pak máš cyklus, ve kterém provádíš převod, a v každém průchodu cyklem (nejlépe na jeho konci) tu proměnnou y vynásobíš 2. Tak dostaneš v každém průchodu tu správnou mocninu (1, 2, 4, 8, 16 ....).
Tady je příklad použití těch mých funkcí (kompletní zdroják je v příloze):
procedure TfMainForm.btnNumToBitsClick(Sender: TObject);
var
i: Int64;
begin
//kontrola zda bylo zadáno číslo
If not TryStrToInt64(eNum.Text,i) then
begin
Showmessage('Zadaný text neobsahuje rozpoznatelné číslo!');
Exit;
end;
//převod zadaného čísla na bitový zápis a jeho zobrazení v labelu
lblBits.Caption := NumberToBits(StrToInt64Def(eNum.Text,0));
end;
procedure TfMainForm.btnBitsToNumClick(Sender: TObject);
var
i: Integer;
begin
//kontrola zda zadaný text obsahuje jen nuly a jedničky
For i := 1 to Length(eBits.Text) do
If not (eBits.Text[i] in ['0','1']) then
begin
Showmessage('Zadaný text neobsahuje bitový zápis čísla!');
Exit;
end;
//převod bitového zápisu na číslo a jeho zobrazení v labelu
lblNum.Caption := IntToStr(BitsToNumber(eBits.Text));
end;

Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
































Uživatelé prohlížející si toto vlákno
Podobná vlákna
Převodník z Dekadické do binární soustavy — založil Skywall
C# Převod do binární soustavy pomocí cyklu — založil michaela
Převod z binární soustavy do char v desítkové soustavě — založil oxidián
Převedení do binární soustavy s ověřením vstupu — založil Metodej
Převod z 8 do 10 soustavy — založil Vacken