
Delphi - převaděč číselných soustav
Dobrý den.
Ve studuji na střední škole obor výpočetní systémy a zadali nám jistý úkol naprogramovat převaděč číselných soustav. Vím si rady s tím jak to celé bude fungovat ale programovací stránka je slabší . Prozatím pracuji na převodu z dvojkové (binární) do osmičkové (oktalové) soustavy. Kód programu vypadá takto (není ani z 1/16 kompletní):
unit prevodnik;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
Label1: TLabel;
Label2: TLabel;
RadioGroup1: TRadioGroup;
RadioGroup2: TRadioGroup;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
i,j:integer;
s,prid:string;
pom:array of string;
begin
case radiogroup1.ItemIndex of
0: begin //zvolená binární jako vstupní
s:=edit1.Text;
for i:=1 to length(s) do //ověření zda se jedná o binární číslo
begin
if (s[i]>'1') or (strtoint(s[i])<0) or ((s[i]>='A') and (s[i]<='Z')) or ((s[i]>='a') and (s[i]<='z')) then //podmínka pro binár. číslice
begin
showmessage('Číslo není v binár. soust. (Za čísla nepište značku soustavy např. 10001d)');
edit2.Text:='';
end;//konec podmínky
end;//konec ověření (cyklu)
case radiogroup2.ItemIndex of //do které soustavy převádět
0: edit2.Text:=edit1.text; //zvolena binární jako výstupní
1:begin
if length(s) mod 3 <> 0 then //zvolená oktalová jako výstupní //podmínka pro nastavení délky řetězce aby byl dělitelný 3
begin
for i:= 1 to (length(s) mod 3) do //přidání nul do řetězce
prid:=prid + '0'; //konec cyklu
s:=prid+s;
end;//konec podmínky
i:=0;
j:=1;
setlength(pom,(length(s) div 3));
while i<length(s) do //přiřazení 3 čísel do pole
begin
pom[j-1]:=s[i+1]+s[i+2]+s[i+3];
i:=i+3;
j:=j+1;
end; //konec whileu
end;//konec převodu z binár. do oktalové soust.
end; //konec převodů binár soust.(caseu2)
end;//konec převodů binární soust.
end;//konec caseu
end;//konec příkazů
end.//konec programu
Syntaxně mi delphi chybu neukazuje, pouze při samotném převodu z binární do oktalové soustavy mi delphi vyhodí chybu typu EaAccesViolation... Podle nastaveného breakpointu v delphi by špatný kód měl být někde v cyklu while. Bohužel asi nerozumím tomu co je v cyklu špatně a jak chybu opravit.
Zmena predmetu, pôvodne: Delphi (los)
Nechce sa mi hladat kde presne mas chybu (pravdepodobne pristupujes do niektoreho pola s blbym indexom - mensim ako 1 alebo vacsim ako je v tom poli znakov), ale podla mna na to ides uplne blbo, to tam chces mat extra kod pre kazdu kombinaciu (vstupna sustava,vystupna sustava)? To tam budes mat potom minimalne 9x nejaky kod, je to nezmysel.
Najprv si preved vstup na nejaky tvoj vnutorny tvar ktory bude stale pevny (napr. binarny ptz to je najjednoduchsie) a potom ten tvoj vnutorny tvar preved na vystupny tvar - t.j. mas potom 2 oddelene veci a nebudes muset pisat nejaky specialny kod osobitne pre kadu kombinaciu (vstupny tvar,vystupny tvar).
Prevod sustav neni nic zlozite akurat musis mat na pamati ze nemozes ukladat do pola znaky cez indexy ak je to pole prazdne, to je zrejme tvoj problem. T.j. mal by si pouzit dynamicke pole resp. string ku ktoremu budes pridavat znaky (pouzivat catenate - spajanie stringu s novym znakom).
Tak to si ma dostal....
Overenie by malo vyzerať asi takto:
Binárne čísla sú 0,1 načo overuješ A,a,Z,z.....
Naozaj ten Tvoj kód je zbytočne pracný a neúčelný...