Prevod z dekadickych cisel na binarni a naopak – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Prevod z dekadickych cisel na binarni a naopak – C / C++ – Fórum – Programujte.comPrevod z dekadickych cisel na binarni a naopak – C / C++ – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
Chvostik
~ Anonymní uživatel
9 příspěvků
18. 12. 2011   #1
-
0
-

Potrebuju vytvorit program pro prevod z dekadickych cisel na binarni a naopak. Pc ma dat moznost uzivateli zadat dekadicke nebo binarni cislo a pak jej za postupneho pruvodce prevede na opačny format. Uzivatel ma moznost zadavat dalsi cisla nebo program ukoncit.

Pokud by mi nekdo napsal jednoduchej kod alepson toho prevodu tak budu vdecnej :)

Nahlásit jako SPAM
IP: 217.197.36.–
Reklama
Reklama
vitamin+8
Grafoman
18. 12. 2011   #2
-
0
-

"prevod" cisla do binarneho formatu mozes pomocou binarneho andu a nasobkov 2 .

unsigned i;
bool b[sizeof(unsigned)*8];

b[0] = i & 0x1;	//vrati bit s najnizsou vahou
b[1] = i & 0x2;	//vrati bit s 2 najnizsou vahou
b[2] = i & 0x4;
b[3] = i & 0x8;
b[4] = i & 0x10;
//...

//spetny prevod bude takto:
i = 0;
i |= b[0];
i |= b[1];//...
Nahlásit jako SPAM
IP: 178.143.60.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
Chvostik
~ Anonymní uživatel
9 příspěvků
18. 12. 2011   #3
-
0
-

a mohl bys mi poradit jak to zakomponuju do tech mezer ? bo moc tomu nerozumim :o

#include <stdio.h>

void main()
{
    
int dek, bin;
int volba;

do
{
  printf(" 1. Pro prevod z dekadickych cisel do binarnich\n");
  printf(" 2. Pro prevod z binarnich cisel do dekadickych\n");
  printf(" 0. Ukonci \n");
  scanf("%d",&volba);

  switch(volba)
  {
  case 1: printf("Zadejte cislo dekadicky:");
             scanf("%i",&dek);
   

    printf("vysledek %i \n", dek);
    break;
  case 2: printf("Zadejte cislo binarne:");
             scanf("%i",&bin);
   


    printf("vysledek %i \n", bin);
    break;
        case 0:break;
  default:printf("spatna volba\n");
  }
}while (volba !=0);
}

Nahlásit jako SPAM
IP: 217.197.36.–
vitamin+8
Grafoman
18. 12. 2011   #4
-
0
-

Toto ti zobrazi cislo  binarne (bit z najnizsou vahov je uplne nalavo):

unsigned i = 476;

for(unsigned x=0, n = 1; x < n; (x=n), n *=2 )
	putchar((i & n)?'1':'0');

Premenna x je vzdy mensia od n, ale akonahle sa dostane n mimo rozsah (pretecie) tak bude x vecsie ako n a vtedy sa ukonci cyklus. 

Spetny prevod bude zaujimavejsi. Budes musiet nacitat binarne cislo ako retazec (otestovat spravnost zadania + rozsah cisla). Potom pomocou podobneho cyklu ako sam ti napisal vyzsie upravovat kazdy bit v cisle zvlast. (pomocou bin or-u)

Nahlásit jako SPAM
IP: 178.143.60.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
Chvostik
~ Anonymní uživatel
9 příspěvků
18. 12. 2011   #5
-
0
-

mno ten prevod z dekadickych na binarni uz mi teda funguje( az na to ze to ukazuje nadbytecne 0), ale to druhy furt nevim, par kodu jsem nasel na netu ale nechapu je :X , chapu ze to potrebuju nacist do retezce a pak to cely secist, ale nechapu jak pomoci scanfu to udelat pro libovolnej pocet cisel a at je muzu nacist najednou

Nahlásit jako SPAM
IP: 217.197.36.–
KIIV+42
God of flame
18. 12. 2011   #6
-
0
-

#5 Chvostik
taky nemusis nacitat najednou.. staci po znacich

Nahlásit jako SPAM
IP: 94.112.32.–
Program vždy dělá to co naprogramujete, ne to co chcete...
vitamin+8
Grafoman
18. 12. 2011   #7
-
0
-

Staci trochu rozsirit podmienku v cykle a nebude ti zobrazovat nadbytocne nuly. Prevod bin cisla (zadaneho napr ako retazec) na obycajne cisla by si mohol zvladnut na zaklade tych prikladov co som ti napisal vyzsie, pripadne sa opytaj na konkretnu vec co ti nejde. Najlepsie aj s castou kodu ktora ti nejde alebo jej nechapes.

Nahlásit jako SPAM
IP: 178.143.60.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
vitamin+8
Grafoman
18. 12. 2011   #8
-
0
-

#5 Chvostik
Staci trochu rozsirit podmienku v cykle a nebude ti zobrazovat nadbytocne nuly. Prevod bin cisla (zadaneho napr ako retazec) na obycajne cisla by si mohol zvladnut na zaklade tych prikladov co som ti napisal vyzsie, pripadne sa opytaj na konkretnu vec co ti nejde. Najlepsie aj s castou kodu ktora ti nejde alebo jej nechapes.

Nahlásit jako SPAM
IP: 178.143.60.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
Chvostik
~ Anonymní uživatel
9 příspěvků
19. 12. 2011   #9
-
0
-

A muzes mi prosimte napsat jak mam rozsirit ten cyklus, aby se to nezobrazovalo ty nadbytecne 0? :o)  me to tak jednoznacny zas nepride :-D

for(x=0, n = 1; x < n; (x=n), n *=2 )
putchar((dek & n)?'1':'0');

A k te dalsi casti:

unsigned i;
bool b[sizeof(unsigned)*8];

b[0] = i & 0x1; //vrati bit s najnizsou vahou
b[1] = i & 0x2; //vrati bit s 2 najnizsou vahou
b[2] = i & 0x4;
b[3] = i & 0x8;
b[4] = i & 0x16;

b[5] = i & 0x32;
//...

//spetny prevod bude takto:
i = 0;
i |= b[0];
i |= b[1];//...

Promena kterou potrebuju nacist do scanfu je i že? Nebo proste nevim pokud muzes tak mi napis primo prikaz na ten scanf tak, aby se to pasovalo k tem vzorcum. :) pises to dost obecne a moc mi to nepomaha :-D i kdyz u toho prvniho jsem do dohromady dal :)
           

Nahlásit jako SPAM
IP: 217.197.36.–
liborb
~ Redaktor
+18
Guru
19. 12. 2011   #10
-
0
-
Nahlásit jako SPAM
IP: 78.80.52.–
vitamin+8
Grafoman
19. 12. 2011   #11
-
0
-

#10 liborb
jj, je tam chyba.

dec = 0;	//vysledne cislo
dec |= b[0]? 0x1:0;
dec |= b[1]? 0x2:0;
dec |= b[2]? 0x4:0;

//...

#9 Chvostik
Na nacitavanie cisiel pouzi scanf na nacitavanie retazcov ti staci fgets.

Tie komenty mas divne, ja som nikde nepisal 0x16 a 0x32.

Mocniny 2 sa pisu dobre v 8 (cisla zacinaju na 0) alebo 16(cisla zacinajuce na 0x) sustave:

0x1  //1  == 2^0
0x2  //2  == 2^1
0x4  //4  == 2^2
0x8  //8  == 2^3

0x10 //16 == 2^4
0x20 //32 == 2^5
0x40 //64 == 2^6
0x80 //128 == 2^7

0x100 //256 == 2^8
0x200 //512 == 2^9
0x400 //1024 == 2^10
0x800 //2048 == 2^11

//...
Nahlásit jako SPAM
IP: 178.143.60.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
Chvostik
~ Anonymní uživatel
9 příspěvků
19. 12. 2011   #12
-
0
-

#6 KI

Muzes napsat presneji podle toho kodu co mam zadat do toho fgets(); pripadne jestli tam mam chybu nekde :o) vedel bych pomoci souboru jak to tam hodit, ale jinak netusim


#include <stdio.h>

void main()
{
    
int dek, x, n, dec;
int volba;
bool b[sizeof(unsigned)*8];


do
{
  printf(" 1. Pro prevod z dekadickych cisel do binarnich\n");
  printf(" 2. Pro prevod z binarnich cisel do dekadickych\n");
  printf(" 0. Ukonci \n");
  scanf("%d",&volba);

  switch(volba)
  {
  case 1: printf("Zadejte cislo dekadicky:");
             scanf("%i",&dek);
    printf("Vysledek:");
               for(x=0, n = 1; x < n; (x=n), n *=2 )
                if (n <= dek) putchar((dek & n)?'1':'0');
                 printf("\n\n");
    break;
  case 2: printf("Zadejte cislo binarne:");
             fgets();
   
    dec = 0;
                dec |= b[0]? 0x1:0;
                dec |= b[1]? 0x2:0;
                dec |= b[2]? 0x4:0;
    dec |= b[3]? 0x8:0;
    dec |= b[4]? 0x16:0;
    dec |= b[5]? 0x32:0;

    break;
        case 0:break;
  default:printf("spatna volba\n");
  }
}while (volba !=0);
}

Nahlásit jako SPAM
IP: 217.197.36.–
vitamin+8
Grafoman
19. 12. 2011   #13
-
0
-
Nahlásit jako SPAM
IP: 178.143.60.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
Chvostik
~ Anonymní uživatel
9 příspěvků
19. 12. 2011   #14
-
0
-

Neco jsem z toho zkousel, ale nevyslo. Bohuzel nemam cas na podrobnejsi prostudovani :/, ale diky.

Nahlásit jako SPAM
IP: 217.197.36.–
Chvostik
~ Anonymní uživatel
9 příspěvků
19. 12. 2011   #15
-
0
-

mno neco jsem dal s kamosem dohromady, ale musi tam bejt nekdy chyba bo me ten getc ani nenecha nic nacist a hned to vypisuje vysledek

int dek, bin, x, n, i,dec, dec1,dec2,dec3,dec4,dec5,dec6;
int volba;
bool b[sizeof(unsigned)*8];
char c=' ';
i=0;

while (c=='1' || c=='0')
                {
                 b[i]=c;
                 c=getc(stdin);
                  i++;
                }
                 
                dec = 0;
                dec1 |= b[i]? 0x1:0;
                dec2 |= b[i]? 0x2:0;
                dec3 |= b[i]? 0x4:0;
                dec4 |= b[i]? 0x8:0;
                dec5 |= b[i]? 0x10:0;
                dec6 |= b[i]? 0x20:0;
                printf("Vysledek:%i%i%i%i%i%i",dec1,dec2,dec3,dec4,dec5,dec6);

Nahlásit jako SPAM
IP: 217.197.36.–
liborb
~ Redaktor
+18
Guru
19. 12. 2011   #16
-
0
-

Protože v c je mezera a tak není splněna podmínka. Můžeš první načtení před vstup do cyklu, tj. zkopírovat řádek.

Zasláno z mobilního telefonu.

Nahlásit jako SPAM
IP: 82.145.211.–
Chvostik
~ Anonymní uživatel
9 příspěvků
19. 12. 2011   #17
-
0
-

Tak hotovo ! Nakonec jsme to vyresili uplne jinak, ale hlavne ze to funguje :-D. Diky vsem za cas :)

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

void main()
{
    
int dek, x, n;
int volba;
int vysledek=0, i=0,j=0,k;
char c=' ';
char pom[50]="";


do
{
  printf(" 1. Pro prevod z dekadickych cisel do binarnich\n");
  printf(" 2. Pro prevod z binarnich cisel do dekadickych\n");
  printf(" 0. Ukonci \n");
  scanf("%d",&volba);

  switch(volba)
  {
  case 1: printf("Zadejte cislo dekadicky:");
             scanf("%i",&dek);
    printf("Vysledek:");
               for(x=0, n = 1; x < n; (x=n), n *=2 )
                if (n <= dek) putchar((dek & n)?'1':'0');
                 printf("\n\n");
    break;
  case 2: printf("Zadejte cislo binarne:");
               c=getc(stdin);
      c=getc(stdin);
               while (c=='1' || c=='0')
             {
           pom[i]=c;
           c=getc(stdin);
           i++;
             }
          i--;
          for(j;j<i+1;j++)
           {
             k=i-j;
          vysledek=vysledek + ((pom[j]-48) * pow((double)2,k));
           }
         printf("= %d \n\n",vysledek);
                        
    break;
        case 0:break;
  default:printf("spatna volba\n");
  }
}while (volba !=0);
}

Nahlásit jako SPAM
IP: 217.197.36.–
vitamin+8
Grafoman
19. 12. 2011   #18
-
0
-

Mas tam mensiu chybu, niektore premenne inicializujes len na zaciatku programu. Napr zacnes nacitavat bin cislo. To sa ti ulozi do vysledok. Pri nacitavani dalsieho cisla budes mat vo vysledku daku hodnotu z predchadzajuceho kroku a tu zacnes zvecsovat, cize prevod bude chybny.

Nahlásit jako SPAM
IP: 178.143.60.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
Chvostik
~ Anonymní uživatel
9 příspěvků
22. 12. 2011   #19
-
0
-

jojo ve skole jsem si toho vsiml :) detail :D hodil jsem to pred cyklus a uz to slape

Nahlásit jako SPAM
IP: 217.197.36.–
Adam
~ Anonymní uživatel
157 příspěvků
29. 12. 2011   #20
-
0
-

Ještě jeden takový drobný dotaz. Zde jsem vytvořil program pro převod z dekadické do ostatních soustav:

#include <stdio.h>
int main()
{
do{
    int cislo;

    printf("\nZadejte cislo v dekadicke soustave: ");
    scanf("%d", &cislo);
    printf("\nDecimalni soustava: %d\n", cislo);
    printf("Oktalova soustava: %o\n", cislo);
    printf("Hexadecimalni soustava: %x\n", cislo);
   
} while (getchar() != '\t');

//vyprazdneni bufferu
while (getchar() != '\n');
getchar();
return 0;   
}

Jak můžete vidět tak %o = oktalová, %x = hexadecimální.... A právě mě zajímá jestli něco takového právě existuje i na binární soustavu. 

Nahlásit jako SPAM
IP: 46.174.59.–
JoDiK
~ Anonymní uživatel
981 příspěvků
29. 12. 2011   #21
-
0
-

#20 Adam
http://stackoverflow.com/questions/111928/is-there-a-printf-converter-to-print-in-binary-format

Nahlásit jako SPAM
IP: 88.103.233.–
JoDiK
~ Anonymní uživatel
981 příspěvků
29. 12. 2011   #22
-
0
-

#20 Adam
http://www.cplusplus.com/reference/clibrary/cstdlib/itoa/

Nahlásit jako SPAM
IP: 88.103.233.–
JoDiK
~ Anonymní uživatel
981 příspěvků
29. 12. 2011   #23
-
0
-

#20 Adam
Nebo-li přímo to zřejmě nejde...

Nahlásit jako SPAM
IP: 88.103.233.–
Adam
~ Anonymní uživatel
157 příspěvků
29. 12. 2011   #24
-
0
-

#23 JoDiK
Aha, škoda no, tak dik

Nahlásit jako SPAM
IP: 46.174.59.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 40 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý