Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicitÓ e servizi in linea con il tuo account. 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?




...La saggezza di un singolo somiglia ad un albero conficcato alla meno peggio nel terreno...( HAGAKURE, codice 15)
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 ...


- Se le mie risposte non vi soddisfano, ignoratele, altrimenti un "grazie" e' molto gradito ...

"Dai un pesce (programma) a un uomo e lo nutrirai per un giorno. Insegnagli a pescare (programmare) e lo nutrirai per tutta la vita." (niente pappa pronta)
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...


...La saggezza di un singolo somiglia ad un albero conficcato alla meno peggio nel terreno...( HAGAKURE, codice 15)
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


- Se le mie risposte non vi soddisfano, ignoratele, altrimenti un "grazie" e' molto gradito ...

"Dai un pesce (programma) a un uomo e lo nutrirai per un giorno. Insegnagli a pescare (programmare) e lo nutrirai per tutta la vita." (niente pappa pronta)
PM Quote
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2763
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.


Ingegnere Informatico
https://ldlagency.it
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


...La saggezza di un singolo somiglia ad un albero conficcato alla meno peggio nel terreno...( HAGAKURE, codice 15)
PM Quote
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2763
Iscritto: 21/09/2007

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


Ingegnere Informatico
https://ldlagency.it
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.


- Se le mie risposte non vi soddisfano, ignoratele, altrimenti un "grazie" e' molto gradito ...

"Dai un pesce (programma) a un uomo e lo nutrirai per un giorno. Insegnagli a pescare (programmare) e lo nutrirai per tutta la vita." (niente pappa pronta)
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:


...La saggezza di un singolo somiglia ad un albero conficcato alla meno peggio nel terreno...( HAGAKURE, codice 15)
PM Quote