Převod mezi číselnými soustavami – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Převod mezi číselnými soustavami – C / C++ – Fórum – Programujte.comPřevod mezi číselnými soustavami – C / C++ – Fórum – Programujte.com

 

18. 8. 2009   #1
-
0
-

Napsal jsem si podprogram na převod mezi desítkouvou a nižší číselnou soustavou.



void desbin()
{ int desitka, i, pom1, pom2, cifry, cs;
const int vel=35;
int A [35];
cout << "Zadejte cislo: ";
cin >> desitka;
do{ cout << "Zadejte cilovou ciselnou soustavu. ";
cin >> cs;
if (cs<2) if (cs>9) cout << "Zadej cislo mezi 2 a 9";}
while ((cs<2) and (cs>9));
if (desitka<cs) cifry=1;
else{
cifry=0; pom1=desitka;
do{ pom2=pom1 / cs;
pom1=pom2;
cifry++;
}
while(pom1>0);}
cout << "pocet cifer v " << cs << " soustave je: " << cifry << endl;
cout << "Vysledek je: ";
pom1=desitka; pom2=0;
for (i=0; i==vel; i++) A[i]=0; //nulování
while (pom1>1)
{ i++;
pom2=pom1 / cs;
A[i]= pom1 % cs;
pom1 = pom2;
}
for ( i=1; i==vel; i++)
{ cout << A[i];}
}

Vypisuje sice počet cifer v cílové číselné soustavě, ale nechce napsat konečný výsledek. Vím, že by měl vypisovat výsledek obráceně, nechtělo se mi jen pokračovat bez funkčnosti.

Nahlásit jako SPAM
IP: 78.156.145.–
don_Dominique0
Super člen
18. 8. 2009   #2
-
0
-

Celý sem to nestudoval ale chyba bude asi tady

for ( i=1; i==vel; i++) 

Konkrétně v
 i==vel


Mělo by být spíše
i<=vel


EDIT: teď sem do toho kódu nakoukl a celý je to nějaký podivný.
Řekl bych, že to máš zbytečně moc složitý. Stačí použít postupný dělení základem soustavy (dvojková 2, osmičková 8 ...) a zbytky postupně přičítat (řetězcově) k výsledku a nakonci mam výsledek v opačnym pořadí (funguje pro převod z desítkové do jakkékoliv soustavy, v případě čísel nad 9 je nahraď písmeny A, B, C ....).

Nahlásit jako SPAM
IP: 88.146.211.–
Anonymní uživatel
~ Anonymní uživatel
0 příspěvků
19. 8. 2009   #3
-
0
-

Najlepsie je vyuzit, ze to cislo v pamati uz binarne je a trochu sa pohrat s binarnym pusonom a AND-om.



//num je cislo ktore prevadzame
unsigned int mask = 1 << (sizeof(unsigned int)*8 - 1);
while(mask) {
if(mask & num)
cout << 1;
else
cout << 0;
mask >> 1;
}

Nahlásit jako SPAM
IP: 217.118.98.–
m->29+6
Super člen
19. 8. 2009   #4
-
0
-

Trochu som sa s tým pohral ale mal si v tom somarín...
No možno to pomôže:

void desbin(void) {

int desitka, i, pom1, pom2, cifry, cs;
const int vel=35;

cout << "Zadejte cislo: ";
cin >> desitka;

do{
cout << "Zadejte cilovou ciselnou soustavu. "; cin >> cs;
if (cs<2 || cs>9) cout << "Zadej cislo mezi 2 a 9";
} while ((cs<2) or (cs>9)); // zopakuj si log. or/and

if(desitka<cs) cifry=1;
else {
cifry=0;
pom1=desitka;
do{
pom1 /= cs;
cifry++;
} while(pom1 > 0);
}

cout << "pocet cifer v " << cs << " soustave je: " << cifry << endl;
cout << "Vysledek je: ";

pom1=desitka;
pom2=0;

/*
* toto je úplná somarina:
for(i=0; i==vel; i++)
A[i]=0; //nulování

* toto je menšia:

for(i=0; i<vel; i++)
A[i]=0; //nulování

* a takto sa to robí: */ int A[vel] = {0};

/*
while (pom1>1) {
i++; // neinicializovaná premenná (predtým vo for i==vel)
pom2=pom1 / cs;
A[i]= pom1 % cs; // i==vel => prístup do "cudzej" pamäte
pom1 = pom2;
}
*/

/* prepis vyšie uvedenej veci */
for(int i=0; pom1>0; i++) {
A[i] = pom1 % cs;
pom1 /= cs;
}

for(i=cifry-1; i>=0; i--) { cout << A[i]; }
}
A skús sa pohrať s týmto ;-)

/**
* Napíšte funkciu
*
* bool ulong2str(unsigned long num, int base, char *str, int n);
*
* ktorá prevedie číslo num typu unsigned long na reťazec str.
* Základ použitej číselnej sústavy je base. Použite assert na kontrolu
* rozsahu základu (od 2 do 36). Predpokladáme, že pole na ktoré
* ukazuje str má veľkosť n znakov. Ak by dĺžka výsledku presiahla toto
* maximum, vracia funkcia hodnotu false a výsledný reťazec má
* nedefinovanú hodnotu. Inak funkcia vracia true a správnu hodnotu
* v reťazci str. Nesmiete volať žiadne štandatdné funkcie. Pozor na num==0.
*/

Je to síce pre C, ale namiesto char* môžeš dať string a tým ti odpadá aj to kontrolovanie dĺžky pola...

Nahlásit jako SPAM
IP: 213.151.218.–
tmi0
Věrný člen
21. 8. 2009   #5
-
0
-

jdete na to moc slozite:

/* prevod z vnitrni (binarni) reprezentace do r-narniho textoveho retezce */

while(a) { pl[i--] = a%r + '0'; a/=r; } pl=&pl[i];
/* a je int k prevodu, pl je char * pro vystup */

/* prevod z r-narniho textoveho retezce do vnitrni (binarni) reprezentace */
for(i=strlen(pl)-1, m=1, a = 0 ; i>=0; i--, m*=r) a += (pl[i]-'0')*m;
/* a je int pro vysledek, pl obsahuje vstup */


skoda ze ascii na to neni moc vhodna, pro r>10 je potreba vice si hrat se znaky...

Nahlásit jako SPAM
IP: 213.226.226.–
ksp.mff.cuni.cz -- doporučuje 5 z 0 přetečených bufferů!
m->29+6
Super člen
22. 8. 2009   #6
-
0
-

Ja som sa len snažil opraviť chyby v tom programe čo sem Hnusný_SLimák postol. Išiel by som na to určite inak:

#include <stdio.h>

#include <stdlib.h>
#include <stdbool.h>
#include <assert.h>

#if 1
bool ulong2str(unsigned long num, int base, char *str, int n) {
if(str == NULL || n < 2) { return false; }
assert(base >= 2 && base <= 36);

unsigned long x = num; // kópia čísla, potom zvyšok po delení
do {
if(--n <= 0) { return false; } // ak sa číslice + '\0' nezmestia => chyba
str++; // nadstavenie pointera na správnu pozíciu
} while(x /= base); // počet číslic

*str-- = '\0'; // korektne ukonči reťazec

do {
x = num % base; // x = zvyšok po delení..
*str-- = x + ((x < 10)? '0' : 'A'-10); // ..zmeň na znak
} while(num /= base);

return true;
}

#else
bool ulong2str(unsigned long num, int base, char *str, int n) {
if(str == NULL || n < 2) { return false; }
assert(base >= 2 && base <= 36);

register int rest = 0, i = 0;

do { // ak num == 0, tak aj tento reťazec sa prevedie a až potom sa otestuje podmienka
if(i >= n) { return false; }
rest = num%base;
num /= base;
str[i] = rest + ((rest < 10)? '0' : 'A'-10);
i++;
} while(num > 0);
if(i >= n) { return false; }
str[i--] = '\0'; // kerektne ukonči reťazec

for(int j=0; j<i; j++, i--) { // obráť reťazec
str[j] ^= str[i];
str[i] ^= str[j];
str[j] ^= str[i];
}

return true;
}
#endif

int main(void) {
char string[100];
ulong2str(0xF4FABD9C, 16, string, 100);
puts(string);

return EXIT_SUCCESS;
}
Tá druhá funkcia by sa dala odladiť, ale tá prvá je myslím "bez chyby" ;-)

Nahlásit jako SPAM
IP: 213.151.218.–
Tommy
~ Anonymní uživatel
7 příspěvků
20. 12. 2012   #7
-
0
-

#6 m->29
Zdravím lidi.... pomůžete mi prosím někdo? mám podobný problém s převodem do binární soustavy, mě však nefunguje vůbec příkaz string... Takže to zkouším s přidáváním do pole... pracuji v programu MS Visual Studio... vytvořil jsem něco takového:

#include <stdio.h>
int main(void) {
int z,a, *pole;
printf("Zadejte cislo: \n");
scanf("%d", &z);
while ((int) z != 0)
{
  a = ((int) z % 2);
  *pole = a;
  z = z / 2;
  printf("%d", *pole);
}
return 0;
}

ale stále mi to nefunguje... poradíte mi prosím někdo?

Nahlásit jako SPAM
IP: 80.188.69.–
22. 12. 2012   #8
-
0
-

ja robim prevody takto :D

(http://www.cplusplus.com/reference/cstdlib/itoa/)

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

int main ()
{
  int i;
  char buffer [33];
  printf ("Enter a number: ");
  scanf ("%d",&i);
  itoa (i,buffer,10);
  printf ("decimal: %s\n",buffer);
  itoa (i,buffer,16);
  printf ("hexadecimal: %s\n",buffer);
  itoa (i,buffer,2);
  printf ("binary: %s\n",buffer);
  return 0;
}

alebo pouzivam v prikaze printf() rozne typy vypisu "%d,%o,%x) :D :D naco riesit nieco co moze spravit program sam :D

Nahlásit jako SPAM
IP: 217.119.126.–
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, 38 hostů

Moderátoři diskuze

 

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