Wyliczenie liczb w 3 systemach Turbo pascal

0

Witam mam problem z programem który mam napisać w turbo pascalu dopiero zaczynam z tym przygode zrobilem jakies małe programiki ale tego nie umiem.
Program ma przeliczać liczbe w 3 systemach przeliczać z jednego w drugi i trzeci system.
Napisałem dwa programy ale osobno jeden przelicza DEC do HEX a drugi przelicza dziesiętne na BIN. Nie wiem jak to zrobić zeby to było w jednym programie żeby przeliczało jedną liczbę w trzech systemach jaką procedurę i funkcję zastosować bo nie mam pojęcia w ogóle. Proszę o pomoc. W dalszej czesci napisze moje dwa programy.

program Hex;
uses
  crt;
const
  hex_chars : array[0..$F] of char = '0123456789ABCDEF';
var
  x : word;

begin
  clrscr;
  writeln('ZAMIANA DEC TO HEX (TYLKO BYTE)');
  writeln;
  write('Podaj wartosc z przedzialu 0..255: ');
  readln(x);
  write('Liczba ta w systemie hex: ',
         hex_chars[x shr 4], hex_chars[x and $F]);
  readkey;
end.
program Binarne;
uses
  crt;
const
  MaxBin = 100;
var
  Bin_Tab : array[1..MaxBin] of 0..1;   {zmienne pomocnicze}
  l1, i, ile : longint;
  w : char;

begin
  clrscr;
  writeln('PROGRAM ZAMIENIA LICZBY DZIESI¨TNE NA LICZBY BINARNE');
  writeln;
  write('Podaj liczb? cakowitĄ: ');
  readln(l1);
  ile := 0;
  while l1>0 do
  begin
    ile := ile + 1;
    Bin_Tab[ile] := l1 mod 2;
    l1 := l1 div 2;
  end;
  write('Liczba ta w systemie binarnym wynosi: ');
  for i:=ile downto 1 do
    write(Bin_Tab[i]);
  readkey;
  clrscr
end.

Pierwszy raz pisze na tym forum to nie wiem czy dobrze wszystko napisałem.

0


 naprościej połącz te dwa kody, "uses crt;" nad "program", drugie "uses crt;" usuń, "program" zamień na "procedure" na samej górze wpisz nowe "program Costam" jak chcesz, zamień kropki na średniki i na końcu dopisz:

```delphi
var i: integer;
begin
  WriteLn('co chcesz zrobić, 1 - dec na hex, 2 - dec na bin');
  ReadLn(i);
  case i of
    1: Hex;
    2: Binarne;
  end;
end.

;) W jaki sposób to ma być połączone ? Raz się podaje liczbę i pokazuje ją w trzech systemach ? to teraz chyba się nie da skoro pierwszy program przyjmuje tylko byte a drugi dowolną

0

Połączone tak zeby np. DEC zmieniał na HEX i dalej np HEX na BIN tylko zeby to było w jednym programie pokolei.

Juz sam dobrze nie wiem wyliczenie liczb w 3 systemach taki temat miałem podany

0

najlepiej zrób jedną procedurę typu baseconvert żeby zamieniała dowolny system a potem w jednym case bo teraz to jedna procedura przyjmuje inne dane niż drugie więc ciężko, w ogóle te dwa programiki są napisane w dwóch całkiem oddzielnych stylach, choćby dlatego że w pierwszym pisze "DEC" a w drugim normalnie po polsku "dziesiętne" ;)

// dziś wstaje nowy dzień

0

wiem ze troche inne style dlatego że pomagano mi przy tym bo ja nie wiedziałem jak to zrobic i dalej nie wiem najprosciej zeby to było.

0

ja bym to wszystko od nowa zrobił tak:

function base_convert(liczba: string; z, na: byte): string;
const liczby: string[16] = '0123456789ABCDEF';
var l: longint; s: string; i: integer;

function potega(co, ktora: longint): integer;
var i: integer; j: longint;
begin
  j := 1;
  for i := 1 to ktora do
    j := j * co;
  potega := j;
end;

begin
  l := 0;
  for i := 0 to length(liczba) - 1 do
    Inc(l, potega(z, i) * (pos(UpCase(liczba[length(liczba) - i]), liczby) - 1));
  s := '';
  while l > 0 do begin
   i := l mod na + 1;
   l := l div na;
   s := liczby[i] + s;
  end;


  base_convert := s;
end;

var licz: string; z: byte;
begin
  writeln('Podaj liczb?: ');
  readln(licz);
  z := 0;
  while (z < 2) or (z > 16) do begin
    writeln('Podaj w jakim systemie jĄ podae (cyfra):');
    readln(z);
    if (z < 2) or (z > 16) then writeln('Sorry, obsuguje tylko systemy 2-16');
  end;
  writeln('W systemie binarnym to b?dzie ',base_convert(licz, z, 2));
  writeln('W systemie ˘semkowym to b?dzie ',base_convert(licz, z, 8));
  writeln('W systemie dziesi?tnym to b?dzie ',base_convert(licz, z, 10));
  writeln('W systemie szesnastkowym to b?dzie ',base_convert(licz, z, 16));
end.
0

Dzięki ale jak wpisuje liczę pózniej pytaj w jakim systemie to co wtedy mam wpisac bo sie program konczy i nic nie wychodzi nie wiem. Z kolegą zrobiłem cos takiego ale czegoś chyba jeszcze brakuje

  GroupBox2: TGroupBox;
    BIN: TRadioButton;
    DEC: TRadioButton;
    HEX: TRadioButton;
    procedure LiczClick(Sender: TObject);
    procedure BINClick(Sender: TObject);
    procedure DECClick(Sender: TObject);
    procedure HEXClick(Sender: TObject);

  private
  { Private declarations }
  public
  { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}
function BINtoDEC(number:integer):integer; {Funkcja binarne->dziesietne}
var a,b,i:integer; c:string;
begin
   a:=0;
   b:=1;
   c:=inttostr(number);
   for i:=length(c) downto 1 do
   begin
   a:=b*strtoint(c[i])+a;
   b:=b*2;
   end;
   BINtoDEC:=a;
end;                                       {/Funkcja binarne->dziesietne}


function DECtoBIN(number,to_system:integer):string; {Funkcja dziesietne->binarne}
var a:integer; b:string;
begin
   repeat
   a:=number mod to_system;
   number:=number div to_system;
   b:=concat(inttostr(a),b)
   until number=0;
   DECtoBIN:=b;
   {repeat
   a:=number mod 2;
   number:=number div 2;
   b:=concat(inttostr(a),b)
   until number=0;
   DECtoBIN:=b;}

end;                                       {/Funkcja dziesietne->binarne}


function DECtoHEX(number:integer):string;  {Funkcja dziesietne->szesnastkowe}
var a:integer; b,c:string;
begin
   repeat
   a:=number mod 16;
   number:=number div 16;
   case a of 10 : b:='A'; 11 : b:='B';12 : b:='C';13 : b:='D';14 : b:='E';15 : b:='F';
          else b:=inttostr(a);
        end;
   c:=concat(b,c)
   until number=0;
   DECtoHEX:=c;
end;                                       {/Funkcja dziesietne->szesnastkowe}

function HEXtoDEC(number:string):integer;  {Funkcja szesnastkowe->dziesietne}
var a,b,c,i:integer;
begin
   a:=0;
   b:=1;
   for i:=length(number) downto 1 do
   begin
   if number[i]='A' then c:=10
   else if number[i]='B' then c:=11
   else if number[i]='C' then c:=12
   else if number[i]='D' then c:=13
   else if number[i]='E' then c:=14
   else if number[i]='F' then c:=15
   else c:=strtoint(number[i]);
   a:=b*c+a;
   b:=b*16;
   end;
   HEXtoDEC:=a;
end;                                      {/Funkcja szesnastkowe->dziesietne}


procedure TForm1.LiczClick(Sender: TObject);
begin
edit2.text:='';
if (BIN.checked=true)and(toDEC.Checked=true)then edit2.text:=inttostr(BINtoDEC(strtoint(edit1.text)));
if (DEC.checked=true)and(toBIN.Checked=true)then edit2.text:=DECtoBIN(strtoint(edit1.text),2);
if (DEC.checked=true)and(toHEX.Checked=true)then edit2.text:=DECtoHEX(strtoint(edit1.text));
if (HEX.checked=true)and(toDEC.Checked=true)then edit2.text:=inttostr(HEXtoDEC(edit1.text));
if (BIN.checked=true)and(toHEX.Checked=true)then edit2.text:=DECtoHEX(BINtoDEC(strtoint(edit1.text)));
if (HEX.checked=true)and(toBIN.Checked=true)then edit2.text:=DECtoBIN(HEXtoDEC(edit1.text),2);
end;





procedure TForm1.BINClick(Sender: TObject);
begin
if BIN.checked=true then
                    begin
                    toBIN.enabled:=false;
                    toDEC.enabled:=true;
                    toHEX.enabled:=true;
                    end;
end;

procedure TForm1.DECClick(Sender: TObject);
begin
if DEC.checked=true then
                    begin
                    toBIN.enabled:=true;
                    toDEC.enabled:=false;
                    toHEX.enabled:=true;
                    end;

end;

procedure TForm1.HEXClick(Sender: TObject);
begin
if HEX.checked=true then
                    begin
                    toBIN.enabled:=true;
                    toDEC.enabled:=true;
                    toHEX.enabled:=false;
                    end;
end;

end.
0

masz podać w jakim systemie czyli raczej "10" (czyli decymalnym) jeśli wpisujesz normalnie, możesz podać też 10 i napisać że podałeś w systemie "2" (dwójkowym) i to będzie równoznaczne z podaniem 2 w dziesiętnym ... możesz wyciąć to pytanie i wpisać od razu z := 10;

a ten kod co teraz podałeś to nic nie brakuje tylko komponentów pewno na formie bo to kod na Delphi, a mówiłeś że ma być na Turbo Pascal (temat) :-|

0

To kolega ta miesza chyba bo wczesniej miał Delphi :) Zaraz sprawdze tamten program.

Chodzi mi zeby ten program zmieniał liczbe np wpisuje liczbe 2 i pozniej wybór: zmien na szesnastkowy i pozniej jeszcze na ósemkowy nie wiem czy da sie tak zrobic ? albo ja tu źle zrozumiałem to zadanie :(

0

a jakie jest zadanie ? to przeklej sobie samą funkcję base_convert z tego co podałem i możesz wykorzystywać, jak chcesz, z dowolnego systemu na dowolny masz tam przeliczanie (w zakresie 2-16)

np:

write(base_convert('5', 10, 16));

// zamieni liczbę 5 z systemu 10 (decymalnego) na 16 (hexadecymalny)

write(base_convert('a', 16, 2));

// zamieni liczbę a (10) z systemu hexadecymalnego (16) na binarny (2)

i tak dalej, jak ci się wymarzy, możesz nawet liczyć na systemach których nikt nie używa, np dwunastkowym ;) banalne użycie, wystarczy parę linii dodać pytających o liczbę i instrukcji co na co gdzie ma zamienić

np:

uses crt;

function base_convert(liczba: string; z, na: byte): string;
const liczby: string[16] = '0123456789ABCDEF';
var l: longint; s: string; i: integer;
  function potega(co, ktora: longint): integer;
  var i: integer; j: longint;
  begin
    j := 1;
    for i := 1 to ktora do
      j := j * co;
    potega := j;
  end;
begin
  l := 0;
  for i := 0 to length(liczba) - 1 do
    Inc(l, potega(z, i) * (pos(UpCase(liczba[length(liczba) - i]), liczby) - 1));
  s := '';
  while l > 0 do begin
   i := l mod na + 1;
   l := l div na;
   s := liczby[i] + s;
  end;
  base_convert := s;
end;


var l: string; ns, sys: byte; c: char;
begin
  WriteLn('Podaj liczbę na której chcesz operować:');
  sys := 10;
  ReadLn(l);
  repeat
    WriteLn;
    WriteLn('Twoja liczba to: ', l,' - podana w systemie ',sys);
    WriteLn('Podaj w jakiej formie chcesz ją ujrzeć:');
    WriteLn('1 - bin, 2 - oct, 3 - dec, 4 - hex, 5 - inny, 6 - zmień liczbę, Esc - wyjście');
    c := readkey;
    case c of
      '1': begin
              l := base_convert(l, sys, 2);
              sys := 2;
           end;
      '2': begin
              l := base_convert(l, sys, 8);
              sys := 8;
           end;
      '3': begin
              l := base_convert(l, sys, 10);
              sys := 10;
           end;
      '4': begin
              l := base_convert(l, sys, 16);
              sys := 16;
           end;
      '5': begin
             writeln('Podaj liczbę cyfr w bazie liczby (system 2 - 16):');
             readln(ns);
             l := base_convert(l, sys, ns);
             sys := ns;
           end;
      '6': begin
             writeln('Podaj nową liczbę:');
             sys := 10;
             readln(l);
           end;
    end;
  until c = #27;
end.
0

temat zadania wyliczenie liczb w 3 systemach przelicznie z jednego w drugi system itd
ja to rozumie tak ze podaje jakąs liczbe dowolna np. 5 i w programie wybieramy zamien na dziesietny dalej zamien na szesnastkowy nie wiem czy dobrze mysle. A naprawde nie wiem jak to zrobic pisałem ostatnio program do rozwiązywania równania liniowego taki prosty a wiecej nie moge z tego ruszyć:( prosze jeszcze o jakies wskazówki najlepiej szczegółowe a za poprzednie bardzo dziękuje.

0

ale już ci dałem nie tylko wskazówki ale gotowe rozwiązanie full werszyn - dosłownie skopiuj/wklej

jeśli chodzi ci o to że miało być przeliczanie w 3 systemach a dałem ci na przeliczanie w 15 no to nie wiem, nie lubię kroić funkcji programu zwłaszcza jeśli ma to zwiększyć objętość kodu

0

Dzięki nie zauważyłem :) działą tylko jeszcze poprawie na to co bede chciał miec.
Dziękuje bardzo!

1 użytkowników online, w tym zalogowanych: 0, gości: 1