Diagrammi di flusso..da dove cominciare? ._.

Passo successivo: vettori


cosa stampa in uscite in seguente programma se viene fornito il valore 3?

import java.util.*;

public class Prova{

public static void main(String[] args) {
float[] vet = new float [10] // dichiaro e inizializzo un vettore di 10 celle
int b,i;
System.out.println("inserire un numero intero: ");
Scanner sc = new Scanner(System.in);
vet[0] = (float) 1,5; // il valore della cella [0] è 1,5
b=sc.nextInt();

for (i=2;i<10;i=i+2) { // partendo da i=2, se i < 10 entro nel for..ma da qui in poi mi perdo
vet [i]=vet [i-2] * b;

}
System.out.println("Ora stampo");
for (i=0;i<10;i=i+1) {
System.out.println("il valore " + i + " vale " +vet[i]);
}
}
}


La stampa sarà:


Inserire un numero intero:
Ora stampo
il valore 0 vale 1,5
il valore 1 vale 0.0
il valore 2 vale 4,5
il valore 3 vale 0,0
il valore 4 vale 13,5
il valore 5 vale 0,0
il valore 6 vale 40,5
il valore 7 vale 0,0
il valore 8 vale 121,5
il valore 9 vale 0,0

Come si arriva a questa stampa?
Se ti perdi a seguire il codice a mente, tieni traccia del valore delle variabili su un foglio di carta.

E' qui che ti perdi?

vet [i]=vet [i-2] * b;

Per capire che accidenti succede, agli inizi aiuta molto descrivere esplicitamente il processo di valutazione dello statement.

Esempio: cominciamo con il primo passo di quel for:
- assegni a i il valore 2
- controlli che i non sia minore di 10
- non lo e', quindi esegui lo statement: v[2] = v[0] * b ovvero nella cella v[2] metti il valore della cella v[0] moltiplicato per il valore inserito da tastiera (nella stampa che hai messo tu sembra che abbiano digitato 1)
- esegui l'incremento del for: i - i + 2 quindi ora i vale 4
- controlli che i non sia minore di 10
... e poi continua tu

Mezzo suggerimento: in Java, che valori vengono assegnati alle celle dei vettori non inizializzati? Se non lo sai non riesci ad andare avanti
Se il vettore non è inizializzato dovrebbe avere valore null..

però non ci siamo.

vet [i]=vet [i-2] * b;

per ottenere la stampa "1,5" come da risultato, b , che equivale a 3, dovrebbe essere moltiplicato per 0,5. Solo che non riesco a capire come arrivare a 0,5 dentro la parentesi [i-2]..dovrebbe essere [2,5 - 2]..però non capisco come arrivare a quel 2,5.
Ok, forse ci sto arrivando.

for (i=2;i<10;i=i+2) {
vet [i]=vet [i-2] * b;


In pratica ho vet[2]=vet[2-2]*3
Di conseguenza vet[2]=vet[0]
Ma siccome a vet[0] gli è stato precedentemente assegnato il valore 1,5, in stampa andrà appunto 1,5.
Tralasciando il ciclo for sottostante che incrementa i valori di 1 e li stampa a partire da 0, torno al ciclo for iniziale.
Adesso ho i = 4 quindi di conseguenza vet[4]=vet[2]*3. Siccome vet[2] è uguale a 1,5 vet[4] sarà uguale a: 1,5 * 3 che è uguale a 4,5. E così di seguito. Non capisco però perchè fra una stampa e l'altra c'è "questo valore vale 0,0".


L'assegnamento vet[2] = vet[0] * 3 modifica solo il valore di vet[2] (che e' una [i]lvalue
) mentre vet[0] e' usato come rvalue.

Quindi vet[0] stampa 1,5 come gli e' stato assegnato, vet[2] invece 4,5 come calcolato.


Perche' ti sei fermato alla prima iterazione
continua ad eseguire il for: quanto vale
vet [i]=vet [i-2] * b;
con j = 3?
Con i = 3?

vet[3]= vet[3]

E siccome il valore del vet[3] non lo conosco, automaticamente vale 0?

però aspè, come fa "i" ad assumere valore 3 se "i" stesso avanza di 2 ogni volta che finisce il primo ciclo for? devo considerare anche l'incremento del secondo ciclo for?

Ci sono. In pratica il vettore contiene 9 celle, ma siccome "i" si incrementa di 2 ad ogni passaggio possiamo dare un valore solo al vettore 2, al vettore 4, al vettore 6, al vettore 8. Gli altri vettori 3,5,7 vengono saltati e gli viene dato automaticamente il valore 0. Dovevo capirlo alla prima frecciatina che mi hai mandato alla fine della prima risposta.
Scusa ho detto una boiata io

Non assume valore 3 perche' avanza di due come giustamente fai notare

Comunque si', i valori numerici non inizializzati vengono posti automaticamente a zero (sono i riferimenti a oggetti non instanziati che vengono posti automaticamente a null).
Perfetto. Grazie mille.

Ps. stay tuned. Ci manca poco che sto thread me lo metto come home page.
Abuso di voi.

c'è un legame fra i 2 cicli for, vero?

nel senso

il valore 0,0 dato automaticamente al vettore non inizializzato è causato dal fatto che la conclusione del primo ciclo for indica i=i+2, mentre la conclusione del secondo indica che i=i+1. Quindi quando il secondo ciclo for incrementa "i" di una unità e stampa il valore, non lo trova perchè l'altro ciclo for avanza di 2 unità per volta invece che di una sola. Se il secondo ciclo for si concludesse con i=i+2, cioè in modo uguale al primo, le richieste del secondo ciclo coinciderebbero con le risposte del primo e quindi i valori stampati sarebbero solo quelli effettivamente calcolati, non ci sarebbe il bisogno di scrivere "il valore è 0,0". E' così?
si è cosi.
Sono più o meno a buon passo, l'esercizio sul capire cosa stampa un programma dati i valori lo risolvo in meno di 10 minuti così mi resta quasi un ora di tempo per elaborare il diagramma di flusso.

Però non capisco la matrice. Non ci riesco proprio. Ho imparato a fare il record ma la matrice non mi entra in testa.
Cosa non ti è chiaro sui vettori multidimensionali?
Mah, un po' tutto. Soprattutto ho una gran confusione in testa e non capisco quando vanno usati.

In questo esercizio ad esempio:

Progettare un diagramma di flusso che consenta di:

- memorizzare le precipitazioni di un anno con cadenza giornaliera
- indentificare e stampare la settimana con precipitazioni più basse dell'anno.

Per semplicità si consideri l'anno formato da 52 settimane di 7 giorni.



CREDO ci sia necessità di un vettore bidimensionale del tipo vett[i, j] con "i" contatore dei giorni e "j" contatore delle settimane.

Potrei iniziare con un for (i=0;i<365;i++) che controlli che vengano memorizzati tutti i giorni dell'anno. Dentro questo for ci metterei un altro for (j=0;j<=7;j++) che conti 7 giorni: appena il contatore j raggiunge 7 giorni va ad incrementare un ulteriore contatore che chiamerò K che tenga il conto delle settimane. Se è giusto fin qui, e ne dubito, poi non saprei come continuare.
per dichiarare il vettore, io farei qualcosa tipo:

float precipitazioni[][] = new float[52][7];

per riempirlo invece:


for (int i=0; i < 52; i++){
for (int j=0; j< 7; j++){
precipitazioni[i][j] = livelloDelGiorno;
}
}


per calcolare il minimo


int min = 0;
int minIdx;
int somma;

for (int i=0; i < 52; i++){
somma = 0;
for (int j=0; j< 7; j++){
somma = somma + precipitazioni[i][j];
}
if(min==0 || somma <= min){
mainIdx = i;
min = somma;
}
}

// il minimo è contenuto in min e l'indice di settimana è minIdx+1


lascio a te la conversione in diagramma di flusso
Quindi tu dici di dare ad "i" il valore 52 invece che 365? Cmq si, il programma che hai scritto si avvicina pericolosamente a quello che avevo in mente io. Domani lo posto per intero. Grazie pigoz.
bhe nel testo ti dice che hai 52 settimane da 7 giorni. Se vuoi usare una vettore bidimensionale l'unico modo è usare quei due numeri come dimensioni. Non a caso 52x7=364 che è il totale dei valori memorizzabili nel suddetto vettore.

Per capire come funziona pensala così: Il vettore multidimensionale è un vettore di vettori.
Ad esempio float[52][7] è un vettore da 52 posti, in ogniuno di questi posti è contenuto un vettore di float da 7 posti. Queste cose si vedono meglio in corsi dove si impara il linguaggio C.
Si piano piano sta diventando tutto più chiaro, devo inquadrare bene quando usare il vettore bidimensionale e quando usare invece il record. Per il resto procedo abbastanza bene.

Stamattina mi sono intoppato nel secondo punto di questo problema:

1) Creare un vettore con i primi 100 numeri pari a partire da 0.
2) Inserire nelle 10 posizioni successive del vettore, 10 numeri a scelta.
3) Stampare i numeri del vettore inferiori a 120.

Il primo punto è semplice, inizializzo un vettore [], faccio un for (i=0;i<100;i=i+2). In questo modo gli faccio inserire il primo i = 0 e gli altri a venire incrementando "i" di 2 ad ogni passaggio..2 4 6 8 ecc ecc fino a 100. Il terzo punto è altrettanto semplice, basta un if e un contatore. Il secondo punto invece non mi è chiaro..come posso inserire altri 10 numeri nello stesso vettore del punto 1? devo fare un altro ciclo for?
Il primo punto lo hai toppato

Se fai i = i + 2 lo riempi solo con 50 numeri, e in più lasci spazi vuoti nel vettori. Ti servono due contatori.


import java.util.*;

public class Esame {

public static void main(String[] args) {
// 1)
int numeri[] = new int[110];

for(int i = 0, n = 0; i < 100; i++, n+=2){
numeri[i] = n;
}

// 2)
for(int i=100; i<110; i++){
numeri[i] = 2; // 2 è un numero a scelta
}

// 3)
for(int i=0; i < numeri.length; i++){
if(numeri[i] < 120)
System.out.println(numeri[i]);
}

}
}
Grazie per questa ennesima dritta. In effetti il primo punto l'ho interpretato proprio male ma non ci sarei arrivato a mettere 2 contatori dentro un solo for. Grazie ancora.