RISOLTO Aiuto per completamento esercizio

Stato
Discussione chiusa ad ulteriori risposte.

MPG

Utente Attivo
544
4
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 Èlite
1,522
427
CPU
Ryzen 5 3600
Dissipatore
GELID Phantom
Scheda Madre
MSI B450 Gaming Plus Max
HDD
500GB m.2 + 2TB HDD
RAM
16GB Corsair LPX 3000mhz
GPU
Gigabyte GTX 960 OC
Audio
Integrata
Monitor
SyncMaster 223BW
PSU
Antec HCG-520M
Case
Meshify C
Net
Gigabit Fastweb
OS
Windows 10 64bit
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.
 

MPG

Utente Attivo
544
4
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 Èlite
1,522
427
CPU
Ryzen 5 3600
Dissipatore
GELID Phantom
Scheda Madre
MSI B450 Gaming Plus Max
HDD
500GB m.2 + 2TB HDD
RAM
16GB Corsair LPX 3000mhz
GPU
Gigabyte GTX 960 OC
Audio
Integrata
Monitor
SyncMaster 223BW
PSU
Antec HCG-520M
Case
Meshify C
Net
Gigabit Fastweb
OS
Windows 10 64bit
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).
 

MPG

Utente Attivo
544
4
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 Èlite
1,522
427
CPU
Ryzen 5 3600
Dissipatore
GELID Phantom
Scheda Madre
MSI B450 Gaming Plus Max
HDD
500GB m.2 + 2TB HDD
RAM
16GB Corsair LPX 3000mhz
GPU
Gigabyte GTX 960 OC
Audio
Integrata
Monitor
SyncMaster 223BW
PSU
Antec HCG-520M
Case
Meshify C
Net
Gigabit Fastweb
OS
Windows 10 64bit
Azzera è giusto, media devi mettere double però. Per oddity, prendi quel cin>>n; taglialo e incollalo nel main prima di chiamare oddity(n).
 

MPG

Utente Attivo
544
4
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:

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,208
1,845
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
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...
 

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,208
1,845
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
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
Reazioni: Andretti60

MPG

Utente Attivo
544
4
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:

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,208
1,845
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
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.
 
Stato
Discussione chiusa ad ulteriori risposte.

Ci sono discussioni simili a riguardo, dai un'occhiata!

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili