Builder.cz - Informacni server o programovani

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:



Využití rekurze - převod soustav

Seznam témat     Nová odpověď

Přihlásit se     Registrace     Zapomenuté heslo

Re: Využití rekurze - převod soustav

Autor: argqwrtwertwert

20:24:40 15.11.2011

tak kdyz jsi delal ve vice jazycich tak to tu mas rekurzivne v C, ale bacha vraci to postupne
zbytky odzadu, takze pro ziskani binarniho cisla je jeste potreba pouzit stringovy buffer a prehodit poradi cislic.
____________________________________________________________________________________


#include
#include

int dvojkovy_zbytek(int *x)
{
int z;
int dd;
dd = *x/2;
z = *x%2;
*x = dd;
return z;
}

int main()
{
int cislo = 115;

printf ("binarni cislo odzadu:\n");

while (cislo>1)
printf ("%d",dvojkovy_zbytek(&cislo)); /* rekurzivne volana stale stejna funkce */

printf ("1\n");
return 0;
}

Citovat příspěvek

 

Re: Využití rekurze - převod soustav

Autor: Jan33

11:12:51 15.11.2011

> Jde o můj zadaný úkol
To je ale dost podstatná informace, kterou jste nám zatajil. V první řadě, pokud vám učitel nezdůraznil, že rekurze není pro tento typ úlohy vhodná, překvapte jej tím, že mu sice rekurzivní algoritmus uděláte, ale vysvětlíte mu důvody, proč není vhodný.

> proč mi program nechce klasickým sout(+dvojkova) vypsat stringbuffer?
Nezkracujte to, my se pak ztrácíme. Předpokládám, že vám jde o část kódu:

int zbytek = 1;
System.out.println(+zbytek);

Proč to funguje? Co se tam děje? V první řadě se podívejte na signatury println() [url]http://download.oracle.com/javase/7/docs/api/java/io/PrintStream.html[/url]. Co přijímá jako argument? Jaký se uplatní v případu výše?

Malá nápověda: + je v tomto případě unární operátor, který typ ani hodnotu nezmění. Ve svém podstatě tam je zbytečný.

Můžu se jen domnívat, že jste + přidal ve víře, že vám z proměnné zbytek, udělá kladné číslo. Unární operátory jsou definovány pouze na primitivních datových typech (int, long, ...), respektive v nových Javách díky AutoBoxingu i na jejich obalových typech (Integer, Long, ...). Pokud chcete opravdu dosáhnout kladného čísla, je nutné použít správnou metodu z [url]http://download.oracle.com/javase/7/docs/api/java/lang/Math.html[/url] (malá nápověda: matematici jí znají pod pojmem absolutní hodnota). Takže, použití + nad objektem (instance StringBufferu je v tomto případě objekt) není definována a vede ke kompilační chybě.

> Poslední věc - lze uložit dosavadní průběh programu? Save-load?
Ano, to lze.

Myslím, že by vám prospělo, pokud by jste se trochu probral učebnicí:
[url]http://www.java.cz/article/ucebnicejazykajava[/url]. Naleznete tam mnoho odpovědí vaše otázky.

Citovat příspěvek

 

RE: Vyuziti rekurze - prevod soustav

Autor: polakm

10:14:35 14.11.2011

> Ošvindlovat to "Integer.toBinaryString(a))" tudíž nemohu.

Minimalne tim ale muzete overit/prokazat spravnost sve implementace.
Teda aspon v nekterych pripadech - protoze jak znamo, v kazdem programu je minimalne jedna chyba.... :-)


Příspěvek zaslán emailem

Citovat příspěvek

 

Re: Využití rekurze - převod soustav

Autor: Petr H.

10:11:31 14.11.2011

Děkuji Vám oběma za přehlednou radu.

Bohužel, v průběhu studia jsem už prošel třemi programovacími jazyky (nikdy ne na bůhvíjakou úroveň), takže jsem pochytil pár zlozvyků.

Jde o můj zadaný úkol - mám s využitím dosavadních znalostí - tj. základy + rekurze + metody - napsat program. Ošvindlovat to "Integer.toBinaryString(a))" tudíž nemohu.

Chápu, ale ještě se tím zkusím prohrabat. Mohu se zeptat, proč mi program nechce klasickým sout(+dvojkova) vypsat stringbuffer? Lze to jiným způsobem?

Poslední věc - lze uložit dosavadní průběh programu? Save-load? Nejlépe externím souborem?

Citovat příspěvek

 

Re: Využití rekurze - převod soustav

Autor: Petr H.

22:43:00 13.11.2011

Děkuji Vám oběma za přehlednou radu.

Bohužel, v průběhu studia jsem už prošel třemi programovacími jazyky (nikdy ne na bůhvíjakou úroveň), takže jsem pochytil pár zlozvyků.

Jde o můj zadaný úkol - mám s využitím dosavadních znalostí - tj. základy + rekurze + metody - napsat program. Ošvindlovat to "Integer.toBinaryString(a))" tudíž nemohu.

Chápu, ale ještě se tím zkusím prohrabat. Mohu se zeptat, proč mi program nechce klasickým sout(+dvojkova) vypsat string? Lze to jiným způsobem?

Poslední věc - lze uložit dosavadní průběh programu? Save-load? Nejlépe externím souborem?

Citovat příspěvek

 

Re: Využití rekurze - převod soustav

Autor: Jan33

21:09:12 13.11.2011

Petře, asi jsi se ztratil ve zbytečné rekurzi, kterou jsi tam namastil. Tvoje metoda (mimochodem kdo tě učil psát jména metod s velkým písmenem na začátku? Nepřicházíš z Visual Basicu?) vrací 1 nebo nulu, protože jí to nařizuješ: "return a;"

Jestli jsi chtěl celé binární číslo, neměl by jsi si v parametrech předávat Stringy, ale nejaké StrigBuildy (StringBuffery) a postupně přidávat (append()) hodnoty proměnné "zbytek".

Marek se Ti jemně pokoušel naznačit, že bys celou metodu Dodvojkove mohl nahradit vestavěnou funkcí na převod do binární soustavy:

System.out.println("Výsledek je : "+Integer.toBinaryString(a));

Citovat příspěvek

 

Re: Využití rekurze - převod soustav

Autor: marekStu

20:57:10 13.11.2011

Myslel jsem to tak, ze neni treba vymyslet algoritmus na prevod. Staci zavolat metodu toBinaryString() nad nejakym intem, ktera vrati binarni reprezentaci v retezeci. Zkuste si vypsat

System.out.println(Integer.toBinaryString(4));

Je to ono co potrebujete?

Citovat příspěvek

 

Re: Využití rekurze - převod soustav

Autor: Petr H.

20:10:31 13.11.2011

Bohužel nechápu.

Citovat příspěvek

 

Re: Využití rekurze - převod soustav

Autor: marekStu

16:43:50 13.11.2011

A Proc nepouzit rovnou metodu Integer.toBinaryString(4);?

Citovat příspěvek

 

Využití rekurze - převod soustav

Autor: Petr H.

16:20:25 13.11.2011

Dobrý den,

Nedá mi spát můj nefungující program. Vzhledem k tomu, že mi vrací jen nulu nebo jedničku si myslím, že problém je v tom, že proměnná "dvojkova" dědí hodnotu "0". Jak to obejít? Pozn. - na vypsání výsledku jsem použil řetězec - mé zatím malé programovací znalosti mi říkají, že int 1 + int 2 = 3; string 1 + string 2 = 12. Je tomu snad jinak?

Děkuji, Petr

System.out.println("Vložte číslo, převedu ho do dvojkove soustavy :");
a=klv.nextInt();
x=Dodvojkove(a, 0, -1, null, null);
System.out.println("Výsledek je : "+x);
break;

static int Dodvojkove(int a, int zbytek, int i, String dvojkova, String zbytek2){
i=i+1;
if (a>2) {
zbytek=a%2;
System.out.println(+zbytek);
zbytek2=Integer.toString(zbytek);
dvojkova=dvojkova + zbytek2;
return Dodvojkove(a/2, zbytek, i, zbytek2, dvojkova);}
else
a = Integer.parseInt(dvojkova);
return a;
}

Citovat příspěvek

 

 

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: