[DOMANDA] Aiuto per completamento esercizio

  • Il Forum di Tom's Hardware, la più grande community dedicata all'Hardware e all'Informatica. Iscriviti Ora!
#1
In questo esercizio che ho quasi completato dovrei aggiungere un void azzera() e un void oddity (int n) , il primo dovrebbe azzerare i valori dell'array inferiori alla media , mentre il secondo chiede l'inserimento di un numero intero e sostituisce i primi 10 e gli ultimi 10 posizioni nell'array con l'intero.
Mi potete aiutare in questi due?
Vi ringrazio.

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();
void printArray();
double yearAveragedT();
double getMaxT();
double getMinT();
void averagedTperMonth();

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


void averagedTperMonth(){

int cont=0; int offset=0;
while(cont<12)
{
    double somma=0;
     for(int i=0; i<10; i++)
        {
          somma=somma+T[i+offset];
        }
        cout<<somma/10.0<<endl;
    offset=offset+10.0;
    cont++;
 }
}

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

double averagedT(int n)
{
  double somma=0;
  for(int i=0; i<10; i++)
       somma=somma+T[i+((n-1)*10)];

  return somma/10.0;
}

/*
converte le temperature modificando  l'arra
richiamando */
void converToKelvin()
{
    for (int i=0;i<dim;i++)
{


        T[i]=T[i]+ 273,15;
}
}
    bool isitKelvin()
    {
        if(T[0]>40)
            {
                return true;
            }
    }


int main()
{
  srand(time(NULL));

int m;
  fillUpArray();
  printArray();
  cout<<endl;
  averagedTperMonth();
  converToKelvin();
  cout<<"array in Kelvin"<<endl;

  while(true)
  {
  cout<<"Seleziona il mese [1;12]: ";
  cin>>m;
  cout<<averagedT(m)<<endl;
  }
    return 0;
}
 

rodhellas

Utente Attivo
1,415
377
Hardware Utente
CPU
Intel i5 3470
Scheda Madre
AsRock H77 pro4/mvp
Hard Disk
120GB SSD + 1TB HD
RAM
12GB Corsair XMS3 1333mhz
Scheda Video
Gigabyte GTX 960 OC
Scheda Audio
Integrata
Monitor
SyncMaster 223BW
Alimentatore
Antec HCG-520M
Case
Thermaltake Commander Ms-i Snow Edition
Sistema Operativo
Windows 10 64bit
#2
Ormai dovresti aver capito come funzionano gli array e i cicli.. Se il valore è sotto la media lo poni = 0, nel secondo cicli 10 volte dall'inizio e 10 volte dal fondo (andando al contrario) e assegni il valore chiesto.
 
#3
Ho fatto cosi' ma c'è qualcosa che non torna nel void oddity.. aggiungendo il void oddity () nell'int main quando metto un valore dopo la domanda "Array in kelvin" mi da' poi sempre 0......

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();
void printArray();
double yearAveragedT();
double getMaxT();
double getMinT();
void averagedTperMonth();

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


void averagedTperMonth(){

int cont=0; int offset=0;
while(cont<12)
{
    double somma=0;
     for(int i=0; i<10; i++)
        {
          somma=somma+T[i+offset];
        }
        cout<<somma/10.0<<endl;
    offset=offset+10.0;
    cont++;
}
}

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

double averagedT(int n)
{
  double somma=0;
  for(int i=0; i<10; i++)
       somma=somma+T[i+((n-1)*10)];

  return somma/10.0;
}

/*
converte le temperature modificando  l'arra
richiamando */
void converToKelvin()
{
    for (int i=0;i<dim;i++)
{


        T[i]=T[i]+ 273,15;
}
}
    bool isitKelvin()
    {
        if(T[0]>40)
            {
                return true;
            }
    }

//dovrebbe azzerare i valori dell'array inferiori alla media ,

void azzera ()

{
   int media=0;

     for  (int i=0; i<dim ; i++)
{

media=media+ T[i];
}
for (int i=0; i<dim ; i++)

{

  if (  media > T[i])

        T[i]=0 ;
}
}

//chiede l'inserimento di un numero intero e sostituisce i primi 10 e gli ultimi 10 posizioni nell'array con l'intero.

void oddity (int n)
{cin >>n;
for (int i=0; i<10; i++)
{
    T[i]=n;
}
for (int  i=dim-10;i<dim; i++)
{
    T[i]=n;
}
}
int main()
{
  srand(time(NULL));

int m;
int n;
  fillUpArray();
  printArray();
  cout<<endl;

  averagedTperMonth();
  converToKelvin();
  cout<<"array in Kelvin"<<endl;
  oddity (n);
  azzera ();
  printArray();
  while(true)
  {
  cout<<"Seleziona il mese [1;12]: ";
  cin>>m;
  cout<<averagedT(m)<<endl;
  }
    return 0;
}
 
Ultima modifica:

rodhellas

Utente Attivo
1,415
377
Hardware Utente
CPU
Intel i5 3470
Scheda Madre
AsRock H77 pro4/mvp
Hard Disk
120GB SSD + 1TB HD
RAM
12GB Corsair XMS3 1333mhz
Scheda Video
Gigabyte GTX 960 OC
Scheda Audio
Integrata
Monitor
SyncMaster 223BW
Alimentatore
Antec HCG-520M
Case
Thermaltake Commander Ms-i Snow Edition
Sistema Operativo
Windows 10 64bit
#4
In azzera, con "media=media+ T;" stai solo sommando tutti i valori, ti serve la media!
In oddity, devi assegnare il valore di n prima di invocare oddity(n), sennò non ha senso.
Ad offset somma solo 10, non 10.0 (non è un float).
 
#5
Ho fatto cosi' ma sicuramente non è giusto.. puoi cortesemente correggermi direttamente nel code le due cose che non vanno in azzera e oddity?

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();
void printArray();
double yearAveragedT();
double getMaxT();
double getMinT();
void averagedTperMonth();

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


void averagedTperMonth(){

int cont=0; int offset=0;
while(cont<12)
{
    double somma=0;
     for(int i=0; i<10; i++)
        {
          somma=somma+T[i+offset];
        }
        cout<<somma/10.0<<endl;
    offset=offset+10;
    cont++;
}
}

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

double averagedT(int n)
{
  double somma=0;
  for(int i=0; i<10; i++)
       somma=somma+T[i+((n-1)*10)];

  return somma/10.0;
}

/*
converte le temperature modificando  l'arra
richiamando */
void converToKelvin()
{
    for (int i=0;i<dim;i++)
{


        T[i]=T[i]+ 273,15;
}
}
    bool isitKelvin()
    {
        if(T[0]>40)
            {
                return true;
            }
    }

//si dovrebbero azzerare i valori dell'array inferiori alla media ,

void azzera ()

{
   int media=0;

     for  (int i=0; i<dim ; i++)
{

media=media+ T[i]
}
media =media/dim;
for (int i=0; i<dim ; i++)

{

  if (  media > T[i])

        T[i]=0 ;
}
}

//chiede l'inserimento di un numero intero e sostituisce i primi 10 e gli ultimi 10 posizioni nell'array con l'intero.

void oddity (int n)
{cin >>n;
for (int i=0; i<10; i++)
{
    T[i]=n;
}
for (int  i=dim-10;i<dim; i++)
{
    T[i]=n;
}
}
int main()
{
  srand(time(NULL));

int m;
int n;
  fillUpArray();
  printArray();
  cout<<endl;

  averagedTperMonth();
  converToKelvin();
  cout<<"array in Kelvin"<<endl;
  //azzera();
  oddity (n);
  azzera ();
  printArray();
  while(true)
  {
  cout<<"Seleziona il mese [1;12]: ";
  cin>>m;
  cout<<averagedT(m)<<endl;
  }
    return 0;
}
 

rodhellas

Utente Attivo
1,415
377
Hardware Utente
CPU
Intel i5 3470
Scheda Madre
AsRock H77 pro4/mvp
Hard Disk
120GB SSD + 1TB HD
RAM
12GB Corsair XMS3 1333mhz
Scheda Video
Gigabyte GTX 960 OC
Scheda Audio
Integrata
Monitor
SyncMaster 223BW
Alimentatore
Antec HCG-520M
Case
Thermaltake Commander Ms-i Snow Edition
Sistema Operativo
Windows 10 64bit
#6
Azzera è giusto, media devi mettere double però. Per oddity, prendi quel cin>>n; taglialo e incollalo nel main prima di chiamare oddity(n).
 
#7
Fatto pero' non mi pare vi sia l'azzeramento dei valori del'array inferiori alla media....
Poi prova a mettere 1 in "array in kelvin".. Viene 1 poi 10 volte 0 poi vari valori e dieci volte 0, se poi metto 1 in "selezione il mese" 1 mi viene 0.....

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();
void printArray();
double yearAveragedT();
double getMaxT();
double getMinT();
void averagedTperMonth();

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


void averagedTperMonth(){

int cont=0; int offset=0;
while(cont<12)
{
    double somma=0;
     for(int i=0; i<10; i++)
        {
          somma=somma+T[i+offset];
        }
        cout<<somma/10.0<<endl;
    offset=offset+10;
    cont++;
}
}

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

double averagedT(int n)
{
  double somma=0;
  for(int i=0; i<10; i++)
       somma=somma+T[i+((n-1)*10)];

  return somma/10.0;
}

/*
converte le temperature modificando  l'arra
richiamando */
void converToKelvin()
{
    for (int i=0;i<dim;i++)
{


        T[i]=T[i]+ 273,15;
}
}
    bool isitKelvin()
    {
        if(T[0]>40)
            {
                return true;
            }
    }

//si dovrebbero azzerare i valori dell'array inferiori alla media ,

void azzera ()

{
   double  media=0;

     for  (int i=0; i<dim ; i++)
{

media=media+ T[i];
}
media =media/dim;
for (int i=0; i<dim ; i++)

{

  if (  media > T[i])

        T[i]=0 ;
}
}

//chiede l'inserimento di un numero intero e sostituisce i primi 10 e gli ultimi 10 posizioni nell'array con l'intero.

void oddity (int n)
{
for (int i=0; i<10; i++)
{
    T[i]=n;
}
for (int  i=dim-10;i<dim; i++)
{
    T[i]=n;
}
}
int main()
{
  srand(time(NULL));

int m;
int n;
  fillUpArray();
  printArray();
  cout<<endl;

  averagedTperMonth();
  converToKelvin();
  cout<<"array in Kelvin"<<endl;
    cin >>n;
  oddity (n);
  azzera ();
  printArray();
  while(true)
  {
  cout<<"Seleziona il mese [1;12]: ";
  cin>>m;
  cout<<averagedT(m)<<endl;
  }
    return 0;
}
Post unito automaticamente:

aiutino........
 
Ultima modifica:
429
265
Hardware Utente
CPU
Intel i7 6700HQ, 2.60Ghz, 4 core 8 threads
Scheda Madre
Asustek
Hard Disk
Hitachi 7200 rpm, 1TB
RAM
16GB DDR4 (2 slot su 4)
Scheda Video
Nvidia Geforce GTX 960M, 4GB
Scheda Audio
Realtek
Sistema Operativo
Windows 10 64bit
#10
Stasera da casa guarderò io...
La prima cosa che vedo è che rifai le stesse cose più volte quanto ti basterebbe salvare il risultato precedente o almeno richiamare la funzione (un esempio è la media). Ho già visto errori comunque...
 
429
265
Hardware Utente
CPU
Intel i7 6700HQ, 2.60Ghz, 4 core 8 threads
Scheda Madre
Asustek
Hard Disk
Hitachi 7200 rpm, 1TB
RAM
16GB DDR4 (2 slot su 4)
Scheda Video
Nvidia Geforce GTX 960M, 4GB
Scheda Audio
Realtek
Sistema Operativo
Windows 10 64bit
#12
Inizia a definire una costante, come il valore degli elementi per ogni singolo mese (ovvero 10).
Come dicevo sopra, la media del mese potresti calcolarla una sola volta, e poi memorizzarla (ripeti nelle funzioni la somma delle temperature per poi calcolare la media).

C++:
void converToKelvin()
{
    for (int i=0;i<dim;i++)
    {
       T[i]=T[i]+ 273,15;
    }
}
ormai dovresti sapere come specificare valori letterali di tipo double, quindi... noti nulla?

oddity() non è errato, anche se sarebbe sufficiente un solo ciclo per settare i valori.

Poi prova a mettere 1 in "array in kelvin".. Viene 1 poi 10 volte 0 poi vari valori e dieci volte 0, se poi metto 1 in "selezione il mese" 1 mi viene 0.....
Che ti aspetti?
Dopo l'inserimento del valore, quando viene richiesto, i primi 10 elementi e gli ultimi 10 vengono settati con quel valore; la chiamata successiva è azzera(), quindi vengono posti a 0.
Questo dovrebbe azzerare tutti i valori inferiori alla media; verifica la media, e verifica i valori stampati a schermo. Dovrebbero essere tutti maggiori della media.

C++:
bool isitKelvin()
{
    if(T[0]>40)
    {
        return true;
    }
}
non ha molto senso...
 
Mi Piace: Andretti60
#14
C++:
void converToKelvin()
{
    for (int i=0;i<dim;i++)
    {
       T[i]=T[i]+ 273,15;
    }
}
C++:
bool isitKelvin()
{
    if(T[0]>40)
    {
        return true;
    }
}
Ti diro' queste due parti le ha impostate il prof ... per cui non le ho cambiate...


MI sto ora rimbambendo , cioè per fare che prima venga fatta la funzione "oddity" e non subito dopo automaticamente la funzione "azzera" che mi azzera subito quindi i primi 10 e gli ultimi 10 elementi come devo impostare? In pratica a video vorrei vedere prima quello che mi da' oddity e poi quello che mi da azzera senza che questo si sovrapponga a oddity.
Magari per favore scrivimi direttamente il code esatto perchè secondo me pensate sempre che chi vi parla sia sempre pronto a recepire quello che mi dite in modo intuitivo invece cosi' non è, voi siete ad un livello molto superiore per conoscenza e presumo età per cui a volte scrivermi direttamente il code giusto non è per trovare la "pappa pronta" ma se non ci arrivo vedendo poi il code giusto riesco a ragionarci meglio del perchè non ci sono arrivato. Quindi ti ringrazio se me lo puoi scrivere correttamente per quello che ti ho chiesto.
 
Ultima modifica:
429
265
Hardware Utente
CPU
Intel i7 6700HQ, 2.60Ghz, 4 core 8 threads
Scheda Madre
Asustek
Hard Disk
Hitachi 7200 rpm, 1TB
RAM
16GB DDR4 (2 slot su 4)
Scheda Video
Nvidia Geforce GTX 960M, 4GB
Scheda Audio
Realtek
Sistema Operativo
Windows 10 64bit
#15
Di questo esercizio sarebbe utile avere la richiesta completa comunque...

Ti diro' queste due parti le ha impostate il prof ... per cui non le ho cambiate...
Prof. o no, quel valore espresso in quel modo è errato.

MI sto ora rimbambendo , cioè per fare che prima venga fatta la funzione "oddity" e non subito dopo automaticamente la funzione "azzera" che mi azzera subito quindi i primi 10 e gli ultimi 10 elementi come devo impostare? In pratica a video vorrei vedere prima quello che mi da' oddity e poi quello che mi da azzera senza che questo si sovrapponga a oddity.
Magari per favore scrivimi direttamente il code esatto perchè secondo me pensate sempre che chi vi parla sia sempre pronto a recepire quello che mi dite in modo intuitivo invece cosi' non è, voi siete ad un livello molto superiore per conoscenza e presumo età per cui a volte scrivermi direttamente il code giusto non è per trovare la "pappa pronta" ma se non ci arrivo vedendo poi il code giusto riesco a ragionarci meglio del perchè non ci sono arrivato. Quindi ti ringrazio se me lo puoi scrivere correttamente per quello che ti ho chiesto.
Non è tanto il problema del fornirti del codice funzionante... è più una questione di cercare di farti giungere alla soluzione ragionando, in quanto il problema non è solo tecnico; ciò che ti crea difficoltà sono concetti basilari, dovresti aver ormai compreso che accade quando chiami una funzione, ed in quale ordine viene eseguito il codice. Ho paura che fornendoti il codice direttamente, incontrerai ancora maggiori problemi la prossima volta. Per questo in un precedente topic ti chiedevo di porre domande su tutto ciò che ti creava dubbi, così potevi affrontarli in quel momento; andando avanti rischi di aggiungere concetti su concetti e di non comprenderli a fondo a causa di una mancata comprensione dei concetti visti in precedenza.

Stai richiamando oddity() e subito dopo azzera()... se vuoi vedere i valori prima di azzerarli, allora dovrai stamparli prima della chiamata ad azzera() e non dopo, in quanto ormai sono stati azzerati.
 

Discussioni Simili