GRY-Online.pl --> Archiwum Forum

Turbo Pascal (Delphi) i praca domowa ...

10.12.2009
20:14
[1]

szymon_majewski [ Legend ]

Turbo Pascal (Delphi) i praca domowa ...

Witam.

Niestety moj odwieczny problem z informatyka, ktorej nie czuje/nie umiem/nie rozumiem (w sumie nazwijcie to sobie jak chcecie, ale potrzebuje pomocy) znowu daje o sobie znac ...

Otoz musze napisac program, ktory przeliczy mi liczby binarne na dziesietne (moze byc ustalony limit znakow). Problem w tym ze moge to zrobic jedynie za pomoca algorytmow i podstawowych funkcji (case, if, while, tablice 1 i 2 wymiarowe ...).

Jedyne co do tej pory ustalilem to algorytm dzialania. System dwojkowy opiera sie na potegach liczby 2. Czyli liczba 1101001 to bedzie

(2^0)1+(2^1)0+(2^2)0+(2^3)1+(2^4)0+(2^5)1+(2^6)1 = 1+0+0+8+0+32+64=105

a tu mozecie zobaczyc ze to prawda ...



Wiem, ze podczas pisania procedury trzeba bedzie za pomoca case ustalic jak rozkladac liczbe w zaleznosci od ilosci znakow (ale niestety tu zaczynaja sie schody ...). Nie mam pojecia natomiast jak rozlozyc ta liczbe binarna, zeby mozna bylo przeliczyc na dziesietna. Jak zadeklarowac ... Nic kompletnie nic. Licze na wasza pomoc !

ed. z fora nigdy nie korzystalem, ale mysle ze do tego by sie chyba nie przyczepila ... W jaki sposob ten for moglby mi pomoc ?

10.12.2009
20:24
[2]

kamyk_samuraj [ Legend ]

10.12.2009
21:13
[3]

szymon_majewski [ Legend ]

Dziekuje, ale szczerze mowiac nie za bardzo to do mnie przemawia ... Jestem na poziomie, gdzie nie bylo nawet "result" a byly tablice ...

10.12.2009
21:31
[4]

qaq [ Kaka Demona ]

[edit] kurde, źle przeczytałem:P

Ale... czy każdy bit tej liczby jest wpisany do oddzielnej komórki tablicy?

10.12.2009
21:33
[5]

szymon_majewski [ Legend ]

qaq ---> zgadza sie, ale ten program ma dzialac w druga strone ... Ty napisales z dziesietnego na binar ...

ed. teraz chodzi mi o to zeby binara jakos rozbic na pojedyncze znaki (1,0) i po kolei przemnozyc przez potegi, ktorej najwyzsza bedzie rowna ilosci znakow minus 1. Chyba tak to bedzie dzialac ...

10.12.2009
21:48
[6]

likfidator2 [ Konsul ]

Zadanie bardzo proste. Jest jeden algorytm zamieniający system 'x' na 'y' (np trójkowy na siedemnastkowy czy sto sześćdziesięcio dwujkowy na dziesiętny), ale żeby nie komplikować sprawy przedstawię ogólny zarys jak to zrobić.

Dane: liczba w systemie dwójkowym np. "110011".
wyjście: liczba w systemie dziesiętnym.

Pierwsze co musisz zrobić to wczytać liczbę w systemie dwójkowym do tablicy np. w taki sposób:

a: 543210 - indeksy tablicy
b: 110011 - '1' lub '0'

załóżmy że tablica nazywa się liczba2 i według powyższego liczba2[4] wynosi 1, a liczba2[3] wynosi 0.

Następnie potrzebujemy integer'a np. liczba10 i postępujemy następująco (x oznacza wielkość tablicy, w tym przypadku 5.

for j:=0 to x do
begin
liczba10:=liczba +pot(2,j)*liczba2[j];
end;

gdzie pot(a,b) to funkcja zwracająca liczbę a podniesioną do potęgi b.

to jest główna idea algorytmu.


10.12.2009
22:12
[7]

qaq [ Kaka Demona ]

Bardzo nieeleganckie rozwiązanie ale zawsze coś;) Na dodatek zapomniałem wiele ze składni...

var a: array [1..10] of char;
licznik,d,c,wynik:integer;

begin
readln(a);
licznik:=1;
repeat
licznik:=licznik+1;
until a[licznik]=char(0);
licznik:=licznik-1;
wynik:=0;
c:=1;
for d:=licznik downto 1 do
begin
if (a[d]='1') then
wynik:=wynik+c;
c:=c*2;
end;
writeln(wynik);
readln;
end.

Przyjąłem rozmiar tablicy 10. Ty powinieneś przyjąć dany maksymalny rozmiar+1 (albo nie dodawać tej 1 i załatwić obliczanie zmiennej licznik wykorzystując stałą;) ). W razie wątpliwości pytaj;)

10.12.2009
22:24
[8]

kamyk_samuraj [ Legend ]

funkcja:

function Chr2Int(c: Char): Integer;
begin
c := UpCase(c);
if (c >;= '0') and (c <;= '9') then
result := Integer(c) - Integer('0')
else
result := Integer(c) - Integer('A') + 10;
end;

function Str2Int(s: string; base: Integer): Integer;
var
i: Integer;
begin
Result := 0;
for i := 1 to Length(s) do
result := (result * base) + Chr2Int(s);
end;

wywołanie:
ValueBin := Str2Int('110101010', 2);

Tłumaczenie:
Wywołujesz funkcję, podając liczbę w postaci binarnej oraz podstawę systemu, w którym pierwszy argument jest zapisany. Pierwszy argument zostaje zapisany jako string (tablica elementów typu char). Następ w pętli for przechodzisz przez tę tablicę mnożąc aktualną wartość wskazywaną przez indeks i przez odpowiednią potęgę podstawy i dodając do sumy wcześniejszych wyników.
Oczywiście można lekko zmodyfikować kod, tak by baza była ustalona na stałe na 2 a liczbę binarną wczytywać z klawiatury. No i zapisać to wszystko razem.

© 2000-2024 GRY-OnLine S.A.