Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailemVyřešeno jazyk C - premena z desiatkovej sustavy na binarnu

zdravim mam problem s tymto jednoduchym binarnym kodom nenapise mi to nic vobec nic a neviem preco
matematicky to je spravne nie?? akorat neviem ci ked to nepodelim nevyde mi aj zvysok ze by som dal celociselnu premennu ale zas ci by to zistilo ten zvysok po deleni :D

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main()
{
    int desiatkova;
    int dvojkova;
    printf ("Zadaj prirodzene cislo v desiatkovej sustave: ");
    scanf("%d",&desiatkova);
    while (desiatkova<0)
    {
        if((desiatkova%2)==0)
        {
            printf("0");
        }
        if((desiatkova%2)==1)
        {
            printf("1");
        }
        desiatkova/2;
    }
    getchar();
    return 0;
}
Jsou zobrazeny jen nové odpovědi. Zobrazit všechny
Předmět Autor Datum
nechápu. To jako převádíš do dvojkové soustavy dělením dvěma? Spadl jsi z višně? Příklad: dekadick… nový
touchwood 22.10.2013 12:17
touchwood
Z višně nespadl, to je docela normální postup. nový
Wikan 22.10.2013 12:19
Wikan
ahaa uz chapem :D idem to teda prerobit diky :D nový
Mythirn 22.10.2013 12:21
Mythirn
Nic nepředělávej, až na ty dvě chyby jsi to měl dobře. nový
Wikan 22.10.2013 12:21
Wikan
a jak ich opravim? :D sak ta podmienka sa splni az pokial nebudem delit ze vyde mensie ako 0 a to dr… nový
Mythirn 22.10.2013 12:24
Mythirn
Tak jinak, kolikrát myslíš, že se provede ten cyklus třeba pro číslo 7? To druhé sice to číslo vyděl… nový
Wikan 22.10.2013 12:27
Wikan
pre cislo 7 3krat nový
Mythirn 22.10.2013 12:29
Mythirn
Ne, proběhne 0x. nový
Wikan 22.10.2013 12:35
Wikan
tak mam dat ze desiatkova=desiatkova/2< nový
Mythirn 22.10.2013 12:30
Mythirn
nehádej, spočítej a proiteruj si to ručně. edit: jinak to je dobře, ale ještě máš blbě ten cyklus,… nový
touchwood 22.10.2013 12:32
touchwood
proč myslíš, že jsem ti uvedl ten otrocký příklad? Protože to postupné dělení ti v iteracích udělá t… nový
touchwood 22.10.2013 12:29
touchwood
sak ale 255bitov staci na male cisla nie?? nový
Mythirn 22.10.2013 12:32
Mythirn
asi jsme se nepochopili (soudím tak i podle Wikana). Šlo o princip. nový
touchwood 22.10.2013 12:33
touchwood
no jasne ja som slepy :D tam v tom while ma byt 1 a ne 0 :D to som vobec nepocital s takou chybou nový
Mythirn 22.10.2013 12:42
Mythirn
Takze uz to mam takto to vyzera funkcne :) dakujem chalani za ochotu a rady #include <stdio.h> #inc… nový
Mythirn 22.10.2013 12:57
Mythirn
void prevod( int num1 ) { if( num1 == 0 ) { return; } prevod( num1 / 2 ); cout << num1 % 2; } Krat… nový
MaSo 22.10.2013 13:39
MaSo
Na tohle použít rekurzi? No fuj. nový
Wikan 22.10.2013 13:41
Wikan
Umí bežné kompilátory odhalit a optimalizovat takovéhle tragické použití rekurze? nový
mnua.al 23.10.2013 06:58
mnua.al
V tomhle případě to nejspíš odhalí a "opraví", ale radši bych na to nespoléhal. nový
Wikan 23.10.2013 07:40
Wikan
Preco tragicke? Vyhoda je hlavne v tom ze to tie cifry vypise v spravnom poradi. Na rozdiel od toho… nový
MM.. 23.10.2013 11:32
MM..
+1 :) akurat ti to nezobrazi 0 ak je num1=0. Spravnejsie (s vypisom 0 ak je 0) a aj kratsie by to as… nový
MM.. 23.10.2013 11:41
MM..
Tak tohle je ještě hezčí...:beer: nový
MaSo 23.10.2013 11:47
MaSo
Ale musim povedat ze ked som to zadanie cital vcera tak ma rekurzia vobec nenapadla, aj ked toto je… nový
MM.. 23.10.2013 11:55
MM..
Já si to pamatoval ještě z výšky, kde jsme tenhle problém měli řešit rekurzí..;-) EDIT: Ten třeti e… poslední
MaSo 23.10.2013 12:31
MaSo
No skoro dobre, akorat vystup je binarni cislo zapsane POZPATKU - napr. 4 ti to napise 001 misto 100 nový
gilhad 23.10.2013 00:55
gilhad
taky jsem se divil, ale pak jsem si řekl, že to "asi" nevadí. :-) nový
touchwood 23.10.2013 08:07
touchwood

nechápu. To jako převádíš do dvojkové soustavy dělením dvěma? Spadl jsi z višně?

Příklad:

dekadicky: 4
4:2=1
2:2=1

přitom binárních 11 jsou 3 deka
správně 4 deka = binárně 100

Když už to chceš takto otrocky, tak se to počítá (pro hodnoty do 255):

je-li číslo větší 2^7, odečteš 128, zapíšeš 1 (jinak 0) a zbytek pošleš do dalšího kola
v dalším kole porovnáš s 2^6 (64) a případně opět odečteš (připíšeš při odečtení 1, jinak 0)
... a pokračuješ až po 2^0 (1).

Příklad:

číslo 4 deka:
(odpovídá 2^2)

00000100

edit: ono to jde realizovat dělením a celočícelným dělením, ale určitě ne takto.

Takze uz to mam takto to vyzera funkcne :) dakujem chalani za ochotu a rady

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main()
{
unsigned int desiatkova;
printf ("Zadaj prirodzene cislo v desiatkovej sustave: ");
scanf("%d",&desiatkova);
while (desiatkova>=1)
{
if((desiatkova%2)==0)
{
printf("0");
}
if((desiatkova%2)==1)
{
printf("1");
}
desiatkova=desiatkova/2;
}
printf (" - Toto je cislo v binarnej sustave.");
getchar();
return 0;
}

Umí bežné kompilátory odhalit a optimalizovat takovéhle tragické použití rekurze?

Preco tragicke? Vyhoda je hlavne v tom ze to tie cifry vypise v spravnom poradi. Na rozdiel od toho co robil dotazovatel. Neni to jedno! A s cykom to neni tak elegantne (s cyklom si musis testovat uvodne nuly a tie nezobrazovat apod). Rekurzia je idealna ptz defakto pouziva stack na uchovavanie tych predoslych cifier ked scanujes zprava. inac by si musel alokovat RAM.
A prekladac nic neopravuje ptz to ani nijak upravit ani opravit nejde bez zmeny funkcionality.

+1 :) akurat ti to nezobrazi 0 ak je num1=0. Spravnejsie (s vypisom 0 ak je 0) a aj kratsie by to asi mohlo byt napr. takto

void prevod( unsigned int num )
{
  if(num>=2)
     prevod(num>>1);
  cout << (num&1);
}

alebo to same len univerzalnejsie vzhladom na zaklad sustavy

void prevod( unsigned int num )
{
  if(num>=2)
     prevod(num/2);
  cout << (num%2);
}

alebo

void prevod( unsigned int num, unsigned int zaklad )
{
  if(num>=zaklad)
     prevod(num/zaklad);
  cout << (num%zaklad);
}

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