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
Takze uz to mam takto to vyzera funkcne :) dakujem chalani za ochotu a rady #include <stdio.h> #inc…
Mythirn 22.10.2013 12:57
Mythirn
void prevod( int num1 ) { if( num1 == 0 ) { return; } prevod( num1 / 2 ); cout << num1 % 2; } Krat…
MaSo 22.10.2013 13:39
MaSo
Na tohle použít rekurzi? No fuj.
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
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

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