|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Junior Member
Iscritto dal: Sep 2006
Messaggi: 5
|
aiuto per un compito convertitore decimale binario 8bit (da 0 a 255)
Salve a tutti io ho un problema a scuola abbiamo iniziato a fare programmazione con CVI vorrei sapere che funzione devo utilizzare per dirgli quale numero far uscire qui di seguito vi metto un esempio con il programma che ho fatto ma che non è completo:
/* Dato un numero decimale da 0 a 255 calcolare il corrispondente numero binario */ #include <userint.h> #include <ansi_c.h> void main(void) //inizio del programma { double decimale; //dati utente double bit1,bit2,bit3,bit4,bit5,bit6,bit7,bit8; // dati da calcolare char dati[1500]; //immissione dei dati PromptPopup ("immissione del numero decimale","inserisci un numero da 0 a 255",dati,3); decimale = atof(dati); //elaborazione dati bit8=decimale/2.0; bit7=bit8/2.0; bit6=bit7/2.0; bit5=bit6/2.0; bit4=bit5/2.0; bit3=bit4/2.0; bit2=bit3/2.0; bit1=bit2/2.0; //emissione del risultato sprintf(dati,"numero decimale:\n" "%.3f\n\n" "numero binario:\n" "%.3f %.3f %.3f %.3f %.3f %.3f %.3f %.3f %.3f %.3f",decimale,bit8,bit7,bit6,bit5,bit4,bit3,bit2,bit1); MessagePopup ("risultato",dati); } nella parte dell'elaborazione dati come posso far per far tenere alla variabile solo un valore 1 se il risultato della divisione da un numero con la virgola, e uno 0 se non c'è la virgola? grazie mille in anticipo Ultima modifica di gerigot2 : 19-09-2006 alle 21:39. |
|
|
|
|
|
#2 |
|
Member
Iscritto dal: Jan 2006
Messaggi: 92
|
unpò troppo macchinoso come metodo per cambiare di base un numero!!!
Quando devo convertire un decimale in binario, devi dividere per due e poi prendere il resto della divisione.!. 18/2 = 9 | 0 9 /2 = 4 | 1 4 /2 = 2 | 0 2 / 2 = 1 | 0 1 ***** |1 ricostruendo il numero dal basso verso l'alto.!. 18 = 10010 Esiste l'operatore mod " % " che restituisce il resto di una divisione.!. poi secondo me è molto meglio creare il risultato inserendo i vari resti in una stringa! e poi invertirla prima di ritornarla.!.
__________________
L'unico computer sicuro è un computer spento!!! |
|
|
|
|
|
#3 |
|
Junior Member
Iscritto dal: Sep 2006
Messaggi: 5
|
ah grazie come si utilizza il % perchè il nostro professore ci ha chiesto questo compito ma noi non abbiamo mai utilizzato il %
grazie mille ancora |
|
|
|
|
|
#4 |
|
Member
Iscritto dal: Jan 2006
Messaggi: 92
|
ritorna il resto della divisione... è un semplice operatore.!.
per esemio 5/2 -> quoziente = 2, resto = 1; ecco, facendo 5%2 otterrai 1... Cioè ritorna il resto della divisione se al posto del % ci fosse /... per esempio in questo modo puoi anche controllare se un numero è pari ... Codice:
if((x%2)==0) //è pari else //è dispari Ciao
__________________
L'unico computer sicuro è un computer spento!!! |
|
|
|
|
|
#5 |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
da base 10 a base 2, ho capito bene? io l'algoritmo lo farei così:
Codice:
#include <stdlib.h>
#include <stdio.h>
int main() {
int Correct = 0;
int Number;
while (!Correct) {
printf("Inserire numero (0, 255): ");
if (scanf("%d", &Number) == 1) {
Correct = (Number >= 0) && (Number <= 255);
}
}
while (Number) {
printf("%d", Number % 2);
Number /= 2;
}
printf("\n");
return 0;
}
|
|
|
|
|
|
#6 |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
a proposito, l'algoritmo che ti ho scritto può convertire in qualsiasi altra base fino alla 10, basta che nel secondo while cambi il 2 col numero della base.
EDIT: ehm, però ora che ci guardo c'è un errore ![]() scrive le cifre al contrario -.-' EDIT2: LOL, e c'è anche un altro errore gestisce male lo zero ^^ Ultima modifica di 71104 : 20-09-2006 alle 11:20. |
|
|
|
|
|
#7 |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
corretto, va' :P
Codice:
#include <stdlib.h>
#include <stdio.h>
int main() {
int Correct = 0;
int Number;
char Buffer[9];
int Index;
while (!Correct) {
printf("Inserire numero (0, 255): ");
if (scanf("%d", &Number) == 1) {
Correct = (Number >= 0) && (Number <= 255);
}
}
for (Index = 7; Index >= 0; Index--) {
Buffer[Index] = (Number % 2) + '0';
Number /= 2;
}
Buffer[8] = 0;
printf("%s\n", Buffer);
return 0;
}
|
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Jul 2002
Messaggi: 4334
|
Sicuro di dover convertire un numero in virgola mobile?
Comunque in C esistono operatori che agiscono sui bit, in poche parole shift una cifra (binaria) alla volta: num >> pos; poi fai un AND con 1: int cifra = ( num >> pos ) & 1 if( cifra == 1 ) ... else ... non ho provato, ma io lo imposterei cosi'.
__________________
|Java Base| |
|
|
|
|
|
#9 | |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
|
|
|
|
|
|
|
#10 |
|
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
ma gli array e cicli non ve li ha spiegati il vostro prof ???
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve |
|
|
|
|
|
#11 |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
È sufficiente usare shift e and.
Codice:
int numero;
int m;
.... input del numero ....
for (m=128; m!=0; m>>=1)
printf (numero & m ? "1" : "0");
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
#12 |
|
Member
Iscritto dal: Jan 2006
Messaggi: 92
|
se non spieghi strutture condizionali, cicli ed array, soprattutto in C... .... ....
.... Eh si, pensandoci bene potresti fare solamente il famigerato "Hello World!"... Ricordo un mio collega che era euforico quando è riuscito a scriverne il codice sorgente senza un errore.!. ah ah ah ah ah ah ... Quante risate che mi sono fatto!!!!
__________________
L'unico computer sicuro è un computer spento!!! |
|
|
|
|
|
#13 |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
In effetti bastano degli shift e qualche and, quando torno a casa (se me ne ricordo
) magari metto un po' di codice qui, l'avevo fatto in passato e funzionava bene (71104, è anche in CAOS questo codice
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
#14 |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
E se uno volesse stampare il valore binario senza gli zeri non significativi, basta avere una ulteriore variabile int f; e poi fare:
Codice:
for (m=128,f=0; m!=0; m>>=1)
printf ((f |= numero & m | m == 1) ? numero & m ? "1" : "0" : "");
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
#15 | |
|
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
Quote:
Ti sei laureato in binariologia ?
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve |
|
|
|
|
|
|
#16 |
|
Junior Member
Iscritto dal: Sep 2006
Messaggi: 5
|
Ce l'ho fatta ma il programma alla fine quando elabora da ancora un problema adesso vi mostro quello che ho fatto:
/* Dato un numero decimale da 0 a 255 calcolare il corrispondente numero binario */ #include <userint.h> #include <ansi_c.h> #include <math.h> void main(void) //inizio del programma { int decimale; //dati utente int bit1,bit2,bit3,bit4,bit5,bit6,bit7,bit8; // dati da calcolare int bit01,bit02,bit03,bit04,bit05,bit06,bit07,bit08; // per fare i calcoli char dati[1500]; //immissione dei dati PromptPopup ("immissione del numero decimale","inserisci un numero da 0 a 255",dati,3); decimale = atoi(dati); //elaborazione dati bit8=decimale%2; bit08=decimale/2; bit7=bit08%2; bit07=bit08/2; bit6=bit07%2; bit06=bit07/2; bit5=bit06%2; bit05=bit06/2; bit4=bit05%2; bit04=bit05/2; bit3=bit04%2; bit03=bit04/2; bit2=bit03%2; bit02=bit03/2; bit1=bit02%2; bit01=bit02/2; //emissione del risultato sprintf (dati,"numero decimale:\n" "%d\n\n" "numero binario:\n" "%d %d %d %d %d %d %d %d %d %d\n\n" ,decimale,bit1,bit2,bit3,bit4,bit5,bit6,bit7,bit8,); MessagePopup ("risultato",dati); } lo so che è lungo, è un casino e in piu da un errore ma alla fine il risultato esce. ihih se riuscite a dirmi che errore c'è...il programma mi sottolinea questa parte qui e mi dice : NON-FATAL RUN-TIME ERROR: "decimale binario.c", line 68, col 1, thread id 0x00000E44: Not enough parameters or invalid parameter type. sprintf (dati,"numero decimale:\n" "%d\n\n" "numero binario:\n" "%d %d %d %d %d %d %d %d %d %d\n\n" ,decimale,bit1,bit2,bit3,bit4,bit5,bit6,bit7,bit8,); MessagePopup ("risultato",dati); Ultima modifica di gerigot2 : 20-09-2006 alle 20:08. |
|
|
|
|
|
#17 | |
|
Senior Member
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
|
Quote:
A parte il fatto che per la atoi bisognerebbe in teoria includere <stdlib.h> (anche se magari su qualche compilatore, potrebbe bastare math.h, ma questo non lo so) e che per la sprintf bisognerebbe includere <stdio.h>. A parte il fatto che hai usato funzioni specifiche (che non conosco) per l'interazione con l'utente come PromptPopup e MessagePopup. A parte tutto questo .... dovresti contare quanti %d hai messo rispetto ai parametri realmente passati!!!! Già perché ne hai messi di più. Dopo tutto questo ... impara i cicli for .... per favore! Mi viene male a vedere tutte quelle divisioni.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%) |
|
|
|
|
|
|
#18 |
|
Junior Member
Iscritto dal: Sep 2006
Messaggi: 5
|
cmq adesso il programma funzione e non so neanche io il perche ma nel mio compilatore funziona tutto anche senza quelle due librerie. grazie mille Ultima modifica di gerigot2 : 20-09-2006 alle 21:20. |
|
|
|
|
|
#19 | |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
e nel riscriverlo ha messo due %d di troppo; cosa che se avesse fatto nel programma originario se ne sarebbe accorto subito a runtime visto che agli ultimi due %d verrebbero stampati valori arbitrari dallo stack (rispettivamente il return address e il frame pointer se ho fatto bene i conti). |
|
|
|
|
|
|
#20 | |
|
Senior Member
Iscritto dal: May 2006
Città: Wursteland
Messaggi: 1749
|
Quote:
__________________
Nintendo WIII 4d Turbo Intercooler - Sestium X 666 99,312 GHz - 6.984 Ram Σ(9999) MHz - HDD SATA 97e^(10) bytes 93³ rpm - ATI biberon X900z ∞Mb - Win Eight SP (1 > yours) 16 Valve |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 18:37.












|
) magari metto un po' di codice qui, l'avevo fatto in passato e funzionava bene (71104, è anche in CAOS questo codice








