PDA

Visualizza la versione completa : [C] Convertire un interno in binario


Crow©
29-10-2007, 21:26
ciao a tutti ancora qui per questi problemi piccoli piccoli, sono qui pe chiedere come mai non riesco a compilare sto programma, inserendo un numero decimale da tastiera lo deve convertire in binario

avevo provato a fare na cosa del genere

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

int main(void)

{
int n, bit=1;
printf("Inserisci un numero decimale");
scanf("%d", &n);

while (pow(2, bit) < n)
bit++;

printf("%d", bit);
return 0;
}

ma al momento della compilazione mi da questo errore

gio_c/programma.c -o programma
/tmp/cc4brl8h.o: In function `main':
programma.c:(.text+0x4e): undefined reference to `pow'
collect2: ld returned 1 exit status

come mai dove sbaglio, oltre a soluzione del problema, mi potete dire se ci sono altri modi per fare questo esercizio, usando il for o if-else.

p.s. non è consentito usare array
ù
grazie a tutti ciao

duonovembre
29-10-2007, 21:36
pow prende due double

duonovembre
29-10-2007, 21:44
Originariamente inviato da Crow©
ciao a tutti ancora qui per questi problemi piccoli piccoli, sono qui pe chiedere come mai non riesco a compilare sto programma, inserendo un numero decimale da tastiera lo deve convertire in binario

avevo provato a fare na cosa del genere

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

int main(void)

{
int n, bit=1;
printf("Inserisci un numero decimale");
scanf("%d", &n);

while (pow(2, bit) < n)
bit++;

printf("%d", bit);
return 0;
}

ma al momento della compilazione mi da questo errore

gio_c/programma.c -o programma
/tmp/cc4brl8h.o: In function `main':
programma.c:(.text+0x4e): undefined reference to `pow'
collect2: ld returned 1 exit status

come mai dove sbaglio, oltre a soluzione del problema, mi potete dire se ci sono altri modi per fare questo esercizio, usando il for o if-else.

p.s. non è consentito usare array
ù
grazie a tutti ciao

potresti provare secondo me a prendere il modulo della divisione di int con 2 e poi ricorsivamente della parte intera della divisione di int/2 ancora con due

prima verifichi se il numero e' positivo o negativo
se e' positivo metti il primo numero a 0 altrimenti a 1
poi se int%2 == 1 allora il secondo bit e' 1, altrimenti 0
se poi (int/2)%2 ==1 allora il terzo bit e' 1, altrimenti 0

e cosi via ricorsivamente

Crow©
29-10-2007, 21:45
ciao duonovembre e grazie per la risposta, mi sono espresso male non devo invertire un decimale in binario ma devo solo dire quanti bit minimo occorre per rappresentare quel numero, esempio se metto 8 allora mi deve restituire 4 cioè 4bit 1000 che rappresenta 8

duonovembre
29-10-2007, 21:55
pow cmq vuole lo stesso dei double:D

puoi fare:
int n //e' la variabile che riempi con scanf

int i = 2;
int j = 1;
while (i< n){
i=i*2;
j++;
}

j sara' il numero di bit


credo ci siano soluzioni anche + efficienti

{-_-}
29-10-2007, 22:01
# include <stdio.h>

int main () {
int i, num;
int numero_binario [16]; // per interi a 16 bit
int cifre_inserite; // contatore delle cifre binbarie effettivamente inserite

cifre_inserite = 0;

do {
printf( "inserisci un numero maggiore o uguale a 0\n");
scanf("%d",&num);
if (num<0)
printf("sai leggere? deve essere maggiore di 0!!!"); }
while(num<0);

printf ("la conversione in binario (scritta correttamente) e': ");

do{
numero_binario[cifre_inserite] = num%2;
cifre_inserite++;
num=num/2;
} while (num!=0);

for(i=cifre_inserite-1; i>=0; i--)
printf("%d", numero_binario[i]);
// una sola riga per il corpo del for, le graffe non servono

}

duonovembre
29-10-2007, 22:05
la tua soluzione non funziona xke' pow vuole un double e pur essendo scritta con un codice + elegante e' meno performante di un while scritto come il mio per due motivi essenziali:

la mia fa esattamente j moltiplicazioni

la tua fa bit volte dei calcoli di potenza ed inoltre le potenze calcolate con pow sono calcoli molto complessi proprio perche' pow e' uno strumento matematico che lavora con i double e prevede di calcolare una potenza del tipo 1,2565^2,3656 con dei teoremi che nn conosco molto bene ma di alta complessita':D

menphisx
29-10-2007, 23:14
Originariamente inviato da Crow©
ciao a tutti ancora qui per questi problemi piccoli piccoli, sono qui pe chiedere come mai non riesco a compilare sto programma, inserendo un numero decimale da tastiera lo deve convertire in binario

avevo provato a fare na cosa del genere

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

int main(void)

{
int n, bit=1;
printf("Inserisci un numero decimale");
scanf("%d", &n);

while (pow(2, bit) < n)
bit++;

printf("%d", bit);
return 0;
}

ma al momento della compilazione mi da questo errore

gio_c/programma.c -o programma
/tmp/cc4brl8h.o: In function `main':
programma.c:(.text+0x4e): undefined reference to `pow'
collect2: ld returned 1 exit status

come mai dove sbaglio, oltre a soluzione del problema, mi potete dire se ci sono altri modi per fare questo esercizio, usando il for o if-else.

p.s. non è consentito usare array
ù
grazie a tutti ciao

In realtà compila, solo che il linker non trova la funzione pow, perchè non hai aggiunto la libreria m alle opzioni del linker. Ricorda che math.h non è una libreria, quindi il linkaggio non è automatico.
Con gcc basta dare:


gcc -o eseguibile sorgente -lm


:ciauz:

MacApp
30-10-2007, 08:10
Originariamente inviato da Crow©
ciao duonovembre e grazie per la risposta, mi sono espresso male non devo invertire un decimale in binario ma devo solo dire quanti bit minimo occorre per rappresentare quel numero, esempio se metto 8 allora mi deve restituire 4 cioè 4bit 1000 che rappresenta 8

Ci sono i logaritmi per risolvere questo genere di problemi:
bit = trunc ((log in base 2 di 8) + 1);



#include <stdio.h>
#include <math.h>
int main(void){
/*
* Compiled and tested with:
* i686-apple-darwin8-gcc-4.0.1 (GCC) 4.0.1 (Apple Computer, Inc. build 5367)
*
* Examples:
* 7 = 111 -> 3 bit
* 8 = 1000 -> 4 bit
*/
int n, bit=0;
printf("Inserisci un numero decimale");
scanf("%d", &n);
if (0 != n){
bit = (int) (1+log (n)/log (2.0));
}
printf("%d", bit);
return 0;
}

duonovembre
30-10-2007, 19:16
risolto?

Loading