Poprawa - wskazówki do programu.

0
program nowy;

{$APPTYPE CONSOLE}

uses
  SysUtils;
  var
  suma, blokada,i,k,j, liczba,sys1,sys2:integer;
  T:integer;
  tab:array[1..100] of integer;
  tab2: array[1..100] of  integer;
begin
repeat
{$I-}

writeln('podaj system liczbowy w jakim podasz swoja liczbe');
readln(sys1);
if (sys1<2) or (sys1>10) then  writeln(' brak zakresu, wprowadz  wartosc od 2 do 10');    { warunek  blokujacy  podanie systemu
                                                                                            większego  10 i mniejszego od 2 }
         blokada:=IOresult;
        if blokada <>0 then writeln('blad');
        until (sys1>=2) and (sys1<=10);   // petla spelniajaca warunek dopóki podawany jest sys. większy od 2 i mniejszy od 10

               case sys1 of
  2:writeln('wybrales system binarny');
  3:writeln('wybrales system trojkowy');
  4:writeln('wybrales system czworkowy');
  5:writeln ('wybrales system piatkowy');
  6:writeln('wybrales system szostkowy');
  7:writeln('wybrales sysyem siodemkowy');
  8:writeln('wybrrales system osemkowy');
  9:writeln('wybrales system dziewiątkowy');
  10: writeln('wybrales system dziesiatkowy');
        end;

writeln('wprowadz liczbe 6 cyfrowa w wybranym przez siebie systemie');
        repeat
      read(liczba);

if (liczba >999999) or (liczba <100000) then writeln(' bledna liczba, wprowadz ponownie wartosc');
  until (liczba<999999) and (liczba >100000);
       readln;

        for i:=1 to 6 do
     begin
     tab[i]:=(liczba mod 10);        // liczba dzielona przez reszte z 10 i zapisuje do tab[1]
                                    // do zmiennej suma  dodaje sumę + podzieloną wczesniej liczbe

  liczba:=liczba div 10;     // zmiennej liczba przypisuje  zmniejszona wartosc liczby  dzielona przez 10.


end;

{mnozenie  rozlozonych wczesniej liczb przez podstawe systemu}
           T:=(tab[6]*(sys1*sys1*sys1*sys1*sys1))+(tab[5]*(sys1*sys1*sys1*sys1))+(tab[4]*(sys1*sys1*sys1))
                      + (tab[3]*(sys1*sys1)) + (tab[2]*(sys1)) + (tab[1]*1);





writeln('liczba w systemie dziesietnym to ' , T);
writeln('podaj na jaki system chcesz zamienic liczbe');
         writeln(T);

    readln(sys2);
    if (sys2>=2) and  (sys2<=10) then

     begin

     for k:=1 to 6 do
     begin
     tab2[k]:= (T  mod sys2);
     T:= T div sys2;

     end;



    for j:=1 to 6 do

   write(tab2[7-j]);




 end;


    readln;



end.

Witam, jest ktoś wstanie poprawić mi ten program ?

Nie działa:

1 blokada znaków- tzn musimy wprowadzić 6 cyfrową liczbę tylko i wyłącznie..

2 blokada liczby= żadna z wprowadzonych liczb nie może być większa
od podanego systemu. Np podajemy system 5-tkąwy to nie możemy użyć
liczby 5 i wyżej-wyświetli błąd w pętli repeat - tak to widzę
przynajmniej

3 problem jest z zamianą systemu 10 na dowolny inny od 2-10.. na ten sam
zamienia dobrze, ale na innych już sobie 0 dopisuje.. Ta pętla coś
ostatnie nie działa.

Ktoś chętny pomóc? przerobić ten program ale bez jakiś wielkich zmian jeżeli się da?

Mod; nie wiem czemu mod przeniósł do kosza ostatni temat, skoro kod jest i nie proszę o napisanie kodu od zera, bo to bez sensu...

Generalnie rozwiązania moje są już zawarte w kodzie... ale nie działają i nie mam pojęcia jak to przerobić kompletnie. Szczególnie ta blokada przy wpisywaniu liczb większych od systemu..

ale skoro;
rozw 1
if (liczba >999999) or (liczba <100000) then writeln(' bledna liczba, wprowadz ponownie wartosc');
until (liczba<999999) and (liczba >100000);

rozw 2
brak pomysłu calkowicie

rozw. 3 użyłem pętli for. Jednak wyrzuca błąd. Generalnie próbowałem na samych warunkach, ale roboty od groma i efekt również nie najlepszy.
write(tab2[7-j]);

p.s Gdybyto byl kod kolegi to bym go nie rozumiał.. w tym wypadku rozumie wszystko, ale nie jestem zaawansowany by używać jakiś funkcji zmieniających z string na znaki ...

dodanie znacznika <code class="delphi"> - fp

0
        const Dig:String='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';

        function IntToSys(V:Int64;S:Byte):String;
        var M:Byte;
        begin
          SetLength(Result,0);
          repeat
            M:=(V)mod(S);
            V:=(V)div(S);
            Result:=Dig[M+1]+Result;
          until V=0;
        end;

        function SysToInt(const T:String;S:Byte):Int64;
        var I:Integer;
        var M:Byte;
        begin
          Result:=0;
          for I:=1 to Length(T) do
          begin
            M:=Pos(UpCase(T[I]),Dig)-1;
            if M>=S then raise Exception.Create('Invalid digit');
            Result:=Result*S+M;
          end;
        end;
0

@Pablossos - jak sformatujesz kod to się zastanowimy nad jego poprawą, bo teraz jest zbyt nieczytelny; Gdybyś napisał go jak należy to nie miałbyś tylu problemów, teraz nie wiadomo co do czego...

0

_13th_Dragon dzięki, ale nie chce takich rozwiązań, bo raz mam zrobić od 2 do 10 a dwa, nie rozumiem za nic tego twojego kodu.. Zbyt skomplikowany jak dla mnie.

0

Skoro @olesio wspomniał o skomplikowanych kodach ...
Przekształcenie z jednego kodowania na drugie dowolnie długich liczb (np 1000 cyfr):

{$mode objfpc}{$H+}

uses SysUtils;

function SysConv(DstSys,SrcSys:Byte;const Number:String):String;
const Dig:String='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
var P,M,I,K:Integer;
begin
  Result:='0';
  if (2>SrcSys)or(SrcSys>36) then raise Exception.Create('System zrodlowy ma być w granicach 2..36');
  if (2>DstSys)or(DstSys>36) then raise Exception.Create('System docelowy ma być w granicach 2..36');
  for I:=1 to Length(Number) do
  begin
    P:=Pos(UpCase(Number[I]),Dig)-1;
    if (0>P)or(P>=SrcSys) then raise Exception.Create('Niepoprawna liczba lub niewłaściwy system');
    for K:=Length(Result) downto 1 do
    begin
      M:=(Pos(Result[K],Dig)-1)*SrcSys+P;
      P:=(M)div(DstSys);
      Result[K]:=Dig[M-P*DstSys+1];
    end;
    while P>0 do
    begin
      M:=P;
      P:=(M)div(DstSys);
      Result:=Dig[M-P*DstSys+1]+Result;
    end;
  end;
end;

procedure run;
var DstSys,SrcSys:Byte;
var Number:String;
begin
  while true do
  begin
    Write('Podaj SystemDocelowy SystemZrodlowy Liczbe (np 10 2 1010) : ');
    ReadLn(DstSys,SrcSys,Number);
    if Dstsys=SrcSys then Break;
    try
      WriteLn(Number,'#',SrcSys,' = ',SysConv(DstSys,SrcSys,Trim(Number)),'#',DstSys);
    except
      on E:Exception do WriteLn(E.Message);
    end;
  end;
end;

begin
  run;
end.

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