[C++] Trovare il massimo tra n numeri

Messaggioda mklplo » 15/02/2018, 15:44

Salve,a scuola(al liceo) ho appena incominciato la programmazione in c++,ma la professoressa,vedendo che mi piaceva la materia,mi ha assegnato il compito,di trovare il massimo tra n numeri con una funzione(argomento non ancora trattato).Io ho provato a fare l'esercizio,ma l'algoritmo funziona solo se devo trovare il massimo tra n numeri con $n<=8$(se infatti inserisco più di 8 numeri,mi esce scritto:program received signal sigsegv segmentation fault) e onestamente non so il perchè.Se non vi reca disturbo,mi potreste spiegare dove sbaglio?
Ecco come ho provato a svolgere l'esercizio:
Codice:
#include<iostream>
using namespace std;

float max(float a,float b)
{
   float m;
   if(a>=b)
   {
      m=a;
   }
   else
   {
      m=b;
   }
}
int main()
{
   int k;
    float l,s,a[k];
   cout<<"Inserisci il numero di valori di cui si vuole il massimo"<<endl;
   cin>>k;
   for(int i=1;i<=k;i++){
      cout<<"Inserisci un numero"<<endl;
      cin>>a[i];
   }
   for(int i=1;i<=k;i++){
      a[i]=max(a[i],a[i++]);
      
   }
   cout<<"Il valore massimo:"<<a[k]<<endl;
   system("PAUSE");
   return 0;
}
mklplo
Advanced Member
Advanced Member
 
Messaggio: 686 di 2272
Iscritto il: 21/02/2016, 16:05

Re: [C++] Trovare il massimo tra n numeri

Messaggioda iggy » 15/02/2018, 17:46

Sono anni che non faccio c++ quindi la sintassi non me la ricordo completamente.
Comunque per prima cosa manca il valore di ritorno della funzione max(). Se dichiari una funziona 'float', il main si aspetta un valore float. Infatti fai bene a scrivere a[i]=max(...) ma devi mettere nella funzione 'return m'.
Seconda cosa, gli indici dei vettori partono da 0 e arrivano a N-1. Per esempio: un vettore lungo 8 dovrà essere scandito come a[0] per il primo elemento, a[1] per il secondo, ..., a[7] per l'ultimo elemento.
Tu fai dei cicli for che scandiscono il vettore da 1 (secondo elemento) a k (elemento che non esiste, quindi sfori il vettore).
Poi c'è un problema se dichiari il a[k] ma chiedi la grandezza di k solo dopo che il vettore è stato creato.

Ti lascio il codice corretto, mi pare funzioni adesso:
Codice:
#include<iostream>
using namespace std;

float max(float a,float b)
{
   float m;
   if(a>=b)
   {
      m=a;
   }
   else
   {
      m=b;
   }
   return m;
}
int main()
{
   int k;

   cout<<"Inserisci il numero di valori di cui si vuole il massimo"<<endl;
   cin>>k;
   float a[k];
   for(int i=0;i<k;i++){
      cout<<"Inserisci un numero"<<endl;
      cin>>a[i];
   }
   
   float massimo = a[1];
   for(int i=1;i<k;i++){
      massimo=max(massimo,a[i]);
     
   }
   cout<<"Il valore massimo:"<<massimo<<endl;
   system("PAUSE");
   return 0;
}
iggy
New Member
New Member
 
Messaggio: 17 di 86
Iscritto il: 08/02/2018, 18:40

Re: [C++] Trovare il massimo tra n numeri

Messaggioda mklplo » 15/02/2018, 17:57

Grazie della risposta.
mklplo
Advanced Member
Advanced Member
 
Messaggio: 687 di 2272
Iscritto il: 21/02/2016, 16:05

Re: [C++] Trovare il massimo tra n numeri

Messaggioda axpgn » 15/02/2018, 18:23

@iggy
Una curiosità da profano:
Nel codice di mklplo, quel "i++" all'interno di "a[i]=max(a[i],a[i++]);" non è sbagliato?
Nel senso che mklplo vuole confrontare un valore con il successivo nella lista ma così facendo modifica effettivamente l'indice "i", sballando tutto ... no?

Cordialmente, Alex
axpgn
Cannot live without
Cannot live without
 
Messaggio: 10476 di 40671
Iscritto il: 20/11/2013, 22:03

Re: [C++] Trovare il massimo tra n numeri

Messaggioda iggy » 15/02/2018, 18:34

axpgn ha scritto:@iggy
Una curiosità da profano:
Nel codice di mklplo, quel "i++" all'interno di "a[i]=max(a[i],a[i++]);" non è sbagliato?
Nel senso che mklplo vuole confrontare un valore con il successivo nella lista ma così facendo modifica effettivamente l'indice "i", sballando tutto ... no?

Cordialmente, Alex

Sì, è vero, sarebbe da utilizzare i[i+1] perchè i++ incrementa la variabile e questo lo fa già il ciclo for. Se si utilizzasse un ciclo while (dove la i andrebbe incrementata "a mano") avrebbe senso utilizzarlo.
Al di là di questo, la chiamata di funzione così come è scritta è sbagliata perché bisogna confrontare ogni elemento con il massimo fin'ora trovato e non confrontare coppie di elementi.
iggy
New Member
New Member
 
Messaggio: 19 di 86
Iscritto il: 08/02/2018, 18:40

Re: [C++] Trovare il massimo tra n numeri

Messaggioda Raptorista » 16/02/2018, 15:19

Questa pratica
iggy ha scritto:
Codice:
   int k;

   cout<<"Inserisci il numero di valori di cui si vuole il massimo"<<endl;
   cin>>k;
   float a[k];

sebbene supportata da molti compilatori, è scorretta secondo lo standard del linguaggio.
So che per l'OP è presto e questo è l'approccio "didatticamente meno peggio", però per conoscenza sappiate che per questo tipo di cose in C si scrivono le liste e in C++ si usa std::vector.

Il metodo 100% corretto di fare questa cosa in C senza complicarsi la vita è
Codice:
   int maxK = 10000; // O qualunque cosa
   float a[maxK];
   int k;

   cout<<"Inserisci il numero di valori di cui si vuole il massimo"<<endl;
   cin>>k;
   if (k > maxK)
   {
      // errore
   }
Un matematico ha scritto:... come mia nonna che vuole da anni il sistema per vincere al lotto e crede che io, in quanto matematico, sia fallito perché non glielo trovo


Immagine
Avatar utente
Raptorista
Moderatore
Moderatore
 
Messaggio: 4818 di 9616
Iscritto il: 28/09/2008, 19:58

Re: [C++] Trovare il massimo tra n numeri

Messaggioda Super Squirrel » 16/02/2018, 20:38

Raptorista ha scritto:Il metodo 100% corretto di fare questa cosa in C senza complicarsi la vita è
Codice:
   int maxK = 10000; // O qualunque cosa
   float a[maxK];
   int k;

   cout<<"Inserisci il numero di valori di cui si vuole il massimo"<<endl;
   cin>>k;
   if (k > maxK)
   {
      // errore
   }


Volendo essere più precisi, secondo lo standard del linguaggio la dimensione di un array statico deve essere una costante.

Questa regola credo dipenda dal fatto che la dimensione di un array statico deve essere nota in fase di compilazione, e nel momento in cui la dimensione è una costante (utilizzando un numero, la direttiva define o lo specificatore const) essa sarà sicuramente nota. Giusto?
Invece se la dimensione fosse una variabile potrebbero esserci casi come il seguente in cui la dimensione sarebbe nota solo in fase di esecuzione:

Codice:
int dim;
cin >> dim;
float v[dim];


Al di là dello standard come si comporta invece il compilatore nel seguente caso:

Codice:
int dim = 100;
float v[dim];


La dimensione sarà nota in fase di compilazione oppure il valore 100 sarà assegnato alla variabile dim solo in fase di esecuzione? E se invece di una dichiarazione con inizializzazione ci fosse stata una dichiarazione con successiva assegnazione?
Chi dorme in democrazia, si sveglia in dittatura.
Super Squirrel
Senior Member
Senior Member
 
Messaggio: 161 di 1486
Iscritto il: 16/05/2013, 22:05

Re: [C++] Trovare il massimo tra n numeri

Messaggioda vict85 » 16/02/2018, 21:55

Personalmente non penso che il modo di fare questo tipo di cose in C sia di usare le liste. Nello stesso modo in cui implementi una lista puoi implementare un array dinamico. Lo standard C possiede persino qualche strano oggetto come https://en.wikipedia.org/wiki/Flexible_array_member e i compilatori possono decidere di ammettere l'uso dei VLA (esiste una macro per controllarlo).

Detto questo, la possibilità di definire con variabili le dimensioni degli array risulta molto comodo quando si passano array multidimensionali a funzioni. E' importante comunque notare che cambiare la variabile non cambia la dimensione dell'array. La dimensione dell'array è definito dal valore della variabile nel momento in cui l'array è definito ed è compito del programmatore l'assicurare che la variabile continui a contenere la dimensione dell'array.
vict85
Moderatore
Moderatore
 
Messaggio: 9257 di 19253
Iscritto il: 16/01/2008, 00:13
Località: Berlin

Re: [C++] Trovare il massimo tra n numeri

Messaggioda mklplo » 17/02/2018, 08:12

Grazie anche agli altri per le risposte,ma che vuol dire "std::vector"?Pechè poi devo imporre un valore massimo all'array?Ma gli array(che da quel che ho capito sono unidimensionali) sono vettori,giusto?Se così fosse significa che in c++ si possono definire anche delle matrici?
Scusate per le domande,ma stando veramente agli inizi,molte cose non le capisco ancora.
mklplo
Advanced Member
Advanced Member
 
Messaggio: 688 di 2272
Iscritto il: 21/02/2016, 16:05

Re: [C++] Trovare il massimo tra n numeri

Messaggioda Raptorista » 17/02/2018, 12:18

Super Squirrel ha scritto:Volendo essere più precisi, secondo lo standard del linguaggio la dimensione di un array statico deve essere una costante.

Questa regola credo dipenda dal fatto che la dimensione di un array statico deve essere nota in fase di compilazione, e nel momento in cui la dimensione è una costante (utilizzando un numero, la direttiva define o lo specificatore const) essa sarà sicuramente nota. Giusto?

Giusto, quello che ho scritto è più uno pseudo-codice per far capire l'ordine delle cose. #define è il modo usuale di definire costanti in C.
Super Squirrel ha scritto:Invece se la dimensione fosse una variabile potrebbero esserci casi come il seguente in cui la dimensione sarebbe nota solo in fase di esecuzione:

Codice:
int dim;
cin >> dim;
float v[dim];

Questo è quello che dicevamo sopra, infatti.
Super Squirrel ha scritto:
Al di là dello standard come si comporta invece il compilatore nel seguente caso:

Codice:
int dim = 100;
float v[dim];


La dimensione sarà nota in fase di compilazione oppure il valore 100 sarà assegnato alla variabile dim solo in fase di esecuzione? E se invece di una dichiarazione con inizializzazione ci fosse stata una dichiarazione con successiva assegnazione?

In questo caso il compilatore sa che dim non sarà modificata e che avrà quel valore nel momento di inizializzare l'array.

vict85 ha scritto:Personalmente non penso che il modo di fare questo tipo di cose in C sia di usare le liste. Nello stesso modo in cui implementi una lista puoi implementare un array dinamico.

Per array dinamico intendi una cosa il cui spazio di allocazione cresce secondo necessità? Questo sarebbe l'equivalente di std::vector, ed è un altro possibile modo di fare. Concettualmente non c'è molta differenza.
vict85 ha scritto: Lo standard C possiede persino qualche strano oggetto come https://en.wikipedia.org/wiki/Flexible_array_member

Questo è così esotico che non ne avevo mai sentito parlare XD

mklplo ha scritto:Grazie anche agli altri per le risposte,ma che vuol dire "std::vector"?

In C++ sono disponibili un gran numero di tipi di dato più sofisticati di quelli base del C. Siccome gli array/vettori/collezioni di numeri sono così comuni, il linguaggio fornisce un tipo di dato che li gestisce in maniera automatica. Questo tipo di dato si chiama std::vector. Se stai ancora imparando, è meglio che ti faccia le ossa con array e implementazioni di basso livello per capire bene cosa succede.
mklplo ha scritto:Pechè poi devo imporre un valore massimo all'array?

Perché il computer deve sapere in anticipo quanta ram mettere da parte per gli elementi di quell'array.
mklplo ha scritto:Ma gli array(che da quel che ho capito sono unidimensionali) sono vettori,giusto?

Sì, array o vettore o lista sono la stessa cosa concettualmente: oggetti che collegano un numero [l'indice] ad un elemento.
mklplo ha scritto:Se così fosse significa che in c++ si possono definire anche delle matrici?

Anche in C si possono definire array multidimensionali, cioè oggetti con più indici, che per esempio possono modellizzare matrici.
mklplo ha scritto:Scusate per le domande,ma stando veramente agli inizi,molte cose non le capisco ancora.

No problem!
Un matematico ha scritto:... come mia nonna che vuole da anni il sistema per vincere al lotto e crede che io, in quanto matematico, sia fallito perché non glielo trovo


Immagine
Avatar utente
Raptorista
Moderatore
Moderatore
 
Messaggio: 4820 di 9616
Iscritto il: 28/09/2008, 19:58

Prossimo

Torna a Informatica

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite