Převod z binární soustavy do dekadické – Delphi – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Převod z binární soustavy do dekadické – Delphi – Fórum – Programujte.comPřevod z binární soustavy do dekadické – Delphi – Fórum – Programujte.com

 

Aqua0
Newbie
8. 11. 2010   #1
-
0
-

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?

Nahlásit jako SPAM
IP: 90.179.164.–
Šest programátorských zákonů: 1. V každém programu je alespoň jedna chyba. 2. Každý program lze zkrátit alespoň o jeden řádek. 3. Nejjednodušší chyby se nejhůře hledají. 4. Každou opravou se do programu zanese nová chyba. 5. Když už se zdá, že program je v pořádku, určitě jsme něco přehlédli. 6. Programátor dělá, co umí. Počítač si dělá, co chce.
amertak
~ Anonymní uživatel
112 příspěvků
8. 11. 2010   #2
-
0
-

z binární do dekadické se převádí jednoduše

1100 = 1*2^3 + 1*2^2 + 0*2^1 + 0*2^0 => 12

myslím že odtud by neměl být problém udělat jenoduchý while (for)

Nahlásit jako SPAM
IP: 80.251.241.–
Sniper
~ Anonymní uživatel
215 příspěvků
8. 11. 2010   #3
-
0
-

Š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;

Nahlásit jako SPAM
IP: 90.179.201.–
petr.satka0
Newbie
8. 11. 2010   #4
-
0
-

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 :)

Nahlásit jako SPAM
IP: 217.112.175.–
Aqua0
Newbie
6. 12. 2010   #5
-
0
-

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?

Nahlásit jako SPAM
IP: 90.179.164.–
Šest programátorských zákonů: 1. V každém programu je alespoň jedna chyba. 2. Každý program lze zkrátit alespoň o jeden řádek. 3. Nejjednodušší chyby se nejhůře hledají. 4. Každou opravou se do programu zanese nová chyba. 5. Když už se zdá, že program je v pořádku, určitě jsme něco přehlédli. 6. Programátor dělá, co umí. Počítač si dělá, co chce.
liborb
~ Redaktor
+18
Guru
7. 12. 2010   #6
-
0
-

Ř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 ....).

Nahlásit jako SPAM
IP: 78.80.52.–
Sniper
~ Anonymní uživatel
215 příspěvků
7. 12. 2010   #7
-
0
-

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;

Nahlásit jako SPAM
IP: 90.179.201.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 1 host

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý