PDA

Visualizza versione completa : Numeri cumulati


Downloader
18-05-2004, 22.32.30
Sto facendo un programma che ASSOLUTAMENTE per domani devo portare.

Ma non risco tramite una funzione a fargli fare una serie di numeri cumulati. Mi spiego meglio:
ho questi numeri:
60
75
120
30
15
e il risultato del calcolo il seguente:
60
135
255
285
300

ma non ci riesco, dateme na mano :crying:

allego il codice in c++

#include<iostream.h>
#include<dos.h>
#include<conio.h>
#include<iostream.h>

float media_classe (float a, float b)
{
float tot;
tot=(a+b)/2;
return tot;
}

float intensita (float a, float b)
{
float tot;
tot=a*b;
return tot;
}

float freq_ass_cum (float a, float b) // NON VIENE UN ACCIDENTE
{
float tot,totale;
tot=a;
tot=tot+b;
totale=tot+0;


return totale;
}

float inten_ass_cum (float a, float b) // NON VIENE UN ACCIDENTE
{
float tot;
tot=a;
tot=tot+b;
return tot;
}

float freq_rel_cum (float a, float b)
{
float tot;
tot=a/b;
return tot;
}

float inten_rel_cum (float a, float b)
{
float tot;
tot=a/b;
return tot;
}

void main()
{
clrscr();

float x[5];
float x2[5];
float y[5];
int i,totaley=0;
float z[5]; // media_classe
float h[5]; // intensita
float l[5]; // frequenza assoluta cumulata
float k[5]; // intensita relativa cumulata
float g[5]; // frequenza relativa cumulata
float v[5]; // intensita assoluta cumulata
float e[5]; // frequenza assoluta cumulata

for (i=0;i<5;i++)
{
cout<<"Primo numero: ";
cin>>x[i];

cout<<"Secondo numero: ";
cin>>x2[i];

z[i]=media_classe (x[i],x2[i]);
}


for (i=0;i<5;i++)
{
cout<<"Valori della Y: ";
cin>>y[i];

totaley=totaley+y[i];
}

for (i=0;i<5;i++)
{
h[i]= intensita (z[i],y[i]);

}

for (i=0;i<5;i++)
{
l[i]=freq_ass_cum (y[i], y[i+1]);
cout<<l[i]<<endl;
}

for (i=0;i<5;i++)
{
v[i]=inten_ass_cum (h[i], h[i+1]);
}

for (i=0;i<5;i++)
{
k[i]=inten_rel_cum (v[i],totaley);

}

for (i=0;i<5;i++)
{
g[i]=freq_rel_cum (e[i],totaley);
}

// STAMPA RISULATATI

for (i=0;i<5;i++)
{
cout<<"Le intensita sono: "<<h[i]<<endl;
}
for (i=0;i<5;i++)
{
cout<<"Le frequenze assolute cumulate: "<<l[i]<<endl;
}
for (i=0;i<5;i++)
{
cout<<"Le intensita assolute cumulate: "<<v[i]<<endl;
}
for (i=0;i<5;i++)
{
cout<<"Frequenze relative cumulate: "<<g[i]<<endl;
}
for (i=0;i<5;i++)
{
cout<<"Intensita relative cumulate: "<<k[i]<<endl;
}


getch();

}

Dav82
18-05-2004, 22.37.42
Calma calma, io ti d una mano!
Ma come chiami sta cosa nel codice? In poche parole: qual la funzione che dovrebbe fare sto calcolo ma canna miseramente? :confused: :D

Dav82
18-05-2004, 22.40.29
Originariamente inviato da Dav82
Calma calma, io ti d una mano!
Ma come chiami sta cosa nel codice? In poche parole: qual la funzione che dovrebbe fare sto calcolo ma canna miseramente? :confused: :D

Ehm ops... non avevo letto gli ESPLICITI commenti a lato! :p
Guardo un attimo e ti dico eh! :)

Downloader
18-05-2004, 22.46.10
Originariamente inviato da Dav82


Ehm ops... non avevo letto gli ESPLICITI commenti a lato! :p
Guardo un attimo e ti dico eh! :)

Ok, grazie

Dav82
18-05-2004, 22.49.52
Ok ci siamo.
Tu inserisci i valori in input in due array che hanno 5 posti ciascuno, numerati da 0 a 4.
Poi quando chiami le due funzioni le chiami fino a che l'indice 4, ma le chiami con parametri gli elementi dell'array che hanno indice pari all'indice del ciclo e pari all'indice del ciclo pi uno! Quindi in sostanza tu gli passi il sesto elemento di ognuno degli array (quello in posizione 5) che non esiste.
Questo ovviamente solo nell'ultima chiamata di ognuna delle due funzioni "cumulative".

Ah ecco, non che l'elemento in posizione 5 non esiste: lo spazio di memoria esiste eccome! Semplicemente non ha un valore che gli hai assegnato tu deterministicamente, potrebe essere qualsiasi altra cosa, un valore a caso oppure anche il valore di un'altra variabile del tuo programma!

Anche un piccolo consiglio per le funzioni: al posto di dichiarare una variabile interna, assegnarle un valore, assegnare questo valore ad un'altra variabile e poi restituire quest'ultima, basta al posto di

float inten_ass_cum (float a, float b){
float tot;
tot=a;
tot=tot+b;
return tot;
}

scrivere

float inten_ass_cum (float a, float b){
return ((float) a+b);
}


E' pi leggibile e risparmi anche spazio di allocazione, anche se in sto caso veramente una cavolata, pochi byte ;)

Prova a modificare e guarda se funziona! :)

Dav82
18-05-2004, 22.56.35
Ah no asp... ho letto solo adesso il tipo di risultato che vuoi: una cosa tipo Fibonacci.

La funzione va bene, ma devi modificare la chiamata alla funzione stessa: gli devi passare l'ultimo valore calcolato dalla funzione (e ce l'hai, visto che lo salvi in l[i] e v[i] nei due casi delle funzioni che non... funzionano :D) come primo parametro e come secondo passi il nuovo valore da aggiungere, cio quello che c' gi adesso nella chiamata. E' da modificare a met, quindi ;)

Downloader
18-05-2004, 23.14.06
Scusa, sono un po rico**** (pensa che ho mangiato 5 minuti fa) allora in pratica come mi comporto?

Dav82
18-05-2004, 23.26.45
Questo il codice che scrivere io! :)

N.B: da controllare, errori possibili perch non ho un compilatore e non ho potuto eseguirlo n compilarlo!

Ho modificato un po' le funzioni - ma sono cavolate, in s erano perfette - , con la cosa che ti ho detto prima: niente variabili "inutili", basta un semplice return; ho messo il cast, anche se penso che non serva, visto che la somma di due float d float... ma siccome sono un paio di annetti che non programmo in C...

La modifica sostanziale nelle chiamate dei due metodi che non funzionavano (o meglio funzionavano, ma erano chiamati male): tutto commentato nel codice ;)


#include<iostream.h>
#include<dos.h>
#include<conio.h>
#include<iostream.h>

float media_classe (float a, float b)
{
return ((float)(a+b)/2);
}

float intensita (float a, float b)
{
return ((float) a*b);
}

float freq_ass_cum (float a, float b) // ADESSO VIENE!
{
return ((float) a+b);
}

float inten_ass_cum (float a, float b) // ADESSO VIENE!
{
return ((float) a+b);
}

float freq_rel_cum (float a, float b)
{
return ((float) a/b);
}

float inten_rel_cum (float a, float b)
{
return ((float) a/b);
}

void main()
{
clrscr();

float x[5];
float x2[5];
float y[5];
int i,totaley=0;
float z[5]; // media_classe
float h[5]; // intensita
float l[5]; // frequenza assoluta cumulata
float k[5]; // intensita relativa cumulata
float g[5]; // frequenza relativa cumulata
float v[5]; // intensita assoluta cumulata
float e[5]; // frequenza assoluta cumulata

for (i=0;i<5;i++)
{
cout<<"Primo numero: ";
cin>>x[i];

cout<<"Secondo numero: ";
cin>>x2[i];

z[i]=media_classe (x[i],x2[i]);
}


for (i=0;i<5;i++)
{
cout<<"Valori della Y: ";
cin>>y[i];

totaley=totaley+y[i];
}

for (i=0;i<5;i++)
{
h[i]= intensita (z[i],y[i]);

}


//calcoli la prima somma, che pari al primo numero
l[0] = freq_ass_cum (0, y[0]);

//stavolta parti da uno, tanto lo zeresimo l'hai gi calcolato
for (i=1;i<5;i++)
{
//qua passi il valore della somma appena calcolata, la usi
//come base di partenza a cui aggiungere il nuovo numero
//al primo ciclo sommiamo a l[0] il primo valore da aggiungere,
//che y[i] = y[1], y[0] l'abbiamo gi contato!
l[i]=freq_ass_cum (l[i-1], y[i]);
cout<<l[i]<<endl;
}

//queste modifiche sono pari pari a quelle sopra!

v[0] = inten_ass_cum (0, h[0])
for (i=1;i<5;i++)
{
v[i]=inten_ass_cum (v[i-1], h[i]);
}

for (i=0;i<5;i++)
{
k[i]=inten_rel_cum (v[i],totaley);

}

for (i=0;i<5;i++)
{
g[i]=freq_rel_cum (e[i],totaley);
}

// STAMPA RISULATATI

for (i=0;i<5;i++)
{
cout<<"Le intensita sono: "<<h[i]<<endl;
}
for (i=0;i<5;i++)
{
cout<<"Le frequenze assolute cumulate: "<<l[i]<<endl;
}
for (i=0;i<5;i++)
{
cout<<"Le intensita assolute cumulate: "<<v[i]<<endl;
}
for (i=0;i<5;i++)
{
cout<<"Frequenze relative cumulate: "<<g[i]<<endl;
}
for (i=0;i<5;i++)
{
cout<<"Intensita relative cumulate: "<<k[i]<<endl;
}


getch();

}


P.S: non si dovrebbe postare il codice modificato... altrimenti difficile che impari, ma ho fatto uno strappo alla regola! ;) :D

Dav82
18-05-2004, 23.34.00
Un'altra cosa: in sostanza hai scritto due coppie di funzioni che fanno le stesse cose. Infatti ci sono due funzioni che calcolano la somma di due float e restituiscono un float, e altre due che fanno la stessa cosa col rapporto.

E' meglio dividerle dal punto di vista dell'organizzazione logica del programma: se devi cambiare le caratteristiche di una espressione (non so, decidi che la frequenza e l'intensit devono essere calcolate in modo diverso) va benissimo, perch cos non devi scrivere altro codice; tieni presente che cmq potevi usare una sola funzione!

Non cambiarlo che va benissimo cos, solo una domanda che ti pu esser fatta dall'insegnante! ;)

Downloader
18-05-2004, 23.43.50
Ok, ti ringrazio per la gross mano che me stai a da.

Ma non ci sarebbe un modo per rendere un po piu elelentare il tutto, visto che non sono a questo livello?

Dav82
18-05-2004, 23.47.00
Originariamente inviato da Downloader
Non ci sarebbe un modo per rendere un po piu elelentare il tutto, visto che non sono a questo livello?

In che senso pi elementare?

Lascia pure perdere, se vuoi, la mia scrittura delle funzioni, la tua va cmq bene se sei all'inizio... ma non vedo, per come strutturato il programma, un metodo pi semplice... prova a rileggere con calma il codice delle chiamate con i commenti che ho messo... vedrai, una cavolata ;)

P.s: ah, per la cronaca... ma il codice che ho postato io funziona? :confused:

Dav82
18-05-2004, 23.55.19
Guarda, seplicemente fai cos:

prima di entrare nel ciclo for, immetti in l[0] il valore che c' in y[0], visto che a y[0] sommi zero;

poi sommi a l[0] il valore di y[1] e ottieni l[1]
poi sommi a l[1] il valore di y[2] e ottieni l[2]
...

e cos via :)

Downloader
19-05-2004, 00.09.01
Il codice che hai postato va bene, apparte un ; che manca, ora pero ho problemi con le freq relative cumulate e con le intensita relative cumulate.

:crying:

:wall: :wall:

Dav82
19-05-2004, 00.11.30
Originariamente inviato da Downloader
Il codice che hai postato va bene, apparte un ; che manca, ora pero ho problemi con le freq relative cumulate e con le intensita relative cumulate.

:crying:

:wall: :wall:

Mi dici gli input che metti e gli output errati che ti d?

Downloader
19-05-2004, 00.13.34
Vabbe, il piu del programma viene, mica mi posso sta a spreme fino a mezzanotte, grazie per tutto l'aiuto che mi hai dato. (Y)


p.s. ti ricordi quel programma sul fattoriale? ho preso 7!!

;)

Dav82
19-05-2004, 00.15.25
Sp ho visto!

Dav82
19-05-2004, 00.17.56
In sostanza tu nelle frequenze relativi prendi i valori da e[] e non da l[]. e[] un doppione che non hai mai usato, contiene valori non noti. Se invece usi l[] operi proprio sui valori corretti! ;)

Grande per il 7 nel fattioriale e... di niente, figurati! :) (B)