D8e099f752011ec60e809a733ef32a7e

Dato un intero,determinare quanti bit servono per rappresentarlo

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 !

90ec841f866ac35c4ce90ee3cfffbdc3

Vime

February 20, 2008, February 20, 2008 07:49, permalink

No rating. Login to rate!

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;
}
5a00a3a98dcf6f9cd717440fd2b606e5

Eineki

February 20, 2008, February 20, 2008 22:35, permalink

No rating. Login to rate!

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;
}

Your refactoring





Format Copy from initial code

or Cancel