|
|
|
|
Strumenti |
17-11-2020, 17:54 | #1 |
Junior Member
Iscritto dal: Nov 2020
Messaggi: 1
|
Programma c++
Ciao ragazzi ho scritto questo programma in dev c++ quando lo compilo non mi da nessun errore però la media e il valore assoluto me lo calcola male...Ci sto provando da ieri ma non capisco dove sia il problema..Se qualcuno riesce ad aiutarmi,vi ringrazio!
Vi lascio il codice su Pastebin https://pastebin.com/WDtU4FZ0 |
18-11-2020, 08:25 | #2 |
Senior Member
Iscritto dal: Nov 2005
Messaggi: 2745
|
Per quanto riguarda la media, se indenti bene il codice vedrai l'errore.
Il minimo valore assoluto invece è concettualmente sbagliato (calcoli il valore assoluto di n, perché?), devi proprio rivedere la funzione. In generale ti consiglio di formattare bene il codice, rende tutto molto più chiaro e quindi più semplice. |
18-11-2020, 14:01 | #3 | |
Senior Member
Iscritto dal: Dec 2007
Messaggi: 1300
|
Quote:
l'80% degli errori che commette mio nipote (così come gli errori di Laustol) sono dovuti a pessime abitudini (usare n come variabile per indicare la dimensione di un array e indentare male il codice) ... e spesso anche all'utilizzo di un IDE non adeguato... l'indentazione automatica avrebbe evitato l'errore... bio |
|
18-11-2020, 15:27 | #4 |
Member
Iscritto dal: Dec 2006
Messaggi: 33
|
Un dettaglio più importante: la dimensione di un array deve essere una costante nota a compile time.
Quando le dimensioni di un array non sono note al momento della compila (come vorresti fare in questo caso, dato che "crei un array di dimensione n passata da stdin") si usa allocazione dinamica della memoria, esplicita o nascosta che sia - utilizzando per es. un std::vector. In altri termini, quel codice non è codice C++ valido, per es. su visual studio (msvc 19.27 per la precisione) non compila: <source>(41): error C2131: expression did not evaluate to a constant per credere prova qui: https://godbolt.org/ puoi risolvere usando un std::vector (dovrai però poi cambiare tutte le signatures delle funzioni che hai scritto) o semplicemente con: int vettore[16] (dato che poni un limite superiore sui valori di "n" accettati) ps gcc (ma anche clang) permette di definire VariableLengthArray (VLA) ma questa è un'estensione alla specifica ISO C++, ed è quindi non portabile. Ultima modifica di Lampo89 : 18-11-2020 alle 18:14. |
04-12-2020, 11:33 | #5 | |
Senior Member
Iscritto dal: Apr 2010
Città: Leuven
Messaggi: 667
|
Quote:
Codice:
#include <iostream> #include<stdlib.h> #include<math.h> using namespace std; float media(float Sommatotale, float n) { float media= Sommatotale/ n; return media; } int minimo(int vettore[], int n) { int minimo=vettore[0]; for(int i=1; i<n; i++) { if (minimo>vettore[i]) minimo=vettore[i]; } return minimo; } int valore_assoluto(int vettore[], int n) { int minimoass=vettore[0]; //=fabs(vettore[0]) n= fabs(n);//Perché? for (int i=1; i<n; i++) { if (minimoass>vettore[i]) minimoass=vettore[i];//minimoass>fabs(vettore[i]) } return minimoass; } int main() { int n, Sommatotale=0; cout<<"inserire il valore n<=15 per il numero delle componenti del vettore e premere invio: "; cin>>n; int vettore[n]; //int *vettore = new int[n]; if (n>15 ) { cout<<"il valore inserito non concede al programma di proseguire "; return 0; } for(int i=0; i<n; i++) { cout<<"inserisci il "<<(i+1)<<"* elemento: "; //"*" sta ad indicare primo,secondo ecc ecc cin>>vettore[i] ; cout<<endl;//per andare a capo ad ogni componente for(int i=0; i<n; i++) { Sommatotale+=vettore[i]; } //Questo for loop non deve essere annidato nell'altro!!!!!!!!!!!!!!!!!!! } cout<<"la media tra i numeri inseriti e': "<<media(Sommatotale,n)<<endl; cout<<"il numero più piccolo tra i vettori assegnati e': "<<minimo(vettore,n)<<endl; cout<<"il numero con il valore assoluto più piccolo tra i vettori assegnati e': "<<valore_assoluto(vettore,n)<<endl; //delete[] vettore; Inquesto caso semplice non ci sarebbe bisogno ma in generale per ogni new deve esserci un delete return 0; } Codice:
#include <iostream> #include<cmath> #include<vector> double media(std::vector<int> v) { double sum_of_elems = 0; for (auto& n : v){ sum_of_elems += n; } return sum_of_elems/v.size(); } int minimo(std::vector<int> v) { int minimo=v[0]; for(auto& n : v) { minimo = (minimo > n)? n : minimo; } return minimo; } int valore_assoluto(std::vector<int> v) { int minimo = v[0]; for(auto& n : v) { minimo = (abs(minimo) > abs(n))? n : minimo; } return minimo; } int main() { int n; std::cout<<"inserire il valore n<=15 per il numero delle componenti del vettore e premere invio: "; std::cin>>n; std::vector<int> vettore(n); if (n>15 ) { std::cout<<"il valore inserito non concede al programma di proseguire "; return 0; } for(int i=0; i<n; i++) { std::cout<<"inserisci il "<<(i+1)<<"* elemento: "; //"*" sta ad indicare primo,secondo ecc ecc std::cin>>vettore[i] ; std::cout<<std::endl;//per andare a capo ad ogni componente } std::cout<<"la media tra i numeri inseriti e': "<<media(vettore)<<std::endl; std::cout<<"il numero più piccolo tra i vettori assegnati e': "<<minimo(vettore)<<std::endl; std::cout<<"il numero con il valore assoluto più piccolo tra i vettori assegnati e': "<<valore_assoluto(vettore)<<std::endl; return 0; } In bocca al lupo! Ultima modifica di ingframin : 04-12-2020 alle 12:35. Motivo: bug nel codice |
|
07-01-2021, 19:37 | #6 |
Member
Iscritto dal: Aug 2014
Messaggi: 214
|
siccome la soluzione è già stata proposta, mi limito ad aggiungere qualche commento.
Chiaramente OP sta ancora imparando le basi di C++. Concetti come vector e auto vengono insegnati molto dopo. Stackoverflow è molto bello in questo, perché gli utenti rispondono in modo chiaro al livello dell'OP. Non è mia intenzione criticare le vostre risposte, però vorrei solo proporvi di fornire spiegazioni al livello dell'audience... È inutile parlare di cose come vector e for-each loop quando non sappiamo nemmeno quale compilatore sta utilizzando OP. |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 21:46.