giovedì 5 novembre 2009

Convertire un intero in binario metodo 1 (Java)

L'obiettivo di questo esercizio come al solito è lo sviluppo e l'implementazione di un algoritmo che dato un numero intero (int) in base 10 restituisca i 32 rispettivi bit in base 2.

Per la soluzione di questo problema era stato richiesto l'utilizzo dell' operatore & (and tra numeri binari) e dell'operatore <<>> che spostano del numero di "posti" indicato i bit a destra o a sinistra.

L'operatore and controlla ogni bit di un numero con il rispettivo dell'altro numero e restituisce 1 solo se tutti e due i bit dei due numeri sono 1:

Esempio:

dati: x=654364363 e y=500348320 che sono rispettivamente:

x = 00100111 00000000 11001110 11001011
y = 00011101 11010010 10110101 10100000

x & y sara:
c = 00000101 00000000 10000100 10000000

Se come y prendiamo il numero tale che i bit di quel numero siano 0 tranne uno che sia 1 nella posizione interessata, possiamo ricavare il valore del bit di quella posizione tramite la formula

(x & y)/y

Se vogliamo ricavare la cifra di posizione 8 (da dx verso sx)
prendiamo y = 128

y = 00000000 00000000 00000000 10000000

da x & y riotteniamo y così (x & y)/y ci darà "1" (che è il valore dell'ottava cifra!)

Se invece l'ottava cifra di x fosse stata 0, x&y avrebbe restituito 0 (00000000 00000000 00000000 00000000) e (x & y)/y in questo caso sarebbe stato 0 (proprio come l'ottava cifra!)

Dopo ave capito questo procedimento occorre implementare un algoritmo che indichi tramite un ciclo tutte le varie cifre.

Io ho fatto 2 programmi che sono in grado di convertire qualsiasi numero in binario, uno più semplice ma che restituisce un risultato meno immediato come questo ad esempio:

1
1
0
1
0
0
1
1
0
1
1
1
0
0
1
1
0
0
0
0
0
0
0
0
1
1
1
0
0
1
0
0

(la prima cifra dell'elenco è quella che andrà a destra! e non a sinistra)

il codice di questo primo programma è il seguente:

  1. public class Bincon1

  2. {

  3.    public static void main (String[] args)

  4.    {

  5.       int a = 654364363;

  6.       int b = 1;

  7.       int c = 0;

  8.       while (c<32)

  9.       {

  10.          int cifra = ( a & b ) / b;

  11.          b = b << 1;

  12.          c++;

  13.          System.out.println(cifra);

  14.       }

  15.    }

  16. }



L'altro programma un tantino + complicato parte invece da sx e ricava le cifre verso dx (la prima cifra si ricava a parte...) ha il vantaggio di restituire un risultato ordinato e più gradevole!

il codice è:


  1. public class Bincon2

  2. {

  3.    public static void main (String[] args)

  4.    {

  5.       int a = 500348320;

  6.       int b = 1073741824;//01000000 00000000 00000000 00000000

  7.       int c = 31;

  8.       if (a<0)//assegnazione valore prima cifra

  9.          System.out.print("1");

  10.       else

  11.          System.out.print("0");

  12.      

  13.       while (c>0)// stampa delle altre 31 cifre

  14.       {

  15.          int cifra = ( a & b ) / b;

  16.          b = b >> 1;

  17.          c = c -1;

  18.          System.out.print(cifra);

  19.       }

  20.    }

  21. }



Questo programma restituisce un risultato del tipo : 00100111000000001100111011001011
esiste un altro programma che riesce a risolvere questo problema in un modo più classico lo potete trovare in questo post.

Potete trovare tutti i miei programmi quì.

Sviluppo in serie dell'esponenziale e^x (Java)

Questo esercizio consiste nel calcolare il valore di:

e^x=1+x+[(x^2)/2!]+[(x^3)/3!]+[(x^4)/4!]+[(x^5)/5!]+[(x^6)/6!]+....

Sia per ricavare la x^n ho utilizzato una variabile per memorizzare ogni volta il valore di x^n così nel ciclo successivo per calcolarmi x^(n+1) mi è bastato moltiplicare la variabile per x!

similmente ho operato per il fattoriale.. ad esempio una volta calcolato 3!=1*2*3 se si memorizza il valore in una variabile basta poi moltiplicare 3!*4 per ottenere 4!

Leggendo il codice dovrebbe essere più semplice capire il procedimento!

Codice:

public class Neppot
{
public static void main (String[] args)
{
int x = 7;
int xc = x;
int cont = 1;
double somma = 1;
double d = 1.0f; // (denominatore)
while (cont != 13)
{
cont ++;
somma += xc/d;
xc *=x;// preparo xc per il prossimo ciclo
d *= cont;// preparo d per il prossimo ciclo
}
System.out.println("e^" + x + "=" + somma);
}
}


Potete trovare tutti i miei programmi quì.

somma di inversi (Java)

Questo esercizio richiedeva lo sviluppo e l'implementazione in java di un algoritmo che calcolasse dati x ed n un numero del tipo:

somma = 1+(1/x^1)+(1/x^2)+(1/x^3)+(1/x^4)+....+(1/x^n)

ecco come ho risolto il problema:

Codice:

public class Invexp
{
public static void main (String[] args)
{
int x = 4;
int y = 3;
float somma = 0;
int cont = 0;
float xc = 1;
while (cont<=y)
{
somma += 1/xc;
xc*= x;
cont ++;
}
System.out.println(somma);
}
}


Potete trovare tutti i miei programmi quì.

Equazioni di secondo grado (Java)

Questo è stato il secondo programma che ho realizzato, a dire il vero non era un esercizio assegnato dal professore ma è nato da una sfida personale...
Così subito dopo aver fatto il programma per il calcolo del fattoriale ho deciso di provare a combinare un po di if/else e dare vita ad un programma che risolvesse le equazioni di secondo grado!

La particolarità di questo programma sta nel fatto che non si limita a dare la soluzione delle normali equazioni di secondo grado ma riesce a riconoscere le equazione spurie, le pure e riesce a dare i rispettivi risultati!

Dopo 4 lezioni di programmazione sono riuscito a fare un programma davvero carino!



codice:

public class Equdue
{
public static void main (String [] args)
{
float a=1;//valore di a
float b=0;//valore di b
float c=5;//valore di c
float primo=-b;
float secondo=b*b -4*a*c;
//System.out.println("l'equazione di cui vogliamo ottenere le radici e'" + a + "x^2" + b + "x" + c +"=0 e':" );
if (a==0)
System.out.print("Questa non e' un equazione di secondo grado!");
else if (b==0 && 0==c)
System.out.println("L'equazione ammette come unica soluzione x=0");
else if (c==0)
{
float spuria=primo/a;
System.out.print("l'equazione e' spuria ed ammette come risultati: x=0 e x=" + spuria);
}
else if (b==0)
{
double pura=-c/a;
if ( pura<0 )
System.out.println("l'equazione non ammette soluzioni reali poiche -c/a<0");
else
System.out.print("l'equazione e' pura ed ammette come soluzioni +o- radice quadrata di " + pura);
}
else if(secondo<0)
System.out.print("L'equazione non ammette soluzioni reali");
else
{
float terzo=a*2;
System.out.println("l'equazione ammette come risultato:\n" + primo + " +- radice quadrata di " + secondo + "\n--------------------------------------------------" + "\n" + terzo );
}
}
}


Potete trovare tutti i miei programmi quì.

Fattoriale (Java)

Questo è stato il primo programma che ho sviluppato di mio pugno.
Non è nient'altro che un programma che calcoli il fattoriale di un numero. "n!" per intenderci!

eccovi il codice:

public class Fattoriale1
{
public static void main (String[] args)
{ int valore=6;
int fattoriale=valore;
final int A=valore;
if (valore==0)
System.out.println("il fattoriale di 0 e' 1" );
else
{
while (valore!=2)
{
valore=valore-1;
fattoriale=fattoriale*valore;
}
System.out.println("il fattoriale del valore " + A + " e' " + fattoriale);
}
System.out.println("fine");
}
}


Potete trovare tutti i miei programmi quì.

I miei programmini (Java)



Forse non vi ho ancora detto che sono una matricola! Ebbene frequento il c.d.l. in Informatica della facoltà di scienze matematiche, fisiche e naturali dell'università di Catania!

Attualmente tra le varie materie di matematica ed informatica, sono alle prese con "programmazione 1" dove stiamo imparando (nel caso di quelli come me che non hanno mai fatto programmazione alle scuole superiori) a programmare in Java.

Sono davvero entusiasta di questo corso! Anche perché come dice il mio professore per questa materia ci vuole tanta pratica e poca teoria!

Nonostante non abbia mai fatto programmazione alle scuole superiori devo ammettere che me la sto cavando egregiamente. Fino a questo momento non ho trovato difficoltà, da subito ho iniziato a programmare ottenendo risultati positivi!

Così da questo momento fino a quando avrò da fare esercizi semplici e relativamente brevi da poter essere postati,(di quelli assegnati per far prender confidenza agli studenti con la programmazione) posterò le mie soluzioni ai vari quesiti!

Naturalmente sono alle prime armi ed ancora non conosco tutta la sintassi di java, quindi gli algoritmi che ho sviluppato non sono i migliori!(spesso potrebbero essere snelliti utilizzando delle librerie! Ma lo scopo di questi esercizi è quello di fare pratica con cicli etc...)
Non vi garantisco nemmeno la correttezza della semantica proprio per i motivi sopra elencati!

Penso che per chi inizi a programmare fare i programmi che sto realizzando io e poi confrontarli con il mio è un ottimo modo per imparare velocemente e migliorarsi!

Se trovate errori segnalarmeli tranquillamente, ve ne sarò grato!

Adesso passiamo al primo programma che non può essere lasciato fuori ma che non merita un post tutto per se!

Signori e signore eccovi l'immancabile "hello world!"


public class Helloworld
{
public static void main (String[] args)
{
System.out.println("hello world!");
}
}


Potete trovare tutti i programmi quì.

lunedì 2 novembre 2009

Scusi dov'è il (bagno?) BAR? (Parte 2)

Evviva non sono pazzo e non soffro di allucinazioni!Oggi dando uno sguardo al contatore delle mie visite ho visto che qualcuno ha raggiunto il mio sito inserendo le parole "fletcher scusi dov'è il"
Allora mi sono detto.. "vuoi vedere che veramente esiste questa frase misteriosa?"

Così mi sono rivolto al caro Google!
È proprio vero la frase esiste! Ho commesso solo un piccolissimo errore! non è "Scusi dov'è il bagno?" ma "Scusi dov'è il BAR?"

Davvero curioso! Proverò a scoprire qualcosa e vi farò sapere se scoprirò qualcosa di interessante!