1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
#include <stdio.h> #include <math.h> int main () { int x=1,z,a; /* Dichiarazione delle variabili n=numero da inserire,x= potenza,z=valore sentinella*/ float n; printf("Vuoi inserire un valore? ( 1=si 0=no)\n"); scanf("%d",&z); while(z!=0)/* Iterazione e condizione necessaria per far ciclare fino a quando vuole l'utente */ { printf("Inserisci un valore intero:\n"); scanf("%f",&n); if(n!=(int)n) printf("Attenzione,devi inserire un valore intero:\n"); else { for(x=1;pow(2,x)-1<n;x++)/* Calcolo dei bit con la foruma 2^n-1 */ ;/* Istruzione vuota */ a=n; printf("Il numero di bit necessari per rappresentare il valore %d e' %d\n\n",a,x);/* Stampa del risultato */ printf("Vuoi inserire un valore? ( 1=si 0=no)\n"); scanf("%d",&z); }}/* Chiusura del ciclo while */ return 0; }
Refactorings
No refactoring yet !
Vime
February 20, 2008, February 20, 2008 07:49, permalink
You want to check the number of bit used to rapresent an integer value.
1. You can use int variable, not float
2. Check the return value of scanf
3. Better use of while cycles
4. Use of another method that does not use pow function (slow!)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
#include <stdio.h> int main () { int x,z,a; /* Dichiarazione delle variabili n=numero da inserire,x= potenza,z=valore sentinella*/ int n; while( 1 ) { printf("Vuoi inserire un valore? ( 1=si 0=no )\n"); if ( scanf("%d",&z) != 1 ) continue; if (z == 0) break; printf("Inserisci un valore intero:\n"); while ( scanf("%d",&n) != 1 ) { printf("Attenzione,devi inserire un valore intero:\n"); } for ( a=n, x=1; a > 1; x++, a/=2 ); printf("Il numero di bit necessari per rappresentare il valore %d e' %d\n\n",n,x);/* Stampa del risultato */ }/* Chiusura del ciclo while */ return 0; }
Eineki
February 20, 2008, February 20, 2008 22:35, permalink
it:Il numero di cifre necessarie a memorizzare un numero n in una base b è l'arrotondamento
per eccesso del logaritmo in base b del numero.
Il logaritmo in base b di un numero n è uguale a log(n)/log(b). Considerando che 1/log(b)
è una costante basta calcolarla la prima volta per usarla quante volte si vuole.
en: We need "the base b logarithm of n" digits to represent a number n in a base b (rounded up).
The base b logarithm of a number n is ln(n)/ln(b) (where ln stand for natural logarithm).
1/ln(b) is costant for a choosen base and we can precalculate it.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
#include <math.h> #define BASE 2 int main () { double logBase = 1/log(BASE); while( 1 ) { printf("Vuoi inserire un valore? ( 1=si 0=no )\n"); if ( scanf("%d",&z) != 1 ) continue; if (z == 0) break; printf("Inserisci un valore intero:\n"); while ( scanf("%d",&n) != 1 ) { printf("Attenzione,devi inserire un valore intero:\n"); } printf("Il numero di bit necessari per rappresentare il valore %d e' %f\n\n",n,ceil(log(n)*logBase));/* Stampa del risultato */ }/* Chiusura del ciclo while */ return 0; }
Dato un intero,determinare quanti bit servono per rappresentarlo