In questa pagina verranno raccolti i sorgenti scritti in classe durante le esercitazioni del venerdì svolte da Gabriele. Il wiki è aperto ed è possibile modificare direttamente il testo. Nel caso in cui, invece, si avessero problemi a scaricare i file nella tabella (link inesistente/file corrotto/sorgente scorretto etc..) scrivetemi a giovanni.lombi@studenti.unimi.it e provvederò alle modifiche il prima possibile (per evitare che la mail sia gettata tra gli spam è preferibile anteporre UNIMI al testo dell'oggetto). Enjoy!
Thank's to:
Alessandro Marelli per avermi fornito i primi codici scritti a lezione che non erano in mio possesso.
Gabriele per la sua chiarezza e bravura.
| Sorgenti .java | Consegne .txt |
|---|---|
| Ubriaco | Ubriaco |
| Primi gemelli | Primi gemelli |
| Ordinamento numeri | |
| Frattale | |
Un ubriaco cammina su una griglia quadrata di lato L dato in input. Parte dalla posizione (1,1) e vuole arrivara a casa, ovvero in posizione (L/2,L/2). Dato il numero di test N da effettuare calcolare il tempo medio di arrivo (in numero di passi) ipotizzando che gli spostamenti possano avvenire in orizzontale, verticale o diagonale, e che l'ubriaco “strisci” sui bordi se ci va a sbattere (cioè non esce dalla griglia).
import prog.io.*;
import java.util.Random;
public class Ubriaco {
public static void main(String[] args) {
// Le console:
ConsoleInputManager in = new ConsoleInputManager();
ConsoleOutputManager out = new ConsoleOutputManager();
// Variabili:
int N, L, x, y, dx, dy, x1, y1, nPassi, i, totPassi = 0;
Random rand = new Random();
// Leggo l'input:
do {
out.println("Inserire N>=1:");
N = in.readInt();
} while (N<1);
do {
out.println("Inserire L>=1:");
L = in.readInt();
} while (L<1);
// Effettuo N simulazioni:
for (i=0; i<N; i++) {
// Inizio simulazione:
x = 1; y = 1;
// Ripeto gli spostamenti:
nPassi = 0;
while (x!=L/2 || y!=L/2) {
// Ripeto finchè non mi sposto veramente:
do {
// Passo di spostamento casuale:
dx = rand.nextInt(3) - 1;
dy = rand.nextInt(3) - 1;
// Mi sposto (per finta):
x1 = x + dx;
y1 = y + dy;
// Controllo di non essere fuori dalla griglia:
if (x1<1) x1 = 1;
if (x1>L) x1 = L;
if (y1<1) y1 = 1;
if (y1>L) y1 = L;
} while (x1==x && y1==y);
// Mi sposto veramente:
x = x1;
y = y1;
nPassi++;
// Dico dove sono:
// out.println(x+","+y);
} // ciclo di una simulazione
// Visualizzo il numero di passi:
out.println("N° passi: " + nPassi);
// Accumulo il totale passi:
totPassi += nPassi;
} // ciclo sulle simulazioni
// Visualizzo la media:
out.println("Media passi: " + (double)totPassi/N);
} // main
}
Dato un numero intero positivo N>2, si determinino le coppie di numeri primi gemelli compresi tra 2 e N. Si ricorda che i numeri primi sono divisibili solo per 1 e sé stessi e che due numeri primi sono gemelli se la loro distanza é 2.
import prog.io.*;
public class Primi {
public static void main(String args[]) {
// Dichiaro le console:
ConsoleInputManager in = new ConsoleInputManager();
ConsoleOutputManager out = new ConsoleOutputManager();
// Mi faccio fornire un numero:
int N, i, j, primoPrecedente = -1;
boolean numeroPrimo;
do {
out.println("Inserire N intero e >2: ");
N = in.readInt();
} while(N<=2);
// Itero con i tra 2 e N:
for (i=2; i<=N; i++) {
// Controllo se i contiene un numero primo:
// Itero tra 2 e i-1:
numeroPrimo = true;
for (j=2; j<i; j++) {
// Test di divisibilità:
if (i%j==0) {
// Non è primo:
numeroPrimo = false;
break;
}
} // for di test di primalità
// Solo sui numeri primi:
if (numeroPrimo) {
// Controllo se ho dei primi gemelli:
if (i-primoPrecedente==2) {
// Visualizzo:
out.println(primoPrecedente+" "+i);
}
// Aggiorno il primo precedente:
primoPrecedente = i;
}
} // for sui primi
}
}
Scrivere un programma che ordini N numeri inseriti dall'utente in ordine crescente.
import prog.io.*;
class Ordina {
public static void main(String[] args) {
// Le console:
ConsoleInputManager in = new ConsoleInputManager();
ConsoleOutputManager out = new ConsoleOutputManager();
// Variabili:
int A[] = new int[10], i, j, tmp, nScambi;
// Acquisisco:
for (i=0; i<A.length; i++) {
// Acquisisto e salvo in A[i]:
A[i] = in.readInt("Inserisci il "+i+"o numero: ");
}
// Ordino:
for (i=0;i<A.length; i++) { // Itero N volte:
// Inizializzo:
nScambi = 0;
// Sposto la "mollettina dei confronti":
for (j=0; j<A.length-1-i; j++) {
// Controllo se devo scambiare:
if (A[j+1]<A[j]) {
// Scambio:
tmp = A[j];
A[j] = A[j+1];
A[j+1] = tmp;
// Me ne ricordo:
nScambi++;
} // if
} // ciclo sulla molletta
// Se ho finito esco:
if (nScambi==0) break;
} // N iterazioni
// Visualizzo:
for (i=0; i<A.length; i++) {
out.print(A[i] + " ");
}
out.println();
}
}
Scrivere un programma che generi un frattale.
import prog.io.*;
public class Mandel {
public static void main(String[] args) {
// Le console:
ConsoleInputManager in = new ConsoleInputManager();
ConsoleOutputManager out = new ConsoleOutputManager();
// Parametri:
int NR = 40, NC = 80, R, C, maxIters=100, numIters, colore;
double minX = -1.5, maxX = 0.5, minY = -1, maxY = 1,
x, y, xs, ys, xt, yt;
// La palette:
char[] palette = new char[] {'@','#','&','/','.',' '};
// Itero sulle righe:
for (R=0; R<NR; R++) {
// Visualizzo i caratteri di una riga:
for (C=0; C<NC; C++) {
// Calcolo le coordinate:
x = C*(maxX-minX)/NC + minX;
y = R*(maxY-minY)/NR + minY;
// Calcolo il colore:
xs = x; ys = y;
// Itero l'aggiornamento:
numIters = 0;
while (Math.sqrt(xs*xs+ys*ys)<2.0 && numIters<maxIters) {
// Calcolo (nelle temporanee):
xt = xs*xs-ys*ys+x;
yt = 2*xs*ys+y;
// Aggiorno:
xs = xt; ys = yt;
numIters++;
}
// Calcolo l'indice del colore che mi interessa:
colore = palette.length*numIters/(maxIters+1);
// Visualizzo:
out.print(palette[colore]);
}
// Vado a capo:
out.println();
}
}
}