|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Member
Iscritto dal: Oct 2001
Messaggi: 56
|
Conversione Dec-Bin
Ciao raga! Ho un problema con un programmino che converte i numeri interi decimali in codice binario:
#include <stdio.h> #define DIM 16 main() { int i; int vet[DIM]; int dec=0; printf("------BENVENUTO NEL PROGRAMMA DI CONVERSIONE DEC-BIN------\n\n"); printf("Inserisci il valore decimale: "); scanf("%d",&dec); printf("\n"); for (i=0;i<DIM;i++) { vet[DIM-16+i]=dec%2; dec=dec/2; printf("%d ",vet[DIM-16+i]); } printf("\n"); scanf(" "); } Questo codice mi stampa le cifre da sinistra verso destra. Pero risulta poco comprensibile, perche i numeri binari si leggono da destra verso sinistra. #include <stdio.h> #define DIM 16 main() { int i; int vet[DIM]; int dec=0; printf("------BENVENUTO NEL PROGRAMMA DI CONVERSIONE DEC-BIN------\n\n"); printf("Inserisci il valore decimale: "); scanf("%d",&dec); printf("\n"); for (i=0;i<DIM;i++) { vet[DIM-1-i]=dec%2; dec=dec/2; printf("%d ",vet[DIM-1-i]); } printf("\n"); scanf(" "); } Quest'altro invece "dovrebbe" stamparmi i numeri da destra verso sinistra come voglio io...pero me li stampa esattamente uguali come il codice di prima. Questo è strano perche nel primo ciclo For la prima posizione dell'array è: vet[16-16+0]---> posizione 0 Nel secondo ciclo For la prima posizione è: vet[16-1-0] ----> posizione 15 Aiuto pls ![]() |
![]() |
![]() |
![]() |
#2 |
Member
Iscritto dal: Oct 2001
Messaggi: 56
|
Nessuno sa dirmi nulla?
![]() |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
La soluzione e' semplice: il salvataggio della sequenza binaria viene fatto al contrario, e tu stampi il numero mentre converti, quindi lo stampi al contrario. Fai cosi': prendi il secondo esempio, dichiara "vet" come char[], e non come int[], lascia tutto com'e', ma sposta "printf("%d ",vet[DIM-16+i]); " fuori dal ciclo for, cambiandolo in "printf(vet); ".
bye!
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
![]() |
![]() |
![]() |
#4 |
Member
Iscritto dal: Oct 2001
Messaggi: 56
|
Quindi la variabile vet la devo dichiarare cosi?
char vet[DIM]; .... .... .... printf(vet); EDIT: Ho provato a fare quello che ho scritto qui sopra....non mi fa nulla. Inserisco il numero decimale...premo enter ma non mi visualizza nessun risultato. Ultima modifica di Steve85 : 09-10-2004 alle 19:20. |
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Apr 2003
Città: Genova
Messaggi: 673
|
se vuoi ho qui il programma che stiamo commentando al corso di fondamenti.
http://www.laser.dist.unige.it/Repos...Esercitazioni/ scarica binlib. fammi sapere |
![]() |
![]() |
![]() |
#6 |
Member
Iscritto dal: Oct 2001
Messaggi: 56
|
Ho scaricato il programmino...pero non me lo compila.
Ho messo nella directory assieme a bin.cpp e bin.h anche il file stdlib.h (preso dalla directory del programma che uso per compilare). Mi da questo errore: [Linker error] undefined reference to `WinMain@16' Cmq nessuno sa come posso modificare il mio programmino? |
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Jun 2002
Città:
Provincia De VaRéSe ~ § ~ Lat.: 45° 51' 7" N Long.: 8° 50' 21" E ~§~ Magica Inter ~ § ~ Detto: A Chi Più Amiamo Meno Dire Sappiamo ~ § ~ ~ § ~ Hobby: Divertimento allo Stato Puro ~ § ~ ~ § ~ You Must Go Out ~ § ~
Messaggi: 8895
|
Codice PHP:
![]() avrei voluto mettere gli elementi in una singola variabile ma non ne ho la + pallida idea di come fare :P ... forse con lo shift si può fare ![]() ~§~ Sempre E Solo Lei ~§~
__________________
Meglio essere protagonisti della propria tragedia che spettatori della propria vita
Si dovrebbe pensare più a far bene che a stare bene: e così si finirebbe anche a star meglio. Non preoccuparti solo di essere migliore dei tuoi contemporanei o dei tuoi predecessori.Cerca solo di essere migliore di te stesso |
![]() |
![]() |
![]() |
#8 |
Member
Iscritto dal: Oct 2001
Messaggi: 56
|
Cosi mi funzia...invece! Pero non capisco perche devo stampare vet[i] e non vet[DIM-1-i]. Mah
![]() #include <stdio.h> #define DIM 16 main() { int i; int vet[DIM]; int dec=0; printf("------BENVENUTO NEL PROGRAMMA DI CONVERSIONE DEC-BIN------\n\n"); printf("Inserisci il valore decimale: "); scanf("%d",&dec); printf("\n"); for (i=0;i<DIM;i++) { vet[DIM-1-i]=dec%2; dec=dec/2; } for (i=0;i<DIM;i++) printf("%d ",vet[i]); printf("\n"); scanf(" "); } |
![]() |
![]() |
![]() |
#9 |
Bannato
Iscritto dal: Feb 2003
Messaggi: 947
|
Ultima modifica di repne scasb : 03-02-2005 alle 14:50. |
![]() |
![]() |
![]() |
#10 |
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Bene, visto che tutti hanno postato il proprio codice, un'altro giorno vi posto il mio elegantissimo codice
![]()
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
![]() |
![]() |
![]() |
#11 |
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Ecco il mio codice:
Codice:
#include <stdio.h> #define MAX 16 #define bt(v,b) (((unsigned long) v & (1 << ((unsigned char) b - 1))) > 0) int main() { char * buffer; char num = 123; char j = 0; for (j = 0; j < MAX; j++) { buffer[MAX - j - 1] = ('0' + bt(num, j)); } buffer[MAX - 1] = 0; printf("%s\n", buffer); return 0; }
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
![]() |
![]() |
![]() |
#12 | |
Senior Member
Iscritto dal: Jun 2002
Città:
Provincia De VaRéSe ~ § ~ Lat.: 45° 51' 7" N Long.: 8° 50' 21" E ~§~ Magica Inter ~ § ~ Detto: A Chi Più Amiamo Meno Dire Sappiamo ~ § ~ ~ § ~ Hobby: Divertimento allo Stato Puro ~ § ~ ~ § ~ You Must Go Out ~ § ~
Messaggi: 8895
|
Quote:
![]() ![]() ~§~ Sempre E Solo Lei ~§~
__________________
Meglio essere protagonisti della propria tragedia che spettatori della propria vita
Si dovrebbe pensare più a far bene che a stare bene: e così si finirebbe anche a star meglio. Non preoccuparti solo di essere migliore dei tuoi contemporanei o dei tuoi predecessori.Cerca solo di essere migliore di te stesso |
|
![]() |
![]() |
![]() |
#13 |
Bannato
Iscritto dal: Feb 2003
Messaggi: 947
|
Ultima modifica di repne scasb : 03-02-2005 alle 14:49. |
![]() |
![]() |
![]() |
#14 |
Bannato
Iscritto dal: Feb 2003
Messaggi: 947
|
Ultima modifica di repne scasb : 03-02-2005 alle 14:48. |
![]() |
![]() |
![]() |
#15 | |
Senior Member
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
|
Quote:
![]() Non e' codice migliore e piu' leggibile scritto cosi'? Codice:
--i; } while (i >= 0);
__________________
"We in the game industry are lucky enough to be able to create our visions" @ NVIDIA Ultima modifica di fek : 11-10-2004 alle 20:29. |
|
![]() |
![]() |
![]() |
#16 |
Bannato
Iscritto dal: Feb 2003
Messaggi: 947
|
Ultima modifica di repne scasb : 03-02-2005 alle 14:48. |
![]() |
![]() |
![]() |
#17 | |||
Senior Member
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
|
Quote:
Fermo restando che le definizioni che hai dato dopo sono ottime. Quote:
Il problema qui era la conversione da decimale a binario di un numero solo (non di un milione ad esempio, cosa che sarebbe stata decisamente diversa). Ho anche letto il manuale da te riportato. La tua sequenza risparmia (a seconda del processore) dai 4 ai 10 colpi di clock in totale su tutta l'esecuzione del programma. Considerando che alla fine del programma riportato c'e' una printf che da sola usa almeno qualche decina di migliaia di colpi di clock, i 10 colpi di clock risparmiati rappresentano meno di una parta su mille. Ovvero un risparmio del tutto trascurabile su una sola esecuzione del programma. Anche immaginando un milione di esecuzioni, sarebbe stato enormemente piu' vantaggioso andare ad ottimizzare l'output con una funzione diversa dalla printf piuttosto che quei 10 colpi di clock sulla fine del ciclo. Infine, quei 10 colpi di clock non arrivano gratuitamente, ma impongono una minore leggibilita' del codice, ed un maggior lavoro da parte di chi quel codice dovra' leggerlo e magari mantenerlo in futuro. Qual e' la risorsa piu' scarsa? Il tempo cpu o il tempo del programmatore? La seconda e per la seconda si deve ottimizzare, quindi, se devo scegliere se aiutare il compilatore o aiutare chi legge il mio codice, scelgo senza ombra di dubbio la seconda, a meno che dal profiling scopro che il codice che sto scrivendo e' un collo di bottiglia della mia applicazione. In questo caso, e solo in questo, e solo dopo che non sono riuscito ad ottimizzare algoritmicamente alloracerchero' di aiutare il compilatore salvo commentando in maniera diffusa le linee di codice che non sono chiare, magari aggiungendo una versione in codice o pseudo codice piu' leggibile. Quote:
In sintesi, una versione del codice piu' leggibile e' preferibile nel 99% dei casi, salvo i casi dove e' richiesta un'ottimizzazione spinta del codice. Quello riportato in questo topic non mi sembra uno di questi casi.
__________________
"We in the game industry are lucky enough to be able to create our visions" @ NVIDIA |
|||
![]() |
![]() |
![]() |
#18 |
Senior Member
Iscritto dal: Apr 2003
Città: Genova
Messaggi: 673
|
Codice PHP:
vi ringrazio in anticippo |
![]() |
![]() |
![]() |
#19 | |
Senior Member
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
|
Quote:
Codice:
char* str = bin; bool firstOneFound = false; for ( i = lenght; i >= 0; --i) { value = input % 2; if (0 == value) { if (firstOneFound) { *str++= '0'; } } else { firstOneFound = true; *str++ = '1'; } input = input / 2; } length = str - bin; *str++ = EOS; Non e' banale da risolvere, ma puoi seguire un paio di strade: 1) Usi la classe std::string e la restituisci per valore e non per reference; e' comodo da usare, risolve elegantemente il problema ma abusare della classe std::string puo' peggiorare notevolmente le prestazioni se non stai attento (non e' il tuo caso in questo esempio) 2) Passi esplicitamente alla funzione un blocco di memoria da riempire e la sua lunghezza, se ti servono piu' caratteri di quelli disponibili restituisci un errore; in genere e' il metodo preferibile. Come regola generale non allocare mai memoria dentro una funzione per poi restituire il blocco allocato all'esterno: chi alloca una risorsa (metodo o classe) deve sempre occuparsi di liberare la risorsa. La seconda tecnica che ti ho suggerito segue questo principio.
__________________
"We in the game industry are lucky enough to be able to create our visions" @ NVIDIA Ultima modifica di fek : 11-10-2004 alle 23:32. |
|
![]() |
![]() |
![]() |
#20 |
Bannato
Iscritto dal: Feb 2003
Messaggi: 947
|
Ultima modifica di repne scasb : 03-02-2005 alle 14:47. |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 03:32.