DOMANDA Programma Temperatura C++

Pubblicità
Stato
Discussione chiusa ad ulteriori risposte.
Qundi è cosi':
Codice:
double averagedT(int index)
{
double temp = 0;
for(int j = 0+index*10)
{
  temp += t[j];        // dovrebbe essere quindi come temp= temp+t[j];
}
return temp/10;
}

Pero' scusa ma non ci arrivo..
"Fare 10+index*10 significa ciclare 10 volte, ma partendo dal mese corrispondente (index*10)."
Io ho capito che terra terra bisogna trovare 10 valori di temperatura di ogni mese , è questo il "ciclare 10 volte" che intendi?
Inoltre index*10 non l'ho mai visto se fosse novembre sarebbe per te il 10 mese dell'anno .. non capisco bene questi passaggi..
poi mi dici
" prendi il mese corrente (novembre - 10), significa iniziare il ciclo alla posizione 100 fino ad arrivare a 109 compreso"
continuo a non capire perchè da 100 a 109 in questo caso...

Ultima cosa... i return che ho messo sono posizionati in maniere errata?

Ma scusa, ti sembra formalmente corretto quel for? Lui si era perso solo l'inizializzazione. La condizione rimane invece quella di prima (sarebbe però meglio calcolarlo prima del ciclo, ma ai fini del risultato, non c'entra niente).

Tu sai che i valori sono 120. Lui è partito dall'assunto che, essendo 12 i mesi, ci sono 10 valori per mese (120/12=10).
Quindi, visto che gli array sono basati a 0, gennaio sarà indicato con 0, febbraio con 1, marzo con 2 etc etc.

Nel caso di marzo quindi, avrai index=2. Visto che l'array è uno per tutti i valori, è che il primo mese è gennaio, i valori che lo riguardano sono memorizzati dalla posizione 0 alla 9. Quindi dalla 10 alla 19 trovi quelli di febbraio e marzo sarà dalla 20 alla 29. Faccio notare che: 2*10 è la posizione del primo valore di marzo, così come 2*10+10 è il limite superiore, l'ultimo valore di marzo (in realtà la posizione è (2*10+10)-1, poiché i valori sono 10).

Novembre sarà quindi 10, in quanto i valori sono 0 based. Quindi il primo valore di novembre sarà alla posizione 10*10=100 e l'ultimo alla posizione 10*10+10=110-1=109.

L'ultimo return si, è corretto. Ma è importante che tu abbia capito perché è corretto lì anche.
 
Scusa quindi quel
for(int j = 0+index*10)

dove lo metto se questa parte va bene cosi'?

Codice:
double averagedT(int index) {      //gli passi il mese es. 2 per marzo
double temp = 0;
for(j=index; j < 10+index*10; j++) {      //cicli da 20 a 29, ovvero i valori relativi a marzo
  temp += t[j];
}
return temp/10;
}
 
Scusa quindi quel
for(int j = 0+index*10)

dove lo metto se questa parte va bene cosi'?

Codice:
double averagedT(int index) {      //gli passi il mese es. 2 per marzo
double temp = 0;
for(j=index; j < 10+index*10; j++) {      //cicli da 20 a 29, ovvero i valori relativi a marzo
  temp += t[j];
}
return temp/10;
}


Come ho detto sopra, la sola parte che ha corretto è l'inizializzazione del for. Il for è composto da 3 parti: inizializzazione, condizione, iterazione (incremento).
La condizione è corretta come lo era prima.
 
ci siamo?

Codice:
double averagedT(int index) {      //gli passi il mese es. 2 per marzo
double temp = 0;
for(int j = 0+index*10; j < 10+index*10; j++) {      //cicli da 20 a 29, ovvero i valori relativi a marzo
  temp += t[j];
}
return temp/10;
}
 
Si, ora è corretto, ma non ti serve sommare lo 0 ovviamente.

Quel 10+index*10 puoi anche memorizzarlo in una variabile, così non viene ripetuto il calcolo (ed è più leggibile).
 
Santo @DispatchCode che riesce a spiegarsi in 6 righe :asd:
Comunque temp += t[j] è la forma compatta di temp = temp + t[j], per i return, due sono sbagliati ( e manca anche una parentesi graffa ). Prova a simularne il comportamento a mente per scoprire come risolverlo.
 
Scusa, ma mi rifiuto di pensare che ti abbiano dato un compito del genere senza una minima spiegazione. E' ovvio che DEVONO specificare cosa facciano quelle funzioni, dare semplicemente il prototipo non basta, e DEVONO spiegare cosa siano quelle variabili globali dim, T
Noi possiamo solo ASSUMERE cosa siano e facciano in base ai nomi. Per esempio, possiamo solo assumere che dei 120 elementi del vettore T rappresentano 10 temperature annuali per ogni mese, ma non sappiamo assolutamente COME siano distribuite. Per esempio, i primi dieci elementi potrebbero essere le temperature di Gennaio, oppure i primi 12 elementi potrebbero essere l valore delle prime temperature di ciascun mese. Impossibile saperlo. Senza avere i dettagli, e' impossibile svolgere l'esercizio.

Come corollario, questo e' un esercizio di linguaggio C, non C++, in quanto esistono variabili e funzioni globali, che sono da evitare in C++ come la peste. In C++, si dovrebbe SOLO parlare in termini di classi e loro interfacce. Il che e' una grossa limitazione del linguaggio C++, che permette di usare sintassi del linguaggio C bypassando quindi la ragione per cui il C++ e' stato creato, ossia per programmare ad oggetti.
 
Scusa, ma mi rifiuto di pensare che ti abbiano dato un compito del genere senza una minima spiegazione. E' ovvio che DEVONO specificare cosa facciano quelle funzioni, dare semplicemente il prototipo non basta, e DEVONO spiegare cosa siano quelle variabili globali dim, T
Noi possiamo solo ASSUMERE cosa siano e facciano in base ai nomi. Per esempio, possiamo solo assumere che dei 120 elementi del vettore T rappresentano 10 temperature annuali per ogni mese, ma non sappiamo assolutamente COME siano distribuite. Per esempio, i primi dieci elementi potrebbero essere le temperature di Gennaio, oppure i primi 12 elementi potrebbero essere l valore delle prime temperature di ciascun mese. Impossibile saperlo. Senza avere i dettagli, e' impossibile svolgere l'esercizio.

Come corollario, questo e' un esercizio di linguaggio C, non C++, in quanto esistono variabili e funzioni globali, che sono da evitare in C++ come la peste. In C++, si dovrebbe SOLO parlare in termini di classi e loro interfacce. Il che e' una grossa limitazione del linguaggio C++, che permette di usare sintassi del linguaggio C bypassando quindi la ragione per cui il C++ e' stato creato, ossia per programmare ad oggetti.

Mi spiace che ci creda o no ci è stato dato per casa (e non ero distratto, duro da comprendere magari si..).
Tenete sempre conto che forse chi mi risponde qui è ad un livello molto superiore del mio per studio, età e assoluta bravura per cui vi prego di non abbattermi troppo, non tutti siamo portati per tutte le materie..
Ora pero' vi chiedo un ultimo aiuto e cioè di sistemarlo definitivamente , si blocca già alla parentesi graffa subito dopo "void fillUpArray();" e di correggermi (come voste un professore) direttamente all'interno del programma gli errori. Vi ringrazio.

Ora è cosi'

Codice:
#include <cstdlib>
#include <ctime>
#include <cmath>
#include <iostream>
using namespace std;

//dimensione ed array globali
const int dim=120;
double T[dim];

//prototipo della funzione
//temperature casuali [-10;40]
void fillUpArray();
{
for (int=0;i<dim;i++)
T[i]= rand ()% 51-10;
}

void printArray();
{
for (int=0;i<dim;i++)
cout<<T[i];
}

double yearAveragedT();
{
double yearAveragedT=0;
for (int i=0; i<dim; i++)
{
yearAverageT=yearAverageT +  T[i];
yearAverageT=yearAverageT/dim;
}
return yearAverageT;
}

double getMaxT();
{
int getMax=-10;
for (int i=0; i<dim;i++)
{
if(T(i)>getMax)
    getMax=T[i];
}
return getMax;
}

double getMinT();
{
int getMin=40;
for (int i=0; i<dim;i++)
{
if(T(i)<getMIn)
    getMin=T[i];
}
return getMin;
}

void averagedTperMonth();
{
int averageTperMonth=0;
double temp;                                 //variabile per calcolare la somma delle temperature
for (i = 0; i<120; i+=10)
{                                        //cicli 12 volte
temp = 0;
}                                       //resettato a 0 per ogni mese
for(j=i; j < i+10; j++) {                   //cicli per i 10 valori di ogni mese
  temp += t[j];                                  //temp per calcolare la somma di un dato mese
}
cout<<temp/10;                         //stampi la media della temperatura per ogni mese ( sono dieci valori quindi diviso 10
}

}
/*restituisce la temperatura media del
mese passato come parametro
*/
}

double averagedT(int index) ;      //gli passi il mese es. 2 per marzo
{
double temp = 0;
for(j=index; j < 10+index*10; j++)    //cicli da 20 a 29, ovvero i valori relativi a marzo
{
  temp += t[j];
}
return temp/10;
}


int main()
{
  srand(time(NULL));
  cout<< getMIn();
  cout<< getMax();
  cout<< averageTperMonth();
  cout<< averageT();


    return 0;
}


[/CODE]
 
Ultima modifica:
Sono da telefono, non guardo tutto. La funzione da te indicata ha un errore palese: guarda dove sono i due punti.
È importante che impari a leggere cosa ti dice il compilatore, visto che segnalerà un errore.

L'altro errore è nel modo in cui calcoli la media.
 
L'errore dei ; compare spesso. Dopo ci sono degli errori all'interno di vari for e l'ordine di chiamata delle funzioni (aiutino, ne mancano alcune). Infine, in una funzione inizializzi una variabile che poi non usi.
Quoto @DispatchCode , il compilatore è tuo amico.
 
Tremendo....
Comunque per la media del mese passato bisogna secondo me fare cosi' "for(int j=a*10; j < 10+a*10; j++) non "for(int j=a; j < 10+a*10; j++) "
ovviamente ho messo a al posto di index per semplicità...

Codice:
#include <cstdlib>
#include <ctime>
#include <cmath>
#include <iostream>
using namespace std;

//dimensione ed array globali
const int dim=120;
double T[dim];

//prototipo della funzione
//temperature casuali [-10;40]
void fillUpArray()
{
for (int i=0;i<dim;i++)
T[i]= rand ()% 51-10;
}

void printArray()
{
for (int i=0;i<dim;i++)
cout<<" "<<T[i];
cout<<endl;
}

double yearAveragedT()
{
double yearAverageT=0;
for (int i=0; i<dim; i++)
{
yearAverageT=yearAverageT +  T[i];
yearAverageT=yearAverageT/dim;
}
return yearAverageT;
}

double getMaxT()
{
int getMax=-10;
for (int i=0; i<dim;i++)
{
if(T[i]>getMax)
    getMax=T[i];
}
return getMax;
}

double getMinT()
{
int getMin=40;
for (int i=0; i<dim;i++)
{
if(T[i]<getMin)
    getMin=T[i];
}
return getMin;
}

void averagedTperMonth()
{
int i=0;
double temp;                           
for (i = 0; i<120; i+=10)
{                                        
temp = 0;                                     
for(int j=i; j < i+10; j++)
{                   //cicli per i 10 valori di ogni mese
  temp += T[j];                                  
}
cout<<temp/10;
cout<<endl;
}                        
}

/*restituisce la temperatura media del
mese passato come parametro
*/


double averagedT(int a)     
double temp = 0;
for(int j=a*10; j < 10+a*10; j++)    
  temp += T[j];
}
return temp/10;
}


int main()
{

  srand(time(NULL));
  int a;
  fillUpArray();
  printArray();
  yearAveragedT();
  cout<<endl;
  cout<< "valore minimo "<<getMinT();
  cout<<endl;
  cout<<"valore massimo "<< getMaxT();
  cout<<endl;
  averagedTperMonth();
  cout<<endl;
  cin>>a;
  cout<<averagedT(a);


    return 0;
}
 
Stato
Discussione chiusa ad ulteriori risposte.
Pubblicità
Pubblicità
Indietro
Top