Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem 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)

Předmět Autor Datum
Nechce sa mi hladat kde presne mas chybu (pravdepodobne pristupujes do niektoreho pola s blbym index…
MM.. 15.09.2010 19:45
MM..
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…
pme 15.09.2010 20:03
pme
:-D poslední
MM_tank 15.09.2010 21:34
MM_tank

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

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

Tak to si ma dostal....

Overenie by malo vyzerať asi takto:

if not (s[i] in ['0', '1']) then

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ý...

Zpět do poradny Odpovědět na původní otázku Nahoru