Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Aiuto Somma e Media in funzioni
Forum - C/C++ - Aiuto Somma e Media in funzioni

Avatar
zaire90 (Normal User)
Rookie


Messaggi: 46
Iscritto: 16/10/2009

Segnala al moderatore
Postato alle 18:29
Lunedì, 02/11/2009
Non capisco perchè questo programma non mi gira bene...

Codice sorgente - presumibilmente C++

  1. /*  QUESTO PROGRAMMA ACQUISISCE DA TASTIERA UN NUMERO INTERO POSITIVO N,
  2.     E CALCOLA E STAMPA SUL VIDEO LA SOMMA E LA MEDIA DEI PRIMI N ELEMENTI
  3.     DELLA SUCCESSIONE DI NUMERI REALI a(n):
  4.                           a(n)=(n+3)/(n^3+5)         n=1,2,3...               */
  5.                          
  6. #include <iostream>
  7. using namespace std;
  8. void presenta();
  9. void leggiN(int);
  10. float somma(float,float);
  11. float media(float,float);
  12. void stampasommamedia();
  13.  
  14. int main()
  15. {
  16.     int N;float n,SOMMA,MEDIA,x,y;
  17.     presenta();
  18.     leggiN(N);
  19.     SOMMA=somma(n,x);
  20.     MEDIA=media(n,y);
  21.     stampasommamedia();
  22.     system("PAUSE");
  23.     return 1;
  24. }
  25.  
  26. void presenta()                                   // Presentazione del programma
  27. {
  28.     cout<<"Scrivi un numero intero positivo N e il programma calcolera'";
  29.     cout<<"\nla somma e la media dei primi N elementi della successione";
  30.     cout<<"\ndi numeri reali a(n):";
  31.     cout<<"\n\n                         a(n)=(n+3)/(n^3+5)";
  32.     return;
  33. }
  34.  
  35. void leggiN(int N)                                          // Legge il numero N
  36. {
  37.     cout<<"\n\n\n                                N = ";cin>>N;
  38.     while (N<=0)
  39.           {
  40.            cout<<"\nN deve essere maggiore di 0!\n\n";
  41.            cout<<"                                N = ";cin>>N;
  42.           }
  43.     return;
  44. }
  45.  
  46. float somma(float n,float x)                                  // Esegue la somma
  47. {
  48.     float SOMMA=0;int N;
  49.     for (n=1;n<=N;n++)
  50.            {
  51.             x=(n+3)/((n*n*n)+5);
  52.             SOMMA=SOMMA+x;
  53.            }
  54.     return SOMMA;
  55. }
  56.  
  57. float media(float n,float y)                                  // Esegue la media
  58. {
  59.     float MEDIA=0;int N;
  60.     for (n=1;n<=N;n++)
  61.           {
  62.            y=(n+3)/((n*n*n)+5);
  63.            MEDIA=MEDIA+y;
  64.           }
  65.     MEDIA=MEDIA/N;
  66.     return MEDIA;
  67. }
  68.  
  69. void stampasommamedia()                  // Stampa il risultato di somma e media
  70. {
  71.     float SOMMA,MEDIA;
  72.     cout<<"\n\nECCO LA SOMMA:          SOMMA = "<<SOMMA;    
  73.     cout<<"\n\nECCO LA MEDIA:          MEDIA = "<<MEDIA<<endl<<endl;
  74.     return;
  75. }



...non capisco perchè!Mi aiutate?



PM Quote
Avatar
theprogrammer (Normal User)
Guru^2


Messaggi: 2509
Iscritto: 28/01/2009

Segnala al moderatore
Postato alle 19:44
Lunedì, 02/11/2009
Non mi gira bene non significa nulla ...

PM Quote
Avatar
zaire90 (Normal User)
Rookie


Messaggi: 46
Iscritto: 16/10/2009

Segnala al moderatore
Postato alle 20:32
Lunedì, 02/11/2009
"Non mi gira bene" significa che non da il risultato giusto. Se lo esegui vedrai che scrive come risultato cose impossibili come "SOMMA = 3.64709e-007" se scrivi N=3.
Questo significa...

PM Quote
Avatar
theprogrammer (Normal User)
Guru^2


Messaggi: 2509
Iscritto: 28/01/2009

Segnala al moderatore
Postato alle 20:44
Lunedì, 02/11/2009
Testo quotato

Postato originariamente da zaire90:

"Non mi gira bene" significa che non da il risultato giusto.



Beh ... potevi dirlo.

Non gira bene potrebbe anche significare che si blocca, che hai una violazione di lettura o scrittura della memoria, e chissa' quante altre cose ...

Testo quotato

Se lo esegui ...



Prima di eseguirlo, bisogna compilarlo correttamente ... e un compilatore decente ti indica che ci sono degli errori ..

Per cominciare, molte variabili non sono inizializzate (ad esempio N).

Ma quello che il compilatore non può evidenziare sono gli errori di "utilizzazione" delle variabili ...

La N, ad esempio, non è passata per riferimento alla funzione LeggiN (come invece dovrebbe essere) e le variabili non sono usate coerentemente ...

Ad esempio, la N all'interno della funzione somma è dichiarata localmente e quindi NON ha il valore di quella dichiarata nel main ...

Come nella funzione stampasommamedia in cui le variabili SOMMA e MEDIA sono dichiarate localmente e hanno (come di regola per il C/C++) valore casuale (quello che vedi in out), e nessun riferimento alle altre variabile dichiarate localmente nel main.

Sono problemi che riguardano il capitolo "visibilità delle variabili" in un qualsiasi libro di C/C++.

Ultima modifica effettuata da theprogrammer il 02/11/2009 alle 20:47
PM Quote
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2765
Iscritto: 21/09/2007

Segnala al moderatore
Postato alle 20:54
Lunedì, 02/11/2009

Quel programma è un disastro, sia dal punto di vista concettuale che stilistico:

1) "leggiN" oltre ad essere un nome orribile per una funzione non fa quello che dovrebbe fare, perchè il numero che legge da tastiera non lo inserisce in N. Il motivo è semplice: N non è passato per riferimento ma per valore. Per risolvere questo bisogna passare un puntatore. Per saperne di più studia il capitolo del libro sui puntatori.

2) I nomi delle variabili NON devono essere MAI scritti in maiuscolo, in quanto è una convenzione che si adotta per le costanti.

3) Per mandare a capo in una cout si usa la convenzione cout << endl; non cout << "\n";

4) Non mettere mai più istruzioni sulla stessa riga, deprime la lettura del codice.

5) Nella funzione somma la variabile N è privata e non inizializzata, quindi contiene un valore casuale preso dalla memoria di nessuna utilità pratica. Se devi riferirti alla N presa da "leggiN" devi passarla come parametro o dichiarare N globale.

6) In C++ non si scrive SOMMA = SOMMA + y, ma SOMMA += y

7) Sempre in "somma", la variabile y viene usata come una variabile locale, non come un parametro. In quanto il suo valore viene scritto ancora prima di essere letto.

8) In "somma" la variabile indice del for non è dichiarata

9) In "media" valgono le stesse cose dette in "somma"

10) La funzione "stampasommamedia" a parte il nome assolutamente orribile stampa due valori a caso, in quanto le variabili SOMMA e MEDIA non sono inizializzate, nè vengono prese da qualche parte. Se vuoi usarle in questo modo devi dichiararle globali o passarle come parametri dal main.


Se non capisci il perchè non ti gira una cosa di questo genere vuol dire che hai ancora molta strada da fare, torna a studiare.

PM Quote
Avatar
zaire90 (Normal User)
Rookie


Messaggi: 46
Iscritto: 16/10/2009

Segnala al moderatore
Postato alle 20:59
Lunedì, 02/11/2009
Beh per quanto riguarda gli errori, lo compila senza segnalarmi nulla. Quindi avevo imaginato che fosse tutto giusto.
Però infatti anche io avevo pensato all'ipotesi del problema del passaggio per indirizzo, ma non sono riuscito a capire come risolverlo...devo mettere la "&" da qualche parte giusto?? Ma dove...come devo aggiustare il codice?

P.s. Purtroppo cado ancora in questo tipo di errore perchè non sono ancora molto pratico

PM Quote
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2765
Iscritto: 21/09/2007

Segnala al moderatore
Postato alle 21:02
Lunedì, 02/11/2009

PM Quote
Avatar
theprogrammer (Normal User)
Guru^2


Messaggi: 2509
Iscritto: 28/01/2009

Segnala al moderatore
Postato alle 21:28
Lunedì, 02/11/2009
Testo quotato

Postato originariamente da zaire90:


P.s. Purtroppo cado ancora in questo tipo di errore perchè non sono ancora molto pratico



No ... cadi in questo tipo di errori perchè non hai studiato a sufficienza la parte "teorica" riguardante puntatori e reference sul tuo libro (mi auguro che tu segua un libro ...).

Ma - ancora prima dei puntatori - tu non hai chiare le BASI del linguaggio C (la visibilità delle variabili) e questo è grave.

PM Quote
Avatar
zaire90 (Normal User)
Rookie


Messaggi: 46
Iscritto: 16/10/2009

Segnala al moderatore
Postato alle 21:46
Lunedì, 02/11/2009
Mah...veramente no...non uso un libro, ma una dispensa corta corta. Poi non so nemmeno cosa siano (ancora) i puntatori...metto tra parentesi che non faccio informatica ma faccio matematica, quindi al corso di programmazione di matematica non mi spiegano per filo e per segno ogni cosa su come fare il programma perfetto (anzi!). Quindi non ho per niente chiaro la parte su puntatori,(visto che non so cosa siano) e tanto meno sulla visibilità delle variabili!
Ah...e inoltre, non dovrei nemmeno sforzarmi piu di tanto a scrivere programmi in funzioni, visto che non le avrei almeno fino al mese prossimo. Quindi siate clementi:)In ogni caso...mi potete correggere questo programma?:hail:

PM Quote